blob: 0bfbcf738ca05a2a298ca570ae861bec4484e9cb [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.
#include "blimp/client/feature/render_widget_feature.h"
#include <memory>
#include "base/logging.h"
#include "base/memory/ptr_util.h"
#include "blimp/client/feature/mock_render_widget_feature_delegate.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 "net/base/test_completion_callback.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
using testing::_;
using testing::InSequence;
using testing::Sequence;
namespace blimp {
namespace client {
namespace {
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,
int rw_id,
RenderWidgetMessage::Type message_type) {
RenderWidgetMessage* details;
std::unique_ptr<BlimpMessage> message = CreateBlimpMessage(&details, tab_id);
details->set_type(message_type);
details->set_render_widget_id(rw_id);
net::TestCompletionCallback cb;
processor->ProcessMessage(std::move(message), cb.callback());
EXPECT_EQ(net::OK, cb.WaitForResult());
}
void SendCompositorMessage(BlimpMessageProcessor* processor,
int tab_id,
int rw_id) {
CompositorMessage* details;
std::unique_ptr<BlimpMessage> message = CreateBlimpMessage(&details, tab_id);
details->set_render_widget_id(rw_id);
net::TestCompletionCallback cb;
processor->ProcessMessage(std::move(message), cb.callback());
EXPECT_EQ(net::OK, cb.WaitForResult());
}
} // 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(
base::WrapUnique(out_input_processor_));
feature_.set_outgoing_compositor_message_processor(
base::WrapUnique(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_, OnRenderWidgetCreated(1));
EXPECT_CALL(delegate1_, MockableOnCompositorMessageReceived(1, _));
EXPECT_CALL(delegate1_, OnRenderWidgetInitialized(1));
EXPECT_CALL(delegate2_, OnRenderWidgetCreated(2));
EXPECT_CALL(delegate1_, OnRenderWidgetDeleted(1));
SendRenderWidgetMessage(&feature_, 1, 1, RenderWidgetMessage::CREATED);
SendCompositorMessage(&feature_, 1, 1);
SendRenderWidgetMessage(&feature_, 1, 1, RenderWidgetMessage::INITIALIZE);
SendRenderWidgetMessage(&feature_, 2, 2, RenderWidgetMessage::CREATED);
SendRenderWidgetMessage(&feature_, 1, 1, RenderWidgetMessage::DELETED);
}
TEST_F(RenderWidgetFeatureTest, RepliesHaveCorrectRenderWidgetId) {
InSequence sequence;
EXPECT_CALL(*out_compositor_processor_,
MockableProcessMessage(CompMsgEquals(1, 2), _));
EXPECT_CALL(*out_compositor_processor_,
MockableProcessMessage(CompMsgEquals(1, 2), _));
EXPECT_CALL(*out_compositor_processor_,
MockableProcessMessage(CompMsgEquals(2, 3), _));
SendRenderWidgetMessage(&feature_, 1, 2, RenderWidgetMessage::CREATED);
feature_.SendCompositorMessage(1, 2, cc::proto::CompositorMessage());
SendRenderWidgetMessage(&feature_, 1, 2, RenderWidgetMessage::INITIALIZE);
feature_.SendCompositorMessage(1, 2, cc::proto::CompositorMessage());
SendRenderWidgetMessage(&feature_, 2, 3, RenderWidgetMessage::CREATED);
feature_.SendCompositorMessage(2, 3, cc::proto::CompositorMessage());
}
} // namespace client
} // namespace blimp