| Index: tests/lib/mirrors/invoke_natives_fuzz_test.dart
|
| diff --git a/tests/lib/mirrors/invocation_fuzz_test.dart b/tests/lib/mirrors/invoke_natives_fuzz_test.dart
|
| similarity index 62%
|
| rename from tests/lib/mirrors/invocation_fuzz_test.dart
|
| rename to tests/lib/mirrors/invoke_natives_fuzz_test.dart
|
| index aa0660aa7999f56970b185b19b8a5b7c32fdd94e..f9967eeffe2ea0d8ff438f705648019aed469898 100644
|
| --- a/tests/lib/mirrors/invocation_fuzz_test.dart
|
| +++ b/tests/lib/mirrors/invoke_natives_fuzz_test.dart
|
| @@ -14,42 +14,24 @@ import 'package:expect/expect.dart';
|
|
|
| // Methods to be skipped, by qualified name.
|
| var blacklist = [
|
| - // Don't recurse on this test.
|
| - 'test.invoke_natives',
|
| -
|
| - // Don't exit the test pre-maturely.
|
| - 'dart.io.exit',
|
| -
|
| - // Don't run blocking io calls.
|
| - new RegExp(r".*Sync$"),
|
| -
|
| - // These prevent the test from exiting.
|
| + // These prevent the test from exiting, typically by spawning another isolate.
|
| 'dart.async._scheduleAsyncCallback',
|
| - 'dart.async._setTimerFactoryClosure',
|
| -
|
| - 'dart.isolate._startIsolate',
|
| - 'dart.io.sleep',
|
| - 'dart.io.HttpServer.HttpServer.listenOn',
|
| -
|
| - // These either cause the VM to segfault or throw uncatchable API errors.
|
| - // TODO(15274): Fix them and remove from blacklist.
|
| 'dart.io._IOService.dispatch',
|
| - new RegExp(r'.*_RandomAccessFile.*'),
|
| - 'dart.io._StdIOUtils._socketType',
|
| - 'dart.io._StdIOUtils._getStdioOutputStream',
|
| - 'dart.io._Filter.newZLibInflateFilter',
|
| - 'dart.io._Filter.newZLibDeflateFilter',
|
| - 'dart.io._FileSystemWatcher._listenOnSocket',
|
| + 'dart.isolate.RawReceivePort.RawReceivePort',
|
| + 'dart.isolate.ReceivePort.ReceivePort',
|
| + 'dart.isolate.ReceivePort.ReceivePort.fromRawReceivePort',
|
| + 'dart.isolate.ReceivePort.sendPort',
|
| + 'dart.isolate.ReceivePort.close',
|
| + 'dart.isolate.ReceivePort.listen',
|
| + 'dart.isolate.RawReceivePort.sendPort',
|
| + 'dart.isolate.RawReceivePort.close',
|
| + 'dart.isolate.RawReceivePort.handler=',
|
| +
|
| + // These "crash" the VM (throw uncatchable API errors).
|
| + // TODO(15274): Fill in this list to make the test pass and provide coverage
|
| + // against addition of new natives.
|
| ];
|
|
|
| -bool isBlacklisted(Symbol qualifiedSymbol) {
|
| - var qualifiedString = MirrorSystem.getName(qualifiedSymbol);
|
| - for (var pattern in blacklist) {
|
| - if (qualifiedString.contains(pattern)) return true;
|
| - }
|
| - return false;
|
| -}
|
| -
|
| class Task {
|
| var name;
|
| var action;
|
| @@ -57,7 +39,7 @@ class Task {
|
| var queue = new List();
|
|
|
| checkMethod(MethodMirror m, ObjectMirror target, [origin]) {
|
| - if (isBlacklisted(m.qualifiedName)) return;
|
| + if (blacklist.contains(MirrorSystem.getName(m.qualifiedName))) return;
|
|
|
| var task = new Task();
|
| task.name = '${MirrorSystem.getName(m.qualifiedName)} from $origin';
|
| @@ -81,24 +63,21 @@ checkMethod(MethodMirror m, ObjectMirror target, [origin]) {
|
| }
|
|
|
| checkInstance(instanceMirror, origin) {
|
| - ClassMirror klass = instanceMirror.type;
|
| - while (klass != null) {
|
| - instanceMirror.type.declarations.values
|
| - .where((d) => d is MethodMirror && !d.isStatic)
|
| - .forEach((m) => checkMethod(m, instanceMirror, origin));
|
| - klass = klass.superclass;
|
| - }
|
| + instanceMirror.type.declarations.values
|
| + .where((d) => d is MethodMirror)
|
| + .forEach((m) => checkMethod(m, instanceMirror, origin));
|
| }
|
|
|
| checkClass(classMirror) {
|
| classMirror.declarations.values
|
| - .where((d) => d is MethodMirror && d.isStatic)
|
| + .where((d) => d is MethodMirror)
|
| .forEach((m) => checkMethod(m, classMirror));
|
|
|
| classMirror.declarations.values
|
| - .where((d) => d is MethodMirror && d.isConstructor)
|
| + .where((d) => d is MethodMirror)
|
| .forEach((m) {
|
| - if (isBlacklisted(m.qualifiedName)) return;
|
| + if (blacklist.contains(MirrorSystem.getName(m.qualifiedName))) return;
|
| + if (!m.isConstructor) return;
|
| var task = new Task();
|
| task.name = MirrorSystem.getName(m.qualifiedName);
|
|
|
| @@ -112,8 +91,8 @@ checkClass(classMirror) {
|
| }
|
|
|
| checkLibrary(libraryMirror) {
|
| - print(libraryMirror.simpleName);
|
| - if (isBlacklisted(libraryMirror.qualifiedName)) return;
|
| + // Don't recurse on this test.
|
| + if (libraryMirror.simpleName == #test.invoke_natives) return;
|
|
|
| libraryMirror.declarations.values
|
| .where((d) => d is ClassMirror)
|
| @@ -125,19 +104,19 @@ checkLibrary(libraryMirror) {
|
| }
|
|
|
| var testZone;
|
| +var debug = true;
|
|
|
| doOneTask() {
|
| if (queue.length == 0) {
|
| - print('Done');
|
| + if (debug) print('Done');
|
| return;
|
| }
|
|
|
| var task = queue.removeLast();
|
| - print(task.name);
|
| + if (debug) print(task.name);
|
| try {
|
| task.action();
|
| } catch(e) {}
|
| -
|
| // Register the next task in a timer callback so as to yield to async code
|
| // scheduled in the current task. This isn't necessary for the test itself,
|
| // but is helpful when trying to figure out which function is responsible for
|
| @@ -145,15 +124,9 @@ doOneTask() {
|
| testZone.createTimer(Duration.ZERO, doOneTask);
|
| }
|
|
|
| -main([args]) {
|
| +main() {
|
| currentMirrorSystem().libraries.values.forEach(checkLibrary);
|
|
|
| - var valueObjects =
|
| - [true, false, null,
|
| - 0, 0xEFFFFFF, 0xFFFFFFFF, 0xFFFFFFFFFFFFFFFF,
|
| - "foo", 'blåbærgrød', 'Îñţérñåţîöñåļîžåţîờñ'];
|
| - valueObjects.forEach((v) => checkInstance(reflect(v), 'value object'));
|
| -
|
| uncaughtErrorHandler(self, parent, zone, error, stack) {};
|
| var zoneSpec =
|
| new ZoneSpecification(handleUncaughtError: uncaughtErrorHandler);
|
|
|