Coverage Report

Created: 2018-09-25 14:53

/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
}