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:
Adam Barth 2015-07-08 15:50:06 -07:00
parent 79554dd88c
commit 1bc13e1c63
5 changed files with 60 additions and 29 deletions

View File

@ -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();
});
}

View File

@ -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 {

View File

@ -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;
}

View File

@ -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

View File

@ -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_;