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

Side by Side Diff: content/browser/renderer_host/media/audio_output_authorization_handler_unittest.cc

Issue 2424163004: Factor out authorization from AudioRendererHost. (Closed)
Patch Set: Unit tests. Address other comments. Created 4 years, 1 month 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 2016 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 // Unit test for AudioOutputAuthorizationHandlerTest.
6
7 #include "content/browser/renderer_host/media/audio_output_authorization_handler .h"
8
9 #include "base/bind.h"
10 #include "base/command_line.h"
11 #include "base/run_loop.h"
12 #include "content/public/test/mock_render_process_host.h"
13 #include "content/public/test/test_browser_context.h"
14 #include "content/public/test/test_browser_thread_bundle.h"
15 #include "media/audio/audio_device_description.h"
16 #include "media/audio/fake_audio_manager.h"
17 #include "media/base/media_switches.h"
18 #include "testing/gmock/include/gmock/gmock.h"
19 #include "testing/gtest/include/gtest/gtest.h"
20 #include "url/gurl.h"
21 #include "url/origin.h"
22
23 using ::testing::_;
24
25 const int kRenderProcessId = 1;
26 const int kRenderFrameId = 2;
27 const char kSecurityOriginString[] = "http://localhost";
28 const GURL kSecurityOriginGURL(kSecurityOriginString);
29 const url::Origin kSecurityOrigin(kSecurityOriginGURL);
30 const char kBadSecurityOriginString[] = "about:about";
31 const GURL kBadSecurityOriginGURL(kBadSecurityOriginString);
32 const url::Origin kBadSecurityOrigin(kBadSecurityOriginGURL);
33 const char kDefaultDeviceId[] = "default";
34 const char kEmptyDeviceId[] = "";
35 const char kInvalidDeviceId[] = "invalid-device-id";
36 const char kSalt[] = "salt";
37
38 namespace content {
39
40 class AudioOutputAuthorizationHandlerTest : public testing::Test {
41 public:
42 AudioOutputAuthorizationHandlerTest() {
43 audio_manager_ = media::FakeAudioManager::CreateForTesting(
44 base::ThreadTaskRunnerHandle::Get());
45 base::CommandLine::ForCurrentProcess()->AppendSwitch(
46 switches::kUseFakeDeviceForMediaStream);
47 media_stream_manager_.reset(new MediaStreamManager(audio_manager_.get()));
48 raw_nondefault_id = GetRawNondefaultFakeId();
49 hashed_nondefault_id = MediaStreamManager::GetHMACForMediaDeviceID(
50 kSalt, kSecurityOrigin, raw_nondefault_id);
51 }
52
53 ~AudioOutputAuthorizationHandlerTest() override {}
54
55 protected:
56 void SetUp() override {}
57
58 void TearDown() override {}
59
60 std::unique_ptr<MediaStreamManager> media_stream_manager_;
61 TestBrowserThreadBundle thread_bundle_;
62 media::ScopedAudioManagerPtr audio_manager_;
63 std::string raw_nondefault_id;
64 std::string hashed_nondefault_id;
65
66 private:
67 std::string GetRawNondefaultFakeId() {
68 MediaDeviceInfoArray devices;
69 MediaDevicesManager::BoolDeviceTypes devices_to_enumerate;
70 devices_to_enumerate[MEDIA_DEVICE_TYPE_AUDIO_OUTPUT] = true;
71
72 base::RunLoop loop;
73 media_stream_manager_->media_devices_manager()->EnumerateDevices(
74 devices_to_enumerate,
75 base::Bind(
76 [](MediaDeviceInfoArray* out,
77 const MediaDeviceEnumeration& result) {
78 *out = result[MediaDeviceType::MEDIA_DEVICE_TYPE_AUDIO_OUTPUT];
79 },
80 &devices));
81 loop.RunUntilIdle();
82 return devices[1].device_id; // devices[0] is default.
83 }
84
85 DISALLOW_COPY_AND_ASSIGN(AudioOutputAuthorizationHandlerTest);
86 };
87
88 struct MockListener {
89 MOCK_METHOD3(MockAuthorizationCallback,
90 void(media::OutputDeviceStatus status,
91 const media::AudioParameters& params,
92 const std::string& id));
93 AudioOutputAuthorizationHandler::AuthorizationCompletedCallback
94 GetCallback() {
95 return base::Bind(&MockListener::MockAuthorizationCallback,
96 base::Unretained(this));
97 }
98 };
99
100 TEST_F(AudioOutputAuthorizationHandlerTest, AuthorizeDefaultDevice_Ok) {
101 AudioOutputAuthorizationHandler handler(media_stream_manager_.get(),
102 kRenderProcessId, kSalt);
103
104 MockListener listener;
105 EXPECT_CALL(listener,
106 MockAuthorizationCallback(media::OUTPUT_DEVICE_STATUS_OK, _,
107 kDefaultDeviceId))
108 .Times(1);
109
110 base::RunLoop loop;
111 handler.RequestDeviceAuthorization(kRenderFrameId, /*session_id*/ 0,
112 kDefaultDeviceId, kSecurityOrigin,
113 listener.GetCallback());
114 loop.RunUntilIdle();
Guido Urdaneta 2016/11/01 13:49:16 you can make this shorter by avoiding the variable
Max Morin 2016/11/01 14:47:19 Done.
115 }
116
117 TEST_F(AudioOutputAuthorizationHandlerTest,
118 AuthorizeDefaultDeviceByEmptyId_Ok) {
119 AudioOutputAuthorizationHandler handler(media_stream_manager_.get(),
120 kRenderProcessId, kSalt);
121
122 MockListener listener;
123 EXPECT_CALL(listener,
124 MockAuthorizationCallback(media::OUTPUT_DEVICE_STATUS_OK, _,
125 kDefaultDeviceId))
126 .Times(1);
127
128 base::RunLoop loop;
129 handler.RequestDeviceAuthorization(kRenderFrameId, /*session_id*/ 0,
130 kEmptyDeviceId, kSecurityOrigin,
131 listener.GetCallback());
132 loop.RunUntilIdle();
133 }
134
135 TEST_F(AudioOutputAuthorizationHandlerTest,
136 AuthorizeNonDefaultDeviceIdWithoutPermission_NotAuthorized) {
137 AudioOutputAuthorizationHandler handler(media_stream_manager_.get(),
138 kRenderProcessId, kSalt);
139 std::string id = MediaStreamManager::GetHMACForMediaDeviceID(
140 kSalt, kSecurityOrigin, raw_nondefault_id);
141
142 MockListener listener;
143 EXPECT_CALL(listener,
144 MockAuthorizationCallback(
145 media::OUTPUT_DEVICE_STATUS_ERROR_NOT_AUTHORIZED, _, _))
146 .Times(1);
147
148 base::RunLoop loop;
149 handler.RequestDeviceAuthorization(kRenderFrameId, /*session_id*/ 0, id,
150 kSecurityOrigin, listener.GetCallback());
151 loop.RunUntilIdle();
152 }
153
154 TEST_F(AudioOutputAuthorizationHandlerTest,
155 AuthorizeNonDefaultDeviceIdWithPermission_Ok) {
156 AudioOutputAuthorizationHandler handler(media_stream_manager_.get(),
157 kRenderProcessId, kSalt);
158 // Override permissions check.
159 handler.GetMediaDevicesPermissionCheckerForTesting()
160 .OverridePermissionsForTesting(true);
161
162 MockListener listener;
163 EXPECT_CALL(listener,
164 MockAuthorizationCallback(media::OUTPUT_DEVICE_STATUS_OK, _,
165 raw_nondefault_id))
166 .Times(1);
167
168 base::RunLoop loop;
169 handler.RequestDeviceAuthorization(kRenderFrameId, /*session_id*/ 0,
170 hashed_nondefault_id, kSecurityOrigin,
171 listener.GetCallback());
172 loop.RunUntilIdle();
173 }
174
175 TEST_F(AudioOutputAuthorizationHandlerTest, AuthorizeInvalidDeviceId_Fails) {
176 AudioOutputAuthorizationHandler handler(media_stream_manager_.get(),
177 kRenderProcessId, kSalt);
178
179 MockListener listener;
180 EXPECT_CALL(listener, MockAuthorizationCallback(
181 media::OUTPUT_DEVICE_STATUS_ERROR_NOT_FOUND, _, _))
182 .Times(1);
183
184 base::RunLoop loop;
185 handler.RequestDeviceAuthorization(kRenderFrameId, /*session_id*/ 0,
186 kInvalidDeviceId, kSecurityOrigin,
187 listener.GetCallback());
188 loop.RunUntilIdle();
189 }
190
191 TEST_F(AudioOutputAuthorizationHandlerTest,
192 AuthorizeNondefaultDeviceIdWithBadOrigin_BadMessage) {
193 TestBrowserContext context;
194 MockRenderProcessHost RPH(&context);
195 AudioOutputAuthorizationHandler handler(media_stream_manager_.get(),
196 RPH.GetID(), kSalt);
197
198 MockListener listener;
199 EXPECT_CALL(listener, MockAuthorizationCallback(_, _, _)).Times(0);
200
201 base::RunLoop loop;
202 handler.RequestDeviceAuthorization(kRenderFrameId, /*session_id*/ 0,
203 hashed_nondefault_id, kBadSecurityOrigin,
204 listener.GetCallback());
205 loop.RunUntilIdle();
206
207 EXPECT_EQ(RPH.bad_msg_count(), 1);
208 }
209
210 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698