普通文本  |  95行  |  2.67 KB

// 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 "mojo/examples/apptest/example_client_application.h"
#include "mojo/examples/apptest/example_client_impl.h"
#include "mojo/examples/apptest/example_service.mojom.h"
#include "mojo/public/c/system/main.h"
#include "mojo/public/cpp/application/application_delegate.h"
#include "mojo/public/cpp/application/application_impl.h"
#include "mojo/public/cpp/bindings/callback.h"
#include "mojo/public/cpp/environment/environment.h"
#include "mojo/public/cpp/system/macros.h"
#include "mojo/public/cpp/utility/run_loop.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace {

// TODO(msw): Remove this once we can get ApplicationImpl from TLS.
mojo::ApplicationImpl* g_application_impl_hack = NULL;

}  // namespace

namespace mojo {

namespace {

class ExampleServiceTest : public testing::Test {
 public:
  ExampleServiceTest() {
    g_application_impl_hack->ConnectToService("mojo:mojo_example_service",
                                              &example_service_);
    example_service_.set_client(&example_client_);
  }

  virtual ~ExampleServiceTest() MOJO_OVERRIDE {}

 protected:
  ExampleServicePtr example_service_;
  ExampleClientImpl example_client_;

 private:
  MOJO_DISALLOW_COPY_AND_ASSIGN(ExampleServiceTest);
};

TEST_F(ExampleServiceTest, Ping) {
  EXPECT_EQ(0, example_client_.last_pong_value());
  example_service_->Ping(1);
  RunLoop::current()->Run();
  EXPECT_EQ(1, example_client_.last_pong_value());
}

template <typename T>
struct SetAndQuit : public Callback<void()>::Runnable {
  SetAndQuit(T* val, T result) : val_(val), result_(result) {}
  virtual ~SetAndQuit() {}
  virtual void Run() const MOJO_OVERRIDE{
    *val_ = result_;
    RunLoop::current()->Quit();
  }
  T* val_;
  T result_;
};

TEST_F(ExampleServiceTest, RunCallback) {
  bool was_run = false;
  example_service_->RunCallback(SetAndQuit<bool>(&was_run, true));
  RunLoop::current()->Run();
  EXPECT_TRUE(was_run);
}

}  // namespace

}  // namespace mojo

MojoResult MojoMain(MojoHandle shell_handle) {
  mojo::Environment env;
  mojo::RunLoop loop;

  // TODO(tim): Perhaps the delegate should be the thing that provides
  // the ExampleServiceTest with the ApplicationImpl somehow.
  mojo::ApplicationDelegate* delegate = new mojo::ExampleClientApplication();
  mojo::ApplicationImpl app(delegate, shell_handle);
  g_application_impl_hack = &app;

  // TODO(msw): Get actual commandline arguments.
  int argc = 0;
  char** argv = NULL;
  testing::InitGoogleTest(&argc, argv);
  mojo_ignore_result(RUN_ALL_TESTS());

  delete delegate;
  return MOJO_RESULT_OK;
}