// Copyright 2013 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/message_pump/message_pump_mojo.h" #include "base/message_loop/message_loop_test.h" #include "base/run_loop.h" #include "mojo/message_pump/message_pump_mojo_handler.h" #include "mojo/public/cpp/system/core.h" #include "testing/gtest/include/gtest/gtest.h" namespace mojo { namespace common { namespace test { scoped_ptr CreateMojoMessagePump() { return scoped_ptr(new MessagePumpMojo()); } RUN_MESSAGE_LOOP_TESTS(Mojo, &CreateMojoMessagePump); class CountingMojoHandler : public MessagePumpMojoHandler { public: CountingMojoHandler() : success_count_(0), error_count_(0) {} void OnHandleReady(const Handle& handle) override { ReadMessageRaw(static_cast(handle), NULL, NULL, NULL, NULL, MOJO_READ_MESSAGE_FLAG_NONE); ++success_count_; } void OnHandleError(const Handle& handle, MojoResult result) override { ++error_count_; } int success_count() { return success_count_; } int error_count() { return error_count_; } private: int success_count_; int error_count_; DISALLOW_COPY_AND_ASSIGN(CountingMojoHandler); }; class CountingObserver : public MessagePumpMojo::Observer { public: void WillSignalHandler() override { will_signal_handler_count++; } void DidSignalHandler() override { did_signal_handler_count++; } int will_signal_handler_count = 0; int did_signal_handler_count = 0; }; TEST(MessagePumpMojo, RunUntilIdle) { base::MessageLoop message_loop(MessagePumpMojo::Create()); CountingMojoHandler handler; MessagePipe handles; MessagePumpMojo::current()->AddHandler(&handler, handles.handle0.get(), MOJO_HANDLE_SIGNAL_READABLE, base::TimeTicks()); WriteMessageRaw( handles.handle1.get(), NULL, 0, NULL, 0, MOJO_WRITE_MESSAGE_FLAG_NONE); WriteMessageRaw( handles.handle1.get(), NULL, 0, NULL, 0, MOJO_WRITE_MESSAGE_FLAG_NONE); base::RunLoop run_loop; run_loop.RunUntilIdle(); EXPECT_EQ(2, handler.success_count()); } TEST(MessagePumpMojo, Observer) { base::MessageLoop message_loop(MessagePumpMojo::Create()); CountingObserver observer; MessagePumpMojo::current()->AddObserver(&observer); CountingMojoHandler handler; MessagePipe handles; MessagePumpMojo::current()->AddHandler(&handler, handles.handle0.get(), MOJO_HANDLE_SIGNAL_READABLE, base::TimeTicks()); WriteMessageRaw( handles.handle1.get(), NULL, 0, NULL, 0, MOJO_WRITE_MESSAGE_FLAG_NONE); base::RunLoop run_loop; run_loop.RunUntilIdle(); EXPECT_EQ(1, handler.success_count()); EXPECT_EQ(1, observer.will_signal_handler_count); EXPECT_EQ(1, observer.did_signal_handler_count); MessagePumpMojo::current()->RemoveObserver(&observer); WriteMessageRaw( handles.handle1.get(), NULL, 0, NULL, 0, MOJO_WRITE_MESSAGE_FLAG_NONE); base::RunLoop run_loop2; run_loop2.RunUntilIdle(); EXPECT_EQ(2, handler.success_count()); EXPECT_EQ(1, observer.will_signal_handler_count); EXPECT_EQ(1, observer.did_signal_handler_count); } TEST(MessagePumpMojo, UnregisterAfterDeadline) { base::MessageLoop message_loop(MessagePumpMojo::Create()); CountingMojoHandler handler; MessagePipe handles; MessagePumpMojo::current()->AddHandler( &handler, handles.handle0.get(), MOJO_HANDLE_SIGNAL_READABLE, base::TimeTicks::Now() - base::TimeDelta::FromSeconds(1)); for (int i = 0; i < 2; ++i) { base::RunLoop run_loop; run_loop.RunUntilIdle(); } EXPECT_EQ(1, handler.error_count()); } } // namespace test } // namespace common } // namespace mojo