forked from web-platform-tests/wpt
-
Notifications
You must be signed in to change notification settings - Fork 2
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[ResourceTiming] Refactor connection-reuse tests
This CL migrates the connection reuse WPTs to the new style. See wpt/resource-timing/CodingConventions.md for details. These tests exist to verify that the Resource Timing API yields correct PerformanceResourceTiming values when the underlying TCP connection is reused across multiple subresources. Bug: 1171767 Change-Id: I5acdb6bf8a5e71bb34c7d2236cdb9d0209d3d04d GithubIssue: w3c/resource-timing#254 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2950880 Commit-Queue: Tom McKee <tommckee@chromium.org> Reviewed-by: Yoav Weiss <yoavweiss@chromium.org> Cr-Commit-Position: refs/heads/master@{#891368}
- Loading branch information
1 parent
e80db1b
commit 7657d9b
Showing
4 changed files
with
105 additions
and
61 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,70 +1,63 @@ | ||
// This script is loaded in HTTP and HTTPS contexts to validate | ||
// PerformanceResourceTiming entries' attributes when reusing connections. | ||
|
||
// Make the first request before calling 'attribute_test' so that only the | ||
// second request's PerformanceResourceTiming entry will be interrogated. | ||
// We don't check the first request's PerformanceResourceTiming entry because | ||
// that's not what this test is trying to validate. | ||
// | ||
// Note: to ensure that we reuse the connection to fetch multiple resources, | ||
// we use the same XMLHttpRequest object for each request. Although it doesn't | ||
// seem to be specified, each browser tested by WPT will reuse the underlying | ||
// TCP connection with this approach. Pre-establishing the XHR's connection | ||
// helps us to test connection reuse also in browsers that may key their | ||
// connections on the related request's credentials mode. | ||
const client = new XMLHttpRequest(); | ||
const identifier = Math.random(); | ||
const path = `resources/fake_responses.py?tag=${identifier}`; | ||
client.open("GET", path, false); | ||
client.send(); | ||
// Note: to ensure that we reuse the connection to fetch multiple resources, we | ||
// use the same XMLHttpRequest object throughout an individual test. Although | ||
// it doesn't seem to be specified, each browser tested by WPT will reuse the | ||
// underlying TCP connection with this approach. Pre-establishing the XHR's | ||
// connection helps us to test connection reuse also in browsers that may key | ||
// their connections on the related request's credentials mode. | ||
|
||
attribute_test( | ||
async () => { | ||
client.open("GET", path + "&same_resource=false", false); | ||
client.send(); | ||
const connection_reuse_test = (path, follow_on_assertions, test_label) => { | ||
const {on_200, on_304} = follow_on_assertions; | ||
|
||
// We expect to get a 200 Ok response because we've requested a different | ||
// resource than previous requests. | ||
if (client.status != 200) { | ||
throw new Error(`Got something other than a 200 response. ` + | ||
`client.status: ${client.status}`); | ||
} | ||
}, path, entry => { | ||
invariants.assert_connection_reused(entry); | ||
// Make the first request before calling 'attribute_test' so that only the | ||
// second request's PerformanceResourceTiming entry will be interrogated. We | ||
// don't check the first request's PerformanceResourceTiming entry because | ||
// that's not what this test is trying to validate. | ||
const client = new XMLHttpRequest(); | ||
const identifier = Math.random(); | ||
path = `${path}?tag=${identifier}`; | ||
client.open("GET", path, false); | ||
client.send(); | ||
|
||
// The entry must also follow the specification for any entry corresponding | ||
// to a 'typical' 200 Ok response. | ||
if (self.location.protocol == 'https:') { | ||
invariants.assert_tao_pass_no_redirect_https(entry); | ||
} else { | ||
invariants.assert_tao_pass_no_redirect_http(entry); | ||
} | ||
}, | ||
"PerformanceResrouceTiming entries need to conform to the spec when a " + | ||
"distinct resource is fetched over a persistent connection"); | ||
attribute_test( | ||
async () => { | ||
client.open("GET", path + "&same_resource=false", false); | ||
client.send(); | ||
|
||
attribute_test( | ||
async () => { | ||
client.open("GET", path, false); | ||
client.setRequestHeader("If-None-Match", identifier); | ||
client.send(); | ||
// We expect to get a 200 Ok response because we've requested a different | ||
// resource than previous requests. | ||
if (client.status != 200) { | ||
throw new Error(`Got something other than a 200 response. ` + | ||
`client.status: ${client.status}`); | ||
} | ||
}, path, entry => { | ||
invariants.assert_connection_reused(entry); | ||
on_200(entry); | ||
}, | ||
`PerformanceResrouceTiming entries need to conform to the spec when a ` + | ||
`distinct resource is fetched over a persistent connection ` + | ||
`(${test_label})`); | ||
|
||
// We expect to get a 304 Not Modified response because we've used a | ||
// matching 'identifier' for the If-None-Match header. | ||
if (client.status != 304) { | ||
throw new Error(`Got something other than a 304 response. ` + | ||
`client.status: ${client.status}`); | ||
} | ||
}, path, entry => { | ||
invariants.assert_connection_reused(entry); | ||
attribute_test( | ||
async () => { | ||
client.open("GET", path, false); | ||
client.setRequestHeader("If-None-Match", identifier); | ||
client.send(); | ||
|
||
// The entry must also follow the specification for any entry corresponding | ||
// to a 'typical' 304 Not Modified response. | ||
if (self.location.protocol == 'https:') { | ||
invariants.assert_tao_pass_304_not_modified_https(entry); | ||
} else { | ||
invariants.assert_tao_pass_304_not_modified_http(entry); | ||
} | ||
}, | ||
"PerformanceResrouceTiming entries need to conform to the spec when the " + | ||
"resource is cache-revalidated over a persistent connection"); | ||
// We expect to get a 304 Not Modified response because we've used a | ||
// matching 'identifier' for the If-None-Match header. | ||
if (client.status != 304) { | ||
throw new Error(`Got something other than a 304 response. ` + | ||
`client.status: ${client.status}, response: ` + | ||
`'${client.responseText}'`); | ||
} | ||
}, path, entry => { | ||
invariants.assert_connection_reused(entry); | ||
on_304(entry); | ||
}, | ||
`PerformanceResrouceTiming entries need to conform to the spec when the ` + | ||
`resource is cache-revalidated over a persistent connection ` + | ||
`(${test_label})`); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters