TestUriTemplate.cpp (3390B)
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* This Source Code Form is subject to the terms of the Mozilla Public 3 * License, v. 2.0. If a copy of the MPL was not distributed with this 4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 5 6 #include "gtest/gtest.h" 7 #include "mozilla/RefPtr.h" 8 #include "mozilla/net/UriTemplate.h" 9 10 using namespace mozilla; 11 using namespace mozilla::net; 12 13 TEST(UriTemplate, Basic) 14 { 15 RefPtr<UriTemplateWrapper> builder; 16 nsCString pathTemplate( 17 "/.well-known/masque/udp/{target_host}/{target_port}/"); 18 UriTemplateWrapper::Init(pathTemplate, getter_AddRefs(builder)); 19 ASSERT_TRUE(builder); 20 nsresult rv = builder->Set("target_host"_ns, "example.com"_ns); 21 ASSERT_EQ(rv, NS_OK); 22 rv = builder->Set("target_port"_ns, 4433); 23 ASSERT_EQ(rv, NS_OK); 24 nsCString result; 25 builder->Build(&result); 26 ASSERT_TRUE(result.Equals("/.well-known/masque/udp/example.com/4433/"_ns)); 27 } 28 29 TEST(UriTemplate, EmptyValueIsAllowed) 30 { 31 RefPtr<UriTemplateWrapper> builder; 32 nsCString tmpl("/x/{v}/"); 33 UriTemplateWrapper::Init(tmpl, getter_AddRefs(builder)); 34 ASSERT_TRUE(builder); 35 36 ASSERT_EQ(builder->Set("v"_ns, ""_ns), NS_OK); 37 38 nsCString result; 39 builder->Build(&result); 40 ASSERT_EQ(result, "/x//"); 41 } 42 43 TEST(UriTemplate, BuildIsIdempotent) 44 { 45 RefPtr<UriTemplateWrapper> builder; 46 nsCString tmpl("/{x}/"); 47 UriTemplateWrapper::Init(tmpl, getter_AddRefs(builder)); 48 ASSERT_TRUE(builder); 49 50 ASSERT_EQ(builder->Set("x"_ns, "val"_ns), NS_OK); 51 52 nsCString first, second; 53 builder->Build(&first); 54 builder->Build(&second); 55 ASSERT_EQ(first, "/val/"); 56 ASSERT_EQ(second, "/val/"); // multiple builds should not mutate state 57 } 58 59 TEST(UriTemplate, NoVariablesTemplateIsReturnedAsIs) 60 { 61 RefPtr<UriTemplateWrapper> builder; 62 nsCString tmpl("/static/path/with/no/vars"); 63 UriTemplateWrapper::Init(tmpl, getter_AddRefs(builder)); 64 ASSERT_TRUE(builder); 65 66 nsCString result; 67 builder->Build(&result); 68 ASSERT_EQ(result, "/static/path/with/no/vars"); 69 } 70 71 TEST(UriTemplate, UnicodeIsUTF8PercentEncoded) 72 { 73 RefPtr<UriTemplateWrapper> builder; 74 nsCString tmpl("/city/{name}/"); 75 UriTemplateWrapper::Init(tmpl, getter_AddRefs(builder)); 76 ASSERT_TRUE(builder); 77 78 // "München" contains 'ü' (U+00FC) -> UTF-8 0xC3 0xBC -> %C3%BC 79 ASSERT_EQ(builder->Set("name"_ns, "München"_ns), NS_OK); 80 81 nsCString result; 82 builder->Build(&result); 83 ASSERT_EQ(result, "/city/M%C3%BCnchen/"); 84 } 85 86 TEST(UriTemplate, OverwriteVariable) 87 { 88 RefPtr<UriTemplateWrapper> builder; 89 nsCString tmpl("/h/{host}/"); 90 UriTemplateWrapper::Init(tmpl, getter_AddRefs(builder)); 91 ASSERT_TRUE(builder); 92 93 ASSERT_EQ(builder->Set("host"_ns, "old.example"_ns), NS_OK); 94 ASSERT_EQ(builder->Set("host"_ns, "new.example"_ns), NS_OK); 95 96 nsCString result; 97 builder->Build(&result); 98 ASSERT_EQ(result, "/h/new.example/"); 99 } 100 101 TEST(UriTemplate, SetOrderDoesNotMatter) 102 { 103 RefPtr<UriTemplateWrapper> builder; 104 nsCString tmpl("/.well-known/masque/udp/{target_host}/{target_port}/"); 105 UriTemplateWrapper::Init(tmpl, getter_AddRefs(builder)); 106 ASSERT_TRUE(builder); 107 108 // Set in reverse order 109 ASSERT_EQ(builder->Set("target_port"_ns, "4433"_ns), NS_OK); 110 ASSERT_EQ(builder->Set("target_host"_ns, "example.com"_ns), NS_OK); 111 112 nsCString result; 113 builder->Build(&result); 114 ASSERT_EQ(result, "/.well-known/masque/udp/example.com/4433/"); 115 }