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

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

Powered by Google App Engine
This is Rietveld 408576698