1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/content/base/test/fileutils.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,277 @@ 1.4 +// Utility functions 1.5 +var testRanCounter = 0; 1.6 +var expectedTestCount = 0; 1.7 + 1.8 +function testHasRun() { 1.9 + //alert(testRanCounter); 1.10 + ++testRanCounter; 1.11 + if (testRanCounter == expectedTestCount) { 1.12 + SimpleTest.finish(); 1.13 + } 1.14 +} 1.15 + 1.16 + 1.17 +function testFile(file, contents, test) { 1.18 + SimpleTest.requestLongerTimeout(2); 1.19 + 1.20 + // Load file using FileReader 1.21 + var r = new FileReader(); 1.22 + r.onload = getFileReaderLoadHandler(contents, contents.length, "FileReader.readAsBinaryString of " + test); 1.23 + r.readAsBinaryString(file); 1.24 + expectedTestCount++; 1.25 + 1.26 + // Load file using URL.createObjectURL and XMLHttpRequest 1.27 + var xhr = new XMLHttpRequest; 1.28 + xhr.open("GET", URL.createObjectURL(file)); 1.29 + xhr.onload = getXHRLoadHandler(contents, contents.length, false, 1.30 + "XMLHttpRequest load of " + test); 1.31 + xhr.overrideMimeType('text/plain; charset=x-user-defined'); 1.32 + xhr.send(); 1.33 + expectedTestCount++; 1.34 + 1.35 + // Send file to server using FormData and XMLHttpRequest 1.36 + xhr = new XMLHttpRequest(); 1.37 + xhr.onload = function(event) { 1.38 + checkMPSubmission(JSON.parse(event.target.responseText), 1.39 + [{ name: "hello", value: "world"}, 1.40 + { name: "myfile", 1.41 + value: contents, 1.42 + fileName: file.name || "blob", 1.43 + contentType: file.type || "application/octet-stream" }]); 1.44 + testHasRun(); 1.45 + } 1.46 + xhr.open("POST", "../../html/content/test/form_submit_server.sjs"); 1.47 + var fd = new FormData; 1.48 + fd.append("hello", "world"); 1.49 + fd.append("myfile", file); 1.50 + xhr.send(fd); 1.51 + expectedTestCount++; 1.52 + 1.53 + // Send file to server using plain XMLHttpRequest 1.54 + var xhr = new XMLHttpRequest; 1.55 + xhr.open("POST", "file_XHRSendData.sjs"); 1.56 + xhr.onload = function (event) { 1.57 + is(event.target.getResponseHeader("Result-Content-Type"), 1.58 + file.type ? file.type : null, 1.59 + "request content-type in XMLHttpRequest send of " + test); 1.60 + is(event.target.getResponseHeader("Result-Content-Length"), 1.61 + file.size, 1.62 + "request content-length in XMLHttpRequest send of " + test); 1.63 + }; 1.64 + xhr.addEventListener("load", 1.65 + getXHRLoadHandler(contents, contents.length, true, 1.66 + "XMLHttpRequest send of " + test), 1.67 + false); 1.68 + xhr.overrideMimeType('text/plain; charset=x-user-defined'); 1.69 + xhr.send(file); 1.70 + expectedTestCount++; 1.71 +} 1.72 + 1.73 +function getFileReaderLoadHandler(expectedResult, expectedLength, testName) { 1.74 + return function (event) { 1.75 + is(event.target.readyState, FileReader.DONE, 1.76 + "[FileReader] readyState in test " + testName); 1.77 + is(event.target.error, null, 1.78 + "[FileReader] no error in test " + testName); 1.79 + // Do not use |is(event.target.result, expectedResult, "...");| that may output raw binary data. 1.80 + is(event.target.result.length, expectedResult.length, 1.81 + "[FileReader] Length of result in test " + testName); 1.82 + ok(event.target.result == expectedResult, 1.83 + "[FileReader] Content of result in test " + testName); 1.84 + is(event.lengthComputable, true, 1.85 + "[FileReader] lengthComputable in test " + testName); 1.86 + is(event.loaded, expectedLength, 1.87 + "[FileReader] Loaded length in test " + testName); 1.88 + is(event.total, expectedLength, 1.89 + "[FileReader] Total length in test " + testName); 1.90 + testHasRun(); 1.91 + } 1.92 +} 1.93 + 1.94 +function getXHRLoadHandler(expectedResult, expectedLength, statusWorking, testName) { 1.95 + return function (event) { 1.96 + is(event.target.readyState, 4, 1.97 + "[XHR] readyState in test " + testName); 1.98 + if (statusWorking) { 1.99 + is(event.target.status, 200, 1.100 + "[XHR] no error in test " + testName); 1.101 + } 1.102 + else { 1.103 + todo_is(event.target.status, 200, 1.104 + "[XHR] no error in test " + testName); 1.105 + } 1.106 + // Do not use |is(convertXHRBinary(event.target.responseText), expectedResult, "...");| that may output raw binary data. 1.107 + var convertedData = convertXHRBinary(event.target.responseText); 1.108 + is(convertedData.length, expectedResult.length, 1.109 + "[XHR] Length of result in test " + testName); 1.110 + ok(convertedData == expectedResult, 1.111 + "[XHR] Content of result in test " + testName); 1.112 + is(event.lengthComputable, true, 1.113 + "[XHR] lengthComputable in test " + testName); 1.114 + is(event.loaded, expectedLength, 1.115 + "[XHR] Loaded length in test " + testName); 1.116 + is(event.total, expectedLength, 1.117 + "[XHR] Total length in test " + testName); 1.118 + 1.119 + testHasRun(); 1.120 + } 1.121 +} 1.122 + 1.123 +function convertXHRBinary(s) { 1.124 + var res = ""; 1.125 + for (var i = 0; i < s.length; ++i) { 1.126 + res += String.fromCharCode(s.charCodeAt(i) & 255); 1.127 + } 1.128 + return res; 1.129 +} 1.130 + 1.131 +function testHasRun() { 1.132 + //alert(testRanCounter); 1.133 + ++testRanCounter; 1.134 + if (testRanCounter == expectedTestCount) { 1.135 + SimpleTest.finish(); 1.136 + } 1.137 +} 1.138 + 1.139 +function createFileWithData(fileData) { 1.140 + var dirSvc = SpecialPowers.Cc["@mozilla.org/file/directory_service;1"].getService(SpecialPowers.Ci.nsIProperties); 1.141 + var testFile = dirSvc.get("ProfD", SpecialPowers.Ci.nsIFile); 1.142 + testFile.append("fileAPItestfile2-" + fileNum); 1.143 + fileNum++; 1.144 + var outStream = SpecialPowers.Cc["@mozilla.org/network/file-output-stream;1"].createInstance(SpecialPowers.Ci.nsIFileOutputStream); 1.145 + outStream.init(testFile, 0x02 | 0x08 | 0x20, // write, create, truncate 1.146 + 0666, 0); 1.147 + outStream.write(fileData, fileData.length); 1.148 + outStream.close(); 1.149 + 1.150 + var fileList = document.getElementById('fileList'); 1.151 + SpecialPowers.wrap(fileList).value = testFile.path; 1.152 + 1.153 + return fileList.files[0]; 1.154 +} 1.155 + 1.156 +function gc() { 1.157 + window.QueryInterface(SpecialPowers.Ci.nsIInterfaceRequestor) 1.158 + .getInterface(SpecialPowers.Ci.nsIDOMWindowUtils) 1.159 + .garbageCollect(); 1.160 +} 1.161 + 1.162 +function checkMPSubmission(sub, expected) { 1.163 + function getPropCount(o) { 1.164 + var x, l = 0; 1.165 + for (x in o) ++l; 1.166 + return l; 1.167 + } 1.168 + 1.169 + is(sub.length, expected.length, 1.170 + "Correct number of items"); 1.171 + var i; 1.172 + for (i = 0; i < expected.length; ++i) { 1.173 + if (!("fileName" in expected[i])) { 1.174 + is(sub[i].headers["Content-Disposition"], 1.175 + "form-data; name=\"" + expected[i].name + "\"", 1.176 + "Correct name (A)"); 1.177 + is (getPropCount(sub[i].headers), 1, 1.178 + "Wrong number of headers (A)"); 1.179 + } 1.180 + else { 1.181 + is(sub[i].headers["Content-Disposition"], 1.182 + "form-data; name=\"" + expected[i].name + "\"; filename=\"" + 1.183 + expected[i].fileName + "\"", 1.184 + "Correct name (B)"); 1.185 + is(sub[i].headers["Content-Type"], 1.186 + expected[i].contentType, 1.187 + "Correct content type (B)"); 1.188 + is (getPropCount(sub[i].headers), 2, 1.189 + "Wrong number of headers (B)"); 1.190 + } 1.191 + // Do not use |is(sub[i].body, expected[i].value, "...");| that may output raw binary data. 1.192 + is(sub[i].body.length, expected[i].value.length, 1.193 + "Length of correct value"); 1.194 + ok(sub[i].body == expected[i].value, 1.195 + "Content of correct value"); 1.196 + } 1.197 +} 1.198 + 1.199 +function testSlice(file, size, type, contents, fileType) { 1.200 + is(file.type, type, fileType + " file is correct type"); 1.201 + is(file.size, size, fileType + " file is correct size"); 1.202 + ok(file instanceof File, fileType + " file is a File"); 1.203 + ok(file instanceof Blob, fileType + " file is also a Blob"); 1.204 + 1.205 + var slice = file.slice(0, size); 1.206 + ok(slice instanceof Blob, fileType + " fullsize slice is a Blob"); 1.207 + ok(!(slice instanceof File), fileType + " fullsize slice is not a File"); 1.208 + 1.209 + slice = file.slice(0, 1234); 1.210 + ok(slice instanceof Blob, fileType + " sized slice is a Blob"); 1.211 + ok(!(slice instanceof File), fileType + " sized slice is not a File"); 1.212 + 1.213 + slice = file.slice(0, size, "foo/bar"); 1.214 + is(slice.type, "foo/bar", fileType + " fullsize slice foo/bar type"); 1.215 + 1.216 + slice = file.slice(0, 5432, "foo/bar"); 1.217 + is(slice.type, "foo/bar", fileType + " sized slice foo/bar type"); 1.218 + 1.219 + is(slice.slice(0, 10).type, "", fileType + " slice-slice type"); 1.220 + is(slice.slice(0, 10).size, 10, fileType + " slice-slice size"); 1.221 + is(slice.slice(0, 10, "hello/world").type, "hello/world", fileType + " slice-slice hello/world type"); 1.222 + is(slice.slice(0, 10, "hello/world").size, 10, fileType + " slice-slice hello/world size"); 1.223 + 1.224 + // Start, end, expected size 1.225 + var indexes = [[0, size, size], 1.226 + [0, 1234, 1234], 1.227 + [size-500, size, 500], 1.228 + [size-500, size+500, 500], 1.229 + [size+500, size+1500, 0], 1.230 + [0, 0, 0], 1.231 + [1000, 1000, 0], 1.232 + [size, size, 0], 1.233 + [undefined, undefined, size], 1.234 + [0, undefined, size], 1.235 + [100, undefined, size-100], 1.236 + [-100, undefined, 100], 1.237 + [100, -100, size-200], 1.238 + [-size-100, undefined, size], 1.239 + [-2*size-100, 500, 500], 1.240 + [0, -size-100, 0], 1.241 + [100, -size-100, 0], 1.242 + [50, -size+100, 50], 1.243 + [0, 33000, 33000], 1.244 + [1000, 34000, 33000], 1.245 + ]; 1.246 + 1.247 + for (var i = 0; i < indexes.length; ++i) { 1.248 + var sliceContents; 1.249 + var testName; 1.250 + if (indexes[i][0] == undefined) { 1.251 + slice = file.slice(); 1.252 + sliceContents = contents.slice(); 1.253 + testName = fileType + " slice()"; 1.254 + } 1.255 + else if (indexes[i][1] == undefined) { 1.256 + slice = file.slice(indexes[i][0]); 1.257 + sliceContents = contents.slice(indexes[i][0]); 1.258 + testName = fileType + " slice(" + indexes[i][0] + ")"; 1.259 + } 1.260 + else { 1.261 + slice = file.slice(indexes[i][0], indexes[i][1]); 1.262 + sliceContents = contents.slice(indexes[i][0], indexes[i][1]); 1.263 + testName = fileType + " slice(" + indexes[i][0] + ", " + indexes[i][1] + ")"; 1.264 + } 1.265 + is(slice.type, "", testName + " type"); 1.266 + is(slice.size, indexes[i][2], testName + " size"); 1.267 + is(sliceContents.length, indexes[i][2], testName + " data size"); 1.268 + testFile(slice, sliceContents, testName); 1.269 + } 1.270 + 1.271 + // Slice of slice 1.272 + var slice = file.slice(0, 40000); 1.273 + testFile(slice.slice(5000, 42000), contents.slice(5000, 40000), "file slice slice"); 1.274 + 1.275 + // ...of slice of slice 1.276 + slice = slice.slice(5000, 42000).slice(400, 700); 1.277 + SpecialPowers.gc(); 1.278 + testFile(slice, contents.slice(5400, 5700), "file slice slice slice"); 1.279 +} 1.280 +