| #include "clar_libgit2.h" |
| #include "netops.h" |
| |
| static char *host, *port, *path, *user, *pass; |
| static gitno_connection_data conndata; |
| |
| void test_network_urlparse__initialize(void) |
| { |
| host = port = path = user = pass = NULL; |
| memset(&conndata, 0, sizeof(conndata)); |
| } |
| |
| void test_network_urlparse__cleanup(void) |
| { |
| #define FREE_AND_NULL(x) if (x) { git__free(x); x = NULL; } |
| FREE_AND_NULL(host); |
| FREE_AND_NULL(port); |
| FREE_AND_NULL(path); |
| FREE_AND_NULL(user); |
| FREE_AND_NULL(pass); |
| |
| gitno_connection_data_free_ptrs(&conndata); |
| } |
| |
| void test_network_urlparse__trivial(void) |
| { |
| cl_git_pass(gitno_extract_url_parts(&host, &port, &path, &user, &pass, |
| "http://example.com/resource", "8080")); |
| cl_assert_equal_s(host, "example.com"); |
| cl_assert_equal_s(port, "8080"); |
| cl_assert_equal_s(path, "/resource"); |
| cl_assert_equal_p(user, NULL); |
| cl_assert_equal_p(pass, NULL); |
| } |
| |
| void test_network_urlparse__root(void) |
| { |
| cl_git_pass(gitno_extract_url_parts(&host, &port, &path, &user, &pass, |
| "http://example.com/", "8080")); |
| cl_assert_equal_s(host, "example.com"); |
| cl_assert_equal_s(port, "8080"); |
| cl_assert_equal_s(path, "/"); |
| cl_assert_equal_p(user, NULL); |
| cl_assert_equal_p(pass, NULL); |
| } |
| |
| void test_network_urlparse__just_hostname(void) |
| { |
| cl_git_fail_with(GIT_EINVALIDSPEC, |
| gitno_extract_url_parts(&host, &port, &path, &user, &pass, |
| "http://example.com", "8080")); |
| } |
| |
| void test_network_urlparse__encoded_password(void) |
| { |
| cl_git_pass(gitno_extract_url_parts(&host, &port, &path, &user, &pass, |
| "https://user:pass%2fis%40bad@hostname.com:1234/", "1")); |
| cl_assert_equal_s(host, "hostname.com"); |
| cl_assert_equal_s(port, "1234"); |
| cl_assert_equal_s(path, "/"); |
| cl_assert_equal_s(user, "user"); |
| cl_assert_equal_s(pass, "pass/is@bad"); |
| } |
| |
| void test_network_urlparse__user(void) |
| { |
| cl_git_pass(gitno_extract_url_parts(&host, &port, &path, &user, &pass, |
| "https://user@example.com/resource", "8080")); |
| cl_assert_equal_s(host, "example.com"); |
| cl_assert_equal_s(port, "8080"); |
| cl_assert_equal_s(path, "/resource"); |
| cl_assert_equal_s(user, "user"); |
| cl_assert_equal_p(pass, NULL); |
| } |
| |
| void test_network_urlparse__user_pass(void) |
| { |
| /* user:pass@hostname.tld/resource */ |
| cl_git_pass(gitno_extract_url_parts(&host, &port, &path, &user, &pass, |
| "https://user:pass@example.com/resource", "8080")); |
| cl_assert_equal_s(host, "example.com"); |
| cl_assert_equal_s(port, "8080"); |
| cl_assert_equal_s(path, "/resource"); |
| cl_assert_equal_s(user, "user"); |
| cl_assert_equal_s(pass, "pass"); |
| } |
| |
| void test_network_urlparse__port(void) |
| { |
| /* hostname.tld:port/resource */ |
| cl_git_pass(gitno_extract_url_parts(&host, &port, &path, &user, &pass, |
| "https://example.com:9191/resource", "8080")); |
| cl_assert_equal_s(host, "example.com"); |
| cl_assert_equal_s(port, "9191"); |
| cl_assert_equal_s(path, "/resource"); |
| cl_assert_equal_p(user, NULL); |
| cl_assert_equal_p(pass, NULL); |
| } |
| |
| void test_network_urlparse__user_port(void) |
| { |
| /* user@hostname.tld:port/resource */ |
| cl_git_pass(gitno_extract_url_parts(&host, &port, &path, &user, &pass, |
| "https://user@example.com:9191/resource", "8080")); |
| cl_assert_equal_s(host, "example.com"); |
| cl_assert_equal_s(port, "9191"); |
| cl_assert_equal_s(path, "/resource"); |
| cl_assert_equal_s(user, "user"); |
| cl_assert_equal_p(pass, NULL); |
| } |
| |
| void test_network_urlparse__user_pass_port(void) |
| { |
| /* user:pass@hostname.tld:port/resource */ |
| cl_git_pass(gitno_extract_url_parts(&host, &port, &path, &user, &pass, |
| "https://user:pass@example.com:9191/resource", "8080")); |
| cl_assert_equal_s(host, "example.com"); |
| cl_assert_equal_s(port, "9191"); |
| cl_assert_equal_s(path, "/resource"); |
| cl_assert_equal_s(user, "user"); |
| cl_assert_equal_s(pass, "pass"); |
| } |
| |
| void test_network_urlparse__optional_path(void) |
| { |
| cl_git_fail(gitno_extract_url_parts(&host, &port, &path, &user, &pass, |
| "https://user:pass@example.com:9191", "8080")); |
| |
| cl_git_pass(gitno_extract_url_parts(&host, &port, NULL, &user, &pass, |
| "https://user:pass@example.com:9191", "8080")); |
| } |
| |
| void test_network_urlparse__connection_data_http(void) |
| { |
| cl_git_pass(gitno_connection_data_from_url(&conndata, |
| "http://example.com/foo/bar/baz", "bar/baz")); |
| cl_assert_equal_s(conndata.host, "example.com"); |
| cl_assert_equal_s(conndata.port, "80"); |
| cl_assert_equal_s(conndata.path, "/foo/"); |
| cl_assert_equal_p(conndata.user, NULL); |
| cl_assert_equal_p(conndata.pass, NULL); |
| cl_assert_equal_i(conndata.use_ssl, false); |
| } |
| |
| void test_network_urlparse__connection_data_ssl(void) |
| { |
| cl_git_pass(gitno_connection_data_from_url(&conndata, |
| "https://example.com/foo/bar/baz", "bar/baz")); |
| cl_assert_equal_s(conndata.host, "example.com"); |
| cl_assert_equal_s(conndata.port, "443"); |
| cl_assert_equal_s(conndata.path, "/foo/"); |
| cl_assert_equal_p(conndata.user, NULL); |
| cl_assert_equal_p(conndata.pass, NULL); |
| cl_assert_equal_i(conndata.use_ssl, true); |
| } |
| |
| void test_network_urlparse__encoded_username_password(void) |
| { |
| cl_git_pass(gitno_connection_data_from_url(&conndata, |
| "https://user%2fname:pass%40word%zyx%v@example.com/foo/bar/baz", "bar/baz")); |
| cl_assert_equal_s(conndata.host, "example.com"); |
| cl_assert_equal_s(conndata.port, "443"); |
| cl_assert_equal_s(conndata.path, "/foo/"); |
| cl_assert_equal_s(conndata.user, "user/name"); |
| cl_assert_equal_s(conndata.pass, "pass@word%zyx%v"); |
| cl_assert_equal_i(conndata.use_ssl, true); |
| } |
| |
| void test_network_urlparse__connection_data_cross_host_redirect(void) |
| { |
| conndata.host = git__strdup("bar.com"); |
| cl_git_fail_with(gitno_connection_data_from_url(&conndata, |
| "https://foo.com/bar/baz", NULL), |
| -1); |
| } |
| |
| void test_network_urlparse__connection_data_http_downgrade(void) |
| { |
| conndata.use_ssl = true; |
| cl_git_fail_with(gitno_connection_data_from_url(&conndata, |
| "http://foo.com/bar/baz", NULL), |
| -1); |
| } |
| |
| void test_network_urlparse__connection_data_relative_redirect(void) |
| { |
| cl_git_pass(gitno_connection_data_from_url(&conndata, |
| "http://foo.com/bar/baz/biff", NULL)); |
| cl_git_pass(gitno_connection_data_from_url(&conndata, |
| "/zap/baz/biff?bam", NULL)); |
| cl_assert_equal_s(conndata.host, "foo.com"); |
| cl_assert_equal_s(conndata.port, "80"); |
| cl_assert_equal_s(conndata.path, "/zap/baz/biff?bam"); |
| cl_assert_equal_p(conndata.user, NULL); |
| cl_assert_equal_p(conndata.pass, NULL); |
| cl_assert_equal_i(conndata.use_ssl, false); |
| } |
| |
| void test_network_urlparse__connection_data_relative_redirect_ssl(void) |
| { |
| cl_git_pass(gitno_connection_data_from_url(&conndata, |
| "https://foo.com/bar/baz/biff", NULL)); |
| cl_git_pass(gitno_connection_data_from_url(&conndata, |
| "/zap/baz/biff?bam", NULL)); |
| cl_assert_equal_s(conndata.host, "foo.com"); |
| cl_assert_equal_s(conndata.port, "443"); |
| cl_assert_equal_s(conndata.path, "/zap/baz/biff?bam"); |
| cl_assert_equal_p(conndata.user, NULL); |
| cl_assert_equal_p(conndata.pass, NULL); |
| cl_assert_equal_i(conndata.use_ssl, true); |
| } |
| |
| /* Run this under valgrind */ |
| void test_network_urlparse__connection_data_cleanup(void) |
| { |
| cl_git_pass(gitno_connection_data_from_url(&conndata, |
| "http://foo.com/bar/baz/biff", "baz/biff")); |
| cl_git_pass(gitno_connection_data_from_url(&conndata, |
| "https://foo.com/bar/baz/biff", "baz/biff")); |
| } |