[ package:vm_service ] Update tests to be compatible with pub run test

Will allow for tests to be enabled in google3 as pub or portions of pub
are used to run VM tests.

Previously the test harness was configured to look for a URI with a data: scheme to determine if it was being run via pub run test (pub generates its own harness and spawns the test from that). We were parsing the test URI out of this data URI, which wouldn't work correctly in google3.

This change assumes that if Platform.script.scheme == 'data', the test is being run via pub from the root directory of the package. In that case, we can assume there is a 'test' directory and simply use 'test/$scriptName'as the path for the testee process.

TEST=N/A

Change-Id: I589605ebc7001adc9d8595ca8347c0af329b9c28
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/184541
Reviewed-by: Gary Roumanis <grouma@google.com>
This commit is contained in:
Ben Konyi 2021-02-12 07:12:54 +00:00
parent c95714d069
commit fa8ea6dfaa
35 changed files with 248 additions and 84 deletions

View file

@ -11,7 +11,7 @@
"constraint, update this by running tools/generate_package_config.dart."
],
"configVersion": 2,
"generated": "2021-02-08T17:50:36.420568",
"generated": "2021-02-11T15:59:54.232365",
"generator": "tools/generate_package_config.dart",
"packages": [
{
@ -505,12 +505,24 @@
"packageUri": "lib/",
"languageVersion": "2.12"
},
{
"name": "platform",
"rootUri": "../third_party/pkg/platform",
"packageUri": "lib/",
"languageVersion": "2.12"
},
{
"name": "pool",
"rootUri": "../third_party/pkg/pool",
"packageUri": "lib/",
"languageVersion": "2.12"
},
{
"name": "process",
"rootUri": "../third_party/pkg/process",
"packageUri": "lib/",
"languageVersion": "2.12"
},
{
"name": "protobuf",
"rootUri": "../third_party/pkg/protobuf/protobuf",
@ -782,4 +794,4 @@
"languageVersion": "2.12"
}
]
}
}

View file

@ -74,7 +74,9 @@ observatory_test_package:runtime/observatory/tests/service/observatory_test_pack
package_config:third_party/pkg_tested/package_config/lib
path:third_party/pkg/path/lib
pedantic:third_party/pkg/pedantic/lib
platform:third_party/pkg/platform/lib
pool:third_party/pkg/pool/lib
process:third_party/pkg/process/lib
protobuf:third_party/pkg/protobuf/protobuf/lib
pub:third_party/pkg/pub/lib
pub_semver:third_party/pkg/pub_semver/lib

6
DEPS
View file

@ -130,8 +130,10 @@ vars = {
"package_config_rev": "249af482de9ebabfc781bf10d6152c938e5ce45e",
"path_rev": "407ab76187fade41c31e39c745b39661b710106c",
"pedantic_rev": "df177f6ae531426aaf7bbf0121c90dc89d9c57bf",
"platform_rev": "c20e6fa315e9f8820e51c0ae721f63aff33b8e17",
"ply_rev": "604b32590ffad5cbb82e4afef1d305512d06ae93",
"pool_rev": "7abe634002a1ba8a0928eded086062f1307ccfae",
"process_rev": "56ece43b53b64c63ae51ec184b76bd5360c28d0b",
"protobuf_rev": "0d03fd588df69e9863e2a2efc0059dee8f18d5b2",
"pub_rev": "0e657414a472e74ca5dd76ae0db50cc060251dec",
"pub_semver_rev": "f50d80ef10c4b2fa5f4c8878036a4d9342c0cc82",
@ -387,10 +389,14 @@ deps = {
Var("dart_git") + "path.git" + "@" + Var("path_rev"),
Var("dart_root") + "/third_party/pkg/pedantic":
Var("dart_git") + "pedantic.git" + "@" + Var("pedantic_rev"),
Var("dart_root") + "/third_party/pkg/platform":
Var("dart_git") + "platform.dart.git" + "@" + Var("platform_rev"),
Var("dart_root") + "/third_party/pkg/pool":
Var("dart_git") + "pool.git" + "@" + Var("pool_rev"),
Var("dart_root") + "/third_party/pkg/protobuf":
Var("dart_git") + "protobuf.git" + "@" + Var("protobuf_rev"),
Var("dart_root") + "/third_party/pkg/process":
Var("dart_git") + "process.dart.git" + "@" + Var("process_rev"),
Var("dart_root") + "/third_party/pkg/pub_semver":
Var("dart_git") + "pub_semver.git" + "@" + Var("pub_semver_rev"),
Var("dart_root") + "/third_party/pkg/pub":

View file

@ -18,5 +18,6 @@ dev_dependencies:
mockito: ^5.0.0-nullsafety.1
path: ^1.8.0
pedantic: ^1.10.0-nullsafety.3
process: ^4.0.0
pub_semver: ^2.0.0-nullsafety.0
test: ^1.16.0-nullsafety.13

View file

@ -102,5 +102,9 @@ Future testAsync(VmService service, IsolateRef isolateRef) async {
final tests = <IsolateTest>[testAsync];
main([args = const <String>[]]) =>
runIsolateTests(args, tests, testeeConcurrent: testeeDo);
main([args = const <String>[]]) => runIsolateTests(
args,
tests,
'async_generator_breakpoint_test.dart',
testeeConcurrent: testeeDo,
);

View file

@ -42,5 +42,9 @@ var tests = <IsolateTest>[
resumeIsolate,
];
main([args = const <String>[]]) =>
runIsolateTests(args, tests, testeeConcurrent: testMain);
main([args = const <String>[]]) => runIsolateTests(
args,
tests,
'async_next_test.dart',
testeeConcurrent: testMain,
);

View file

@ -70,5 +70,9 @@ var tests = <IsolateTest>[
resumeIsolate,
];
main([args = const <String>[]]) =>
runIsolateTests(args, tests, testeeConcurrent: testeeDo);
main([args = const <String>[]]) => runIsolateTests(
args,
tests,
'async_scope_test.dart',
testeeConcurrent: testeeDo,
);

View file

@ -78,5 +78,10 @@ var tests = <IsolateTest>[
resumeIsolate
];
main([args = const <String>[]]) => runIsolateTests(args, tests,
testeeConcurrent: testMain, extraArgs: extraDebuggingArgs);
main([args = const <String>[]]) => runIsolateTests(
args,
tests,
'async_single_step_exception_test.dart',
testeeConcurrent: testMain,
extraArgs: extraDebuggingArgs,
);

View file

@ -43,5 +43,10 @@ var tests = <IsolateTest>[
resumeIsolate
];
main([args = const <String>[]]) => runIsolateTestsSynchronous(args, tests,
testeeConcurrent: testMain, extraArgs: extraDebuggingArgs);
main([args = const <String>[]]) => runIsolateTestsSynchronous(
args,
tests,
'async_single_step_into_test.dart',
testeeConcurrent: testMain,
extraArgs: extraDebuggingArgs,
);

View file

@ -56,5 +56,10 @@ var tests = <IsolateTest>[
resumeIsolate
];
main([args = const <String>[]]) => runIsolateTests(args, tests,
testeeConcurrent: testMain, extraArgs: extraDebuggingArgs);
main([args = const <String>[]]) => runIsolateTests(
args,
tests,
'async_single_step_out_test.dart',
testeeConcurrent: testMain,
extraArgs: extraDebuggingArgs,
);

View file

@ -70,5 +70,10 @@ var tests = <IsolateTest>[
resumeIsolate,
];
main([args = const <String>[]]) => runIsolateTestsSynchronous(args, tests,
testeeConcurrent: testMain, extraArgs: extraDebuggingArgs);
main([args = const <String>[]]) => runIsolateTestsSynchronous(
args,
tests,
'async_star_single_step_into_test.dart',
testeeConcurrent: testMain,
extraArgs: extraDebuggingArgs,
);

View file

@ -100,5 +100,10 @@ var tests = <IsolateTest>[
stoppedAtLine(LINE_I), // return null.
];
main([args = const <String>[]]) => runIsolateTestsSynchronous(args, tests,
testeeConcurrent: testMain, extraArgs: extraDebuggingArgs);
main([args = const <String>[]]) => runIsolateTestsSynchronous(
args,
tests,
'async_star_step_out_test.dart',
testeeConcurrent: testMain,
extraArgs: extraDebuggingArgs,
);

View file

@ -53,5 +53,10 @@ var tests = <IsolateTest>[
stoppedAtLine(LINE_F),
];
main([args = const <String>[]]) => runIsolateTests(args, tests,
testeeConcurrent: testMain, extraArgs: extraDebuggingArgs);
main([args = const <String>[]]) => runIsolateTests(
args,
tests,
'async_step_out_test.dart',
testeeConcurrent: testMain,
extraArgs: extraDebuggingArgs,
);

View file

@ -7,6 +7,7 @@ library test_helper;
import 'dart:async';
import 'dart:convert';
import 'dart:io' as io;
import 'package:process/process.dart';
import 'package:vm_service/vm_service_io.dart';
import 'package:vm_service/vm_service.dart';
import 'package:test/test.dart';
@ -27,19 +28,15 @@ bool _isTestee() {
return io.Platform.environment.containsKey(_TESTEE_ENV_KEY);
}
Uri _getTestUri() {
Uri _getTestUri(String script) {
if (io.Platform.script.scheme == 'data') {
// If we're using pub to run these tests this value isn't a file URI.
// We'll need to parse the actual URI out...
final fileRegExp = RegExp(r'file:\/\/\/.*\.dart');
final path =
fileRegExp.stringMatch(io.Platform.script.data!.contentAsString());
if (path == null) {
throw 'Unable to determine file path for script!';
}
return Uri.parse(path);
// If running from pub we can assume that we're in the root of the package
// directory.
return Uri.parse('test/$script');
} else {
return io.Platform.script;
// Resolve the script to ensure that test will fail if the provided script
// name doesn't match the actual script.
return io.Platform.script.resolve(script);
}
}
@ -97,7 +94,8 @@ class _ServiceTesteeLauncher {
List<String> args;
bool killedByTester = false;
_ServiceTesteeLauncher() : args = [_getTestUri().toFilePath()];
_ServiceTesteeLauncher(String script)
: args = [_getTestUri(script).toFilePath()];
// Spawn the testee process.
Future<io.Process> _spawnProcess(
@ -164,7 +162,13 @@ class _ServiceTesteeLauncher {
arguments.insert(0, '-D$k=$v');
});
print('** Launching $bashEnvironment$executable ${arguments.join(' ')}');
return io.Process.start(executable, arguments, environment: environment);
return LocalProcessManager().start(
[
executable,
...arguments,
],
environment: environment,
);
}
Future<Uri> launch(
@ -214,10 +218,10 @@ class _ServiceTesteeLauncher {
io.stdout.write('>testee>err> ${line}\n');
});
process!.exitCode.then((exitCode) {
if ((io.exitCode != 0) && !killedByTester) {
if ((exitCode != 0) && !killedByTester) {
throw "Testee exited with $exitCode";
}
print("** Process exited");
print("** Process exited: $exitCode");
});
return completer.future;
});
@ -245,13 +249,14 @@ class _ServiceTesterRunner {
List<String>? extraArgs,
List<VMTest>? vmTests,
List<IsolateTest>? isolateTests,
required String scriptName,
bool pause_on_start = false,
bool pause_on_exit = false,
bool verbose_vm = false,
bool pause_on_unhandled_exceptions = false,
bool testeeControlsServer = false,
bool useAuthToken = false}) async {
var process = _ServiceTesteeLauncher();
var process = _ServiceTesteeLauncher(scriptName);
late VmService vm;
late IsolateRef isolate;
setUp(() async {
@ -272,7 +277,7 @@ class _ServiceTesterRunner {
});
});
final name = _getTestUri().pathSegments.last;
final name = _getTestUri(scriptName).pathSegments.last;
test(
name,
@ -348,7 +353,8 @@ class _ServiceTesterRunner {
/// to run tests or testee in this invocation of the script.
Future<void> runIsolateTests(
List<String> mainArgs,
List<IsolateTest> tests, {
List<IsolateTest> tests,
String scriptName, {
testeeBefore()?,
testeeConcurrent()?,
bool pause_on_start = false,
@ -369,6 +375,7 @@ Future<void> runIsolateTests(
} else {
await _ServiceTesterRunner().run(
mainArgs: mainArgs,
scriptName: scriptName,
extraArgs: extraArgs,
isolateTests: tests,
pause_on_start: pause_on_start,
@ -391,7 +398,8 @@ Future<void> runIsolateTests(
/// functions).
void runIsolateTestsSynchronous(
List<String> mainArgs,
List<IsolateTest> tests, {
List<IsolateTest> tests,
String scriptName, {
void testeeBefore()?,
void testeeConcurrent()?,
bool pause_on_start = false,
@ -410,6 +418,7 @@ void runIsolateTestsSynchronous(
} else {
_ServiceTesterRunner().run(
mainArgs: mainArgs,
scriptName: scriptName,
extraArgs: extraArgs,
isolateTests: tests,
pause_on_start: pause_on_start,
@ -425,7 +434,8 @@ void runIsolateTestsSynchronous(
/// to run tests or testee in this invocation of the script.
Future<void> runVMTests(
List<String> mainArgs,
List<VMTest> tests, {
List<VMTest> tests,
String scriptName, {
testeeBefore()?,
testeeConcurrent()?,
bool pause_on_start = false,
@ -443,6 +453,7 @@ Future<void> runVMTests(
} else {
await _ServiceTesterRunner().run(
mainArgs: mainArgs,
scriptName: scriptName,
extraArgs: extraArgs,
vmTests: tests,
pause_on_start: pause_on_start,

View file

@ -111,5 +111,9 @@ var tests = <IsolateTest>[
},
];
main([args = const <String>[]]) =>
runIsolateTests(args, tests, testeeConcurrent: testFunction);
main([args = const <String>[]]) => runIsolateTests(
args,
tests,
'coverage_leaf_function_test.dart',
testeeConcurrent: testFunction,
);

View file

@ -236,5 +236,9 @@ var tests = <IsolateTest>[
},
];
main([args = const <String>[]]) =>
runIsolateTests(args, tests, testeeBefore: startTimer);
main([args = const <String>[]]) => runIsolateTests(
args,
tests,
'debugging_test.dart',
testeeBefore: startTimer,
);

View file

@ -109,5 +109,9 @@ expectError(func) async {
}
}
main([args = const <String>[]]) =>
runIsolateTests(args, tests, testeeConcurrent: testFunction);
main([args = const <String>[]]) => runIsolateTests(
args,
tests,
'eval_test.dart',
testeeConcurrent: testFunction,
);

View file

@ -62,5 +62,9 @@ final tests = <IsolateTest>[
}
];
main([args = const <String>[]]) =>
runIsolateTests(args, tests, testeeBefore: testeeMain);
main([args = const <String>[]]) => runIsolateTests(
args,
tests,
'evaluate_with_scope_test.dart',
testeeBefore: testeeMain,
);

View file

@ -111,4 +111,9 @@ var fileTests = <IsolateTest>[
},
];
main(args) async => runIsolateTests(args, fileTests, testeeBefore: setupFiles);
main([args = const <String>[]]) async => runIsolateTests(
args,
fileTests,
'file_service_test.dart',
testeeBefore: setupFiles,
);

View file

@ -65,4 +65,8 @@ var tests = <IsolateTest>[
},
];
main([args = const <String>[]]) async => runIsolateTests(args, tests);
main([args = const <String>[]]) async => runIsolateTests(
args,
tests,
'get_allocation_profile_rpc_test.dart',
);

View file

@ -56,5 +56,10 @@ var vmArgs = [
'--profile-vm=false', // So this also works with KBC.
];
main([args = const <String>[]]) async =>
runIsolateTests(args, tests, testeeBefore: testeeDo, extraArgs: vmArgs);
main([args = const <String>[]]) async => runIsolateTests(
args,
tests,
'get_cpu_samples_rpc_test.dart',
testeeBefore: testeeDo,
extraArgs: vmArgs,
);

View file

@ -72,4 +72,8 @@ var tests = <VMTest>[
}
];
main([args = const <String>[]]) async => runVMTests(args, tests);
main([args = const <String>[]]) async => runVMTests(
args,
tests,
'get_flag_list_rpc_test.dart',
);

View file

@ -32,4 +32,8 @@ var tests = <VMTest>[
},
];
main(args) async => runVMTests(args, tests);
main(args) async => runVMTests(
args,
tests,
'get_isolate_group_memory_usage.dart',
);

View file

@ -55,4 +55,8 @@ var tests = <VMTest>[
},
];
main(args) async => runVMTests(args, tests);
main([args = const <String>[]]) async => runVMTests(
args,
tests,
'get_isolate_rpc_test.dart',
);

View file

@ -29,4 +29,8 @@ var tests = <VMTest>[
},
];
main(args) async => runVMTests(args, tests);
main([args = const <String>[]]) async => runVMTests(
args,
tests,
'get_memory_usage_test.dart',
);

View file

@ -144,5 +144,9 @@ final tests = <IsolateTest>[
},
];
main([args = const <String>[]]) =>
runIsolateTests(args, tests, testeeConcurrent: testMain);
main([args = const <String>[]]) => runIsolateTests(
args,
tests,
'get_stack_test.dart',
testeeConcurrent: testMain,
);

View file

@ -15,4 +15,8 @@ var tests = <VMTest>[
},
];
main([args = const <String>[]]) async => await runVMTests(args, tests);
main([args = const <String>[]]) async => await runVMTests(
args,
tests,
'get_version_rpc_test.dart',
);

View file

@ -105,5 +105,9 @@ var tests = <IsolateTest>[
},
];
main([args = const <String>[]]) async =>
runIsolateTests(args, tests, testeeBefore: script);
main([args = const <String>[]]) async => runIsolateTests(
args,
tests,
'heap_snapshot_graph_test.dart',
testeeBefore: script,
);

View file

@ -87,5 +87,9 @@ var tests = <IsolateTest>[
},
];
main([args = const <String>[]]) async =>
runIsolateTests(args, tests, testeeBefore: setup);
main([args = const <String>[]]) async => runIsolateTests(
args,
tests,
'http_enable_timeline_logging_service_test.dart',
testeeBefore: setup,
);

View file

@ -75,5 +75,9 @@ expectError(func) async {
expect(result.type == 'Error' || result.type == '@Error', isTrue);
}
main([args = const <String>[]]) =>
runIsolateTests(args, tests, testeeConcurrent: testFunction);
main([args = const <String>[]]) => runIsolateTests(
args,
tests,
'invoke_test.dart',
testeeConcurrent: testFunction,
);

View file

@ -130,5 +130,9 @@ var tests = <IsolateTest>[
// TODO(bkonyi): fully port observatory test for socket profiling.
];
main([args = const <String>[]]) async =>
runIsolateTests(args, tests, testeeBefore: setup);
main([args = const <String>[]]) async => runIsolateTests(
args,
tests,
'network_profiling_test.dart',
testeeBefore: setup,
);

View file

@ -151,9 +151,10 @@ final tests = <IsolateTest>[
},
];
main(args) => runIsolateTests(
main([args = const <String>[]]) => runIsolateTests(
args,
tests,
'object_graph_identity_hash_test.dart',
testeeBefore: script,
pause_on_exit: true,
);

View file

@ -7,15 +7,12 @@ import 'dart:convert';
import 'dart:developer';
import 'dart:io' as io;
import 'package:path/path.dart' as path;
import 'package:process/process.dart';
import 'package:test/test.dart';
import 'package:vm_service/vm_service.dart';
import 'common/test_helper.dart';
final dartJITBinary = path.join(path.dirname(io.Platform.resolvedExecutable),
'dart' + path.extension(io.Platform.resolvedExecutable));
Future setupProcesses() async {
final dir = await io.Directory.systemTemp.createTemp('file_service');
@ -48,10 +45,15 @@ Future setupProcesses() async {
}
Future<ServiceExtensionResponse> setup(ignored_a, ignored_b) async {
final processManager = LocalProcessManager();
try {
process1 = await io.Process.start(io.Platform.executable, args);
process2 =
await io.Process.start(io.Platform.executable, args..add('foobar'));
process1 = await processManager.start(
[io.Platform.resolvedExecutable, ...args],
);
process2 = await processManager.start([
io.Platform.resolvedExecutable,
...(args..add('foobar')),
]);
final codeFilePath = dir.path + io.Platform.pathSeparator + "other_file";
final codeFile = io.File(codeFilePath);
await codeFile.writeAsString('''
@ -61,8 +63,13 @@ Future setupProcesses() async {
await stdin.drain();
}
''');
process3 = await io.Process.start(
dartJITBinary, [...io.Platform.executableArguments, codeFilePath]);
process3 = await processManager.start(
[
io.Platform.resolvedExecutable,
...io.Platform.executableArguments,
codeFilePath
],
);
} catch (_) {
closeDown();
rethrow;
@ -105,7 +112,7 @@ final processTests = <IsolateTest>[
all.processes[0].id,
);
expect(first.name, io.Platform.executable);
expect(io.Platform.resolvedExecutable, contains(first.name.trim()));
expect(first.pid, equals(setup.json!['pids']![0]));
expect(first.arguments.contains('foobar'), isFalse);
expect(first.startedAt, greaterThan(0));
@ -115,7 +122,7 @@ final processTests = <IsolateTest>[
all.processes[1].id,
);
expect(second.name, io.Platform.executable);
expect(io.Platform.resolvedExecutable, contains(second.name.trim()));
expect(second.pid, equals(setup.json!['pids']![1]));
expect(second.arguments.contains('foobar'), isTrue);
expect(second.pid != first.pid, isTrue);
@ -127,7 +134,7 @@ final processTests = <IsolateTest>[
all.processes[2].id,
);
expect(third.name, dartJITBinary);
expect(io.Platform.resolvedExecutable, contains(third.name.trim()));
expect(third.pid, equals(setup.json!['pids']![2]));
expect(third.pid != first.pid, isTrue);
expect(third.pid != second.pid, isTrue);
@ -148,5 +155,9 @@ final processTests = <IsolateTest>[
},
];
main(args) async =>
runIsolateTests(args, processTests, testeeBefore: setupProcesses);
main([args = const <String>[]]) async => runIsolateTests(
args,
processTests,
'process_service_test.dart',
testeeBefore: setupProcesses,
);

View file

@ -24,4 +24,8 @@ var tests = <IsolateTest>[
}
];
main([args = const <String>[]]) => runIsolateTests(args, tests);
main([args = const <String>[]]) => runIsolateTests(
args,
tests,
'regress_44588_test.dart',
);

View file

@ -20,4 +20,8 @@ var tests = <VMTest>[
},
];
main([args = const <String>[]]) async => await runVMTests(args, tests);
main([args = const <String>[]]) async => await runVMTests(
args,
tests,
'throws_sentinel_test.dart',
);