test_writableFileStream.js (8002B)
1 /* Any copyright is dedicated to the Public Domain. 2 http://creativecommons.org/publicdomain/zero/1.0/ */ 3 4 const allowCreate = { create: true }; 5 const denyCreate = { create: false }; 6 7 exported_symbols.test0 = async function () { 8 let root = await navigator.storage.getDirectory(); 9 Assert.ok(!!root, "Can we access the root directory?"); 10 11 const testFile = await root.getFileHandle("test.txt", allowCreate); 12 Assert.ok(!!testFile, "Can't access existing file"); 13 let writable = await testFile.createWritable(); 14 Assert.ok(!!writable, "Can't create WritableFileStream to existing file"); 15 16 // Write a sentence to the end of the file. 17 const encoder = new TextEncoder(); 18 const writeBuffer = encoder.encode("Thank you for reading this."); 19 try { 20 dump("Trying to write...\n"); 21 await writable.write(writeBuffer); 22 dump("closing...\n"); 23 await writable.close(); 24 } catch (e) { 25 Assert.ok(false, "Couldn't write to WritableFileStream: " + e); 26 } 27 28 // Read it back 29 // Get size of the file. 30 let file = await testFile.getFile(); 31 Assert.ok( 32 !!file, 33 "Can't create File to file written with WritableFileStream" 34 ); 35 let fileSize = file.size; 36 Assert.ok(fileSize == writeBuffer.byteLength); 37 }; 38 39 exported_symbols.quotaTest = async function () { 40 const shrinkedStorageSizeKB = 5 * 1024; 41 const defaultDatabaseSize = 491547; 42 43 // Shrink storage size to 5MB. 44 await Utils.shrinkStorageSize(shrinkedStorageSizeKB); 45 46 let root = await navigator.storage.getDirectory(); 47 Assert.ok(root, "Can we access the root directory?"); 48 49 // Fill entire storage. 50 const fileHandle = await root.getFileHandle("test.txt", allowCreate); 51 Assert.ok(!!fileHandle, "Can we get file handle?"); 52 53 const writable = await fileHandle.createWritable(); 54 Assert.ok(!!writable, "Can we create writable file stream?"); 55 56 const buffer = new ArrayBuffer( 57 shrinkedStorageSizeKB * 1024 - defaultDatabaseSize 58 ); 59 Assert.ok(!!buffer, "Can we create array buffer?"); 60 61 const result = await writable.write(buffer); 62 Assert.equal(result, undefined, "Can we write entire buffer?"); 63 64 // Try to write one more byte. 65 const fileHandle2 = await root.getFileHandle("test2.txt", allowCreate); 66 Assert.ok(!!fileHandle2, "Can we get file handle?"); 67 68 const writable2 = await fileHandle2.createWritable(); 69 Assert.ok(!!writable2, "Can we create writable file stream?"); 70 71 const buffer2 = new ArrayBuffer(1); 72 Assert.ok(!!buffer2, "Can we create array buffer?"); 73 74 try { 75 await writable2.write(buffer2); 76 Assert.ok(false, "Should have thrown"); 77 } catch (ex) { 78 Assert.ok(true, "Did throw"); 79 Assert.ok(DOMException.isInstance(ex), "Threw DOMException"); 80 Assert.equal(ex.name, "QuotaExceededError", "Threw right DOMException"); 81 } 82 83 await writable.close(); 84 // writable2 is already closed because of the failed write above 85 86 await Utils.restoreStorageSize(); 87 }; 88 89 exported_symbols.bug1823445 = async function () { 90 const root = await navigator.storage.getDirectory(); 91 const testFileName = "test1823445.txt"; 92 let handle = await root.getFileHandle(testFileName, allowCreate); 93 let writable = await handle.createWritable(); 94 await writable.write("abcdefghijklmnop"); 95 await writable.close(); 96 97 handle = await root.getFileHandle(testFileName); 98 writable = await handle.createWritable({ keepExistingData: false }); 99 await writable.write("12345"); 100 await writable.close(); 101 102 handle = await root.getFileHandle(testFileName); 103 const file = await handle.getFile(); 104 const text = await file.text(); 105 Assert.equal(text, "12345"); 106 }; 107 108 exported_symbols.bug1824993 = async function () { 109 const root = await navigator.storage.getDirectory(); 110 const testFileName = "test1824993.txt"; 111 const handle = await root.getFileHandle(testFileName, allowCreate); 112 { 113 const writable = await handle.createWritable(); 114 await writable.write("test"); 115 116 { 117 const file = await handle.getFile(); 118 const contents = await file.text(); 119 Assert.equal(contents, ""); 120 } 121 122 await writable.abort(); 123 } 124 125 const file = await handle.getFile(); 126 const contents = await file.text(); 127 Assert.equal(contents, ""); 128 }; 129 130 exported_symbols.bug1825018 = async function () { 131 const root = await navigator.storage.getDirectory(); 132 const testFileName = "test1825018.txt"; 133 const handle = await root.getFileHandle(testFileName, allowCreate); 134 const writable = await handle.createWritable(); 135 try { 136 await writable.write({ type: "truncate" }); 137 } catch (e) { 138 // Called write without size throws an error as expected 139 } 140 141 try { 142 await writable.abort(); 143 await root.removeEntry(testFileName); 144 } catch (e) { 145 Assert.ok(false, e.message); 146 } 147 }; 148 149 exported_symbols.usageTest = async function () { 150 const bufferSize = 1024; 151 const keepData = { keepExistingData: true }; 152 const fromEmpty = { keepExistingData: false }; 153 154 let root = await navigator.storage.getDirectory(); 155 Assert.ok(root, "Can we access the root directory?"); 156 157 const baseUsage = await Utils.getCachedOriginUsage(); 158 Assert.ok(true, "Usage " + baseUsage); 159 // Create a file. 160 { 161 const fileHandle = await root.getFileHandle("usagetest.txt", allowCreate); 162 Assert.ok(!!fileHandle, "Can we get file handle?"); 163 164 const writable = await fileHandle.createWritable(fromEmpty); 165 Assert.ok(!!writable, "Can we create writable file stream?"); 166 167 const buffer = new ArrayBuffer(bufferSize); 168 Assert.ok(!!buffer, "Can we create array buffer?"); 169 170 const result = await writable.write(buffer); 171 Assert.equal(result, undefined, "Can we write entire buffer?"); 172 173 await writable.close(); 174 } 175 176 { 177 const fileUsage = await Utils.getCachedOriginUsage(); 178 Assert.ok(true, "Usage " + fileUsage); 179 Assert.ok(fileUsage >= baseUsage + bufferSize); 180 181 const fileHandle = await root.getFileHandle("usagetest.txt", denyCreate); 182 Assert.ok(!!fileHandle, "Can we get file handle?"); 183 184 { 185 const usageNow = await Utils.getCachedOriginUsage(); 186 Assert.equal(usageNow, fileUsage); 187 } 188 189 const writableA = await fileHandle.createWritable(keepData); 190 Assert.ok(!!writableA, "Can we create writable file stream?"); 191 192 { 193 const usageNow = await Utils.getCachedOriginUsage(); 194 Assert.ok(true, "Usage " + usageNow.usage); 195 Assert.equal(usageNow, fileUsage + bufferSize); 196 } 197 198 const writableB = await fileHandle.createWritable(keepData); 199 Assert.ok(!!writableB, "Can we create writable file stream?"); 200 201 { 202 const usageNow = await Utils.getCachedOriginUsage(); 203 Assert.equal(usageNow, fileUsage + 2 * bufferSize); 204 } 205 206 const writableC = await fileHandle.createWritable(keepData); 207 Assert.ok(!!writableC, "Can we create writable file stream?"); 208 209 { 210 const usageNow = await Utils.getCachedOriginUsage(); 211 Assert.equal(usageNow, fileUsage + 3 * bufferSize); 212 } 213 214 const writableD = await fileHandle.createWritable(fromEmpty); 215 Assert.ok(!!writableD, "Can we create writable file stream?"); 216 217 { 218 const usageNow = await Utils.getCachedOriginUsage(); 219 // We did not keep existing data for this writable 220 Assert.equal(usageNow, fileUsage + 3 * bufferSize); 221 } 222 223 await writableA.abort(); 224 225 { 226 const usageNow = await Utils.getCachedOriginUsage(); 227 Assert.equal(usageNow, fileUsage + 2 * bufferSize); 228 } 229 230 await writableB.close(); 231 232 { 233 const usageNow = await Utils.getCachedOriginUsage(); 234 Assert.equal(usageNow, fileUsage + bufferSize); 235 } 236 237 await writableC.abort(); 238 239 { 240 const usageNow = await Utils.getCachedOriginUsage(); 241 Assert.equal(usageNow, fileUsage); 242 } 243 244 await writableD.close(); 245 246 { 247 const usageNow = await Utils.getCachedOriginUsage(); 248 // Buffer was overwritten with nothing. 249 Assert.equal(usageNow, fileUsage - bufferSize); 250 } 251 } 252 }; 253 254 for (const [key, value] of Object.entries(exported_symbols)) { 255 Object.defineProperty(value, "name", { 256 value: key, 257 writable: false, 258 }); 259 }