diff --git a/test/data/customized_resources.txt b/test/data/customized_resources.txt
new file mode 100644
index 000000000..5c5f2b72e
--- /dev/null
+++ b/test/data/customized_resources.txt
@@ -0,0 +1,5 @@
+/non-existent-item text/plain ./test/helloworld.txt
+/ text/html ./test/welcome.html
+/skin/index.css application/json ./test/helloworld.txt
+/zimfile/A/Ray_Charles ray/charles ./test/welcome.html
+/search text/html ./test/helloworld.txt
diff --git a/test/data/helloworld.txt b/test/data/helloworld.txt
new file mode 100644
index 000000000..cd0875583
--- /dev/null
+++ b/test/data/helloworld.txt
@@ -0,0 +1 @@
+Hello world!
diff --git a/test/data/welcome.html b/test/data/welcome.html
new file mode 100644
index 000000000..7612b5763
--- /dev/null
+++ b/test/data/welcome.html
@@ -0,0 +1 @@
+
Welcome
diff --git a/test/meson.build b/test/meson.build
index 0783691f8..3137163a7 100644
--- a/test/meson.build
+++ b/test/meson.build
@@ -36,7 +36,10 @@ if gtest_dep.found() and not meson.is_cross_build()
'zimfile&other.zim',
'corner_cases.zim',
'poor.zim',
- 'library.xml'
+ 'library.xml',
+ 'customized_resources.txt',
+ 'helloworld.txt',
+ 'welcome.html',
]
foreach file : data_files
# configure_file(input : 'data/' + file,
diff --git a/test/server.cpp b/test/server.cpp
index 88ace8067..9d7c38293 100644
--- a/test/server.cpp
+++ b/test/server.cpp
@@ -287,6 +287,68 @@ TEST_F(ServerTest, 404)
}
}
+struct CustomizedServerTest : ServerTest
+{
+ void SetUp()
+ {
+ setenv("KIWIX_SERVE_CUSTOMIZED_RESOURCES", "./test/customized_resources.txt", 1);
+ ServerTest::SetUp();
+ }
+};
+
+typedef std::vector StringCollection;
+
+std::string getHeaderValue(const Headers& headers, const std::string& name)
+{
+ const auto er = headers.equal_range(name);
+ const auto n = std::distance(er.first, er.second);
+ if (n == 0)
+ throw std::runtime_error("Missing header: " + name);
+ if (n > 1)
+ throw std::runtime_error("Multiple occurrences of header: " + name);
+ return er.first->second;
+}
+
+TEST_F(CustomizedServerTest, NewResourcesCanBeAdded)
+{
+ // ServerTest.404 verifies that "/ROOT/non-existent-item" doesn't exist
+ const auto r = zfs1_->GET("/ROOT/non-existent-item");
+ EXPECT_EQ(r->status, 200);
+ EXPECT_EQ(getHeaderValue(r->headers, "Content-Type"), "text/plain");
+ EXPECT_EQ(r->body, "Hello world!\n");
+}
+
+TEST_F(CustomizedServerTest, ContentOfAnyServableUrlCanBeOverriden)
+{
+ {
+ const auto r = zfs1_->GET("/ROOT/");
+ EXPECT_EQ(r->status, 200);
+ EXPECT_EQ(getHeaderValue(r->headers, "Content-Type"), "text/html");
+ EXPECT_EQ(r->body, "Welcome\n");
+ }
+
+ {
+ const auto r = zfs1_->GET("/ROOT/skin/index.css");
+ EXPECT_EQ(r->status, 200);
+ EXPECT_EQ(getHeaderValue(r->headers, "Content-Type"), "application/json");
+ EXPECT_EQ(r->body, "Hello world!\n");
+ }
+
+ {
+ const auto r = zfs1_->GET("/ROOT/zimfile/A/Ray_Charles");
+ EXPECT_EQ(r->status, 200);
+ EXPECT_EQ(getHeaderValue(r->headers, "Content-Type"), "ray/charles");
+ EXPECT_EQ(r->body, "Welcome\n");
+ }
+
+ {
+ const auto r = zfs1_->GET("/ROOT/search?pattern=la+femme");
+ EXPECT_EQ(r->status, 200);
+ EXPECT_EQ(getHeaderValue(r->headers, "Content-Type"), "text/html");
+ EXPECT_EQ(r->body, "Hello world!\n");
+ }
+}
+
namespace TestingOfHtmlResponses
{