| OLD | NEW |
| (Empty) | |
| 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
| 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. |
| 4 |
| 5 library test.domain.execution; |
| 6 |
| 7 import 'package:analyzer/file_system/physical_file_system.dart'; |
| 8 import 'package:analysis_server/src/analysis_server.dart'; |
| 9 import 'package:analysis_server/src/constants.dart'; |
| 10 import 'package:analysis_server/src/domain_execution.dart'; |
| 11 import 'package:analysis_server/src/protocol.dart'; |
| 12 import 'mock_sdk.dart'; |
| 13 import 'package:unittest/unittest.dart'; |
| 14 |
| 15 import 'mocks.dart'; |
| 16 import 'operation/operation_queue_test.dart'; |
| 17 import 'package:typed_mock/typed_mock.dart'; |
| 18 import 'package:analyzer/src/generated/engine.dart'; |
| 19 import 'package:analyzer/src/generated/source.dart'; |
| 20 |
| 21 main() { |
| 22 group('ExecutionDomainHandler', () { |
| 23 AnalysisServer server; |
| 24 ExecutionDomainHandler handler; |
| 25 |
| 26 setUp(() { |
| 27 server = new AnalysisServer( |
| 28 new MockServerChannel(), |
| 29 PhysicalResourceProvider.INSTANCE, |
| 30 new MockPackageMapProvider(), |
| 31 null, |
| 32 new MockSdk()); |
| 33 handler = new ExecutionDomainHandler(server); |
| 34 }); |
| 35 |
| 36 group('createContext/deleteContext', () { |
| 37 test('create/delete multiple contexts', () { |
| 38 Request request = |
| 39 new ExecutionCreateContextParams('/a/b.dart').toRequest('0'); |
| 40 Response response = handler.handleRequest(request); |
| 41 expect(response, isResponseSuccess('0')); |
| 42 ExecutionCreateContextResult result = |
| 43 new ExecutionCreateContextResult.fromResponse(response); |
| 44 String id0 = result.id; |
| 45 |
| 46 request = new ExecutionCreateContextParams('/c/d.dart').toRequest('1'); |
| 47 response = handler.handleRequest(request); |
| 48 expect(response, isResponseSuccess('1')); |
| 49 result = new ExecutionCreateContextResult.fromResponse(response); |
| 50 String id1 = result.id; |
| 51 |
| 52 expect(id0 == id1, isFalse); |
| 53 |
| 54 request = new ExecutionDeleteContextParams(id0).toRequest('2'); |
| 55 response = handler.handleRequest(request); |
| 56 expect(response, isResponseSuccess('2')); |
| 57 |
| 58 request = new ExecutionDeleteContextParams(id1).toRequest('3'); |
| 59 response = handler.handleRequest(request); |
| 60 expect(response, isResponseSuccess('3')); |
| 61 }); |
| 62 |
| 63 test('delete non-existent context', () { |
| 64 Request request = new ExecutionDeleteContextParams('13').toRequest('0'); |
| 65 Response response = handler.handleRequest(request); |
| 66 // TODO(brianwilkerson) It isn't currently specified to be an error if a |
| 67 // client attempts to delete a context that doesn't exist. Should it be? |
| 68 // expect(response, isResponseFailure('0')); |
| 69 expect(response, isResponseSuccess('0')); |
| 70 }); |
| 71 }); |
| 72 |
| 73 group('mapUri', () { |
| 74 String contextId; |
| 75 |
| 76 setUp(() { |
| 77 Request request = |
| 78 new ExecutionCreateContextParams('/a/b.dart').toRequest('0'); |
| 79 Response response = handler.handleRequest(request); |
| 80 expect(response, isResponseSuccess('0')); |
| 81 ExecutionCreateContextResult result = |
| 82 new ExecutionCreateContextResult.fromResponse(response); |
| 83 contextId = result.id; |
| 84 }); |
| 85 |
| 86 tearDown(() { |
| 87 Request request = |
| 88 new ExecutionDeleteContextParams(contextId).toRequest('1'); |
| 89 Response response = handler.handleRequest(request); |
| 90 expect(response, isResponseSuccess('1')); |
| 91 }); |
| 92 |
| 93 test('file to URI', () { |
| 94 Request request = |
| 95 new ExecutionMapUriParams(contextId, file: '/a/b.dart').toRequest('2
'); |
| 96 Response response = handler.handleRequest(request); |
| 97 expect(response, isResponseSuccess('2')); |
| 98 ExecutionMapUriResult result = |
| 99 new ExecutionMapUriResult.fromResponse(response); |
| 100 expect(result.file, isNull); |
| 101 expect(result.uri, isNotNull); |
| 102 // TODO(brianwilkerson) Test for the correct result. |
| 103 }); |
| 104 |
| 105 test('URI to file', () { |
| 106 Request request = |
| 107 new ExecutionMapUriParams(contextId, uri: '/a/b.dart').toRequest('3'
); |
| 108 Response response = handler.handleRequest(request); |
| 109 expect(response, isResponseSuccess('3')); |
| 110 ExecutionMapUriResult result = |
| 111 new ExecutionMapUriResult.fromResponse(response); |
| 112 expect(result.file, isNotNull); |
| 113 expect(result.uri, isNull); |
| 114 // TODO(brianwilkerson) Test for the correct result. |
| 115 }); |
| 116 |
| 117 test('invalid context id', () { |
| 118 Request request = |
| 119 new ExecutionMapUriParams('xxx', uri: '').toRequest('4'); |
| 120 Response response = handler.handleRequest(request); |
| 121 expect(response, isResponseFailure('4')); |
| 122 }); |
| 123 |
| 124 test('both file and uri', () { |
| 125 Request request = |
| 126 new ExecutionMapUriParams('xxx', file: '', uri: '').toRequest('5'); |
| 127 Response response = handler.handleRequest(request); |
| 128 expect(response, isResponseFailure('5')); |
| 129 }); |
| 130 }); |
| 131 |
| 132 group('setSubscriptions', () { |
| 133 test('failure - invalid service name', () { |
| 134 expect(handler.launchDataListener, isNull); |
| 135 |
| 136 Request request = new Request('0', EXECUTION_SET_SUBSCRIPTIONS, { |
| 137 SUBSCRIPTIONS: ['noSuchService'] |
| 138 }); |
| 139 Response response = handler.handleRequest(request); |
| 140 expect(response, isResponseFailure('0')); |
| 141 expect(handler.launchDataListener, isNull); |
| 142 }); |
| 143 |
| 144 test('success - setting and clearing', () { |
| 145 expect(handler.launchDataListener, isNull); |
| 146 |
| 147 Request request = new ExecutionSetSubscriptionsParams( |
| 148 [ExecutionService.LAUNCH_DATA]).toRequest('0'); |
| 149 Response response = handler.handleRequest(request); |
| 150 expect(response, isResponseSuccess('0')); |
| 151 expect(handler.launchDataListener, isNotNull); |
| 152 |
| 153 request = new ExecutionSetSubscriptionsParams([]).toRequest('0'); |
| 154 response = handler.handleRequest(request); |
| 155 expect(response, isResponseSuccess('0')); |
| 156 expect(handler.launchDataListener, isNull); |
| 157 }); |
| 158 }); |
| 159 }); |
| 160 |
| 161 group('LaunchDataNotificationListener', () { |
| 162 test('success - setting and clearing', () { |
| 163 Source source1 = new TestSource('/a.dart'); |
| 164 Source source2 = new TestSource('/b.dart'); |
| 165 Source source3 = new TestSource('/c.dart'); |
| 166 Source source4 = new TestSource('/d.dart'); |
| 167 Source source5 = new TestSource('/e.html'); |
| 168 Source source6 = new TestSource('/f.html'); |
| 169 Source source7 = new TestSource('/g.html'); |
| 170 Source source8 = new TestSource('/h.dart'); |
| 171 Source source9 = new TestSource('/i.dart'); |
| 172 |
| 173 AnalysisContext context = new AnalysisContextMock(); |
| 174 when(context.launchableClientLibrarySources) |
| 175 .thenReturn([source1, source2]); |
| 176 when(context.launchableServerLibrarySources) |
| 177 .thenReturn([source2, source3]); |
| 178 when(context.librarySources).thenReturn([source4]); |
| 179 when(context.getHtmlFilesReferencing(anyObject)) |
| 180 .thenReturn([source5, source6]); |
| 181 when(context.htmlSources).thenReturn([source7]); |
| 182 when(context.getLibrariesReferencedFromHtml(anyObject)) |
| 183 .thenReturn([source8, source9]); |
| 184 |
| 185 AnalysisServer server = new AnalysisServerMock(); |
| 186 when(server.getAnalysisContexts()).thenReturn([context]); |
| 187 bool notificationSent = false; |
| 188 when(server.sendNotification(anyObject)) |
| 189 .thenInvoke((Notification notification) { |
| 190 ExecutionLaunchDataParams params = |
| 191 new ExecutionLaunchDataParams.fromNotification(notification); |
| 192 |
| 193 List<ExecutableFile> executables = params.executables; |
| 194 expect(executables.length, equals(3)); |
| 195 expect( |
| 196 executables[0], |
| 197 isExecutableFile(source1, ExecutableKind.CLIENT)); |
| 198 expect( |
| 199 executables[1], |
| 200 isExecutableFile(source2, ExecutableKind.EITHER)); |
| 201 expect( |
| 202 executables[2], |
| 203 isExecutableFile(source3, ExecutableKind.SERVER)); |
| 204 |
| 205 Map<String, List<String>> dartToHtml = params.dartToHtml; |
| 206 expect(dartToHtml.length, equals(1)); |
| 207 List<String> htmlFiles = dartToHtml[source4.fullName]; |
| 208 expect(htmlFiles, isNotNull); |
| 209 expect(htmlFiles.length, equals(2)); |
| 210 expect(htmlFiles[0], equals(source5.fullName)); |
| 211 expect(htmlFiles[1], equals(source6.fullName)); |
| 212 |
| 213 Map<String, List<String>> htmlToDart = params.htmlToDart; |
| 214 expect(htmlToDart.length, equals(1)); |
| 215 List<String> dartFiles = htmlToDart[source7.fullName]; |
| 216 expect(dartFiles, isNotNull); |
| 217 expect(dartFiles.length, equals(2)); |
| 218 expect(dartFiles[0], equals(source8.fullName)); |
| 219 expect(dartFiles[1], equals(source9.fullName)); |
| 220 |
| 221 notificationSent = true; |
| 222 }); |
| 223 LaunchDataNotificationListener listener = |
| 224 new LaunchDataNotificationListener(server); |
| 225 listener.analysisComplete(); |
| 226 expect(notificationSent, isTrue); |
| 227 }); |
| 228 }); |
| 229 } |
| 230 |
| 231 /** |
| 232 * A [Source] that knows it's [fullName]. |
| 233 */ |
| 234 class TestSource implements Source { |
| 235 String fullName; |
| 236 |
| 237 TestSource(this.fullName); |
| 238 |
| 239 @override |
| 240 noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); |
| 241 } |
| 242 |
| 243 /** |
| 244 * Return a matcher that will match an [ExecutableFile] if it has the given |
| 245 * [source] and [kind]. |
| 246 */ |
| 247 Matcher isExecutableFile(Source source, ExecutableKind kind) { |
| 248 return new IsExecutableFile(source.fullName, kind); |
| 249 } |
| 250 |
| 251 /** |
| 252 * A matcher that will match an [ExecutableFile] if it has a specified [source] |
| 253 * and [kind]. |
| 254 */ |
| 255 class IsExecutableFile extends Matcher { |
| 256 String expectedFile; |
| 257 ExecutableKind expectedKind; |
| 258 |
| 259 IsExecutableFile(this.expectedFile, this.expectedKind); |
| 260 |
| 261 @override |
| 262 Description describe(Description description) { |
| 263 return description.add('ExecutableFile($expectedFile, $expectedKind)'); |
| 264 } |
| 265 |
| 266 @override |
| 267 bool matches(item, Map matchState) { |
| 268 if (item is! ExecutableFile) { |
| 269 return false; |
| 270 } |
| 271 ExecutableFile file = item; |
| 272 return item.file == expectedFile && item.kind == expectedKind; |
| 273 } |
| 274 } |
| OLD | NEW |