Utils_test.cpp revision fba972f9d7f87c47ac0820b7f99420acc7e5dc36
1/*
2 * Copyright 2014 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17//#define LOG_NDEBUG 0
18#define LOG_TAG "Utils_test"
19
20#include <gtest/gtest.h>
21
22#include <media/stagefright/foundation/ADebug.h>
23#include <media/stagefright/foundation/AStringUtils.h>
24#include <media/stagefright/foundation/AUtils.h>
25#include <media/stagefright/Utils.h> // for FOURCC
26
27namespace android {
28
29class UtilsTest : public ::testing::Test {
30};
31
32TEST_F(UtilsTest, TestStringUtils) {
33    ASSERT_EQ(AStringUtils::Compare("Audio", "AudioExt", 5, false), 0);
34    ASSERT_EQ(AStringUtils::Compare("Audio", "audiOExt", 5, true), 0);
35    ASSERT_NE(AStringUtils::Compare("Audio", "audioExt", 5, false), 0);
36    ASSERT_NE(AStringUtils::Compare("Audio", "AudiOExt", 5, false), 0);
37
38    ASSERT_LT(AStringUtils::Compare("Audio", "AudioExt", 7, false), 0);
39    ASSERT_LT(AStringUtils::Compare("Audio", "audiOExt", 7, true), 0);
40
41    ASSERT_GT(AStringUtils::Compare("AudioExt", "Audio", 7, false), 0);
42    ASSERT_GT(AStringUtils::Compare("audiOext", "Audio", 7, true), 0);
43
44    ASSERT_LT(AStringUtils::Compare("Audio", "Video", 5, false), 0);
45    ASSERT_LT(AStringUtils::Compare("Audio1", "Audio2", 6, false), 0);
46    ASSERT_LT(AStringUtils::Compare("audio", "VIDEO", 5, true), 0);
47    ASSERT_LT(AStringUtils::Compare("audio1", "AUDIO2", 6, true), 0);
48
49    ASSERT_GT(AStringUtils::Compare("Video", "Audio", 5, false), 0);
50    ASSERT_GT(AStringUtils::Compare("Audio2", "Audio1", 6, false), 0);
51    ASSERT_GT(AStringUtils::Compare("VIDEO", "audio", 5, true), 0);
52    ASSERT_GT(AStringUtils::Compare("AUDIO2", "audio1", 6, true), 0);
53
54    ASSERT_TRUE(AStringUtils::MatchesGlob("AudioA", 5, "AudioB", 5, false));
55    ASSERT_FALSE(AStringUtils::MatchesGlob("AudioA", 6, "AudioA", 5, false));
56    ASSERT_FALSE(AStringUtils::MatchesGlob("AudioA", 5, "AudioA", 6, false));
57    ASSERT_FALSE(AStringUtils::MatchesGlob("AudioA", 5, "audiOB", 5, false));
58    ASSERT_TRUE(AStringUtils::MatchesGlob("AudioA", 5, "audiOB", 5, true));
59    ASSERT_FALSE(AStringUtils::MatchesGlob("AudioA", 6, "AudioA", 5, true));
60    ASSERT_FALSE(AStringUtils::MatchesGlob("AudioA", 5, "AudioA", 6, true));
61
62    ASSERT_TRUE(AStringUtils::MatchesGlob("*1", 1, "String8", 6, true));
63    ASSERT_TRUE(AStringUtils::MatchesGlob("*1", 1, "String8", 6, false));
64    ASSERT_TRUE(AStringUtils::MatchesGlob("*1", 1, "String8", 0, true));
65    ASSERT_TRUE(AStringUtils::MatchesGlob("*1", 1, "String8", 0, false));
66
67    ASSERT_TRUE(AStringUtils::MatchesGlob("*ring1", 5, "String8", 6, false));
68    ASSERT_TRUE(AStringUtils::MatchesGlob("*ring2", 5, "STRING8", 6, true));
69    ASSERT_FALSE(AStringUtils::MatchesGlob("*ring4", 5, "StRing8", 6, false));
70    ASSERT_FALSE(AStringUtils::MatchesGlob("*ring5", 5, "StrinG8", 6, false));
71    ASSERT_FALSE(AStringUtils::MatchesGlob("*ring8", 5, "String8", 7, false));
72    ASSERT_FALSE(AStringUtils::MatchesGlob("*ring8", 5, "String8", 7, true));
73
74    ASSERT_TRUE(AStringUtils::MatchesGlob("Str*1", 4, "String8", 6, false));
75    ASSERT_TRUE(AStringUtils::MatchesGlob("Str*2", 4, "STRING8", 6, true));
76    ASSERT_FALSE(AStringUtils::MatchesGlob("Str*3", 4, "string8", 6, false));
77    ASSERT_FALSE(AStringUtils::MatchesGlob("Str*4", 4, "StRing8", 6, false));
78    ASSERT_FALSE(AStringUtils::MatchesGlob("Str*5", 4, "AString8", 7, false));
79    ASSERT_FALSE(AStringUtils::MatchesGlob("Str*6", 4, "AString8", 7, true));
80
81    ASSERT_TRUE(AStringUtils::MatchesGlob("Str*ng1", 6, "String8", 6, false));
82    ASSERT_FALSE(AStringUtils::MatchesGlob("Str*ng2", 6, "string8", 6, false));
83    ASSERT_FALSE(AStringUtils::MatchesGlob("Str*ng3", 6, "StRing8", 6, false));
84    ASSERT_FALSE(AStringUtils::MatchesGlob("Str*ng4", 6, "StriNg8", 6, false));
85    ASSERT_FALSE(AStringUtils::MatchesGlob("Str*ng5", 6, "StrinG8", 6, false));
86    ASSERT_TRUE(AStringUtils::MatchesGlob("Str*ng6", 6, "STRING8", 6, true));
87    ASSERT_FALSE(AStringUtils::MatchesGlob("Str*ng8", 6, "AString8", 7, false));
88    ASSERT_FALSE(AStringUtils::MatchesGlob("Str*ng1", 6, "String16", 7, false));
89    ASSERT_TRUE(AStringUtils::MatchesGlob("Str*ing9", 7, "String8", 6, false));
90    ASSERT_FALSE(AStringUtils::MatchesGlob("Str*ringA", 8, "String8", 6, false));
91    ASSERT_FALSE(AStringUtils::MatchesGlob("Str*ng8", 6, "AString8", 7, true));
92    ASSERT_FALSE(AStringUtils::MatchesGlob("Str*ng1", 6, "String16", 7, true));
93    ASSERT_TRUE(AStringUtils::MatchesGlob("Str*ing9", 7, "STRING8", 6, true));
94    ASSERT_FALSE(AStringUtils::MatchesGlob("Str*ringA", 8, "String8", 6, true));
95
96    ASSERT_TRUE(AStringUtils::MatchesGlob("*str*str1", 8, "bestrestroom", 9, false));
97    ASSERT_TRUE(AStringUtils::MatchesGlob("*str*str1", 8, "bestrestrestroom", 13, false));
98    ASSERT_FALSE(AStringUtils::MatchesGlob("*str*stro", 8, "bestrestrestroom", 14, false));
99    ASSERT_TRUE(AStringUtils::MatchesGlob("*str*str*1", 9, "bestrestrestroom", 14, false));
100    ASSERT_TRUE(AStringUtils::MatchesGlob("*str*str1", 8, "beSTReSTRoom", 9, true));
101    ASSERT_TRUE(AStringUtils::MatchesGlob("*str*str1", 8, "beSTRestreSTRoom", 13, true));
102    ASSERT_FALSE(AStringUtils::MatchesGlob("*str*stro", 8, "bestreSTReSTRoom", 14, true));
103    ASSERT_TRUE(AStringUtils::MatchesGlob("*str*str*1", 9, "bestreSTReSTRoom", 14, true));
104}
105
106TEST_F(UtilsTest, TestDebug) {
107#define LVL(x) (ADebug::Level)(x)
108    ASSERT_EQ(ADebug::GetLevelFromSettingsString("video", "", LVL(5)), LVL(5));
109    ASSERT_EQ(ADebug::GetLevelFromSettingsString("video", "   \t  \n ", LVL(2)), LVL(2));
110    ASSERT_EQ(ADebug::GetLevelFromSettingsString("video", "3", LVL(5)), LVL(3));
111    ASSERT_EQ(ADebug::GetLevelFromSettingsString("video", "3:*deo", LVL(5)), LVL(3));
112    ASSERT_EQ(ADebug::GetLevelFromSettingsString(
113            "video", "\t\n 3 \t\n:\t\n video \t\n", LVL(5)), LVL(3));
114    ASSERT_EQ(ADebug::GetLevelFromSettingsString("video", "3:*deo,2:vid*", LVL(5)), LVL(2));
115    ASSERT_EQ(ADebug::GetLevelFromSettingsString(
116            "avideo", "\t\n 3 \t\n:\t\n avideo \t\n,\t\n 2 \t\n:\t\n video \t\n", LVL(5)), LVL(3));
117    ASSERT_EQ(ADebug::GetLevelFromSettingsString(
118            "audio.omx", "4:*omx,3:*d*o*,2:audio*", LVL(5)), LVL(2));
119    ASSERT_EQ(ADebug::GetLevelFromSettingsString(
120            "video.omx", "4:*omx,3:*d*o*,2:audio*", LVL(5)), LVL(3));
121    ASSERT_EQ(ADebug::GetLevelFromSettingsString("video", "4:*omx,3:*d*o*,2:audio*", LVL(5)), LVL(3));
122    ASSERT_EQ(ADebug::GetLevelFromSettingsString("omx", "4:*omx,3:*d*o*,2:audio*", LVL(5)), LVL(4));
123#undef LVL
124}
125
126TEST_F(UtilsTest, TestFourCC) {
127    ASSERT_EQ(FOURCC('s', 't', 'm' , 'u'), 'stmu');
128}
129
130TEST_F(UtilsTest, TestMathTemplates) {
131    ASSERT_EQ(divRound(-10, -4), 3);
132    ASSERT_EQ(divRound(-11, -4), 3);
133    ASSERT_EQ(divRound(-12, -4), 3);
134    ASSERT_EQ(divRound(-13, -4), 3);
135    ASSERT_EQ(divRound(-14, -4), 4);
136
137    ASSERT_EQ(divRound(10, -4), -3);
138    ASSERT_EQ(divRound(11, -4), -3);
139    ASSERT_EQ(divRound(12, -4), -3);
140    ASSERT_EQ(divRound(13, -4), -3);
141    ASSERT_EQ(divRound(14, -4), -4);
142
143    ASSERT_EQ(divRound(-10, 4), -3);
144    ASSERT_EQ(divRound(-11, 4), -3);
145    ASSERT_EQ(divRound(-12, 4), -3);
146    ASSERT_EQ(divRound(-13, 4), -3);
147    ASSERT_EQ(divRound(-14, 4), -4);
148
149    ASSERT_EQ(divRound(10, 4), 3);
150    ASSERT_EQ(divRound(11, 4), 3);
151    ASSERT_EQ(divRound(12, 4), 3);
152    ASSERT_EQ(divRound(13, 4), 3);
153    ASSERT_EQ(divRound(14, 4), 4);
154
155    ASSERT_EQ(divUp(-11, -4), 3);
156    ASSERT_EQ(divUp(-12, -4), 3);
157    ASSERT_EQ(divUp(-13, -4), 4);
158
159    ASSERT_EQ(divUp(11, -4), -2);
160    ASSERT_EQ(divUp(12, -4), -3);
161    ASSERT_EQ(divUp(13, -4), -3);
162
163    ASSERT_EQ(divUp(-11, 4), -2);
164    ASSERT_EQ(divUp(-12, 4), -3);
165    ASSERT_EQ(divUp(-13, 4), -3);
166
167    ASSERT_EQ(divUp(11, 4), 3);
168    ASSERT_EQ(divUp(12, 4), 3);
169    ASSERT_EQ(divUp(13, 4), 4);
170
171    ASSERT_EQ(align(11, 4), 12);
172    ASSERT_EQ(align(12, 4), 12);
173    ASSERT_EQ(align(13, 4), 16);
174    ASSERT_EQ(align(11, 8), 16);
175    ASSERT_EQ(align(11, 2), 12);
176    ASSERT_EQ(align(11, 1), 11);
177
178    ASSERT_EQ(abs(5L), 5L);
179    ASSERT_EQ(abs(-25), 25);
180
181    ASSERT_EQ(min(5.6f, 6.0f), 5.6f);
182    ASSERT_EQ(min(6.0f, 5.6f), 5.6f);
183    ASSERT_EQ(min(-4.3, 8.6), -4.3);
184    ASSERT_EQ(min(8.6, -4.3), -4.3);
185
186    ASSERT_EQ(max(5.6f, 6.0f), 6.0f);
187    ASSERT_EQ(max(6.0f, 5.6f), 6.0f);
188    ASSERT_EQ(max(-4.3, 8.6), 8.6);
189    ASSERT_EQ(max(8.6, -4.3), 8.6);
190
191    ASSERT_FALSE(isInRange(-43, 86u, -44));
192    ASSERT_TRUE(isInRange(-43, 87u, -43));
193    ASSERT_TRUE(isInRange(-43, 88u, -1));
194    ASSERT_TRUE(isInRange(-43, 89u, 0));
195    ASSERT_TRUE(isInRange(-43, 90u, 46));
196    ASSERT_FALSE(isInRange(-43, 91u, 48));
197    ASSERT_FALSE(isInRange(-43, 92u, 50));
198
199    ASSERT_FALSE(isInRange(43, 86u, 42));
200    ASSERT_TRUE(isInRange(43, 87u, 43));
201    ASSERT_TRUE(isInRange(43, 88u, 44));
202    ASSERT_TRUE(isInRange(43, 89u, 131));
203    ASSERT_FALSE(isInRange(43, 90u, 133));
204    ASSERT_FALSE(isInRange(43, 91u, 135));
205
206    ASSERT_FALSE(isInRange(43u, 86u, 42u));
207    ASSERT_TRUE(isInRange(43u, 85u, 43u));
208    ASSERT_TRUE(isInRange(43u, 84u, 44u));
209    ASSERT_TRUE(isInRange(43u, 83u, 125u));
210    ASSERT_FALSE(isInRange(43u, 82u, 125u));
211    ASSERT_FALSE(isInRange(43u, 81u, 125u));
212
213    ASSERT_FALSE(isInRange(-43, ~0u, 43));
214    ASSERT_FALSE(isInRange(-43, ~0u, 44));
215    ASSERT_FALSE(isInRange(-43, ~0u, ~0));
216    ASSERT_FALSE(isInRange(-43, ~0u, 41));
217    ASSERT_FALSE(isInRange(-43, ~0u, 40));
218
219    ASSERT_FALSE(isInRange(43u, ~0u, 43u));
220    ASSERT_FALSE(isInRange(43u, ~0u, 41u));
221    ASSERT_FALSE(isInRange(43u, ~0u, 40u));
222    ASSERT_FALSE(isInRange(43u, ~0u, ~0u));
223
224    ASSERT_FALSE(isInRange(-43, 86u, -44, 0u));
225    ASSERT_FALSE(isInRange(-43, 86u, -44, 1u));
226    ASSERT_FALSE(isInRange(-43, 86u, -44, 2u));
227    ASSERT_FALSE(isInRange(-43, 86u, -44, ~0u));
228    ASSERT_TRUE(isInRange(-43, 87u, -43, 0u));
229    ASSERT_TRUE(isInRange(-43, 87u, -43, 1u));
230    ASSERT_TRUE(isInRange(-43, 87u, -43, 86u));
231    ASSERT_TRUE(isInRange(-43, 87u, -43, 87u));
232    ASSERT_FALSE(isInRange(-43, 87u, -43, 88u));
233    ASSERT_FALSE(isInRange(-43, 87u, -43, ~0u));
234    ASSERT_TRUE(isInRange(-43, 88u, -1, 0u));
235    ASSERT_TRUE(isInRange(-43, 88u, -1, 45u));
236    ASSERT_TRUE(isInRange(-43, 88u, -1, 46u));
237    ASSERT_FALSE(isInRange(-43, 88u, -1, 47u));
238    ASSERT_FALSE(isInRange(-43, 88u, -1, ~3u));
239    ASSERT_TRUE(isInRange(-43, 90u, 46, 0u));
240    ASSERT_TRUE(isInRange(-43, 90u, 46, 1u));
241    ASSERT_FALSE(isInRange(-43, 90u, 46, 2u));
242    ASSERT_FALSE(isInRange(-43, 91u, 48, 0u));
243    ASSERT_FALSE(isInRange(-43, 91u, 48, 2u));
244    ASSERT_FALSE(isInRange(-43, 91u, 48, ~6u));
245    ASSERT_FALSE(isInRange(-43, 92u, 50, 0u));
246    ASSERT_FALSE(isInRange(-43, 92u, 50, 1u));
247
248    ASSERT_FALSE(isInRange(43u, 86u, 42u, 0u));
249    ASSERT_FALSE(isInRange(43u, 86u, 42u, 1u));
250    ASSERT_FALSE(isInRange(43u, 86u, 42u, 2u));
251    ASSERT_FALSE(isInRange(43u, 86u, 42u, ~0u));
252    ASSERT_TRUE(isInRange(43u, 87u, 43u, 0u));
253    ASSERT_TRUE(isInRange(43u, 87u, 43u, 1u));
254    ASSERT_TRUE(isInRange(43u, 87u, 43u, 86u));
255    ASSERT_TRUE(isInRange(43u, 87u, 43u, 87u));
256    ASSERT_FALSE(isInRange(43u, 87u, 43u, 88u));
257    ASSERT_FALSE(isInRange(43u, 87u, 43u, ~0u));
258    ASSERT_TRUE(isInRange(43u, 88u, 60u, 0u));
259    ASSERT_TRUE(isInRange(43u, 88u, 60u, 70u));
260    ASSERT_TRUE(isInRange(43u, 88u, 60u, 71u));
261    ASSERT_FALSE(isInRange(43u, 88u, 60u, 72u));
262    ASSERT_FALSE(isInRange(43u, 88u, 60u, ~3u));
263    ASSERT_TRUE(isInRange(43u, 90u, 132u, 0u));
264    ASSERT_TRUE(isInRange(43u, 90u, 132u, 1u));
265    ASSERT_FALSE(isInRange(43u, 90u, 132u, 2u));
266    ASSERT_FALSE(isInRange(43u, 91u, 134u, 0u));
267    ASSERT_FALSE(isInRange(43u, 91u, 134u, 2u));
268    ASSERT_FALSE(isInRange(43u, 91u, 134u, ~6u));
269    ASSERT_FALSE(isInRange(43u, 92u, 136u, 0u));
270    ASSERT_FALSE(isInRange(43u, 92u, 136u, 1u));
271
272    ASSERT_EQ(periodicError(124, 100), 24);
273    ASSERT_EQ(periodicError(288, 100), 12);
274    ASSERT_EQ(periodicError(-345, 100), 45);
275    ASSERT_EQ(periodicError(-493, 100), 7);
276    ASSERT_EQ(periodicError(-550, 100), 50);
277    ASSERT_EQ(periodicError(-600, 100), 0);
278}
279
280} // namespace android
281