Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / content / test / data / indexeddb / quota_test.js
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 function test() {
6   if (window.webkitStorageInfo) {
7     window.jsTestIsAsync = true;
8     webkitStorageInfo.queryUsageAndQuota(webkitStorageInfo.TEMPORARY,
9                                          initUsageCallback,
10                                          unexpectedErrorCallback);
11   } else
12     debug("This test requires window.webkitStorageInfo.");
13 }
14
15 function initUsageCallback(usage, quota) {
16   origReturnedUsage = returnedUsage = usage;
17   origReturnedQuota = returnedQuota = quota;
18   debug("original quota is " + displaySize(origReturnedQuota));
19   debug("original usage is " + displaySize(origReturnedUsage));
20
21   indexedDBTest(prepareDatabase, initQuotaEnforcing);
22 }
23
24 function prepareDatabase()
25 {
26   db = event.target.result;
27   objectStore = db.createObjectStore("test123");
28 }
29
30 function displaySize(bytes) {
31   var k = bytes / 1024;
32   var m = k / 1024;
33   return bytes + " (" + k + "k) (" + m + "m)";
34 }
35
36 function initQuotaEnforcing() {
37   var availableSpace = origReturnedQuota - origReturnedUsage;
38   var kMaxMbPerWrite = 5;
39   var kMinWrites = 5;
40   var len = Math.min(kMaxMbPerWrite * 1024 * 1024,
41                      Math.floor(availableSpace / kMinWrites));
42   maxExpectedWrites = Math.floor(availableSpace / len) + 1;
43   debug("Chunk size: " + displaySize(len));
44   debug("Expecting at most " + maxExpectedWrites + " writes, but we could " +
45         "have more if snappy is used or LevelDB is about to compact.");
46   data = Array(1+len).join("X");
47   dataLength = data.length;
48   dataAdded = 0;
49   successfulWrites = 0;
50   startNewTransaction();
51 }
52
53 function startNewTransaction() {
54   if (dataAdded > origReturnedQuota) {
55     fail("dataAdded > quota " + dataAdded + " > " + origReturnedQuota);
56     return;
57   }
58   debug("");
59   debug("Starting new transaction.");
60
61   var trans = db.transaction(['test123'], 'readwrite');
62   trans.onabort = onAbort;
63   trans.oncomplete = getQuotaAndUsage;
64   var store = trans.objectStore('test123');
65   request = store.put({x: data}, dataAdded);
66   request.onerror = logError;
67 }
68
69 function getQuotaAndUsage() {
70   successfulWrites++;
71   if (successfulWrites > maxExpectedWrites) {
72     debug("Weird: too many writes. There were " + successfulWrites +
73           " but we only expected " + maxExpectedWrites);
74   }
75   webkitStorageInfo.queryUsageAndQuota(webkitStorageInfo.TEMPORARY,
76                                        usageCallback, unexpectedErrorCallback);
77 }
78
79 function usageCallback(usage, quota) {
80   debug("Transaction finished.");
81   dataAdded += dataLength;
82   debug("We've added "+ displaySize(dataAdded));
83   returnedUsage = usage;
84   returnedQuota = quota;
85   debug("Allotted quota is " + displaySize(returnedQuota));
86   debug("LevelDB usage is " + displaySize(returnedUsage));
87   startNewTransaction();
88 }
89
90 function onAbort() {
91   shouldBeEqualToString("event.target.error.name", "QuotaExceededError");
92   done("Transaction aborted. Data added: " + displaySize(dataAdded));
93   debug("There were " + successfulWrites + " successful writes");
94 }
95
96 function logError() {
97   debug("Error function called: (" + event.target.error.name + ") " +
98         event.target.error.message);
99   event.preventDefault();
100 }