// META: title=Cookie Store API: Cookie ordering
// META: global=window,serviceworker

'use strict';

promise_test(async t => {
  await cookieStore.set('ordered-1', 'cookie-value1');
  await cookieStore.set('ordered-2', 'cookie-value2');
  await cookieStore.set('ordered-3', 'cookie-value3');
  // NOTE: this assumes no concurrent writes from elsewhere; it also
  // uses three separate cookie jar read operations where a single getAll
  // would be more efficient, but this way the CookieStore does the filtering
  // for us.
  const matchingValues = await Promise.all(['1', '2', '3'].map(
      async suffix => (await cookieStore.get('ordered-' + suffix)).value));
  const actual = matchingValues.join(';');
  const expected = 'cookie-value1;cookie-value2;cookie-value3';
  assert_equals(actual, expected);
}, 'Set three simple origin session cookies sequentially and ensure ' +
            'they all end up in the cookie jar in order.');

promise_test(async t => {
  await Promise.all([
    cookieStore.set('ordered-unordered1', 'unordered-cookie-value1'),
    cookieStore.set('ordered-unordered2', 'unordered-cookie-value2'),
    cookieStore.set('ordered-unordered3', 'unordered-cookie-value3')
  ]);
  // NOTE: this assumes no concurrent writes from elsewhere; it also
  // uses three separate cookie jar read operations where a single getAll
  // would be more efficient, but this way the CookieStore does the filtering
  // for us and we do not need to sort.
  const matchingCookies = await Promise.all(['1', '2', '3'].map(
    suffix => cookieStore.get('ordered-unordered' + suffix)));
  const actual = matchingCookies.map(({ value }) => value).join(';');
  const expected =
      'unordered-cookie-value1;' +
      'unordered-cookie-value2;' +
      'unordered-cookie-value3';
  assert_equals(actual, expected);
}, 'Set three simple origin session cookies in undefined order using ' +
            'Promise.all and ensure they all end up in the cookie jar in any ' +
            'order. ');
