14ee2ad04344446e610172a0e73949212923014dfSebastian Redl// Copyright (c) 2013 The Chromium Authors. All rights reserved.
22cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor// Use of this source code is governed by a BSD-style license that can be
32cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor// found in the LICENSE file.
42cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
52cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "content/browser/indexed_db/indexed_db_leveldb_coding.h"
62cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
72cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include <limits>
82cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include <vector>
92cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
10a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl#include "base/basictypes.h"
112cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "base/strings/string16.h"
122cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "base/strings/string_piece.h"
132cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "base/strings/utf_string_conversions.h"
147faa2ec03a7ef120ac165bb45b6c70a8b20c9f1cSebastian Redl#include "content/common/indexed_db/indexed_db_key.h"
150eca89e9890db4d8336ce762a5b359a1d58ca02bArgyrios Kyrtzidis#include "content/common/indexed_db/indexed_db_key_path.h"
16e737f5041a36d0befb39ffeed8d50ba15916d3daDouglas Gregor#include "testing/gtest/include/gtest/gtest.h"
17e737f5041a36d0befb39ffeed8d50ba15916d3daDouglas Gregor
182cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregorusing base::ASCIIToUTF16;
192cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregorusing base::StringPiece;
202cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregorusing blink::WebIDBKeyTypeDate;
212a7fb27913999d132cf9e10e03dc5271faa2e9d3John McCallusing blink::WebIDBKeyTypeNumber;
220b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor
237a1fad38256eb4c5129359be85ba1ea1678eb5c9John McCallnamespace content {
242cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
25a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCallnamespace {
266ab7cd853e9c15cf986a8a7c3db1f8d20e275409Sebastian Redl
277c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattnerstatic IndexedDBKey CreateArrayIDBKey() {
286a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor  return IndexedDBKey(IndexedDBKey::KeyArray());
297c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner}
3083d63c78810556d26b62ac4cbae2eda6cdd2570cSteve Naroff
3114f79002e58556798e86168c63e48d533287eda5Douglas Gregorstatic IndexedDBKey CreateArrayIDBKey(const IndexedDBKey& key1) {
323251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor  IndexedDBKey::KeyArray array;
3314f79002e58556798e86168c63e48d533287eda5Douglas Gregor  array.push_back(key1);
34bd94500d3aa60092fb0f1e90f53fb0d03fa502a8Douglas Gregor  return IndexedDBKey(array);
352bec0410d268779f601bd509e0302a500af7ac6aDouglas Gregor}
36ab41e63821dc60ad144d0684df8d79a9eef86b75Douglas Gregor
3717fc223395d51be582fc666bb6ea21bd1dff26dcDouglas Gregorstatic IndexedDBKey CreateArrayIDBKey(const IndexedDBKey& key1,
3817fc223395d51be582fc666bb6ea21bd1dff26dcDouglas Gregor                                      const IndexedDBKey& key2) {
392596e429a61602312bdd149786045b8a90cd2d10Daniel Dunbar  IndexedDBKey::KeyArray array;
402cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  array.push_back(key1);
4114f79002e58556798e86168c63e48d533287eda5Douglas Gregor  array.push_back(key2);
42b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor  return IndexedDBKey(array);
433c304bd9ec2b4611572d4cbae9e1727bbecb5dc9Chris Lattner}
442cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
458538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redlstatic std::string WrappedEncodeByte(char value) {
462cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  std::string buffer;
47ade5000c8763f4bec41f452d7efa3a9b2a6d4712Sebastian Redl  EncodeByte(value, &buffer);
48ade5000c8763f4bec41f452d7efa3a9b2a6d4712Sebastian Redl  return buffer;
49ade5000c8763f4bec41f452d7efa3a9b2a6d4712Sebastian Redl}
50ade5000c8763f4bec41f452d7efa3a9b2a6d4712Sebastian Redl
51ade5000c8763f4bec41f452d7efa3a9b2a6d4712Sebastian RedlTEST(IndexedDBLevelDBCodingTest, EncodeByte) {
52ade5000c8763f4bec41f452d7efa3a9b2a6d4712Sebastian Redl  std::string expected;
53ade5000c8763f4bec41f452d7efa3a9b2a6d4712Sebastian Redl  expected.push_back(0);
54ade5000c8763f4bec41f452d7efa3a9b2a6d4712Sebastian Redl  unsigned char c;
55ade5000c8763f4bec41f452d7efa3a9b2a6d4712Sebastian Redl
562cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  c = 0;
572cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  expected[0] = c;
582cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  EXPECT_EQ(expected, WrappedEncodeByte(c));
5912b1c7615d4f9a2edc544be499f895f16ac100edChris Lattner
602cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  c = 1;
613397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl  expected[0] = c;
62a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl  EXPECT_EQ(expected, WrappedEncodeByte(c));
63a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl
642cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  c = 255;
652cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  expected[0] = c;
662cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  EXPECT_EQ(expected, WrappedEncodeByte(c));
678538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl}
682cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
693397c5570369f19b2d6c52e898f708d75ceede1fSebastian RedlTEST(IndexedDBLevelDBCodingTest, DecodeByte) {
708538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  std::vector<unsigned char> test_cases;
712cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  test_cases.push_back(0);
722cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  test_cases.push_back(1);
732cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  test_cases.push_back(255);
742cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
752cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  for (size_t i = 0; i < test_cases.size(); ++i) {
762cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    unsigned char n = test_cases[i];
772cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    std::string v;
782cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    EncodeByte(n, &v);
792cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
802cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    unsigned char res;
812cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    ASSERT_GT(v.size(), 0u);
823397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl    StringPiece slice(v);
832cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    EXPECT_TRUE(DecodeByte(&slice, &res));
842cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    EXPECT_EQ(n, res);
852cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    EXPECT_TRUE(slice.empty());
863397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl  }
872cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
888538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  {
892cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    StringPiece slice;
902cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    unsigned char value;
913397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl    EXPECT_FALSE(DecodeByte(&slice, &value));
922cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  }
938538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl}
942cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
952cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregorstatic std::string WrappedEncodeBool(bool value) {
963397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl  std::string buffer;
971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  EncodeBool(value, &buffer);
988538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  return buffer;
992cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor}
1002cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
1013397c5570369f19b2d6c52e898f708d75ceede1fSebastian RedlTEST(IndexedDBLevelDBCodingTest, EncodeBool) {
1022cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  {
1038538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    std::string expected;
1042cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    expected.push_back(1);
1052cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    EXPECT_EQ(expected, WrappedEncodeBool(true));
1063397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl  }
1072cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  {
1088538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    std::string expected;
1092cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    expected.push_back(0);
1102cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    EXPECT_EQ(expected, WrappedEncodeBool(false));
1113397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl  }
1121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump}
1131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1148538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redlstatic int CompareKeys(const std::string& a, const std::string& b) {
1152cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  DCHECK(!a.empty());
1162cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  DCHECK(!b.empty());
1173397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl
1182cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  StringPiece slice_a(a);
1192cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  StringPiece slice_b(b);
1200953e767ff7817f97b3ab20896b229891eeff45bJohn McCall  bool ok;
1212cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  int result = CompareEncodedIDBKeys(&slice_a, &slice_b, &ok);
1222cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  EXPECT_TRUE(ok);
1233397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl  return result;
1242cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor}
1252cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
1268538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian RedlTEST(IndexedDBLevelDBCodingTest, MaxIDBKey) {
1272cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  std::string max_key = MaxIDBKey();
1282cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
1293397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl  std::string min_key = MinIDBKey();
1302cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  std::string array_key;
1318538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  EncodeIDBKey(IndexedDBKey(IndexedDBKey::KeyArray()), &array_key);
1322cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  std::string binary_key;
1332cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  EncodeIDBKey(IndexedDBKey(std::string("\x00\x01\x02")), &binary_key);
1343397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl  std::string string_key;
1352cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  EncodeIDBKey(IndexedDBKey(ASCIIToUTF16("Hello world")), &string_key);
1367e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor  std::string number_key;
1377e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor  EncodeIDBKey(IndexedDBKey(3.14, WebIDBKeyTypeNumber), &number_key);
138c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor  std::string date_key;
1398538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  EncodeIDBKey(IndexedDBKey(1000000, WebIDBKeyTypeDate), &date_key);
1402cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
1412cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  EXPECT_GT(CompareKeys(max_key, min_key), 0);
1423397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl  EXPECT_GT(CompareKeys(max_key, array_key), 0);
1432cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  EXPECT_GT(CompareKeys(max_key, binary_key), 0);
1442cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  EXPECT_GT(CompareKeys(max_key, string_key), 0);
145788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner  EXPECT_GT(CompareKeys(max_key, number_key), 0);
1468538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  EXPECT_GT(CompareKeys(max_key, date_key), 0);
1472cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor}
1482cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
1493397c5570369f19b2d6c52e898f708d75ceede1fSebastian RedlTEST(IndexedDBLevelDBCodingTest, MinIDBKey) {
1502cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  std::string min_key = MinIDBKey();
1518538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl
1522cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  std::string max_key = MaxIDBKey();
1532cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  std::string array_key;
1543397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl  EncodeIDBKey(IndexedDBKey(IndexedDBKey::KeyArray()), &array_key);
1552cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  std::string binary_key;
156264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola  EncodeIDBKey(IndexedDBKey(std::string("\x00\x01\x02")), &binary_key);
157264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola  std::string string_key;
158425ef72306d4ff6b3698b744353e5f0e56b4b884Rafael Espindola  EncodeIDBKey(IndexedDBKey(ASCIIToUTF16("Hello world")), &string_key);
159ab8bbf4ebd3e3e6eab913cb044772a62b7581941Douglas Gregor  std::string number_key;
160264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola  EncodeIDBKey(IndexedDBKey(3.14, WebIDBKeyTypeNumber), &number_key);
1612cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  std::string date_key;
1622cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  EncodeIDBKey(IndexedDBKey(1000000, WebIDBKeyTypeDate), &date_key);
1633397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl
1642cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  EXPECT_LT(CompareKeys(min_key, max_key), 0);
1658538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  EXPECT_LT(CompareKeys(min_key, array_key), 0);
1662cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  EXPECT_LT(CompareKeys(min_key, binary_key), 0);
1672cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  EXPECT_LT(CompareKeys(min_key, string_key), 0);
1683397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl  EXPECT_LT(CompareKeys(min_key, number_key), 0);
1692cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  EXPECT_LT(CompareKeys(min_key, date_key), 0);
1702cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor}
1712cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
1722cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregorstatic std::string WrappedEncodeInt(int64 value) {
1732cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  std::string buffer;
1742cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  EncodeInt(value, &buffer);
175465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl  return buffer;
176465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl}
177465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl
178465226e23a3008bd68973513dda1f9e3cd27dbddSebastian RedlTEST(IndexedDBLevelDBCodingTest, EncodeInt) {
179465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl  EXPECT_EQ(1u, WrappedEncodeInt(0).size());
1808538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  EXPECT_EQ(1u, WrappedEncodeInt(1).size());
1812cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  EXPECT_EQ(1u, WrappedEncodeInt(255).size());
1822cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  EXPECT_EQ(2u, WrappedEncodeInt(256).size());
1833397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl  EXPECT_EQ(4u, WrappedEncodeInt(0xffffffff).size());
184ed97649e9574b9d854fa4d6109c9333ae0993554John McCall#ifdef NDEBUG
1858538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  EXPECT_EQ(8u, WrappedEncodeInt(-1).size());
186ed97649e9574b9d854fa4d6109c9333ae0993554John McCall#endif
187ed97649e9574b9d854fa4d6109c9333ae0993554John McCall}
1883397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl
1892cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas GregorTEST(IndexedDBLevelDBCodingTest, DecodeBool) {
1909763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis  {
1919763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis    std::string encoded;
1928538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    encoded.push_back(1);
1932cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    StringPiece slice(encoded);
1942cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    bool value;
1953397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl    EXPECT_TRUE(DecodeBool(&slice, &value));
196c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor    EXPECT_TRUE(value);
1978538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    EXPECT_TRUE(slice.empty());
1982cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  }
1992cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  {
2003397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl    std::string encoded;
2012cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    encoded.push_back(0);
2028538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    StringPiece slice(encoded);
2032cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    bool value;
2042cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    EXPECT_TRUE(DecodeBool(&slice, &value));
2053397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl    EXPECT_FALSE(value);
206395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson    EXPECT_TRUE(slice.empty());
2078538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  }
208395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson  {
209395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson    StringPiece slice;
2103397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl    bool value;
211be191100e034b23a3e13053757a57b7f5068c24aArgyrios Kyrtzidis    EXPECT_FALSE(DecodeBool(&slice, &value));
2122cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  }
2131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump}
2142cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
2152cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas GregorTEST(IndexedDBLevelDBCodingTest, DecodeInt) {
2162cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  std::vector<int64> test_cases;
2173397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl  test_cases.push_back(0);
2182cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  test_cases.push_back(1);
2198538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  test_cases.push_back(255);
2202cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  test_cases.push_back(256);
2212cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  test_cases.push_back(65535);
2223397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl  test_cases.push_back(655536);
2232cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  test_cases.push_back(7711192431755665792ll);
2248538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  test_cases.push_back(0x7fffffffffffffffll);
2252cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#ifdef NDEBUG
2262cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  test_cases.push_back(-3);
2271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump#endif
2283397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl
22949a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall  for (size_t i = 0; i < test_cases.size(); ++i) {
23049a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall    int64 n = test_cases[i];
23149a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall    std::string v = WrappedEncodeInt(n);
2328538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    ASSERT_GT(v.size(), 0u);
23349a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall    StringPiece slice(v);
23449a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall    int64 value;
23549a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall    EXPECT_TRUE(DecodeInt(&slice, &value));
2363397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl    EXPECT_EQ(n, value);
2372cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    EXPECT_TRUE(slice.empty());
238be191100e034b23a3e13053757a57b7f5068c24aArgyrios Kyrtzidis
23990b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis    // Verify decoding at an offset, to detect unaligned memory access.
24090b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis    v.insert(v.begin(), 1u, static_cast<char>(0));
24190b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis    slice = StringPiece(&*v.begin() + 1, v.size() - 1);
24290b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis    EXPECT_TRUE(DecodeInt(&slice, &value));
24390b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis    EXPECT_EQ(n, value);
2449763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis    EXPECT_TRUE(slice.empty());
2459763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis  }
2469763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis  {
2478538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    StringPiece slice;
24890b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis    int64 value;
24990b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis    EXPECT_FALSE(DecodeInt(&slice, &value));
25090b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis  }
2513397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl}
252ae8b17f1d5d303af53db5a4f4a375ea6b9356566Argyrios Kyrtzidis
253ae8b17f1d5d303af53db5a4f4a375ea6b9356566Argyrios Kyrtzidisstatic std::string WrappedEncodeVarInt(int64 value) {
254ae8b17f1d5d303af53db5a4f4a375ea6b9356566Argyrios Kyrtzidis  std::string buffer;
2558538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  EncodeVarInt(value, &buffer);
25690b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis  return buffer;
25790b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis}
25890b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis
2593397c5570369f19b2d6c52e898f708d75ceede1fSebastian RedlTEST(IndexedDBLevelDBCodingTest, EncodeVarInt) {
26090b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis  EXPECT_EQ(1u, WrappedEncodeVarInt(0).size());
26190b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis  EXPECT_EQ(1u, WrappedEncodeVarInt(1).size());
26290b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis  EXPECT_EQ(2u, WrappedEncodeVarInt(255).size());
26390b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis  EXPECT_EQ(2u, WrappedEncodeVarInt(256).size());
26490b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis  EXPECT_EQ(5u, WrappedEncodeVarInt(0xffffffff).size());
26590b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis  EXPECT_EQ(8u, WrappedEncodeVarInt(0xfffffffffffffLL).size());
2663397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl  EXPECT_EQ(9u, WrappedEncodeVarInt(0x7fffffffffffffffLL).size());
26790b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis#ifdef NDEBUG
26890b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis  EXPECT_EQ(10u, WrappedEncodeVarInt(-100).size());
26990b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis#endif
27090b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis}
2718538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl
27290b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios KyrtzidisTEST(IndexedDBLevelDBCodingTest, DecodeVarInt) {
27390b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis  std::vector<int64> test_cases;
27490b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis  test_cases.push_back(0);
2753397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl  test_cases.push_back(1);
2768dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis  test_cases.push_back(255);
2778dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis  test_cases.push_back(256);
2788dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis  test_cases.push_back(65535);
279f48d45e3e36c132bdee3373beec4e8b19ae3f9c4Argyrios Kyrtzidis  test_cases.push_back(655536);
280f48d45e3e36c132bdee3373beec4e8b19ae3f9c4Argyrios Kyrtzidis  test_cases.push_back(7711192431755665792ll);
281f48d45e3e36c132bdee3373beec4e8b19ae3f9c4Argyrios Kyrtzidis  test_cases.push_back(0x7fffffffffffffffll);
2828538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl#ifdef NDEBUG
28390b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis  test_cases.push_back(-3);
28490b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis#endif
28590b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis
2863397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl  for (size_t i = 0; i < test_cases.size(); ++i) {
28790b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis    int64 n = test_cases[i];
2883acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis    std::string v = WrappedEncodeVarInt(n);
2893acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis    ASSERT_GT(v.size(), 0u);
2903acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis    StringPiece slice(v);
2913acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis    int64 res;
2923acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis    EXPECT_TRUE(DecodeVarInt(&slice, &res));
2933acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis    EXPECT_EQ(n, res);
2943acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis    EXPECT_TRUE(slice.empty());
2958538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl
2962cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    slice = StringPiece(&*v.begin(), v.size() - 1);
2972cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    EXPECT_FALSE(DecodeVarInt(&slice, &res));
2983397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl
299465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara    slice = StringPiece(&*v.begin(), static_cast<size_t>(0));
3003acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis    EXPECT_FALSE(DecodeVarInt(&slice, &res));
3013acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis
3028538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    // Verify decoding at an offset, to detect unaligned memory access.
3032cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    v.insert(v.begin(), 1u, static_cast<char>(0));
3042cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    slice = StringPiece(&*v.begin() + 1, v.size() - 1);
3053397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl    EXPECT_TRUE(DecodeVarInt(&slice, &res));
3063cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall    EXPECT_EQ(n, res);
30731f17ecbef57b5679c017c375db330546b7b5145John McCall    EXPECT_TRUE(slice.empty());
3088538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  }
3093cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall}
3103cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall
3113397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redlstatic std::string WrappedEncodeString(base::string16 value) {
312deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor  std::string buffer;
3138538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  EncodeString(value, &buffer);
314c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  return buffer;
315c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall}
3163397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl
317c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCallTEST(IndexedDBLevelDBCodingTest, EncodeString) {
3182cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  const base::char16 test_string_a[] = {'f', 'o', 'o', '\0'};
319c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  const base::char16 test_string_b[] = {0xdead, 0xbeef, '\0'};
320446ee4eb4fc4c705a59365252df7a5c253daafa1Steve Naroff
321446ee4eb4fc4c705a59365252df7a5c253daafa1Steve Naroff  EXPECT_EQ(0u, WrappedEncodeString(ASCIIToUTF16("")).size());
3228538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  EXPECT_EQ(2u, WrappedEncodeString(ASCIIToUTF16("a")).size());
3232cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  EXPECT_EQ(6u, WrappedEncodeString(ASCIIToUTF16("foo")).size());
3242cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  EXPECT_EQ(6u, WrappedEncodeString(base::string16(test_string_a)).size());
325d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff  EXPECT_EQ(4u, WrappedEncodeString(base::string16(test_string_b)).size());
3263397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl}
3271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3288538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian RedlTEST(IndexedDBLevelDBCodingTest, DecodeString) {
3292cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  const base::char16 test_string_a[] = {'f', 'o', 'o', '\0'};
3302cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  const base::char16 test_string_b[] = {0xdead, 0xbeef, '\0'};
331a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall
332a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall  std::vector<base::string16> test_cases;
333a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall  test_cases.push_back(base::string16());
334a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl  test_cases.push_back(ASCIIToUTF16("a"));
335a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl  test_cases.push_back(ASCIIToUTF16("foo"));
336a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall  test_cases.push_back(test_string_a);
337a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall  test_cases.push_back(test_string_b);
338a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl
339a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall  for (size_t i = 0; i < test_cases.size(); ++i) {
340a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall    const base::string16& test_case = test_cases[i];
34151bd803fbdade51d674598ed45da3d54190a656cJohn McCall    std::string v = WrappedEncodeString(test_case);
342a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall
34351bd803fbdade51d674598ed45da3d54190a656cJohn McCall    StringPiece slice;
344a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall    if (v.size()) {
345a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall      slice = StringPiece(&*v.begin(), v.size());
34651bd803fbdade51d674598ed45da3d54190a656cJohn McCall    }
34751bd803fbdade51d674598ed45da3d54190a656cJohn McCall
348a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall    base::string16 result;
349a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall    EXPECT_TRUE(DecodeString(&slice, &result));
350a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall    EXPECT_EQ(test_case, result);
351a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall    EXPECT_TRUE(slice.empty());
35251bd803fbdade51d674598ed45da3d54190a656cJohn McCall
35351bd803fbdade51d674598ed45da3d54190a656cJohn McCall    // Verify decoding at an offset, to detect unaligned memory access.
35451bd803fbdade51d674598ed45da3d54190a656cJohn McCall    v.insert(v.begin(), 1u, static_cast<char>(0));
35551bd803fbdade51d674598ed45da3d54190a656cJohn McCall    slice = StringPiece(&*v.begin() + 1, v.size() - 1);
356ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor    EXPECT_TRUE(DecodeString(&slice, &result));
357ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor    EXPECT_EQ(test_case, result);
358ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor    EXPECT_TRUE(slice.empty());
359ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor  }
360ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor}
361ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor
362ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregorstatic std::string WrappedEncodeStringWithLength(base::string16 value) {
36351bd803fbdade51d674598ed45da3d54190a656cJohn McCall  std::string buffer;
36451bd803fbdade51d674598ed45da3d54190a656cJohn McCall  EncodeStringWithLength(value, &buffer);
36551bd803fbdade51d674598ed45da3d54190a656cJohn McCall  return buffer;
36651bd803fbdade51d674598ed45da3d54190a656cJohn McCall}
36751bd803fbdade51d674598ed45da3d54190a656cJohn McCall
36851bd803fbdade51d674598ed45da3d54190a656cJohn McCallTEST(IndexedDBLevelDBCodingTest, EncodeStringWithLength) {
36951bd803fbdade51d674598ed45da3d54190a656cJohn McCall  const base::char16 test_string_a[] = {'f', 'o', 'o', '\0'};
37051bd803fbdade51d674598ed45da3d54190a656cJohn McCall  const base::char16 test_string_b[] = {0xdead, 0xbeef, '\0'};
37151bd803fbdade51d674598ed45da3d54190a656cJohn McCall
37251bd803fbdade51d674598ed45da3d54190a656cJohn McCall  EXPECT_EQ(1u, WrappedEncodeStringWithLength(base::string16()).size());
37351bd803fbdade51d674598ed45da3d54190a656cJohn McCall  EXPECT_EQ(3u, WrappedEncodeStringWithLength(ASCIIToUTF16("a")).size());
37451bd803fbdade51d674598ed45da3d54190a656cJohn McCall  EXPECT_EQ(
37551bd803fbdade51d674598ed45da3d54190a656cJohn McCall      7u, WrappedEncodeStringWithLength(base::string16(test_string_a)).size());
37651bd803fbdade51d674598ed45da3d54190a656cJohn McCall  EXPECT_EQ(
37751bd803fbdade51d674598ed45da3d54190a656cJohn McCall      5u, WrappedEncodeStringWithLength(base::string16(test_string_b)).size());
37851bd803fbdade51d674598ed45da3d54190a656cJohn McCall}
37951bd803fbdade51d674598ed45da3d54190a656cJohn McCall
38051bd803fbdade51d674598ed45da3d54190a656cJohn McCallTEST(IndexedDBLevelDBCodingTest, DecodeStringWithLength) {
38151bd803fbdade51d674598ed45da3d54190a656cJohn McCall  const base::char16 test_string_a[] = {'f', 'o', 'o', '\0'};
38251bd803fbdade51d674598ed45da3d54190a656cJohn McCall  const base::char16 test_string_b[] = {0xdead, 0xbeef, '\0'};
38351bd803fbdade51d674598ed45da3d54190a656cJohn McCall
38451bd803fbdade51d674598ed45da3d54190a656cJohn McCall  const int kLongStringLen = 1234;
38551bd803fbdade51d674598ed45da3d54190a656cJohn McCall  base::char16 long_string[kLongStringLen + 1];
38651bd803fbdade51d674598ed45da3d54190a656cJohn McCall  for (int i = 0; i < kLongStringLen; ++i)
38751bd803fbdade51d674598ed45da3d54190a656cJohn McCall    long_string[i] = i;
38851bd803fbdade51d674598ed45da3d54190a656cJohn McCall  long_string[kLongStringLen] = 0;
38951bd803fbdade51d674598ed45da3d54190a656cJohn McCall
39051bd803fbdade51d674598ed45da3d54190a656cJohn McCall  std::vector<base::string16> test_cases;
39151bd803fbdade51d674598ed45da3d54190a656cJohn McCall  test_cases.push_back(ASCIIToUTF16(""));
39251bd803fbdade51d674598ed45da3d54190a656cJohn McCall  test_cases.push_back(ASCIIToUTF16("a"));
39351bd803fbdade51d674598ed45da3d54190a656cJohn McCall  test_cases.push_back(ASCIIToUTF16("foo"));
39451bd803fbdade51d674598ed45da3d54190a656cJohn McCall  test_cases.push_back(base::string16(test_string_a));
39551bd803fbdade51d674598ed45da3d54190a656cJohn McCall  test_cases.push_back(base::string16(test_string_b));
39651bd803fbdade51d674598ed45da3d54190a656cJohn McCall  test_cases.push_back(base::string16(long_string));
39751bd803fbdade51d674598ed45da3d54190a656cJohn McCall
39851bd803fbdade51d674598ed45da3d54190a656cJohn McCall  for (size_t i = 0; i < test_cases.size(); ++i) {
39951bd803fbdade51d674598ed45da3d54190a656cJohn McCall    base::string16 s = test_cases[i];
40051bd803fbdade51d674598ed45da3d54190a656cJohn McCall    std::string v = WrappedEncodeStringWithLength(s);
40151bd803fbdade51d674598ed45da3d54190a656cJohn McCall    ASSERT_GT(v.size(), 0u);
40251bd803fbdade51d674598ed45da3d54190a656cJohn McCall    StringPiece slice(v);
40351bd803fbdade51d674598ed45da3d54190a656cJohn McCall    base::string16 res;
40451bd803fbdade51d674598ed45da3d54190a656cJohn McCall    EXPECT_TRUE(DecodeStringWithLength(&slice, &res));
40551bd803fbdade51d674598ed45da3d54190a656cJohn McCall    EXPECT_EQ(s, res);
40651bd803fbdade51d674598ed45da3d54190a656cJohn McCall    EXPECT_TRUE(slice.empty());
40751bd803fbdade51d674598ed45da3d54190a656cJohn McCall
40851bd803fbdade51d674598ed45da3d54190a656cJohn McCall    slice = StringPiece(&*v.begin(), v.size() - 1);
40951bd803fbdade51d674598ed45da3d54190a656cJohn McCall    EXPECT_FALSE(DecodeStringWithLength(&slice, &res));
41051bd803fbdade51d674598ed45da3d54190a656cJohn McCall
41151bd803fbdade51d674598ed45da3d54190a656cJohn McCall    slice = StringPiece(&*v.begin(), static_cast<size_t>(0));
41251bd803fbdade51d674598ed45da3d54190a656cJohn McCall    EXPECT_FALSE(DecodeStringWithLength(&slice, &res));
41351bd803fbdade51d674598ed45da3d54190a656cJohn McCall
41451bd803fbdade51d674598ed45da3d54190a656cJohn McCall    // Verify decoding at an offset, to detect unaligned memory access.
415dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor    v.insert(v.begin(), 1u, static_cast<char>(0));
41651bd803fbdade51d674598ed45da3d54190a656cJohn McCall    slice = StringPiece(&*v.begin() + 1, v.size() - 1);
41751bd803fbdade51d674598ed45da3d54190a656cJohn McCall    EXPECT_TRUE(DecodeStringWithLength(&slice, &res));
41851bd803fbdade51d674598ed45da3d54190a656cJohn McCall    EXPECT_EQ(s, res);
41951bd803fbdade51d674598ed45da3d54190a656cJohn McCall    EXPECT_TRUE(slice.empty());
42051bd803fbdade51d674598ed45da3d54190a656cJohn McCall  }
42151bd803fbdade51d674598ed45da3d54190a656cJohn McCall}
42251bd803fbdade51d674598ed45da3d54190a656cJohn McCall
42351bd803fbdade51d674598ed45da3d54190a656cJohn McCallstatic int CompareStrings(const std::string& p, const std::string& q) {
42451bd803fbdade51d674598ed45da3d54190a656cJohn McCall  bool ok;
425ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  DCHECK(!p.empty());
426ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  DCHECK(!q.empty());
427ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  StringPiece slice_p(p);
42851bd803fbdade51d674598ed45da3d54190a656cJohn McCall  StringPiece slice_q(q);
42951bd803fbdade51d674598ed45da3d54190a656cJohn McCall  int result = CompareEncodedStringsWithLength(&slice_p, &slice_q, &ok);
43051bd803fbdade51d674598ed45da3d54190a656cJohn McCall  EXPECT_TRUE(ok);
43151bd803fbdade51d674598ed45da3d54190a656cJohn McCall  EXPECT_TRUE(slice_p.empty());
432cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  EXPECT_TRUE(slice_q.empty());
433cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  return result;
434cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall}
43551bd803fbdade51d674598ed45da3d54190a656cJohn McCall
43651bd803fbdade51d674598ed45da3d54190a656cJohn McCallTEST(IndexedDBLevelDBCodingTest, CompareEncodedStringsWithLength) {
437cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  const base::char16 test_string_a[] = {0x1000, 0x1000, '\0'};
438cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  const base::char16 test_string_b[] = {0x1000, 0x1000, 0x1000, '\0'};
439cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  const base::char16 test_string_c[] = {0x1000, 0x1000, 0x1001, '\0'};
440cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  const base::char16 test_string_d[] = {0x1001, 0x1000, 0x1000, '\0'};
44151bd803fbdade51d674598ed45da3d54190a656cJohn McCall  const base::char16 test_string_e[] = {0xd834, 0xdd1e, '\0'};
44251bd803fbdade51d674598ed45da3d54190a656cJohn McCall  const base::char16 test_string_f[] = {0xfffd, '\0'};
44351bd803fbdade51d674598ed45da3d54190a656cJohn McCall
444a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall  std::vector<base::string16> test_cases;
44551bd803fbdade51d674598ed45da3d54190a656cJohn McCall  test_cases.push_back(ASCIIToUTF16(""));
44651bd803fbdade51d674598ed45da3d54190a656cJohn McCall  test_cases.push_back(ASCIIToUTF16("a"));
447a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall  test_cases.push_back(ASCIIToUTF16("b"));
44851bd803fbdade51d674598ed45da3d54190a656cJohn McCall  test_cases.push_back(ASCIIToUTF16("baaa"));
44951bd803fbdade51d674598ed45da3d54190a656cJohn McCall  test_cases.push_back(ASCIIToUTF16("baab"));
450a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall  test_cases.push_back(ASCIIToUTF16("c"));
45151bd803fbdade51d674598ed45da3d54190a656cJohn McCall  test_cases.push_back(base::string16(test_string_a));
45251bd803fbdade51d674598ed45da3d54190a656cJohn McCall  test_cases.push_back(base::string16(test_string_b));
453a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall  test_cases.push_back(base::string16(test_string_c));
45449a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall  test_cases.push_back(base::string16(test_string_d));
45549a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall  test_cases.push_back(base::string16(test_string_e));
45649a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall  test_cases.push_back(base::string16(test_string_f));
45749a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall
45851bd803fbdade51d674598ed45da3d54190a656cJohn McCall  for (size_t i = 0; i < test_cases.size() - 1; ++i) {
45951bd803fbdade51d674598ed45da3d54190a656cJohn McCall    base::string16 a = test_cases[i];
460833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    base::string16 b = test_cases[i + 1];
461833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
462833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    EXPECT_LT(a.compare(b), 0);
463833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall    EXPECT_GT(b.compare(a), 0);
46444f8c37e378f716e8cbb600e3800f437cf58f9e5Argyrios Kyrtzidis    EXPECT_EQ(a.compare(a), 0);
46544f8c37e378f716e8cbb600e3800f437cf58f9e5Argyrios Kyrtzidis    EXPECT_EQ(b.compare(b), 0);
466a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall
467465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara    std::string encoded_a = WrappedEncodeStringWithLength(a);
468e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    EXPECT_TRUE(encoded_a.size());
469e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    std::string encoded_b = WrappedEncodeStringWithLength(b);
470a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall    EXPECT_TRUE(encoded_a.size());
4713cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall
4723cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall    EXPECT_LT(CompareStrings(encoded_a, encoded_b), 0);
4733cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall    EXPECT_GT(CompareStrings(encoded_b, encoded_a), 0);
4744714c12a1ab759156b78be8f109ea4c12213af57Douglas Gregor    EXPECT_EQ(CompareStrings(encoded_a, encoded_a), 0);
475e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara    EXPECT_EQ(CompareStrings(encoded_b, encoded_b), 0);
476e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  }
47751bd803fbdade51d674598ed45da3d54190a656cJohn McCall}
478a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall
47933500955d731c73717af52088b7fc0e7a85681e7John McCallstatic std::string WrappedEncodeBinary(std::string value) {
48033500955d731c73717af52088b7fc0e7a85681e7John McCall  std::string buffer;
48133500955d731c73717af52088b7fc0e7a85681e7John McCall  EncodeBinary(value, &buffer);
48233500955d731c73717af52088b7fc0e7a85681e7John McCall  return buffer;
48333500955d731c73717af52088b7fc0e7a85681e7John McCall}
48433500955d731c73717af52088b7fc0e7a85681e7John McCall
48533500955d731c73717af52088b7fc0e7a85681e7John McCallTEST(IndexedDBLevelDBCodingTest, EncodeBinary) {
48633500955d731c73717af52088b7fc0e7a85681e7John McCall  const unsigned char binary_data[] = {0x00, 0x01, 0xfe, 0xff};
48744f8c37e378f716e8cbb600e3800f437cf58f9e5Argyrios Kyrtzidis  EXPECT_EQ(
48844f8c37e378f716e8cbb600e3800f437cf58f9e5Argyrios Kyrtzidis      1u,
48933500955d731c73717af52088b7fc0e7a85681e7John McCall      WrappedEncodeBinary(std::string(binary_data, binary_data + 0)).size());
49051bd803fbdade51d674598ed45da3d54190a656cJohn McCall  EXPECT_EQ(
49151bd803fbdade51d674598ed45da3d54190a656cJohn McCall      2u,
492c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall      WrappedEncodeBinary(std::string(binary_data, binary_data + 1)).size());
493c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  EXPECT_EQ(
494c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall      5u,
49554e14c4db764c0636160d26c5bbf491637c83a76John McCall      WrappedEncodeBinary(std::string(binary_data, binary_data + 4)).size());
49654e14c4db764c0636160d26c5bbf491637c83a76John McCall}
49754e14c4db764c0636160d26c5bbf491637c83a76John McCall
49854e14c4db764c0636160d26c5bbf491637c83a76John McCallTEST(IndexedDBLevelDBCodingTest, DecodeBinary) {
499a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall  const unsigned char binary_data[] = { 0x00, 0x01, 0xfe, 0xff };
50051bd803fbdade51d674598ed45da3d54190a656cJohn McCall
50151bd803fbdade51d674598ed45da3d54190a656cJohn McCall  std::vector<std::string> test_cases;
502a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall  test_cases.push_back(std::string(binary_data, binary_data + 0));
503a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall  test_cases.push_back(std::string(binary_data, binary_data + 1));
5044dcf151a555ff51e4d643e8e6eeb80f121d11d1bChris Lattner  test_cases.push_back(std::string(binary_data, binary_data + 4));
505a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl
5062cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  for (size_t i = 0; i < test_cases.size(); ++i) {
5072cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    std::string value = test_cases[i];
508b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner    std::string v = WrappedEncodeBinary(value);
509b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner    ASSERT_GT(v.size(), 0u);
510a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl    StringPiece slice(v);
511b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner    std::string result;
512b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner    EXPECT_TRUE(DecodeBinary(&slice, &result));
513b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner    EXPECT_EQ(value, result);
514b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner    EXPECT_TRUE(slice.empty());
515b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
516b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner    slice = StringPiece(&*v.begin(), v.size() - 1);
517b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner    EXPECT_FALSE(DecodeBinary(&slice, &result));
518b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
519b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner    slice = StringPiece(&*v.begin(), static_cast<size_t>(0));
520b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner    EXPECT_FALSE(DecodeBinary(&slice, &result));
521b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
522b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner    // Verify decoding at an offset, to detect unaligned memory access.
523b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner    v.insert(v.begin(), 1u, static_cast<char>(0));
524b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner    slice = StringPiece(&*v.begin() + 1, v.size() - 1);
525a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl    EXPECT_TRUE(DecodeBinary(&slice, &result));
526b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner    EXPECT_EQ(value, result);
527b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner    EXPECT_TRUE(slice.empty());
528b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner  }
529b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner}
530b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
5310558df2da807646e65d4fa290f4e92114af1a746Chris Lattnerstatic std::string WrappedEncodeDouble(double value) {
5320558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  std::string buffer;
5330558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  EncodeDouble(value, &buffer);
534a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl  return buffer;
5358538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl}
5360558df2da807646e65d4fa290f4e92114af1a746Chris Lattner
5370558df2da807646e65d4fa290f4e92114af1a746Chris LattnerTEST(IndexedDBLevelDBCodingTest, EncodeDouble) {
5380558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  EXPECT_EQ(8u, WrappedEncodeDouble(0).size());
5390558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  EXPECT_EQ(8u, WrappedEncodeDouble(3.14).size());
5400558df2da807646e65d4fa290f4e92114af1a746Chris Lattner}
5410558df2da807646e65d4fa290f4e92114af1a746Chris Lattner
5420558df2da807646e65d4fa290f4e92114af1a746Chris LattnerTEST(IndexedDBLevelDBCodingTest, DecodeDouble) {
5430558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  std::vector<double> test_cases;
5440558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  test_cases.push_back(3.14);
5450558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  test_cases.push_back(-3.14);
5460558df2da807646e65d4fa290f4e92114af1a746Chris Lattner
5470558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  for (size_t i = 0; i < test_cases.size(); ++i) {
5480558df2da807646e65d4fa290f4e92114af1a746Chris Lattner    double value = test_cases[i];
5490558df2da807646e65d4fa290f4e92114af1a746Chris Lattner    std::string v = WrappedEncodeDouble(value);
5500558df2da807646e65d4fa290f4e92114af1a746Chris Lattner    ASSERT_GT(v.size(), 0u);
5510558df2da807646e65d4fa290f4e92114af1a746Chris Lattner    StringPiece slice(v);
5520558df2da807646e65d4fa290f4e92114af1a746Chris Lattner    double result;
5530558df2da807646e65d4fa290f4e92114af1a746Chris Lattner    EXPECT_TRUE(DecodeDouble(&slice, &result));
5540558df2da807646e65d4fa290f4e92114af1a746Chris Lattner    EXPECT_EQ(value, result);
5550558df2da807646e65d4fa290f4e92114af1a746Chris Lattner    EXPECT_TRUE(slice.empty());
5560558df2da807646e65d4fa290f4e92114af1a746Chris Lattner
5570558df2da807646e65d4fa290f4e92114af1a746Chris Lattner    slice = StringPiece(&*v.begin(), v.size() - 1);
5580558df2da807646e65d4fa290f4e92114af1a746Chris Lattner    EXPECT_FALSE(DecodeDouble(&slice, &result));
5590558df2da807646e65d4fa290f4e92114af1a746Chris Lattner
5600558df2da807646e65d4fa290f4e92114af1a746Chris Lattner    slice = StringPiece(&*v.begin(), static_cast<size_t>(0));
5610558df2da807646e65d4fa290f4e92114af1a746Chris Lattner    EXPECT_FALSE(DecodeDouble(&slice, &result));
5620558df2da807646e65d4fa290f4e92114af1a746Chris Lattner
5630558df2da807646e65d4fa290f4e92114af1a746Chris Lattner    // Verify decoding at an offset, to detect unaligned memory access.
5640558df2da807646e65d4fa290f4e92114af1a746Chris Lattner    v.insert(v.begin(), 1u, static_cast<char>(0));
5650558df2da807646e65d4fa290f4e92114af1a746Chris Lattner    slice = StringPiece(&*v.begin() + 1, v.size() - 1);
5660558df2da807646e65d4fa290f4e92114af1a746Chris Lattner    EXPECT_TRUE(DecodeDouble(&slice, &result));
5670558df2da807646e65d4fa290f4e92114af1a746Chris Lattner    EXPECT_EQ(value, result);
5680558df2da807646e65d4fa290f4e92114af1a746Chris Lattner    EXPECT_TRUE(slice.empty());
5690558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  }
5700558df2da807646e65d4fa290f4e92114af1a746Chris Lattner}
5710558df2da807646e65d4fa290f4e92114af1a746Chris Lattner
5720558df2da807646e65d4fa290f4e92114af1a746Chris LattnerTEST(IndexedDBLevelDBCodingTest, EncodeDecodeIDBKey) {
5730558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  IndexedDBKey expected_key;
5740558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  scoped_ptr<IndexedDBKey> decoded_key;
5750558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  std::string v;
5760558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  StringPiece slice;
5770558df2da807646e65d4fa290f4e92114af1a746Chris Lattner
5780558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  std::vector<IndexedDBKey> test_cases;
5790558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  test_cases.push_back(IndexedDBKey(1234, WebIDBKeyTypeNumber));
5800558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  test_cases.push_back(IndexedDBKey(7890, WebIDBKeyTypeDate));
5810558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  test_cases.push_back(IndexedDBKey(ASCIIToUTF16("Hello World!")));
5820558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  test_cases.push_back(IndexedDBKey(std::string("\x01\x02")));
5830558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  test_cases.push_back(IndexedDBKey(IndexedDBKey::KeyArray()));
5840558df2da807646e65d4fa290f4e92114af1a746Chris Lattner
5850558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  IndexedDBKey::KeyArray array;
5860558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  array.push_back(IndexedDBKey(1234, WebIDBKeyTypeNumber));
5870558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  array.push_back(IndexedDBKey(7890, WebIDBKeyTypeDate));
5880558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  array.push_back(IndexedDBKey(ASCIIToUTF16("Hello World!")));
5890558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  array.push_back(IndexedDBKey(std::string("\x01\x02")));
5900558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  array.push_back(IndexedDBKey(IndexedDBKey::KeyArray()));
5910558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  test_cases.push_back(IndexedDBKey(array));
5920558df2da807646e65d4fa290f4e92114af1a746Chris Lattner
5930558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  for (size_t i = 0; i < test_cases.size(); ++i) {
5940558df2da807646e65d4fa290f4e92114af1a746Chris Lattner    expected_key = test_cases[i];
5950558df2da807646e65d4fa290f4e92114af1a746Chris Lattner    v.clear();
5960558df2da807646e65d4fa290f4e92114af1a746Chris Lattner    EncodeIDBKey(expected_key, &v);
5970558df2da807646e65d4fa290f4e92114af1a746Chris Lattner    slice = StringPiece(&*v.begin(), v.size());
5980558df2da807646e65d4fa290f4e92114af1a746Chris Lattner    EXPECT_TRUE(DecodeIDBKey(&slice, &decoded_key));
5990558df2da807646e65d4fa290f4e92114af1a746Chris Lattner    EXPECT_TRUE(decoded_key->Equals(expected_key));
6000558df2da807646e65d4fa290f4e92114af1a746Chris Lattner    EXPECT_TRUE(slice.empty());
601eb7f96141f754150a92433286fa385910a22f494Sam Weinig
602eb7f96141f754150a92433286fa385910a22f494Sam Weinig    slice = StringPiece(&*v.begin(), v.size() - 1);
603eb7f96141f754150a92433286fa385910a22f494Sam Weinig    EXPECT_FALSE(DecodeIDBKey(&slice, &decoded_key));
604eb7f96141f754150a92433286fa385910a22f494Sam Weinig
605eb7f96141f754150a92433286fa385910a22f494Sam Weinig    slice = StringPiece(&*v.begin(), static_cast<size_t>(0));
606eb7f96141f754150a92433286fa385910a22f494Sam Weinig    EXPECT_FALSE(DecodeIDBKey(&slice, &decoded_key));
607eb7f96141f754150a92433286fa385910a22f494Sam Weinig  }
608eb7f96141f754150a92433286fa385910a22f494Sam Weinig}
609eb7f96141f754150a92433286fa385910a22f494Sam Weinig
6100558df2da807646e65d4fa290f4e92114af1a746Chris Lattnerstatic std::string WrappedEncodeIDBKeyPath(const IndexedDBKeyPath& value) {
611b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner  std::string buffer;
6121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  EncodeIDBKeyPath(value, &buffer);
613a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl  return buffer;
614b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner}
615b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
6161eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTEST(IndexedDBLevelDBCodingTest, EncodeDecodeIDBKeyPath) {
6178538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  std::vector<IndexedDBKeyPath> key_paths;
6188538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  std::vector<std::string> encoded_paths;
6191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6203397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl  {
621f29f0a28c4d9599b389bbb6d186e14af753dc5a3Sebastian Redl    key_paths.push_back(IndexedDBKeyPath());
62251e774d42269e3b22d746184c0b9076fc13b32e6Zhongxing Xu    char expected[] = {0, 0,  // Header
623b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner                       0      // Type is null
624b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner    };
625b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner    encoded_paths.push_back(
626ab41e63821dc60ad144d0684df8d79a9eef86b75Douglas Gregor        std::string(expected, expected + arraysize(expected)));
627b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner  }
628b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
629b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner  {
630b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner    key_paths.push_back(IndexedDBKeyPath(base::string16()));
631b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner    char expected[] = {0, 0,  // Header
632b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner                       1,     // Type is string
63349b96d1a382ae9f31456166f1a734d3f7f30b992Argyrios Kyrtzidis                       0      // Length is 0
634b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner    };
635b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner    encoded_paths.push_back(
636b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner        std::string(expected, expected + arraysize(expected)));
637b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner  }
6387f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor
6397f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor  {
6404fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor    key_paths.push_back(IndexedDBKeyPath(ASCIIToUTF16("foo")));
641b81c17092039f39be60e9656a37cffbdf2e2c783Douglas Gregor    char expected[] = {0, 0,                      // Header
6425b4ec636637c9d876102240127cc0dca9280e83aTed Kremenek                       1,                         // Type is string
6436a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor                       3, 0, 'f', 0, 'o', 0, 'o'  // String length 3, UTF-16BE
644a93e3b5bde9f0a7b59215f19f176f7d69881b81cSebastian Redl    };
645320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian    encoded_paths.push_back(
6466a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor        std::string(expected, expected + arraysize(expected)));
647b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner  }
6482f4efd10c805cb779618c1a22a35eb07b5043c4eChris Lattner
649b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner  {
650b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner    key_paths.push_back(IndexedDBKeyPath(ASCIIToUTF16("foo.bar")));
651b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner    char expected[] = {0, 0,  // Header
652b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner                       1,     // Type is string
653b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner                       7, 0, 'f', 0, 'o', 0, 'o', 0, '.', 0, 'b', 0, 'a', 0,
6541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                       'r'  // String length 7, UTF-16BE
655b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner    };
6562f4efd10c805cb779618c1a22a35eb07b5043c4eChris Lattner    encoded_paths.push_back(
657b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner        std::string(expected, expected + arraysize(expected)));
658b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner  }
659b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
6606a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor  {
6616a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor    std::vector<base::string16> array;
6626a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor    array.push_back(base::string16());
66361d60ee6aa0a5ded0ddcf48679673b37506a1895Douglas Gregor    array.push_back(ASCIIToUTF16("foo"));
66461d60ee6aa0a5ded0ddcf48679673b37506a1895Douglas Gregor    array.push_back(ASCIIToUTF16("foo.bar"));
665b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
666b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner    key_paths.push_back(IndexedDBKeyPath(array));
667b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner    char expected[] = {0, 0,                       // Header
668b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner                       2, 3,                       // Type is array, length is 3
669b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner                       0,                          // Member 1 (String length 0)
670b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner                       3, 0, 'f', 0, 'o', 0, 'o',  // Member 2 (String length 3)
671b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner                       7, 0, 'f', 0, 'o', 0, 'o', 0, '.', 0, 'b', 0, 'a', 0,
672b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner                       'r'  // Member 3 (String length 7)
673b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner    };
674b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner    encoded_paths.push_back(
675b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner        std::string(expected, expected + arraysize(expected)));
676b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner  }
677b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
678b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner  ASSERT_EQ(key_paths.size(), encoded_paths.size());
679b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner  for (size_t i = 0; i < key_paths.size(); ++i) {
680b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner    IndexedDBKeyPath key_path = key_paths[i];
681b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner    std::string encoded = encoded_paths[i];
682b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
683b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner    std::string v = WrappedEncodeIDBKeyPath(key_path);
684b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner    EXPECT_EQ(encoded, v);
685a53d2cbe37e4be0d95b9d3e09f74eafae31fc940John McCall
686d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff    StringPiece slice(encoded);
6870ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner    IndexedDBKeyPath decoded;
6880ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner    EXPECT_TRUE(DecodeIDBKeyPath(&slice, &decoded));
6890ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner    EXPECT_EQ(key_path, decoded);
6900ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner    EXPECT_TRUE(slice.empty());
6910ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner  }
6920ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner}
6930ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner
6940ff8cda4442cff571aba1be91dd16f64a0bf16aaChris LattnerTEST(IndexedDBLevelDBCodingTest, EncodeDecodeBlobJournal) {
6950ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner  std::vector<IndexedDBKeyPath> key_paths;
6960ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner  std::vector<std::string> encoded_paths;
6970ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner
6980ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner  std::vector<BlobJournalType> journals;
6990ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner
7000ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner  {  // Empty journal
7010ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner    BlobJournalType journal;
7020ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner    journals.push_back(journal);
7030ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner  }
7040ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner
7050ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner  {  // One item
7060ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner    BlobJournalType journal;
707b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner    journal.push_back(std::make_pair(4, 7));
708b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner    journals.push_back(journal);
7090ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner  }
710b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
7110ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner  {  // kAllBlobsKey
7120ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner    BlobJournalType journal;
7130ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner    journal.push_back(std::make_pair(5, DatabaseMetaDataKey::kAllBlobsKey));
7140ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner    journals.push_back(journal);
71561d60ee6aa0a5ded0ddcf48679673b37506a1895Douglas Gregor  }
7160558df2da807646e65d4fa290f4e92114af1a746Chris Lattner
717b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner  {  // A bunch of items
718b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner    BlobJournalType journal;
719b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner    journal.push_back(std::make_pair(4, 7));
720b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner    journal.push_back(std::make_pair(5, 6));
721b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner    journal.push_back(std::make_pair(4, 5));
722e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor    journal.push_back(std::make_pair(4, 4));
723e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor    journal.push_back(std::make_pair(1, 12));
7241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    journal.push_back(std::make_pair(4, 3));
725e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor    journal.push_back(std::make_pair(15, 14));
726e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor    journals.push_back(journal);
727e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor  }
728e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor
729e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor  std::vector<BlobJournalType>::const_iterator journal_iter;
730e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor  for (journal_iter = journals.begin(); journal_iter != journals.end();
731e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor       ++journal_iter) {
7321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    std::string encoding;
733e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor    EncodeBlobJournal(*journal_iter, &encoding);
734e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor    StringPiece slice(encoding);
7351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    BlobJournalType journal_out;
736e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor    EXPECT_TRUE(DecodeBlobJournal(&slice, &journal_out));
737e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor    EXPECT_EQ(*journal_iter, journal_out);
7381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
739e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor
740e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor  journals.clear();
741e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor
742e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor  {  // Illegal database id
743e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor    BlobJournalType journal;
7441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    journal.push_back(std::make_pair(0, 3));
745e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor    journals.push_back(journal);
746e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor  }
747e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor
7481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  {  // Illegal blob id
749e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor    BlobJournalType journal;
750e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor    journal.push_back(std::make_pair(4, 0));
751e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor    journals.push_back(journal);
752e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor  }
753e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor
7541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  for (journal_iter = journals.begin(); journal_iter != journals.end();
755e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor       ++journal_iter) {
756e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor    std::string encoding;
757b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner    EncodeBlobJournal(*journal_iter, &encoding);
7583397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl    StringPiece slice(encoding);
759a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl    BlobJournalType journal_out;
7602bec0410d268779f601bd509e0302a500af7ac6aDouglas Gregor    EXPECT_FALSE(DecodeBlobJournal(&slice, &journal_out));
761b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor  }
762e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor}
763e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor
764e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas GregorTEST(IndexedDBLevelDBCodingTest, DecodeLegacyIDBKeyPath) {
76577f4603c8b142e642300959a601ecec2b7c8e288Sebastian Redl  // Legacy encoding of string key paths.
7668538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  std::vector<IndexedDBKeyPath> key_paths;
7673397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl  std::vector<std::string> encoded_paths;
7683397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl
769e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor  {
770e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor    key_paths.push_back(IndexedDBKeyPath(base::string16()));
771e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor    encoded_paths.push_back(std::string());
77277f4603c8b142e642300959a601ecec2b7c8e288Sebastian Redl  }
77377f4603c8b142e642300959a601ecec2b7c8e288Sebastian Redl  {
774e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor    key_paths.push_back(IndexedDBKeyPath(ASCIIToUTF16("foo")));
7751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    char expected[] = {0, 'f', 0, 'o', 0, 'o'};
776e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor    encoded_paths.push_back(std::string(expected, arraysize(expected)));
7778538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  }
7788538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  {
7798538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    key_paths.push_back(IndexedDBKeyPath(ASCIIToUTF16("foo.bar")));
780e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor    char expected[] = {0, 'f', 0, 'o', 0, 'o', 0, '.', 0, 'b', 0, 'a', 0, 'r'};
781e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor    encoded_paths.push_back(std::string(expected, arraysize(expected)));
782e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor  }
78377f4603c8b142e642300959a601ecec2b7c8e288Sebastian Redl
78477f4603c8b142e642300959a601ecec2b7c8e288Sebastian Redl  ASSERT_EQ(key_paths.size(), encoded_paths.size());
78577f4603c8b142e642300959a601ecec2b7c8e288Sebastian Redl  for (size_t i = 0; i < key_paths.size(); ++i) {
7861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    IndexedDBKeyPath key_path = key_paths[i];
787b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor    std::string encoded = encoded_paths[i];
788b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor
789b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor    StringPiece slice(encoded);
790b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor    IndexedDBKeyPath decoded;
7918538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    EXPECT_TRUE(DecodeIDBKeyPath(&slice, &decoded));
792b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor    EXPECT_EQ(key_path, decoded);
793b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor    EXPECT_TRUE(slice.empty());
794b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor  }
795b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor}
7961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
79711a18f115e8974ef24e8d5bb549ed3289871efa4Kovarththanan RajaratnamTEST(IndexedDBLevelDBCodingTest, ExtractAndCompareIDBKeys) {
798b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor  std::vector<IndexedDBKey> keys;
799aba54a95e9d5e4dc9056abec6bb70ea777c4a7bcKovarththanan Rajaratnam
8001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  keys.push_back(IndexedDBKey(-10, WebIDBKeyTypeNumber));
801e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor  keys.push_back(IndexedDBKey(0, WebIDBKeyTypeNumber));
802b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor  keys.push_back(IndexedDBKey(3.14, WebIDBKeyTypeNumber));
8038538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl
804ec312a1f0557b1d27f3eb6cf49acbf7e72696422Daniel Dunbar  keys.push_back(IndexedDBKey(0, WebIDBKeyTypeDate));
805b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor  keys.push_back(IndexedDBKey(100, WebIDBKeyTypeDate));
80611a18f115e8974ef24e8d5bb549ed3289871efa4Kovarththanan Rajaratnam  keys.push_back(IndexedDBKey(100000, WebIDBKeyTypeDate));
807f7a96a39958b3f919f26764777eec948b43d74bcTed Kremenek
808f7a96a39958b3f919f26764777eec948b43d74bcTed Kremenek  keys.push_back(IndexedDBKey(ASCIIToUTF16("")));
8098538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  keys.push_back(IndexedDBKey(ASCIIToUTF16("a")));
810f7a96a39958b3f919f26764777eec948b43d74bcTed Kremenek  keys.push_back(IndexedDBKey(ASCIIToUTF16("b")));
811f7a96a39958b3f919f26764777eec948b43d74bcTed Kremenek  keys.push_back(IndexedDBKey(ASCIIToUTF16("baaa")));
812445e23e9b909ec8e21303c7dd82c90b72fc09ac4Douglas Gregor  keys.push_back(IndexedDBKey(ASCIIToUTF16("baab")));
8138538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  keys.push_back(IndexedDBKey(ASCIIToUTF16("c")));
814f7a96a39958b3f919f26764777eec948b43d74bcTed Kremenek
815f7a96a39958b3f919f26764777eec948b43d74bcTed Kremenek  keys.push_back(IndexedDBKey(std::string()));
8162bec0410d268779f601bd509e0302a500af7ac6aDouglas Gregor  keys.push_back(IndexedDBKey(std::string("\x01")));
8172bec0410d268779f601bd509e0302a500af7ac6aDouglas Gregor  keys.push_back(IndexedDBKey(std::string("\x01\x01")));
8182bec0410d268779f601bd509e0302a500af7ac6aDouglas Gregor  keys.push_back(IndexedDBKey(std::string("\x01\x02")));
819a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl  keys.push_back(IndexedDBKey(std::string("\x02")));
8200a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor  keys.push_back(IndexedDBKey(std::string("\x02\x01")));
8210a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor  keys.push_back(IndexedDBKey(std::string("\x02\x02")));
8220a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor  keys.push_back(IndexedDBKey(std::string("\xff")));
8230a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor
8240a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor  keys.push_back(CreateArrayIDBKey());
8250a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor  keys.push_back(CreateArrayIDBKey(IndexedDBKey(0, WebIDBKeyTypeNumber)));
826eb5d7b752651283de5abfcc2f91df7227582a08dChandler Carruth  keys.push_back(CreateArrayIDBKey(IndexedDBKey(0, WebIDBKeyTypeNumber),
8270a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor                                   IndexedDBKey(3.14, WebIDBKeyTypeNumber)));
8280a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor  keys.push_back(CreateArrayIDBKey(IndexedDBKey(0, WebIDBKeyTypeDate)));
8290a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor  keys.push_back(CreateArrayIDBKey(IndexedDBKey(0, WebIDBKeyTypeDate),
8300a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor                                   IndexedDBKey(0, WebIDBKeyTypeDate)));
8310a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor  keys.push_back(CreateArrayIDBKey(IndexedDBKey(ASCIIToUTF16(""))));
8320a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor  keys.push_back(CreateArrayIDBKey(IndexedDBKey(ASCIIToUTF16("")),
8330a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor                                   IndexedDBKey(ASCIIToUTF16("a"))));
8340a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor  keys.push_back(CreateArrayIDBKey(CreateArrayIDBKey()));
8351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  keys.push_back(CreateArrayIDBKey(CreateArrayIDBKey(), CreateArrayIDBKey()));
8360a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor  keys.push_back(CreateArrayIDBKey(CreateArrayIDBKey(CreateArrayIDBKey())));
8370a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor  keys.push_back(CreateArrayIDBKey(
83811a18f115e8974ef24e8d5bb549ed3289871efa4Kovarththanan Rajaratnam      CreateArrayIDBKey(CreateArrayIDBKey(CreateArrayIDBKey()))));
839412e798941ca64e2e6b084323915fa9aa5f6bdf3Fariborz Jahanian
84011a18f115e8974ef24e8d5bb549ed3289871efa4Kovarththanan Rajaratnam  for (size_t i = 0; i < keys.size() - 1; ++i) {
841412e798941ca64e2e6b084323915fa9aa5f6bdf3Fariborz Jahanian    const IndexedDBKey& key_a = keys[i];
8424c9d8d0eca5ca635d9a30222f690db9140e98325Fariborz Jahanian    const IndexedDBKey& key_b = keys[i + 1];
8431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8440a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor    EXPECT_TRUE(key_a.IsLessThan(key_b));
8450a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor
8460a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor    std::string encoded_a;
847b9e7e63ae2098bc02e79c032df0a3124d09a4b4eNate Begeman    EncodeIDBKey(key_a, &encoded_a);
8480a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor    EXPECT_TRUE(encoded_a.size());
84973482884560be041d86eccbd7dd5a6918677393bDaniel Dunbar    std::string encoded_b;
8500a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor    EncodeIDBKey(key_b, &encoded_b);
8510a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor    EXPECT_TRUE(encoded_b.size());
8520a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor
8530a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor    std::string extracted_a;
8540a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor    std::string extracted_b;
855ea5ce4705df0743093925585d8edc80e0d8fe3ffChris Lattner    StringPiece slice;
856ea5ce4705df0743093925585d8edc80e0d8fe3ffChris Lattner
857972d954bd216c86a961bb7f81c53af85de17c2f0Douglas Gregor    slice = StringPiece(encoded_a);
8580a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor    EXPECT_TRUE(ExtractEncodedIDBKey(&slice, &extracted_a));
8590a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor    EXPECT_TRUE(slice.empty());
8600a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor    EXPECT_EQ(encoded_a, extracted_a);
8610a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor
8620a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor    slice = StringPiece(encoded_b);
8630a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor    EXPECT_TRUE(ExtractEncodedIDBKey(&slice, &extracted_b));
864a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner    EXPECT_TRUE(slice.empty());
865a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner    EXPECT_EQ(encoded_b, extracted_b);
8660a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor
8670a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor    EXPECT_LT(CompareKeys(extracted_a, extracted_b), 0);
8681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    EXPECT_GT(CompareKeys(extracted_b, extracted_a), 0);
8690a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor    EXPECT_EQ(CompareKeys(extracted_a, extracted_a), 0);
8700a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor    EXPECT_EQ(CompareKeys(extracted_b, extracted_b), 0);
8710a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor
8720a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor    slice = StringPiece(&*encoded_a.begin(), encoded_a.size() - 1);
8730a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor    EXPECT_FALSE(ExtractEncodedIDBKey(&slice, &extracted_a));
8740a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor  }
8750a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor}
8760a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor
877a33d9b4ebf732a5da6d56fd7319ff6c020789b1cAnders CarlssonTEST(IndexedDBLevelDBCodingTest, ComparisonTest) {
878a33d9b4ebf732a5da6d56fd7319ff6c020789b1cAnders Carlsson  std::vector<std::string> keys;
87915b91764d08e886391c865c4a444d7b51141c284Eli Friedman  keys.push_back(SchemaVersionKey::Encode());
88015b91764d08e886391c865c4a444d7b51141c284Eli Friedman  keys.push_back(MaxDatabaseIdKey::Encode());
881a6fda124bf380479529d6a80b84b62cacd3cb707John Thompson  keys.push_back(DatabaseFreeListKey::Encode(0));
8820a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor  keys.push_back(DatabaseFreeListKey::EncodeMaxKey());
8830a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor  keys.push_back(DatabaseNameKey::Encode("", ASCIIToUTF16("")));
884ab8e281b32a3d3b9b18257d26844362bf806ecdcDaniel Dunbar  keys.push_back(DatabaseNameKey::Encode("", ASCIIToUTF16("a")));
8850a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor  keys.push_back(DatabaseNameKey::Encode("a", ASCIIToUTF16("a")));
886b9e7e63ae2098bc02e79c032df0a3124d09a4b4eNate Begeman  keys.push_back(
8879c276ae0f24d4cee8f7954069d4b8eae45d0447dMike Stump      DatabaseMetaDataKey::Encode(1, DatabaseMetaDataKey::ORIGIN_NAME));
88892f5822df6a0d7571df44b5d279ed4f017fbb0e6Anders Carlsson  keys.push_back(
889a0068fc64351db9c47916566e3b85ab733cd8d6dDouglas Gregor      DatabaseMetaDataKey::Encode(1, DatabaseMetaDataKey::DATABASE_NAME));
8908538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  keys.push_back(
8910a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor      DatabaseMetaDataKey::Encode(1, DatabaseMetaDataKey::USER_VERSION));
8920a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor  keys.push_back(
89314f79002e58556798e86168c63e48d533287eda5Douglas Gregor      DatabaseMetaDataKey::Encode(1, DatabaseMetaDataKey::MAX_OBJECT_STORE_ID));
8944fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  keys.push_back(
8954fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      DatabaseMetaDataKey::Encode(1, DatabaseMetaDataKey::USER_INT_VERSION));
8964fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  keys.push_back(
8974fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      ObjectStoreMetaDataKey::Encode(1, 1, ObjectStoreMetaDataKey::NAME));
8984fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  keys.push_back(
8993397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl      ObjectStoreMetaDataKey::Encode(1, 1, ObjectStoreMetaDataKey::KEY_PATH));
9004fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  keys.push_back(ObjectStoreMetaDataKey::Encode(
9014fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      1, 1, ObjectStoreMetaDataKey::AUTO_INCREMENT));
9024fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  keys.push_back(
9031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      ObjectStoreMetaDataKey::Encode(1, 1, ObjectStoreMetaDataKey::EVICTABLE));
9044fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  keys.push_back(ObjectStoreMetaDataKey::Encode(
9054fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      1, 1, ObjectStoreMetaDataKey::LAST_VERSION));
9064fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  keys.push_back(ObjectStoreMetaDataKey::Encode(
9074fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      1, 1, ObjectStoreMetaDataKey::MAX_INDEX_ID));
9082596e429a61602312bdd149786045b8a90cd2d10Daniel Dunbar  keys.push_back(ObjectStoreMetaDataKey::Encode(
9094fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      1, 1, ObjectStoreMetaDataKey::HAS_KEY_PATH));
9101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  keys.push_back(ObjectStoreMetaDataKey::Encode(
9111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      1, 1, ObjectStoreMetaDataKey::KEY_GENERATOR_CURRENT_NUMBER));
9124fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  keys.push_back(ObjectStoreMetaDataKey::EncodeMaxKey(1, 1));
9134fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  keys.push_back(ObjectStoreMetaDataKey::EncodeMaxKey(1, 2));
9144fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  keys.push_back(ObjectStoreMetaDataKey::EncodeMaxKey(1));
9154fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  keys.push_back(IndexMetaDataKey::Encode(1, 1, 30, IndexMetaDataKey::NAME));
9164fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  keys.push_back(IndexMetaDataKey::Encode(1, 1, 30, IndexMetaDataKey::UNIQUE));
9174fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  keys.push_back(
9184fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      IndexMetaDataKey::Encode(1, 1, 30, IndexMetaDataKey::KEY_PATH));
9194fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  keys.push_back(
9204fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      IndexMetaDataKey::Encode(1, 1, 30, IndexMetaDataKey::MULTI_ENTRY));
9214fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  keys.push_back(IndexMetaDataKey::Encode(1, 1, 31, 0));
9221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  keys.push_back(IndexMetaDataKey::Encode(1, 1, 31, 1));
9234fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  keys.push_back(IndexMetaDataKey::EncodeMaxKey(1, 1, 31));
9244fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  keys.push_back(IndexMetaDataKey::EncodeMaxKey(1, 1, 32));
9254fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  keys.push_back(IndexMetaDataKey::EncodeMaxKey(1, 1));
9261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  keys.push_back(IndexMetaDataKey::EncodeMaxKey(1, 2));
9274fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  keys.push_back(ObjectStoreFreeListKey::Encode(1, 1));
9284fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  keys.push_back(ObjectStoreFreeListKey::EncodeMaxKey(1));
9294fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  keys.push_back(IndexFreeListKey::Encode(1, 1, kMinimumIndexId));
9304fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  keys.push_back(IndexFreeListKey::EncodeMaxKey(1, 1));
9311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  keys.push_back(IndexFreeListKey::Encode(1, 2, kMinimumIndexId));
9324fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  keys.push_back(IndexFreeListKey::EncodeMaxKey(1, 2));
9334fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  keys.push_back(ObjectStoreNamesKey::Encode(1, ASCIIToUTF16("")));
9341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  keys.push_back(ObjectStoreNamesKey::Encode(1, ASCIIToUTF16("a")));
9354fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  keys.push_back(IndexNamesKey::Encode(1, 1, ASCIIToUTF16("")));
9364fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  keys.push_back(IndexNamesKey::Encode(1, 1, ASCIIToUTF16("a")));
9374fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  keys.push_back(IndexNamesKey::Encode(1, 2, ASCIIToUTF16("a")));
9384fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  keys.push_back(ObjectStoreDataKey::Encode(1, 1, std::string()));
9394fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  keys.push_back(ObjectStoreDataKey::Encode(1, 1, MinIDBKey()));
9404fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  keys.push_back(ObjectStoreDataKey::Encode(1, 1, MaxIDBKey()));
9414fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  keys.push_back(ExistsEntryKey::Encode(1, 1, std::string()));
9424fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  keys.push_back(ExistsEntryKey::Encode(1, 1, MinIDBKey()));
9434fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  keys.push_back(ExistsEntryKey::Encode(1, 1, MaxIDBKey()));
9444fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  keys.push_back(IndexDataKey::Encode(1, 1, 30, MinIDBKey(), std::string(), 0));
9454fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  keys.push_back(IndexDataKey::Encode(1, 1, 30, MinIDBKey(), MinIDBKey(), 0));
9464fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  keys.push_back(IndexDataKey::Encode(1, 1, 30, MinIDBKey(), MinIDBKey(), 1));
9474fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  keys.push_back(IndexDataKey::Encode(1, 1, 30, MinIDBKey(), MaxIDBKey(), 0));
9483397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl  keys.push_back(IndexDataKey::Encode(1, 1, 30, MinIDBKey(), MaxIDBKey(), 1));
949a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl  keys.push_back(IndexDataKey::Encode(1, 1, 30, MaxIDBKey(), MinIDBKey(), 0));
9504fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  keys.push_back(IndexDataKey::Encode(1, 1, 30, MaxIDBKey(), MinIDBKey(), 1));
9514fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  keys.push_back(IndexDataKey::Encode(1, 1, 30, MaxIDBKey(), MaxIDBKey(), 0));
9523397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl  keys.push_back(IndexDataKey::Encode(1, 1, 30, MaxIDBKey(), MaxIDBKey(), 1));
9534fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  keys.push_back(IndexDataKey::Encode(1, 1, 31, MinIDBKey(), MinIDBKey(), 0));
9541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  keys.push_back(IndexDataKey::Encode(1, 2, 30, MinIDBKey(), MinIDBKey(), 0));
9554fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  keys.push_back(
956e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor      IndexDataKey::EncodeMaxKey(1, 2, std::numeric_limits<int32>::max() - 1));
957e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor
958e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor  for (size_t i = 0; i < keys.size(); ++i) {
959e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor    EXPECT_EQ(Compare(keys[i], keys[i], false), 0);
9601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
9614fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor    for (size_t j = i + 1; j < keys.size(); ++j) {
9621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      EXPECT_LT(Compare(keys[i], keys[j], false), 0);
9634fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor      EXPECT_GT(Compare(keys[j], keys[i], false), 0);
9644fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor    }
9654fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  }
9664fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor}
9674fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor
9684fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas GregorTEST(IndexedDBLevelDBCodingTest, EncodeVarIntVSEncodeByteTest) {
9694fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  std::vector<unsigned char> test_cases;
9704fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  test_cases.push_back(0);
9714fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  test_cases.push_back(1);
9724fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  test_cases.push_back(127);
9734fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor
9748538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  for (size_t i = 0; i < test_cases.size(); ++i) {
9754fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor    unsigned char n = test_cases[i];
9764fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor
9774fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor    std::string vA = WrappedEncodeByte(n);
9784fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor    std::string vB = WrappedEncodeVarInt(static_cast<int64>(n));
9794fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor
9804fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor    EXPECT_EQ(vA.size(), vB.size());
9814fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor    EXPECT_EQ(*vA.begin(), *vB.begin());
9828538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  }
9834fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor}
9844fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor
985ec312a1f0557b1d27f3eb6cf49acbf7e72696422Daniel Dunbar}  // namespace
9864fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor
9874fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor}  // namespace content
9884fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor