blob: bcefbcb78f61ae4999de8a36ec0c67f47790238d [file] [log] [blame]
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script src="../../resources/inspector-test.js"></script>
<script>
function test()
{
function HARJSONFilter(key, value) {
// Filter out the creator.version / browser.version but leave a top level version.
if ((key === "creator" || key === "browser") && value.version) {
value.version = "<filtered>";
return value;
}
return value;
}
const timingFilterSet = new Set(["creator", "browser", "request", "response"]);
function HARJSONTimingFilter(key, value) {
if (timingFilterSet.has(key))
return "<filtered>";
return value;
}
const url = "https://example.com/fake.js";
const mimeType = "text/javascript";
const type = WI.Resource.Type.Script;
const requestMethod = "GET";
const requestHeaders = {"Test-Request-Header": "Test Request Header Value"};
const responseHeaders = {"Test-Response-Header": "Test Response Header Value"};
const statusCode = 200;
const statusText = "OK";
const source = "network";
const requestSentWalltime = 1508723752694 / 1000; // Sun Oct 22 2017 18:55:52 GMT-0700, when this test was written.
const timestamp = undefined;
const size = 1234;
let suite = InspectorTest.createAsyncSuite("HAR.Basic");
suite.addTestCase({
name: "HAR.Basic.Empty",
description: "Should be able to generate a HAR with no resources.",
async test() {
let har = await WI.HARBuilder.buildArchive([]);
InspectorTest.json(har, HARJSONFilter);
}
});
suite.addTestCase({
name: "HAR.Basic.FakeResources",
description: "Should be able to generate a HAR with resources.",
async test() {
// FIXME: We should have an easier way to construct a Resource with mock data.
const timingData = {
startTime: 1,
domainLookupStart: 100,
domainLookupEnd: 200,
connectStart: 300,
connectEnd: 400,
secureConnectionStart: 350,
requestStart: 500,
responseStart: 600,
responseEnd: 700,
};
const metrics = {
protocol: "http/1.1",
priority: "medium",
remoteAddress: "12.34.56.78:443",
connectionIdentifier: 123,
requestHeaderBytesSent: 100,
requestBodyBytesSent: 0,
responseHeaderBytesReceived: 200,
responseBodyBytesReceived: 800,
responseBodyDecodedSize: 1234,
requestHeaders,
};
let bareResource = new WI.Resource(url, {mimeType, type, requestMethod, requestHeaders, requestSentWalltime});
bareResource.markAsFinished(undefined);
let fullResource = new WI.Resource(url, {mimeType, type, requestMethod, requestHeaders, requestSentWalltime});
fullResource.updateForResponse(url, mimeType, type, responseHeaders, statusCode, statusText, timestamp, timingData, source);
fullResource.increaseSize(size);
fullResource.updateWithMetrics(metrics);
fullResource.markAsFinished(1.7);
let har = await WI.HARBuilder.buildArchive([bareResource, fullResource]);
InspectorTest.json(har, HARJSONFilter);
}
});
suite.addTestCase({
name: "HAR.Basic.Timing",
description: "Test for HAR timing data when various dns/connect sections are empty.",
async test() {
function resourceWithTimingData(timingData) {
let resource = new WI.Resource(url, {mimeType, type, requestMethod, requestHeaders, requestSentWalltime});
resource.updateForResponse(url, mimeType, type, responseHeaders, statusCode, statusText, timestamp, timingData, source);
resource.increaseSize(size);
resource.markAsFinished(1.7);
return resource;
}
let resource1 = resourceWithTimingData({
startTime: 1,
domainLookupStart: NaN,
domainLookupEnd: NaN,
connectStart: NaN,
connectEnd: NaN,
secureConnectionStart: NaN,
requestStart: 500,
responseStart: 600,
responseEnd: 700,
});
let resource2 = resourceWithTimingData({
startTime: 1,
domainLookupStart: 100,
domainLookupEnd: 200,
connectStart: NaN,
connectEnd: NaN,
secureConnectionStart: NaN,
requestStart: 500,
responseStart: 600,
responseEnd: 700,
});
let resource3 = resourceWithTimingData({
startTime: 1,
domainLookupStart: NaN,
domainLookupEnd: NaN,
connectStart: 300,
connectEnd: 400,
secureConnectionStart: NaN,
requestStart: 500,
responseStart: 600,
responseEnd: 700,
});
function sumTimingDataTillWait(entry) {
let {blocked, dns, connect, send} = entry.timings;
let sum = 0;
if (blocked > 0)
sum += blocked;
if (dns > 0)
sum += dns;
if (connect > 0)
sum += connect;
if (send > 0)
sum += send;
return sum;
}
let har = await WI.HARBuilder.buildArchive([resource1, resource2, resource3]);
let {log: {entries: [entry1, entry2, entry3]}} = har;
InspectorTest.expectEqualWithAccuracy(sumTimingDataTillWait(entry1), 500, 0.001, `HAR Timings for entry1 should add up to ~500ms before wait.`);
InspectorTest.expectEqualWithAccuracy(sumTimingDataTillWait(entry2), 500, 0.001, `HAR Timings for entry2 should add up to ~500ms before wait.`);
InspectorTest.expectEqualWithAccuracy(sumTimingDataTillWait(entry3), 500, 0.001, `HAR Timings for entry3 should add up to ~500ms before wait.`);
InspectorTest.json(har, HARJSONTimingFilter);
}
});
suite.runTestCasesAndFinish();
}
</script>
</head>
<body onload="runTest()">
<p>Basic tests for HAR.</p>
</body>
</html>