tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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 }