blob: c5a285c03476935bc49e6389356c69ab29ea95b8 [file] [log] [blame]
// Copyright 2014 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.
#include "base/files/file_path.h"
#include "base/logging.h"
#include "base/path_service.h"
#include "mojo/public/cpp/application/application_impl.h"
#include "mojo/public/cpp/application/application_test_base.h"
#include "mojo/public/cpp/bindings/strong_binding.h"
#include "services/dart/test/pingpong_service.mojom.h"
namespace dart {
namespace {
class PingPongClientImpl : public PingPongClient {
public:
PingPongClientImpl(mojo::InterfaceRequest<PingPongClient> request)
: last_pong_value_(0), binding_(this, request.Pass()) {}
~PingPongClientImpl() override {}
int16_t WaitForPongValue() {
if (!binding_.WaitForIncomingMethodCall())
return 0;
return last_pong_value_;
}
private:
// PingPongClient overrides.
void Pong(uint16_t pong_value) override {
last_pong_value_ = pong_value;
}
int16_t last_pong_value_;
mojo::StrongBinding<PingPongClient> binding_;
MOJO_DISALLOW_COPY_AND_ASSIGN(PingPongClientImpl);
};
class DartPingPongTest : public mojo::test::ApplicationTestBase {
public:
DartPingPongTest() : mojo::test::ApplicationTestBase() {}
~DartPingPongTest() override {}
protected:
// ApplicationTestBase:
void SetUp() override {
ApplicationTestBase::SetUp();
application_impl()->ConnectToService("mojo:dart_pingpong",
&pingpong_service_);
}
PingPongServicePtr pingpong_service_;
private:
MOJO_DISALLOW_COPY_AND_ASSIGN(DartPingPongTest);
};
struct PingTargetCallback {
explicit PingTargetCallback(bool *b) : value(b) {}
void Run(bool callback_value) const {
*value = callback_value;
}
bool *value;
};
// Verify that "pingpong.dart" implements the PingPongService interface
// and sends responses to our client.
TEST_F(DartPingPongTest, PingServiceToPongClient) {
PingPongClientPtr client;
auto pingpong_client = new PingPongClientImpl(GetProxy(&client));
pingpong_service_->SetClient(client.Pass());
pingpong_service_->Ping(1);
EXPECT_EQ(2, pingpong_client->WaitForPongValue());
pingpong_service_->Ping(100);
EXPECT_EQ(101, pingpong_client->WaitForPongValue());
pingpong_service_->Quit();
}
// 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_F(DartPingPongTest, PingTargetURL) {
bool returned_value = false;
PingTargetCallback callback(&returned_value);
pingpong_service_->PingTargetURL("mojo:dart_pingpong_target", 9, callback);
EXPECT_TRUE(pingpong_service_.WaitForIncomingMethodCall());
EXPECT_TRUE(returned_value);
pingpong_service_->Quit();
}
// Same as the previous test except that instead of providing the
// pingpong_target.dart URL, we provide a connection to its PingPongService.
TEST_F(DartPingPongTest, PingTargetService) {
PingPongServicePtr target;
application_impl()->ConnectToService("mojo:dart_pingpong_target", &target);
bool returned_value = false;
PingTargetCallback callback(&returned_value);
pingpong_service_->PingTargetService(target.Pass(), 9, callback);
EXPECT_TRUE(pingpong_service_.WaitForIncomingMethodCall());
EXPECT_TRUE(returned_value);
pingpong_service_->Quit();
}
// Verify that Dart can implement an interface "request" parameter.
TEST_F(DartPingPongTest, GetTargetService) {
PingPongServicePtr target;
PingPongClientPtr client;
auto pingpong_client = new PingPongClientImpl(GetProxy(&client));
pingpong_service_->GetPingPongService(GetProxy(&target));
target->SetClient(client.Pass());
target->Ping(1);
EXPECT_EQ(2, pingpong_client->WaitForPongValue());
target->Ping(100);
EXPECT_EQ(101, pingpong_client->WaitForPongValue());
target->Quit();
pingpong_service_->Quit();
}
} // namespace
} // namespace dart