#include "storage.hpp" #include #include #include #include TEST_F(Storage, CacheResponse) { SCOPED_TEST(CacheResponse); using namespace mbgl; util::RunLoop loop; SQLiteCache cache(":memory:"); OnlineFileSource fs(&cache); const Resource resource { Resource::Unknown, "http://127.0.0.1:3000/cache" }; Response response; std::unique_ptr req1; std::unique_ptr req2; req1 = fs.request(resource, [&](Response res) { req1.reset(); EXPECT_EQ(nullptr, res.error); ASSERT_TRUE(res.data.get()); EXPECT_EQ("Response 1", *res.data); EXPECT_TRUE(bool(res.expires)); EXPECT_FALSE(bool(res.modified)); EXPECT_FALSE(bool(res.etag)); response = res; // Now test that we get the same values as in the previous request. If we'd go to the server // again, we'd get different values. req2 = fs.request(resource, [&](Response res2) { req2.reset(); EXPECT_EQ(response.error, res2.error); ASSERT_TRUE(res2.data.get()); EXPECT_EQ(*response.data, *res2.data); EXPECT_EQ(response.expires, res2.expires); EXPECT_EQ(response.modified, res2.modified); EXPECT_EQ(response.etag, res2.etag); loop.stop(); CacheResponse.finish(); }); }); loop.run(); } // Make sure we /do/ store 404 Not Found responses into the cache TEST_F(Storage, CacheNotFound) { SCOPED_TEST(CacheNotFound); using namespace mbgl; util::RunLoop loop; SQLiteCache cache(":memory:"); OnlineFileSource fs(&cache); const Resource resource{ Resource::Unknown, "http://127.0.0.1:3000/not-found" }; // Insert existing data into the cache that will be marked as stale. Response response; response.data = std::make_shared("existing data"); cache.put(resource, response); std::unique_ptr req1; std::unique_ptr req2; int counter = 0; // Then, request the actual URL and check that we're getting the rigged cache response first, // then the connection error message. req1 = fs.request(resource, [&](Response res) { if (counter == 0) { EXPECT_EQ(nullptr, res.error); ASSERT_TRUE(res.data.get()); EXPECT_EQ("existing data", *res.data); EXPECT_FALSE(bool(res.expires)); EXPECT_FALSE(bool(res.modified)); EXPECT_FALSE(bool(res.etag)); } else if (counter == 1) { EXPECT_NE(nullptr, res.error); EXPECT_EQ(Response::Error::Reason::NotFound, res.error->reason); ASSERT_TRUE(res.data.get()); EXPECT_EQ("Not Found!", *res.data); req1.reset(); // Finally, check the cache to make sure we cached the 404 response. req2 = cache.get(resource, [&](std::unique_ptr res2) { EXPECT_NE(nullptr, res2->error); EXPECT_EQ(Response::Error::Reason::NotFound, res2->error->reason); ASSERT_TRUE(res2->data.get()); EXPECT_EQ("Not Found!", *res2->data); CacheNotFound.finish(); loop.stop(); }); } else { FAIL() << "Got too many responses"; } counter++; }); loop.run(); } // Make sure we don't store a connection error into the cache TEST_F(Storage, DontCacheConnectionErrors) { SCOPED_TEST(DontCacheConnectionErrors); using namespace mbgl; util::RunLoop loop; SQLiteCache cache(":memory:"); OnlineFileSource fs(&cache); const Resource resource{ Resource::Unknown, "http://127.0.0.1:3001" }; // Insert existing data into the cache that will be marked as stale. Response response; response.data = std::make_shared("existing data"); cache.put(resource, response); std::unique_ptr req1; std::unique_ptr req2; int counter = 0; // Then, request the actual URL and check that we're getting the rigged cache response first, // then the connection error message. req1 = fs.request(resource, [&](Response res) { if (counter == 0) { EXPECT_EQ(nullptr, res.error); ASSERT_TRUE(res.data.get()); EXPECT_EQ("existing data", *res.data); EXPECT_FALSE(bool(res.expires)); EXPECT_FALSE(bool(res.modified)); EXPECT_FALSE(bool(res.etag)); } else if (counter == 1) { EXPECT_NE(nullptr, res.error); EXPECT_EQ(Response::Error::Reason::Connection, res.error->reason); req1.reset(); // Finally, check the cache to make sure we still have our original data in there rather // than the failed connection attempt. req2 = cache.get(resource, [&](std::unique_ptr res2) { EXPECT_EQ(nullptr, res2->error); ASSERT_TRUE(res2->data.get()); EXPECT_EQ("existing data", *res2->data); DontCacheConnectionErrors.finish(); loop.stop(); }); } else { FAIL() << "Got too many responses"; } counter++; }); loop.run(); } // Make sure we don't store a bad server response into the cache TEST_F(Storage, DontCacheServerErrors) { SCOPED_TEST(DontCacheServerErrors); using namespace mbgl; util::RunLoop loop; SQLiteCache cache(":memory:"); OnlineFileSource fs(&cache); const Resource resource{ Resource::Unknown, "http://127.0.0.1:3000/permanent-error" }; // Insert existing data into the cache that will be marked as stale. Response response; response.data = std::make_shared("existing data"); cache.put(resource, response); std::unique_ptr req1; std::unique_ptr req2; int counter = 0; // Then, request the actual URL and check that we're getting the rigged cache response first, // then the server error message. req1 = fs.request(resource, [&](Response res) { if (counter == 0) { EXPECT_EQ(nullptr, res.error); ASSERT_TRUE(res.data.get()); EXPECT_EQ("existing data", *res.data); EXPECT_FALSE(bool(res.expires)); EXPECT_FALSE(bool(res.modified)); EXPECT_FALSE(bool(res.etag)); } else if (counter == 1) { EXPECT_NE(nullptr, res.error); EXPECT_EQ(Response::Error::Reason::Server, res.error->reason); ASSERT_TRUE(res.data.get()); EXPECT_EQ("Server Error!", *res.data); req1.reset(); // Finally, check the cache to make sure we still have our original data in there rather // than the failed connection attempt. req2 = cache.get(resource, [&](std::unique_ptr res2) { EXPECT_EQ(nullptr, res2->error); ASSERT_TRUE(res2->data.get()); EXPECT_EQ("existing data", *res2->data); DontCacheServerErrors.finish(); loop.stop(); }); } else { FAIL() << "Got too many responses"; } counter++; }); loop.run(); }