mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
Teach sky_shell.exe to run from a snapshot
Also, make stocks robust to failing network connections. TBR=eseidel@google.com Review URL: https://codereview.chromium.org/1229743002 .
This commit is contained in:
parent
79554dd88c
commit
1bc13e1c63
@ -59,7 +59,7 @@ String _urlToFetch(int chunk) {
|
||||
}
|
||||
|
||||
class StockDataFetcher {
|
||||
int _currentChunk = 0;
|
||||
int _nextChunk = 0;
|
||||
final StockDataCallback callback;
|
||||
|
||||
StockDataFetcher(this.callback) {
|
||||
@ -67,13 +67,17 @@ class StockDataFetcher {
|
||||
}
|
||||
|
||||
void _fetchNextChunk() {
|
||||
fetchBody(_urlToFetch(_currentChunk++)).then((Response response) {
|
||||
fetchBody(_urlToFetch(_nextChunk++)).then((Response response) {
|
||||
String json = response.bodyAsString();
|
||||
if (json == null) {
|
||||
print("Failed to load stock data chunk ${_nextChunk - 1}");
|
||||
return;
|
||||
}
|
||||
JsonDecoder decoder = new JsonDecoder();
|
||||
|
||||
callback(new StockData(decoder.convert(json)));
|
||||
|
||||
if (_currentChunk < _kChunkCount)
|
||||
if (_nextChunk < _kChunkCount)
|
||||
_fetchNextChunk();
|
||||
});
|
||||
}
|
||||
|
||||
@ -19,22 +19,28 @@ class Response {
|
||||
Response(this.body);
|
||||
|
||||
String bodyAsString() {
|
||||
if (body == null)
|
||||
return null;
|
||||
return new String.fromCharCodes(new Uint8List.view(body.buffer));
|
||||
}
|
||||
}
|
||||
|
||||
Future<UrlResponse> fetch(UrlRequest request) async {
|
||||
NetworkServiceProxy net = new NetworkServiceProxy.unbound();
|
||||
shell.requestService("mojo:authenticated_network_service", net);
|
||||
try {
|
||||
NetworkServiceProxy net = new NetworkServiceProxy.unbound();
|
||||
shell.requestService("mojo:authenticated_network_service", net);
|
||||
|
||||
UrlLoaderProxy loader = new UrlLoaderProxy.unbound();
|
||||
net.ptr.createUrlLoader(loader);
|
||||
UrlLoaderProxy loader = new UrlLoaderProxy.unbound();
|
||||
net.ptr.createUrlLoader(loader);
|
||||
|
||||
UrlResponse response = (await loader.ptr.start(request)).response;
|
||||
UrlResponse response = (await loader.ptr.start(request)).response;
|
||||
|
||||
loader.close();
|
||||
net.close();
|
||||
return response;
|
||||
loader.close();
|
||||
net.close();
|
||||
return response;
|
||||
} catch (e) {
|
||||
return new UrlResponse()..statusCode = 500;
|
||||
}
|
||||
}
|
||||
|
||||
Future<UrlResponse> fetchUrl(String relativeUrl) async {
|
||||
|
||||
@ -27,6 +27,7 @@ void Usage() {
|
||||
std::cerr << "Usage: sky_shell"
|
||||
<< " --" << switches::kNonInteractive
|
||||
<< " --" << switches::kPackageRoot << "=PACKAGE_ROOT"
|
||||
<< " --" << switches::kSnapshot << "=SNAPSHOT"
|
||||
<< " [ MAIN_DART ]" << std::endl;
|
||||
}
|
||||
|
||||
@ -42,19 +43,27 @@ void Init() {
|
||||
|
||||
std::string package_root =
|
||||
command_line.GetSwitchValueASCII(switches::kPackageRoot);
|
||||
|
||||
std::string main;
|
||||
auto args = command_line.GetArgs();
|
||||
if (!args.empty())
|
||||
main = args[0];
|
||||
|
||||
runner.set_package_root(package_root);
|
||||
runner.Start(main);
|
||||
|
||||
scoped_ptr<TestRunner::SingleTest> single_test;
|
||||
if (command_line.HasSwitch(switches::kSnapshot)) {
|
||||
single_test.reset(new TestRunner::SingleTest);
|
||||
single_test->path = command_line.GetSwitchValueASCII(switches::kSnapshot);
|
||||
single_test->is_snapshot = true;
|
||||
} else {
|
||||
auto args = command_line.GetArgs();
|
||||
if (!args.empty()) {
|
||||
single_test.reset(new TestRunner::SingleTest);
|
||||
single_test->path = args[0];
|
||||
}
|
||||
}
|
||||
|
||||
runner.Start(single_test.Pass());
|
||||
}
|
||||
|
||||
} // namespace
|
||||
} // namespace shell
|
||||
} // namespace sky
|
||||
} // namespace shell
|
||||
} // namespace sky
|
||||
|
||||
int main(int argc, const char* argv[]) {
|
||||
base::AtExitManager exit_manager;
|
||||
@ -63,7 +72,8 @@ int main(int argc, const char* argv[]) {
|
||||
base::CommandLine& command_line = *base::CommandLine::ForCurrentProcess();
|
||||
|
||||
if (command_line.HasSwitch(sky::shell::switches::kHelp) ||
|
||||
!command_line.HasSwitch(sky::shell::switches::kPackageRoot)) {
|
||||
(!command_line.HasSwitch(sky::shell::switches::kPackageRoot) &&
|
||||
!command_line.HasSwitch(sky::shell::switches::kSnapshot))) {
|
||||
sky::shell::Usage();
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -21,6 +21,7 @@ struct UrlData {
|
||||
std::string url;
|
||||
std::string expected_pixel_hash;
|
||||
bool enable_pixel_dumping = false;
|
||||
bool is_snapshot = false;
|
||||
};
|
||||
|
||||
void WaitForURL(UrlData& data) {
|
||||
@ -76,8 +77,8 @@ TestRunner& TestRunner::Shared() {
|
||||
return *g_test_runner;
|
||||
}
|
||||
|
||||
void TestRunner::Start(const std::string& single_test_url) {
|
||||
single_test_url_ = single_test_url;
|
||||
void TestRunner::Start(scoped_ptr<SingleTest> single_test) {
|
||||
single_test_ = single_test.Pass();
|
||||
PrintAndFlush("#READY\n");
|
||||
ScheduleRun();
|
||||
}
|
||||
@ -92,7 +93,7 @@ void TestRunner::OnTestComplete(const mojo::String& test_result,
|
||||
std::cerr.flush();
|
||||
bindings_.CloseAllBindings();
|
||||
|
||||
if (single_test_url_.length())
|
||||
if (single_test_)
|
||||
exit(0);
|
||||
ScheduleRun();
|
||||
}
|
||||
@ -113,8 +114,9 @@ void TestRunner::ScheduleRun() {
|
||||
|
||||
void TestRunner::Run() {
|
||||
UrlData data;
|
||||
if (single_test_url_.length()) {
|
||||
data.url = single_test_url_;
|
||||
if (single_test_) {
|
||||
data.url = single_test_->path;
|
||||
data.is_snapshot = single_test_->is_snapshot;
|
||||
} else {
|
||||
WaitForURL(data);
|
||||
}
|
||||
@ -124,7 +126,11 @@ void TestRunner::Run() {
|
||||
|
||||
if (StartsWithASCII(data.url, kFileUrlPrefix, true))
|
||||
ReplaceFirstSubstringAfterOffset(&data.url, 0, kFileUrlPrefix, "");
|
||||
sky_engine_->RunFromFile(data.url, package_root_);
|
||||
|
||||
if (data.is_snapshot)
|
||||
sky_engine_->RunFromSnapshot(data.url);
|
||||
else
|
||||
sky_engine_->RunFromFile(data.url, package_root_);
|
||||
}
|
||||
|
||||
} // namespace shell
|
||||
|
||||
@ -27,7 +27,12 @@ class TestRunner : public mojo::InterfaceFactory<TestHarness>,
|
||||
package_root_ = package_root;
|
||||
}
|
||||
|
||||
void Start(const std::string& single_test_url);
|
||||
struct SingleTest {
|
||||
std::string path;
|
||||
bool is_snapshot = false;
|
||||
};
|
||||
|
||||
void Start(scoped_ptr<SingleTest> single_test);
|
||||
|
||||
private:
|
||||
// mojo::InterfaceFactory<TestHarness> implementation:
|
||||
@ -48,7 +53,7 @@ class TestRunner : public mojo::InterfaceFactory<TestHarness>,
|
||||
scoped_ptr<ShellView> shell_view_;
|
||||
SkyEnginePtr sky_engine_;
|
||||
|
||||
std::string single_test_url_;
|
||||
scoped_ptr<SingleTest> single_test_;
|
||||
mojo::WeakBindingSet<TestHarness> bindings_;
|
||||
|
||||
base::WeakPtrFactory<TestRunner> weak_ptr_factory_;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user