| // Copyright 2015 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| import 'dart:async'; |
| import 'dart:convert'; |
| import 'dart:isolate'; |
| import 'dart:mojo.builtin' as builtin; |
| import 'dart:typed_data'; |
| |
| import 'package:_testing/validation_test_input_parser.dart' as parser; |
| import 'package:mojo/bindings.dart'; |
| import 'package:mojo/core.dart'; |
| import 'package:mojom/mojo/test/validation_test_interfaces.mojom.dart'; |
| |
| class ConformanceTestInterfaceImpl implements ConformanceTestInterface { |
| ConformanceTestInterfaceStub _stub; |
| Completer _completer; |
| |
| ConformanceTestInterfaceImpl( |
| this._completer, MojoMessagePipeEndpoint endpoint) { |
| _stub = new ConformanceTestInterfaceStub.fromEndpoint(endpoint, this); |
| } |
| |
| void _complete() => _completer.complete(null); |
| |
| method0(double param0) => _complete(); |
| method1(StructA param0) => _complete(); |
| method2(StructB param0, StructA param1) => _complete(); |
| method3(List<bool> param0) => _complete(); |
| method4(StructC param0, List<int> param1) => _complete(); |
| method5(StructE param0, MojoDataPipeProducer param1) { |
| param1.handle.close(); |
| param0.dataPipeConsumer.handle.close(); |
| param0.structD.messagePipes.forEach((h) => h.close()); |
| _complete(); |
| } |
| method6(List<List<int>> param0) => _complete(); |
| method7(StructF param0, List<List<int>> param1) => _complete(); |
| method8(List<List<String>> param0) => _complete(); |
| method9(List<List<MojoHandle>> param0) { |
| if (param0 != null) { |
| param0.forEach((l) => l.forEach((h) { |
| if (h != null) h.close(); |
| })); |
| } |
| _complete(); |
| } |
| method10(Map<String, int> param0) => _complete(); |
| method11(StructG param0) => _complete(); |
| method12(double param0, [Function responseFactory]) { |
| // If there are ever any passing method12 tests added, then this may need |
| // to change. |
| assert(responseFactory != null); |
| _complete(); |
| return new Future.value(responseFactory(0.0)); |
| } |
| method13(InterfaceAProxy param0, int param1, InterfaceAProxy param2) { |
| if (param0 != null) param0.close(immediate: true); |
| if (param2 != null) param2.close(immediate: true); |
| _complete(); |
| } |
| |
| Future close({bool immediate: false}) => _stub.close(immediate: immediate); |
| } |
| |
| Future runTest( |
| String name, parser.ValidationParseResult test, String expected) { |
| var handles = new List.generate( |
| test.numHandles, (_) => new MojoSharedBuffer.create(10).handle); |
| var pipe = new MojoMessagePipe(); |
| var completer = new Completer(); |
| var conformanceImpl; |
| |
| runZoned(() { |
| conformanceImpl = |
| new ConformanceTestInterfaceImpl(completer, pipe.endpoints[0]); |
| }, onError: (e, stackTrace) { |
| assert(e is MojoCodecError); |
| // TODO(zra): Make the error messages conform? |
| // assert(e == expected); |
| conformanceImpl.close(immediate: true); |
| pipe.endpoints[0].close(); |
| pipe.endpoints[1].close(); |
| handles.forEach((h) => h.close()); |
| completer.completeError(null); |
| }); |
| |
| var length = (test.data == null) ? 0 : test.data.lengthInBytes; |
| var r = pipe.endpoints[1].write(test.data, length, handles); |
| assert(r.isOk); |
| |
| return completer.future.then((_) { |
| assert(expected == "PASS"); |
| conformanceImpl.close(); |
| pipe.endpoints[0].close(); |
| pipe.endpoints[1].close(); |
| handles.forEach((h) => h.close()); |
| }, onError: (e) { |
| // Do nothing. |
| }); |
| } |
| |
| main(List args) async { |
| assert(args.length == 3); |
| List<String> testData = args[2]; |
| |
| // First test the parser. |
| parser.parserTests(); |
| |
| // See CollectTests in validation_unittest.cc for information on testData |
| // format. |
| for (var i = 0; i < testData.length; i += 3) { |
| var name = testData[i + 0]; |
| var data = testData[i + 1].trim(); |
| var expected = testData[i + 2].trim(); |
| try { |
| await runTest(name, parser.parse(data), expected); |
| print('$name PASSED.'); |
| } catch (e) { |
| print('$name FAILED: $e'); |
| } |
| } |
| // TODO(zra): Add integration tests when they no longer rely on Client= |
| assert(MojoHandle.reportLeakedHandles()); |
| } |