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

Side by Side Diff: content/browser/indexed_db/indexed_db_leveldb_coding_unittest.cc

Issue 15564008: Migrate the IndexedDB backend from Blink to Chromium (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Accessor naming, use LevelDBSlice ctor explicitly Created 7 years, 7 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
OLDNEW
(Empty)
1 // Copyright (c) 2013 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 "content/browser/indexed_db/indexed_db_leveldb_coding.h"
6
7 #include <vector>
8
9 #include "base/string16.h"
10 #include "base/strings/utf_string_conversions.h"
11 #include "content/browser/indexed_db/leveldb/leveldb_slice.h"
12 #include "content/common/indexed_db/indexed_db_key.h"
13 #include "content/common/indexed_db/indexed_db_key_path.h"
14 #include "testing/gtest/include/gtest/gtest.h"
15
16 using namespace content;
17 using namespace IndexedDBLevelDBCoding;
18 using WebKit::WebIDBKey;
19 using WebKit::WebIDBKeyPath;
20
21 namespace {
22
23 #ifndef INT32_MAX
24 #define INT32_MAX 0x7fffffffL
25 #endif
26
27 static IndexedDBKey CreateArrayIDBKey() {
28 return IndexedDBKey(IndexedDBKey::KeyArray());
29 }
30
31 static IndexedDBKey CreateArrayIDBKey(const IndexedDBKey& key1) {
32
33 IndexedDBKey::KeyArray array;
34 array.push_back(key1);
35 return IndexedDBKey(array);
36 }
37
38 static IndexedDBKey CreateArrayIDBKey(const IndexedDBKey& key1,
39 const IndexedDBKey& key2) {
40
41 IndexedDBKey::KeyArray array;
42 array.push_back(key1);
43 array.push_back(key2);
44 return IndexedDBKey(array);
45 }
46
47 TEST(IndexedDBLevelDBCodingTest, EncodeByte) {
48 std::vector<char> expected;
49 expected.push_back(0);
50 unsigned char c;
51
52 c = 0;
53 expected[0] = c;
54 EXPECT_EQ(expected, EncodeByte(c));
55
56 c = 1;
57 expected[0] = c;
58 EXPECT_EQ(expected, EncodeByte(c));
59
60 c = 255;
61 expected[0] = c;
62 EXPECT_EQ(expected, EncodeByte(c));
63 }
64
65 TEST(IndexedDBLevelDBCodingTest, DecodeByte) {
66 std::vector<unsigned char> test_cases;
67 test_cases.push_back(0);
68 test_cases.push_back(1);
69 test_cases.push_back(255);
70
71 for (size_t i = 0; i < test_cases.size(); ++i) {
72 unsigned char n = test_cases[i];
73 std::vector<char> v = EncodeByte(n);
74
75 unsigned char res;
76 const char* p = DecodeByte(v.data(), v.data() + v.size(), res);
77 EXPECT_EQ(n, res);
78 EXPECT_EQ(v.data() + v.size(), p);
79 }
80 }
81
82 TEST(IndexedDBLevelDBCodingTest, EncodeBool) {
83 {
84 std::vector<char> expected;
85 expected.push_back(1);
86 EXPECT_EQ(expected, EncodeBool(true));
87 }
88 {
89 std::vector<char> expected;
90 expected.push_back(0);
91 EXPECT_EQ(expected, EncodeBool(false));
92 }
93 }
94
95 static int CompareKeys(const std::vector<char>& a, const std::vector<char>& b) {
96 bool ok;
97 int result = CompareEncodedIDBKeys(a, b, ok);
98 EXPECT_TRUE(ok);
99 return result;
100 }
101
102 TEST(IndexedDBLevelDBCodingTest, MaxIDBKey) {
103 std::vector<char> max_key = MaxIDBKey();
104
105 std::vector<char> min_key = MinIDBKey();
106 std::vector<char> array_key =
107 EncodeIDBKey(IndexedDBKey(IndexedDBKey::KeyArray()));
108 std::vector<char> string_key =
109 EncodeIDBKey(IndexedDBKey(ASCIIToUTF16("Hello world")));
110 std::vector<char> number_key =
111 EncodeIDBKey(IndexedDBKey(3.14, WebIDBKey::NumberType));
112 std::vector<char> date_key =
113 EncodeIDBKey(IndexedDBKey(1000000, WebIDBKey::DateType));
114
115 EXPECT_GT(CompareKeys(max_key, min_key), 0);
116 EXPECT_GT(CompareKeys(max_key, array_key), 0);
117 EXPECT_GT(CompareKeys(max_key, string_key), 0);
118 EXPECT_GT(CompareKeys(max_key, number_key), 0);
119 EXPECT_GT(CompareKeys(max_key, date_key), 0);
120 }
121
122 TEST(IndexedDBLevelDBCodingTest, MinIDBKey) {
123 std::vector<char> min_key = MinIDBKey();
124
125 std::vector<char> max_key = MaxIDBKey();
126 std::vector<char> array_key =
127 EncodeIDBKey(IndexedDBKey(IndexedDBKey::KeyArray()));
128 std::vector<char> string_key =
129 EncodeIDBKey(IndexedDBKey(ASCIIToUTF16("Hello world")));
130 std::vector<char> number_key =
131 EncodeIDBKey(IndexedDBKey(3.14, WebIDBKey::NumberType));
132 std::vector<char> date_key =
133 EncodeIDBKey(IndexedDBKey(1000000, WebIDBKey::DateType));
134
135 EXPECT_LT(CompareKeys(min_key, max_key), 0);
136 EXPECT_LT(CompareKeys(min_key, array_key), 0);
137 EXPECT_LT(CompareKeys(min_key, string_key), 0);
138 EXPECT_LT(CompareKeys(min_key, number_key), 0);
139 EXPECT_LT(CompareKeys(min_key, date_key), 0);
140 }
141
142 TEST(IndexedDBLevelDBCodingTest, EncodeInt) {
143 EXPECT_EQ(static_cast<size_t>(1), EncodeInt(0).size());
144 EXPECT_EQ(static_cast<size_t>(1), EncodeInt(1).size());
145 EXPECT_EQ(static_cast<size_t>(1), EncodeInt(255).size());
146 EXPECT_EQ(static_cast<size_t>(2), EncodeInt(256).size());
147 EXPECT_EQ(static_cast<size_t>(4), EncodeInt(0xffffffff).size());
148 #ifdef NDEBUG
149 EXPECT_EQ(static_cast<size_t>(8), EncodeInt(-1).size());
150 #endif
151 }
152
153 TEST(IndexedDBLevelDBCodingTest, DecodeBool) {
154 {
155 std::vector<char> encoded;
156 encoded.push_back(1);
157 EXPECT_TRUE(DecodeBool(encoded.data(), encoded.data() + encoded.size()));
158 }
159 {
160 std::vector<char> encoded;
161 encoded.push_back(0);
162 EXPECT_FALSE(DecodeBool(encoded.data(), encoded.data() + encoded.size()));
163 }
164 }
165
166 TEST(IndexedDBLevelDBCodingTest, DecodeInt) {
167 std::vector<int64_t> test_cases;
168 test_cases.push_back(0);
169 test_cases.push_back(1);
170 test_cases.push_back(255);
171 test_cases.push_back(256);
172 test_cases.push_back(65535);
173 test_cases.push_back(655536);
174 test_cases.push_back(7711192431755665792ll);
175 test_cases.push_back(0x7fffffffffffffffll);
176 #ifdef NDEBUG
177 test_cases.push_back(-3);
178 #endif
179
180 for (size_t i = 0; i < test_cases.size(); ++i) {
181 int64_t n = test_cases[i];
182 std::vector<char> v = EncodeInt(n);
183 EXPECT_EQ(n, DecodeInt(v.data(), v.data() + v.size()));
184 }
185 }
186
187 TEST(IndexedDBLevelDBCodingTest, EncodeVarInt) {
188 EXPECT_EQ(static_cast<size_t>(1), EncodeVarInt(0).size());
189 EXPECT_EQ(static_cast<size_t>(1), EncodeVarInt(1).size());
190 EXPECT_EQ(static_cast<size_t>(2), EncodeVarInt(255).size());
191 EXPECT_EQ(static_cast<size_t>(2), EncodeVarInt(256).size());
192 EXPECT_EQ(static_cast<size_t>(5), EncodeVarInt(0xffffffff).size());
193 EXPECT_EQ(static_cast<size_t>(8), EncodeVarInt(0xfffffffffffffLL).size());
194 EXPECT_EQ(static_cast<size_t>(9), EncodeVarInt(0x7fffffffffffffffLL).size());
195 #ifdef NDEBUG
196 EXPECT_EQ(static_cast<size_t>(10), EncodeVarInt(-100).size());
197 #endif
198 }
199
200 TEST(IndexedDBLevelDBCodingTest, DecodeVarInt) {
201 std::vector<int64_t> test_cases;
202 test_cases.push_back(0);
203 test_cases.push_back(1);
204 test_cases.push_back(255);
205 test_cases.push_back(256);
206 test_cases.push_back(65535);
207 test_cases.push_back(655536);
208 test_cases.push_back(7711192431755665792ll);
209 test_cases.push_back(0x7fffffffffffffffll);
210 #ifdef NDEBUG
211 test_cases.push_back(-3);
212 #endif
213
214 for (size_t i = 0; i < test_cases.size(); ++i) {
215 int64_t n = test_cases[i];
216 std::vector<char> v = EncodeVarInt(n);
217
218 int64_t res;
219 const char* p = DecodeVarInt(v.data(), v.data() + v.size(), res);
220 EXPECT_EQ(n, res);
221 EXPECT_EQ(v.data() + v.size(), p);
222
223 p = DecodeVarInt(v.data(), v.data() + v.size() - 1, res);
224 EXPECT_EQ(0, p);
225 p = DecodeVarInt(v.data(), v.data(), res);
226 EXPECT_EQ(0, p);
227 }
228 }
229
230 TEST(IndexedDBLevelDBCodingTest, EncodeString) {
231 const char16 test_string_a[] = { 'f', 'o', 'o', '\0' };
232 const char16 test_string_b[] = { 0xdead, 0xbeef, '\0' };
233
234 EXPECT_EQ(static_cast<size_t>(0), EncodeString(ASCIIToUTF16("")).size());
235 EXPECT_EQ(static_cast<size_t>(2), EncodeString(ASCIIToUTF16("a")).size());
236 EXPECT_EQ(static_cast<size_t>(6), EncodeString(ASCIIToUTF16("foo")).size());
237 EXPECT_EQ(static_cast<size_t>(6),
238 EncodeString(string16(test_string_a)).size());
239 EXPECT_EQ(static_cast<size_t>(4),
240 EncodeString(string16(test_string_b)).size());
241 }
242
243 TEST(IndexedDBLevelDBCodingTest, DecodeString) {
244 const char16 test_string_a[] = { 'f', 'o', 'o', '\0' };
245 const char16 test_string_b[] = { 0xdead, 0xbeef, '\0' };
246 std::vector<char> v;
247
248 v = EncodeString(string16());
249 EXPECT_EQ(string16(), DecodeString(v.data(), v.data() + v.size()));
250
251 v = EncodeString(ASCIIToUTF16("a"));
252 EXPECT_EQ(ASCIIToUTF16("a"), DecodeString(v.data(), v.data() + v.size()));
253
254 v = EncodeString(ASCIIToUTF16("foo"));
255 EXPECT_EQ(ASCIIToUTF16("foo"), DecodeString(v.data(), v.data() + v.size()));
256
257 v = EncodeString(string16(test_string_a));
258 EXPECT_EQ(string16(test_string_a),
259 DecodeString(v.data(), v.data() + v.size()));
260
261 v = EncodeString(string16(test_string_b));
262 EXPECT_EQ(string16(test_string_b),
263 DecodeString(v.data(), v.data() + v.size()));
264 }
265
266 TEST(IndexedDBLevelDBCodingTest, EncodeStringWithLength) {
267 const char16 test_string_a[] = { 'f', 'o', 'o', '\0' };
268 const char16 test_string_b[] = { 0xdead, 0xbeef, '\0' };
269
270 EXPECT_EQ(static_cast<size_t>(1), EncodeStringWithLength(string16()).size());
271 EXPECT_EQ(static_cast<size_t>(3),
272 EncodeStringWithLength(ASCIIToUTF16("a")).size());
273 EXPECT_EQ(static_cast<size_t>(7),
274 EncodeStringWithLength(string16(test_string_a)).size());
275 EXPECT_EQ(static_cast<size_t>(5),
276 EncodeStringWithLength(string16(test_string_b)).size());
277 }
278
279 TEST(IndexedDBLevelDBCodingTest, DecodeStringWithLength) {
280 const char16 test_string_a[] = { 'f', 'o', 'o', '\0' };
281 const char16 test_string_b[] = { 0xdead, 0xbeef, '\0' };
282
283 const int kLongStringLen = 1234;
284 char16 long_string[kLongStringLen + 1];
285 for (int i = 0; i < kLongStringLen; ++i)
286 long_string[i] = i;
287 long_string[kLongStringLen] = 0;
288
289 std::vector<string16> test_cases;
290 test_cases.push_back(ASCIIToUTF16(""));
291 test_cases.push_back(ASCIIToUTF16("a"));
292 test_cases.push_back(ASCIIToUTF16("foo"));
293 test_cases.push_back(string16(test_string_a));
294 test_cases.push_back(string16(test_string_b));
295 test_cases.push_back(string16(long_string));
296
297 for (size_t i = 0; i < test_cases.size(); ++i) {
298 string16 s = test_cases[i];
299 std::vector<char> v = EncodeStringWithLength(s);
300 string16 res;
301 const char* p = DecodeStringWithLength(v.data(), v.data() + v.size(), res);
302 EXPECT_EQ(s, res);
303 EXPECT_EQ(v.data() + v.size(), p);
304
305 EXPECT_EQ(0,
306 DecodeStringWithLength(v.data(), v.data() + v.size() - 1, res));
307 EXPECT_EQ(0, DecodeStringWithLength(v.data(), v.data(), res));
308 }
309 }
310
311 static int CompareStrings(const char* p,
312 const char* limit_p,
313 const char* q,
314 const char* limit_q) {
315 bool ok;
316 int result = CompareEncodedStringsWithLength(p, limit_p, q, limit_q, ok);
317 EXPECT_TRUE(ok);
318 EXPECT_EQ(p, limit_p);
319 EXPECT_EQ(q, limit_q);
320 return result;
321 }
322
323 TEST(IndexedDBLevelDBCodingTest, CompareEncodedStringsWithLength) {
324 const char16 test_string_a[] = { 0x1000, 0x1000, '\0' };
325 const char16 test_string_b[] = { 0x1000, 0x1000, 0x1000, '\0' };
326 const char16 test_string_c[] = { 0x1000, 0x1000, 0x1001, '\0' };
327 const char16 test_string_d[] = { 0x1001, 0x1000, 0x1000, '\0' };
328 const char16 test_string_e[] = { 0xd834, 0xdd1e, '\0' };
329 const char16 test_string_f[] = { 0xfffd, '\0' };
330
331 std::vector<string16> test_cases;
332 test_cases.push_back(ASCIIToUTF16(""));
333 test_cases.push_back(ASCIIToUTF16("a"));
334 test_cases.push_back(ASCIIToUTF16("b"));
335 test_cases.push_back(ASCIIToUTF16("baaa"));
336 test_cases.push_back(ASCIIToUTF16("baab"));
337 test_cases.push_back(ASCIIToUTF16("c"));
338 test_cases.push_back(string16(test_string_a));
339 test_cases.push_back(string16(test_string_b));
340 test_cases.push_back(string16(test_string_c));
341 test_cases.push_back(string16(test_string_d));
342 test_cases.push_back(string16(test_string_e));
343 test_cases.push_back(string16(test_string_f));
344
345 for (size_t i = 0; i < test_cases.size() - 1; ++i) {
346 string16 a = test_cases[i];
347 string16 b = test_cases[i + 1];
348
349 EXPECT_LT(a.compare(b), 0);
350 EXPECT_GT(b.compare(a), 0);
351 EXPECT_EQ(a.compare(a), 0);
352 EXPECT_EQ(b.compare(b), 0);
353
354 std::vector<char> encoded_a = EncodeStringWithLength(a);
355 EXPECT_TRUE(encoded_a.size());
356 std::vector<char> encoded_b = EncodeStringWithLength(b);
357 EXPECT_TRUE(encoded_a.size());
358
359 const char* p = encoded_a.data();
360 const char* limit_p = p + encoded_a.size();
361 const char* q = encoded_b.data();
362 const char* limit_q = q + encoded_b.size();
363
364 EXPECT_LT(CompareStrings(p, limit_p, q, limit_q), 0);
365 EXPECT_GT(CompareStrings(q, limit_q, p, limit_p), 0);
366 EXPECT_EQ(CompareStrings(p, limit_p, p, limit_p), 0);
367 EXPECT_EQ(CompareStrings(q, limit_q, q, limit_q), 0);
368 }
369 }
370
371 TEST(IndexedDBLevelDBCodingTest, EncodeDouble) {
372 EXPECT_EQ(static_cast<size_t>(8), EncodeDouble(0).size());
373 EXPECT_EQ(static_cast<size_t>(8), EncodeDouble(3.14).size());
374 }
375
376 TEST(IndexedDBLevelDBCodingTest, DecodeDouble) {
377 std::vector<char> v;
378 const char* p;
379 double d;
380
381 v = EncodeDouble(3.14);
382 p = DecodeDouble(v.data(), v.data() + v.size(), &d);
383 EXPECT_EQ(3.14, d);
384 EXPECT_EQ(v.data() + v.size(), p);
385
386 v = EncodeDouble(-3.14);
387 p = DecodeDouble(v.data(), v.data() + v.size(), &d);
388 EXPECT_EQ(-3.14, d);
389 EXPECT_EQ(v.data() + v.size(), p);
390
391 v = EncodeDouble(3.14);
392 p = DecodeDouble(v.data(), v.data() + v.size() - 1, &d);
393 EXPECT_EQ(0, p);
394 }
395
396 TEST(IndexedDBLevelDBCodingTest, EncodeDecodeIDBKey) {
397 IndexedDBKey expected_key;
398 scoped_ptr<IndexedDBKey> decoded_key;
399 std::vector<char> v;
400 const char* p;
401
402 expected_key = IndexedDBKey(1234, WebIDBKey::NumberType);
403 v = EncodeIDBKey(expected_key);
404 p = DecodeIDBKey(v.data(), v.data() + v.size(), &decoded_key);
405 EXPECT_TRUE(decoded_key->IsEqual(expected_key));
406 EXPECT_EQ(v.data() + v.size(), p);
407 EXPECT_EQ(0, DecodeIDBKey(v.data(), v.data() + v.size() - 1, &decoded_key));
408
409 expected_key = IndexedDBKey(ASCIIToUTF16("Hello World!"));
410 v = EncodeIDBKey(expected_key);
411 p = DecodeIDBKey(v.data(), v.data() + v.size(), &decoded_key);
412 EXPECT_TRUE(decoded_key->IsEqual(expected_key));
413 EXPECT_EQ(v.data() + v.size(), p);
414 EXPECT_EQ(0, DecodeIDBKey(v.data(), v.data() + v.size() - 1, &decoded_key));
415
416 expected_key = IndexedDBKey(IndexedDBKey::KeyArray());
417 v = EncodeIDBKey(expected_key);
418 p = DecodeIDBKey(v.data(), v.data() + v.size(), &decoded_key);
419 EXPECT_TRUE(decoded_key->IsEqual(expected_key));
420 EXPECT_EQ(v.data() + v.size(), p);
421 EXPECT_EQ(0, DecodeIDBKey(v.data(), v.data() + v.size() - 1, &decoded_key));
422
423 expected_key = IndexedDBKey(7890, WebIDBKey::DateType);
424 v = EncodeIDBKey(expected_key);
425 p = DecodeIDBKey(v.data(), v.data() + v.size(), &decoded_key);
426 EXPECT_TRUE(decoded_key->IsEqual(expected_key));
427 EXPECT_EQ(v.data() + v.size(), p);
428 EXPECT_EQ(0, DecodeIDBKey(v.data(), v.data() + v.size() - 1, &decoded_key));
429
430 IndexedDBKey::KeyArray array;
431 array.push_back(IndexedDBKey(1234, WebIDBKey::NumberType));
432 array.push_back(IndexedDBKey(ASCIIToUTF16("Hello World!")));
433 array.push_back(IndexedDBKey(7890, WebIDBKey::DateType));
434 expected_key = IndexedDBKey(array);
435 v = EncodeIDBKey(expected_key);
436 p = DecodeIDBKey(v.data(), v.data() + v.size(), &decoded_key);
437 EXPECT_TRUE(decoded_key->IsEqual(expected_key));
438 EXPECT_EQ(v.data() + v.size(), p);
439 EXPECT_EQ(0, DecodeIDBKey(v.data(), v.data() + v.size() - 1, &decoded_key));
440 }
441
442 TEST(IndexedDBLevelDBCodingTest, EncodeIDBKeyPath) {
443 const unsigned char kIDBKeyPathTypeCodedByte1 = 0;
444 const unsigned char kIDBKeyPathTypeCodedByte2 = 0;
445 {
446 IndexedDBKeyPath key_path;
447 EXPECT_EQ(key_path.type(), WebIDBKeyPath::NullType);
448 std::vector<char> v = EncodeIDBKeyPath(key_path);
449 EXPECT_EQ(v.size(), 3U);
450 EXPECT_EQ(v[0], kIDBKeyPathTypeCodedByte1);
451 EXPECT_EQ(v[1], kIDBKeyPathTypeCodedByte2);
452 EXPECT_EQ(v[2], WebIDBKeyPath::NullType);
453 }
454
455 {
456 std::vector<string16> test_cases;
457 test_cases.push_back(string16());
458 test_cases.push_back(ASCIIToUTF16("foo"));
459 test_cases.push_back(ASCIIToUTF16("foo.bar"));
460
461 for (size_t i = 0; i < test_cases.size(); ++i) {
462 IndexedDBKeyPath key_path = IndexedDBKeyPath(test_cases[i]);
463 std::vector<char> v = EncodeIDBKeyPath(key_path);
464 EXPECT_EQ(v.size(), EncodeStringWithLength(test_cases[i]).size() + 3);
465 const char* p = v.data();
466 const char* limit = v.data() + v.size();
467 EXPECT_EQ(*p++, kIDBKeyPathTypeCodedByte1);
468 EXPECT_EQ(*p++, kIDBKeyPathTypeCodedByte2);
469 EXPECT_EQ(*p++, WebIDBKeyPath::StringType);
470 string16 string;
471 p = DecodeStringWithLength(p, limit, string);
472 EXPECT_EQ(string, test_cases[i]);
473 EXPECT_EQ(p, limit);
474 }
475 }
476
477 {
478 std::vector<string16> test_case;
479 test_case.push_back(string16());
480 test_case.push_back(ASCIIToUTF16("foo"));
481 test_case.push_back(ASCIIToUTF16("foo.bar"));
482
483 IndexedDBKeyPath key_path(test_case);
484 EXPECT_EQ(key_path.type(), WebIDBKeyPath::ArrayType);
485 std::vector<char> v = EncodeIDBKeyPath(key_path);
486 const char* p = v.data();
487 const char* limit = v.data() + v.size();
488 EXPECT_EQ(*p++, kIDBKeyPathTypeCodedByte1);
489 EXPECT_EQ(*p++, kIDBKeyPathTypeCodedByte2);
490 EXPECT_EQ(*p++, WebIDBKeyPath::ArrayType);
491 int64_t count;
492 p = DecodeVarInt(p, limit, count);
493 EXPECT_EQ(count, static_cast<int64_t>(test_case.size()));
494 for (size_t i = 0; i < static_cast<size_t>(count); ++i) {
495 string16 string;
496 p = DecodeStringWithLength(p, limit, string);
497 EXPECT_EQ(string, test_case[i]);
498 }
499 EXPECT_EQ(p, limit);
500 }
501 }
502
503 TEST(IndexedDBLevelDBCodingTest, DecodeIDBKeyPath) {
504 const unsigned char kIDBKeyPathTypeCodedByte1 = 0;
505 const unsigned char kIDBKeyPathTypeCodedByte2 = 0;
506 {
507 // Legacy encoding of string key paths.
508 std::vector<string16> test_cases;
509 test_cases.push_back(string16());
510 test_cases.push_back(ASCIIToUTF16("foo"));
511 test_cases.push_back(ASCIIToUTF16("foo.bar"));
512
513 for (size_t i = 0; i < test_cases.size(); ++i) {
514 std::vector<char> v = EncodeString(test_cases[i]);
515 IndexedDBKeyPath key_path =
516 DecodeIDBKeyPath(v.data(), v.data() + v.size());
517 EXPECT_EQ(key_path.type(), WebIDBKeyPath::StringType);
518 EXPECT_EQ(test_cases[i], key_path.string());
519 }
520 }
521 {
522 std::vector<char> v;
523 v.push_back(kIDBKeyPathTypeCodedByte1);
524 v.push_back(kIDBKeyPathTypeCodedByte2);
525 v.push_back(WebIDBKeyPath::NullType);
526 IndexedDBKeyPath key_path = DecodeIDBKeyPath(v.data(), v.data() + v.size());
527 EXPECT_EQ(key_path.type(), WebIDBKeyPath::NullType);
528 EXPECT_TRUE(key_path.IsNull());
529 }
530 {
531 std::vector<string16> test_cases;
532 test_cases.push_back(string16());
533 test_cases.push_back(ASCIIToUTF16("foo"));
534 test_cases.push_back(ASCIIToUTF16("foo.bar"));
535
536 for (size_t i = 0; i < test_cases.size(); ++i) {
537 std::vector<char> v;
538 v.push_back(kIDBKeyPathTypeCodedByte1);
539 v.push_back(kIDBKeyPathTypeCodedByte2);
540 v.push_back(WebIDBKeyPath::StringType);
541 std::vector<char> test_case = EncodeStringWithLength(test_cases[i]);
542 v.insert(v.end(), test_case.begin(), test_case.end());
543 IndexedDBKeyPath key_path =
544 DecodeIDBKeyPath(v.data(), v.data() + v.size());
545 EXPECT_EQ(key_path.type(), WebIDBKeyPath::StringType);
546 EXPECT_EQ(test_cases[i], key_path.string());
547 }
548 }
549 {
550 std::vector<string16> test_case;
551 test_case.push_back(string16());
552 test_case.push_back(ASCIIToUTF16("foo"));
553 test_case.push_back(ASCIIToUTF16("foo.bar"));
554
555 std::vector<char> v;
556 v.push_back(kIDBKeyPathTypeCodedByte1);
557 v.push_back(kIDBKeyPathTypeCodedByte2);
558 v.push_back(WebIDBKeyPath::ArrayType);
559 std::vector<char> int_value = EncodeVarInt(test_case.size());
560 v.insert(v.end(), int_value.begin(), int_value.end());
561 for (size_t i = 0; i < test_case.size(); ++i) {
562 std::vector<char> test_case_value = EncodeStringWithLength(test_case[i]);
563 v.insert(v.end(), test_case_value.begin(), test_case_value.end());
564 }
565 IndexedDBKeyPath key_path = DecodeIDBKeyPath(v.data(), v.data() + v.size());
566 EXPECT_EQ(key_path.type(), WebIDBKeyPath::ArrayType);
567 EXPECT_EQ(key_path.array().size(), test_case.size());
568 for (size_t i = 0; i < test_case.size(); ++i)
569 EXPECT_EQ(key_path.array()[i], test_case[i]);
570 }
571 }
572
573 TEST(IndexedDBLevelDBCodingTest, ExtractAndCompareIDBKeys) {
574 std::vector<IndexedDBKey> keys;
575
576 keys.push_back(IndexedDBKey(-10, WebIDBKey::NumberType));
577 keys.push_back(IndexedDBKey(0, WebIDBKey::NumberType));
578 keys.push_back(IndexedDBKey(3.14, WebIDBKey::NumberType));
579
580 keys.push_back(IndexedDBKey(0, WebIDBKey::DateType));
581 keys.push_back(IndexedDBKey(100, WebIDBKey::DateType));
582 keys.push_back(IndexedDBKey(100000, WebIDBKey::DateType));
583
584 keys.push_back(IndexedDBKey(ASCIIToUTF16("")));
585 keys.push_back(IndexedDBKey(ASCIIToUTF16("a")));
586 keys.push_back(IndexedDBKey(ASCIIToUTF16("b")));
587 keys.push_back(IndexedDBKey(ASCIIToUTF16("baaa")));
588 keys.push_back(IndexedDBKey(ASCIIToUTF16("baab")));
589 keys.push_back(IndexedDBKey(ASCIIToUTF16("c")));
590
591 keys.push_back(CreateArrayIDBKey());
592 keys.push_back(CreateArrayIDBKey(IndexedDBKey(0, WebIDBKey::NumberType)));
593 keys.push_back(CreateArrayIDBKey(IndexedDBKey(0, WebIDBKey::NumberType),
594 IndexedDBKey(3.14, WebIDBKey::NumberType)));
595 keys.push_back(CreateArrayIDBKey(IndexedDBKey(0, WebIDBKey::DateType)));
596 keys.push_back(CreateArrayIDBKey(IndexedDBKey(0, WebIDBKey::DateType),
597 IndexedDBKey(0, WebIDBKey::DateType)));
598 keys.push_back(CreateArrayIDBKey(IndexedDBKey(ASCIIToUTF16(""))));
599 keys.push_back(CreateArrayIDBKey(IndexedDBKey(ASCIIToUTF16("")),
600 IndexedDBKey(ASCIIToUTF16("a"))));
601 keys.push_back(CreateArrayIDBKey(CreateArrayIDBKey()));
602 keys.push_back(CreateArrayIDBKey(CreateArrayIDBKey(), CreateArrayIDBKey()));
603 keys.push_back(CreateArrayIDBKey(CreateArrayIDBKey(CreateArrayIDBKey())));
604 keys.push_back(CreateArrayIDBKey(
605 CreateArrayIDBKey(CreateArrayIDBKey(CreateArrayIDBKey()))));
606
607 for (size_t i = 0; i < keys.size() - 1; ++i) {
608 const IndexedDBKey& key_a = keys[i];
609 const IndexedDBKey& key_b = keys[i + 1];
610
611 EXPECT_TRUE(key_a.IsLessThan(key_b));
612
613 std::vector<char> encoded_a = EncodeIDBKey(key_a);
614 EXPECT_TRUE(encoded_a.size());
615 std::vector<char> encoded_b = EncodeIDBKey(key_b);
616 EXPECT_TRUE(encoded_b.size());
617
618 std::vector<char> extracted_a;
619 std::vector<char> extracted_b;
620
621 const char* p = ExtractEncodedIDBKey(
622 encoded_a.data(), encoded_a.data() + encoded_a.size(), &extracted_a);
623 EXPECT_EQ(encoded_a.data() + encoded_a.size(), p);
624 EXPECT_EQ(encoded_a, extracted_a);
625
626 const char* q = ExtractEncodedIDBKey(
627 encoded_b.data(), encoded_b.data() + encoded_b.size(), &extracted_b);
628 EXPECT_EQ(encoded_b.data() + encoded_b.size(), q);
629 EXPECT_EQ(encoded_b, extracted_b);
630
631 EXPECT_LT(CompareKeys(extracted_a, extracted_b), 0);
632 EXPECT_GT(CompareKeys(extracted_b, extracted_a), 0);
633 EXPECT_EQ(CompareKeys(extracted_a, extracted_a), 0);
634 EXPECT_EQ(CompareKeys(extracted_b, extracted_b), 0);
635
636 EXPECT_EQ(0,
637 ExtractEncodedIDBKey(encoded_a.data(),
638 encoded_a.data() + encoded_a.size() - 1,
639 &extracted_a));
640 }
641 }
642
643 TEST(IndexedDBLevelDBCodingTest, ComparisonTest) {
644 std::vector<std::vector<char> > keys;
645 keys.push_back(SchemaVersionKey::Encode());
646 keys.push_back(MaxDatabaseIdKey::Encode());
647 keys.push_back(DatabaseFreeListKey::Encode(0));
648 keys.push_back(DatabaseFreeListKey::EncodeMaxKey());
649 keys.push_back(DatabaseNameKey::Encode(ASCIIToUTF16(""), ASCIIToUTF16("")));
650 keys.push_back(DatabaseNameKey::Encode(ASCIIToUTF16(""), ASCIIToUTF16("a")));
651 keys.push_back(DatabaseNameKey::Encode(ASCIIToUTF16("a"), ASCIIToUTF16("a")));
652 keys.push_back(
653 DatabaseMetaDataKey::Encode(1, DatabaseMetaDataKey::OriginName));
654 keys.push_back(
655 DatabaseMetaDataKey::Encode(1, DatabaseMetaDataKey::DatabaseName));
656 keys.push_back(
657 DatabaseMetaDataKey::Encode(1, DatabaseMetaDataKey::UserVersion));
658 keys.push_back(
659 DatabaseMetaDataKey::Encode(1, DatabaseMetaDataKey::MaxObjectStoreId));
660 keys.push_back(
661 DatabaseMetaDataKey::Encode(1, DatabaseMetaDataKey::UserIntVersion));
662 keys.push_back(
663 ObjectStoreMetaDataKey::Encode(1, 1, ObjectStoreMetaDataKey::Name));
664 keys.push_back(
665 ObjectStoreMetaDataKey::Encode(1, 1, ObjectStoreMetaDataKey::KeyPath));
666 keys.push_back(ObjectStoreMetaDataKey::Encode(
667 1, 1, ObjectStoreMetaDataKey::AutoIncrement));
668 keys.push_back(
669 ObjectStoreMetaDataKey::Encode(1, 1, ObjectStoreMetaDataKey::Evictable));
670 keys.push_back(ObjectStoreMetaDataKey::Encode(
671 1, 1, ObjectStoreMetaDataKey::LastVersion));
672 keys.push_back(
673 ObjectStoreMetaDataKey::Encode(1, 1, ObjectStoreMetaDataKey::MaxIndexId));
674 keys.push_back(
675 ObjectStoreMetaDataKey::Encode(1, 1, ObjectStoreMetaDataKey::HasKeyPath));
676 keys.push_back(ObjectStoreMetaDataKey::Encode(
677 1, 1, ObjectStoreMetaDataKey::KeyGeneratorCurrentNumber));
678 keys.push_back(ObjectStoreMetaDataKey::EncodeMaxKey(1, 1));
679 keys.push_back(ObjectStoreMetaDataKey::EncodeMaxKey(1, 2));
680 keys.push_back(ObjectStoreMetaDataKey::EncodeMaxKey(1));
681 keys.push_back(IndexMetaDataKey::Encode(1, 1, 30, IndexMetaDataKey::Name));
682 keys.push_back(IndexMetaDataKey::Encode(1, 1, 30, IndexMetaDataKey::Unique));
683 keys.push_back(IndexMetaDataKey::Encode(1, 1, 30, IndexMetaDataKey::KeyPath));
684 keys.push_back(
685 IndexMetaDataKey::Encode(1, 1, 30, IndexMetaDataKey::MultiEntry));
686 keys.push_back(IndexMetaDataKey::Encode(1, 1, 31, 0));
687 keys.push_back(IndexMetaDataKey::Encode(1, 1, 31, 1));
688 keys.push_back(IndexMetaDataKey::EncodeMaxKey(1, 1, 31));
689 keys.push_back(IndexMetaDataKey::EncodeMaxKey(1, 1, 32));
690 keys.push_back(IndexMetaDataKey::EncodeMaxKey(1, 1));
691 keys.push_back(IndexMetaDataKey::EncodeMaxKey(1, 2));
692 keys.push_back(ObjectStoreFreeListKey::Encode(1, 1));
693 keys.push_back(ObjectStoreFreeListKey::EncodeMaxKey(1));
694 keys.push_back(IndexFreeListKey::Encode(1, 1, MinimumIndexId));
695 keys.push_back(IndexFreeListKey::EncodeMaxKey(1, 1));
696 keys.push_back(IndexFreeListKey::Encode(1, 2, MinimumIndexId));
697 keys.push_back(IndexFreeListKey::EncodeMaxKey(1, 2));
698 keys.push_back(ObjectStoreNamesKey::Encode(1, ASCIIToUTF16("")));
699 keys.push_back(ObjectStoreNamesKey::Encode(1, ASCIIToUTF16("a")));
700 keys.push_back(IndexNamesKey::Encode(1, 1, ASCIIToUTF16("")));
701 keys.push_back(IndexNamesKey::Encode(1, 1, ASCIIToUTF16("a")));
702 keys.push_back(IndexNamesKey::Encode(1, 2, ASCIIToUTF16("a")));
703 keys.push_back(ObjectStoreDataKey::Encode(1, 1, MinIDBKey()));
704 keys.push_back(ObjectStoreDataKey::Encode(1, 1, MaxIDBKey()));
705 keys.push_back(ExistsEntryKey::Encode(1, 1, MinIDBKey()));
706 keys.push_back(ExistsEntryKey::Encode(1, 1, MaxIDBKey()));
707 keys.push_back(IndexDataKey::Encode(1, 1, 30, MinIDBKey(), MinIDBKey(), 0));
708 keys.push_back(IndexDataKey::Encode(1, 1, 30, MinIDBKey(), MinIDBKey(), 1));
709 keys.push_back(IndexDataKey::Encode(1, 1, 30, MinIDBKey(), MaxIDBKey(), 0));
710 keys.push_back(IndexDataKey::Encode(1, 1, 30, MinIDBKey(), MaxIDBKey(), 1));
711 keys.push_back(IndexDataKey::Encode(1, 1, 30, MaxIDBKey(), MinIDBKey(), 0));
712 keys.push_back(IndexDataKey::Encode(1, 1, 30, MaxIDBKey(), MinIDBKey(), 1));
713 keys.push_back(IndexDataKey::Encode(1, 1, 30, MaxIDBKey(), MaxIDBKey(), 0));
714 keys.push_back(IndexDataKey::Encode(1, 1, 30, MaxIDBKey(), MaxIDBKey(), 1));
715 keys.push_back(IndexDataKey::Encode(1, 1, 31, MinIDBKey(), MinIDBKey(), 0));
716 keys.push_back(IndexDataKey::Encode(1, 2, 30, MinIDBKey(), MinIDBKey(), 0));
717 keys.push_back(IndexDataKey::EncodeMaxKey(1, 2, INT32_MAX - 1));
718
719 for (size_t i = 0; i < keys.size(); ++i) {
720 const LevelDBSlice key_a(keys[i]);
721 EXPECT_EQ(Compare(key_a, key_a), 0);
722
723 for (size_t j = i + 1; j < keys.size(); ++j) {
724 const LevelDBSlice key_b(keys[j]);
725 EXPECT_LT(Compare(key_a, key_b), 0);
726 EXPECT_GT(Compare(key_b, key_a), 0);
727 }
728 }
729 }
730
731 TEST(IndexedDBLevelDBCodingTest, EncodeVarIntVSEncodeByteTest) {
732 std::vector<unsigned char> test_cases;
733 test_cases.push_back(0);
734 test_cases.push_back(1);
735 test_cases.push_back(127);
736
737 for (size_t i = 0; i < test_cases.size(); ++i) {
738 unsigned char n = test_cases[i];
739
740 std::vector<char> vA = EncodeByte(n);
741 std::vector<char> vB = EncodeVarInt(static_cast<int64_t>(n));
742
743 EXPECT_EQ(vA.size(), vB.size());
744 EXPECT_EQ(*(vA.data()), *(vB.data()));
745 }
746 }
747
748 } // namespace
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698