blob: 20ba8b4bf9d10753739a36441f4a0959708eaba7 [file] [log] [blame]
// 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());
}