blob: a673abeecc65874f3a53564ec125c1cde978c1b5 [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.
library pingpong_apptests;
import 'dart:async';
import 'package:mojo_apptest/apptest.dart';
import 'package:mojo/application.dart';
import 'package:mojo/bindings.dart';
import 'package:mojo/core.dart';
import 'package:_mojo_for_test_only/test/pingpong_service.mojom.dart';
class _TestingPingPongClient extends PingPongClient {
final PingPongClientStub stub;
Completer _completer;
_TestingPingPongClient.unbound() : stub = new PingPongClientStub.unbound() {
stub.impl = this;
}
waitForPong() async {
_completer = new Completer();
return _completer.future;
}
void pong(int pongValue) {
_completer.complete(pongValue);
_completer = null;
}
}
pingpongApptests(Application application, String url) {
group('Ping-Pong Service Apptests', () {
// Verify that "pingpong.dart" implements the PingPongService interface
// and sends responses to our client.
test('Ping Service To Pong Client', () async {
var pingPongServiceProxy = new PingPongServiceProxy.unbound();
pingPongServiceProxy.ctrl.errorFuture.then((e) => fail('$e'));
application.connectToService(
"mojo:dart_pingpong", pingPongServiceProxy);
var pingPongClient = new _TestingPingPongClient.unbound();
pingPongServiceProxy.setClient(pingPongClient.stub);
pingPongServiceProxy.ping(1);
var pongValue = await pingPongClient.waitForPong();
expect(pongValue, equals(2));
pingPongServiceProxy.ping(100);
pongValue = await pingPongClient.waitForPong();
expect(pongValue, equals(101));
await pingPongClient.stub.close();
await pingPongServiceProxy.close();
});
// Verify that "pingpong.dart" can connect to "pingpong_target.dart", act as
// its client, and return a Future that only resolves after the
// target.ping() => client.pong() methods have executed 9 times.
test('Ping Target URL', () async {
var pingPongServiceProxy = new PingPongServiceProxy.unbound();
pingPongServiceProxy.ctrl.errorFuture.then((e) => fail('$e'));
application.connectToService(
"mojo:dart_pingpong", pingPongServiceProxy);
var r = await pingPongServiceProxy.pingTargetUrl(
"mojo:dart_pingpong_target", 9);
expect(r.ok, equals(true));
await pingPongServiceProxy.close();
});
// Same as the previous test except that instead of providing the
// pingpong_target.dart URL, we provide a connection to its PingPongService.
test('Ping Target Service', () async {
var pingPongServiceProxy = new PingPongServiceProxy.unbound();
pingPongServiceProxy.ctrl.errorFuture.then((e) => fail('$e'));
application.connectToService(
"mojo:dart_pingpong", pingPongServiceProxy);
var targetServiceProxy = new PingPongServiceProxy.unbound();
targetServiceProxy.ctrl.errorFuture.then((e) => fail('$e'));
application.connectToService(
"mojo:dart_pingpong_target", targetServiceProxy);
var r = await pingPongServiceProxy.pingTargetService(
targetServiceProxy, 9);
expect(r.ok, equals(true));
// This side no longer has access to the pipe.
expect(targetServiceProxy.ctrl.isOpen, equals(false));
expect(targetServiceProxy.ctrl.isBound, equals(false));
await pingPongServiceProxy.close();
});
// Verify that Dart can implement an interface "request" parameter.
test('Get Target Service', () async {
var pingPongServiceProxy = new PingPongServiceProxy.unbound();
pingPongServiceProxy.ctrl.errorFuture.then((e) => fail('$e'));
application.connectToService(
"mojo:dart_pingpong", pingPongServiceProxy);
var targetServiceProxy = new PingPongServiceProxy.unbound();
targetServiceProxy.ctrl.errorFuture.then((e) => fail('$e'));
pingPongServiceProxy.getPingPongService(targetServiceProxy);
var pingPongClient = new _TestingPingPongClient.unbound();
targetServiceProxy.setClient(pingPongClient.stub);
targetServiceProxy.ping(1);
var pongValue = await pingPongClient.waitForPong();
expect(pongValue, equals(2));
targetServiceProxy.ping(100);
pongValue = await pingPongClient.waitForPong();
expect(pongValue, equals(101));
await pingPongClient.stub.close();
await targetServiceProxy.close();
await pingPongServiceProxy.close();
});
// Verify that Dart can implement an interface "request" parameter that
// isn't hooked up to an actual service implementation until after some
// delay.
test('Get Target Service Delayed', () async {
var pingPongServiceProxy = new PingPongServiceProxy.unbound();
pingPongServiceProxy.ctrl.errorFuture.then((e) => fail('$e'));
application.connectToService(
"mojo:dart_pingpong", pingPongServiceProxy);
var targetServiceProxy = new PingPongServiceProxy.unbound();
targetServiceProxy.ctrl.errorFuture.then((e) => fail('$e'));
pingPongServiceProxy.getPingPongServiceDelayed(targetServiceProxy);
var pingPongClient = new _TestingPingPongClient.unbound();
targetServiceProxy.setClient(pingPongClient.stub);
targetServiceProxy.ping(1);
var pongValue = await pingPongClient.waitForPong();
expect(pongValue, equals(2));
targetServiceProxy.ping(100);
pongValue = await pingPongClient.waitForPong();
expect(pongValue, equals(101));
await pingPongClient.stub.close();
await targetServiceProxy.close();
await pingPongServiceProxy.close();
});
});
}