// META: title=Cache.put
// META: global=window,worker
// META: script=/common/get-host-info.sub.js
// META: script=./resources/test-helpers.js
// META: timeout=long

var test_url = 'https://example.com/foo';
var test_body = 'Hello world!';
const { REMOTE_HOST } = get_host_info();

promise_test(async function(test) {
  var inboxBucket = await navigator.storageBuckets.open('inbox');
  var draftsBucket = await navigator.storageBuckets.open('drafts');

  test.add_cleanup(async function() {
    await navigator.storageBuckets.delete('inbox');
    await navigator.storageBuckets.delete('drafts');
  });

  const cacheName = 'attachments';
  const cacheKey = 'receipt1.txt';

  var inboxCache = await inboxBucket.caches.open(cacheName);
  var draftsCache = await draftsBucket.caches.open(cacheName);

  await inboxCache.put(cacheKey, new Response('bread x 2'))
  await draftsCache.put(cacheKey, new Response('eggs x 1'));

  return inboxCache.match(cacheKey)
      .then(function(result) {
        return result.text();
      })
      .then(function(body) {
        assert_equals(body, 'bread x 2', 'Wrong cache contents');
        return draftsCache.match(cacheKey);
      })
      .then(function(result) {
        return result.text();
      })
      .then(function(body) {
        assert_equals(body, 'eggs x 1', 'Wrong cache contents');
      });
}, 'caches from different buckets have different contents');

promise_test(async function(test) {
  var inboxBucket = await navigator.storageBuckets.open('inbox');
  var draftBucket = await navigator.storageBuckets.open('drafts');

  test.add_cleanup(async function() {
    await navigator.storageBuckets.delete('inbox');
    await navigator.storageBuckets.delete('drafts');
  });

  var caches = inboxBucket.caches;
  var attachments = await caches.open('attachments');
  await attachments.put('receipt1.txt', new Response('bread x 2'));
  var result = await attachments.match('receipt1.txt');
  assert_equals(await result.text(), 'bread x 2');

  await navigator.storageBuckets.delete('inbox');

  await promise_rejects_dom(
      test, 'UnknownError', caches.open('attachments'));

  // Also test when `caches` is first accessed after the deletion.
  await navigator.storageBuckets.delete('drafts');
  return promise_rejects_dom(
      test, 'UnknownError', draftBucket.caches.open('attachments'));
}, 'cache.open promise is rejected when bucket is gone');

done();
