| Index: runtime/observatory/tests/service/process_service_test.dart
|
| diff --git a/runtime/observatory/tests/service/process_service_test.dart b/runtime/observatory/tests/service/process_service_test.dart
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..2e12732f80ccaa3e6dcffabd63633932ca41c685
|
| --- /dev/null
|
| +++ b/runtime/observatory/tests/service/process_service_test.dart
|
| @@ -0,0 +1,123 @@
|
| +// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
|
| +// for details. All rights reserved. Use of this source code is governed by a
|
| +// BSD-style license that can be found in the LICENSE file.
|
| +
|
| +import 'dart:async';
|
| +import 'dart:convert';
|
| +import 'dart:developer';
|
| +import 'dart:io' as io;
|
| +import 'package:observatory/service_io.dart';
|
| +import 'package:unittest/unittest.dart';
|
| +import 'test_helper.dart';
|
| +
|
| +Future setupProcesses() async {
|
| + var dir = await io.Directory.systemTemp.createTemp('file_service');
|
| +
|
| + var args = ['--pause_isolates_on_start', io.Platform.script.toFilePath()];
|
| + var process1;
|
| + var process2;
|
| + var process3;
|
| +
|
| + void closeDown() {
|
| + if (process1 != null) {
|
| + process1.kill();
|
| + }
|
| + if (process2 != null) {
|
| + process2.kill();
|
| + }
|
| + if (process3 != null) {
|
| + process3.kill();
|
| + }
|
| + dir.deleteSync(recursive: true);
|
| + }
|
| +
|
| + Future<ServiceExtensionResponse> cleanup(ignored_a, ignored_b) {
|
| + closeDown();
|
| + var result = JSON.encode({'type' : 'foobar'});
|
| + return new Future.value(new ServiceExtensionResponse.result(result));
|
| + }
|
| +
|
| + Future<ServiceExtensionResponse> setup(ignored_a, ignored_b) async {
|
| + try {
|
| + process1 = await io.Process.start(io.Platform.executable, args);
|
| + process2 = await io.Process.start(io.Platform.executable,
|
| + args..add('foobar'));
|
| + var codeFilePath = dir.path + io.Platform.pathSeparator + "other_file";
|
| + var codeFile = new io.File(codeFilePath);
|
| + await codeFile.writeAsString(
|
| + '''
|
| + import "dart:io";
|
| +
|
| + void main() async {
|
| + await stdin.drain();
|
| + }
|
| + ''');
|
| + process3 = await io.Process.start(io.Platform.executable,
|
| + [codeFilePath]);
|
| + } catch (e) {
|
| + closeDown();
|
| + throw e;
|
| + }
|
| +
|
| + var result =
|
| + JSON.encode({'type': 'foobar',
|
| + 'pids' : [process1.pid, process2.pid, process3.pid]});
|
| + return new Future.value(new ServiceExtensionResponse.result(result));
|
| + }
|
| +
|
| + Future<ServiceExtensionResponse> closeStdin(ignored_a, ignored_b) async {
|
| + process3.stdin.close();
|
| + var result = JSON.encode({'type' : 'foobar'});
|
| + var returnValue =
|
| + new Future.value(new ServiceExtensionResponse.result(result));
|
| + return process3.exitCode.then((int exit) => returnValue);
|
| + }
|
| +
|
| + registerExtension('__cleanup', cleanup);
|
| + registerExtension('__setup', setup);
|
| + registerExtension('__closeStdin', closeStdin);
|
| +
|
| +}
|
| +
|
| +var processTests = [
|
| + // Initial.
|
| + (Isolate isolate) async {
|
| + var setup = await isolate.invokeRpcNoUpgrade('__setup', {});
|
| + try {
|
| + var all = await isolate.invokeRpcNoUpgrade('__getProcesses', {});
|
| + expect(all['type'], equals('_startedprocesses'));
|
| +
|
| + expect(all['data'].length, equals(3));
|
| +
|
| + var first = await isolate.invokeRpcNoUpgrade(
|
| + '__getProcessById', { 'id' : all['data'][0]['id'] });
|
| + expect(first['name'], io.Platform.executable);
|
| + expect(first['pid'], equals(setup['pids'][0]));
|
| + expect(first['arguments'].contains('foobar'), isFalse);
|
| +
|
| + var second = await isolate.invokeRpcNoUpgrade(
|
| + '__getProcessById', { 'id' : all['data'][1]['id'] });
|
| + expect(second['name'], io.Platform.executable);
|
| + expect(second['pid'], equals(setup['pids'][1]));
|
| + expect(second['arguments'].contains('foobar'), isTrue);
|
| + expect(second['pid'] != first['pid'], isTrue);
|
| +
|
| + var third = await isolate.invokeRpcNoUpgrade(
|
| + '__getProcessById', { 'id' : all['data'][2]['id'] });
|
| + expect(third['name'], io.Platform.executable);
|
| + expect(third['pid'], equals(setup['pids'][2]));
|
| + expect(third['pid'] != first['pid'], isTrue);
|
| + expect(third['pid'] != second['pid'], isTrue);
|
| +
|
| + await isolate.invokeRpcNoUpgrade('__closeStdin', {});
|
| + all = await isolate.invokeRpcNoUpgrade('__getProcesses', {});
|
| + expect(all['type'], equals('_startedprocesses'));
|
| + expect(all['data'].length, equals(2));
|
| + } finally {
|
| + await isolate.invokeRpcNoUpgrade('__cleanup', {});
|
| + }
|
| + },
|
| +];
|
| +
|
| +main(args) async => runIsolateTests(args, processTests,
|
| + testeeBefore:setupProcesses);
|
|
|