diff options
Diffstat (limited to 'test/storage/cache_revalidate.cpp')
-rw-r--r-- | test/storage/cache_revalidate.cpp | 139 |
1 files changed, 126 insertions, 13 deletions
diff --git a/test/storage/cache_revalidate.cpp b/test/storage/cache_revalidate.cpp index 8ebedef01b..90633b83ac 100644 --- a/test/storage/cache_revalidate.cpp +++ b/test/storage/cache_revalidate.cpp @@ -5,29 +5,58 @@ #include <mbgl/storage/default_file_source.hpp> #include <mbgl/storage/sqlite_cache.hpp> -TEST_F(Storage, CacheRevalidate) { +TEST_F(Storage, CacheRevalidateSame) { SCOPED_TEST(CacheRevalidateSame) - SCOPED_TEST(CacheRevalidateModified) - SCOPED_TEST(CacheRevalidateEtag) using namespace mbgl; SQLiteCache cache(":memory:"); DefaultFileSource fs(&cache); + const Response *reference = nullptr; + const Resource revalidateSame { Resource::Unknown, "http://127.0.0.1:3000/revalidate-same" }; - Request* req = fs.request(revalidateSame, uv_default_loop(), [&](const Response &res) { - fs.cancel(req); + Request* req1 = nullptr; + Request* req2 = nullptr; + req1 = fs.request(revalidateSame, uv_default_loop(), [&](const Response &res) { + // This callback can get triggered multiple times. We only care about the first invocation. + // It will get triggered again when refreshing the req2 (see below). + static bool first = true; + if (!first) { + return; + } + first = false; + + EXPECT_EQ(nullptr, reference); + reference = &res; + EXPECT_EQ(Response::Successful, res.status); + EXPECT_EQ(false, res.stale); EXPECT_EQ("Response", res.data); EXPECT_EQ(0, res.expires); EXPECT_EQ(0, res.modified); EXPECT_EQ("snowfall", res.etag); EXPECT_EQ("", res.message); - req = fs.request(revalidateSame, uv_default_loop(), [&, res](const Response &res2) { - fs.cancel(req); + req2 = fs.request(revalidateSame, uv_default_loop(), [&, res](const Response &res2) { + // Make sure we get a different object than before, since this request should've been revalidated. + EXPECT_TRUE(reference != &res2); + + if (res2.stale) { + // Discard stale responses, if any. + return; + } + + ASSERT_TRUE(req1); + fs.cancel(req1); + req1 = nullptr; + + ASSERT_TRUE(req2); + fs.cancel(req2); + req2 = nullptr; + EXPECT_EQ(Response::Successful, res2.status); + EXPECT_EQ(false, res.stale); EXPECT_EQ("Response", res2.data); // We use this to indicate that a 304 reply came back. EXPECT_LT(0, res2.expires); @@ -40,11 +69,37 @@ TEST_F(Storage, CacheRevalidate) { }); }); + uv_run(uv_default_loop(), UV_RUN_DEFAULT); +} + +TEST_F(Storage, CacheRevalidateModified) { + SCOPED_TEST(CacheRevalidateModified) + + using namespace mbgl; + + SQLiteCache cache(":memory:"); + DefaultFileSource fs(&cache); + + const Response *reference = nullptr; + const Resource revalidateModified{ Resource::Unknown, "http://127.0.0.1:3000/revalidate-modified" }; - Request* req2 = fs.request(revalidateModified, uv_default_loop(), [&](const Response &res) { - fs.cancel(req2); + Request* req1 = nullptr; + Request* req2 = nullptr; + req1 = fs.request(revalidateModified, uv_default_loop(), [&](const Response& res) { + // This callback can get triggered multiple times. We only care about the first invocation. + // It will get triggered again when refreshing the req2 (see below). + static bool first = true; + if (!first) { + return; + } + first = false; + + EXPECT_EQ(nullptr, reference); + reference = &res; + EXPECT_EQ(Response::Successful, res.status); + EXPECT_EQ(false, res.stale); EXPECT_EQ("Response", res.data); EXPECT_EQ(0, res.expires); EXPECT_EQ(1420070400, res.modified); @@ -52,8 +107,24 @@ TEST_F(Storage, CacheRevalidate) { EXPECT_EQ("", res.message); req2 = fs.request(revalidateModified, uv_default_loop(), [&, res](const Response &res2) { + // Make sure we get a different object than before, since this request should've been revalidated. + EXPECT_TRUE(reference != &res2); + + if (res2.stale) { + // Discard stale responses, if any. + return; + } + + ASSERT_TRUE(req1); + fs.cancel(req1); + req1 = nullptr; + + ASSERT_TRUE(req2); fs.cancel(req2); + req2 = nullptr; + EXPECT_EQ(Response::Successful, res2.status); + EXPECT_EQ(false, res.stale); EXPECT_EQ("Response", res2.data); // We use this to indicate that a 304 reply came back. EXPECT_LT(0, res2.expires); @@ -65,19 +136,61 @@ TEST_F(Storage, CacheRevalidate) { }); }); + uv_run(uv_default_loop(), UV_RUN_DEFAULT); +} + +TEST_F(Storage, CacheRevalidateEtag) { + SCOPED_TEST(CacheRevalidateEtag) + + using namespace mbgl; + + SQLiteCache cache(":memory:"); + DefaultFileSource fs(&cache); + + const Response *reference = nullptr; + const Resource revalidateEtag { Resource::Unknown, "http://127.0.0.1:3000/revalidate-etag" }; - Request* req3 = fs.request(revalidateEtag, uv_default_loop(), [&](const Response &res) { - fs.cancel(req3); + Request* req1 = nullptr; + Request* req2 = nullptr; + req1 = fs.request(revalidateEtag, uv_default_loop(), [&](const Response &res) { + // This callback can get triggered multiple times. We only care about the first invocation. + // It will get triggered again when refreshing the req2 (see below). + static bool first = true; + if (!first) { + return; + } + first = false; + + EXPECT_EQ(nullptr, reference); + reference = &res; + EXPECT_EQ(Response::Successful, res.status); + EXPECT_EQ(false, res.stale); EXPECT_EQ("Response 1", res.data); EXPECT_EQ(0, res.expires); EXPECT_EQ(0, res.modified); EXPECT_EQ("response-1", res.etag); EXPECT_EQ("", res.message); - req3 = fs.request(revalidateEtag, uv_default_loop(), [&, res](const Response &res2) { - fs.cancel(req3); + req2 = fs.request(revalidateEtag, uv_default_loop(), [&, res](const Response &res2) { + // Make sure we get a different object than before, since this request should've been revalidated. + EXPECT_TRUE(reference != &res2); + + if (res2.stale) { + // Discard stale responses, if any. + return; + } + + ASSERT_TRUE(req1); + fs.cancel(req1); + req1 = nullptr; + + ASSERT_TRUE(req2); + fs.cancel(req2); + req2 = nullptr; + EXPECT_EQ(Response::Successful, res2.status); + EXPECT_EQ(false, res.stale); EXPECT_EQ("Response 2", res2.data); EXPECT_EQ(0, res2.expires); EXPECT_EQ(0, res2.modified); |