summaryrefslogtreecommitdiff
path: root/test/storage/cache_revalidate.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'test/storage/cache_revalidate.cpp')
-rw-r--r--test/storage/cache_revalidate.cpp139
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);