| OLD | NEW |
| 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 // VMOptions=--error_on_bad_type --error_on_bad_override | 4 // VMOptions=--error_on_bad_type --error_on_bad_override |
| 5 | 5 |
| 6 import 'dart:async'; | 6 import 'dart:async'; |
| 7 import 'dart:convert'; | 7 import 'dart:convert'; |
| 8 import 'package:observatory/models.dart' as M; | 8 import 'package:observatory/models.dart' as M; |
| 9 import 'package:observatory/service_io.dart'; | 9 import 'package:observatory/service_io.dart'; |
| 10 import 'package:unittest/unittest.dart'; | 10 import 'package:unittest/unittest.dart'; |
| 11 import 'service_test_common.dart'; | 11 import 'service_test_common.dart'; |
| 12 import 'test_helper.dart'; | 12 import 'test_helper.dart'; |
| 13 | 13 |
| 14 var tests = [ | 14 var tests = [ |
| 15 (VM vm) async { | 15 (VM vm) async { |
| 16 // Create a new fs. | 16 // Create a new fs. |
| 17 var fsName = 'scratch'; | 17 var fsName = 'scratch'; |
| 18 var result = await vm.invokeRpcNoUpgrade('_createDevFS', { | 18 var result = await vm.invokeRpcNoUpgrade('_createDevFS', { |
| 19 'fsName': fsName, | 19 'fsName': fsName, |
| 20 }); | 20 }); |
| 21 expect(result['type'], equals('FileSystem')); | 21 expect(result['type'], equals('FileSystem')); |
| 22 expect(result['name'], equals('scratch')); | 22 expect(result['name'], equals('scratch')); |
| 23 expect(result['uri'], new isInstanceOf<String>()); | 23 expect(result['uri'], new isInstanceOf<String>()); |
| 24 var fsUri = result['uri']; | 24 var fsUri = result['uri']; |
| 25 | 25 |
| 26 // Spawn a script with a bad uri and make sure that the error is | 26 // Spawn a script with a bad uri and make sure that the error is |
| 27 // delivered asynchronously. | 27 // delivered asynchronously. |
| 28 Completer completer = new Completer(); | 28 Completer completer = new Completer(); |
| 29 var sub; | 29 var sub; |
| 30 sub = await vm.listenEventStream( | 30 sub = await vm.listenEventStream(VM.kIsolateStream, (ServiceEvent event) { |
| 31 VM.kIsolateStream, | 31 if (event.kind == ServiceEvent.kIsolateSpawn) { |
| 32 (ServiceEvent event) { | 32 expect(event.spawnToken, equals('someSpawnToken')); |
| 33 if (event.kind == ServiceEvent.kIsolateSpawn) { | 33 expect(event.spawnError, |
| 34 expect(event.spawnToken, equals('someSpawnToken')); | 34 startsWith('IsolateSpawnException: Unable to spawn isolate: ')); |
| 35 expect(event.spawnError, startsWith( | 35 expect(event.isolate, isNull); |
| 36 'IsolateSpawnException: Unable to spawn isolate: ')); | 36 completer.complete(); |
| 37 expect(event.isolate, isNull); | 37 sub.cancel(); |
| 38 completer.complete(); | 38 } |
| 39 sub.cancel(); | 39 }); |
| 40 } | |
| 41 }); | |
| 42 | 40 |
| 43 result = await vm.invokeRpcNoUpgrade('_spawnUri', { | 41 result = await vm.invokeRpcNoUpgrade('_spawnUri', { |
| 44 'token': 'someSpawnToken', | 42 'token': 'someSpawnToken', |
| 45 'uri': '${fsUri}doesnotexist.dart', | 43 'uri': '${fsUri}doesnotexist.dart', |
| 46 }); | 44 }); |
| 47 expect(result['type'], equals('Success')); | 45 expect(result['type'], equals('Success')); |
| 48 await completer.future; | 46 await completer.future; |
| 49 | 47 |
| 50 // Delete the fs. | 48 // Delete the fs. |
| 51 result = await vm.invokeRpcNoUpgrade('_deleteDevFS', { | 49 result = await vm.invokeRpcNoUpgrade('_deleteDevFS', { |
| 52 'fsName': fsName, | 50 'fsName': fsName, |
| 53 }); | 51 }); |
| 54 expect(result['type'], equals('Success')); | 52 expect(result['type'], equals('Success')); |
| 55 }, | 53 }, |
| 56 | |
| 57 (VM vm) async { | 54 (VM vm) async { |
| 58 // Create a new fs. | 55 // Create a new fs. |
| 59 var fsName = 'scratch'; | 56 var fsName = 'scratch'; |
| 60 var result = await vm.invokeRpcNoUpgrade('_createDevFS', { | 57 var result = await vm.invokeRpcNoUpgrade('_createDevFS', { |
| 61 'fsName': fsName, | 58 'fsName': fsName, |
| 62 }); | 59 }); |
| 63 expect(result['type'], equals('FileSystem')); | 60 expect(result['type'], equals('FileSystem')); |
| 64 expect(result['name'], equals('scratch')); | 61 expect(result['name'], equals('scratch')); |
| 65 expect(result['uri'], new isInstanceOf<String>()); | 62 expect(result['uri'], new isInstanceOf<String>()); |
| 66 var fsUri = result['uri']; | 63 var fsUri = result['uri']; |
| 67 | 64 |
| 68 var filePaths = [ | 65 var filePaths = [ |
| 69 'devfs_file0.dart', | 66 'devfs_file0.dart', |
| 70 'devfs_file1.dart', | 67 'devfs_file1.dart', |
| 71 'devfs_file2.dart' | 68 'devfs_file2.dart' |
| 72 ]; | 69 ]; |
| 73 var scripts = [ | 70 var scripts = [ |
| 74 ''' | 71 ''' |
| 75 import 'dart:developer'; | 72 import 'dart:developer'; |
| 76 proofOfLife() => 'I live!'; | 73 proofOfLife() => 'I live!'; |
| 77 main() { | 74 main() { |
| 78 print('HELLO WORLD 1'); | 75 print('HELLO WORLD 1'); |
| 79 debugger(); | 76 debugger(); |
| 80 } | 77 } |
| 81 ''', | 78 ''', |
| 82 ''' | 79 ''' |
| 83 import 'dart:developer'; | 80 import 'dart:developer'; |
| 84 var globalArgs; | 81 var globalArgs; |
| 85 proofOfLife() => 'I live, \${globalArgs}!'; | 82 proofOfLife() => 'I live, \${globalArgs}!'; |
| 86 main(args) { | 83 main(args) { |
| 87 globalArgs = args; | 84 globalArgs = args; |
| 88 print('HELLO WORLD 2'); | 85 print('HELLO WORLD 2'); |
| 89 debugger(); | 86 debugger(); |
| 90 } | 87 } |
| 91 ''', | 88 ''', |
| 92 ''' | 89 ''' |
| 93 import 'dart:developer'; | 90 import 'dart:developer'; |
| 94 var globalArgs; | 91 var globalArgs; |
| 95 var globalMsg; | 92 var globalMsg; |
| 96 proofOfLife() => 'I live, \${globalArgs}, \${globalMsg}!'; | 93 proofOfLife() => 'I live, \${globalArgs}, \${globalMsg}!'; |
| 97 main(args, msg) { | 94 main(args, msg) { |
| 98 globalArgs = args; | 95 globalArgs = args; |
| 99 globalMsg = msg; | 96 globalMsg = msg; |
| 100 print('HELLO WORLD 3'); | 97 print('HELLO WORLD 3'); |
| 101 debugger(); | 98 debugger(); |
| 102 } | 99 } |
| 103 ''', | 100 ''', |
| 104 ]; | 101 ]; |
| 105 | 102 |
| 106 // Write three scripts to the fs. | 103 // Write three scripts to the fs. |
| 107 for (int i = 0; i < 3; i++) { | 104 for (int i = 0; i < 3; i++) { |
| 108 var fileContents = BASE64.encode(UTF8.encode(scripts[i])); | 105 var fileContents = BASE64.encode(UTF8.encode(scripts[i])); |
| 109 result = await vm.invokeRpcNoUpgrade('_writeDevFSFile', { | 106 result = await vm.invokeRpcNoUpgrade('_writeDevFSFile', { |
| 110 'fsName': fsName, | 107 'fsName': fsName, |
| 111 'path': filePaths[i], | 108 'path': filePaths[i], |
| 112 'fileContents': fileContents | 109 'fileContents': fileContents |
| 113 }); | 110 }); |
| 114 expect(result['type'], equals('Success')); | 111 expect(result['type'], equals('Success')); |
| 115 } | 112 } |
| 116 | 113 |
| 117 // Spawn the script with no arguments or message and make sure | 114 // Spawn the script with no arguments or message and make sure |
| 118 // that we are notified. | 115 // that we are notified. |
| 119 Completer completer = new Completer(); | 116 Completer completer = new Completer(); |
| 120 var sub; | 117 var sub; |
| 121 sub = await vm.listenEventStream( | 118 sub = await vm.listenEventStream(VM.kIsolateStream, (ServiceEvent event) { |
| 122 VM.kIsolateStream, | 119 if (event.kind == ServiceEvent.kIsolateSpawn) { |
| 123 (ServiceEvent event) { | 120 expect(event.spawnToken, equals('mySpawnToken0')); |
| 124 if (event.kind == ServiceEvent.kIsolateSpawn) { | 121 expect(event.isolate, isNotNull); |
| 125 expect(event.spawnToken, equals('mySpawnToken0')); | 122 expect(event.isolate.name, equals('devfs_file0.dart\$main')); |
| 126 expect(event.isolate, isNotNull); | 123 completer.complete(event.isolate); |
| 127 expect(event.isolate.name, equals('devfs_file0.dart\$main')); | 124 sub.cancel(); |
| 128 completer.complete(event.isolate); | 125 } |
| 129 sub.cancel(); | 126 }); |
| 130 } | |
| 131 }); | |
| 132 result = await vm.invokeRpcNoUpgrade('_spawnUri', { | 127 result = await vm.invokeRpcNoUpgrade('_spawnUri', { |
| 133 'token': 'mySpawnToken0', | 128 'token': 'mySpawnToken0', |
| 134 'uri': '${fsUri}${filePaths[0]}', | 129 'uri': '${fsUri}${filePaths[0]}', |
| 135 }); | 130 }); |
| 136 expect(result['type'], equals('Success')); | 131 expect(result['type'], equals('Success')); |
| 137 var spawnedIsolate = await completer.future; | 132 var spawnedIsolate = await completer.future; |
| 138 | 133 |
| 139 // Wait for the spawned isolate to hit a breakpoint. | 134 // Wait for the spawned isolate to hit a breakpoint. |
| 140 await spawnedIsolate.load(); | 135 await spawnedIsolate.load(); |
| 141 await hasStoppedAtBreakpoint(spawnedIsolate); | 136 await hasStoppedAtBreakpoint(spawnedIsolate); |
| 142 | 137 |
| 143 // Make sure that we are running code from the spawned isolate. | 138 // Make sure that we are running code from the spawned isolate. |
| 144 result = await spawnedIsolate.rootLibrary.evaluate('proofOfLife()'); | 139 result = await spawnedIsolate.rootLibrary.evaluate('proofOfLife()'); |
| 145 expect(result.type, equals('Instance')); | 140 expect(result.type, equals('Instance')); |
| 146 expect(result.kind, equals(M.InstanceKind.string)); | 141 expect(result.kind, equals(M.InstanceKind.string)); |
| 147 expect(result.valueAsString, equals('I live!')); | 142 expect(result.valueAsString, equals('I live!')); |
| 148 | 143 |
| 149 // Spawn the script with arguments. | 144 // Spawn the script with arguments. |
| 150 completer = new Completer(); | 145 completer = new Completer(); |
| 151 sub = await vm.listenEventStream( | 146 sub = await vm.listenEventStream(VM.kIsolateStream, (ServiceEvent event) { |
| 152 VM.kIsolateStream, | 147 if (event.kind == ServiceEvent.kIsolateSpawn) { |
| 153 (ServiceEvent event) { | 148 expect(event.spawnToken, equals('mySpawnToken1')); |
| 154 if (event.kind == ServiceEvent.kIsolateSpawn) { | 149 expect(event.isolate, isNotNull); |
| 155 expect(event.spawnToken, equals('mySpawnToken1')); | 150 expect(event.isolate.name, equals('devfs_file1.dart\$main')); |
| 156 expect(event.isolate, isNotNull); | 151 completer.complete(event.isolate); |
| 157 expect(event.isolate.name, equals('devfs_file1.dart\$main')); | 152 sub.cancel(); |
| 158 completer.complete(event.isolate); | 153 } |
| 159 sub.cancel(); | 154 }); |
| 160 } | |
| 161 }); | |
| 162 result = await vm.invokeRpcNoUpgrade('_spawnUri', { | 155 result = await vm.invokeRpcNoUpgrade('_spawnUri', { |
| 163 'token': 'mySpawnToken1', | 156 'token': 'mySpawnToken1', |
| 164 'uri': '${fsUri}${filePaths[1]}', | 157 'uri': '${fsUri}${filePaths[1]}', |
| 165 'args': ['one', 'two', 'three'] | 158 'args': ['one', 'two', 'three'] |
| 166 }); | 159 }); |
| 167 expect(result['type'], equals('Success')); | 160 expect(result['type'], equals('Success')); |
| 168 spawnedIsolate = await completer.future; | 161 spawnedIsolate = await completer.future; |
| 169 | 162 |
| 170 // Wait for the spawned isolate to hit a breakpoint. | 163 // Wait for the spawned isolate to hit a breakpoint. |
| 171 await spawnedIsolate.load(); | 164 await spawnedIsolate.load(); |
| 172 await hasStoppedAtBreakpoint(spawnedIsolate); | 165 await hasStoppedAtBreakpoint(spawnedIsolate); |
| 173 | 166 |
| 174 // Make sure that we are running code from the spawned isolate. | 167 // Make sure that we are running code from the spawned isolate. |
| 175 result = await spawnedIsolate.rootLibrary.evaluate('proofOfLife()'); | 168 result = await spawnedIsolate.rootLibrary.evaluate('proofOfLife()'); |
| 176 expect(result.type, equals('Instance')); | 169 expect(result.type, equals('Instance')); |
| 177 expect(result.kind, equals(M.InstanceKind.string)); | 170 expect(result.kind, equals(M.InstanceKind.string)); |
| 178 expect(result.valueAsString, equals('I live, [one, two, three]!')); | 171 expect(result.valueAsString, equals('I live, [one, two, three]!')); |
| 179 | 172 |
| 180 // Spawn the script with arguments and message | 173 // Spawn the script with arguments and message |
| 181 completer = new Completer(); | 174 completer = new Completer(); |
| 182 sub = await vm.listenEventStream( | 175 sub = await vm.listenEventStream(VM.kIsolateStream, (ServiceEvent event) { |
| 183 VM.kIsolateStream, | 176 if (event.kind == ServiceEvent.kIsolateSpawn) { |
| 184 (ServiceEvent event) { | 177 expect(event.spawnToken, equals('mySpawnToken2')); |
| 185 if (event.kind == ServiceEvent.kIsolateSpawn) { | 178 expect(event.isolate, isNotNull); |
| 186 expect(event.spawnToken, equals('mySpawnToken2')); | 179 expect(event.isolate.name, equals('devfs_file2.dart\$main')); |
| 187 expect(event.isolate, isNotNull); | 180 completer.complete(event.isolate); |
| 188 expect(event.isolate.name, equals('devfs_file2.dart\$main')); | 181 sub.cancel(); |
| 189 completer.complete(event.isolate); | 182 } |
| 190 sub.cancel(); | 183 }); |
| 191 } | |
| 192 }); | |
| 193 result = await vm.invokeRpcNoUpgrade('_spawnUri', { | 184 result = await vm.invokeRpcNoUpgrade('_spawnUri', { |
| 194 'token': 'mySpawnToken2', | 185 'token': 'mySpawnToken2', |
| 195 'uri': '${fsUri}${filePaths[2]}', | 186 'uri': '${fsUri}${filePaths[2]}', |
| 196 'args': ['A', 'B', 'C'], | 187 'args': ['A', 'B', 'C'], |
| 197 'message': 'test' | 188 'message': 'test' |
| 198 }); | 189 }); |
| 199 expect(result['type'], equals('Success')); | 190 expect(result['type'], equals('Success')); |
| 200 spawnedIsolate = await completer.future; | 191 spawnedIsolate = await completer.future; |
| 201 | 192 |
| 202 // Wait for the spawned isolate to hit a breakpoint. | 193 // Wait for the spawned isolate to hit a breakpoint. |
| 203 await spawnedIsolate.load(); | 194 await spawnedIsolate.load(); |
| 204 await hasStoppedAtBreakpoint(spawnedIsolate); | 195 await hasStoppedAtBreakpoint(spawnedIsolate); |
| 205 | 196 |
| 206 // Make sure that we are running code from the spawned isolate. | 197 // Make sure that we are running code from the spawned isolate. |
| 207 result = await spawnedIsolate.rootLibrary.evaluate('proofOfLife()'); | 198 result = await spawnedIsolate.rootLibrary.evaluate('proofOfLife()'); |
| 208 expect(result.type, equals('Instance')); | 199 expect(result.type, equals('Instance')); |
| 209 expect(result.kind, equals(M.InstanceKind.string)); | 200 expect(result.kind, equals(M.InstanceKind.string)); |
| 210 expect(result.valueAsString, equals('I live, [A, B, C], test!')); | 201 expect(result.valueAsString, equals('I live, [A, B, C], test!')); |
| 211 | 202 |
| 212 // Delete the fs. | 203 // Delete the fs. |
| 213 result = await vm.invokeRpcNoUpgrade('_deleteDevFS', { | 204 result = await vm.invokeRpcNoUpgrade('_deleteDevFS', { |
| 214 'fsName': fsName, | 205 'fsName': fsName, |
| 215 }); | 206 }); |
| 216 expect(result['type'], equals('Success')); | 207 expect(result['type'], equals('Success')); |
| 217 }, | 208 }, |
| 218 ]; | 209 ]; |
| 219 | 210 |
| 220 main(args) async => runVMTests(args, tests); | 211 main(args) async => runVMTests(args, tests); |
| OLD | NEW |