blob: d4ab222535277005ca1d0195c096fba2e5bdbb9f [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:mojo/dart/testing/validation_test_input_parser.dart' as parser;
import 'package:mojo/public/dart/bindings.dart';
import 'package:mojo/public/dart/core.dart';
import 'package:mojo/public/interfaces/bindings/tests/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) => _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) => _complete();
method10(Map<String, int> param0) => _complete();
method11(StructG param0) => _complete();
Future close({bool immediate: false}) => _stub.close(immediate: immediate);
}
parser.ValidationParseResult readAndParseTest(String test) {
List<int> data = builtin.readSync("${test}.data");
String input = new Utf8Decoder().convert(data).trim();
return parser.parse(input);
}
String expectedResult(String test) {
List<int> data = builtin.readSync("${test}.expected");
return new Utf8Decoder().convert(data).trim();
}
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].handle.close();
handles.forEach((h) => h.close());
});
var length = (test.data == null) ? 0 : test.data.lengthInBytes;
var r = pipe.endpoints[1].write(test.data, length, handles);
assert(r.isOk);
completer.future.then((_) {
assert(expected == "PASS");
conformanceImpl.close();
pipe.endpoints[0].handle.close();
handles.forEach((h) => h.close());
});
}
Iterable<String> getTestFiles(String path, String prefix) => builtin
.enumerateFiles(path)
.where((s) => s.startsWith(prefix) && s.endsWith(".data"))
.map((s) => s.replaceFirst('.data', ''));
main(List args) {
int handle = args[0];
String path = args[1];
// First test the parser.
parser.parserTests();
// Then run the conformance tests.
getTestFiles(path, "$path/conformance_").forEach((test) {
runTest(test, readAndParseTest(test), expectedResult(test));
});
// TODO(zra): Add integration tests when they no longer rely on Client=.
}