| // Runs multiple fetches that validate connections see only a single partition_id. |
| // Requests are run in parallel so that they use multiple connections to maximize the |
| // chance of exercising all matching connections in the connection pool. Only returns |
| // once all requests have completed to make cleaning up server state non-racy. |
| function check_partition_ids(location) { |
| const NUM_FETCHES = 20; |
| |
| var base_url = 'SUBRESOURCE_PREFIX:&dispatch=check_partition'; |
| |
| // Not a perfect parse of the query string, but good enough for this test. |
| var include_credentials = base_url.search('include_credentials=true') != -1; |
| var exclude_credentials = base_url.search('include_credentials=false') != -1; |
| if (include_credentials != !exclude_credentials) |
| throw new Exception('Credentials mode not specified'); |
| |
| |
| // Run NUM_FETCHES in parallel. |
| var fetches = []; |
| for (i = 0; i < NUM_FETCHES; ++i) { |
| var fetch_params = { |
| credentials: 'omit', |
| mode: 'cors', |
| headers: { |
| 'Header-To-Force-CORS': 'cors' |
| }, |
| }; |
| |
| // Use a unique URL for each request, in case the caching layer serializes multiple |
| // requests for the same URL. |
| var url = `${base_url}&${token()}`; |
| |
| fetches.push(fetch(url, fetch_params).then( |
| function (response) { |
| return response.text().then(function(text) { |
| assert_equals(text, 'ok', `Socket unexpectedly reused`); |
| }); |
| })); |
| } |
| |
| // Wait for all promises to complete. |
| return Promise.allSettled(fetches).then(function (results) { |
| results.forEach(function (result) { |
| if (result.status != 'fulfilled') |
| throw result.reason; |
| }); |
| }); |
| } |