Commit 708aabaf authored by Andreas Haas's avatar Andreas Haas Committed by moz-wptsync-bot
Browse files

Bug 1721531 [wpt PR 29726] - [fsa] Implement close for the sync access handle, a=testonly

Automatic update from web-platform-tests
[fsa] Implement close for the sync access handle

The implementation is ported from the implementation of
Storage Foundation in
https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/modules/native_io/native_io_file_async.cc.

This is part of the efforts to merge Storage Foundation into OPFS.

Bug: chromium:1218431
Change-Id: I03e0a3027b2ace8d07b04d9b8c5e2fb9fdcee454
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3035097


Reviewed-by: default avatarMarijn Kruisselbrink <mek@chromium.org>
Commit-Queue: Andreas Haas <ahaas@chromium.org>
Cr-Commit-Position: refs/heads/master@{#904187}

--

wpt-commits: 20574795ed2fadf6140492238df53000c2b0c247
wpt-pr: 29726
parent c403aa54
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -12,5 +12,6 @@ function sync_access_handle_test(test, description) {
    const fileHandle = await dir.getFileHandle('OPFS.test', {create: true});
    const syncHandle = await fileHandle.createSyncAccessHandle();
    await test(t, syncHandle);
    await syncHandle.close();
  }, description);
}
+64 −0
Original line number Diff line number Diff line
importScripts("/resources/testharness.js");
importScripts('resources/sync-access-handle-test.js');

'use strict';

sync_access_handle_test(async (testCase, handle) => {
  assert_equals(await handle.close(), undefined);

  assert_equals(await handle.close(), undefined);
}, 'SyncAccessHandle.close is idempotent');

sync_access_handle_test(async (testCase, handle) => {
  const closePromise = handle.close();

  assert_equals(await handle.close(), undefined);
  assert_equals(await closePromise, undefined);
}, 'SyncAccessHandle.close is idempotent when called immediately');

sync_access_handle_test(async (testCase, handle) => {
  assert_equals(await handle.close(), undefined);

  const readBuffer = new Uint8Array(4);
  assert_throws_dom('InvalidStateError', () => handle.read(readBuffer, {at: 0}));
}, 'SyncAccessHandle.read fails after SyncAccessHandle.close settles');

sync_access_handle_test(async (testCase, handle) => {
  const closePromise = handle.close();

  const readBuffer = new Uint8Array(4);
  assert_throws_dom('InvalidStateError', () => handle.read(readBuffer, {at: 0}));
  assert_equals(await closePromise, undefined);
}, 'SyncAccessHandle.read fails immediately after calling SyncAccessHandle.close');

sync_access_handle_test(async (testCase, handle) => {
  assert_equals(await handle.close(), undefined);

  const writeBuffer = new Uint8Array(4);
  writeBuffer.set([96, 97, 98, 99]);
  assert_throws_dom('InvalidStateError', () => handle.write(writeBuffer, {at: 0}));
}, 'SyncAccessHandle.write fails after SyncAccessHandle.close settles');

sync_access_handle_test(async (testCase, handle) => {
  const closePromise = handle.close();

  const writeBuffer = new Uint8Array(4);
  writeBuffer.set([96, 97, 98, 99]);
  assert_throws_dom('InvalidStateError', () => handle.write(writeBuffer, {at: 0}));
  assert_equals(await closePromise, undefined);
}, 'SyncAccessHandle.write fails immediately after calling SyncAccessHandle.close');

sync_access_handle_test(async (testCase, handle) => {
  assert_equals(await handle.close(), undefined);

  await promise_rejects_dom(testCase, 'InvalidStateError', handle.flush());
}, 'SyncAccessHandle.flush fails after SyncAccessHandle.close settles');

sync_access_handle_test(async (testCase, handle) => {
  const closePromise = handle.close();

  await promise_rejects_dom(testCase, 'InvalidStateError', handle.flush());
  assert_equals(await closePromise, undefined);
}, 'SyncAccessHandle.flush fails immediately after calling SyncAccessHandle.close');

done();
+8 −0
Original line number Diff line number Diff line
'use strict';

// This script depends on the following scripts:
//    /file-system-access/resources/messaging-helpers.js

sync_access_handle_test(async handle => {
  await handle.flush();
}, 'Test flush on an empty file.');