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

Side by Side Diff: extensions/browser/api/media_perception_private/media_perception_api_manager_unittest.cc

Issue 2858353002: MediaPerceptionPrivate API impl and testing. (Closed)
Patch Set: Addressed reviewer comments. Created 3 years, 7 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
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 "extensions/browser/api/media_perception_private/media_perception_api_m anager.h"
6
7 #include <queue>
8
9 #include "base/bind.h"
10 #include "base/memory/ptr_util.h"
11 #include "base/run_loop.h"
12 #include "chromeos/dbus/dbus_thread_manager.h"
13 #include "chromeos/dbus/fake_media_analytics_client.h"
14 #include "chromeos/dbus/fake_upstart_client.h"
15 #include "chromeos/dbus/media_analytics_client.h"
16 #include "chromeos/dbus/upstart_client.h"
17 #include "content/public/test/test_browser_context.h"
18 #include "content/public/test/test_browser_thread_bundle.h"
19 #include "testing/gtest/include/gtest/gtest.h"
20
21 namespace media_perception = extensions::api::media_perception_private;
22
23 namespace chromeos {
24 namespace {
25
26 class TestUpstartClient : public FakeUpstartClient {
27 public:
28 TestUpstartClient();
29 ~TestUpstartClient() override;
30
31 // Overrides behavior to queue start requests.
32 void StartMediaAnalytics(const UpstartCallback& callback) override;
33
34 // Triggers the next queue'd start request to succeed or fail.
35 bool HandleNextUpstartRequest(bool should_succeed) {
36 if (pending_upstart_request_callbacks_.empty())
37 return false;
38
39 UpstartCallback callback = pending_upstart_request_callbacks_.front();
40 pending_upstart_request_callbacks_.pop();
41
42 if (!should_succeed) {
43 callback.Run(false);
44 return true;
45 }
46
47 FakeUpstartClient::StartMediaAnalytics(callback);
48 return true;
49 }
50
51 void set_enqueue_requests(bool enqueue_requests) {
52 enqueue_requests_ = enqueue_requests;
53 }
54
55 private:
56 std::queue<UpstartCallback> pending_upstart_request_callbacks_;
57
58 bool enqueue_requests_;
59
60 DISALLOW_COPY_AND_ASSIGN(TestUpstartClient);
61 };
62
63 TestUpstartClient::TestUpstartClient() : enqueue_requests_(false) {}
64
65 TestUpstartClient::~TestUpstartClient() {}
66
67 void TestUpstartClient::StartMediaAnalytics(const UpstartCallback& callback) {
68 pending_upstart_request_callbacks_.push(callback);
69 if (!enqueue_requests_) {
70 HandleNextUpstartRequest(true);
71 return;
72 }
73 }
74
75 } // namespace
76 } // namespace chromeos
77
78 namespace extensions {
79
80 using CallbackStatus = MediaPerceptionAPIManager::CallbackStatus;
81
82 namespace {
83
84 void RecordStatusAndRunClosure(base::Closure quit_run_loop,
85 CallbackStatus* status,
86 CallbackStatus result_status,
87 media_perception::State result_state) {
88 *status = result_status;
89 quit_run_loop.Run();
90 }
91
92 CallbackStatus SetStateAndWaitForResponse(
93 MediaPerceptionAPIManager* manager,
94 const media_perception::State& state) {
95 base::RunLoop run_loop;
96 CallbackStatus status;
97 manager->SetState(state, base::Bind(&RecordStatusAndRunClosure,
98 run_loop.QuitClosure(), &status));
99 run_loop.Run();
100 return status;
101 }
102
103 CallbackStatus GetStateAndWaitForResponse(MediaPerceptionAPIManager* manager) {
104 base::RunLoop run_loop;
105 CallbackStatus status;
106 manager->GetState(
107 base::Bind(&RecordStatusAndRunClosure, run_loop.QuitClosure(), &status));
108 run_loop.Run();
109 return status;
110 }
111
112 } // namespace
113
114 class MediaPerceptionAPIManagerTest : public testing::Test {
115 public:
116 MediaPerceptionAPIManagerTest()
117 : thread_bundle_(content::TestBrowserThreadBundle::DEFAULT) {}
118
119 void SetUp() override {
120 std::unique_ptr<chromeos::DBusThreadManagerSetter> dbus_setter =
121 chromeos::DBusThreadManager::GetSetterForTesting();
122 auto media_analytics_client =
123 base::MakeUnique<chromeos::FakeMediaAnalyticsClient>();
124 media_analytics_client_ = media_analytics_client.get();
125 dbus_setter->SetMediaAnalyticsClient(std::move(media_analytics_client));
126
127 auto upstart_client = base::MakeUnique<chromeos::TestUpstartClient>();
128 upstart_client_ = upstart_client.get();
129 dbus_setter->SetUpstartClient(std::move(upstart_client));
130
131 manager_ = base::MakeUnique<MediaPerceptionAPIManager>(&browser_context_);
132 }
133
134 void TearDown() override {
135 // Need to make sure that the MediaPerceptionAPIManager is destructed before
136 // the DbusThreadManager.
137 manager_.reset();
138 chromeos::DBusThreadManager::Shutdown();
139 }
140
141 std::unique_ptr<MediaPerceptionAPIManager> manager_;
142
143 // Ownership of both is passed on to chromeos::DbusThreadManager.
144 chromeos::FakeMediaAnalyticsClient* media_analytics_client_;
145 chromeos::TestUpstartClient* upstart_client_;
146
147 private:
148 content::TestBrowserContext browser_context_;
149 content::TestBrowserThreadBundle thread_bundle_;
150
151 DISALLOW_COPY_AND_ASSIGN(MediaPerceptionAPIManagerTest);
152 };
153
154 TEST_F(MediaPerceptionAPIManagerTest, UpstartFailure) {
155 upstart_client_->set_enqueue_requests(true);
156 media_perception::State state;
157 state.status = media_perception::STATUS_RUNNING;
158
159 base::RunLoop run_loop;
160 CallbackStatus status;
161 manager_->SetState(state, base::Bind(&RecordStatusAndRunClosure,
162 run_loop.QuitClosure(), &status));
163 EXPECT_TRUE(upstart_client_->HandleNextUpstartRequest(false));
164 run_loop.Run();
165 EXPECT_EQ(CallbackStatus::PROCESS_IDLE_ERROR, status);
166
167 // Check that after a failed request, setState RUNNING will go through.
168 upstart_client_->set_enqueue_requests(false);
169 EXPECT_EQ(CallbackStatus::SUCCESS,
170 SetStateAndWaitForResponse(manager_.get(), state));
171 }
172
173 TEST_F(MediaPerceptionAPIManagerTest, UpstartStall) {
174 upstart_client_->set_enqueue_requests(true);
175 media_perception::State state;
176 state.status = media_perception::STATUS_RUNNING;
177
178 base::RunLoop run_loop;
179 CallbackStatus status;
180 manager_->SetState(state, base::Bind(&RecordStatusAndRunClosure,
181 run_loop.QuitClosure(), &status));
182
183 EXPECT_EQ(CallbackStatus::PROCESS_LAUNCHING_ERROR,
184 GetStateAndWaitForResponse(manager_.get()));
185 EXPECT_EQ(CallbackStatus::PROCESS_LAUNCHING_ERROR,
186 SetStateAndWaitForResponse(manager_.get(), state));
187 EXPECT_TRUE(upstart_client_->HandleNextUpstartRequest(true));
188 run_loop.Run();
189 EXPECT_EQ(CallbackStatus::SUCCESS, status);
190
191 // Verify that after the slow start, things works as normal.
192 upstart_client_->set_enqueue_requests(false);
193 EXPECT_EQ(CallbackStatus::SUCCESS,
194 GetStateAndWaitForResponse(manager_.get()));
195 state.status = media_perception::STATUS_SUSPENDED;
196 EXPECT_EQ(CallbackStatus::SUCCESS,
197 SetStateAndWaitForResponse(manager_.get(), state));
198 }
199
200 TEST_F(MediaPerceptionAPIManagerTest, MediaAnalyticsDbusError) {
201 media_perception::State state;
202 state.status = media_perception::STATUS_RUNNING;
203 EXPECT_EQ(CallbackStatus::SUCCESS,
204 SetStateAndWaitForResponse(manager_.get(), state));
205 // Disable the functionality of the fake process.
206 media_analytics_client_->set_process_running(false);
207 EXPECT_EQ(CallbackStatus::DBUS_ERROR,
208 GetStateAndWaitForResponse(manager_.get()));
209 EXPECT_EQ(CallbackStatus::DBUS_ERROR,
210 SetStateAndWaitForResponse(manager_.get(), state));
211 }
212
213 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698