From 30aaa76910df6c84157f5eec26d39d15dd5860aa Mon Sep 17 00:00:00 2001 From: Alexander Shalamov Date: Thu, 12 Sep 2019 22:36:14 +0300 Subject: [PATCH] [core] Add unit tests for ambient cache size --- .../offline_database/no_auto_vacuum.db | Bin 61440 -> 102400 bytes test/storage/offline_database.test.cpp | 60 +++++++++++++++--- 2 files changed, 52 insertions(+), 8 deletions(-) diff --git a/test/fixtures/offline_database/no_auto_vacuum.db b/test/fixtures/offline_database/no_auto_vacuum.db index f19e6399332e952f589fa6820b5a4f7a12604c3d..d4222b23cafde8f6933e2d1139bf18e17c9a1a2d 100644 GIT binary patch delta 47758 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

sdrN=mO7 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

Kf3C`3)md%#hXl?~hG*m!&r<{DE~m_uZZ?50D9B zu0^I~HAq(YV+i)P_xiwZ->$qP;z5yM(`7;#SMw}GRTV{7nUG2^4c2xEzp9t5)p>06 zg&%HTxQKs$j;25K|Gj~>f79^pt$)s{96fvYe>?QoUGgz~%Vkq3XEZ()Rh@8G+!1>- zK!8zDYf$f3{{ng{{)*h4rv13=Z?p;7_`(HNCafOEKRFYojs6zMZO6J;rRh4O9e<9|opIKCm<0q{b-w=d1Zb{k7d5ECkTu8|` zH;$ElAfr69Kq&!wQS!81q%_BdkIaveWfb0hG49m zXyE5h_*QUT{2l70XcOZEpb*sa4QLfE&yBm0N^omkM`?>!W<#fz0_0(GkNjlCo zNmC6~p$Ois*i{1_-VjYV_4oa6!KaUUH(I~#RhoY^|6&%@kJBqGGIw0CI;1mAKAC+k VU=`$8)hwHk{|9ZLn-*STJQ7P)_euZ& delta 245 zcmZozz}E19d4jYcGXnzyKM=zJ_e33IR%Ql0m4=Ne3;3BB1U3s^c+EdCfS-*Eqy)j` O#ml9lVl<;D-~s@BYdMwx diff --git a/test/storage/offline_database.test.cpp b/test/storage/offline_database.test.cpp index f34415129..146cb3353 100644 --- a/test/storage/offline_database.test.cpp +++ b/test/storage/offline_database.test.cpp @@ -714,19 +714,22 @@ TEST(OfflineDatabase, TEST_REQUIRES_WRITE(DeleteRegion)) { EXPECT_LT(sizeWithOneRegion, sizeWithTwoRegions); db.runPackDatabaseAutomatically(true); db.deleteRegion(std::move(*region2)); - // The size of the database has shrunk right away. + + // After clearing the cache, the size of the database + // should get back to the original size. + db.clearAmbientCache(); + + // The size of the database has shrunk right away after deleted region + // is evicted from an ambient cache. const size_t sizeWithoutRegions = util::read_file(filename).size(); - ASSERT_EQ(0u, db.listRegions().value().size()); - EXPECT_LT(sizeWithoutRegions, sizeWithOneRegion); // The tiles from the offline region will migrate to the // ambient cache and shrink the database to the maximum // size defined by default. EXPECT_LE(sizeWithoutRegions, util::DEFAULT_MAX_CACHE_SIZE); - // After clearing the cache, the size of the database - // should get back to the original size. - db.clearAmbientCache(); + ASSERT_EQ(0u, db.listRegions().value().size()); + EXPECT_LT(sizeWithoutRegions, sizeWithOneRegion); } EXPECT_EQ(initialSize, util::read_file(filename).size()); @@ -1059,7 +1062,8 @@ TEST(OfflineDatabase, PutEvictsLeastRecentlyUsedResources) { Response response; response.data = randomString(1024); - for (uint32_t i = 1; i <= 100; i++) { + // Add 101 resource to ambient cache, 1 over defined limit. + for (uint32_t i = 1; i <= 101; ++i) { Resource resource = Resource::style("http://example.com/"s + util::toString(i)); db.put(resource, response); EXPECT_TRUE(bool(db.get(resource))) << i; @@ -1070,6 +1074,45 @@ TEST(OfflineDatabase, PutEvictsLeastRecentlyUsedResources) { EXPECT_EQ(0u, log.uncheckedCount()); } +TEST(OfflineDatabase, OfflineRegionDoesNotAffectAmbientCacheSize) { + FixtureLog log; + OfflineDatabase db(":memory:"); + unsigned dataSize = 1024u * 100u; + unsigned numberOfCachedResources = 2u; + unsigned databasePage = 4096u; + unsigned pageOverhead = numberOfCachedResources * databasePage; + + // 200KB ambient cache limit + database page overhead. + db.setMaximumAmbientCacheSize(dataSize * numberOfCachedResources + pageOverhead); + + Response response; + response.data = randomString(dataSize); + + // First 100KB ambient cache resource. + db.put(Resource::style("http://example.com/ambient1.json"s), response); + + OfflineTilePyramidRegionDefinition definition( + "http://example.com/style.json", LatLngBounds::world(), 0.0, 0.0, 1.0, false); + auto region = db.createRegion(definition, OfflineRegionMetadata()); + + // 1MB of offline region data. + for (std::size_t i = 0; i < 5; ++i) { + const Resource tile = Resource::tile("mapbox://tile_" + std::to_string(i), 1, 0, 0, 0, Tileset::Scheme::XYZ); + db.putRegionResource(region->getID(), tile, response); + + const Resource style = Resource::style("mapbox://style_" + std::to_string(i)); + db.putRegionResource(region->getID(), style, response); + } + + // Second 100KB ambient cache resource. + db.put(Resource::style("http://example.com/ambient2.json"s), response); + + // Offline region resources should not affect ambient cache size. + EXPECT_TRUE(bool(db.get(Resource::style("http://example.com/ambient1.json"s)))); + EXPECT_TRUE(bool(db.get(Resource::style("http://example.com/ambient2.json"s)))); + EXPECT_EQ(0u, log.uncheckedCount()); +} + TEST(OfflineDatabase, PutRegionResourceDoesNotEvict) { FixtureLog log; OfflineDatabase db(":memory:"); @@ -1098,7 +1141,8 @@ TEST(OfflineDatabase, PutFailsWhenEvictionInsuffices) { db.setMaximumAmbientCacheSize(1024 * 100); Response big; - big.data = randomString(1024 * 100); + // One page over the cache size. + big.data = randomString(1024 * 100 + 4096); EXPECT_FALSE(db.put(Resource::style("http://example.com/big"), big).first);