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