<!doctype html>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/common/utils.js"></script>
<script src="/shared-storage/resources/util.js"></script>
<script src="/fenced-frame/resources/utils.js"></script>

<body>
<script>
'use strict';

promise_test(async t => {
  let worklet = await sharedStorage.createWorklet('resources/simple-module.js');

  const ancestor_key = token();
  let url0 = generateURL("/shared-storage/resources/frame0.html",
                         [ancestor_key]);
  let url1 = generateURL("/shared-storage/resources/frame1.html",
                         [ancestor_key]);

  // Invoke `selectURL()` to perform the following steps:
  // 1. Acquires the lock.
  // 2. Reads the current value at the given key.
  // 3. Waits for 500ms.
  // 4. Sets the shared storage value to the read value appended with the given letter.
  // 5. Releases the lock.
  //
  // After 100ms, invoke `sharedStorage.append()` with the same lock and the
  // same letter to append.
  //
  // Expected behavior: After both of them finish, the value at the given key
  // should contain the letter repeated twice.
  //
  // This demonstrates that the `withLock` option is effective, preventing the
  // `append()` method interfering with the "get and set" operation. If the lock
  // were not used, the final value would likely be a single letter.
  //
  // Note: This test remains valid even if the `append()` call happens outside
  // the critical section protected by the lock within the worklet. The test
  // effectively demonstrates mutual exclusion as long as there's a reasonable
  // chance for `append()` to occur while the worklet is still running.
  let select_url_result = await worklet.selectURL(
      "get-wait-set-within-lock",
      [{url: url0}, {url: url1}],
      {data: {'key': 'key',
              'lock_name': 'lock1',
              'append_letter': 'a'},
      resolveToConfig: true});

  // Busy wait for 100ms.
  const startWaitTime = Date.now();
  while (Date.now() - startWaitTime < 100) {}

  sharedStorage.append('key', 'a', {withLock: 'lock1'});

  attachFencedFrame(select_url_result, 'opaque-ads');
  const result = await nextValueFromServer(ancestor_key);
  assert_equals(result, "frame1_loaded");

  await verifyKeyValueForOrigin('key', 'aa', location.origin);

  await deleteKeyForOrigin('key', location.origin);
}, 'Test for withLock option in a Window context');

</script>
</body>
