Add more tests varying `path` and `key` to cover real use cases.

Signed-off-by: Yifan Zhao <[email protected]>
---
 lib/remotes/s3.c | 100 +++++++++++++++++++++++++++++++++++++----------
 1 file changed, 80 insertions(+), 20 deletions(-)

diff --git a/lib/remotes/s3.c b/lib/remotes/s3.c
index 74cae8b..0f7e1a9 100644
--- a/lib/remotes/s3.c
+++ b/lib/remotes/s3.c
@@ -768,10 +768,10 @@ err_global:
 }
 
 #ifdef TEST
-struct s3erofs_prepare_utl_testcase {
+struct s3erofs_prepare_url_testcase {
        const char *name;
        const char *endpoint;
-       const char *bucket;
+       const char *path;
        const char *key;
        enum s3erofs_url_style url_style;
        const char *expected_url;
@@ -779,7 +779,7 @@ struct s3erofs_prepare_utl_testcase {
        int expected_ret;
 };
 
-static bool run_s3erofs_prepare_url_test(const struct 
s3erofs_prepare_utl_testcase *tc)
+static bool run_s3erofs_prepare_url_test(const struct 
s3erofs_prepare_url_testcase *tc)
 {
        struct s3erofs_curl_request req = { .method = "GET" };
        struct s3erofs_query_params params = { .num = 0 };
@@ -787,7 +787,7 @@ static bool run_s3erofs_prepare_url_test(const struct 
s3erofs_prepare_utl_testca
 
        printf("Running test: %s\n", tc->name);
 
-       ret = s3erofs_prepare_url(&req, tc->endpoint, tc->bucket, tc->key, 
&params,
+       ret = s3erofs_prepare_url(&req, tc->endpoint, tc->path, tc->key, 
&params,
                                  tc->url_style);
 
        if (ret != tc->expected_ret) {
@@ -823,11 +823,11 @@ static bool run_s3erofs_prepare_url_test(const struct 
s3erofs_prepare_utl_testca
 
 static bool test_s3erofs_prepare_url(void)
 {
-       struct s3erofs_prepare_utl_testcase tests[] = {
+       struct s3erofs_prepare_url_testcase tests[] = {
                {
                        .name = "Virtual-hosted style with https",
                        .endpoint = "s3.amazonaws.com",
-                       .bucket = "my-bucket",
+                       .path = "my-bucket",
                        .key = "path/to/object.txt",
                        .url_style = S3EROFS_URL_STYLE_VIRTUAL_HOST,
                        .expected_url =
@@ -838,7 +838,7 @@ static bool test_s3erofs_prepare_url(void)
                {
                        .name = "Path style with https",
                        .endpoint = "s3.amazonaws.com",
-                       .bucket = "my-bucket",
+                       .path = "my-bucket",
                        .key = "path/to/object.txt",
                        .url_style = S3EROFS_URL_STYLE_PATH,
                        .expected_url =
@@ -849,7 +849,7 @@ static bool test_s3erofs_prepare_url(void)
                {
                        .name = "Virtual-hosted with explicit https://";,
                        .endpoint = "https://s3.us-west-2.amazonaws.com";,
-                       .bucket = "test-bucket",
+                       .path = "test-bucket",
                        .key = "file.bin",
                        .url_style = S3EROFS_URL_STYLE_VIRTUAL_HOST,
                        .expected_url =
@@ -860,7 +860,7 @@ static bool test_s3erofs_prepare_url(void)
                {
                        .name = "Path style with explicit http://";,
                        .endpoint = "http://localhost:9000";,
-                       .bucket = "local-bucket",
+                       .path = "local-bucket",
                        .key = "data/file.dat",
                        .url_style = S3EROFS_URL_STYLE_PATH,
                        .expected_url =
@@ -871,7 +871,7 @@ static bool test_s3erofs_prepare_url(void)
                {
                        .name = "Virtual-hosted style with key ends with slash",
                        .endpoint = "http://localhost:9000";,
-                       .bucket = "local-bucket",
+                       .path = "local-bucket",
                        .key = "data/file.dat/",
                        .url_style = S3EROFS_URL_STYLE_VIRTUAL_HOST,
                        .expected_url =
@@ -882,7 +882,7 @@ static bool test_s3erofs_prepare_url(void)
                {
                        .name = "Path style with key ends with slash",
                        .endpoint = "http://localhost:9000";,
-                       .bucket = "local-bucket",
+                       .path = "local-bucket",
                        .key = "data/file.dat/",
                        .url_style = S3EROFS_URL_STYLE_PATH,
                        .expected_url =
@@ -893,7 +893,7 @@ static bool test_s3erofs_prepare_url(void)
                {
                        .name = "Virtual-hosted without key",
                        .endpoint = "s3.amazonaws.com",
-                       .bucket = "my-bucket",
+                       .path = "my-bucket",
                        .key = NULL,
                        .url_style = S3EROFS_URL_STYLE_VIRTUAL_HOST,
                        .expected_url = "https://my-bucket.s3.amazonaws.com/";,
@@ -903,17 +903,77 @@ static bool test_s3erofs_prepare_url(void)
                {
                        .name = "Path style without key",
                        .endpoint = "s3.amazonaws.com",
-                       .bucket = "my-bucket",
+                       .path = "my-bucket",
                        .key = NULL,
                        .url_style = S3EROFS_URL_STYLE_PATH,
                        .expected_url = "https://s3.amazonaws.com/my-bucket";,
                        .expected_canonical = "/my-bucket",
                        .expected_ret = 0,
                },
+               {
+                       .name = "Path style bucket ending with slash without 
key",
+                       .endpoint = "s3.amazonaws.com",
+                       .path = "bucket/",
+                       .key = NULL,
+                       .url_style = S3EROFS_URL_STYLE_PATH,
+                       .expected_url = "https://s3.amazonaws.com/bucket/";,
+                       .expected_canonical = "/bucket/",
+                       .expected_ret = 0,
+               },
+               {
+                       .name = "Virtual-hosted bucket ending with slash 
without key",
+                       .endpoint = "s3.amazonaws.com",
+                       .path = "bucket/",
+                       .key = NULL,
+                       .url_style = S3EROFS_URL_STYLE_VIRTUAL_HOST,
+                       .expected_url = "https://bucket.s3.amazonaws.com/";,
+                       .expected_canonical = "/bucket/",
+                       .expected_ret = 0,
+               },
+               {
+                       .name = "Path style bucket ending with slash",
+                       .endpoint = "s3.amazonaws.com",
+                       .path = "bucket/",
+                       .key = "object.txt",
+                       .url_style = S3EROFS_URL_STYLE_PATH,
+                       .expected_url = 
"https://s3.amazonaws.com/bucket/object.txt";,
+                       .expected_canonical = "/bucket/object.txt",
+                       .expected_ret = 0,
+               },
+               {
+                       .name = "Virtual-hosted bucket ending with slash",
+                       .endpoint = "s3.amazonaws.com",
+                       .path = "bucket/",
+                       .key = "object.txt",
+                       .url_style = S3EROFS_URL_STYLE_VIRTUAL_HOST,
+                       .expected_url = 
"https://bucket.s3.amazonaws.com/object.txt";,
+                       .expected_canonical = "/bucket/object.txt",
+                       .expected_ret = 0,
+               },
+               {
+                       .name = "Path style bucket ending with slash key with 
slash",
+                       .endpoint = "s3.amazonaws.com",
+                       .path = "bucket/",
+                       .key = "a/b/c/object.txt",
+                       .url_style = S3EROFS_URL_STYLE_PATH,
+                       .expected_url = 
"https://s3.amazonaws.com/bucket/a/b/c/object.txt";,
+                       .expected_canonical = "/bucket/a/b/c/object.txt",
+                       .expected_ret = 0,
+               },
+               {
+                       .name = "Virtual-hosted bucket ending with slash key 
with slash",
+                       .endpoint = "s3.amazonaws.com",
+                       .path = "bucket/",
+                       .key = "a/b/c/object.txt",
+                       .url_style = S3EROFS_URL_STYLE_VIRTUAL_HOST,
+                       .expected_url = 
"https://bucket.s3.amazonaws.com/a/b/c/object.txt";,
+                       .expected_canonical = "/bucket/a/b/c/object.txt",
+                       .expected_ret = 0,
+               },
                {
                        .name = "Error: NULL endpoint",
                        .endpoint = NULL,
-                       .bucket = "my-bucket",
+                       .path = "my-bucket",
                        .key = "file.txt",
                        .url_style = S3EROFS_URL_STYLE_PATH,
                        .expected_url = NULL,
@@ -923,7 +983,7 @@ static bool test_s3erofs_prepare_url(void)
                {
                        .name = "Error: NULL bucket",
                        .endpoint = "s3.amazonaws.com",
-                       .bucket = NULL,
+                       .path = NULL,
                        .key = "file.txt",
                        .url_style = S3EROFS_URL_STYLE_PATH,
                        .expected_url = NULL,
@@ -933,7 +993,7 @@ static bool test_s3erofs_prepare_url(void)
                {
                        .name = "Key with special characters",
                        .endpoint = "s3.amazonaws.com",
-                       .bucket = "bucket",
+                       .path = "bucket",
                        .key = "path/to/file-name_v2.0.txt",
                        .url_style = S3EROFS_URL_STYLE_VIRTUAL_HOST,
                        .expected_url =
@@ -942,16 +1002,16 @@ static bool test_s3erofs_prepare_url(void)
                        .expected_ret = 0,
                }
        };
-       bool succ = true;
        int i;
+       int pass = 0;
 
        for (i = 0; i < ARRAY_SIZE(tests); ++i) {
-               succ &= run_s3erofs_prepare_url_test(&tests[i]);
+               pass += run_s3erofs_prepare_url_test(&tests[i]);
                putc('\n', stdout);
        }
 
-       printf("Run all %d tests\n", i);
-       return succ;
+       printf("Run all %d tests with %d PASSED\n", i, pass);
+       return ARRAY_SIZE(tests) == pass;
 }
 
 int main(int argc, char *argv[])
-- 
2.33.0


Reply via email to