<html>
<head>
<script src="/js-test-resources/js-test.js"></script>
<script src="resources/shared.js"></script>
</head>
<body>
<script>
if (window.testRunner) 
    testRunner.setAllowStorageQuotaIncrease(false);

description("This test makes sure that storage of indexedDB does not grow unboundedly.");

window.caches.open("test").then(cache => {
    return cache.put(new Request("/test"), new Response(new Uint8Array(204800)));
}).then(() => {
    indexedDBTest(prepareDatabase, onOpenSuccess, {'suffix': '-1'});
}).catch(e => {
    testFailed("Cache API store operation failed: " + e);
    finishJSTest();
});

function prepareDatabase(event)
{
    evalAndLog("db = event.target.result");
    evalAndLog("store = db.createObjectStore('store')");
}

// Quota for test is 400ko, but IDB is eating some of it when initializing files.
// Let's make sure that 200ko is fine but 200ko after 200ko is not fine.
async function onOpenSuccess(event)
{
    evalAndLog("db = event.target.result");
    evalAndLog("store = db.transaction('store', 'readwrite').objectStore('store')");
    evalAndLog("request = store.add(new Uint8Array(204800), 'key')");
    request.onerror = function(event) {
        shouldBeTrue("'error' in request");
        shouldBe("request.error.code", "DOMException.QUOTA_EXCEEDED_ERR");
        shouldBeEqualToString("request.error.name", "QuotaExceededError");
        finishJSTest();
    }

    request.onsuccess = function(event) {
        testFailed("Add operation should fail because storage limit is reached, but succeeded.");
        finishJSTest();
    }
}
</script>
</body>
</html>
