asset:// URLs are local to the executable path now

This commit is contained in:
Konstantin Käfer
2015-01-23 11:04:26 +01:00
parent 9a549094e0
commit 4a985e09f2
17 changed files with 170 additions and 150 deletions

View File

@@ -106,8 +106,7 @@ android:
test: build/test/Makefile
$(MAKE) -C build/test BUILDTYPE=$(BUILDTYPE) V=$(V) test
test-%: build/test/Makefile
$(MAKE) -C build/test BUILDTYPE=$(BUILDTYPE) V=$(V) test
test-%: test
./scripts/run_tests.sh --gtest_filter=$*
# build Mac OS X project for Xcode

View File

@@ -17,7 +17,9 @@ if [[ ${TRAVIS_OS_NAME} == "linux" ]]; then
fi
# install test server dependencies
(cd test; npm install express@4.11)
if [ ! -d "test/node_modules/express" ]; then
(cd test; npm install express@4.11.1)
fi
RESULT=0
${CMD} "$@" || RESULT=$?

View File

@@ -4,6 +4,7 @@
#include <mbgl/map/map.hpp>
#include <mbgl/util/image.hpp>
#include <mbgl/util/std.hpp>
#include <mbgl/platform/platform.hpp>
#include <mbgl/util/io.hpp>
#include <rapidjson/document.h>
@@ -29,7 +30,7 @@ void rewriteLocalScheme(rapidjson::Value &value, rapidjson::Document::AllocatorT
class HeadlessTest : public ::testing::TestWithParam<std::string> {
public:
static void SetUpTestCase() {
const auto server = mbgl::test::getBaseDirectory() + "/headless/server.js";
const auto server = mbgl::platform::applicationRoot() + "/TEST_DATA/headless/server.js";
pid = mbgl::test::startServer(server.c_str());
display = std::make_shared<mbgl::HeadlessDisplay>();
}

View File

@@ -16,20 +16,20 @@ TEST_F(Storage, CacheResponse) {
const Resource resource { Resource::Unknown, "http://127.0.0.1:3000/cache" };
fs.request(resource, uv_default_loop(), [&](const Response &res) {
EXPECT_EQ(res.status, Response::Successful);
EXPECT_EQ(res.data, "Response 1");
EXPECT_GT(res.expires, 0);
EXPECT_EQ(res.modified, 0);
EXPECT_EQ(res.etag, "");
EXPECT_EQ(res.message, "");
EXPECT_EQ(Response::Successful, res.status);
EXPECT_EQ("Response 1", res.data);
EXPECT_LT(0, res.expires);
EXPECT_EQ(0, res.modified);
EXPECT_EQ("", res.etag);
EXPECT_EQ("", res.message);
fs.request(resource, uv_default_loop(), [&, res](const Response &res2) {
EXPECT_EQ(res2.status, res.status);
EXPECT_EQ(res2.data, res.data);
EXPECT_EQ(res2.expires, res.expires);
EXPECT_EQ(res2.modified, res.modified);
EXPECT_EQ(res2.etag, res.etag);
EXPECT_EQ(res2.message, res.message);
EXPECT_EQ(res.status, res2.status);
EXPECT_EQ(res.data, res2.data);
EXPECT_EQ(res.expires, res2.expires);
EXPECT_EQ(res.modified, res2.modified);
EXPECT_EQ(res.etag, res2.etag);
EXPECT_EQ(res.message, res2.message);
CacheResponse.finish();
});

View File

@@ -17,22 +17,22 @@ TEST_F(Storage, CacheRevalidate) {
const Resource revalidateSame { Resource::Unknown, "http://127.0.0.1:3000/revalidate-same" };
fs.request(revalidateSame, uv_default_loop(), [&](const Response &res) {
EXPECT_EQ(res.status, Response::Successful);
EXPECT_EQ(res.data, "Response");
EXPECT_EQ(res.expires, 0);
EXPECT_EQ(res.modified, 0);
EXPECT_EQ(res.etag, "snowfall");
EXPECT_EQ(res.message, "");
EXPECT_EQ(Response::Successful, res.status);
EXPECT_EQ("Response", res.data);
EXPECT_EQ(0, res.expires);
EXPECT_EQ(0, res.modified);
EXPECT_EQ("snowfall", res.etag);
EXPECT_EQ("", res.message);
fs.request(revalidateSame, uv_default_loop(), [&, res](const Response &res2) {
EXPECT_EQ(res2.status, Response::Successful);
EXPECT_EQ(res2.data, "Response");
EXPECT_EQ(Response::Successful, res2.status);
EXPECT_EQ("Response", res2.data);
// We use this to indicate that a 304 reply came back.
EXPECT_GT(res2.expires, 0);
EXPECT_EQ(res2.modified, 0);
EXPECT_LT(0, res2.expires);
EXPECT_EQ(0, res2.modified);
// We're not sending the ETag in the 304 reply, but it should still be there.
EXPECT_EQ(res2.etag, "snowfall");
EXPECT_EQ(res2.message, "");
EXPECT_EQ("snowfall", res2.etag);
EXPECT_EQ("", res2.message);
CacheRevalidateSame.finish();
});
@@ -40,21 +40,21 @@ TEST_F(Storage, CacheRevalidate) {
const Resource revalidateModified { Resource::Unknown, "http://127.0.0.1:3000/revalidate-modified" };
fs.request(revalidateModified, uv_default_loop(), [&](const Response &res) {
EXPECT_EQ(res.status, Response::Successful);
EXPECT_EQ(res.data, "Response");
EXPECT_EQ(res.expires, 0);
EXPECT_EQ(res.modified, 1420070400);
EXPECT_EQ(res.etag, "");
EXPECT_EQ(res.message, "");
EXPECT_EQ(Response::Successful, res.status);
EXPECT_EQ("Response", res.data);
EXPECT_EQ(0, res.expires);
EXPECT_EQ(1420070400, res.modified);
EXPECT_EQ("", res.etag);
EXPECT_EQ("", res.message);
fs.request(revalidateModified, uv_default_loop(), [&, res](const Response &res2) {
EXPECT_EQ(res2.status, Response::Successful);
EXPECT_EQ(res2.data, "Response");
EXPECT_EQ(Response::Successful, res2.status);
EXPECT_EQ("Response", res2.data);
// We use this to indicate that a 304 reply came back.
EXPECT_GT(res2.expires, 0);
EXPECT_EQ(res2.modified, 1420070400);
EXPECT_EQ(res2.etag, "");
EXPECT_EQ(res2.message, "");
EXPECT_LT(0, res2.expires);
EXPECT_EQ(1420070400, res2.modified);
EXPECT_EQ("", res2.etag);
EXPECT_EQ("", res2.message);
CacheRevalidateModified.finish();
});
@@ -62,20 +62,20 @@ TEST_F(Storage, CacheRevalidate) {
const Resource revalidateEtag { Resource::Unknown, "http://127.0.0.1:3000/revalidate-etag" };
fs.request(revalidateEtag, uv_default_loop(), [&](const Response &res) {
EXPECT_EQ(res.status, Response::Successful);
EXPECT_EQ(res.data, "Response 1");
EXPECT_EQ(res.expires, 0);
EXPECT_EQ(res.modified, 0);
EXPECT_EQ(res.etag, "response-1");
EXPECT_EQ(res.message, "");
EXPECT_EQ(Response::Successful, res.status);
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);
fs.request(revalidateEtag, uv_default_loop(), [&, res](const Response &res2) {
EXPECT_EQ(res2.status, Response::Successful);
EXPECT_EQ(res2.data, "Response 2");
EXPECT_EQ(res2.expires, 0);
EXPECT_EQ(res2.modified, 0);
EXPECT_EQ(res2.etag, "response-2");
EXPECT_EQ(res2.message, "");
EXPECT_EQ(Response::Successful, res2.status);
EXPECT_EQ("Response 2", res2.data);
EXPECT_EQ(0, res2.expires);
EXPECT_EQ(0, res2.modified);
EXPECT_EQ("response-2", res2.etag);
EXPECT_EQ("", res2.message);
CacheRevalidateEtag.finish();
});

View File

@@ -11,14 +11,13 @@ TEST_F(Storage, ReadDirectory) {
DefaultFileSource fs(nullptr, uv_default_loop());
const auto dir = std::string { "asset://" } + mbgl::test::getBaseDirectory() + "/fixtures/storage";
fs.request({ Resource::Unknown, dir }, uv_default_loop(), [&](const Response &res) {
EXPECT_EQ(res.status, Response::Error);
EXPECT_EQ(res.data.size(), 0ul);
EXPECT_EQ(res.expires, 0);
EXPECT_EQ(res.modified, 0);
EXPECT_EQ(res.etag, "");
EXPECT_EQ(res.message, "illegal operation on a directory");
fs.request({ Resource::Unknown, "asset://TEST_DATA/fixtures/storage" }, uv_default_loop(), [&](const Response &res) {
EXPECT_EQ(Response::Error, res.status);
EXPECT_EQ(0ul, res.data.size());
EXPECT_EQ(0, res.expires);
EXPECT_EQ(0, res.modified);
EXPECT_EQ("", res.etag);
EXPECT_EQ("illegal operation on a directory", res.message);
ReadDirectory.finish();
});

View File

@@ -3,6 +3,7 @@
#include <uv.h>
#include <mbgl/storage/default/default_file_source.hpp>
#include <mbgl/platform/platform.hpp>
TEST_F(Storage, EmptyFile) {
SCOPED_TEST(EmptyFile)
@@ -11,14 +12,15 @@ TEST_F(Storage, EmptyFile) {
DefaultFileSource fs(nullptr, uv_default_loop());
const auto file = std::string { "asset://" } + mbgl::test::getBaseDirectory() + "/fixtures/storage/empty";
fs.request({ Resource::Unknown, file }, uv_default_loop(), [&](const Response &res) {
EXPECT_EQ(res.status, Response::Successful);
EXPECT_EQ(res.data.size(), 0ul);
EXPECT_EQ(res.expires, 0);
EXPECT_GT(res.modified, 0);
EXPECT_NE(res.etag, "");
EXPECT_EQ(res.message, "");
fs.request({ Resource::Unknown, "asset://TEST_DATA/fixtures/storage/empty" },
uv_default_loop(),
[&](const Response &res) {
EXPECT_EQ(Response::Successful, res.status);
EXPECT_EQ(0ul, res.data.size());
EXPECT_EQ(0, res.expires);
EXPECT_LT(1420000000, res.modified);
EXPECT_NE("", res.etag);
EXPECT_EQ("", res.message);
EmptyFile.finish();
});
@@ -32,14 +34,15 @@ TEST_F(Storage, NonExistentFile) {
DefaultFileSource fs(nullptr, uv_default_loop());
const auto file = std::string { "asset://" } + mbgl::test::getBaseDirectory() + "/fixtures/storage/does_not_exist";
fs.request({ Resource::Unknown, file }, uv_default_loop(), [&](const Response &res) {
EXPECT_EQ(res.status, Response::Error);
EXPECT_EQ(res.data.size(), 0ul);
EXPECT_EQ(res.expires, 0);
EXPECT_EQ(res.modified, 0);
EXPECT_EQ(res.etag, "");
EXPECT_EQ(res.message, "no such file or directory");
fs.request({ Resource::Unknown, "asset://TEST_DATA/fixtures/storage/does_not_exist" },
uv_default_loop(),
[&](const Response &res) {
EXPECT_EQ(Response::Error, res.status);
EXPECT_EQ(0ul, res.data.size());
EXPECT_EQ(0, res.expires);
EXPECT_EQ(0, res.modified);
EXPECT_EQ("", res.etag);
EXPECT_EQ("no such file or directory", res.message);
NonExistentFile.finish();
});

View File

@@ -36,12 +36,12 @@ TEST_F(Storage, HTTPCancelMultiple) {
ADD_FAILURE() << "Callback should not be called";
});
fs.request(resource, uv_default_loop(), [&](const Response &res) {
EXPECT_EQ(res.status, Response::Successful);
EXPECT_EQ(res.data, "Hello World!");
EXPECT_EQ(res.expires, 0);
EXPECT_EQ(res.modified, 0);
EXPECT_EQ(res.etag, "");
EXPECT_EQ(res.message, "");
EXPECT_EQ(Response::Successful, res.status);
EXPECT_EQ("Hello World!", res.data);
EXPECT_EQ(0, res.expires);
EXPECT_EQ(0, res.modified);
EXPECT_EQ("", res.etag);
EXPECT_EQ("", res.message);
HTTPCancelMultiple.finish();
});
fs.cancel(req2);

View File

@@ -23,15 +23,15 @@ TEST_F(Storage, HTTPCoalescing) {
if (!reference) {
reference = &res;
} else {
EXPECT_EQ(reference, &res);
EXPECT_EQ(&res, reference);
}
EXPECT_EQ(res.status, Response::Successful);
EXPECT_EQ(res.data, "Hello World!");
EXPECT_EQ(res.expires, 0);
EXPECT_EQ(res.modified, 0);
EXPECT_EQ(res.etag, "");
EXPECT_EQ(res.message, "");
EXPECT_EQ(Response::Successful, res.status);
EXPECT_EQ("Hello World!", res.data);
EXPECT_EQ(0, res.expires);
EXPECT_EQ(0, res.modified);
EXPECT_EQ("", res.etag);
EXPECT_EQ("", res.message);
if (counter >= total) {
HTTPCoalescing.finish();

View File

@@ -26,14 +26,14 @@ TEST_F(Storage, HTTPError) {
fs.request({ Resource::Unknown, "http://127.0.0.1:3000/temporary-error" }, uv_default_loop(), [&](const Response &res) {
const auto duration = double(uv_hrtime() - start) / 1e9;
EXPECT_GT(duration, 1) << "Backoff timer didn't wait 1 second";
EXPECT_LT(duration, 1.2) << "Backoff timer fired too late";
EXPECT_EQ(res.status, Response::Successful);
EXPECT_EQ(res.data, "Hello World!");
EXPECT_EQ(res.expires, 0);
EXPECT_EQ(res.modified, 0);
EXPECT_EQ(res.etag, "");
EXPECT_EQ(res.message, "");
EXPECT_LT(1, duration) << "Backoff timer didn't wait 1 second";
EXPECT_GT(1.2, duration) << "Backoff timer fired too late";
EXPECT_EQ(Response::Successful, res.status);
EXPECT_EQ("Hello World!", res.data);
EXPECT_EQ(0, res.expires);
EXPECT_EQ(0, res.modified);
EXPECT_EQ("", res.etag);
EXPECT_EQ("", res.message);
HTTPTemporaryError.finish();
});
@@ -41,14 +41,14 @@ TEST_F(Storage, HTTPError) {
fs.request({ Resource::Unknown, "http://127.0.0.1:3001/" }, uv_default_loop(), [&](const Response &res) {
const auto duration = double(uv_hrtime() - start) / 1e9;
// 1.5 seconds == 4 retries, with a 500ms timeout (see above).
EXPECT_GT(duration, 1.5) << "Resource wasn't retried the correct number of times";
EXPECT_LT(duration, 1.7) << "Resource wasn't retried the correct number of times";
EXPECT_EQ(res.status, Response::Error);
EXPECT_LT(1.5, duration) << "Resource wasn't retried the correct number of times";
EXPECT_GT(1.7, duration) << "Resource wasn't retried the correct number of times";
EXPECT_EQ(Response::Error, res.status);
EXPECT_TRUE(res.message == "Couldn't connect to server" || res.message == "The operation couldn’t be completed. (NSURLErrorDomain error -1004.)");
EXPECT_EQ(res.data, "");
EXPECT_EQ(res.expires, 0);
EXPECT_EQ(res.modified, 0);
EXPECT_EQ(res.etag, "");
EXPECT_EQ("", res.data);
EXPECT_EQ(0, res.expires);
EXPECT_EQ(0, res.modified);
EXPECT_EQ("", res.etag);
HTTPConnectionError.finish();
});

View File

@@ -15,12 +15,12 @@ TEST_F(Storage, HTTPHeaderParsing) {
DefaultFileSource fs(nullptr, uv_default_loop());
fs.request({ Resource::Unknown, "http://127.0.0.1:3000/test?modified=1420794326&expires=1420797926&etag=foo" }, uv_default_loop(), [&](const Response &res) {
EXPECT_EQ(res.status, Response::Successful);
EXPECT_EQ(res.data, "Hello World!");
EXPECT_EQ(res.expires, 1420797926);
EXPECT_EQ(res.modified, 1420794326);
EXPECT_EQ(res.etag, "foo");
EXPECT_EQ(res.message, "");
EXPECT_EQ(Response::Successful, res.status);
EXPECT_EQ("Hello World!", res.data);
EXPECT_EQ(1420797926, res.expires);
EXPECT_EQ(1420794326, res.modified);
EXPECT_EQ("foo", res.etag);
EXPECT_EQ("", res.message);
HTTPExpiresTest.finish();
});
@@ -29,12 +29,12 @@ TEST_F(Storage, HTTPHeaderParsing) {
std::chrono::system_clock::now().time_since_epoch()).count();
fs.request({ Resource::Unknown, "http://127.0.0.1:3000/test?cachecontrol=max-age=120" }, uv_default_loop(), [&](const Response &res) {
EXPECT_EQ(res.status, Response::Successful);
EXPECT_EQ(res.data, "Hello World!");
EXPECT_LT(std::abs(res.expires - now - 120), 2) << "Expiration date isn't about 120 seconds in the future";
EXPECT_EQ(res.modified, 0);
EXPECT_EQ(res.etag, "");
EXPECT_EQ(res.message, "");
EXPECT_EQ(Response::Successful, res.status);
EXPECT_EQ("Hello World!", res.data);
EXPECT_GT(2, std::abs(res.expires - now - 120)) << "Expiration date isn't about 120 seconds in the future";
EXPECT_EQ(0, res.modified);
EXPECT_EQ("", res.etag);
EXPECT_EQ("", res.message);
HTTPCacheControlTest.finish();
});

View File

@@ -18,12 +18,12 @@ TEST_F(Storage, HTTPLoad) {
std::function<void()> req = [&]() {
const auto current = number++;
fs.request({ Resource::Unknown, std::string("http://127.0.0.1:3000/load/") + std::to_string(current) }, uv_default_loop(), [&, current](const Response &res) {
EXPECT_EQ(res.status, Response::Successful);
EXPECT_EQ(res.data, std::string("Request ") + std::to_string(current));
EXPECT_EQ(res.expires, 0);
EXPECT_EQ(res.modified, 0);
EXPECT_EQ(res.etag, "");
EXPECT_EQ(res.message, "");
EXPECT_EQ(Response::Successful, res.status);
EXPECT_EQ(std::string("Request ") + std::to_string(current), res.data);
EXPECT_EQ(0, res.expires);
EXPECT_EQ(0, res.modified);
EXPECT_EQ("", res.etag);
EXPECT_EQ("", res.message);
if (number <= max) {
req();

View File

@@ -21,13 +21,13 @@ TEST_F(Storage, HTTPNoLoop) {
});
fs.request({ Resource::Unknown, "http://127.0.0.1:3000/temporary-error" }, [&](const Response &res) {
EXPECT_NE(mainThread, uv_thread_self()) << "Response was called in the same thread";
EXPECT_EQ(res.status, Response::Successful);
EXPECT_EQ(res.data, "Hello World!");
EXPECT_EQ(res.expires, 0);
EXPECT_EQ(res.modified, 0);
EXPECT_EQ(res.etag, "");
EXPECT_EQ(res.message, "");
EXPECT_NE(uv_thread_self(), mainThread) << "Response was called in the same thread";
EXPECT_EQ(Response::Successful, res.status);
EXPECT_EQ("Hello World!", res.data);
EXPECT_EQ(0, res.expires);
EXPECT_EQ(0, res.modified);
EXPECT_EQ("", res.etag);
EXPECT_EQ("", res.message);
HTTPNoLoop.finish();
uv_async_send(async);

View File

@@ -13,12 +13,12 @@ TEST_F(Storage, HTTPOtherLoop) {
DefaultFileSource fs(nullptr);
fs.request({ Resource::Unknown, "http://127.0.0.1:3000/test" }, uv_default_loop(), [&](const Response &res) {
EXPECT_EQ(res.status, Response::Successful);
EXPECT_EQ(res.data, "Hello World!");
EXPECT_EQ(res.expires, 0);
EXPECT_EQ(res.modified, 0);
EXPECT_EQ(res.etag, "");
EXPECT_EQ(res.message, "");
EXPECT_EQ(Response::Successful, res.status);
EXPECT_EQ("Hello World!", res.data);
EXPECT_EQ(0, res.expires);
EXPECT_EQ(0, res.modified);
EXPECT_EQ("", res.etag);
EXPECT_EQ("", res.message);
HTTPOtherLoop.finish();
});

View File

@@ -15,23 +15,23 @@ TEST_F(Storage, HTTPReading) {
const auto mainThread = uv_thread_self();
fs.request({ Resource::Unknown, "http://127.0.0.1:3000/test" }, uv_default_loop(), [&](const Response &res) {
EXPECT_EQ(mainThread, uv_thread_self());
EXPECT_EQ(res.status, Response::Successful);
EXPECT_EQ(res.data, "Hello World!");
EXPECT_EQ(res.expires, 0);
EXPECT_EQ(res.modified, 0);
EXPECT_EQ(res.etag, "");
EXPECT_EQ(res.message, "");
EXPECT_EQ(uv_thread_self(), mainThread);
EXPECT_EQ(Response::Successful, res.status);
EXPECT_EQ("Hello World!", res.data);
EXPECT_EQ(0, res.expires);
EXPECT_EQ(0, res.modified);
EXPECT_EQ("", res.etag);
EXPECT_EQ("", res.message);
HTTPTest.finish();
});
fs.request({ Resource::Unknown, "http://127.0.0.1:3000/doesnotexist" }, uv_default_loop(), [&](const Response &res) {
EXPECT_EQ(mainThread, uv_thread_self());
EXPECT_EQ(res.status, Response::Error);
EXPECT_EQ(res.message, "HTTP status code 404");
EXPECT_EQ(res.expires, 0);
EXPECT_EQ(res.modified, 0);
EXPECT_EQ(res.etag, "");
EXPECT_EQ(uv_thread_self(), mainThread);
EXPECT_EQ(Response::Error, res.status);
EXPECT_EQ("HTTP status code 404", res.message);
EXPECT_EQ(0, res.expires);
EXPECT_EQ(0, res.modified);
EXPECT_EQ("", res.etag);
HTTP404.finish();
});

View File

@@ -1,10 +1,10 @@
#include "storage.hpp"
#include <mbgl/platform/platform.hpp>
pid_t Storage::pid = 0;
void Storage::SetUpTestCase() {
const auto server = mbgl::test::getBaseDirectory() + "/storage/server.js";
fprintf(stderr, "server: %s\n", server.c_str());
const auto server = mbgl::platform::applicationRoot() + "/TEST_DATA/storage/server.js";
pid = mbgl::test::startServer(server.c_str());
}

View File

@@ -3,10 +3,23 @@
'../gyp/common.gypi',
],
'targets': [
{ 'target_name': 'symlink_TEST_DATA',
'type': 'none',
'hard_dependency': 1,
'actions': [
{
'action_name': 'Symlink Fixture Directory',
'inputs': ['<!@(pwd)'],
'outputs': ['<(PRODUCT_DIR)/TEST_DATA'], # symlinks the test dir into TEST_DATA
'action': ['ln', '-s', '-f', '-n', '<@(_inputs)', '<@(_outputs)' ],
}
],
},
{ 'target_name': 'test',
'type': 'executable',
'include_dirs': [ '../include', '../src' ],
'dependencies': [
'symlink_TEST_DATA',
'../mapboxgl.gyp:mbgl-core',
'../mapboxgl.gyp:mbgl-<(platform)',
'../mapboxgl.gyp:mbgl-headless',
@@ -14,7 +27,9 @@
],
'sources': [
'fixtures/main.cpp',
'fixtures/util.hpp',
'fixtures/util.cpp',
'fixtures/fixture_log.hpp',
'fixtures/fixture_log.cpp',
'headless/headless.cpp',
@@ -30,6 +45,7 @@
'miscellaneous/tile.cpp',
'miscellaneous/variant.cpp',
'storage/storage.hpp',
'storage/storage.cpp',
'storage/cache_response.cpp',
'storage/cache_revalidate.cpp',