Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(373)

Side by Side Diff: media/mojo/clients/mojo_android_overlay_unittest.cc

Issue 2688193002: Mojo framework for AndroidOverlay. (Closed)
Patch Set: fixed mojo manifest bug introduced by rebase Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « media/mojo/clients/mojo_android_overlay_factory.cc ('k') | media/mojo/interfaces/BUILD.gn » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include <memory>
6
7 #include "base/bind.h"
8 #include "base/macros.h"
9 #include "base/memory/ptr_util.h"
10 #include "base/message_loop/message_loop.h"
11 #include "base/run_loop.h"
12 #include "media/base/mock_filters.h"
13 #include "media/mojo/clients/mojo_android_overlay.h"
14 #include "mojo/public/cpp/bindings/interface_request.h"
15 #include "mojo/public/cpp/bindings/strong_binding.h"
16 #include "services/service_manager/public/interfaces/interface_provider.mojom.h"
17
18 #include "testing/gtest/include/gtest/gtest.h"
19
20 using ::testing::_;
21 using ::testing::StrictMock;
22
23 namespace media {
24
25 class MockAndroidOverlay : public StrictMock<mojom::AndroidOverlay> {
26 public:
27 MOCK_METHOD1(ScheduleLayout, void(const gfx::Rect& rect));
28 };
29
30 // Handy class with client-level callback mocks.
31 class ClientCallbacks {
32 public:
33 virtual void OnReady() = 0;
34 virtual void OnFailed() = 0;
35 virtual void OnDestroyed() = 0;
36 };
37
38 class MockClientCallbacks : public StrictMock<ClientCallbacks> {
39 public:
40 MOCK_METHOD0(OnReady, void());
41 MOCK_METHOD0(OnFailed, void());
42 MOCK_METHOD0(OnDestroyed, void());
43 };
44
45 class MockAndroidOverlayProvider
46 : public StrictMock<mojom::AndroidOverlayProvider> {
47 public:
48 // These argument types lack default constructors, so gmock can't mock them.
49 void CreateOverlay(mojom::AndroidOverlayRequest overlay_request,
50 mojom::AndroidOverlayClientPtr client,
51 mojom::AndroidOverlayConfigPtr config) override {
52 overlay_request_ = std::move(overlay_request);
53 client_ = std::move(client);
54 config_ = std::move(config);
55 OverlayCreated();
56 }
57
58 MOCK_METHOD0(OverlayCreated, void(void));
59
60 mojom::AndroidOverlayRequest overlay_request_;
61 mojom::AndroidOverlayClientPtr client_;
62 mojom::AndroidOverlayConfigPtr config_;
63 };
64
65 // When the overlay client needs the provider interface, it'll ask us.
66 class MockInterfaceProvider
67 : public StrictMock<service_manager::mojom::InterfaceProvider> {
68 public:
69 // |provider| is the provider that we'll provide, provided that we're only
70 // asked to provide it once. Savvy?
71 MockInterfaceProvider(mojom::AndroidOverlayProvider& provider)
72 : provider_binding_(&provider) {}
73
74 // We can't mock GetInterface directly because of |handle|'s deleted ctor.
75 MOCK_METHOD1(InterfaceGotten, void(const std::string&));
76
77 void GetInterface(const std::string& name,
78 mojo::ScopedMessagePipeHandle handle) override {
79 // Let the mock know.
80 InterfaceGotten(name);
81
82 // Actually do the work.
83 provider_binding_.Bind(
84 mojo::MakeRequest<mojom::AndroidOverlayProvider>(std::move(handle)));
85 }
86
87 mojo::Binding<mojom::AndroidOverlayProvider> provider_binding_;
88 };
89
90 class MojoAndroidOverlayTest : public ::testing::Test {
91 public:
92 MojoAndroidOverlayTest()
93 : overlay_binding_(&mock_overlay_), interface_provider_(mock_provider_) {}
94
95 ~MojoAndroidOverlayTest() override {}
96
97 void SetUp() override {
98 // Set up default config.
99 config_.routing_token = base::UnguessableToken::Create();
100 config_.rect = gfx::Rect(100, 200, 300, 400);
101 config_.ready_cb = base::Bind(&MockClientCallbacks::OnReady,
102 base::Unretained(&callbacks_));
103 config_.failed_cb = base::Bind(&MockClientCallbacks::OnFailed,
104 base::Unretained(&callbacks_));
105 config_.destroyed_cb = base::Bind(&MockClientCallbacks::OnDestroyed,
106 base::Unretained(&callbacks_));
107 }
108
109 void TearDown() override {
110 overlay_client_.reset();
111 base::RunLoop().RunUntilIdle();
112 }
113
114 // Create an overlay in |overlay_client_| using the current config, but do
115 // not bind anything to |overlay_request_| yet.
116 void CreateOverlay() {
117 EXPECT_CALL(interface_provider_,
118 InterfaceGotten(mojom::AndroidOverlayProvider::Name_))
119 .Times(1);
120 EXPECT_CALL(mock_provider_, OverlayCreated());
121
122 overlay_client_.reset(
123 new MojoAndroidOverlay(&interface_provider_, config_));
124 base::RunLoop().RunUntilIdle();
125 }
126
127 // Create an overlay, then provide it with |mock_overlay_|.
128 void CreateAndInitializeOverlay() {
129 CreateOverlay();
130
131 // Bind an overlay to the request.
132 overlay_binding_.Bind(std::move(mock_provider_.overlay_request_));
133 base::RunLoop().RunUntilIdle();
134 }
135
136 // Notify |overlay_client_| that the surface is ready.
137 void CreateSurface() {
138 EXPECT_CALL(callbacks_, OnReady());
139 const int surface_key = 123;
140 mock_provider_.client_->OnSurfaceReady(surface_key);
141 base::RunLoop().RunUntilIdle();
142 }
143
144 // Destroy the overlay. This includes onSurfaceDestroyed cases.
145 void DestroyOverlay() {
146 mock_provider_.client_->OnDestroyed();
147 base::RunLoop().RunUntilIdle();
148 }
149
150 // Mojo stuff.
151 base::MessageLoop loop;
152
153 // The mock provider that |overlay_client_| will talk to.
154 // |interface_provider_| will bind it.
155 MockAndroidOverlayProvider mock_provider_;
156
157 // The mock overlay impl that |mock_provider_| will provide.
158 MockAndroidOverlay mock_overlay_;
159 mojo::Binding<mojom::AndroidOverlay> overlay_binding_;
160
161 // The InterfaceProvider impl that will provide |mock_provider_| to the
162 // overlay client |overlay_client_|.
163 MockInterfaceProvider interface_provider_;
164
165 // The client under test.
166 std::unique_ptr<AndroidOverlay> overlay_client_;
167
168 // Inital config for |CreateOverlay|.
169 // Set to sane values, but feel free to modify before CreateOverlay().
170 AndroidOverlay::Config config_;
171 MockClientCallbacks callbacks_;
172 };
173
174 // Verify basic create => init => ready => destroyed.
175 TEST_F(MojoAndroidOverlayTest, CreateInitReadyDestroy) {
176 CreateAndInitializeOverlay();
177 CreateSurface();
178 EXPECT_CALL(callbacks_, OnDestroyed());
179 DestroyOverlay();
180 }
181
182 // Verify that initialization failure results in an onDestroyed callback.
183 TEST_F(MojoAndroidOverlayTest, InitFailure) {
184 CreateOverlay();
185 EXPECT_CALL(callbacks_, OnFailed());
186 DestroyOverlay();
187 }
188
189 // Verify that we can destroy the overlay before providing a surface.
190 TEST_F(MojoAndroidOverlayTest, CreateInitDestroy) {
191 CreateAndInitializeOverlay();
192 EXPECT_CALL(callbacks_, OnFailed());
193 DestroyOverlay();
194 }
195
196 // Test that layouts happen.
197 TEST_F(MojoAndroidOverlayTest, LayoutOverlay) {
198 CreateAndInitializeOverlay();
199 CreateSurface();
200
201 gfx::Rect new_layout(5, 6, 7, 8);
202 EXPECT_CALL(mock_overlay_, ScheduleLayout(new_layout));
203 overlay_client_->ScheduleLayout(new_layout);
204 }
205
206 // Test that layouts are ignored before the client is notified about a surface.
207 TEST_F(MojoAndroidOverlayTest, LayoutBeforeSurfaceIsIgnored) {
208 CreateAndInitializeOverlay();
209
210 gfx::Rect new_layout(5, 6, 7, 8);
211 EXPECT_CALL(mock_overlay_, ScheduleLayout(_)).Times(0);
212 overlay_client_->ScheduleLayout(new_layout);
213 }
214
215 } // namespace media
OLDNEW
« no previous file with comments | « media/mojo/clients/mojo_android_overlay_factory.cc ('k') | media/mojo/interfaces/BUILD.gn » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698