I'm using this snippet to read a data file in a unit test:
var file = new File('/Users/chambery/projects/Foo/src/resources/skills.yaml');
Future<String> finishedReading = file.readAsString();
finishedReading.then((text) {
print(text);
print(loadYaml(text));
});
Running in the Dart Editor I get no error (but no printout),
...
PASS: calc_ranks
PASS: load_skills
All 7 tests passed.
unittest-suite-success
(edit: removed command line error; dart vm was out-of-date)
I don't need async file read.
I'm guessing that you don't tell the unittest framework that your test is asynchronous. The framework will therefore not wait for your asynchronous tests to finish and assume that they passed.
Use expectAsyncX (where "X" is the number of arguments) to make sure that the framework waits for your asynchronous tests to finish.
See the unittest documentation: https://api.dartlang.org/docs/channels/stable/latest/unittest.html
If you are dealing with Futures, you can also use expect(future, completes).
Related
I'm new to the Dart functions framework. My goal is to use this package to create several functions and deploy them to Cloud Run (in combination with Firebase, but I guess that's irrelevant to this question).
I've run the quick starts and I've read all of the contents in the docs.
The quick start mentions just one function at a time (e.g. Hello World, Cloud Events, etc..), like this:
import 'package:functions_framework/functions_framework.dart';
import 'package:shelf/shelf.dart';
#CloudFunction()
Response function(Request request) {
return Response.ok('Hello, World!');
}
But as you can see in the quickstarts only one function is handled in a project at a time. How about me wanting to deploy several functions? Should I:
Write several functions in the same project / file, so that the function framework compiles the 'server.dart` by itself
OR
Create a different functions_framework for each function?
Let me be more specific. Should I do the following (option 1 - which makes more sense to me):
import 'dart:math';
import 'package:functions_framework/functions_framework.dart';
import 'package:shelf/shelf.dart';
#CloudFunction()
Response function(Request request) {
return Response.ok('Hello, World!');
}
#CloudFunction()
Response function2(Request request) {
if (Random().nextBool()) {
return Response.ok('Hello, World!');
} else {
return Response.internalServerError();
}
}
Or should I build a different folder by running a build_runner for each function I need in my project?
Is there a difference and/or a best practice?
Thanks in advance.
EDIT. This question is related to the deployment on Cloud Run itself, and not just testing on my own PC. To test my own functions I did the following:
Run dart run build_runner build, so that it updates the server.dart file correctly (I can see that the framework does a lot behind the scenes and that the _nameToFunctionTarget is basically a router);
Run the server in two different terminals, like this: dart run bin/server.dart --port MYPORT --target MYFUNCTION (where MYPORT and MYFUNCTION are either 8080/8081 or function/function2 respectively).
I guess I'm just confused on how to correctly manage this framework once deployed on Cloud Run.
EDIT 2. I just gave up using Dart as a Serverless language or even a Backend language. There's just too much jargon even for the basic things. Any backend framework is either dead, or maintained by one single enthusiast guy (props to him!). This language has not yet received enough love from the Google Team / the community and at this moment in time is basically not possible to go fullstack on just Dart. It's a dream, but it can't be realized now. Furthermore, Dart hardly lacks a proper SDKs to use Firestore, etc., so Firebase isn't an option. I find it easier to just learn NodeJS and exploit the Firebase support for Firebase Functions written in NodeJS, and I'll wait for more support in there in the future, if there ever will be.
The documentation is a bit sparse right now (and I'm new to it also! I couldn't find any good examples, so here goes...)
You can only have a single function that is served. It should be
named 'function' (the type and name can be overriden, see the
cloudevent example dartfn generate cloudevent)
You 'could' have many of these deployed so that each does a specific thing, such as processing cloudevents above, but most people
want something more REST-like (see next)
You need to attach a Router() so that you can have the single entry point (function) handled by specific logic in your code.
Example for Rest
add to pubspec.yaml (in dependencies:) shelf_router: ^1.1.2
delegate the #CloudFunction to use the Router()
functions.dart
import 'package:functions_framework/functions_framework.dart';
import 'package:shelf/shelf.dart';
import 'package:shelf_router/shelf_router.dart';
Router app = Router()
..get('/health', (Request request) {
return Response.ok('healthy');
})
..get('/user/<user>', (Request request, String user) {
// fetch the user... (probably return as json)
return Response.ok('hello $user');
})
..post('/user', (Request request) {
// convert request body to json and persist... (probably return as json)
return Response.ok('saved the user');
});
#CloudFunction()
Future<Response> function(Request request) => app.call(request);
Being completely new to webdriver IO, wondering how do I update an existing test cycle (with specific name format) in Jira. I am running the test suite on 3 different browsers and have separate test cycles for these cycles in Jira. After execution, I want the suite to update these cycles with the status and screenshots for each browsers respectively. ANy help is much appreciated.
PS: At the moment I have a function that creates a new test cycle for each execution.
there are no plugins for zephyr scale integration till now, but you can use zephyr api to update your execution results .
I've created a Nodejs lib for creating testruns and reporting results back to Zephyr scale.
Maybe they can help you on your way.
If you have any questions or feedback, let me know!
https://www.npmjs.com/package/#dbouckaert/zephyr-scale-reporter
Example: get all testcases for a project
/**
* This function will get all testcases for a certain project and add them to variables.testCasesArray
* #returns {void}
*/
export const getAllTestcases = async (): Promise<void> => {
await request(variables.url)
.get(`/rest/tests/1.0/project/${variables.projectId}/testcases`)
.auth(variables.username, variables.password)
.expect(200)
.then((res) => {
variables.testCasesArray = res.body.testCases;
});
};
I want to execute some processes one by one in dart using either Process.run() or Process.start()
And I want to show the verbose log of the process. But the problem is Whenever I am using run it's providing the stdout in a string i.e., at the end of the process completion. But I want to display the logs while the process is being executed.
Cause run is returning us the instance of ProcessResult instead of Process, the returned stdout is String.
Have to use stdout.write(cleanProcess.stdout); in case of run;
OR
Now in case start(), I am getting stdout as Stream which is desired but the only problem is the start returns us to the Process and Doesn't actually await for the Process to complete.
Can use stdout.addStream(buildProcess.stdout); to display stdout as stream
Code that I am trying to execute, and display the verbose.
print("HighSupply Executor : flutter clean");
var cleanProcess = await Process.run('flutter', ["clean", "--verbose"],
workingDirectory: "${flutterFolder.path}");
stdout.write(cleanProcess.stdout); //only getting stdout in one go. needed as stream.
print("HighSupply Executor : flutter pub get");
var pubGetProcess = await Process.run('flutter', //OR can we use start and wait for process to complete
["pub", "get", "--verbose"],
workingDirectory: "${flutterFolder.path}");
stdout.write(pubGetProcess.stdout);
print("HighSupply Executor : flutter build apk");
var buildProcess = await Process.run(
'flutter', ["build", "apk", "--verbose", generatedParams],
workingDirectory: "${flutterFolder.path}");
stdout.write(buildProcess.stdout);
TL;DR
Can I anyhow get stdout as a stream in case Prcocess.run() OR Can we wait for Process to complete before executing another in case of Process.start()
Any help is appreciated.
Edit: 1
As #julemand101 suggested to use exitcode and wait for it to return after the process completion, It works fine with my case, and haven't run into any issue yet but As he mentioned and stated in docs that is not reliable, so we are looking for a better concrete solution for it.
Source: Process
Process.start() is used to interact with the code. The future gives us a Process, after it has finished starting, but the Process is still running when we have the Process.
When the future completes the process is started and your code can interact with the process: writing to stdin, listening to stdout, and so on
Now we can access a Stream of integers as Process.stdout and parse it with a utf8 decoder.
Sample code:
main() async {
var process = await Process.start('cat', []);
process.stdout
.transform(utf8.decoder)
.forEach(print);
process.stdin.writeln('Hello, world!');
process.stdin.writeln('Hello, galaxy!');
process.stdin.writeln('Hello, universe!');
}
Out of the scope of this answer, we can manipulate the process objects, send interrupts, kill etc. and when the process ends, expect to get a done event on the stream.
I know this answer is too late, but I will leave it here maybe someone will find it helpful;
After playing around with the Process start() and run() methods, I found a way to achieve the required behavior of the original question by awaiting for addStream Future to complete.
void main() async {
final p = await Process.start('bash', ['-c', 'sleep 3']);
await stdout.addStream(p.stdout);
print('the end 😎');
}
For example, here is a simple dart code:
#import('dart:io');
main() {
var server = new HttpServer();
server.listen('127.0.0.1', 8080);
server.defaultRequestHandler = (HttpRequest request, HttpResponse response) {
response.outputStream.write('Hello, world'.charCodes());
response.outputStream.close();
};
}
when the web server print the 'Hello, world', I would like to run a progress to run a
long heavy task, but don't want to it blocking the current process. May I know how to handle it? Thanks.
I tried with Process.run and Process.start with no success.
From you comment I can tell there are a misunderstanding of how Dart works spawning external processes. When you spawn a process in Dart it is by default running so the Dart program and the external program are running separate (so in different processes) and the Dart program can execute other stuff. You can then await for the result from the program (e.g. when it closes).
Therefore it does not make much sense to run the process with "&" as parameter (I guess this was an attempt to tell it should run separately from the Dart program).
But, since you are spawning another Dart program your should also consider using an Isolate which can execute both your own method on another thread or run external code by using:
https://api.dart.dev/stable/2.6.0/dart-isolate/Isolate/spawnUri.html
I have this code running inside Rhino under Linux. The file doesn't exist.
try {
var u = readFile("/tmp/wtf");
print(u);
} catch (e) {
print("error!");
}
The code in the 'catch' doesn't run, even though the file definitely isn't there. I just get a blank value assigned to 'u'. Is this normal?
Are there other situations (besides a file missing) where the catch would run?
Could I differentiate an empty file from a missing one without invoking some other function? (I realize Rhino gives me access to most of the standard Java libaries).
Just want to confirm that readFile is always synchronous?
I can't find anything much on SO or MDN about how readFile works. Any insight appreciated.