/test/unit/azure/chunked-uploads.js

https://github.com/vaibhav011286/file-uploader · JavaScript · 346 lines · 273 code · 46 blank · 27 comment · 10 complexity · a156ad8424e5033fa9f235624f729291 MD5 · raw file

  1. /* globals describe, beforeEach, $fixture, qq, assert, it, qqtest, helpme, purl */
  2. describe("azure chunked upload tests", function() {
  3. "use strict";
  4. if (qqtest.canDownloadFileAsBlob) {
  5. var fileTestHelper = helpme.setupFileTests(),
  6. testContainerEndpoint = "https://azureaccount.blob.core.windows.net/testContainer",
  7. expectedFileSize = 3266,
  8. expectedChunks = 2,
  9. chunkSize = Math.round(expectedFileSize / expectedChunks),
  10. typicalChunkingOption = {
  11. enabled: true,
  12. partSize: chunkSize,
  13. minFileSize: expectedFileSize
  14. };
  15. describe("server-side signature-based chunked Azure upload tests", function() {
  16. var startTypicalTest = function(uploader, callback) {
  17. qqtest.downloadFileAsBlob("up.jpg", "image/jpeg").then(function (blob) {
  18. var signatureRequest, signatureRequestPurl;
  19. fileTestHelper.mockXhr();
  20. uploader.addFiles({name: "test.jpg", blob: blob});
  21. assert.equal(fileTestHelper.getRequests().length, 1, "Wrong # of requests");
  22. signatureRequest = fileTestHelper.getRequests()[0];
  23. assert.equal(signatureRequest.method, "GET");
  24. signatureRequestPurl = purl(signatureRequest.url);
  25. assert.equal(signatureRequestPurl.attr("path"), testSignatureEndoint);
  26. callback(signatureRequest, signatureRequestPurl);
  27. });
  28. },
  29. testSignatureEndoint = "/signature",
  30. typicalRequestOption = {
  31. endpoint: testContainerEndpoint
  32. },
  33. typicalSignatureOption = {
  34. endpoint: testSignatureEndoint
  35. };
  36. it("does not chunk if file is too small", function(done) {
  37. assert.expect(8, done);
  38. var uploader = new qq.azure.FineUploaderBasic({
  39. request: typicalRequestOption,
  40. signature: typicalSignatureOption,
  41. chunking: {
  42. enabled: true,
  43. partSize: typicalChunkingOption.partSize,
  44. minFileSize: expectedFileSize + 1
  45. }
  46. }
  47. );
  48. startTypicalTest(uploader, function(signatureRequest, signatureRequestPurl) {
  49. var expectedSasUri = "http://sasuri.com",
  50. uploadRequest;
  51. // signature request for upload part 1
  52. assert.equal(signatureRequestPurl.param("_method"), "PUT");
  53. assert.equal(signatureRequestPurl.param("bloburi"), testContainerEndpoint + "/" + uploader.getBlobName(0));
  54. signatureRequest.respond(200, null, expectedSasUri);
  55. // upload request
  56. assert.equal(fileTestHelper.getRequests().length, 2);
  57. uploadRequest = fileTestHelper.getRequests()[1];
  58. assert.equal(uploadRequest.method, "PUT");
  59. assert.equal(uploadRequest.url, expectedSasUri);
  60. });
  61. });
  62. it("handles a basic chunked upload", function(done) {
  63. assert.expect(57, done);
  64. var uploadChunkCalled = false,
  65. uploadChunkSuccessCalled = false,
  66. verifyChunkData = function(onUploadChunkSuccess, chunkData) {
  67. if (onUploadChunkSuccess && uploadChunkSuccessCalled || !onUploadChunkSuccess && uploadChunkCalled) {
  68. assert.equal(chunkData.partIndex, 1);
  69. assert.equal(chunkData.startByte, chunkSize + 1);
  70. assert.equal(chunkData.endByte, expectedFileSize);
  71. assert.equal(chunkData.totalParts, 2);
  72. }
  73. else {
  74. if (onUploadChunkSuccess) {
  75. uploadChunkSuccessCalled = true;
  76. }
  77. else {
  78. uploadChunkCalled = true;
  79. }
  80. assert.equal(chunkData.partIndex, 0);
  81. assert.equal(chunkData.startByte, 1);
  82. assert.equal(chunkData.endByte, chunkSize);
  83. assert.equal(chunkData.totalParts, 2);
  84. }
  85. },
  86. uploader = new qq.azure.FineUploaderBasic({
  87. request: typicalRequestOption,
  88. signature: typicalSignatureOption,
  89. chunking: typicalChunkingOption,
  90. callbacks: {
  91. onComplete: function(id, name, response, xhr) {
  92. assert.equal(id, 0, "Wrong ID passed to onComplete");
  93. assert.equal(name, uploader.getName(0), "Wrong name passed to onComplete");
  94. assert.ok(response, "Null response passed to onComplete");
  95. assert.ok(xhr, "Null XHR passed to onComplete");
  96. },
  97. onUploadChunk: function(id, name, chunkData) {
  98. //should be called twice each (1 for each chunk)
  99. assert.equal(id, 0, "Wrong ID passed to onUploadChunk");
  100. assert.equal(name, uploader.getName(0), "Wrong name passed to onUploadChunk");
  101. verifyChunkData(false, chunkData);
  102. },
  103. onUploadChunkSuccess: function(id, chunkData, response, xhr) {
  104. //should be called twice each (1 for each chunk)
  105. assert.equal(id, 0, "Wrong ID passed to onUploadChunkSuccess");
  106. assert.ok(response, "Null response passed to onUploadChunkSuccess");
  107. assert.ok(xhr, "Null XHR passed to onUploadChunkSuccess");
  108. verifyChunkData(true, chunkData);
  109. }
  110. }
  111. }
  112. );
  113. startTypicalTest(uploader, function(signatureRequest, signatureRequestPurl) {
  114. var expectedSasUri = "http://sasuri.com",
  115. uploadRequest, putBlockListRequest;
  116. // signature request for upload part 1
  117. assert.equal(signatureRequestPurl.param("_method"), "PUT");
  118. assert.equal(signatureRequestPurl.param("bloburi"), testContainerEndpoint + "/" + uploader.getBlobName(0));
  119. signatureRequest.respond(200, null, expectedSasUri);
  120. // upload part 1 request
  121. assert.equal(fileTestHelper.getRequests().length, 2);
  122. uploadRequest = fileTestHelper.getRequests()[1];
  123. assert.ok(!uploadRequest.requestHeaders["x-ms-meta-qqfilename"]);
  124. assert.equal(uploadRequest.method, "PUT");
  125. assert.equal(uploadRequest.url, expectedSasUri + "&comp=block&blockid=" + encodeURIComponent(btoa("00000")));
  126. uploadRequest.respond(201, null, null);
  127. // signature request for upload part 2
  128. assert.equal(fileTestHelper.getRequests().length, 3);
  129. signatureRequest = fileTestHelper.getRequests()[2];
  130. assert.equal(signatureRequest.method, "GET");
  131. signatureRequestPurl = purl(signatureRequest.url);
  132. assert.equal(signatureRequestPurl.param("_method"), "PUT");
  133. assert.equal(signatureRequestPurl.param("bloburi"), testContainerEndpoint + "/" + uploader.getBlobName(0));
  134. signatureRequest.respond(200, null, expectedSasUri);
  135. // upload part 2 request
  136. assert.equal(fileTestHelper.getRequests().length, 4);
  137. uploadRequest = fileTestHelper.getRequests()[3];
  138. assert.ok(!uploadRequest.requestHeaders["x-ms-meta-qqfilename"]);
  139. assert.equal(uploadRequest.method, "PUT");
  140. assert.equal(uploadRequest.url, expectedSasUri + "&comp=block&blockid=" + encodeURIComponent(btoa("00001")));
  141. uploadRequest.respond(201, null, null);
  142. // signature request for put block list
  143. assert.equal(fileTestHelper.getRequests().length, 5);
  144. signatureRequest = fileTestHelper.getRequests()[4];
  145. assert.equal(signatureRequest.method, "GET");
  146. signatureRequestPurl = purl(signatureRequest.url);
  147. assert.equal(signatureRequestPurl.param("_method"), "PUT");
  148. assert.equal(signatureRequestPurl.param("bloburi"), testContainerEndpoint + "/" + uploader.getBlobName(0));
  149. signatureRequest.respond(200, null, expectedSasUri);
  150. // put block list request
  151. assert.equal(fileTestHelper.getRequests().length, 6);
  152. putBlockListRequest = fileTestHelper.getRequests()[5];
  153. assert.equal(putBlockListRequest.method, "PUT");
  154. assert.equal(putBlockListRequest.url, expectedSasUri + "&comp=blocklist");
  155. assert.equal(putBlockListRequest.requestHeaders["x-ms-blob-content-type"], "image/jpeg");
  156. assert.equal(putBlockListRequest.requestHeaders["x-ms-meta-qqfilename"], uploader.getName(0));
  157. putBlockListRequest.respond(201, null, null);
  158. assert.equal(uploader.getUploads()[0].status, qq.status.UPLOAD_SUCCESSFUL);
  159. });
  160. });
  161. it("handles failures at every step of a chunked upload", function(done) {
  162. assert.expect(71, done);
  163. var uploader = new qq.azure.FineUploaderBasic({
  164. request: typicalRequestOption,
  165. signature: typicalSignatureOption,
  166. chunking: typicalChunkingOption,
  167. callbacks: {
  168. onComplete: function(id, name, response) {
  169. onCompleteCallbacks++;
  170. if (onCompleteCallbacks < 7) {
  171. assert.ok(!response.success);
  172. }
  173. else {
  174. assert.ok(response.success);
  175. }
  176. },
  177. onManualRetry: function(id, name) {
  178. //expected to be called once for each retry
  179. assert.equal(id, 0);
  180. assert.equal(name, uploader.getName(0));
  181. }
  182. }
  183. }
  184. ),
  185. onCompleteCallbacks = 0;
  186. startTypicalTest(uploader, function(signatureRequest, signatureRequestPurl) {
  187. var expectedSasUri = "http://sasuri.com",
  188. uploadRequest, putBlockListRequest;
  189. assert.equal(uploader.getUploads()[0].status, qq.status.UPLOADING);
  190. // failing signature request for upload part 1
  191. assert.equal(signatureRequestPurl.param("bloburi"), testContainerEndpoint + "/" + uploader.getBlobName(0));
  192. signatureRequest.respond(500, null, null);
  193. assert.equal(fileTestHelper.getRequests().length, 1);
  194. assert.equal(uploader.getUploads()[0].status, qq.status.UPLOAD_FAILED);
  195. uploader.retry(0);
  196. assert.equal(fileTestHelper.getRequests().length, 2);
  197. assert.equal(uploader.getUploads()[0].status, qq.status.UPLOADING);
  198. // successful signature request for upload part 1
  199. signatureRequest = fileTestHelper.getRequests()[1];
  200. signatureRequestPurl = purl(signatureRequest.url);
  201. assert.equal(signatureRequestPurl.param("bloburi"), testContainerEndpoint + "/" + uploader.getBlobName(0));
  202. signatureRequest.respond(200, null, expectedSasUri);
  203. // failing upload part 1 request
  204. assert.equal(fileTestHelper.getRequests().length, 3);
  205. uploadRequest = fileTestHelper.getRequests()[2];
  206. assert.equal(uploadRequest.url, expectedSasUri + "&comp=block&blockid=" + encodeURIComponent(btoa("00000")));
  207. uploadRequest.respond(404, null, null);
  208. assert.equal(uploader.getUploads()[0].status, qq.status.UPLOAD_FAILED);
  209. uploader.retry(0);
  210. assert.equal(fileTestHelper.getRequests().length, 4);
  211. assert.equal(uploader.getUploads()[0].status, qq.status.UPLOADING);
  212. // successful signature request for upload part 1
  213. signatureRequest = fileTestHelper.getRequests()[3];
  214. signatureRequestPurl = purl(signatureRequest.url);
  215. assert.equal(signatureRequestPurl.param("bloburi"), testContainerEndpoint + "/" + uploader.getBlobName(0));
  216. signatureRequest.respond(200, null, expectedSasUri);
  217. // successful upload part 1 request
  218. assert.equal(fileTestHelper.getRequests().length, 5);
  219. uploadRequest = fileTestHelper.getRequests()[4];
  220. assert.equal(uploadRequest.url, expectedSasUri + "&comp=block&blockid=" + encodeURIComponent(btoa("00000")));
  221. uploadRequest.respond(201, null, null);
  222. // failing signature request for upload part 2
  223. assert.equal(fileTestHelper.getRequests().length, 6);
  224. signatureRequest = fileTestHelper.getRequests()[5];
  225. signatureRequestPurl = purl(signatureRequest.url);
  226. assert.equal(signatureRequestPurl.param("bloburi"), testContainerEndpoint + "/" + uploader.getBlobName(0));
  227. signatureRequest.respond(500, null, null);
  228. assert.equal(fileTestHelper.getRequests().length, 6);
  229. assert.equal(uploader.getUploads()[0].status, qq.status.UPLOAD_FAILED);
  230. uploader.retry(0);
  231. assert.equal(fileTestHelper.getRequests().length, 7);
  232. assert.equal(uploader.getUploads()[0].status, qq.status.UPLOADING);
  233. // successful signature request for upload part 2
  234. signatureRequest = fileTestHelper.getRequests()[6];
  235. signatureRequestPurl = purl(signatureRequest.url);
  236. assert.equal(signatureRequestPurl.param("bloburi"), testContainerEndpoint + "/" + uploader.getBlobName(0));
  237. signatureRequest.respond(200, null, expectedSasUri);
  238. // failing upload part 2 request
  239. assert.equal(fileTestHelper.getRequests().length, 8);
  240. uploadRequest = fileTestHelper.getRequests()[7];
  241. assert.equal(uploadRequest.url, expectedSasUri + "&comp=block&blockid=" + encodeURIComponent(btoa("00001")));
  242. uploadRequest.respond(404, null, null);
  243. assert.equal(uploader.getUploads()[0].status, qq.status.UPLOAD_FAILED);
  244. uploader.retry(0);
  245. assert.equal(fileTestHelper.getRequests().length, 9);
  246. assert.equal(uploader.getUploads()[0].status, qq.status.UPLOADING);
  247. // successful signature request for upload part 1
  248. signatureRequest = fileTestHelper.getRequests()[8];
  249. signatureRequestPurl = purl(signatureRequest.url);
  250. assert.equal(signatureRequestPurl.param("bloburi"), testContainerEndpoint + "/" + uploader.getBlobName(0));
  251. signatureRequest.respond(200, null, expectedSasUri);
  252. // successful upload part 2 request
  253. assert.equal(fileTestHelper.getRequests().length, 10);
  254. uploadRequest = fileTestHelper.getRequests()[9];
  255. assert.equal(uploadRequest.method, "PUT");
  256. assert.equal(uploadRequest.url, expectedSasUri + "&comp=block&blockid=" + encodeURIComponent(btoa("00001")));
  257. uploadRequest.respond(201, null, null);
  258. // failing signature request for put block list
  259. assert.equal(fileTestHelper.getRequests().length, 11);
  260. signatureRequest = fileTestHelper.getRequests()[10];
  261. signatureRequestPurl = purl(signatureRequest.url);
  262. assert.equal(signatureRequestPurl.param("bloburi"), testContainerEndpoint + "/" + uploader.getBlobName(0));
  263. signatureRequest.respond(500, null, null);
  264. assert.equal(fileTestHelper.getRequests().length, 11);
  265. assert.equal(uploader.getUploads()[0].status, qq.status.UPLOAD_FAILED);
  266. uploader.retry(0);
  267. assert.equal(fileTestHelper.getRequests().length, 12);
  268. assert.equal(uploader.getUploads()[0].status, qq.status.UPLOADING);
  269. // successful signature request for put block list
  270. signatureRequest = fileTestHelper.getRequests()[11];
  271. signatureRequestPurl = purl(signatureRequest.url);
  272. assert.equal(signatureRequestPurl.param("bloburi"), testContainerEndpoint + "/" + uploader.getBlobName(0));
  273. signatureRequest.respond(200, null, expectedSasUri);
  274. // failing put block list request
  275. assert.equal(fileTestHelper.getRequests().length, 13);
  276. putBlockListRequest = fileTestHelper.getRequests()[12];
  277. assert.equal(putBlockListRequest.url, expectedSasUri + "&comp=blocklist");
  278. assert.equal(putBlockListRequest.requestHeaders["x-ms-blob-content-type"], "image/jpeg");
  279. putBlockListRequest.respond(404, null, null);
  280. assert.equal(uploader.getUploads()[0].status, qq.status.UPLOAD_FAILED);
  281. uploader.retry(0);
  282. assert.equal(fileTestHelper.getRequests().length, 14);
  283. assert.equal(uploader.getUploads()[0].status, qq.status.UPLOADING);
  284. // successful signature request for put block list
  285. signatureRequest = fileTestHelper.getRequests()[13];
  286. signatureRequestPurl = purl(signatureRequest.url);
  287. assert.equal(signatureRequestPurl.param("bloburi"), testContainerEndpoint + "/" + uploader.getBlobName(0));
  288. signatureRequest.respond(200, null, expectedSasUri);
  289. // successful put block list request
  290. assert.equal(fileTestHelper.getRequests().length, 15);
  291. putBlockListRequest = fileTestHelper.getRequests()[14];
  292. assert.equal(putBlockListRequest.url, expectedSasUri + "&comp=blocklist");
  293. assert.equal(putBlockListRequest.requestHeaders["x-ms-blob-content-type"], "image/jpeg");
  294. putBlockListRequest.respond(201, null, null);
  295. assert.equal(uploader.getUploads()[0].status, qq.status.UPLOAD_SUCCESSFUL);
  296. });
  297. });
  298. });
  299. }
  300. });