|
1 | 1 | /* |
2 | | - * Copyright (C) 2020 HERE Europe B.V. |
| 2 | + * Copyright (C) 2020-2022 HERE Europe B.V. |
3 | 3 | * |
4 | 4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
5 | 5 | * you may not use this file except in compliance with the License. |
@@ -36,8 +36,6 @@ constexpr auto HTTP_RESPONSE_WRONG_FORMAT = |
36 | 36 | R"jsonString({"parentQuads": 0,"subQuads": 0})jsonString"; |
37 | 37 |
|
38 | 38 | TEST(QuadTreeIndexTest, ParseBlob) { |
39 | | - using testing::Return; |
40 | | - |
41 | 39 | auto tile_key = olp::geo::TileKey::FromHereTile("381"); |
42 | 40 | auto stream = std::stringstream(HTTP_RESPONSE_QUADKEYS); |
43 | 41 | read::QuadTreeIndex index(tile_key, 1, stream); |
@@ -142,4 +140,129 @@ TEST(QuadTreeIndexTest, ParseBlob) { |
142 | 140 | } |
143 | 141 | } |
144 | 142 |
|
| 143 | +// The binary dump for HTTP_RESPONSE_QUADKEYS generated index, before the CRC |
| 144 | +// field was introduced. |
| 145 | +const char* quad_tree_index_dump = |
| 146 | + "\x7d\x01\x00\x00\x00\x00\x00\x00\x00\x00\x01\x03\x05\x00\x00\x00" |
| 147 | + "\x01\x00\xcc\xcc\x68\x00\x00\x00\x04\x00\xcc\xcc\xa6\x00\x00\x00" |
| 148 | + "\x05\x00\xcc\xcc\xe5\x00\x00\x00\x06\x00\xcc\xcc\x24\x01\x00\x00" |
| 149 | + "\x07\x00\xcc\xcc\x63\x01\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00" |
| 150 | + "\xa2\x01\x00\x00\xcc\xcc\xcc\xcc\x17\x00\x00\x00\x00\x00\x00\x00" |
| 151 | + "\xe1\x01\x00\x00\xcc\xcc\xcc\xcc\x5f\x00\x00\x00\x00\x00\x00\x00" |
| 152 | + "\x20\x02\x00\x00\xcc\xcc\xcc\xcc\x30\x00\x00\x00\x00\x00\x00\x00" |
| 153 | + "\x59\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff" |
| 154 | + "\x42\x44\x35\x33\x41\x36\x44\x36\x30\x41\x33\x34\x43\x32\x30\x44" |
| 155 | + "\x43\x34\x32\x41\x43\x41\x42\x32\x36\x35\x30\x46\x45\x33\x36\x31" |
| 156 | + "\x2e\x34\x38\x00\x00\x00\x1a\x01\x00\x00\x00\x00\x00\x00\x15\x01" |
| 157 | + "\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\x37\x36" |
| 158 | + "\x33\x36\x33\x34\x38\x45\x35\x30\x32\x31\x35\x39\x37\x39\x41\x33" |
| 159 | + "\x39\x42\x35\x46\x33\x41\x34\x32\x39\x45\x44\x44\x42\x34\x2e\x32" |
| 160 | + "\x38\x32\x00\x00\x00\x1a\x01\x00\x00\x00\x00\x00\x00\x0f\x01\x00" |
| 161 | + "\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\x38\x43\x39" |
| 162 | + "\x42\x33\x45\x30\x38\x45\x32\x39\x34\x41\x44\x42\x32\x43\x44\x30" |
| 163 | + "\x37\x45\x42\x43\x38\x34\x31\x32\x30\x36\x32\x46\x45\x2e\x32\x38" |
| 164 | + "\x32\x00\x00\x00\x1a\x01\x00\x00\x00\x00\x00\x00\x21\x01\x00\x00" |
| 165 | + "\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\x39\x37\x37\x32" |
| 166 | + "\x46\x35\x45\x31\x38\x32\x32\x44\x46\x46\x32\x35\x46\x34\x38\x46" |
| 167 | + "\x31\x35\x30\x32\x39\x34\x42\x31\x45\x43\x46\x35\x2e\x32\x38\x32" |
| 168 | + "\x00\x00\x00\x1a\x01\x00\x00\x00\x00\x00\x00\x1b\x01\x00\x00\x00" |
| 169 | + "\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\x42\x46\x38\x34\x44" |
| 170 | + "\x38\x45\x43\x38\x31\x32\x34\x42\x39\x36\x44\x42\x45\x35\x43\x34" |
| 171 | + "\x44\x42\x36\x38\x42\x30\x35\x39\x31\x38\x46\x2e\x32\x38\x32\x00" |
| 172 | + "\x00\x00\x1a\x01\x00\x00\x00\x00\x00\x00\x4f\x83\x01\x00\x00\x00" |
| 173 | + "\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\x31\x33\x45\x32\x43\x36" |
| 174 | + "\x32\x34\x45\x30\x31\x33\x36\x43\x33\x33\x35\x37\x44\x30\x39\x32" |
| 175 | + "\x45\x45\x37\x46\x32\x33\x31\x45\x38\x37\x2e\x32\x38\x32\x00\x00" |
| 176 | + "\x00\x1a\x01\x00\x00\x00\x00\x00\x00\xd6\xcc\x00\x00\x00\x00\x00" |
| 177 | + "\x00\xff\xff\xff\xff\xff\xff\xff\xff\x46\x38\x46\x34\x43\x33\x43" |
| 178 | + "\x42\x30\x39\x46\x42\x41\x36\x31\x42\x39\x32\x37\x32\x35\x36\x43" |
| 179 | + "\x42\x43\x42\x38\x34\x34\x31\x44\x31\x2e\x32\x38\x32\x00\x00\x00" |
| 180 | + "\xfd\x00\x00\x00\x00\x00\x00\x00\x6d\x1a\x00\x00\x00\x00\x00\x00" |
| 181 | + "\xff\xff\xff\xff\xff\xff\xff\xff\x42\x36\x46\x37\x36\x31\x34\x33" |
| 182 | + "\x31\x36\x42\x42\x38\x42\x38\x31\x34\x37\x38\x45\x44\x37\x41\x45" |
| 183 | + "\x33\x37\x30\x42\x32\x32\x41\x36\x2e\x32\x35\x33\x00\x00\x00"; |
| 184 | + |
| 185 | +const auto quad_tree_index_dump_len = 607; |
| 186 | + |
| 187 | +TEST(QuadTreeIndexTest, BackwardsCompatibility) { |
| 188 | + auto tile_key = olp::geo::TileKey::FromHereTile("381"); |
| 189 | + |
| 190 | + auto dump_data = std::make_shared<std::vector<unsigned char>>(); |
| 191 | + dump_data->resize(quad_tree_index_dump_len); |
| 192 | + std::copy(quad_tree_index_dump, |
| 193 | + quad_tree_index_dump + quad_tree_index_dump_len, dump_data->data()); |
| 194 | + |
| 195 | + read::QuadTreeIndex index(dump_data); |
| 196 | + |
| 197 | + { |
| 198 | + SCOPED_TRACE("Parse json and store to blob"); |
| 199 | + |
| 200 | + auto data1 = index.Find(tile_key, false); |
| 201 | + ASSERT_FALSE(data1 == boost::none); |
| 202 | + EXPECT_EQ(data1->data_handle, "BD53A6D60A34C20DC42ACAB2650FE361.48"); |
| 203 | + EXPECT_EQ(data1->tile_key, olp::geo::TileKey::FromHereTile("381")); |
| 204 | + EXPECT_EQ(data1->version, 48); |
| 205 | + |
| 206 | + auto data2 = index.Find(olp::geo::TileKey::FromHereTile("95"), false); |
| 207 | + ASSERT_FALSE(data2 == boost::none); |
| 208 | + EXPECT_EQ(data2->data_handle, "B6F7614316BB8B81478ED7AE370B22A6.253"); |
| 209 | + EXPECT_EQ(data2->tile_key, olp::geo::TileKey::FromHereTile("95")); |
| 210 | + EXPECT_EQ(data2->version, 253); |
| 211 | + |
| 212 | + auto data3 = index.Find(tile_key.AddedSubHereTile("2"), false); |
| 213 | + ASSERT_FALSE(data3 == boost::none); |
| 214 | + EXPECT_EQ(data3->data_handle, "9772F5E1822DFF25F48F150294B1ECF5.282"); |
| 215 | + EXPECT_EQ(data3->tile_key, olp::geo::TileKey::FromHereTile("1526")); |
| 216 | + EXPECT_EQ(data3->version, 282); |
| 217 | + |
| 218 | + auto data4 = index.Find(tile_key.AddedSubHereTile("4"), false); |
| 219 | + ASSERT_FALSE(data4 == boost::none); |
| 220 | + EXPECT_EQ(data4->data_handle, "7636348E50215979A39B5F3A429EDDB4.282"); |
| 221 | + EXPECT_EQ(data4->tile_key, olp::geo::TileKey::FromHereTile("1524")); |
| 222 | + EXPECT_EQ(data4->version, 282); |
| 223 | + |
| 224 | + auto data5 = index.Find(olp::geo::TileKey::FromHereTile("1561298"), false); |
| 225 | + EXPECT_TRUE(data5 == boost::none); |
| 226 | + |
| 227 | + auto data6 = index.Find(olp::geo::TileKey::FromHereTile("3"), false); |
| 228 | + EXPECT_TRUE(data6 == boost::none); |
| 229 | + } |
| 230 | + |
| 231 | + { |
| 232 | + SCOPED_TRACE("Find Data Aggregated"); |
| 233 | + |
| 234 | + // Find in parents |
| 235 | + auto data1 = index.Find(olp::geo::TileKey::FromHereTile("5842"), true); |
| 236 | + ASSERT_FALSE(data1 == boost::none); |
| 237 | + EXPECT_EQ(data1->data_handle, "13E2C624E0136C3357D092EE7F231E87.282"); |
| 238 | + EXPECT_EQ(data1->tile_key, olp::geo::TileKey::FromHereTile("5")); |
| 239 | + EXPECT_EQ(data1->version, 282); |
| 240 | + |
| 241 | + // Find in sub quads |
| 242 | + auto data2 = index.Find(olp::geo::TileKey::FromHereTile("1561298"), true); |
| 243 | + ASSERT_FALSE(data2 == boost::none); |
| 244 | + EXPECT_EQ(data2->data_handle, "7636348E50215979A39B5F3A429EDDB4.282"); |
| 245 | + EXPECT_EQ(data2->tile_key, olp::geo::TileKey::FromHereTile("1524")); |
| 246 | + EXPECT_EQ(data2->version, 282); |
| 247 | + |
| 248 | + // Use bottom tile so the algorithm will try to look in childs and parents |
| 249 | + // and will fail due to no nearest parent present in data |
| 250 | + auto data3 = index.Find(olp::geo::TileKey::FromHereTile("4818"), true); |
| 251 | + EXPECT_TRUE(data3 == boost::none); |
| 252 | + } |
| 253 | + |
| 254 | + { |
| 255 | + SCOPED_TRACE("Quad tree GetIndexData test"); |
| 256 | + |
| 257 | + for (const auto& data : index.GetIndexData()) { |
| 258 | + if (data.tile_key == olp::geo::TileKey::FromHereTile("23")) { |
| 259 | + EXPECT_EQ(data.data_handle, "F8F4C3CB09FBA61B927256CBCB8441D1.282"); |
| 260 | + } |
| 261 | + if (data.tile_key == olp::geo::TileKey::FromHereTile("1524")) { |
| 262 | + EXPECT_EQ(data.data_handle, "7636348E50215979A39B5F3A429EDDB4.282"); |
| 263 | + } |
| 264 | + } |
| 265 | + } |
| 266 | +} |
| 267 | + |
145 | 268 | } // namespace |
0 commit comments