test_fileSystemDirectoryHandle.js (6111B)
1 /** 2 * Any copyright is dedicated to the Public Domain. 3 * http://creativecommons.org/publicdomain/zero/1.0/ 4 */ 5 6 exported_symbols.smokeTest = async function smokeTest() { 7 const storage = navigator.storage; 8 const subdirectoryNames = new Set(["Documents", "Downloads", "Music"]); 9 const allowCreate = { create: true }; 10 11 { 12 let root = await storage.getDirectory(); 13 Assert.ok(root, "Can we access the root directory?"); 14 15 let it = await root.values(); 16 Assert.ok(!!it, "Does root have values iterator?"); 17 18 let elem = await it.next(); 19 Assert.ok(elem.done, "Is root directory empty?"); 20 21 for (let dirName of subdirectoryNames) { 22 await root.getDirectoryHandle(dirName, allowCreate); 23 Assert.ok(true, "Was it possible to add subdirectory " + dirName + "?"); 24 } 25 } 26 27 { 28 let root = await storage.getDirectory(); 29 Assert.ok(root, "Can we refresh the root directory?"); 30 31 let it = await root.values(); 32 Assert.ok(!!it, "Does root have values iterator?"); 33 34 let hasElements = false; 35 let hangGuard = 0; 36 for await (let [key, elem] of root.entries()) { 37 Assert.ok(elem, "Is element not non-empty?"); 38 Assert.equal("directory", elem.kind, "Is found item a directory?"); 39 Assert.ok( 40 elem.name.length >= 1 && elem.name.match("^[A-Za-z]{1,64}"), 41 "Are names of the elements strings?" 42 ); 43 Assert.equal(key, elem.name); 44 Assert.ok(subdirectoryNames.has(elem.name), "Is name among known names?"); 45 hasElements = true; 46 ++hangGuard; 47 if (hangGuard == 10) { 48 break; // Exit if there is a hang 49 } 50 } 51 52 Assert.ok(hasElements, "Is values container now non-empty?"); 53 Assert.equal(3, hangGuard, "Do we only have three elements?"); 54 55 { 56 it = await root.values(); 57 Assert.ok(!!it, "Does root have values iterator?"); 58 let elem = await it.next(); 59 60 await elem.value.getDirectoryHandle("Trash", allowCreate); 61 let subit = elem.value.values(); 62 Assert.ok(!!elem, "Is element not non-empty?"); 63 let subdirResult = await subit.next(); 64 let subdir = subdirResult.value; 65 Assert.ok(!!subdir, "Is element not non-empty?"); 66 Assert.equal("directory", subdir.kind, "Is found item a directory?"); 67 Assert.equal("Trash", subdir.name, "Is found item a directory?"); 68 } 69 70 const wipeEverything = { recursive: true }; 71 for (let dirName of subdirectoryNames) { 72 await root.removeEntry(dirName, wipeEverything); 73 Assert.ok( 74 true, 75 "Was it possible to remove subdirectory " + dirName + "?" 76 ); 77 } 78 } 79 80 { 81 let root = await storage.getDirectory(); 82 Assert.ok(root, "Can we refresh the root directory?"); 83 84 let it = root.values(); 85 Assert.ok(!!it, "Does root have values iterator?"); 86 87 let elem = await it.next(); 88 Assert.ok(elem.done, "Is root directory empty?"); 89 } 90 }; 91 92 exported_symbols.quotaTest = async function () { 93 const storage = navigator.storage; 94 const allowCreate = { create: true }; 95 96 { 97 let root = await storage.getDirectory(); 98 Assert.ok(root, "Can we access the root directory?"); 99 100 const fileHandle = await root.getFileHandle("test.txt", allowCreate); 101 Assert.ok(!!fileHandle, "Can we get file handle?"); 102 103 const usageAtStart = await Utils.getCachedOriginUsage(); 104 Assert.ok(true, "usageAtStart: " + usageAtStart); 105 106 const writable = await fileHandle.createWritable(); 107 Assert.ok(!!writable, "Can we create writable file stream?"); 108 109 const usageAtWritableCreated = await Utils.getCachedOriginUsage(); 110 Assert.equal( 111 usageAtWritableCreated - usageAtStart, 112 0, 113 "Did usage increase when writable was created?" 114 ); 115 116 const buffer = new ArrayBuffer(42); 117 Assert.ok(!!buffer, "Can we create array buffer?"); 118 119 const result = await writable.write(buffer); 120 Assert.equal(result, undefined, "Can we write entire buffer?"); 121 122 const usageAtWriteDone = await Utils.getCachedOriginUsage(); 123 // Note: Usage should change only on close after 1824305 124 Assert.equal( 125 usageAtWriteDone - usageAtWritableCreated, 126 buffer.byteLength, 127 "Is write immediately reflected in usage?" 128 ); 129 130 await writable.close(); 131 132 const usageAtWritableClosed = await Utils.getCachedOriginUsage(); 133 134 Assert.equal( 135 usageAtWritableClosed - usageAtWritableCreated, 136 buffer.byteLength, 137 "Did usage increase by the amount of bytes written?" 138 ); 139 140 await root.removeEntry("test.txt"); 141 142 const usageAtFileDeleted = await Utils.getCachedOriginUsage(); 143 144 Assert.equal( 145 usageAtFileDeleted, 146 usageAtWritableCreated, 147 "Is usage back to the value before any writing when the file is removed?" 148 ); 149 } 150 }; 151 152 exported_symbols.pagedIterationTest = async function () { 153 const root = await navigator.storage.getDirectory(); 154 155 for await (let contentItem of root.keys()) { 156 await root.removeEntry(contentItem, { recursive: true }); 157 } 158 159 const allowCreate = { create: true }; 160 161 // When half of the buffer is iterated, a request for the second half is sent. 162 // We test that the this boundary is crossed smoothly. 163 // After the buffer is filled, a request for more items is sent. The 164 // items are placed in the first half of the buffer. 165 // This boundary should also be crossed without problems. 166 // Currently, the buffer is half-filled at 1024. 167 const itemBatch = 3 + 2 * 1024; 168 for (let i = 0; i <= itemBatch; ++i) { 169 await root.getDirectoryHandle("" + i, allowCreate); 170 } 171 172 let result = 0; 173 let sum = 0; 174 const handles = new Set(); 175 let isUnique = true; 176 for await (let [key, elem] of root.entries()) { 177 result += key.length; 178 sum += parseInt(elem.name); 179 if (handles.has(key)) { 180 // Asserting here is slow and verbose 181 isUnique = false; 182 break; 183 } 184 handles.add(key); 185 } 186 Assert.ok(isUnique); 187 Assert.equal(result, 7098); 188 Assert.equal(sum, (itemBatch * (itemBatch + 1)) / 2); 189 }; 190 191 for (const [key, value] of Object.entries(exported_symbols)) { 192 Object.defineProperty(value, "name", { 193 value: key, 194 writable: false, 195 }); 196 }