| <!doctype html> |
| <html> |
| <head> |
| <meta charset="utf-8"> |
| <script src="../../http/tests/inspector/resources/inspector-test.js"></script> |
| <script> |
| function test() |
| { |
| let suite = InspectorTest.createSyncSuite("ServerTimingEntry"); |
| |
| suite.addTestCase({ |
| name: "ServerTimingEntry.parseHeaders", |
| description: "Parsing of Server-Timing headers.", |
| test() { |
| function testServerTimingHeader(header, expectedResults) { |
| var results = WI.ServerTimingEntry.parseHeaders(header); |
| |
| InspectorTest.log(`Testing response header: -->${header}<--`); |
| InspectorTest.expectEqual(results.length, expectedResults.length, |
| `Parsed ServerTimingEntry count has expected results count of ${expectedResults.length}.`); |
| |
| results.forEach((serverTimingEntry, index) => { |
| var expectedResult = expectedResults[index]; |
| if (expectedResult === undefined) { |
| // Guard against `results.length > expectedResults.length`. |
| return; |
| } |
| |
| InspectorTest.expectEqual(serverTimingEntry.name, expectedResult.name, `name is ${JSON.stringify(expectedResult.name)}`); |
| InspectorTest.expectEqual(serverTimingEntry.duration, expectedResult.dur, `duration is ${JSON.stringify(expectedResult.dur)}`); |
| InspectorTest.expectEqual(serverTimingEntry.description, expectedResult.desc, `description is ${JSON.stringify(expectedResult.desc)}`); |
| }); |
| |
| InspectorTest.log(""); |
| } |
| |
| // Tests from https://github.com/cvazac/generate-server-timing-tests. |
| // empty string |
| testServerTimingHeader(``, []); |
| |
| // name only |
| testServerTimingHeader(`metric`, [{"name":"metric"}]); |
| |
| // name and duration |
| testServerTimingHeader(`metric;dur=123.4`, [{"name":"metric","dur":123.4}]); |
| testServerTimingHeader(`metric;dur=\"123.4\"`, [{"name":"metric","dur":123.4}]); |
| |
| // name and description |
| testServerTimingHeader(`metric;desc=description`, [{"name":"metric","desc":"description"}]); |
| testServerTimingHeader(`metric;desc=\"description\"`, [{"name":"metric","desc":"description"}]); |
| |
| // name, duration, and description |
| testServerTimingHeader(`metric;dur=123.4;desc=description`, [{"name":"metric","dur":123.4,"desc":"description"}]); |
| testServerTimingHeader(`metric;desc=description;dur=123.4`, [{"name":"metric","desc":"description","dur":123.4}]); |
| |
| // special chars in name |
| testServerTimingHeader(`aB3!#$%&'*+-.^_\`|~`, [{"name":"aB3!#$%&'*+-.^_`|~"}]); |
| |
| // delimiter chars in quoted description |
| testServerTimingHeader(`metric;desc=\"descr;,=iption\";dur=123.4`, [{"name":"metric","desc":"descr;,=iption","dur":123.4}]); |
| |
| // spaces |
| testServerTimingHeader(`metric ; `, [{"name":"metric"}]); |
| testServerTimingHeader(`metric , `, [{"name":"metric"}]); |
| testServerTimingHeader(`metric ; dur = 123.4 ; desc = description`, [{"name":"metric","dur":123.4,"desc":"description"}]); |
| testServerTimingHeader(`metric ; desc = description ; dur = 123.4`, [{"name":"metric","desc":"description","dur":123.4}]); |
| testServerTimingHeader(`metric;desc = \"description\"`, [{"name":"metric","desc":"description"}]); |
| |
| // tabs |
| testServerTimingHeader(`metric\t;\t`, [{"name":"metric"}]); |
| testServerTimingHeader(`metric\t,\t`, [{"name":"metric"}]); |
| testServerTimingHeader(`metric\t;\tdur\t=\t123.4\t;\tdesc\t=\tdescription`, [{"name":"metric","dur":123.4,"desc":"description"}]); |
| testServerTimingHeader(`metric\t;\tdesc\t=\tdescription\t;\tdur\t=\t123.4`, [{"name":"metric","desc":"description","dur":123.4}]); |
| testServerTimingHeader(`metric;desc\t=\t\"description\"`, [{"name":"metric","desc":"description"}]); |
| |
| // multiple entries |
| testServerTimingHeader(`metric1;dur=12.3;desc=description1,metric2;dur=45.6;desc=description2,metric3;dur=78.9;desc=description3`, [{"name":"metric1","dur":12.3,"desc":"description1"},{"name":"metric2","dur":45.6,"desc":"description2"},{"name":"metric3","dur":78.9,"desc":"description3"}]); |
| testServerTimingHeader(`metric1,metric2 ,metric3, metric4 , metric5`, [{"name":"metric1"},{"name":"metric2"},{"name":"metric3"},{"name":"metric4"},{"name":"metric5"}]); |
| |
| // quoted-strings - happy path |
| testServerTimingHeader(`metric;desc=\"description\"`, [{"name":"metric","desc":"description"}]); |
| testServerTimingHeader(`metric;desc=\"\t description \t\"`, [{"name":"metric","desc":"\t description \t"}]); |
| testServerTimingHeader(`metric;desc=\"descr\\\"iption\"`, [{"name":"metric","desc":"descr\"iption"}]); |
| |
| // quoted-strings - others |
| // metric;desc=\ --> '' |
| testServerTimingHeader(`metric;desc=\\`, [{"name":"metric","desc":""}]); |
| // metric;desc=" --> '' |
| testServerTimingHeader(`metric;desc=\"`, [{"name":"metric","desc":""}]); |
| // metric;desc=\\ --> '' |
| testServerTimingHeader(`metric;desc=\\\\`, [{"name":"metric","desc":""}]); |
| // metric;desc=\" --> '' |
| testServerTimingHeader(`metric;desc=\\\"`, [{"name":"metric","desc":""}]); |
| // metric;desc="\ --> '' |
| testServerTimingHeader(`metric;desc=\"\\`, [{"name":"metric","desc":""}]); |
| // metric;desc="" --> '' |
| testServerTimingHeader(`metric;desc=\"\"`, [{"name":"metric","desc":""}]); |
| // metric;desc=\\\ --> '' |
| testServerTimingHeader(`metric;desc=\\\\\\`, [{"name":"metric","desc":""}]); |
| // metric;desc=\\" --> '' |
| testServerTimingHeader(`metric;desc=\\\\\"`, [{"name":"metric","desc":""}]); |
| // metric;desc=\"\ --> '' |
| testServerTimingHeader(`metric;desc=\\\"\\`, [{"name":"metric","desc":""}]); |
| // metric;desc=\"" --> '' |
| testServerTimingHeader(`metric;desc=\\\"\"`, [{"name":"metric","desc":""}]); |
| // metric;desc="\\ --> '' |
| testServerTimingHeader(`metric;desc=\"\\\\`, [{"name":"metric","desc":""}]); |
| // metric;desc="\" --> '' |
| testServerTimingHeader(`metric;desc=\"\\\"`, [{"name":"metric","desc":""}]); |
| // metric;desc=""\ --> '' |
| testServerTimingHeader(`metric;desc=\"\"\\`, [{"name":"metric","desc":""}]); |
| // metric;desc=""" --> '' |
| testServerTimingHeader(`metric;desc=\"\"\"`, [{"name":"metric","desc":""}]); |
| // metric;desc=\\\\ --> '' |
| testServerTimingHeader(`metric;desc=\\\\\\\\`, [{"name":"metric","desc":""}]); |
| // metric;desc=\\\" --> '' |
| testServerTimingHeader(`metric;desc=\\\\\\\"`, [{"name":"metric","desc":""}]); |
| // metric;desc=\\"\ --> '' |
| testServerTimingHeader(`metric;desc=\\\\\"\\`, [{"name":"metric","desc":""}]); |
| // metric;desc=\\"" --> '' |
| testServerTimingHeader(`metric;desc=\\\\\"\"`, [{"name":"metric","desc":""}]); |
| // metric;desc=\"\\ --> '' |
| testServerTimingHeader(`metric;desc=\\\"\\\\`, [{"name":"metric","desc":""}]); |
| // metric;desc=\"\" --> '' |
| testServerTimingHeader(`metric;desc=\\\"\\\"`, [{"name":"metric","desc":""}]); |
| // metric;desc=\""\ --> '' |
| testServerTimingHeader(`metric;desc=\\\"\"\\`, [{"name":"metric","desc":""}]); |
| // metric;desc=\""" --> '' |
| testServerTimingHeader(`metric;desc=\\\"\"\"`, [{"name":"metric","desc":""}]); |
| // metric;desc="\\\ --> '' |
| testServerTimingHeader(`metric;desc=\"\\\\\\`, [{"name":"metric","desc":""}]); |
| // metric;desc="\\" --> '\' |
| testServerTimingHeader(`metric;desc=\"\\\\\"`, [{"name":"metric","desc":"\\"}]); |
| // metric;desc="\"\ --> '' |
| testServerTimingHeader(`metric;desc=\"\\\"\\`, [{"name":"metric","desc":""}]); |
| // metric;desc="\"" --> '"' |
| testServerTimingHeader(`metric;desc=\"\\\"\"`, [{"name":"metric","desc":"\""}]); |
| // metric;desc=""\\ --> '' |
| testServerTimingHeader(`metric;desc=\"\"\\\\`, [{"name":"metric","desc":""}]); |
| // metric;desc=""\" --> '' |
| testServerTimingHeader(`metric;desc=\"\"\\\"`, [{"name":"metric","desc":""}]); |
| // metric;desc="""\ --> '' |
| testServerTimingHeader(`metric;desc=\"\"\"\\`, [{"name":"metric","desc":""}]); |
| // metric;desc="""" --> '' |
| testServerTimingHeader(`metric;desc=\"\"\"\"`, [{"name":"metric","desc":""}]); |
| |
| // duplicate entry names |
| testServerTimingHeader(`metric;dur=12.3;desc=description1,metric;dur=45.6;desc=description2`, [{"name":"metric","dur":12.3,"desc":"description1"},{"name":"metric","dur":45.6,"desc":"description2"}]); |
| |
| // param name case sensitivity |
| testServerTimingHeader(`metric;DuR=123.4;DeSc=description`, [{"name":"metric","dur":123.4,"desc":"description"}]); |
| |
| // param value case sensitivity |
| testServerTimingHeader(`MeTrIc;desc=DeScRiPtIoN`, [{"name":"MeTrIc","desc":"DeScRiPtIoN"}]); |
| |
| // non-numeric durations |
| testServerTimingHeader(`metric;dur=foo`, [{"name":"metric","dur":0}]); |
| testServerTimingHeader(`metric;dur=\"foo\"`, [{"name":"metric","dur":0}]); |
| |
| // unrecognized param names |
| testServerTimingHeader(`metric1;foo=bar;desc=description;foo=bar;dur=123.4;foo=bar,metric2`, [{"name":"metric1","desc":"description","dur":123.4},{"name":"metric2"}]); |
| |
| // duplicate param names |
| testServerTimingHeader(`metric;dur=123.4;dur=567.8`, [{"name":"metric","dur":123.4}]); |
| testServerTimingHeader(`metric;dur=foo;dur=567.8`, [{"name":"metric","dur":0}]); |
| testServerTimingHeader(`metric;desc=description1;desc=description2`, [{"name":"metric","desc":"description1"}]); |
| |
| // incomplete params |
| testServerTimingHeader(`metric;dur;dur=123.4;desc=description`, [{"name":"metric","dur":0,"desc":"description"}]); |
| testServerTimingHeader(`metric;dur=;dur=123.4;desc=description`, [{"name":"metric","dur":0,"desc":"description"}]); |
| testServerTimingHeader(`metric;desc;desc=description;dur=123.4`, [{"name":"metric","desc":"","dur":123.4}]); |
| testServerTimingHeader(`metric;desc=;desc=description;dur=123.4`, [{"name":"metric","desc":"","dur":123.4}]); |
| |
| // extraneous characters after param value as token |
| testServerTimingHeader(`metric;desc=d1 d2;dur=123.4`, [{"name":"metric","desc":"d1","dur":123.4}]); |
| testServerTimingHeader(`metric1;desc=d1 d2,metric2`, [{"name":"metric1","desc":"d1"},{"name":"metric2"}]); |
| |
| // extraneous characters after param value as quoted-string |
| testServerTimingHeader(`metric;desc=\"d1\" d2;dur=123.4`, [{"name":"metric","desc":"d1","dur":123.4}]); |
| testServerTimingHeader(`metric1;desc=\"d1\" d2,metric2`, [{"name":"metric1","desc":"d1"},{"name":"metric2"}]); |
| |
| // nonsense - extraneous characters after entry name token |
| testServerTimingHeader(`metric== \"\"foo;dur=123.4`, [{"name":"metric"}]); |
| testServerTimingHeader(`metric1== \"\"foo,metric2`, [{"name":"metric1"}]); |
| |
| // nonsense - extraneous characters after param name token |
| testServerTimingHeader(`metric;dur foo=12`, [{"name":"metric","dur":0}]); |
| testServerTimingHeader(`metric;foo dur=12`, [{"name":"metric"}]); |
| |
| // nonsense - return zero entries |
| testServerTimingHeader(` `, []); |
| testServerTimingHeader(`=`, []); |
| testServerTimingHeader(`[`, []); |
| testServerTimingHeader(`]`, []); |
| testServerTimingHeader(`;`, []); |
| testServerTimingHeader(`,`, []); |
| testServerTimingHeader(`=;`, []); |
| testServerTimingHeader(`;=`, []); |
| testServerTimingHeader(`=,`, []); |
| testServerTimingHeader(`,=`, []); |
| testServerTimingHeader(`;,`, []); |
| testServerTimingHeader(`,;`, []); |
| testServerTimingHeader(`=;,`, []); |
| |
| // tabs |
| testServerTimingHeader(`metric;\tdesc=\ttabs-should-get-trimmed\t;dur=\t42\t`, [{"name":"metric","desc":"tabs-should-get-trimmed","dur":42}]); |
| |
| // leading whitespace |
| testServerTimingHeader(` metric;dur=123.4;desc=description`, [{"name":"metric","dur":123.4,"desc":"description"}]); |
| testServerTimingHeader(`\tmetric;dur=123.4;desc=description`, [{"name":"metric","dur":123.4,"desc":"description"}]); |
| |
| return true; |
| } |
| }); |
| |
| suite.runTestCasesAndFinish(); |
| } |
| </script> |
| </head> |
| <body onLoad="runTest()"> |
| </body> |
| </html> |