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