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

Side by Side Diff: remoting/client/chromoting_view_unittest.cc

Issue 3124005: Move UpdateStreamEncoding value into the BeginUpdateStreamMessage since we... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 10 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 | Annotate | Revision Log
« no previous file with comments | « remoting/client/chromoting_view.cc ('k') | remoting/client/plugin/pepper_view.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Property Changes:
Added: svn:eol-style
+ LF
OLDNEW
(Empty)
1 // Copyright (c) 2010 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 "base/scoped_ptr.h"
6 #include "remoting/base/protocol/chromotocol.pb.h"
7 #include "remoting/client/chromoting_view.h"
8 #include "testing/gmock/include/gmock/gmock.h"
9 #include "testing/gtest/include/gtest/gtest.h"
10
11 using ::testing::_;
12 using ::testing::InSequence;
13 using ::testing::Return;
14
15 namespace remoting {
16
17 class MockDecoder : public Decoder {
18 public:
19 MockDecoder() {}
20
21 MOCK_METHOD4(BeginDecode, bool(scoped_refptr<media::VideoFrame> frame,
22 UpdatedRects* updated_rects,
23 Task* partial_decode_done,
24 Task* decode_done));
25 MOCK_METHOD1(PartialDecode, bool(HostMessage* message));
26 MOCK_METHOD0(EndDecode, void());
27
28 MOCK_METHOD0(Encoding, UpdateStreamEncoding());
29 MOCK_METHOD0(IsStarted, bool());
30
31 private:
32 DISALLOW_COPY_AND_ASSIGN(MockDecoder);
33 };
34
35 // Fake ChromotingView that provides stub implementations for all pure virtual
36 // methods. This is sufficient since we're only interested in testing the
37 // base class methods in this file.
38 class FakeView : public ChromotingView {
39 bool Initialize() { return false; }
40 void TearDown() {}
41 void Paint() {}
42 void SetSolidFill(uint32 color) {}
43 void UnsetSolidFill() {}
44 void SetViewport(int x, int y, int width, int height) {
45 frame_width_ = width;
46 frame_height_ = height;
47 }
48 void SetHostScreenSize(int width, int height) {}
49 void HandleBeginUpdateStream(HostMessage* msg) {}
50 void HandleUpdateStreamPacket(HostMessage* msg) {}
51 void HandleEndUpdateStream(HostMessage* msg) {}
52
53 public:
54 // Testing accessors.
55 // These provide access to private/protected members of ChromotingView so
56 // that they can be tested/verified.
57 Decoder* get_decoder() {
58 return decoder_.get();
59 }
60 void set_decoder(Decoder* decoder) {
61 decoder_.reset(decoder);
62 }
63
64 // Testing wrappers for private setup/startup decoder routines.
65 bool setup_decoder(UpdateStreamEncoding encoding) {
66 return SetupDecoder(encoding);
67 }
68 bool begin_decoding(Task* partial_decode_done, Task* decode_done) {
69 return BeginDecoding(partial_decode_done, decode_done);
70 }
71 bool decode(HostMessage* msg) {
72 return Decode(msg);
73 }
74 bool end_decoding() {
75 return EndDecoding();
76 }
77
78 // Testing setup.
79 void set_test_viewport() {
80 SetViewport(0, 0, 640, 480);
81 }
82 };
83
84 // Verify the initial state.
85 TEST(ChromotingViewTest, InitialState) {
86 scoped_ptr<FakeView> view(new FakeView());
87 EXPECT_TRUE(view->get_decoder() == NULL);
88 }
89
90 // Test a simple decoder sequence:
91 // HandleBeginUpdateStream:
92 // HandleUpdateStreamPacket:
93 // SetupDecoder - return false
94 // BeginDecoding
95 // Decode
96 // HandleEndUpdateStream:
97 // EndDecoding
98 TEST(ChromotingViewTest, DecodeSimple) {
99 scoped_ptr<FakeView> view(new FakeView());
100 view->set_test_viewport();
101
102 // HandleBeginUpdateStream
103
104 // HandleUpdateStreamPacket
105
106 ASSERT_TRUE(view->setup_decoder(EncodingZlib));
107 Decoder* decoder = view->get_decoder();
108 ASSERT_TRUE(decoder != NULL);
109 EXPECT_EQ(EncodingZlib, decoder->Encoding());
110 EXPECT_EQ(false, decoder->IsStarted());
111
112 // Overwrite |decoder_| with MockDecoder.
113 MockDecoder* mock_decoder = new MockDecoder();
114 view->set_decoder(mock_decoder);
115 EXPECT_CALL(*mock_decoder, Encoding())
116 .WillRepeatedly(Return(EncodingZlib));
117 {
118 InSequence s;
119
120 // BeginDecoding
121 EXPECT_CALL(*mock_decoder, IsStarted())
122 .WillOnce(Return(false));
123 EXPECT_CALL(*mock_decoder, BeginDecode(_, _, _, _))
124 .WillOnce(Return(true));
125 EXPECT_CALL(*mock_decoder, IsStarted())
126 .WillOnce(Return(true));
127
128 // Decode
129 EXPECT_CALL(*mock_decoder, IsStarted())
130 .WillOnce(Return(true));
131 EXPECT_CALL(*mock_decoder, PartialDecode(_))
132 .WillOnce(Return(true));
133
134 // EndDecoding
135 EXPECT_CALL(*mock_decoder, IsStarted())
136 .WillOnce(Return(true));
137 EXPECT_CALL(*mock_decoder, EndDecode())
138 .Times(1);
139 EXPECT_CALL(*mock_decoder, IsStarted())
140 .WillOnce(Return(false));
141 }
142
143 // decoder_->IsStarted() is false, so we call begin_decoding().
144 ASSERT_TRUE(view->begin_decoding(NULL, NULL));
145
146 ASSERT_TRUE(view->decode(NULL));
147
148 // HandleEndUpdateStream
149
150 ASSERT_TRUE(view->end_decoding());
151 }
152
153 // Test a three-packet decoder sequence:
154 // HandleBeginUpdateStream:
155 // HandleUpdateStreamPacket: (1)
156 // SetupDecoder - return false
157 // BeginDecoding
158 // Decode
159 // HandleUpdateStreamPacket: (2)
160 // SetupDecoder - return true
161 // Decode
162 // HandleUpdateStreamPacket: (3)
163 // SetupDecoder - return true
164 // Decode
165 // HandleEndUpdateStream:
166 // EndDecoding
167 TEST(ChromotingViewTest, DecodeThreePackets) {
168 scoped_ptr<FakeView> view(new FakeView());
169 view->set_test_viewport();
170
171 // HandleBeginUpdateStream
172
173 // HandleUpdateStreamPacket (1)
174
175 ASSERT_TRUE(view->setup_decoder(EncodingZlib));
176 Decoder* decoder = view->get_decoder();
177 ASSERT_TRUE(decoder != NULL);
178 EXPECT_EQ(EncodingZlib, decoder->Encoding());
179 EXPECT_EQ(false, decoder->IsStarted());
180
181 // Overwrite |decoder_| with MockDecoder.
182 MockDecoder* mock_decoder = new MockDecoder();
183 view->set_decoder(mock_decoder);
184 EXPECT_CALL(*mock_decoder, Encoding())
185 .WillRepeatedly(Return(EncodingZlib));
186 EXPECT_CALL(*mock_decoder, BeginDecode(_, _, _, _))
187 .WillOnce(Return(true));
188 EXPECT_CALL(*mock_decoder, PartialDecode(_))
189 .Times(3)
190 .WillRepeatedly(Return(true));
191 EXPECT_CALL(*mock_decoder, EndDecode())
192 .Times(1);
193 {
194 InSequence s;
195
196 // BeginDecoding
197 EXPECT_CALL(*mock_decoder, IsStarted())
198 .WillOnce(Return(false))
199 .RetiresOnSaturation();
200 // BeginDecoding (1)
201 // Decode (1)
202 // SetupDecoder (1)
203 // Decode (1)
204 // SetupDecoder (1)
205 // Decode (1)
206 // EndDecoding (1)
207 // Total = 7 calls
208 EXPECT_CALL(*mock_decoder, IsStarted())
209 .Times(7)
210 .WillRepeatedly(Return(true))
211 .RetiresOnSaturation();
212 // EndDecoding
213 EXPECT_CALL(*mock_decoder, IsStarted())
214 .WillOnce(Return(false))
215 .RetiresOnSaturation();
216 }
217
218 // decoder_->IsStarted() is false, so we call begin_decoding().
219 ASSERT_TRUE(view->begin_decoding(NULL, NULL));
220
221 ASSERT_TRUE(view->decode(NULL));
222
223 // HandleUpdateStreamPacket (2)
224
225 ASSERT_TRUE(view->setup_decoder(EncodingZlib));
226 // Don't call BeginDecoding() because it is already started.
227 ASSERT_TRUE(view->decode(NULL));
228
229 // HandleUpdateStreamPacket (3)
230
231 ASSERT_TRUE(view->setup_decoder(EncodingZlib));
232 // Don't call BeginDecoding() because it is already started.
233 ASSERT_TRUE(view->decode(NULL));
234
235 // HandleEndUpdateStream
236
237 ASSERT_TRUE(view->end_decoding());
238 }
239
240 // Test two update streams: (same packet encoding)
241 // HandleBeginUpdateStream:
242 // HandleUpdateStreamPacket:
243 // SetupDecoder - return false
244 // BeginDecoding
245 // Decode
246 // HandleEndUpdateStream:
247 // EndDecoding
248 //
249 // HandleBeginUpdateStream:
250 // HandleUpdateStreamPacket:
251 // SetupDecoder - return false
252 // BeginDecoding
253 // Decode
254 // HandleEndUpdateStream:
255 // EndDecoding
256 TEST(ChromotingViewTest, DecodeTwoStreams) {
257 scoped_ptr<FakeView> view(new FakeView());
258 view->set_test_viewport();
259
260 // HandleBeginUpdateStream (update stream 1)
261
262 // HandleUpdateStreamPacket
263
264 ASSERT_TRUE(view->setup_decoder(EncodingZlib));
265 Decoder* decoder = view->get_decoder();
266 ASSERT_TRUE(decoder != NULL);
267 EXPECT_EQ(EncodingZlib, decoder->Encoding());
268 EXPECT_EQ(false, decoder->IsStarted());
269
270 // Overwrite |decoder_| with MockDecoder.
271 MockDecoder* mock_decoder = new MockDecoder();
272 view->set_decoder(mock_decoder);
273 EXPECT_CALL(*mock_decoder, Encoding())
274 .WillRepeatedly(Return(EncodingZlib));
275 EXPECT_CALL(*mock_decoder, BeginDecode(_, _, _, _))
276 .Times(2)
277 .WillRepeatedly(Return(true));
278 EXPECT_CALL(*mock_decoder, PartialDecode(_))
279 .Times(2)
280 .WillRepeatedly(Return(true));
281 EXPECT_CALL(*mock_decoder, EndDecode())
282 .Times(2);
283 {
284 InSequence s;
285 // BeginDecoding
286 EXPECT_CALL(*mock_decoder, IsStarted())
287 .WillOnce(Return(false))
288 .RetiresOnSaturation();
289 // BeginDecoding (1)
290 // Decode (1)
291 // EndDecoding (1)
292 // Total = 3 calls
293 EXPECT_CALL(*mock_decoder, IsStarted())
294 .Times(3)
295 .WillRepeatedly(Return(true))
296 .RetiresOnSaturation();
297 // EndDecoding (1)
298 // SetupDecoder (1)
299 // BeginDecoding (1)
300 // Total = 3 calls
301 EXPECT_CALL(*mock_decoder, IsStarted())
302 .Times(3)
303 .WillRepeatedly(Return(false))
304 .RetiresOnSaturation();
305 // BeginDecoding (1)
306 // Decode (1)
307 // EndDecoding (1)
308 // Total = 3 calls
309 EXPECT_CALL(*mock_decoder, IsStarted())
310 .Times(3)
311 .WillRepeatedly(Return(true))
312 .RetiresOnSaturation();
313 // EndDecoding
314 EXPECT_CALL(*mock_decoder, IsStarted())
315 .WillOnce(Return(false))
316 .RetiresOnSaturation();
317 }
318
319 // |started| is false, so we call begin_decoding().
320 ASSERT_TRUE(view->begin_decoding(NULL, NULL));
321
322 ASSERT_TRUE(view->decode(NULL));
323
324 // HandleEndUpdateStream
325
326 ASSERT_TRUE(view->end_decoding());
327
328 // HandleBeginUpdateStream (update stream 2)
329
330 // HandleUpdateStreamPacket
331
332 Decoder* old_decoder = view->get_decoder();
333 view->setup_decoder(EncodingZlib);
334 // Verify we're using the same decoder since the encoding matches.
335 Decoder* new_decoder = view->get_decoder();
336 ASSERT_TRUE(new_decoder == old_decoder);
337
338 // |started| is false, so we call begin_decoding().
339 ASSERT_TRUE(view->begin_decoding(NULL, NULL));
340
341 ASSERT_TRUE(view->decode(NULL));
342
343 // HandleEndUpdateStream
344
345 ASSERT_TRUE(view->end_decoding());
346 }
347
348 // Test two update streams with different encodings:
349 // HandleBeginUpdateStream:
350 // HandleUpdateStreamPacket: ('Zlib' encoded)
351 // SetupDecoder
352 // BeginDecoding
353 // Decode
354 // HandleEndUpdateStream:
355 // EndDecoding
356 //
357 // HandleBeginUpdateStream:
358 // HandleUpdateStreamPacket: ('None' encoded)
359 // SetupDecoder
360 // BeginDecoding
361 // Decode
362 // HandleEndUpdateStream:
363 // EndDecoding
364 TEST(ChromotingViewTest, DecodeTwoStreamsDifferentEncodings) {
365 scoped_ptr<FakeView> view(new FakeView());
366 view->set_test_viewport();
367
368 // HandleBeginUpdateStream (update stream 1)
369
370 // HandleUpdateStreamPacket
371
372 ASSERT_TRUE(view->setup_decoder(EncodingZlib));
373 Decoder* decoder = view->get_decoder();
374 ASSERT_TRUE(decoder != NULL);
375 EXPECT_EQ(EncodingZlib, decoder->Encoding());
376 EXPECT_EQ(false, decoder->IsStarted());
377
378 // Overwrite |decoder_| with MockDecoder.
379 MockDecoder* mock_decoder1 = new MockDecoder();
380 view->set_decoder(mock_decoder1);
381 EXPECT_CALL(*mock_decoder1, Encoding())
382 .WillRepeatedly(Return(EncodingZlib));
383 EXPECT_CALL(*mock_decoder1, BeginDecode(_, _, _, _))
384 .WillOnce(Return(true));
385 EXPECT_CALL(*mock_decoder1, PartialDecode(_))
386 .WillOnce(Return(true));
387 EXPECT_CALL(*mock_decoder1, EndDecode());
388 {
389 InSequence s1;
390 // BeginDecoding
391 EXPECT_CALL(*mock_decoder1, IsStarted())
392 .WillOnce(Return(false))
393 .RetiresOnSaturation();
394 // BeginDecoding (1)
395 // Decode (1)
396 // EndDecoding (1)
397 // Total = 3 calls
398 EXPECT_CALL(*mock_decoder1, IsStarted())
399 .Times(3)
400 .WillRepeatedly(Return(true))
401 .RetiresOnSaturation();
402 // EndDecoding (1)
403 // SetupDecoder (1)
404 // Total = 2 calls
405 EXPECT_CALL(*mock_decoder1, IsStarted())
406 .Times(2)
407 .WillRepeatedly(Return(false))
408 .RetiresOnSaturation();
409 }
410
411 // |started| is false, so we call begin_decoding().
412 ASSERT_TRUE(view->begin_decoding(NULL, NULL));
413
414 ASSERT_TRUE(view->decode(NULL));
415
416 // HandleEndUpdateStream
417
418 ASSERT_TRUE(view->end_decoding());
419
420 // HandleBeginUpdateStream (update stream 2)
421
422 // HandleUpdateStreamPacket
423
424 // Encoding for second stream is different from first, so this will
425 // create a new decoder.
426 ASSERT_TRUE(view->setup_decoder(EncodingNone));
427 // The decoder should be new.
428 EXPECT_NE(mock_decoder1, view->get_decoder());
429
430 // Overwrite |decoder_| with MockDecoder.
431 MockDecoder* mock_decoder2 = new MockDecoder();
432 view->set_decoder(mock_decoder2);
433 EXPECT_CALL(*mock_decoder2, Encoding())
434 .WillRepeatedly(Return(EncodingNone));
435 EXPECT_CALL(*mock_decoder2, BeginDecode(_, _, _, _))
436 .WillOnce(Return(true));
437 EXPECT_CALL(*mock_decoder2, PartialDecode(_))
438 .WillOnce(Return(true));
439 EXPECT_CALL(*mock_decoder2, EndDecode());
440 {
441 InSequence s2;
442 // BeginDecoding
443 EXPECT_CALL(*mock_decoder2, IsStarted())
444 .WillOnce(Return(false))
445 .RetiresOnSaturation();
446 // BeginDecoding (1)
447 // Decode (1)
448 // EndDecoding (1)
449 // Total = 3 calls
450 EXPECT_CALL(*mock_decoder2, IsStarted())
451 .Times(3)
452 .WillRepeatedly(Return(true))
453 .RetiresOnSaturation();
454 // EndDecoding
455 EXPECT_CALL(*mock_decoder2, IsStarted())
456 .WillOnce(Return(false))
457 .RetiresOnSaturation();
458 }
459
460 // |started| is false, so we call begin_decoding().
461 ASSERT_TRUE(view->begin_decoding(NULL, NULL));
462
463 ASSERT_TRUE(view->decode(NULL));
464
465 // HandleEndUpdateStream
466
467 ASSERT_TRUE(view->end_decoding());
468 }
469
470 // Test failure when packets in a stream have mismatched encodings.
471 // HandleBeginUpdateStream:
472 // HandleUpdateStreamPacket: (1)
473 // SetupDecoder - encoding = Zlib
474 // BeginDecoding
475 // Decode
476 // HandleUpdateStreamPacket: (2)
477 // SetupDecoder - encoding = none
478 // DEATH
479 TEST(ChromotingViewTest, MismatchedEncodings) {
480 scoped_ptr<FakeView> view(new FakeView());
481 view->set_test_viewport();
482
483 // HandleBeginUpdateStream
484
485 // HandleUpdateStreamPacket (1)
486 // encoding = Zlib
487
488 ASSERT_TRUE(view->setup_decoder(EncodingZlib));
489 Decoder* decoder = view->get_decoder();
490 ASSERT_TRUE(decoder != NULL);
491 EXPECT_EQ(EncodingZlib, decoder->Encoding());
492 EXPECT_EQ(false, decoder->IsStarted());
493
494 // Overwrite |decoder_| with MockDecoder.
495 MockDecoder* mock_decoder = new MockDecoder();
496 view->set_decoder(mock_decoder);
497 EXPECT_CALL(*mock_decoder, Encoding())
498 .WillRepeatedly(Return(EncodingZlib));
499 {
500 InSequence s;
501
502 // BeginDecoding().
503 EXPECT_CALL(*mock_decoder, IsStarted())
504 .WillOnce(Return(false));
505 EXPECT_CALL(*mock_decoder, BeginDecode(_, _, _, _))
506 .WillOnce(Return(true));
507 EXPECT_CALL(*mock_decoder, IsStarted())
508 .WillOnce(Return(true));
509
510 // Decode().
511 EXPECT_CALL(*mock_decoder, IsStarted())
512 .WillOnce(Return(true));
513 EXPECT_CALL(*mock_decoder, PartialDecode(_))
514 .WillOnce(Return(true));
515
516 // SetupDecoder().
517 EXPECT_CALL(*mock_decoder, IsStarted())
518 .WillOnce(Return(true));
519 }
520
521 // |started| is false, so we call begin_decoding().
522 ASSERT_TRUE(view->begin_decoding(NULL, NULL));
523
524 ASSERT_TRUE(view->decode(NULL));
525
526 // HandleUpdateStreamPacket (2)
527 // encoding = None
528
529 // Doesn't match previous packet encoding, so returns failure.
530 ASSERT_FALSE(view->setup_decoder(EncodingNone));
531 }
532
533 // Verify we fail when Decode() is called without first calling
534 // BeginDecoding().
535 TEST(ChromotingViewTest, MissingBegin) {
536 scoped_ptr<FakeView> view(new FakeView());
537 view->set_test_viewport();
538
539 ASSERT_TRUE(view->setup_decoder(EncodingZlib));
540 ASSERT_TRUE(view->get_decoder() != NULL);
541
542 // Overwrite |decoder_| with MockDecoder.
543 MockDecoder* mock_decoder = new MockDecoder();
544 view->set_decoder(mock_decoder);
545 EXPECT_CALL(*mock_decoder, IsStarted())
546 .WillOnce(Return(false));
547
548 // Call decode() without calling begin_decoding().
549 EXPECT_FALSE(view->decode(NULL));
550 }
551
552 // Test requesting a decoder for an invalid encoding.
553 TEST(ChromotingViewTest, InvalidEncoding) {
554 scoped_ptr<FakeView> view(new FakeView());
555 EXPECT_FALSE(view->setup_decoder(EncodingInvalid));
556 }
557
558 } // namespace remoting
OLDNEW
« no previous file with comments | « remoting/client/chromoting_view.cc ('k') | remoting/client/plugin/pepper_view.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698