2 * Copyright (c) 2022 Samsung Electronics Co., Ltd.
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
18 #include <dali-test-suite-utils.h>
19 #include <dali/devel-api/common/hash.h>
26 Dali::Vector<std::uint8_t> ConverterVector(const std::vector<std::uint8_t>& v)
28 Dali::Vector<std::uint8_t> res;
29 for(const auto it : v)
37 void utc_dali_hash_startup(void)
39 test_return_value = TET_UNDEF;
42 void utc_dali_hash_cleanup(void)
44 test_return_value = TET_PASS;
49 // To fully test the Hash distribution we need to use a tool like http://code.google.com/p/smhasher/
50 // DALi currently uses the hash for variable length strings which come from:
51 // shader vert+frag source, font family + style, image filename.
52 TestApplication application;
54 tet_infoline("UtcDaliHash");
56 const std::string testString1("highp vec4 glowColor = vec4( uGlowColor.rgb, uGlowColor.a * clampedColor.a );");
57 const std::string testString2("lowp vec4 glowColor = vec4( uGlowColor.rgb, uGlowColor.a * clampedColor.a );");
59 DALI_TEST_CHECK(Dali::CalculateHash(testString1) != Dali::CalculateHash(testString2));
60 DALI_TEST_CHECK(Dali::CalculateHash(testString1, testString2) != Dali::CalculateHash(testString2, testString1));
65 int UtcDaliHashNegative(void)
67 // negative test, check hash value == initial value
68 const std::string emptyString;
70 DALI_TEST_CHECK(Dali::CalculateHash(emptyString) != 0);
71 DALI_TEST_CHECK(Dali::CalculateHash(emptyString, emptyString) != 0);
76 int UtcDaliHashBuffer(void)
78 TestApplication application;
80 tet_infoline("UtcDaliHashBuffer");
82 const std::vector<std::uint8_t> testBuffer1 = {11, 22, 33, 0, 0};
83 const std::vector<std::uint8_t> testBuffer2 = {11, 22, 33};
84 const std::vector<std::uint8_t> testBuffer3 = {0, 0, 33, 22, 11};
85 const std::vector<std::uint8_t> testBuffer4 = {};
87 const std::string testString1 = std::string(testBuffer1.begin(), testBuffer1.end());
88 const std::string testString2 = std::string(testBuffer2.begin(), testBuffer2.end());
89 const std::string testString3 = std::string(testBuffer3.begin(), testBuffer3.end());
90 const std::string testString4 = std::string(testBuffer4.begin(), testBuffer4.end());
92 tet_printf("const char * type terminate by \\0 char. we cannot seperate two buffer only by std::string().c_str()\n");
93 DALI_TEST_CHECK(Dali::CalculateHash(testString1) == Dali::CalculateHash(testString2));
94 DALI_TEST_CHECK(Dali::CalculateHash(testString3) == Dali::CalculateHash(testString4));
96 tet_printf("To fix this limitation, we make one more API for hashing std::vector<std::uint8_t>\n");
97 DALI_TEST_CHECK(Dali::CalculateHash(testBuffer1) != Dali::CalculateHash(testBuffer2));
98 DALI_TEST_CHECK(Dali::CalculateHash(testBuffer1) != Dali::CalculateHash(testBuffer3));
99 DALI_TEST_CHECK(Dali::CalculateHash(testBuffer1) != Dali::CalculateHash(testBuffer4));
100 DALI_TEST_CHECK(Dali::CalculateHash(testBuffer2) != Dali::CalculateHash(testBuffer3));
101 DALI_TEST_CHECK(Dali::CalculateHash(testBuffer2) != Dali::CalculateHash(testBuffer4));
102 DALI_TEST_CHECK(Dali::CalculateHash(testBuffer3) != Dali::CalculateHash(testBuffer4));
107 int UtcDaliHashBuffer02(void)
109 TestApplication application;
111 tet_infoline("UtcDaliHashBuffer02");
112 tet_infoline("Same string must have same hash value. even though generated by std::string and std::vector<std::uint8_t>.");
114 const std::string testString("highp vec4 glowColor = vec4( uGlowColor.rgb, uGlowColor.a * clampedColor.a );");
115 const std::vector<std::uint8_t> testBuffer = std::vector<std::uint8_t>(testString.begin(), testString.end());
117 DALI_TEST_CHECK(Dali::CalculateHash(testString) == Dali::CalculateHash(testBuffer));
122 int UtcDaliHashBufferNegative(void)
124 // negative test, check hash value == initial value
125 const std::vector<std::uint8_t> emptyBuffer;
126 const std::vector<std::uint8_t> notEmptyBuffer1{0};
127 const std::vector<std::uint8_t> notEmptyBuffer2{0, 0};
129 // Check with zero-only buffers also did not zero.
130 DALI_TEST_CHECK(Dali::CalculateHash(emptyBuffer) != 0);
131 DALI_TEST_CHECK(Dali::CalculateHash(notEmptyBuffer1) != 0);
132 DALI_TEST_CHECK(Dali::CalculateHash(notEmptyBuffer2) != 0);
134 // Check with zero-only buffers with difference lengths have difference value each other.
135 DALI_TEST_CHECK(Dali::CalculateHash(emptyBuffer) != Dali::CalculateHash(notEmptyBuffer1));
136 DALI_TEST_CHECK(Dali::CalculateHash(emptyBuffer) != Dali::CalculateHash(notEmptyBuffer2));
137 DALI_TEST_CHECK(Dali::CalculateHash(notEmptyBuffer1) != Dali::CalculateHash(notEmptyBuffer2));
142 int UtcDaliHashDaliBuffer(void)
144 TestApplication application;
146 tet_infoline("UtcDaliHashDaliBuffer");
148 Dali::Vector<std::uint8_t> testBuffer1 = ConverterVector({11, 22, 33, 0, 0});
149 Dali::Vector<std::uint8_t> testBuffer2 = ConverterVector({11, 22, 33});
150 Dali::Vector<std::uint8_t> testBuffer3 = ConverterVector({0, 0, 33, 22, 11});
151 Dali::Vector<std::uint8_t> testBuffer4 = ConverterVector({});
153 DALI_TEST_CHECK(Dali::CalculateHash(testBuffer1) != Dali::CalculateHash(testBuffer2));
154 DALI_TEST_CHECK(Dali::CalculateHash(testBuffer1) != Dali::CalculateHash(testBuffer3));
155 DALI_TEST_CHECK(Dali::CalculateHash(testBuffer1) != Dali::CalculateHash(testBuffer4));
156 DALI_TEST_CHECK(Dali::CalculateHash(testBuffer2) != Dali::CalculateHash(testBuffer3));
157 DALI_TEST_CHECK(Dali::CalculateHash(testBuffer2) != Dali::CalculateHash(testBuffer4));
158 DALI_TEST_CHECK(Dali::CalculateHash(testBuffer3) != Dali::CalculateHash(testBuffer4));
163 int UtcDaliHashDaliBuffer02(void)
165 TestApplication application;
167 tet_infoline("UtcDaliHashDaliBuffer02");
168 tet_infoline("Same string must have same hash value. even though generated by std::string and std::vector<std::uint8_t> and Dali::Vector<std::uint8_t>.");
170 const std::string testString("highp vec4 glowColor = vec4( uGlowColor.rgb, uGlowColor.a * clampedColor.a );");
171 const std::vector<std::uint8_t> testBuffer = std::vector<std::uint8_t>(testString.begin(), testString.end());
172 const Dali::Vector<std::uint8_t> testBuffer2 = ConverterVector(testBuffer);
174 DALI_TEST_CHECK(Dali::CalculateHash(testString) == Dali::CalculateHash(testBuffer2));
175 DALI_TEST_CHECK(Dali::CalculateHash(testBuffer) == Dali::CalculateHash(testBuffer2));
180 int UtcDaliHashDaliBufferNegative(void)
182 // negative test, check hash value == initial value
183 const Dali::Vector<std::uint8_t> emptyBuffer;
184 const Dali::Vector<std::uint8_t> notEmptyBuffer1 = ConverterVector({0});
185 const Dali::Vector<std::uint8_t> notEmptyBuffer2 = ConverterVector({0, 0});
187 // Check with zero-only buffers also did not zero.
188 DALI_TEST_CHECK(Dali::CalculateHash(emptyBuffer) != 0);
189 DALI_TEST_CHECK(Dali::CalculateHash(notEmptyBuffer1) != 0);
190 DALI_TEST_CHECK(Dali::CalculateHash(notEmptyBuffer2) != 0);
192 // Check with zero-only buffers with difference lengths have difference value each other.
193 DALI_TEST_CHECK(Dali::CalculateHash(emptyBuffer) != Dali::CalculateHash(notEmptyBuffer1));
194 DALI_TEST_CHECK(Dali::CalculateHash(emptyBuffer) != Dali::CalculateHash(notEmptyBuffer2));
195 DALI_TEST_CHECK(Dali::CalculateHash(notEmptyBuffer1) != Dali::CalculateHash(notEmptyBuffer2));