Upstream version 11.40.277.0
[platform/framework/web/crosswalk.git] / src / third_party / webrtc / modules / desktop_capture / differ_block_unittest.cc
1 /*
2  *  Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
3  *
4  *  Use of this source code is governed by a BSD-style license
5  *  that can be found in the LICENSE file in the root of the source
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS.  All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10
11 #include "testing/gmock/include/gmock/gmock.h"
12 #include "webrtc/modules/desktop_capture/differ_block.h"
13 #include "webrtc/system_wrappers/interface/ref_count.h"
14
15 namespace webrtc {
16
17 // Run 900 times to mimic 1280x720.
18 // TODO(fbarchard): Remove benchmark once performance is non-issue.
19 static const int kTimesToRun = 900;
20
21 static void GenerateData(uint8_t* data, int size) {
22   for (int i = 0; i < size; ++i) {
23     data[i] = i;
24   }
25 }
26
27 // Memory buffer large enough for 2 blocks aligned to 16 bytes.
28 static const int kSizeOfBlock = kBlockSize * kBlockSize * kBytesPerPixel;
29 uint8_t block_buffer[kSizeOfBlock * 2 + 16];
30
31 void PrepareBuffers(uint8_t* &block1, uint8_t* &block2) {
32   block1 = reinterpret_cast<uint8_t*>
33       ((reinterpret_cast<uintptr_t>(&block_buffer[0]) + 15) & ~15);
34   GenerateData(block1, kSizeOfBlock);
35   block2 = block1 + kSizeOfBlock;
36   memcpy(block2, block1, kSizeOfBlock);
37 }
38
39 TEST(BlockDifferenceTestSame, BlockDifference) {
40   uint8_t* block1;
41   uint8_t* block2;
42   PrepareBuffers(block1, block2);
43
44   // These blocks should match.
45   for (int i = 0; i < kTimesToRun; ++i) {
46     int result = BlockDifference(block1, block2, kBlockSize * kBytesPerPixel);
47     EXPECT_EQ(0, result);
48   }
49 }
50
51 TEST(BlockDifferenceTestLast, BlockDifference) {
52   uint8_t* block1;
53   uint8_t* block2;
54   PrepareBuffers(block1, block2);
55   block2[kSizeOfBlock-2] += 1;
56
57   for (int i = 0; i < kTimesToRun; ++i) {
58     int result = BlockDifference(block1, block2, kBlockSize * kBytesPerPixel);
59     EXPECT_EQ(1, result);
60   }
61 }
62
63 TEST(BlockDifferenceTestMid, BlockDifference) {
64   uint8_t* block1;
65   uint8_t* block2;
66   PrepareBuffers(block1, block2);
67   block2[kSizeOfBlock/2+1] += 1;
68
69   for (int i = 0; i < kTimesToRun; ++i) {
70     int result = BlockDifference(block1, block2, kBlockSize * kBytesPerPixel);
71     EXPECT_EQ(1, result);
72   }
73 }
74
75 TEST(BlockDifferenceTestFirst, BlockDifference) {
76   uint8_t* block1;
77   uint8_t* block2;
78   PrepareBuffers(block1, block2);
79   block2[0] += 1;
80
81   for (int i = 0; i < kTimesToRun; ++i) {
82     int result = BlockDifference(block1, block2, kBlockSize * kBytesPerPixel);
83     EXPECT_EQ(1, result);
84   }
85 }
86
87 }  // namespace webrtc