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 }