/* Any copyright is dedicated to the Public Domain.
   http://creativecommons.org/publicdomain/zero/1.0/ */

/**
 * Test clearing cache.
 */

"use strict";

add_task(async function test_deleteFromHost() {
  await SiteDataTestUtils.addCacheEntry("http://example.com/", "disk");
  await SiteDataTestUtils.addCacheEntry("http://example.com/", "memory");
  Assert.ok(SiteDataTestUtils.hasCacheEntry("http://example.com/", "disk"), "The disk cache has an entry");
  Assert.ok(SiteDataTestUtils.hasCacheEntry("http://example.com/", "memory"), "The memory cache has an entry");

  await SiteDataTestUtils.addCacheEntry("http://example.org/", "disk");
  await SiteDataTestUtils.addCacheEntry("http://example.org/", "memory");
  Assert.ok(SiteDataTestUtils.hasCacheEntry("http://example.org/", "disk"), "The disk cache has an entry");
  Assert.ok(SiteDataTestUtils.hasCacheEntry("http://example.org/", "memory"), "The memory cache has an entry");


  await new Promise(aResolve => {
    Services.clearData.deleteDataFromHost("example.com", true, Ci.nsIClearDataService.CLEAR_NETWORK_CACHE, value => {
      Assert.equal(value, 0);
      aResolve();
    });
  });

  Assert.ok(!SiteDataTestUtils.hasCacheEntry("http://example.com/", "disk"), "The disk cache is cleared");
  Assert.ok(!SiteDataTestUtils.hasCacheEntry("http://example.com/", "memory"), "The memory cache is cleared");

  Assert.ok(SiteDataTestUtils.hasCacheEntry("http://example.org/", "disk"), "The disk cache has an entry");
  Assert.ok(SiteDataTestUtils.hasCacheEntry("http://example.org/", "memory"), "The memory cache has an entry");

  await SiteDataTestUtils.clear();
});

add_task(async function test_deleteFromPrincipal() {
  await SiteDataTestUtils.addCacheEntry("http://example.com/", "disk");
  await SiteDataTestUtils.addCacheEntry("http://example.com/", "memory");
  Assert.ok(SiteDataTestUtils.hasCacheEntry("http://example.com/", "disk"), "The disk cache has an entry");
  Assert.ok(SiteDataTestUtils.hasCacheEntry("http://example.com/", "memory"), "The memory cache has an entry");

  await SiteDataTestUtils.addCacheEntry("http://example.org/", "disk");
  await SiteDataTestUtils.addCacheEntry("http://example.org/", "memory");
  Assert.ok(SiteDataTestUtils.hasCacheEntry("http://example.org/", "disk"), "The disk cache has an entry");
  Assert.ok(SiteDataTestUtils.hasCacheEntry("http://example.org/", "memory"), "The memory cache has an entry");

  let principal = Services.scriptSecurityManager.createCodebasePrincipalFromOrigin("http://example.com/");
  await new Promise(aResolve => {
    Services.clearData.deleteDataFromPrincipal(principal, true, Ci.nsIClearDataService.CLEAR_NETWORK_CACHE, value => {
      Assert.equal(value, 0);
      aResolve();
    });
  });

  Assert.ok(!SiteDataTestUtils.hasCacheEntry("http://example.com/", "disk"), "The disk cache is cleared");
  Assert.ok(!SiteDataTestUtils.hasCacheEntry("http://example.com/", "memory"), "The memory cache is cleared");

  Assert.ok(SiteDataTestUtils.hasCacheEntry("http://example.org/", "disk"), "The disk cache has an entry");
  Assert.ok(SiteDataTestUtils.hasCacheEntry("http://example.org/", "memory"), "The memory cache has an entry");

  await SiteDataTestUtils.clear();
});

add_task(async function test_deleteAll() {
  await SiteDataTestUtils.addCacheEntry("http://example.com/", "disk");
  await SiteDataTestUtils.addCacheEntry("http://example.com/", "memory");
  Assert.ok(SiteDataTestUtils.hasCacheEntry("http://example.com/", "disk"), "The disk cache has an entry");
  Assert.ok(SiteDataTestUtils.hasCacheEntry("http://example.com/", "memory"), "The memory cache has an entry");

  await SiteDataTestUtils.addCacheEntry("http://example.org/", "disk");
  await SiteDataTestUtils.addCacheEntry("http://example.org/", "memory");
  Assert.ok(SiteDataTestUtils.hasCacheEntry("http://example.org/", "disk"), "The disk cache has an entry");
  Assert.ok(SiteDataTestUtils.hasCacheEntry("http://example.org/", "memory"), "The memory cache has an entry");

  await new Promise(aResolve => {
    Services.clearData.deleteData(Ci.nsIClearDataService.CLEAR_NETWORK_CACHE, value => {
      Assert.equal(value, 0);
      aResolve();
    });
  });

  Assert.ok(!SiteDataTestUtils.hasCacheEntry("http://example.com/", "disk"), "The disk cache is cleared");
  Assert.ok(!SiteDataTestUtils.hasCacheEntry("http://example.com/", "memory"), "The memory cache is cleared");

  Assert.ok(!SiteDataTestUtils.hasCacheEntry("http://example.org/", "disk"), "The disk cache is cleared");
  Assert.ok(!SiteDataTestUtils.hasCacheEntry("http://example.org/", "memory"), "The memory cache is cleared");

  await SiteDataTestUtils.clear();
});
