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

Side by Side Diff: chromecast/media/base/media_resource_tracker_unittest.cc

Issue 2348603002: [chromecast] Track MediaPipelineBackend used by CastRenderer. (Closed)
Patch Set: DISALLOW_COPY_AND_ASSIGN Created 4 years, 3 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 | « chromecast/media/base/media_resource_tracker.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chromecast/media/base/media_resource_tracker.h" 5 #include "chromecast/media/base/media_resource_tracker.h"
6 6
7 #include <memory> 7 #include <memory>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/location.h" 10 #include "base/message_loop/message_loop.h"
11 #include "base/run_loop.h" 11 #include "base/run_loop.h"
12 #include "base/single_thread_task_runner.h"
13 #include "base/synchronization/waitable_event.h"
14 #include "base/task_runner.h"
15 #include "base/threading/thread.h"
16 #include "testing/gmock/include/gmock/gmock.h" 12 #include "testing/gmock/include/gmock/gmock.h"
17 #include "testing/gtest/include/gtest/gtest.h" 13 #include "testing/gtest/include/gtest/gtest.h"
18 14
19 namespace chromecast { 15 namespace chromecast {
20 namespace media { 16 namespace media {
21 17
22 void RunUntilIdle(base::TaskRunner* task_runner) {
23 base::WaitableEvent completion_event(
24 base::WaitableEvent::ResetPolicy::AUTOMATIC,
25 base::WaitableEvent::InitialState::NOT_SIGNALED);
26 task_runner->PostTask(FROM_HERE,
27 base::Bind(&base::WaitableEvent::Signal,
28 base::Unretained(&completion_event)));
29 completion_event.Wait();
30 }
31
32 // Collection of mocks to verify MediaResourceTracker takes the correct actions. 18 // Collection of mocks to verify MediaResourceTracker takes the correct actions.
33 class MediaResourceTrackerTestMocks { 19 class MediaResourceTrackerTestMocks {
34 public: 20 public:
35 MOCK_METHOD0(Initialize, void()); // CastMediaShlib::Initialize 21 MOCK_METHOD0(Initialize, void()); // CastMediaShlib::Initialize
36 MOCK_METHOD0(Finalize, void()); // CastMediaShlib::Finalize 22 MOCK_METHOD0(Finalize, void()); // CastMediaShlib::Finalize
37 MOCK_METHOD0(Destroyed, void()); // ~CastMediaResourceTracker 23 MOCK_METHOD0(Destroyed, void()); // ~CastMediaResourceTracker
38 MOCK_METHOD0(FinalizeCallback, void()); // callback to Finalize 24 MOCK_METHOD0(FinalizeCallback, void()); // callback to Finalize
39 }; 25 };
40 26
41 class TestMediaResourceTracker : public MediaResourceTracker { 27 class TestMediaResourceTracker : public MediaResourceTracker {
(...skipping 11 matching lines...) Expand all
53 39
54 void DoInitializeMediaLib() override { 40 void DoInitializeMediaLib() override {
55 ASSERT_TRUE(media_task_runner_->BelongsToCurrentThread()); 41 ASSERT_TRUE(media_task_runner_->BelongsToCurrentThread());
56 test_mocks_->Initialize(); 42 test_mocks_->Initialize();
57 } 43 }
58 void DoFinalizeMediaLib() override { 44 void DoFinalizeMediaLib() override {
59 ASSERT_TRUE(media_task_runner_->BelongsToCurrentThread()); 45 ASSERT_TRUE(media_task_runner_->BelongsToCurrentThread());
60 test_mocks_->Finalize(); 46 test_mocks_->Finalize();
61 } 47 }
62 48
49 size_t media_use_count() const { return media_use_count_; }
50
63 private: 51 private:
64 MediaResourceTrackerTestMocks* test_mocks_; 52 MediaResourceTrackerTestMocks* test_mocks_;
65 }; 53 };
66 54
67 class MediaResourceTrackerTest : public ::testing::Test { 55 class MediaResourceTrackerTest : public ::testing::Test {
68 public: 56 public:
69 MediaResourceTrackerTest() {} 57 MediaResourceTrackerTest() {}
70 ~MediaResourceTrackerTest() override {} 58 ~MediaResourceTrackerTest() override {}
71 59
72 protected: 60 protected:
73 void SetUp() override { 61 void SetUp() override {
74 message_loop_.reset(new base::MessageLoop());
75 media_thread_.reset(new base::Thread("MediaThread"));
76 media_thread_->Start();
77 media_task_runner_ = media_thread_->task_runner();
78
79 test_mocks_.reset(new MediaResourceTrackerTestMocks()); 62 test_mocks_.reset(new MediaResourceTrackerTestMocks());
80 63
81 resource_tracker_ = new TestMediaResourceTracker( 64 resource_tracker_ = new TestMediaResourceTracker(
82 test_mocks_.get(), message_loop_->task_runner(), 65 test_mocks_.get(), message_loop_.task_runner(),
83 media_task_runner_); 66 message_loop_.task_runner());
84 } 67 }
85 68
86 void TearDown() override { media_thread_.reset(); } 69 void InitializeMediaLib() {
87 70 EXPECT_CALL(*test_mocks_, Initialize()).Times(1);
88 void IncrementMediaUsageCount() { 71 resource_tracker_->InitializeMediaLib();
89 media_task_runner_->PostTask( 72 base::RunLoop().RunUntilIdle();
90 FROM_HERE, base::Bind(&MediaResourceTracker::IncrementUsageCount,
91 base::Unretained(resource_tracker_)));
92 }
93 void DecrementMediaUsageCount() {
94 media_task_runner_->PostTask(
95 FROM_HERE, base::Bind(&MediaResourceTracker::DecrementUsageCount,
96 base::Unretained(resource_tracker_)));
97 } 73 }
98 74
99 MediaResourceTracker* resource_tracker_; 75 base::MessageLoop message_loop_;
76 TestMediaResourceTracker* resource_tracker_;
100 std::unique_ptr<MediaResourceTrackerTestMocks> test_mocks_; 77 std::unique_ptr<MediaResourceTrackerTestMocks> test_mocks_;
101 std::unique_ptr<base::MessageLoop> message_loop_;
102 std::unique_ptr<base::Thread> media_thread_;
103 scoped_refptr<base::SingleThreadTaskRunner> media_task_runner_;
104 78
105 DISALLOW_COPY_AND_ASSIGN(MediaResourceTrackerTest); 79 DISALLOW_COPY_AND_ASSIGN(MediaResourceTrackerTest);
106 }; 80 };
107 81
108 TEST_F(MediaResourceTrackerTest, BasicLifecycle) { 82 TEST_F(MediaResourceTrackerTest, BasicLifecycle) {
109 // Startup and shutdown flow: Initialize then FinalizeAndDestroy 83 // Startup and shutdown flow: Initialize then FinalizeAndDestroy
110 EXPECT_CALL(*test_mocks_, Initialize()).Times(1); 84 EXPECT_CALL(*test_mocks_, Initialize()).Times(1);
111 EXPECT_CALL(*test_mocks_, Finalize()).Times(1); 85 EXPECT_CALL(*test_mocks_, Finalize()).Times(1);
112 EXPECT_CALL(*test_mocks_, Destroyed()).Times(1); 86 EXPECT_CALL(*test_mocks_, Destroyed()).Times(1);
113 87
114 resource_tracker_->InitializeMediaLib(); 88 resource_tracker_->InitializeMediaLib();
115 resource_tracker_->FinalizeAndDestroy(); 89 resource_tracker_->FinalizeAndDestroy();
116
117 RunUntilIdle(media_task_runner_.get());
118 base::RunLoop().RunUntilIdle(); 90 base::RunLoop().RunUntilIdle();
119 } 91 }
120 92
121 TEST_F(MediaResourceTrackerTest, InitializeTwice) { 93 TEST_F(MediaResourceTrackerTest, InitializeTwice) {
122 EXPECT_CALL(*test_mocks_, Initialize()).Times(1); 94 EXPECT_CALL(*test_mocks_, Initialize()).Times(1);
123 EXPECT_CALL(*test_mocks_, Finalize()).Times(1); 95 EXPECT_CALL(*test_mocks_, Finalize()).Times(1);
124 EXPECT_CALL(*test_mocks_, Destroyed()).Times(1); 96 EXPECT_CALL(*test_mocks_, Destroyed()).Times(1);
125 97
126 resource_tracker_->InitializeMediaLib(); 98 resource_tracker_->InitializeMediaLib();
127 resource_tracker_->InitializeMediaLib(); 99 resource_tracker_->InitializeMediaLib();
128 resource_tracker_->FinalizeAndDestroy(); 100 resource_tracker_->FinalizeAndDestroy();
129
130 RunUntilIdle(media_task_runner_.get());
131 base::RunLoop().RunUntilIdle(); 101 base::RunLoop().RunUntilIdle();
132 } 102 }
133 103
134 TEST_F(MediaResourceTrackerTest, FinalizeWithoutInitialize) { 104 TEST_F(MediaResourceTrackerTest, FinalizeWithoutInitialize) {
135 EXPECT_CALL(*test_mocks_, Initialize()).Times(0); 105 EXPECT_CALL(*test_mocks_, Initialize()).Times(0);
136 EXPECT_CALL(*test_mocks_, Finalize()).Times(0); 106 EXPECT_CALL(*test_mocks_, Finalize()).Times(0);
137 EXPECT_CALL(*test_mocks_, Destroyed()).Times(1); 107 EXPECT_CALL(*test_mocks_, Destroyed()).Times(1);
138 108
139 resource_tracker_->FinalizeAndDestroy(); 109 resource_tracker_->FinalizeAndDestroy();
140
141 RunUntilIdle(media_task_runner_.get());
142 base::RunLoop().RunUntilIdle(); 110 base::RunLoop().RunUntilIdle();
143 } 111 }
144 112
113 // Check FinalizeCastMediaShlib works correctly with no users of
114 // media resource.
145 TEST_F(MediaResourceTrackerTest, FinalizeResourceNotInUse) { 115 TEST_F(MediaResourceTrackerTest, FinalizeResourceNotInUse) {
146 // Check FinalizeCastMediaShlib works correctly with no users of 116 InitializeMediaLib();
147 // media resource.
148 EXPECT_CALL(*test_mocks_, Initialize()).Times(1);
149 resource_tracker_->InitializeMediaLib();
150 117
151 EXPECT_CALL(*test_mocks_, Finalize()).Times(1); 118 EXPECT_CALL(*test_mocks_, Finalize()).Times(1);
152 EXPECT_CALL(*test_mocks_, Destroyed()).Times(0); 119 EXPECT_CALL(*test_mocks_, Destroyed()).Times(0);
153 EXPECT_CALL(*test_mocks_, FinalizeCallback()).Times(1); 120 EXPECT_CALL(*test_mocks_, FinalizeCallback()).Times(1);
154 resource_tracker_->FinalizeMediaLib( 121 resource_tracker_->FinalizeMediaLib(
155 base::Bind(&MediaResourceTrackerTestMocks::FinalizeCallback, 122 base::Bind(&MediaResourceTrackerTestMocks::FinalizeCallback,
156 base::Unretained(test_mocks_.get()))); 123 base::Unretained(test_mocks_.get())));
157 RunUntilIdle(media_task_runner_.get());
158 base::RunLoop().RunUntilIdle(); 124 base::RunLoop().RunUntilIdle();
159 125
160 EXPECT_CALL(*test_mocks_, Destroyed()).Times(1); 126 EXPECT_CALL(*test_mocks_, Destroyed()).Times(1);
161 resource_tracker_->FinalizeAndDestroy(); 127 resource_tracker_->FinalizeAndDestroy();
162
163 RunUntilIdle(media_task_runner_.get());
164 base::RunLoop().RunUntilIdle(); 128 base::RunLoop().RunUntilIdle();
165 } 129 }
166 130
131 // Check FinalizeCastMediaShlib waits for resource to not be in use.
167 TEST_F(MediaResourceTrackerTest, FinalizeResourceInUse) { 132 TEST_F(MediaResourceTrackerTest, FinalizeResourceInUse) {
168 // Check FinalizeCastMediaShlib waits for resource to not be in use. 133 InitializeMediaLib();
169 EXPECT_CALL(*test_mocks_, Initialize()).Times(1);
170 resource_tracker_->InitializeMediaLib();
171 134
172 IncrementMediaUsageCount(); 135 resource_tracker_->IncrementUsageCount();
173 RunUntilIdle(media_task_runner_.get());
174 base::RunLoop().RunUntilIdle(); 136 base::RunLoop().RunUntilIdle();
175 137
176 EXPECT_CALL(*test_mocks_, Finalize()).Times(0); 138 EXPECT_CALL(*test_mocks_, Finalize()).Times(0);
177 EXPECT_CALL(*test_mocks_, Destroyed()).Times(0); 139 EXPECT_CALL(*test_mocks_, Destroyed()).Times(0);
178 resource_tracker_->FinalizeMediaLib( 140 resource_tracker_->FinalizeMediaLib(
179 base::Bind(&MediaResourceTrackerTestMocks::FinalizeCallback, 141 base::Bind(&MediaResourceTrackerTestMocks::FinalizeCallback,
180 base::Unretained(test_mocks_.get()))); 142 base::Unretained(test_mocks_.get())));
181 RunUntilIdle(media_task_runner_.get()); 143 base::RunLoop().RunUntilIdle();
182 144
183 EXPECT_CALL(*test_mocks_, Finalize()).Times(1); 145 EXPECT_CALL(*test_mocks_, Finalize()).Times(1);
184 DecrementMediaUsageCount();
185
186 EXPECT_CALL(*test_mocks_, FinalizeCallback()).Times(1); 146 EXPECT_CALL(*test_mocks_, FinalizeCallback()).Times(1);
187 RunUntilIdle(media_task_runner_.get()); 147 resource_tracker_->DecrementUsageCount();
188 base::RunLoop().RunUntilIdle(); 148 base::RunLoop().RunUntilIdle();
189 149
190 EXPECT_CALL(*test_mocks_, Destroyed()).Times(1); 150 EXPECT_CALL(*test_mocks_, Destroyed()).Times(1);
191 resource_tracker_->FinalizeAndDestroy(); 151 resource_tracker_->FinalizeAndDestroy();
192
193 RunUntilIdle(media_task_runner_.get());
194 base::RunLoop().RunUntilIdle(); 152 base::RunLoop().RunUntilIdle();
195 } 153 }
196 154
155 // Check FinalizeAndDestroy waits for resource to not be in use.
197 TEST_F(MediaResourceTrackerTest, DestroyWaitForNoUsers) { 156 TEST_F(MediaResourceTrackerTest, DestroyWaitForNoUsers) {
198 // Check FinalizeAndDestroy waits for resource to not be in use. 157 InitializeMediaLib();
199 EXPECT_CALL(*test_mocks_, Initialize()).Times(1);
200 resource_tracker_->InitializeMediaLib();
201 158
202 IncrementMediaUsageCount(); 159 resource_tracker_->IncrementUsageCount();
203 RunUntilIdle(media_task_runner_.get());
204 base::RunLoop().RunUntilIdle(); 160 base::RunLoop().RunUntilIdle();
205 161
206 EXPECT_CALL(*test_mocks_, Finalize()).Times(0); 162 EXPECT_CALL(*test_mocks_, Finalize()).Times(0);
207 EXPECT_CALL(*test_mocks_, Destroyed()).Times(0); 163 EXPECT_CALL(*test_mocks_, Destroyed()).Times(0);
208 resource_tracker_->FinalizeAndDestroy(); 164 resource_tracker_->FinalizeAndDestroy();
209 RunUntilIdle(media_task_runner_.get()); 165 base::RunLoop().RunUntilIdle();
210 166
211 EXPECT_CALL(*test_mocks_, Finalize()).Times(1); 167 EXPECT_CALL(*test_mocks_, Finalize()).Times(1);
212 EXPECT_CALL(*test_mocks_, Destroyed()).Times(1); 168 EXPECT_CALL(*test_mocks_, Destroyed()).Times(1);
213 DecrementMediaUsageCount(); 169 resource_tracker_->DecrementUsageCount();
214
215 RunUntilIdle(media_task_runner_.get());
216 base::RunLoop().RunUntilIdle(); 170 base::RunLoop().RunUntilIdle();
217 } 171 }
218 172
173 // Check finalize callback still made if FinalizeAndDestroy called
174 // while waiting for resource usage to end.
219 TEST_F(MediaResourceTrackerTest, DestroyWithPendingFinalize) { 175 TEST_F(MediaResourceTrackerTest, DestroyWithPendingFinalize) {
220 // Check finalize callback still made if FinalizeAndDestroy called 176 InitializeMediaLib();
221 // while waiting for resource usage to end.
222 EXPECT_CALL(*test_mocks_, Initialize()).Times(1);
223 resource_tracker_->InitializeMediaLib();
224 177
225 IncrementMediaUsageCount(); 178 resource_tracker_->IncrementUsageCount();
226 RunUntilIdle(media_task_runner_.get());
227 base::RunLoop().RunUntilIdle(); 179 base::RunLoop().RunUntilIdle();
228 180
229 EXPECT_CALL(*test_mocks_, Finalize()).Times(0); 181 EXPECT_CALL(*test_mocks_, Finalize()).Times(0);
230 EXPECT_CALL(*test_mocks_, Destroyed()).Times(0); 182 EXPECT_CALL(*test_mocks_, Destroyed()).Times(0);
231 resource_tracker_->FinalizeMediaLib( 183 resource_tracker_->FinalizeMediaLib(
232 base::Bind(&MediaResourceTrackerTestMocks::FinalizeCallback, 184 base::Bind(&MediaResourceTrackerTestMocks::FinalizeCallback,
233 base::Unretained(test_mocks_.get()))); 185 base::Unretained(test_mocks_.get())));
234 resource_tracker_->FinalizeAndDestroy(); 186 resource_tracker_->FinalizeAndDestroy();
235 RunUntilIdle(media_task_runner_.get()); 187 base::RunLoop().RunUntilIdle();
236 188
237 EXPECT_CALL(*test_mocks_, Finalize()).Times(1); 189 EXPECT_CALL(*test_mocks_, Finalize()).Times(1);
238 EXPECT_CALL(*test_mocks_, Destroyed()).Times(1); 190 EXPECT_CALL(*test_mocks_, Destroyed()).Times(1);
239 EXPECT_CALL(*test_mocks_, FinalizeCallback()).Times(1); 191 EXPECT_CALL(*test_mocks_, FinalizeCallback()).Times(1);
240 192 resource_tracker_->DecrementUsageCount();
241 DecrementMediaUsageCount();
242
243 RunUntilIdle(media_task_runner_.get());
244 base::RunLoop().RunUntilIdle(); 193 base::RunLoop().RunUntilIdle();
245 } 194 }
246 195
196 TEST_F(MediaResourceTrackerTest, ScopedUsage) {
197 InitializeMediaLib();
198
199 EXPECT_EQ(0u, resource_tracker_->media_use_count());
200 {
201 std::unique_ptr<MediaResourceTracker::ScopedUsage> scoped_usage(
202 new MediaResourceTracker::ScopedUsage(resource_tracker_));
203 EXPECT_EQ(1u, resource_tracker_->media_use_count());
204 }
205 EXPECT_EQ(0u, resource_tracker_->media_use_count());
206 }
207
247 } // namespace media 208 } // namespace media
248 } // namespace chromecast 209 } // namespace chromecast
OLDNEW
« no previous file with comments | « chromecast/media/base/media_resource_tracker.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698