tor-browser

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

TestURIMutator.cpp (5436B)


      1 #include "gtest/gtest.h"
      2 #include "nsCOMPtr.h"
      3 #include "nsNetCID.h"
      4 #include "nsIURIMutator.h"
      5 #include "nsIURL.h"
      6 #include "nsThreadPool.h"
      7 #include "nsNetUtil.h"
      8 
      9 TEST(TestURIMutator, Mutator)
     10 {
     11  nsAutoCString out;
     12 
     13  // This test instantiates a new nsStandardURL::Mutator (via contractID)
     14  // and uses it to create a new URI.
     15  nsCOMPtr<nsIURI> uri;
     16  nsresult rv = NS_MutateURI(NS_STANDARDURLMUTATOR_CONTRACTID)
     17                    .SetSpec("http://example.com"_ns)
     18                    .Finalize(uri);
     19  ASSERT_EQ(rv, NS_OK);
     20  ASSERT_EQ(uri->GetSpec(out), NS_OK);
     21  ASSERT_TRUE(out == "http://example.com/"_ns);
     22 
     23  // This test verifies that we can use NS_MutateURI to change a URI
     24  rv = NS_MutateURI(uri)
     25           .SetScheme("ftp"_ns)
     26           .SetHost("mozilla.org"_ns)
     27           .SetPathQueryRef("/path?query#ref"_ns)
     28           .Finalize(uri);
     29  ASSERT_EQ(rv, NS_OK);
     30  ASSERT_EQ(uri->GetSpec(out), NS_OK);
     31  ASSERT_TRUE(out == "ftp://mozilla.org/path?query#ref"_ns);
     32 
     33  // This test verifies that we can pass nsIURL to Finalize, and
     34  nsCOMPtr<nsIURL> url;
     35  rv = NS_MutateURI(uri).SetScheme("https"_ns).Finalize(url);
     36  ASSERT_EQ(rv, NS_OK);
     37  ASSERT_EQ(url->GetSpec(out), NS_OK);
     38  ASSERT_TRUE(out == "https://mozilla.org/path?query#ref"_ns);
     39 
     40  // This test verifies that we can pass nsIURL** to Finalize.
     41  // We need to use the explicit template because it's actually passing
     42  // getter_AddRefs
     43  nsCOMPtr<nsIURL> url2;
     44  rv = NS_MutateURI(url)
     45           .SetRef("newref"_ns)
     46           .Finalize<nsIURL>(getter_AddRefs(url2));
     47  ASSERT_EQ(rv, NS_OK);
     48  ASSERT_EQ(url2->GetSpec(out), NS_OK);
     49  ASSERT_TRUE(out == "https://mozilla.org/path?query#newref"_ns);
     50 
     51  // This test verifies that we can pass nsIURI** to Finalize.
     52  // No need to be explicit.
     53  auto functionSetRef = [](nsIURI* aURI, nsIURI** aResult) -> nsresult {
     54    return NS_MutateURI(aURI).SetRef("originalRef"_ns).Finalize(aResult);
     55  };
     56 
     57  nsCOMPtr<nsIURI> newURI;
     58  rv = functionSetRef(url2, getter_AddRefs(newURI));
     59  ASSERT_EQ(rv, NS_OK);
     60  ASSERT_EQ(newURI->GetSpec(out), NS_OK);
     61  ASSERT_TRUE(out == "https://mozilla.org/path?query#originalRef"_ns);
     62 
     63  // This test verifies that we can pass nsIURI** to Finalize.
     64  nsCOMPtr<nsIURI> uri2;
     65  rv =
     66      NS_MutateURI(url2).SetQuery("newquery"_ns).Finalize(getter_AddRefs(uri2));
     67  ASSERT_EQ(rv, NS_OK);
     68  ASSERT_EQ(uri2->GetSpec(out), NS_OK);
     69  ASSERT_TRUE(out == "https://mozilla.org/path?newquery#newref"_ns);
     70 
     71  // This test verifies that we can pass nsIURI** to Finalize.
     72  // No need to be explicit.
     73  auto functionSetQuery = [](nsIURI* aURI, nsIURL** aResult) -> nsresult {
     74    return NS_MutateURI(aURI).SetQuery("originalQuery"_ns).Finalize(aResult);
     75  };
     76 
     77  nsCOMPtr<nsIURL> newURL;
     78  rv = functionSetQuery(uri2, getter_AddRefs(newURL));
     79  ASSERT_EQ(rv, NS_OK);
     80  ASSERT_EQ(newURL->GetSpec(out), NS_OK);
     81  ASSERT_TRUE(out == "https://mozilla.org/path?originalQuery#newref"_ns);
     82 
     83  // Check that calling Finalize twice will fail.
     84  NS_MutateURI mutator(newURL);
     85  rv = mutator.SetQuery(""_ns).Finalize(uri2);
     86  ASSERT_EQ(rv, NS_OK);
     87  ASSERT_EQ(uri2->GetSpec(out), NS_OK);
     88  ASSERT_TRUE(out == "https://mozilla.org/path#newref"_ns);
     89  nsCOMPtr<nsIURI> uri3;
     90  rv = mutator.Finalize(uri3);
     91  ASSERT_EQ(rv, NS_ERROR_NOT_AVAILABLE);
     92  ASSERT_TRUE(uri3 == nullptr);
     93 
     94  // Make sure changing scheme updates the default port
     95  rv = NS_NewURI(getter_AddRefs(uri),
     96                 "https://example.org:80/path?query#ref"_ns);
     97  ASSERT_EQ(rv, NS_OK);
     98  rv = NS_MutateURI(uri).SetScheme("http"_ns).Finalize(uri);
     99  ASSERT_EQ(rv, NS_OK);
    100  rv = uri->GetSpec(out);
    101  ASSERT_EQ(rv, NS_OK);
    102  ASSERT_EQ(out, "http://example.org/path?query#ref"_ns);
    103  int32_t port;
    104  rv = uri->GetPort(&port);
    105  ASSERT_EQ(rv, NS_OK);
    106  ASSERT_EQ(port, -1);
    107  rv = uri->GetFilePath(out);
    108  ASSERT_EQ(rv, NS_OK);
    109  ASSERT_EQ(out, "/path"_ns);
    110  rv = uri->GetQuery(out);
    111  ASSERT_EQ(rv, NS_OK);
    112  ASSERT_EQ(out, "query"_ns);
    113  rv = uri->GetRef(out);
    114  ASSERT_EQ(rv, NS_OK);
    115  ASSERT_EQ(out, "ref"_ns);
    116 
    117  // Make sure changing scheme does not change non-default port
    118  rv = NS_NewURI(getter_AddRefs(uri), "https://example.org:123"_ns);
    119  ASSERT_EQ(rv, NS_OK);
    120  rv = NS_MutateURI(uri).SetScheme("http"_ns).Finalize(uri);
    121  ASSERT_EQ(rv, NS_OK);
    122  rv = uri->GetSpec(out);
    123  ASSERT_EQ(rv, NS_OK);
    124  ASSERT_EQ(out, "http://example.org:123/"_ns);
    125  rv = uri->GetPort(&port);
    126  ASSERT_EQ(rv, NS_OK);
    127  ASSERT_EQ(port, 123);
    128 }
    129 
    130 extern MOZ_THREAD_LOCAL(uint32_t) gTlsURLRecursionCount;
    131 
    132 TEST(TestURIMutator, OnAnyThread)
    133 {
    134  nsCOMPtr<nsIThreadPool> pool = new nsThreadPool();
    135  pool->SetThreadLimit(60);
    136 
    137  pool = new nsThreadPool();
    138  for (int i = 0; i < 1000; ++i) {
    139    nsCOMPtr<nsIRunnable> task =
    140        NS_NewRunnableFunction("gtest-OnAnyThread", []() {
    141          nsCOMPtr<nsIURI> uri;
    142          nsresult rv = NS_NewURI(getter_AddRefs(uri), "http://example.com"_ns);
    143          ASSERT_EQ(rv, NS_OK);
    144          nsAutoCString out;
    145          ASSERT_EQ(uri->GetSpec(out), NS_OK);
    146          ASSERT_TRUE(out == "http://example.com/"_ns);
    147        });
    148    EXPECT_TRUE(task);
    149 
    150    pool->Dispatch(task, NS_DISPATCH_NORMAL);
    151  }
    152 
    153  nsCOMPtr<nsIURI> uri;
    154  nsresult rv = NS_NewURI(getter_AddRefs(uri), "http://example.com"_ns);
    155  ASSERT_EQ(rv, NS_OK);
    156  nsAutoCString out;
    157  ASSERT_EQ(uri->GetSpec(out), NS_OK);
    158  ASSERT_TRUE(out == "http://example.com/"_ns);
    159 
    160  pool->Shutdown();
    161 
    162  ASSERT_EQ(gTlsURLRecursionCount.get(), 0u);
    163 }