Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/browser/indexed_db/indexed_db_leveldb_coding.h" | 5 #include "content/browser/indexed_db/indexed_db_leveldb_coding.h" |
| 6 | 6 |
| 7 #include <limits> | 7 #include <limits> |
| 8 #include <string> | |
|
alecflett
2013/07/09 18:26:30
I think you still want <string> here, no?
jsbell
2013/07/09 19:41:46
Per pkasting on IRC: "Per the style guide, foo_uni
| |
| 9 #include <vector> | 8 #include <vector> |
| 10 | 9 |
| 11 #include "base/basictypes.h" | 10 #include "base/basictypes.h" |
| 12 #include "base/strings/string16.h" | 11 #include "base/strings/string16.h" |
| 13 #include "base/strings/string_piece.h" | 12 #include "base/strings/string_piece.h" |
| 14 #include "base/strings/utf_string_conversions.h" | 13 #include "base/strings/utf_string_conversions.h" |
| 15 #include "content/browser/indexed_db/leveldb/leveldb_slice.h" | |
| 16 #include "content/common/indexed_db/indexed_db_key.h" | 14 #include "content/common/indexed_db/indexed_db_key.h" |
| 17 #include "content/common/indexed_db/indexed_db_key_path.h" | 15 #include "content/common/indexed_db/indexed_db_key_path.h" |
| 18 #include "testing/gtest/include/gtest/gtest.h" | 16 #include "testing/gtest/include/gtest/gtest.h" |
| 19 | 17 |
| 20 using base::StringPiece; | 18 using base::StringPiece; |
| 21 using WebKit::WebIDBKey; | 19 using WebKit::WebIDBKey; |
| 22 using WebKit::WebIDBKeyPath; | 20 using WebKit::WebIDBKeyPath; |
| 23 | 21 |
| 24 namespace content { | 22 namespace content { |
| 25 | 23 |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 36 } | 34 } |
| 37 | 35 |
| 38 static IndexedDBKey CreateArrayIDBKey(const IndexedDBKey& key1, | 36 static IndexedDBKey CreateArrayIDBKey(const IndexedDBKey& key1, |
| 39 const IndexedDBKey& key2) { | 37 const IndexedDBKey& key2) { |
| 40 IndexedDBKey::KeyArray array; | 38 IndexedDBKey::KeyArray array; |
| 41 array.push_back(key1); | 39 array.push_back(key1); |
| 42 array.push_back(key2); | 40 array.push_back(key2); |
| 43 return IndexedDBKey(array); | 41 return IndexedDBKey(array); |
| 44 } | 42 } |
| 45 | 43 |
| 46 static std::vector<char> WrappedEncodeByte(char value) { | 44 static std::string WrappedEncodeByte(char value) { |
| 47 std::vector<char> buffer; | 45 std::string buffer; |
| 48 EncodeByte(value, &buffer); | 46 EncodeByte(value, &buffer); |
| 49 return buffer; | 47 return buffer; |
| 50 } | 48 } |
| 51 | 49 |
| 52 TEST(IndexedDBLevelDBCodingTest, EncodeByte) { | 50 TEST(IndexedDBLevelDBCodingTest, EncodeByte) { |
| 53 std::vector<char> expected; | 51 std::string expected; |
| 54 expected.push_back(0); | 52 expected.push_back(0); |
| 55 unsigned char c; | 53 unsigned char c; |
| 56 | 54 |
| 57 c = 0; | 55 c = 0; |
| 58 expected[0] = c; | 56 expected[0] = c; |
| 59 EXPECT_EQ(expected, WrappedEncodeByte(c)); | 57 EXPECT_EQ(expected, WrappedEncodeByte(c)); |
| 60 | 58 |
| 61 c = 1; | 59 c = 1; |
| 62 expected[0] = c; | 60 expected[0] = c; |
| 63 EXPECT_EQ(expected, WrappedEncodeByte(c)); | 61 EXPECT_EQ(expected, WrappedEncodeByte(c)); |
| 64 | 62 |
| 65 c = 255; | 63 c = 255; |
| 66 expected[0] = c; | 64 expected[0] = c; |
| 67 EXPECT_EQ(expected, WrappedEncodeByte(c)); | 65 EXPECT_EQ(expected, WrappedEncodeByte(c)); |
| 68 } | 66 } |
| 69 | 67 |
| 70 TEST(IndexedDBLevelDBCodingTest, DecodeByte) { | 68 TEST(IndexedDBLevelDBCodingTest, DecodeByte) { |
| 71 std::vector<unsigned char> test_cases; | 69 std::vector<unsigned char> test_cases; |
| 72 test_cases.push_back(0); | 70 test_cases.push_back(0); |
| 73 test_cases.push_back(1); | 71 test_cases.push_back(1); |
| 74 test_cases.push_back(255); | 72 test_cases.push_back(255); |
| 75 | 73 |
| 76 for (size_t i = 0; i < test_cases.size(); ++i) { | 74 for (size_t i = 0; i < test_cases.size(); ++i) { |
| 77 unsigned char n = test_cases[i]; | 75 unsigned char n = test_cases[i]; |
| 78 std::vector<char> v; | 76 std::string v; |
| 79 EncodeByte(n, &v); | 77 EncodeByte(n, &v); |
| 80 | 78 |
| 81 unsigned char res; | 79 unsigned char res; |
| 82 ASSERT_GT(v.size(), static_cast<size_t>(0)); | 80 ASSERT_GT(v.size(), static_cast<size_t>(0)); |
| 83 StringPiece slice(&*v.begin(), v.size()); | 81 StringPiece slice(&*v.begin(), v.size()); |
| 84 EXPECT_TRUE(DecodeByte(&slice, &res)); | 82 EXPECT_TRUE(DecodeByte(&slice, &res)); |
| 85 EXPECT_EQ(n, res); | 83 EXPECT_EQ(n, res); |
| 86 EXPECT_TRUE(slice.empty()); | 84 EXPECT_TRUE(slice.empty()); |
| 87 } | 85 } |
| 88 | 86 |
| 89 { | 87 { |
| 90 StringPiece slice; | 88 StringPiece slice; |
| 91 unsigned char value; | 89 unsigned char value; |
| 92 EXPECT_FALSE(DecodeByte(&slice, &value)); | 90 EXPECT_FALSE(DecodeByte(&slice, &value)); |
| 93 } | 91 } |
| 94 } | 92 } |
| 95 | 93 |
| 96 static std::vector<char> WrappedEncodeBool(bool value) { | 94 static std::string WrappedEncodeBool(bool value) { |
| 97 std::vector<char> buffer; | 95 std::string buffer; |
| 98 EncodeBool(value, &buffer); | 96 EncodeBool(value, &buffer); |
| 99 return buffer; | 97 return buffer; |
| 100 } | 98 } |
| 101 | 99 |
| 102 TEST(IndexedDBLevelDBCodingTest, EncodeBool) { | 100 TEST(IndexedDBLevelDBCodingTest, EncodeBool) { |
| 103 { | 101 { |
| 104 std::vector<char> expected; | 102 std::string expected; |
| 105 expected.push_back(1); | 103 expected.push_back(1); |
| 106 EXPECT_EQ(expected, WrappedEncodeBool(true)); | 104 EXPECT_EQ(expected, WrappedEncodeBool(true)); |
| 107 } | 105 } |
| 108 { | 106 { |
| 109 std::vector<char> expected; | 107 std::string expected; |
| 110 expected.push_back(0); | 108 expected.push_back(0); |
| 111 EXPECT_EQ(expected, WrappedEncodeBool(false)); | 109 EXPECT_EQ(expected, WrappedEncodeBool(false)); |
| 112 } | 110 } |
| 113 } | 111 } |
| 114 | 112 |
| 115 static int CompareKeys(const std::vector<char>& a, const std::vector<char>& b) { | 113 static int CompareKeys(const std::string& a, const std::string& b) { |
| 116 bool ok; | 114 bool ok; |
| 117 int result = CompareEncodedIDBKeys(a, b, &ok); | 115 int result = CompareEncodedIDBKeys(a, b, &ok); |
| 118 EXPECT_TRUE(ok); | 116 EXPECT_TRUE(ok); |
| 119 return result; | 117 return result; |
| 120 } | 118 } |
| 121 | 119 |
| 122 TEST(IndexedDBLevelDBCodingTest, MaxIDBKey) { | 120 TEST(IndexedDBLevelDBCodingTest, MaxIDBKey) { |
| 123 std::vector<char> max_key = MaxIDBKey(); | 121 std::string max_key = MaxIDBKey(); |
| 124 | 122 |
| 125 std::vector<char> min_key = MinIDBKey(); | 123 std::string min_key = MinIDBKey(); |
| 126 std::vector<char> array_key; | 124 std::string array_key; |
| 127 EncodeIDBKey(IndexedDBKey(IndexedDBKey::KeyArray()), &array_key); | 125 EncodeIDBKey(IndexedDBKey(IndexedDBKey::KeyArray()), &array_key); |
| 128 std::vector<char> string_key; | 126 std::string string_key; |
| 129 EncodeIDBKey(IndexedDBKey(ASCIIToUTF16("Hello world")), &string_key); | 127 EncodeIDBKey(IndexedDBKey(ASCIIToUTF16("Hello world")), &string_key); |
| 130 std::vector<char> number_key; | 128 std::string number_key; |
| 131 EncodeIDBKey(IndexedDBKey(3.14, WebIDBKey::NumberType), &number_key); | 129 EncodeIDBKey(IndexedDBKey(3.14, WebIDBKey::NumberType), &number_key); |
| 132 std::vector<char> date_key; | 130 std::string date_key; |
| 133 EncodeIDBKey(IndexedDBKey(1000000, WebIDBKey::DateType), &date_key); | 131 EncodeIDBKey(IndexedDBKey(1000000, WebIDBKey::DateType), &date_key); |
| 134 | 132 |
| 135 EXPECT_GT(CompareKeys(max_key, min_key), 0); | 133 EXPECT_GT(CompareKeys(max_key, min_key), 0); |
| 136 EXPECT_GT(CompareKeys(max_key, array_key), 0); | 134 EXPECT_GT(CompareKeys(max_key, array_key), 0); |
| 137 EXPECT_GT(CompareKeys(max_key, string_key), 0); | 135 EXPECT_GT(CompareKeys(max_key, string_key), 0); |
| 138 EXPECT_GT(CompareKeys(max_key, number_key), 0); | 136 EXPECT_GT(CompareKeys(max_key, number_key), 0); |
| 139 EXPECT_GT(CompareKeys(max_key, date_key), 0); | 137 EXPECT_GT(CompareKeys(max_key, date_key), 0); |
| 140 } | 138 } |
| 141 | 139 |
| 142 TEST(IndexedDBLevelDBCodingTest, MinIDBKey) { | 140 TEST(IndexedDBLevelDBCodingTest, MinIDBKey) { |
| 143 std::vector<char> min_key = MinIDBKey(); | 141 std::string min_key = MinIDBKey(); |
| 144 | 142 |
| 145 std::vector<char> max_key = MaxIDBKey(); | 143 std::string max_key = MaxIDBKey(); |
| 146 std::vector<char> array_key; | 144 std::string array_key; |
| 147 EncodeIDBKey(IndexedDBKey(IndexedDBKey::KeyArray()), &array_key); | 145 EncodeIDBKey(IndexedDBKey(IndexedDBKey::KeyArray()), &array_key); |
| 148 std::vector<char> string_key; | 146 std::string string_key; |
| 149 EncodeIDBKey(IndexedDBKey(ASCIIToUTF16("Hello world")), &string_key); | 147 EncodeIDBKey(IndexedDBKey(ASCIIToUTF16("Hello world")), &string_key); |
| 150 std::vector<char> number_key; | 148 std::string number_key; |
| 151 EncodeIDBKey(IndexedDBKey(3.14, WebIDBKey::NumberType), &number_key); | 149 EncodeIDBKey(IndexedDBKey(3.14, WebIDBKey::NumberType), &number_key); |
| 152 std::vector<char> date_key; | 150 std::string date_key; |
| 153 EncodeIDBKey(IndexedDBKey(1000000, WebIDBKey::DateType), &date_key); | 151 EncodeIDBKey(IndexedDBKey(1000000, WebIDBKey::DateType), &date_key); |
| 154 | 152 |
| 155 EXPECT_LT(CompareKeys(min_key, max_key), 0); | 153 EXPECT_LT(CompareKeys(min_key, max_key), 0); |
| 156 EXPECT_LT(CompareKeys(min_key, array_key), 0); | 154 EXPECT_LT(CompareKeys(min_key, array_key), 0); |
| 157 EXPECT_LT(CompareKeys(min_key, string_key), 0); | 155 EXPECT_LT(CompareKeys(min_key, string_key), 0); |
| 158 EXPECT_LT(CompareKeys(min_key, number_key), 0); | 156 EXPECT_LT(CompareKeys(min_key, number_key), 0); |
| 159 EXPECT_LT(CompareKeys(min_key, date_key), 0); | 157 EXPECT_LT(CompareKeys(min_key, date_key), 0); |
| 160 } | 158 } |
| 161 | 159 |
| 162 static std::vector<char> WrappedEncodeInt(int64 value) { | 160 static std::string WrappedEncodeInt(int64 value) { |
| 163 std::vector<char> buffer; | 161 std::string buffer; |
| 164 EncodeInt(value, &buffer); | 162 EncodeInt(value, &buffer); |
| 165 return buffer; | 163 return buffer; |
| 166 } | 164 } |
| 167 | 165 |
| 168 TEST(IndexedDBLevelDBCodingTest, EncodeInt) { | 166 TEST(IndexedDBLevelDBCodingTest, EncodeInt) { |
| 169 EXPECT_EQ(static_cast<size_t>(1), WrappedEncodeInt(0).size()); | 167 EXPECT_EQ(static_cast<size_t>(1), WrappedEncodeInt(0).size()); |
| 170 EXPECT_EQ(static_cast<size_t>(1), WrappedEncodeInt(1).size()); | 168 EXPECT_EQ(static_cast<size_t>(1), WrappedEncodeInt(1).size()); |
| 171 EXPECT_EQ(static_cast<size_t>(1), WrappedEncodeInt(255).size()); | 169 EXPECT_EQ(static_cast<size_t>(1), WrappedEncodeInt(255).size()); |
| 172 EXPECT_EQ(static_cast<size_t>(2), WrappedEncodeInt(256).size()); | 170 EXPECT_EQ(static_cast<size_t>(2), WrappedEncodeInt(256).size()); |
| 173 EXPECT_EQ(static_cast<size_t>(4), WrappedEncodeInt(0xffffffff).size()); | 171 EXPECT_EQ(static_cast<size_t>(4), WrappedEncodeInt(0xffffffff).size()); |
| 174 #ifdef NDEBUG | 172 #ifdef NDEBUG |
| 175 EXPECT_EQ(static_cast<size_t>(8), WrappedEncodeInt(-1).size()); | 173 EXPECT_EQ(static_cast<size_t>(8), WrappedEncodeInt(-1).size()); |
| 176 #endif | 174 #endif |
| 177 } | 175 } |
| 178 | 176 |
| 179 TEST(IndexedDBLevelDBCodingTest, DecodeBool) { | 177 TEST(IndexedDBLevelDBCodingTest, DecodeBool) { |
| 180 { | 178 { |
| 181 std::vector<char> encoded; | 179 std::string encoded; |
| 182 encoded.push_back(1); | 180 encoded.push_back(1); |
| 183 StringPiece slice(&*encoded.begin(), encoded.size()); | 181 StringPiece slice(&*encoded.begin(), encoded.size()); |
| 184 bool value; | 182 bool value; |
| 185 EXPECT_TRUE(DecodeBool(&slice, &value)); | 183 EXPECT_TRUE(DecodeBool(&slice, &value)); |
| 186 EXPECT_TRUE(value); | 184 EXPECT_TRUE(value); |
| 187 EXPECT_TRUE(slice.empty()); | 185 EXPECT_TRUE(slice.empty()); |
| 188 } | 186 } |
| 189 { | 187 { |
| 190 std::vector<char> encoded; | 188 std::string encoded; |
| 191 encoded.push_back(0); | 189 encoded.push_back(0); |
| 192 StringPiece slice(&*encoded.begin(), encoded.size()); | 190 StringPiece slice(&*encoded.begin(), encoded.size()); |
| 193 bool value; | 191 bool value; |
| 194 EXPECT_TRUE(DecodeBool(&slice, &value)); | 192 EXPECT_TRUE(DecodeBool(&slice, &value)); |
| 195 EXPECT_FALSE(value); | 193 EXPECT_FALSE(value); |
| 196 EXPECT_TRUE(slice.empty()); | 194 EXPECT_TRUE(slice.empty()); |
| 197 } | 195 } |
| 198 { | 196 { |
| 199 StringPiece slice; | 197 StringPiece slice; |
| 200 bool value; | 198 bool value; |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 211 test_cases.push_back(65535); | 209 test_cases.push_back(65535); |
| 212 test_cases.push_back(655536); | 210 test_cases.push_back(655536); |
| 213 test_cases.push_back(7711192431755665792ll); | 211 test_cases.push_back(7711192431755665792ll); |
| 214 test_cases.push_back(0x7fffffffffffffffll); | 212 test_cases.push_back(0x7fffffffffffffffll); |
| 215 #ifdef NDEBUG | 213 #ifdef NDEBUG |
| 216 test_cases.push_back(-3); | 214 test_cases.push_back(-3); |
| 217 #endif | 215 #endif |
| 218 | 216 |
| 219 for (size_t i = 0; i < test_cases.size(); ++i) { | 217 for (size_t i = 0; i < test_cases.size(); ++i) { |
| 220 int64 n = test_cases[i]; | 218 int64 n = test_cases[i]; |
| 221 std::vector<char> v = WrappedEncodeInt(n); | 219 std::string v = WrappedEncodeInt(n); |
| 222 ASSERT_GT(v.size(), static_cast<size_t>(0)); | 220 ASSERT_GT(v.size(), static_cast<size_t>(0)); |
| 223 StringPiece slice(&*v.begin(), v.size()); | 221 StringPiece slice(&*v.begin(), v.size()); |
| 224 int64 value; | 222 int64 value; |
| 225 EXPECT_TRUE(DecodeInt(&slice, &value)); | 223 EXPECT_TRUE(DecodeInt(&slice, &value)); |
| 226 EXPECT_EQ(n, value); | 224 EXPECT_EQ(n, value); |
| 227 EXPECT_TRUE(slice.empty()); | 225 EXPECT_TRUE(slice.empty()); |
| 228 | 226 |
| 229 // Verify decoding at an offset, to detect unaligned memory access. | 227 // Verify decoding at an offset, to detect unaligned memory access. |
| 230 v.insert(v.begin(), static_cast<size_t>(1), static_cast<char>(0)); | 228 v.insert(v.begin(), static_cast<size_t>(1), static_cast<char>(0)); |
| 231 slice = StringPiece(&*v.begin() + 1, v.size() - 1); | 229 slice = StringPiece(&*v.begin() + 1, v.size() - 1); |
| 232 EXPECT_TRUE(DecodeInt(&slice, &value)); | 230 EXPECT_TRUE(DecodeInt(&slice, &value)); |
| 233 EXPECT_EQ(n, value); | 231 EXPECT_EQ(n, value); |
| 234 EXPECT_TRUE(slice.empty()); | 232 EXPECT_TRUE(slice.empty()); |
| 235 } | 233 } |
| 236 { | 234 { |
| 237 StringPiece slice; | 235 StringPiece slice; |
| 238 int64 value; | 236 int64 value; |
| 239 EXPECT_FALSE(DecodeInt(&slice, &value)); | 237 EXPECT_FALSE(DecodeInt(&slice, &value)); |
| 240 } | 238 } |
| 241 } | 239 } |
| 242 | 240 |
| 243 static std::vector<char> WrappedEncodeVarInt(int64 value) { | 241 static std::string WrappedEncodeVarInt(int64 value) { |
| 244 std::vector<char> buffer; | 242 std::string buffer; |
| 245 EncodeVarInt(value, &buffer); | 243 EncodeVarInt(value, &buffer); |
| 246 return buffer; | 244 return buffer; |
| 247 } | 245 } |
| 248 | 246 |
| 249 TEST(IndexedDBLevelDBCodingTest, EncodeVarInt) { | 247 TEST(IndexedDBLevelDBCodingTest, EncodeVarInt) { |
| 250 EXPECT_EQ(static_cast<size_t>(1), WrappedEncodeVarInt(0).size()); | 248 EXPECT_EQ(static_cast<size_t>(1), WrappedEncodeVarInt(0).size()); |
| 251 EXPECT_EQ(static_cast<size_t>(1), WrappedEncodeVarInt(1).size()); | 249 EXPECT_EQ(static_cast<size_t>(1), WrappedEncodeVarInt(1).size()); |
| 252 EXPECT_EQ(static_cast<size_t>(2), WrappedEncodeVarInt(255).size()); | 250 EXPECT_EQ(static_cast<size_t>(2), WrappedEncodeVarInt(255).size()); |
| 253 EXPECT_EQ(static_cast<size_t>(2), WrappedEncodeVarInt(256).size()); | 251 EXPECT_EQ(static_cast<size_t>(2), WrappedEncodeVarInt(256).size()); |
| 254 EXPECT_EQ(static_cast<size_t>(5), WrappedEncodeVarInt(0xffffffff).size()); | 252 EXPECT_EQ(static_cast<size_t>(5), WrappedEncodeVarInt(0xffffffff).size()); |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 270 test_cases.push_back(65535); | 268 test_cases.push_back(65535); |
| 271 test_cases.push_back(655536); | 269 test_cases.push_back(655536); |
| 272 test_cases.push_back(7711192431755665792ll); | 270 test_cases.push_back(7711192431755665792ll); |
| 273 test_cases.push_back(0x7fffffffffffffffll); | 271 test_cases.push_back(0x7fffffffffffffffll); |
| 274 #ifdef NDEBUG | 272 #ifdef NDEBUG |
| 275 test_cases.push_back(-3); | 273 test_cases.push_back(-3); |
| 276 #endif | 274 #endif |
| 277 | 275 |
| 278 for (size_t i = 0; i < test_cases.size(); ++i) { | 276 for (size_t i = 0; i < test_cases.size(); ++i) { |
| 279 int64 n = test_cases[i]; | 277 int64 n = test_cases[i]; |
| 280 std::vector<char> v = WrappedEncodeVarInt(n); | 278 std::string v = WrappedEncodeVarInt(n); |
| 281 ASSERT_GT(v.size(), static_cast<size_t>(0)); | 279 ASSERT_GT(v.size(), static_cast<size_t>(0)); |
| 282 StringPiece slice(&*v.begin(), v.size()); | 280 StringPiece slice(&*v.begin(), v.size()); |
| 283 int64 res; | 281 int64 res; |
| 284 EXPECT_TRUE(DecodeVarInt(&slice, &res)); | 282 EXPECT_TRUE(DecodeVarInt(&slice, &res)); |
| 285 EXPECT_EQ(n, res); | 283 EXPECT_EQ(n, res); |
| 286 EXPECT_TRUE(slice.empty()); | 284 EXPECT_TRUE(slice.empty()); |
| 287 | 285 |
| 288 slice = StringPiece(&*v.begin(), v.size() - 1); | 286 slice = StringPiece(&*v.begin(), v.size() - 1); |
| 289 EXPECT_FALSE(DecodeVarInt(&slice, &res)); | 287 EXPECT_FALSE(DecodeVarInt(&slice, &res)); |
| 290 | 288 |
| 291 slice = StringPiece(&*v.begin(), static_cast<size_t>(0)); | 289 slice = StringPiece(&*v.begin(), static_cast<size_t>(0)); |
| 292 EXPECT_FALSE(DecodeVarInt(&slice, &res)); | 290 EXPECT_FALSE(DecodeVarInt(&slice, &res)); |
| 293 | 291 |
| 294 // Verify decoding at an offset, to detect unaligned memory access. | 292 // Verify decoding at an offset, to detect unaligned memory access. |
| 295 v.insert(v.begin(), static_cast<size_t>(1), static_cast<char>(0)); | 293 v.insert(v.begin(), static_cast<size_t>(1), static_cast<char>(0)); |
| 296 slice = StringPiece(&*v.begin() + 1, v.size() - 1); | 294 slice = StringPiece(&*v.begin() + 1, v.size() - 1); |
| 297 EXPECT_TRUE(DecodeVarInt(&slice, &res)); | 295 EXPECT_TRUE(DecodeVarInt(&slice, &res)); |
| 298 EXPECT_EQ(n, res); | 296 EXPECT_EQ(n, res); |
| 299 EXPECT_TRUE(slice.empty()); | 297 EXPECT_TRUE(slice.empty()); |
| 300 } | 298 } |
| 301 } | 299 } |
| 302 | 300 |
| 303 static std::vector<char> WrappedEncodeString(string16 value) { | 301 static std::string WrappedEncodeString(string16 value) { |
| 304 std::vector<char> buffer; | 302 std::string buffer; |
| 305 EncodeString(value, &buffer); | 303 EncodeString(value, &buffer); |
| 306 return buffer; | 304 return buffer; |
| 307 } | 305 } |
| 308 | 306 |
| 309 TEST(IndexedDBLevelDBCodingTest, EncodeString) { | 307 TEST(IndexedDBLevelDBCodingTest, EncodeString) { |
| 310 const char16 test_string_a[] = {'f', 'o', 'o', '\0'}; | 308 const char16 test_string_a[] = {'f', 'o', 'o', '\0'}; |
| 311 const char16 test_string_b[] = {0xdead, 0xbeef, '\0'}; | 309 const char16 test_string_b[] = {0xdead, 0xbeef, '\0'}; |
| 312 | 310 |
| 313 EXPECT_EQ(static_cast<size_t>(0), | 311 EXPECT_EQ(static_cast<size_t>(0), |
| 314 WrappedEncodeString(ASCIIToUTF16("")).size()); | 312 WrappedEncodeString(ASCIIToUTF16("")).size()); |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 328 | 326 |
| 329 std::vector<string16> test_cases; | 327 std::vector<string16> test_cases; |
| 330 test_cases.push_back(string16()); | 328 test_cases.push_back(string16()); |
| 331 test_cases.push_back(ASCIIToUTF16("a")); | 329 test_cases.push_back(ASCIIToUTF16("a")); |
| 332 test_cases.push_back(ASCIIToUTF16("foo")); | 330 test_cases.push_back(ASCIIToUTF16("foo")); |
| 333 test_cases.push_back(test_string_a); | 331 test_cases.push_back(test_string_a); |
| 334 test_cases.push_back(test_string_b); | 332 test_cases.push_back(test_string_b); |
| 335 | 333 |
| 336 for (size_t i = 0; i < test_cases.size(); ++i) { | 334 for (size_t i = 0; i < test_cases.size(); ++i) { |
| 337 const string16& test_case = test_cases[i]; | 335 const string16& test_case = test_cases[i]; |
| 338 std::vector<char> v = WrappedEncodeString(test_case); | 336 std::string v = WrappedEncodeString(test_case); |
| 339 | 337 |
| 340 StringPiece slice; | 338 StringPiece slice; |
| 341 if (v.size()) { | 339 if (v.size()) { |
| 342 slice = StringPiece(&*v.begin(), v.size()); | 340 slice = StringPiece(&*v.begin(), v.size()); |
| 343 } | 341 } |
| 344 | 342 |
| 345 string16 result; | 343 string16 result; |
| 346 EXPECT_TRUE(DecodeString(&slice, &result)); | 344 EXPECT_TRUE(DecodeString(&slice, &result)); |
| 347 EXPECT_EQ(test_case, result); | 345 EXPECT_EQ(test_case, result); |
| 348 EXPECT_TRUE(slice.empty()); | 346 EXPECT_TRUE(slice.empty()); |
| 349 | 347 |
| 350 // Verify decoding at an offset, to detect unaligned memory access. | 348 // Verify decoding at an offset, to detect unaligned memory access. |
| 351 v.insert(v.begin(), static_cast<size_t>(1), static_cast<char>(0)); | 349 v.insert(v.begin(), static_cast<size_t>(1), static_cast<char>(0)); |
| 352 slice = StringPiece(&*v.begin() + 1, v.size() - 1); | 350 slice = StringPiece(&*v.begin() + 1, v.size() - 1); |
| 353 EXPECT_TRUE(DecodeString(&slice, &result)); | 351 EXPECT_TRUE(DecodeString(&slice, &result)); |
| 354 EXPECT_EQ(test_case, result); | 352 EXPECT_EQ(test_case, result); |
| 355 EXPECT_TRUE(slice.empty()); | 353 EXPECT_TRUE(slice.empty()); |
| 356 } | 354 } |
| 357 } | 355 } |
| 358 | 356 |
| 359 static std::vector<char> WrappedEncodeStringWithLength(string16 value) { | 357 static std::string WrappedEncodeStringWithLength(string16 value) { |
| 360 std::vector<char> buffer; | 358 std::string buffer; |
| 361 EncodeStringWithLength(value, &buffer); | 359 EncodeStringWithLength(value, &buffer); |
| 362 return buffer; | 360 return buffer; |
| 363 } | 361 } |
| 364 | 362 |
| 365 TEST(IndexedDBLevelDBCodingTest, EncodeStringWithLength) { | 363 TEST(IndexedDBLevelDBCodingTest, EncodeStringWithLength) { |
| 366 const char16 test_string_a[] = {'f', 'o', 'o', '\0'}; | 364 const char16 test_string_a[] = {'f', 'o', 'o', '\0'}; |
| 367 const char16 test_string_b[] = {0xdead, 0xbeef, '\0'}; | 365 const char16 test_string_b[] = {0xdead, 0xbeef, '\0'}; |
| 368 | 366 |
| 369 EXPECT_EQ(static_cast<size_t>(1), | 367 EXPECT_EQ(static_cast<size_t>(1), |
| 370 WrappedEncodeStringWithLength(string16()).size()); | 368 WrappedEncodeStringWithLength(string16()).size()); |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 389 std::vector<string16> test_cases; | 387 std::vector<string16> test_cases; |
| 390 test_cases.push_back(ASCIIToUTF16("")); | 388 test_cases.push_back(ASCIIToUTF16("")); |
| 391 test_cases.push_back(ASCIIToUTF16("a")); | 389 test_cases.push_back(ASCIIToUTF16("a")); |
| 392 test_cases.push_back(ASCIIToUTF16("foo")); | 390 test_cases.push_back(ASCIIToUTF16("foo")); |
| 393 test_cases.push_back(string16(test_string_a)); | 391 test_cases.push_back(string16(test_string_a)); |
| 394 test_cases.push_back(string16(test_string_b)); | 392 test_cases.push_back(string16(test_string_b)); |
| 395 test_cases.push_back(string16(long_string)); | 393 test_cases.push_back(string16(long_string)); |
| 396 | 394 |
| 397 for (size_t i = 0; i < test_cases.size(); ++i) { | 395 for (size_t i = 0; i < test_cases.size(); ++i) { |
| 398 string16 s = test_cases[i]; | 396 string16 s = test_cases[i]; |
| 399 std::vector<char> v = WrappedEncodeStringWithLength(s); | 397 std::string v = WrappedEncodeStringWithLength(s); |
| 400 ASSERT_GT(v.size(), static_cast<size_t>(0)); | 398 ASSERT_GT(v.size(), static_cast<size_t>(0)); |
| 401 StringPiece slice(&*v.begin(), v.size()); | 399 StringPiece slice(&*v.begin(), v.size()); |
| 402 string16 res; | 400 string16 res; |
| 403 EXPECT_TRUE(DecodeStringWithLength(&slice, &res)); | 401 EXPECT_TRUE(DecodeStringWithLength(&slice, &res)); |
| 404 EXPECT_EQ(s, res); | 402 EXPECT_EQ(s, res); |
| 405 EXPECT_TRUE(slice.empty()); | 403 EXPECT_TRUE(slice.empty()); |
| 406 | 404 |
| 407 slice = StringPiece(&*v.begin(), v.size() - 1); | 405 slice = StringPiece(&*v.begin(), v.size() - 1); |
| 408 EXPECT_FALSE(DecodeStringWithLength(&slice, &res)); | 406 EXPECT_FALSE(DecodeStringWithLength(&slice, &res)); |
| 409 | 407 |
| 410 slice = StringPiece(&*v.begin(), static_cast<size_t>(0)); | 408 slice = StringPiece(&*v.begin(), static_cast<size_t>(0)); |
| 411 EXPECT_FALSE(DecodeStringWithLength(&slice, &res)); | 409 EXPECT_FALSE(DecodeStringWithLength(&slice, &res)); |
| 412 | 410 |
| 413 // Verify decoding at an offset, to detect unaligned memory access. | 411 // Verify decoding at an offset, to detect unaligned memory access. |
| 414 v.insert(v.begin(), static_cast<size_t>(1), static_cast<char>(0)); | 412 v.insert(v.begin(), static_cast<size_t>(1), static_cast<char>(0)); |
| 415 slice = StringPiece(&*v.begin() + 1, v.size() - 1); | 413 slice = StringPiece(&*v.begin() + 1, v.size() - 1); |
| 416 EXPECT_TRUE(DecodeStringWithLength(&slice, &res)); | 414 EXPECT_TRUE(DecodeStringWithLength(&slice, &res)); |
| 417 EXPECT_EQ(s, res); | 415 EXPECT_EQ(s, res); |
| 418 EXPECT_TRUE(slice.empty()); | 416 EXPECT_TRUE(slice.empty()); |
| 419 } | 417 } |
| 420 } | 418 } |
| 421 | 419 |
| 422 static int CompareStrings(const std::vector<char>& p, | 420 static int CompareStrings(const std::string& p, const std::string& q) { |
| 423 const std::vector<char>& q) { | |
| 424 bool ok; | 421 bool ok; |
| 425 DCHECK(!p.empty()); | 422 DCHECK(!p.empty()); |
| 426 DCHECK(!q.empty()); | 423 DCHECK(!q.empty()); |
| 427 StringPiece slice_p(&*p.begin(), p.size()); | 424 StringPiece slice_p(&*p.begin(), p.size()); |
| 428 StringPiece slice_q(&*q.begin(), q.size()); | 425 StringPiece slice_q(&*q.begin(), q.size()); |
| 429 int result = CompareEncodedStringsWithLength(&slice_p, &slice_q, &ok); | 426 int result = CompareEncodedStringsWithLength(&slice_p, &slice_q, &ok); |
| 430 EXPECT_TRUE(ok); | 427 EXPECT_TRUE(ok); |
| 431 EXPECT_TRUE(slice_p.empty()); | 428 EXPECT_TRUE(slice_p.empty()); |
| 432 EXPECT_TRUE(slice_q.empty()); | 429 EXPECT_TRUE(slice_q.empty()); |
| 433 return result; | 430 return result; |
| (...skipping 23 matching lines...) Expand all Loading... | |
| 457 | 454 |
| 458 for (size_t i = 0; i < test_cases.size() - 1; ++i) { | 455 for (size_t i = 0; i < test_cases.size() - 1; ++i) { |
| 459 string16 a = test_cases[i]; | 456 string16 a = test_cases[i]; |
| 460 string16 b = test_cases[i + 1]; | 457 string16 b = test_cases[i + 1]; |
| 461 | 458 |
| 462 EXPECT_LT(a.compare(b), 0); | 459 EXPECT_LT(a.compare(b), 0); |
| 463 EXPECT_GT(b.compare(a), 0); | 460 EXPECT_GT(b.compare(a), 0); |
| 464 EXPECT_EQ(a.compare(a), 0); | 461 EXPECT_EQ(a.compare(a), 0); |
| 465 EXPECT_EQ(b.compare(b), 0); | 462 EXPECT_EQ(b.compare(b), 0); |
| 466 | 463 |
| 467 std::vector<char> encoded_a = WrappedEncodeStringWithLength(a); | 464 std::string encoded_a = WrappedEncodeStringWithLength(a); |
| 468 EXPECT_TRUE(encoded_a.size()); | 465 EXPECT_TRUE(encoded_a.size()); |
| 469 std::vector<char> encoded_b = WrappedEncodeStringWithLength(b); | 466 std::string encoded_b = WrappedEncodeStringWithLength(b); |
| 470 EXPECT_TRUE(encoded_a.size()); | 467 EXPECT_TRUE(encoded_a.size()); |
| 471 | 468 |
| 472 EXPECT_LT(CompareStrings(encoded_a, encoded_b), 0); | 469 EXPECT_LT(CompareStrings(encoded_a, encoded_b), 0); |
| 473 EXPECT_GT(CompareStrings(encoded_b, encoded_a), 0); | 470 EXPECT_GT(CompareStrings(encoded_b, encoded_a), 0); |
| 474 EXPECT_EQ(CompareStrings(encoded_a, encoded_a), 0); | 471 EXPECT_EQ(CompareStrings(encoded_a, encoded_a), 0); |
| 475 EXPECT_EQ(CompareStrings(encoded_b, encoded_b), 0); | 472 EXPECT_EQ(CompareStrings(encoded_b, encoded_b), 0); |
| 476 } | 473 } |
| 477 } | 474 } |
| 478 | 475 |
| 479 static std::vector<char> WrappedEncodeDouble(double value) { | 476 static std::string WrappedEncodeDouble(double value) { |
| 480 std::vector<char> buffer; | 477 std::string buffer; |
| 481 EncodeDouble(value, &buffer); | 478 EncodeDouble(value, &buffer); |
| 482 return buffer; | 479 return buffer; |
| 483 } | 480 } |
| 484 | 481 |
| 485 TEST(IndexedDBLevelDBCodingTest, EncodeDouble) { | 482 TEST(IndexedDBLevelDBCodingTest, EncodeDouble) { |
| 486 EXPECT_EQ(static_cast<size_t>(8), WrappedEncodeDouble(0).size()); | 483 EXPECT_EQ(static_cast<size_t>(8), WrappedEncodeDouble(0).size()); |
| 487 EXPECT_EQ(static_cast<size_t>(8), WrappedEncodeDouble(3.14).size()); | 484 EXPECT_EQ(static_cast<size_t>(8), WrappedEncodeDouble(3.14).size()); |
| 488 } | 485 } |
| 489 | 486 |
| 490 TEST(IndexedDBLevelDBCodingTest, DecodeDouble) { | 487 TEST(IndexedDBLevelDBCodingTest, DecodeDouble) { |
| 491 std::vector<double> test_cases; | 488 std::vector<double> test_cases; |
| 492 test_cases.push_back(3.14); | 489 test_cases.push_back(3.14); |
| 493 test_cases.push_back(-3.14); | 490 test_cases.push_back(-3.14); |
| 494 | 491 |
| 495 for (size_t i = 0; i < test_cases.size(); ++i) { | 492 for (size_t i = 0; i < test_cases.size(); ++i) { |
| 496 double value = test_cases[i]; | 493 double value = test_cases[i]; |
| 497 std::vector<char> v = WrappedEncodeDouble(value); | 494 std::string v = WrappedEncodeDouble(value); |
| 498 ASSERT_GT(v.size(), static_cast<size_t>(0)); | 495 ASSERT_GT(v.size(), static_cast<size_t>(0)); |
| 499 StringPiece slice(&*v.begin(), v.size()); | 496 StringPiece slice(&*v.begin(), v.size()); |
| 500 double result; | 497 double result; |
| 501 EXPECT_TRUE(DecodeDouble(&slice, &result)); | 498 EXPECT_TRUE(DecodeDouble(&slice, &result)); |
| 502 EXPECT_EQ(value, result); | 499 EXPECT_EQ(value, result); |
| 503 EXPECT_TRUE(slice.empty()); | 500 EXPECT_TRUE(slice.empty()); |
| 504 | 501 |
| 505 slice = StringPiece(&*v.begin(), v.size() - 1); | 502 slice = StringPiece(&*v.begin(), v.size() - 1); |
| 506 EXPECT_FALSE(DecodeDouble(&slice, &result)); | 503 EXPECT_FALSE(DecodeDouble(&slice, &result)); |
| 507 | 504 |
| 508 slice = StringPiece(&*v.begin(), static_cast<size_t>(0)); | 505 slice = StringPiece(&*v.begin(), static_cast<size_t>(0)); |
| 509 EXPECT_FALSE(DecodeDouble(&slice, &result)); | 506 EXPECT_FALSE(DecodeDouble(&slice, &result)); |
| 510 | 507 |
| 511 // Verify decoding at an offset, to detect unaligned memory access. | 508 // Verify decoding at an offset, to detect unaligned memory access. |
| 512 v.insert(v.begin(), static_cast<size_t>(1), static_cast<char>(0)); | 509 v.insert(v.begin(), static_cast<size_t>(1), static_cast<char>(0)); |
| 513 slice = StringPiece(&*v.begin() + 1, v.size() - 1); | 510 slice = StringPiece(&*v.begin() + 1, v.size() - 1); |
| 514 EXPECT_TRUE(DecodeDouble(&slice, &result)); | 511 EXPECT_TRUE(DecodeDouble(&slice, &result)); |
| 515 EXPECT_EQ(value, result); | 512 EXPECT_EQ(value, result); |
| 516 EXPECT_TRUE(slice.empty()); | 513 EXPECT_TRUE(slice.empty()); |
| 517 } | 514 } |
| 518 } | 515 } |
| 519 | 516 |
| 520 TEST(IndexedDBLevelDBCodingTest, EncodeDecodeIDBKey) { | 517 TEST(IndexedDBLevelDBCodingTest, EncodeDecodeIDBKey) { |
| 521 IndexedDBKey expected_key; | 518 IndexedDBKey expected_key; |
| 522 scoped_ptr<IndexedDBKey> decoded_key; | 519 scoped_ptr<IndexedDBKey> decoded_key; |
| 523 std::vector<char> v; | 520 std::string v; |
| 524 StringPiece slice; | 521 StringPiece slice; |
| 525 | 522 |
| 526 std::vector<IndexedDBKey> test_cases; | 523 std::vector<IndexedDBKey> test_cases; |
| 527 test_cases.push_back(IndexedDBKey(1234, WebIDBKey::NumberType)); | 524 test_cases.push_back(IndexedDBKey(1234, WebIDBKey::NumberType)); |
| 528 test_cases.push_back(IndexedDBKey(7890, WebIDBKey::DateType)); | 525 test_cases.push_back(IndexedDBKey(7890, WebIDBKey::DateType)); |
| 529 test_cases.push_back(IndexedDBKey(ASCIIToUTF16("Hello World!"))); | 526 test_cases.push_back(IndexedDBKey(ASCIIToUTF16("Hello World!"))); |
| 530 test_cases.push_back(IndexedDBKey(IndexedDBKey::KeyArray())); | 527 test_cases.push_back(IndexedDBKey(IndexedDBKey::KeyArray())); |
| 531 | 528 |
| 532 IndexedDBKey::KeyArray array; | 529 IndexedDBKey::KeyArray array; |
| 533 array.push_back(IndexedDBKey(1234, WebIDBKey::NumberType)); | 530 array.push_back(IndexedDBKey(1234, WebIDBKey::NumberType)); |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 546 EXPECT_TRUE(slice.empty()); | 543 EXPECT_TRUE(slice.empty()); |
| 547 | 544 |
| 548 slice = StringPiece(&*v.begin(), v.size() - 1); | 545 slice = StringPiece(&*v.begin(), v.size() - 1); |
| 549 EXPECT_FALSE(DecodeIDBKey(&slice, &decoded_key)); | 546 EXPECT_FALSE(DecodeIDBKey(&slice, &decoded_key)); |
| 550 | 547 |
| 551 slice = StringPiece(&*v.begin(), static_cast<size_t>(0)); | 548 slice = StringPiece(&*v.begin(), static_cast<size_t>(0)); |
| 552 EXPECT_FALSE(DecodeIDBKey(&slice, &decoded_key)); | 549 EXPECT_FALSE(DecodeIDBKey(&slice, &decoded_key)); |
| 553 } | 550 } |
| 554 } | 551 } |
| 555 | 552 |
| 556 static std::vector<char> WrappedEncodeIDBKeyPath( | 553 static std::string WrappedEncodeIDBKeyPath(const IndexedDBKeyPath& value) { |
| 557 const IndexedDBKeyPath& value) { | 554 std::string buffer; |
| 558 std::vector<char> buffer; | |
| 559 EncodeIDBKeyPath(value, &buffer); | 555 EncodeIDBKeyPath(value, &buffer); |
| 560 return buffer; | 556 return buffer; |
| 561 } | 557 } |
| 562 | 558 |
| 563 TEST(IndexedDBLevelDBCodingTest, EncodeDecodeIDBKeyPath) { | 559 TEST(IndexedDBLevelDBCodingTest, EncodeDecodeIDBKeyPath) { |
| 564 std::vector<IndexedDBKeyPath> key_paths; | 560 std::vector<IndexedDBKeyPath> key_paths; |
| 565 std::vector<std::vector<char> > encoded_paths; | 561 std::vector<std::string> encoded_paths; |
| 566 | 562 |
| 567 { | 563 { |
| 568 key_paths.push_back(IndexedDBKeyPath()); | 564 key_paths.push_back(IndexedDBKeyPath()); |
| 569 char expected[] = {0, 0, // Header | 565 char expected[] = {0, 0, // Header |
| 570 0 // Type is null | 566 0 // Type is null |
| 571 }; | 567 }; |
| 572 encoded_paths.push_back( | 568 encoded_paths.push_back( |
| 573 std::vector<char>(expected, expected + arraysize(expected))); | 569 std::string(expected, expected + arraysize(expected))); |
| 574 } | 570 } |
| 575 | 571 |
| 576 { | 572 { |
| 577 key_paths.push_back(IndexedDBKeyPath(string16())); | 573 key_paths.push_back(IndexedDBKeyPath(string16())); |
| 578 char expected[] = {0, 0, // Header | 574 char expected[] = {0, 0, // Header |
| 579 1, // Type is string | 575 1, // Type is string |
| 580 0 // Length is 0 | 576 0 // Length is 0 |
| 581 }; | 577 }; |
| 582 encoded_paths.push_back( | 578 encoded_paths.push_back( |
| 583 std::vector<char>(expected, expected + arraysize(expected))); | 579 std::string(expected, expected + arraysize(expected))); |
| 584 } | 580 } |
| 585 | 581 |
| 586 { | 582 { |
| 587 key_paths.push_back(IndexedDBKeyPath(ASCIIToUTF16("foo"))); | 583 key_paths.push_back(IndexedDBKeyPath(ASCIIToUTF16("foo"))); |
| 588 char expected[] = {0, 0, // Header | 584 char expected[] = {0, 0, // Header |
| 589 1, // Type is string | 585 1, // Type is string |
| 590 3, 0, 'f', 0, 'o', 0, 'o' // String length 3, UTF-16BE | 586 3, 0, 'f', 0, 'o', 0, 'o' // String length 3, UTF-16BE |
| 591 }; | 587 }; |
| 592 encoded_paths.push_back( | 588 encoded_paths.push_back( |
| 593 std::vector<char>(expected, expected + arraysize(expected))); | 589 std::string(expected, expected + arraysize(expected))); |
| 594 } | 590 } |
| 595 | 591 |
| 596 { | 592 { |
| 597 key_paths.push_back(IndexedDBKeyPath(ASCIIToUTF16("foo.bar"))); | 593 key_paths.push_back(IndexedDBKeyPath(ASCIIToUTF16("foo.bar"))); |
| 598 char expected[] = {0, 0, // Header | 594 char expected[] = {0, 0, // Header |
| 599 1, // Type is string | 595 1, // Type is string |
| 600 7, 0, 'f', 0, 'o', 0, 'o', 0, '.', 0, 'b', 0, 'a', 0, | 596 7, 0, 'f', 0, 'o', 0, 'o', 0, '.', 0, 'b', 0, 'a', 0, |
| 601 'r' // String length 7, UTF-16BE | 597 'r' // String length 7, UTF-16BE |
| 602 }; | 598 }; |
| 603 encoded_paths.push_back( | 599 encoded_paths.push_back( |
| 604 std::vector<char>(expected, expected + arraysize(expected))); | 600 std::string(expected, expected + arraysize(expected))); |
| 605 } | 601 } |
| 606 | 602 |
| 607 { | 603 { |
| 608 std::vector<string16> array; | 604 std::vector<string16> array; |
| 609 array.push_back(string16()); | 605 array.push_back(string16()); |
| 610 array.push_back(ASCIIToUTF16("foo")); | 606 array.push_back(ASCIIToUTF16("foo")); |
| 611 array.push_back(ASCIIToUTF16("foo.bar")); | 607 array.push_back(ASCIIToUTF16("foo.bar")); |
| 612 | 608 |
| 613 key_paths.push_back(IndexedDBKeyPath(array)); | 609 key_paths.push_back(IndexedDBKeyPath(array)); |
| 614 char expected[] = {0, 0, // Header | 610 char expected[] = {0, 0, // Header |
| 615 2, 3, // Type is array, length is 3 | 611 2, 3, // Type is array, length is 3 |
| 616 0, // Member 1 (String length 0) | 612 0, // Member 1 (String length 0) |
| 617 3, 0, 'f', 0, 'o', 0, 'o', // Member 2 (String length 3) | 613 3, 0, 'f', 0, 'o', 0, 'o', // Member 2 (String length 3) |
| 618 7, 0, 'f', 0, 'o', 0, 'o', 0, '.', 0, 'b', 0, 'a', 0, | 614 7, 0, 'f', 0, 'o', 0, 'o', 0, '.', 0, 'b', 0, 'a', 0, |
| 619 'r' // Member 3 (String length 7) | 615 'r' // Member 3 (String length 7) |
| 620 }; | 616 }; |
| 621 encoded_paths.push_back( | 617 encoded_paths.push_back( |
| 622 std::vector<char>(expected, expected + arraysize(expected))); | 618 std::string(expected, expected + arraysize(expected))); |
| 623 } | 619 } |
| 624 | 620 |
| 625 ASSERT_EQ(key_paths.size(), encoded_paths.size()); | 621 ASSERT_EQ(key_paths.size(), encoded_paths.size()); |
| 626 for (size_t i = 0; i < key_paths.size(); ++i) { | 622 for (size_t i = 0; i < key_paths.size(); ++i) { |
| 627 IndexedDBKeyPath key_path = key_paths[i]; | 623 IndexedDBKeyPath key_path = key_paths[i]; |
| 628 std::vector<char> encoded = encoded_paths[i]; | 624 std::string encoded = encoded_paths[i]; |
| 629 | 625 |
| 630 std::vector<char> v = WrappedEncodeIDBKeyPath(key_path); | 626 std::string v = WrappedEncodeIDBKeyPath(key_path); |
| 631 EXPECT_EQ(encoded, v); | 627 EXPECT_EQ(encoded, v); |
| 632 | 628 |
| 633 StringPiece slice(&*encoded.begin(), encoded.size()); | 629 StringPiece slice(&*encoded.begin(), encoded.size()); |
| 634 IndexedDBKeyPath decoded; | 630 IndexedDBKeyPath decoded; |
| 635 EXPECT_TRUE(DecodeIDBKeyPath(&slice, &decoded)); | 631 EXPECT_TRUE(DecodeIDBKeyPath(&slice, &decoded)); |
| 636 EXPECT_EQ(key_path, decoded); | 632 EXPECT_EQ(key_path, decoded); |
| 637 EXPECT_TRUE(slice.empty()); | 633 EXPECT_TRUE(slice.empty()); |
| 638 } | 634 } |
| 639 } | 635 } |
| 640 | 636 |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 704 keys.push_back(CreateArrayIDBKey(CreateArrayIDBKey(CreateArrayIDBKey()))); | 700 keys.push_back(CreateArrayIDBKey(CreateArrayIDBKey(CreateArrayIDBKey()))); |
| 705 keys.push_back(CreateArrayIDBKey( | 701 keys.push_back(CreateArrayIDBKey( |
| 706 CreateArrayIDBKey(CreateArrayIDBKey(CreateArrayIDBKey())))); | 702 CreateArrayIDBKey(CreateArrayIDBKey(CreateArrayIDBKey())))); |
| 707 | 703 |
| 708 for (size_t i = 0; i < keys.size() - 1; ++i) { | 704 for (size_t i = 0; i < keys.size() - 1; ++i) { |
| 709 const IndexedDBKey& key_a = keys[i]; | 705 const IndexedDBKey& key_a = keys[i]; |
| 710 const IndexedDBKey& key_b = keys[i + 1]; | 706 const IndexedDBKey& key_b = keys[i + 1]; |
| 711 | 707 |
| 712 EXPECT_TRUE(key_a.IsLessThan(key_b)); | 708 EXPECT_TRUE(key_a.IsLessThan(key_b)); |
| 713 | 709 |
| 714 std::vector<char> encoded_a; | 710 std::string encoded_a; |
| 715 EncodeIDBKey(key_a, &encoded_a); | 711 EncodeIDBKey(key_a, &encoded_a); |
| 716 EXPECT_TRUE(encoded_a.size()); | 712 EXPECT_TRUE(encoded_a.size()); |
| 717 std::vector<char> encoded_b; | 713 std::string encoded_b; |
| 718 EncodeIDBKey(key_b, &encoded_b); | 714 EncodeIDBKey(key_b, &encoded_b); |
| 719 EXPECT_TRUE(encoded_b.size()); | 715 EXPECT_TRUE(encoded_b.size()); |
| 720 | 716 |
| 721 std::vector<char> extracted_a; | 717 std::string extracted_a; |
| 722 std::vector<char> extracted_b; | 718 std::string extracted_b; |
| 723 StringPiece slice; | 719 StringPiece slice; |
| 724 | 720 |
| 725 slice = StringPiece(&*encoded_a.begin(), encoded_a.size()); | 721 slice = StringPiece(&*encoded_a.begin(), encoded_a.size()); |
| 726 EXPECT_TRUE(ExtractEncodedIDBKey(&slice, &extracted_a)); | 722 EXPECT_TRUE(ExtractEncodedIDBKey(&slice, &extracted_a)); |
| 727 EXPECT_TRUE(slice.empty()); | 723 EXPECT_TRUE(slice.empty()); |
| 728 EXPECT_EQ(encoded_a, extracted_a); | 724 EXPECT_EQ(encoded_a, extracted_a); |
| 729 | 725 |
| 730 slice = StringPiece(&*encoded_b.begin(), encoded_b.size()); | 726 slice = StringPiece(&*encoded_b.begin(), encoded_b.size()); |
| 731 EXPECT_TRUE(ExtractEncodedIDBKey(&slice, &extracted_b)); | 727 EXPECT_TRUE(ExtractEncodedIDBKey(&slice, &extracted_b)); |
| 732 EXPECT_TRUE(slice.empty()); | 728 EXPECT_TRUE(slice.empty()); |
| 733 EXPECT_EQ(encoded_b, extracted_b); | 729 EXPECT_EQ(encoded_b, extracted_b); |
| 734 | 730 |
| 735 EXPECT_LT(CompareKeys(extracted_a, extracted_b), 0); | 731 EXPECT_LT(CompareKeys(extracted_a, extracted_b), 0); |
| 736 EXPECT_GT(CompareKeys(extracted_b, extracted_a), 0); | 732 EXPECT_GT(CompareKeys(extracted_b, extracted_a), 0); |
| 737 EXPECT_EQ(CompareKeys(extracted_a, extracted_a), 0); | 733 EXPECT_EQ(CompareKeys(extracted_a, extracted_a), 0); |
| 738 EXPECT_EQ(CompareKeys(extracted_b, extracted_b), 0); | 734 EXPECT_EQ(CompareKeys(extracted_b, extracted_b), 0); |
| 739 | 735 |
| 740 slice = StringPiece(&*encoded_a.begin(), encoded_a.size() - 1); | 736 slice = StringPiece(&*encoded_a.begin(), encoded_a.size() - 1); |
| 741 EXPECT_FALSE(ExtractEncodedIDBKey(&slice, &extracted_a)); | 737 EXPECT_FALSE(ExtractEncodedIDBKey(&slice, &extracted_a)); |
| 742 } | 738 } |
| 743 } | 739 } |
| 744 | 740 |
| 745 TEST(IndexedDBLevelDBCodingTest, ComparisonTest) { | 741 TEST(IndexedDBLevelDBCodingTest, ComparisonTest) { |
| 746 std::vector<std::vector<char> > keys; | 742 std::vector<std::string> keys; |
| 747 keys.push_back(SchemaVersionKey::Encode()); | 743 keys.push_back(SchemaVersionKey::Encode()); |
| 748 keys.push_back(MaxDatabaseIdKey::Encode()); | 744 keys.push_back(MaxDatabaseIdKey::Encode()); |
| 749 keys.push_back(DatabaseFreeListKey::Encode(0)); | 745 keys.push_back(DatabaseFreeListKey::Encode(0)); |
| 750 keys.push_back(DatabaseFreeListKey::EncodeMaxKey()); | 746 keys.push_back(DatabaseFreeListKey::EncodeMaxKey()); |
| 751 keys.push_back(DatabaseNameKey::Encode("", ASCIIToUTF16(""))); | 747 keys.push_back(DatabaseNameKey::Encode("", ASCIIToUTF16(""))); |
| 752 keys.push_back(DatabaseNameKey::Encode("", ASCIIToUTF16("a"))); | 748 keys.push_back(DatabaseNameKey::Encode("", ASCIIToUTF16("a"))); |
| 753 keys.push_back(DatabaseNameKey::Encode("a", ASCIIToUTF16("a"))); | 749 keys.push_back(DatabaseNameKey::Encode("a", ASCIIToUTF16("a"))); |
| 754 keys.push_back( | 750 keys.push_back( |
| 755 DatabaseMetaDataKey::Encode(1, DatabaseMetaDataKey::ORIGIN_NAME)); | 751 DatabaseMetaDataKey::Encode(1, DatabaseMetaDataKey::ORIGIN_NAME)); |
| 756 keys.push_back( | 752 keys.push_back( |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 814 keys.push_back(IndexDataKey::Encode(1, 1, 30, MaxIDBKey(), MinIDBKey(), 0)); | 810 keys.push_back(IndexDataKey::Encode(1, 1, 30, MaxIDBKey(), MinIDBKey(), 0)); |
| 815 keys.push_back(IndexDataKey::Encode(1, 1, 30, MaxIDBKey(), MinIDBKey(), 1)); | 811 keys.push_back(IndexDataKey::Encode(1, 1, 30, MaxIDBKey(), MinIDBKey(), 1)); |
| 816 keys.push_back(IndexDataKey::Encode(1, 1, 30, MaxIDBKey(), MaxIDBKey(), 0)); | 812 keys.push_back(IndexDataKey::Encode(1, 1, 30, MaxIDBKey(), MaxIDBKey(), 0)); |
| 817 keys.push_back(IndexDataKey::Encode(1, 1, 30, MaxIDBKey(), MaxIDBKey(), 1)); | 813 keys.push_back(IndexDataKey::Encode(1, 1, 30, MaxIDBKey(), MaxIDBKey(), 1)); |
| 818 keys.push_back(IndexDataKey::Encode(1, 1, 31, MinIDBKey(), MinIDBKey(), 0)); | 814 keys.push_back(IndexDataKey::Encode(1, 1, 31, MinIDBKey(), MinIDBKey(), 0)); |
| 819 keys.push_back(IndexDataKey::Encode(1, 2, 30, MinIDBKey(), MinIDBKey(), 0)); | 815 keys.push_back(IndexDataKey::Encode(1, 2, 30, MinIDBKey(), MinIDBKey(), 0)); |
| 820 keys.push_back( | 816 keys.push_back( |
| 821 IndexDataKey::EncodeMaxKey(1, 2, std::numeric_limits<int32>::max() - 1)); | 817 IndexDataKey::EncodeMaxKey(1, 2, std::numeric_limits<int32>::max() - 1)); |
| 822 | 818 |
| 823 for (size_t i = 0; i < keys.size(); ++i) { | 819 for (size_t i = 0; i < keys.size(); ++i) { |
| 824 const LevelDBSlice key_a(keys[i]); | 820 EXPECT_EQ(Compare(keys[i], keys[i], false), 0); |
| 825 EXPECT_EQ(Compare(key_a, key_a, false), 0); | |
| 826 | 821 |
| 827 for (size_t j = i + 1; j < keys.size(); ++j) { | 822 for (size_t j = i + 1; j < keys.size(); ++j) { |
| 828 const LevelDBSlice key_b(keys[j]); | 823 EXPECT_LT(Compare(keys[i], keys[j], false), 0); |
| 829 EXPECT_LT(Compare(key_a, key_b, false), 0); | 824 EXPECT_GT(Compare(keys[j], keys[i], false), 0); |
| 830 EXPECT_GT(Compare(key_b, key_a, false), 0); | |
| 831 } | 825 } |
| 832 } | 826 } |
| 833 } | 827 } |
| 834 | 828 |
| 835 TEST(IndexedDBLevelDBCodingTest, EncodeVarIntVSEncodeByteTest) { | 829 TEST(IndexedDBLevelDBCodingTest, EncodeVarIntVSEncodeByteTest) { |
| 836 std::vector<unsigned char> test_cases; | 830 std::vector<unsigned char> test_cases; |
| 837 test_cases.push_back(0); | 831 test_cases.push_back(0); |
| 838 test_cases.push_back(1); | 832 test_cases.push_back(1); |
| 839 test_cases.push_back(127); | 833 test_cases.push_back(127); |
| 840 | 834 |
| 841 for (size_t i = 0; i < test_cases.size(); ++i) { | 835 for (size_t i = 0; i < test_cases.size(); ++i) { |
| 842 unsigned char n = test_cases[i]; | 836 unsigned char n = test_cases[i]; |
| 843 | 837 |
| 844 std::vector<char> vA = WrappedEncodeByte(n); | 838 std::string vA = WrappedEncodeByte(n); |
| 845 std::vector<char> vB = WrappedEncodeVarInt(static_cast<int64>(n)); | 839 std::string vB = WrappedEncodeVarInt(static_cast<int64>(n)); |
| 846 | 840 |
| 847 EXPECT_EQ(vA.size(), vB.size()); | 841 EXPECT_EQ(vA.size(), vB.size()); |
| 848 EXPECT_EQ(*vA.begin(), *vB.begin()); | 842 EXPECT_EQ(*vA.begin(), *vB.begin()); |
| 849 } | 843 } |
| 850 } | 844 } |
| 851 | 845 |
| 852 } // namespace | 846 } // namespace |
| 853 | 847 |
| 854 } // namespace content | 848 } // namespace content |
| OLD | NEW |