| // 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. |
| |
| #include "blimp/client/session/render_widget_feature.h" |
| |
| #include "base/logging.h" |
| #include "base/memory/scoped_ptr.h" |
| #include "blimp/common/create_blimp_message.h" |
| #include "blimp/common/proto/blimp_message.pb.h" |
| #include "blimp/common/proto/compositor.pb.h" |
| #include "blimp/common/proto/render_widget.pb.h" |
| #include "blimp/net/test_common.h" |
| #include "cc/proto/compositor_message.pb.h" |
| #include "net/base/net_errors.h" |
| #include "testing/gmock/include/gmock/gmock.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| |
| using testing::_; |
| |
| namespace blimp { |
| |
| namespace { |
| |
| class MockRenderWidgetFeatureDelegate |
| : public RenderWidgetFeature::RenderWidgetFeatureDelegate { |
| public: |
| // RenderWidgetFeatureDelegate implementation. |
| void OnRenderWidgetInitialized() override { |
| MockableOnRenderWidgetInitialized(); |
| } |
| void OnCompositorMessageReceived( |
| scoped_ptr<cc::proto::CompositorMessage> message) override { |
| MockableOnCompositorMessageReceived(*message); |
| } |
| |
| MOCK_METHOD0(MockableOnRenderWidgetInitialized, void()); |
| MOCK_METHOD1(MockableOnCompositorMessageReceived, |
| void(const cc::proto::CompositorMessage& message)); |
| }; |
| |
| MATCHER_P2(CompMsgEquals, tab_id, rw_id, "") { |
| return arg.compositor().render_widget_id() == rw_id && |
| arg.target_tab_id() == tab_id; |
| } |
| |
| void SendRenderWidgetMessage(BlimpMessageProcessor* processor, |
| int tab_id, |
| uint32_t rw_id) { |
| RenderWidgetMessage* details; |
| scoped_ptr<BlimpMessage> message = CreateBlimpMessage(&details, tab_id); |
| details->set_type(RenderWidgetMessage::INITIALIZE); |
| details->set_render_widget_id(rw_id); |
| processor->ProcessMessage(std::move(message), net::CompletionCallback()); |
| } |
| |
| void SendCompositorMessage(BlimpMessageProcessor* processor, |
| int tab_id, |
| uint32_t rw_id) { |
| CompositorMessage* details; |
| scoped_ptr<BlimpMessage> message = CreateBlimpMessage(&details, tab_id); |
| details->set_render_widget_id(rw_id); |
| processor->ProcessMessage(std::move(message), net::CompletionCallback()); |
| } |
| |
| } // namespace |
| |
| class RenderWidgetFeatureTest : public testing::Test { |
| public: |
| RenderWidgetFeatureTest() |
| : out_input_processor_(nullptr), out_compositor_processor_(nullptr) {} |
| |
| void SetUp() override { |
| out_input_processor_ = new MockBlimpMessageProcessor(); |
| out_compositor_processor_ = new MockBlimpMessageProcessor(); |
| feature_.set_outgoing_input_message_processor( |
| make_scoped_ptr(out_input_processor_)); |
| feature_.set_outgoing_compositor_message_processor( |
| make_scoped_ptr(out_compositor_processor_)); |
| |
| feature_.SetDelegate(1, &delegate1_); |
| feature_.SetDelegate(2, &delegate2_); |
| } |
| |
| protected: |
| // These are raw pointers to classes that are owned by the |
| // RenderWidgetFeature. |
| MockBlimpMessageProcessor* out_input_processor_; |
| MockBlimpMessageProcessor* out_compositor_processor_; |
| |
| MockRenderWidgetFeatureDelegate delegate1_; |
| MockRenderWidgetFeatureDelegate delegate2_; |
| |
| RenderWidgetFeature feature_; |
| }; |
| |
| TEST_F(RenderWidgetFeatureTest, DelegateCallsOK) { |
| EXPECT_CALL(delegate1_, MockableOnRenderWidgetInitialized()).Times(1); |
| SendRenderWidgetMessage(&feature_, 1, 1U); |
| |
| EXPECT_CALL(delegate1_, MockableOnCompositorMessageReceived(_)).Times(1); |
| SendCompositorMessage(&feature_, 1, 1U); |
| |
| EXPECT_CALL(delegate2_, MockableOnRenderWidgetInitialized()).Times(1); |
| SendRenderWidgetMessage(&feature_, 2, 2U); |
| |
| EXPECT_CALL(delegate2_, MockableOnCompositorMessageReceived(_)).Times(1); |
| SendCompositorMessage(&feature_, 2, 2U); |
| } |
| |
| TEST_F(RenderWidgetFeatureTest, RepliesHaveCorrectRenderWidgetId) { |
| SendRenderWidgetMessage(&feature_, 1, 2U); |
| SendRenderWidgetMessage(&feature_, 2, 1U); |
| |
| EXPECT_CALL(*out_compositor_processor_, |
| MockableProcessMessage(CompMsgEquals(1, 2U), _)) |
| .Times(1); |
| feature_.SendCompositorMessage(1, cc::proto::CompositorMessage()); |
| |
| SendRenderWidgetMessage(&feature_, 1, 3U); |
| |
| EXPECT_CALL(*out_compositor_processor_, |
| MockableProcessMessage(CompMsgEquals(1, 3U), _)) |
| .Times(1); |
| feature_.SendCompositorMessage(1, cc::proto::CompositorMessage()); |
| |
| EXPECT_CALL(*out_compositor_processor_, |
| MockableProcessMessage(CompMsgEquals(2, 1U), _)) |
| .Times(1); |
| feature_.SendCompositorMessage(2, cc::proto::CompositorMessage()); |
| } |
| |
| } // namespace blimp |