tor-browser

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

TestServerTimingHeader.cpp (10250B)


      1 #include "gtest/gtest.h"
      2 
      3 #include "mozilla/net/nsServerTiming.h"
      4 #include <string>
      5 #include <vector>
      6 
      7 using namespace mozilla;
      8 using namespace mozilla::net;
      9 
     10 void testServerTimingHeader(
     11    const char* headerValue,
     12    std::vector<std::vector<std::string>> expectedResults) {
     13  nsAutoCString header(headerValue);
     14  ServerTimingParser parser(header);
     15  parser.Parse();
     16 
     17  nsTArray<nsCOMPtr<nsIServerTiming>> results =
     18      parser.TakeServerTimingHeaders();
     19 
     20  ASSERT_EQ(results.Length(), expectedResults.size());
     21 
     22  unsigned i = 0;
     23  for (const auto& header : results) {
     24    std::vector<std::string> expectedResult(expectedResults[i++]);
     25    nsCString name;
     26    (void)header->GetName(name);
     27    ASSERT_TRUE(name.Equals(expectedResult[0].c_str()));
     28 
     29    double duration;
     30    (void)header->GetDuration(&duration);
     31    ASSERT_EQ(duration, atof(expectedResult[1].c_str()));
     32 
     33    nsCString description;
     34    (void)header->GetDescription(description);
     35    ASSERT_TRUE(description.Equals(expectedResult[2].c_str()));
     36  }
     37 }
     38 
     39 TEST(TestServerTimingHeader, HeaderParsing)
     40 {
     41  // Test cases below are copied from
     42  // https://cs.chromium.org/chromium/src/third_party/WebKit/Source/platform/network/HTTPParsersTest.cpp
     43 
     44  testServerTimingHeader("", {});
     45  testServerTimingHeader("metric", {{"metric", "0", ""}});
     46  testServerTimingHeader("metric;dur", {{"metric", "0", ""}});
     47  testServerTimingHeader("metric;dur=123.4", {{"metric", "123.4", ""}});
     48  testServerTimingHeader("metric;dur=\"123.4\"", {{"metric", "123.4", ""}});
     49 
     50  testServerTimingHeader("metric;desc", {{"metric", "0", ""}});
     51  testServerTimingHeader("metric;desc=description",
     52                         {{"metric", "0", "description"}});
     53  testServerTimingHeader("metric;desc=\"description\"",
     54                         {{"metric", "0", "description"}});
     55 
     56  testServerTimingHeader("metric;dur;desc", {{"metric", "0", ""}});
     57  testServerTimingHeader("metric;dur=123.4;desc", {{"metric", "123.4", ""}});
     58  testServerTimingHeader("metric;dur;desc=description",
     59                         {{"metric", "0", "description"}});
     60  testServerTimingHeader("metric;dur=123.4;desc=description",
     61                         {{"metric", "123.4", "description"}});
     62  testServerTimingHeader("metric;desc;dur", {{"metric", "0", ""}});
     63  testServerTimingHeader("metric;desc;dur=123.4", {{"metric", "123.4", ""}});
     64  testServerTimingHeader("metric;desc=description;dur",
     65                         {{"metric", "0", "description"}});
     66  testServerTimingHeader("metric;desc=description;dur=123.4",
     67                         {{"metric", "123.4", "description"}});
     68 
     69  // special chars in name
     70  testServerTimingHeader("aB3!#$%&'*+-.^_`|~",
     71                         {{"aB3!#$%&'*+-.^_`|~", "0", ""}});
     72 
     73  // delimiter chars in quoted description
     74  testServerTimingHeader("metric;desc=\"descr;,=iption\";dur=123.4",
     75                         {{"metric", "123.4", "descr;,=iption"}});
     76 
     77  // whitespace
     78  testServerTimingHeader("metric ; ", {{"metric", "0", ""}});
     79  testServerTimingHeader("metric , ", {{"metric", "0", ""}});
     80  testServerTimingHeader("metric ; dur = 123.4 ; desc = description",
     81                         {{"metric", "123.4", "description"}});
     82  testServerTimingHeader("metric ; desc = description ; dur = 123.4",
     83                         {{"metric", "123.4", "description"}});
     84 
     85  // multiple entries
     86  testServerTimingHeader(
     87      "metric1;dur=12.3;desc=description1,metric2;dur=45.6;"
     88      "desc=description2,metric3;dur=78.9;desc=description3",
     89      {{"metric1", "12.3", "description1"},
     90       {"metric2", "45.6", "description2"},
     91       {"metric3", "78.9", "description3"}});
     92  testServerTimingHeader("metric1,metric2 ,metric3, metric4 , metric5",
     93                         {{"metric1", "0", ""},
     94                          {"metric2", "0", ""},
     95                          {"metric3", "0", ""},
     96                          {"metric4", "0", ""},
     97                          {"metric5", "0", ""}});
     98 
     99  // quoted-strings
    100  // metric;desc=\ --> ''
    101  testServerTimingHeader("metric;desc=\\", {{"metric", "0", ""}});
    102  // metric;desc=" --> ''
    103  testServerTimingHeader("metric;desc=\"", {{"metric", "0", ""}});
    104  // metric;desc=\\ --> ''
    105  testServerTimingHeader("metric;desc=\\\\", {{"metric", "0", ""}});
    106  // metric;desc=\" --> ''
    107  testServerTimingHeader("metric;desc=\\\"", {{"metric", "0", ""}});
    108  // metric;desc="\ --> ''
    109  testServerTimingHeader("metric;desc=\"\\", {{"metric", "0", ""}});
    110  // metric;desc="" --> ''
    111  testServerTimingHeader("metric;desc=\"\"", {{"metric", "0", ""}});
    112  // metric;desc=\\\ --> ''
    113  testServerTimingHeader(R"(metric;desc=\\\)", {{"metric", "0", ""}});
    114  // metric;desc=\\" --> ''
    115  testServerTimingHeader(R"(metric;desc=\\")", {{"metric", "0", ""}});
    116  // metric;desc=\"\ --> ''
    117  testServerTimingHeader(R"(metric;desc=\"\)", {{"metric", "0", ""}});
    118  // metric;desc=\"" --> ''
    119  testServerTimingHeader(R"(metric;desc=\"")", {{"metric", "0", ""}});
    120  // metric;desc="\\ --> ''
    121  testServerTimingHeader(R"(metric;desc="\\)", {{"metric", "0", ""}});
    122  // metric;desc="\" --> ''
    123  testServerTimingHeader(R"(metric;desc="\")", {{"metric", "0", ""}});
    124  // metric;desc=""\ --> ''
    125  testServerTimingHeader(R"(metric;desc=""\)", {{"metric", "0", ""}});
    126  // metric;desc=""" --> ''
    127  testServerTimingHeader(R"(metric;desc=""")", {{"metric", "0", ""}});
    128  // metric;desc=\\\\ --> ''
    129  testServerTimingHeader(R"(metric;desc=\\\\)", {{"metric", "0", ""}});
    130  // metric;desc=\\\" --> ''
    131  testServerTimingHeader(R"(metric;desc=\\\")", {{"metric", "0", ""}});
    132  // metric;desc=\\"\ --> ''
    133  testServerTimingHeader(R"(metric;desc=\\"\)", {{"metric", "0", ""}});
    134  // metric;desc=\\"" --> ''
    135  testServerTimingHeader(R"(metric;desc=\\"")", {{"metric", "0", ""}});
    136  // metric;desc=\"\\ --> ''
    137  testServerTimingHeader(R"(metric;desc=\"\\)", {{"metric", "0", ""}});
    138  // metric;desc=\"\" --> ''
    139  testServerTimingHeader(R"(metric;desc=\"\")", {{"metric", "0", ""}});
    140  // metric;desc=\""\ --> ''
    141  testServerTimingHeader(R"(metric;desc=\""\)", {{"metric", "0", ""}});
    142  // metric;desc=\""" --> ''
    143  testServerTimingHeader(R"(metric;desc=\""")", {{"metric", "0", ""}});
    144  // metric;desc="\\\ --> ''
    145  testServerTimingHeader(R"(metric;desc="\\\)", {{"metric", "0", ""}});
    146  // metric;desc="\\" --> '\'
    147  testServerTimingHeader(R"(metric;desc="\\")", {{"metric", "0", "\\"}});
    148  // metric;desc="\"\ --> ''
    149  testServerTimingHeader(R"(metric;desc="\"\)", {{"metric", "0", ""}});
    150  // metric;desc="\"" --> '"'
    151  testServerTimingHeader(R"(metric;desc="\"")", {{"metric", "0", "\""}});
    152  // metric;desc=""\\ --> ''
    153  testServerTimingHeader(R"(metric;desc=""\\)", {{"metric", "0", ""}});
    154  // metric;desc=""\" --> ''
    155  testServerTimingHeader(R"(metric;desc=""\")", {{"metric", "0", ""}});
    156  // metric;desc="""\ --> ''
    157  testServerTimingHeader(R"(metric;desc="""\)", {{"metric", "0", ""}});
    158  // metric;desc="""" --> ''
    159  testServerTimingHeader(R"(metric;desc="""")", {{"metric", "0", ""}});
    160 
    161  // duplicate entry names
    162  testServerTimingHeader(
    163      "metric;dur=12.3;desc=description1,metric;dur=45.6;"
    164      "desc=description2",
    165      {{"metric", "12.3", "description1"}, {"metric", "45.6", "description2"}});
    166 
    167  // non-numeric durations
    168  testServerTimingHeader("metric;dur=foo", {{"metric", "0", ""}});
    169  testServerTimingHeader("metric;dur=\"foo\"", {{"metric", "0", ""}});
    170 
    171  // unrecognized param names
    172  testServerTimingHeader(
    173      "metric;foo=bar;desc=description;foo=bar;dur=123.4;foo=bar",
    174      {{"metric", "123.4", "description"}});
    175 
    176  // duplicate param names
    177  testServerTimingHeader("metric;dur=123.4;dur=567.8",
    178                         {{"metric", "123.4", ""}});
    179  testServerTimingHeader("metric;desc=description1;desc=description2",
    180                         {{"metric", "0", "description1"}});
    181  testServerTimingHeader("metric;dur=foo;dur=567.8", {{"metric", "", ""}});
    182 
    183  // unspecified param values
    184  testServerTimingHeader("metric;dur;dur=123.4", {{"metric", "0", ""}});
    185  testServerTimingHeader("metric;desc;desc=description", {{"metric", "0", ""}});
    186 
    187  // param name case
    188  testServerTimingHeader("metric;DuR=123.4;DeSc=description",
    189                         {{"metric", "123.4", "description"}});
    190 
    191  // nonsense
    192  testServerTimingHeader("metric=foo;dur;dur=123.4,metric2",
    193                         {{"metric", "0", ""}, {"metric2", "0", ""}});
    194  testServerTimingHeader("metric\"foo;dur;dur=123.4,metric2",
    195                         {{"metric", "0", ""}});
    196 
    197  // nonsense - return zero entries
    198  testServerTimingHeader(" ", {});
    199  testServerTimingHeader("=", {});
    200  testServerTimingHeader("[", {});
    201  testServerTimingHeader("]", {});
    202  testServerTimingHeader(";", {});
    203  testServerTimingHeader(",", {});
    204  testServerTimingHeader("=;", {});
    205  testServerTimingHeader(";=", {});
    206  testServerTimingHeader("=,", {});
    207  testServerTimingHeader(",=", {});
    208  testServerTimingHeader(";,", {});
    209  testServerTimingHeader(",;", {});
    210  testServerTimingHeader("=;,", {});
    211 
    212  // Invalid token
    213  testServerTimingHeader("met=ric", {{"met", "0", ""}});
    214  testServerTimingHeader("met ric", {{"met", "0", ""}});
    215  testServerTimingHeader("met[ric", {{"met", "0", ""}});
    216  testServerTimingHeader("met]ric", {{"met", "0", ""}});
    217  testServerTimingHeader("metric;desc=desc=123, metric2",
    218                         {{"metric", "0", "desc"}, {"metric2", "0", ""}});
    219  testServerTimingHeader("met ric;desc=de sc  , metric2",
    220                         {{"met", "0", "de"}, {"metric2", "0", ""}});
    221 
    222  // test cases from https://w3c.github.io/server-timing/#examples
    223  testServerTimingHeader(
    224      " miss, ,db;dur=53, app;dur=47.2 ",
    225      {{"miss", "0", ""}, {"db", "53", ""}, {"app", "47.2", ""}});
    226  testServerTimingHeader(" customView, dc;desc=atl ",
    227                         {{"customView", "0", ""}, {"dc", "0", "atl"}});
    228  testServerTimingHeader(" total;dur=123.4 ", {{"total", "123.4", ""}});
    229 
    230  // test cases for comma in quoted string
    231  testServerTimingHeader(R"(     metric ; desc="descr\"\";,=iption";dur=123.4)",
    232                         {{"metric", "123.4", "descr\"\";,=iption"}});
    233  testServerTimingHeader(
    234      " metric2;dur=\"123.4\";;desc=\",;\\\",;,\";;,  metric  ;  desc = \" "
    235      "\\\", ;\\\" \"; dur=123.4,",
    236      {{"metric2", "123.4", ",;\",;,"}, {"metric", "123.4", " \", ;\" "}});
    237 }