You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cordova.apache.org by ra...@apache.org on 2016/03/29 00:19:33 UTC
cordova-plugin-file-transfer git commit: CB-10782: Occasional failure
in file transfer tests causing mobilespec crash
Repository: cordova-plugin-file-transfer
Updated Branches:
refs/heads/master 584754869 -> ca6593703
CB-10782: Occasional failure in file transfer tests causing mobilespec crash
This closes #132
Project: http://git-wip-us.apache.org/repos/asf/cordova-plugin-file-transfer/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-plugin-file-transfer/commit/ca659370
Tree: http://git-wip-us.apache.org/repos/asf/cordova-plugin-file-transfer/tree/ca659370
Diff: http://git-wip-us.apache.org/repos/asf/cordova-plugin-file-transfer/diff/ca659370
Branch: refs/heads/master
Commit: ca6593703ec860863b5ac74df3b29b915fc1049d
Parents: 5847548
Author: Sarangan Rajamanickam <sa...@microsoft.com>
Authored: Mon Mar 21 15:13:38 2016 -0700
Committer: Raghav Katyal <ra...@microsoft.com>
Committed: Mon Mar 28 15:18:48 2016 -0700
----------------------------------------------------------------------
tests/tests.js | 559 ++++++++++++++++++++++++++++++++++++++--------------
1 file changed, 408 insertions(+), 151 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cordova-plugin-file-transfer/blob/ca659370/tests/tests.js
----------------------------------------------------------------------
diff --git a/tests/tests.js b/tests/tests.js
index 1a1ffbb..d5c5de6 100644
--- a/tests/tests.js
+++ b/tests/tests.js
@@ -21,7 +21,7 @@
/* global exports, cordova, FileTransfer, FileTransferError, FileUploadOptions, LocalFileSystem */
-/* global describe, it, expect, beforeEach, afterEach, spyOn, jasmine, pending */
+/* jshint jasmine: true */
exports.defineAutoTests = function () {
@@ -97,8 +97,8 @@ exports.defineAutoTests = function () {
});
describe("FileTransfer", function () {
-
- var persistentRoot, tempRoot;
+ this.persistentRoot = null;
+ this.tempRoot = null;
// named callbacks
var unexpectedCallbacks = {
@@ -135,7 +135,12 @@ exports.defineAutoTests = function () {
);
};
- var writeFile = function (fileSystem, name, content, success) {
+ var writeFile = function (fileSystem, name, content, success, done) {
+ var fileOperationFail = function() {
+ unexpectedCallbacks.fileOperationFail();
+ done();
+ };
+
fileSystem.getFile(name, { create: true },
function (fileEntry) {
fileEntry.createWriter(function (writer) {
@@ -159,7 +164,7 @@ exports.defineAutoTests = function () {
writer.write(content + "\n");
}
- }, unexpectedCallbacks.fileOperationFail);
+ }, fileOperationFail);
},
function () {
throw new Error("could not create test file '" + name + "'");
@@ -203,9 +208,11 @@ exports.defineAutoTests = function () {
// signifies a completed async call, each async call needs its own done(), and
// therefore its own beforeEach
beforeEach(function (done) {
+ var specContext = this;
+
window.requestFileSystem(LocalFileSystem.PERSISTENT, DEFAULT_FILESYSTEM_SIZE,
function (fileSystem) {
- persistentRoot = fileSystem.root;
+ specContext.persistentRoot = fileSystem.root;
done();
},
function () {
@@ -215,9 +222,11 @@ exports.defineAutoTests = function () {
});
beforeEach(function (done) {
+ var specContext = this;
+
window.requestFileSystem(LocalFileSystem.TEMPORARY, DEFAULT_FILESYSTEM_SIZE,
function (fileSystem) {
- tempRoot = fileSystem.root;
+ specContext.tempRoot = fileSystem.root;
done();
},
function () {
@@ -259,8 +268,8 @@ exports.defineAutoTests = function () {
});
it("should initialise correctly", function() {
- expect(persistentRoot).toBeDefined();
- expect(tempRoot).toBeDefined();
+ expect(this.persistentRoot).toBeDefined();
+ expect(this.tempRoot).toBeDefined();
});
it("should exist", function () {
@@ -284,26 +293,24 @@ exports.defineAutoTests = function () {
});
describe("methods", function() {
-
- var transfer;
-
- var root;
- var fileName;
- var localFilePath;
+ this.transfer = null;
+ this.root = null;
+ this.fileName = null;
+ this.localFilePath = null;
beforeEach(function() {
- transfer = new FileTransfer();
+ this.transfer = new FileTransfer();
// assign onprogress handler
- transfer.onprogress = isWP8 ? wp8OnProgressHandler : defaultOnProgressHandler;
+ this.transfer.onprogress = isWP8 ? wp8OnProgressHandler : defaultOnProgressHandler;
// spy on the onprogress handler, but still call through to it
- spyOn(transfer, "onprogress").and.callThrough();
+ spyOn(this.transfer, "onprogress").and.callThrough();
- root = persistentRoot;
- fileName = "testFile.txt";
- localFilePath = root.toURL() + fileName;
+ this.root = this.persistentRoot;
+ this.fileName = "testFile.txt";
+ this.localFilePath = this.root.toURL() + this.fileName;
});
// NOTE:
@@ -315,27 +322,28 @@ exports.defineAutoTests = function () {
describe("download", function () {
// helpers
- var verifyDownload = function (fileEntry) {
- expect(fileEntry.name).toBe(fileName);
+ var verifyDownload = function (fileEntry, specContext) {
+ expect(fileEntry.name).toBe(specContext.fileName);
};
// delete the downloaded file
afterEach(function (done) {
- deleteFile(root, fileName, done);
+ deleteFile(this.root, this.fileName, done);
});
it("ensures that test file does not exist", function (done) {
- deleteFile(root, fileName, done);
+ deleteFile(this.root, this.fileName, done);
});
it("filetransfer.spec.4 should download a file", function (done) {
var fileURL = SERVER + "/robots.txt";
+ var specContext = this;
var fileWin = function (blob) {
- if (transfer.onprogress.calls.any()) {
- var lastProgressEvent = transfer.onprogress.calls.mostRecent().args[0];
+ if (specContext.transfer.onprogress.calls.any()) {
+ var lastProgressEvent = specContext.transfer.onprogress.calls.mostRecent().args[0];
expect(lastProgressEvent.loaded).not.toBeGreaterThan(blob.size);
} else {
console.log("no progress events were emitted");
@@ -344,27 +352,43 @@ exports.defineAutoTests = function () {
done();
};
+ var fileSystemFail = function() {
+ unexpectedCallbacks.fileSystemFail();
+ done();
+ };
+
+ var downloadFail = function() {
+ unexpectedCallbacks.httpFail();
+ done();
+ };
+
var downloadWin = function (entry) {
- verifyDownload(entry);
+ verifyDownload(entry, specContext);
// verify the FileEntry representing this file
- entry.file(fileWin, unexpectedCallbacks.fileSystemFail);
+ entry.file(fileWin, fileSystemFail);
};
- transfer.download(fileURL, localFilePath, downloadWin, unexpectedCallbacks.httpFail);
+ specContext.transfer.download(fileURL, specContext.localFilePath, downloadWin, downloadFail);
}, DOWNLOAD_TIMEOUT);
it("filetransfer.spec.5 should download a file using http basic auth", function (done) {
var fileURL = SERVER_WITH_CREDENTIALS + "/download_basic_auth";
+ var specContext = this;
var downloadWin = function (entry) {
- verifyDownload(entry);
+ verifyDownload(entry, specContext);
+ done();
+ };
+
+ var downloadFail = function() {
+ unexpectedCallbacks.httpFail();
done();
};
- transfer.download(fileURL, localFilePath, downloadWin, unexpectedCallbacks.httpFail);
+ specContext.transfer.download(fileURL, specContext.localFilePath, downloadWin, downloadFail);
}, DOWNLOAD_TIMEOUT);
it("filetransfer.spec.6 should get 401 status on http basic auth failure", function (done) {
@@ -379,7 +403,12 @@ exports.defineAutoTests = function () {
done();
};
- transfer.download(fileURL, localFilePath, unexpectedCallbacks.httpWin, downloadFail, null,
+ var downloadWin = function() {
+ unexpectedCallbacks.httpWin();
+ done();
+ };
+
+ this.transfer.download(fileURL, this.localFilePath, downloadWin, downloadFail, null,
{
headers: {
"If-Modified-Since": "Thu, 19 Mar 2015 00:00:00 GMT"
@@ -396,6 +425,7 @@ exports.defineAutoTests = function () {
}
var fileURL = window.location.protocol + "//" + window.location.pathname.replace(/ /g, "%20");
+ var specContext = this;
if (!/^file:/.exec(fileURL) && cordova.platformId !== "blackberry10") {
if (cordova.platformId === "windowsphone") {
@@ -406,22 +436,43 @@ exports.defineAutoTests = function () {
}
var downloadWin = function (entry) {
- verifyDownload(entry);
+ verifyDownload(entry, specContext);
done();
};
- transfer.download(fileURL, localFilePath, downloadWin, unexpectedCallbacks.httpFail);
+ var downloadFail = function() {
+ unexpectedCallbacks.httpFail();
+ done();
+ };
+
+ specContext.transfer.download(fileURL, specContext.localFilePath, downloadWin, downloadFail);
}, DOWNLOAD_TIMEOUT);
it("filetransfer.spec.8 should download a file using https://", function (done) {
var fileURL = "https://www.apache.org/licenses/";
+ var specContext = this;
+
+ var downloadFail = function() {
+ unexpectedCallbacks.httpFail();
+ done();
+ };
+
+ var fileOperationFail = function() {
+ unexpectedCallbacks.fileOperationFail();
+ done();
+ };
+
+ var fileSystemFail = function() {
+ unexpectedCallbacks.fileSystemFail();
+ done();
+ };
var fileWin = function (file) {
var reader = new FileReader();
- reader.onerror = unexpectedCallbacks.fileOperationFail;
+ reader.onerror = fileOperationFail;
reader.onload = function () {
expect(reader.result).toMatch(/The Apache Software Foundation/);
done();
@@ -431,58 +482,84 @@ exports.defineAutoTests = function () {
};
var downloadWin = function (entry) {
- verifyDownload(entry);
- entry.file(fileWin, unexpectedCallbacks.fileSystemFail);
+ verifyDownload(entry, specContext);
+ entry.file(fileWin, fileSystemFail);
};
- transfer.download(fileURL, localFilePath, downloadWin, unexpectedCallbacks.httpFail);
+ specContext.transfer.download(fileURL, specContext.localFilePath, downloadWin, downloadFail);
}, DOWNLOAD_TIMEOUT);
it("filetransfer.spec.11 should call the error callback on abort()", function (done) {
var fileURL = "http://cordova.apache.org/downloads/BlueZedEx.mp3";
fileURL = fileURL + "?q=" + (new Date()).getTime();
+ var specContext = this;
- transfer.download(fileURL, localFilePath, unexpectedCallbacks.httpWin, done);
+ var downloadWin = function () {
+ unexpectedCallbacks.httpWin();
+ done();
+ };
+
+ specContext.transfer.download(fileURL, specContext.localFilePath, downloadWin, done);
setTimeout(function() {
- transfer.abort();
+ specContext.transfer.abort();
}, ABORT_DELAY);
}, DOWNLOAD_TIMEOUT);
it("filetransfer.spec.9 should not leave partial file due to abort", function (done) {
var fileURL = "http://cordova.apache.org/downloads/logos_2.zip";
+ var specContext = this;
+
+ var fileSystemWin = function() {
+ unexpectedCallbacks.fileSystemWin();
+ done();
+ };
+
+ var downloadWin = function() {
+ unexpectedCallbacks.httpWin();
+ done();
+ };
var downloadFail = function (error) {
- expect(error.code).toBe(FileTransferError.ABORT_ERR);
- expect(transfer.onprogress).toHaveBeenCalled();
+ var result = (error.code === FileTransferError.ABORT_ERR || error.code === FileTransferError.CONNECTION_ERR)? true: false;
+ if (!result) {
+ fail("Expected " + error.code + " to be " + FileTransferError.ABORT_ERR + " or " + FileTransferError.CONNECTION_ERR);
+ }
+ expect(specContext.transfer.onprogress).toHaveBeenCalled();
// check that there is no file
- root.getFile(fileName, null, unexpectedCallbacks.fileSystemWin, done);
+ specContext.root.getFile(specContext.fileName, null, fileSystemWin, done);
};
// abort at the first onprogress event
- transfer.onprogress = function (event) {
+ specContext.transfer.onprogress = function (event) {
if (event.loaded > 0) {
- transfer.abort();
+ specContext.transfer.abort();
}
};
- spyOn(transfer, "onprogress").and.callThrough();
+ spyOn(specContext.transfer, "onprogress").and.callThrough();
- transfer.download(fileURL, localFilePath, unexpectedCallbacks.httpWin, downloadFail);
+ specContext.transfer.download(fileURL, specContext.localFilePath, downloadWin, downloadFail);
}, DOWNLOAD_TIMEOUT);
it("filetransfer.spec.10 should be stopped by abort() right away", function (done) {
var fileURL = "http://cordova.apache.org/downloads/BlueZedEx.mp3";
fileURL = fileURL + "?q=" + (new Date()).getTime();
+ var specContext = this;
- expect(transfer.abort).not.toThrow(); // should be a no-op.
+ expect(specContext.transfer.abort).not.toThrow(); // should be a no-op.
var startTime = +new Date();
+ var downloadWin = function() {
+ unexpectedCallbacks.httpWin();
+ done();
+ };
+
var downloadFail = function (error) {
expect(error.code).toBe(FileTransferError.ABORT_ERR);
@@ -492,14 +569,14 @@ exports.defineAutoTests = function () {
setTimeout(done, GRACE_TIME_DELTA * 2);
};
- transfer.download(fileURL, localFilePath, unexpectedCallbacks.httpWin, downloadFail);
+ specContext.transfer.download(fileURL, specContext.localFilePath, downloadWin, downloadFail);
setTimeout(function() {
- transfer.abort();
+ specContext.transfer.abort();
}, ABORT_DELAY);
// call abort() again, after a time greater than the grace period
setTimeout(function () {
- expect(transfer.abort).not.toThrow();
+ expect(specContext.transfer.abort).not.toThrow();
}, GRACE_TIME_DELTA);
}, DOWNLOAD_TIMEOUT);
@@ -522,7 +599,12 @@ exports.defineAutoTests = function () {
done();
};
- transfer.download(fileURL, localFilePath, unexpectedCallbacks.httpWin, downloadFail);
+ var downloadWin = function() {
+ unexpectedCallbacks.httpWin();
+ done();
+ };
+
+ this.transfer.download(fileURL, this.localFilePath, downloadWin, downloadFail);
}, DOWNLOAD_TIMEOUT);
it("filetransfer.spec.13 should get http body on failure", function (done) {
@@ -540,7 +622,12 @@ exports.defineAutoTests = function () {
done();
};
- transfer.download(fileURL, localFilePath, unexpectedCallbacks.httpWin, downloadFail);
+ var downloadWin = function() {
+ unexpectedCallbacks.httpWin();
+ done();
+ };
+
+ this.transfer.download(fileURL, this.localFilePath, downloadWin, downloadFail);
}, DOWNLOAD_TIMEOUT);
it("filetransfer.spec.14 should handle malformed urls", function (done) {
@@ -558,7 +645,12 @@ exports.defineAutoTests = function () {
done();
};
- transfer.download(fileURL, localFilePath, unexpectedCallbacks.httpWin, downloadFail);
+ var downloadWin = function() {
+ unexpectedCallbacks.httpWin();
+ done();
+ };
+
+ this.transfer.download(fileURL, this.localFilePath, downloadWin, downloadFail);
});
it("filetransfer.spec.15 should handle unknown host", function (done) {
@@ -569,15 +661,26 @@ exports.defineAutoTests = function () {
done();
};
+ var downloadWin = function() {
+ unexpectedCallbacks.httpWin();
+ done();
+ };
+
// turn off the onprogress handler
- transfer.onprogress = function () {};
+ this.transfer.onprogress = function () {};
- transfer.download(fileURL, localFilePath, unexpectedCallbacks.httpWin, downloadFail);
+ this.transfer.download(fileURL, this.localFilePath, downloadWin, downloadFail);
}, isWindows ? WINDOWS_UNKNOWN_HOST_TIMEOUT : DOWNLOAD_TIMEOUT);
it("filetransfer.spec.16 should handle bad file path", function (done) {
var fileURL = SERVER;
- transfer.download(fileURL, "c:\\54321", unexpectedCallbacks.httpWin, done);
+
+ var downloadWin = function() {
+ unexpectedCallbacks.httpWin();
+ done();
+ };
+
+ this.transfer.download(fileURL, "c:\\54321", downloadWin, done);
});
it("filetransfer.spec.17 progress should work with gzip encoding", function (done) {
@@ -589,13 +692,19 @@ exports.defineAutoTests = function () {
}
var fileURL = "http://www.apache.org/";
+ var specContext = this;
var downloadWin = function (entry) {
- verifyDownload(entry);
+ verifyDownload(entry, specContext);
+ done();
+ };
+
+ var downloadFail = function () {
+ unexpectedCallbacks.httpFail();
done();
};
- transfer.download(fileURL, localFilePath, downloadWin, unexpectedCallbacks.httpFail);
+ specContext.transfer.download(fileURL, specContext.localFilePath, downloadWin,downloadFail);
}, DOWNLOAD_TIMEOUT);
it("filetransfer.spec.30 downloaded file entries should have a toNativeURL method", function (done) {
@@ -628,12 +737,18 @@ exports.defineAutoTests = function () {
done();
};
- transfer.download(fileURL, localFilePath, downloadWin, unexpectedCallbacks.httpFail);
+ var downloadFail = function() {
+ unexpectedCallbacks.httpFail();
+ done();
+ };
+
+ this.transfer.download(fileURL, this.localFilePath, downloadWin, downloadFail);
}, DOWNLOAD_TIMEOUT);
it("filetransfer.spec.28 (compatibility) should be able to download a file using local paths", function (done) {
var fileURL = SERVER + "/robots.txt";
+ var specContext = this;
var unsupported = function (response) {
expectedCallbacks.unsupportedOperation(response);
@@ -641,15 +756,20 @@ exports.defineAutoTests = function () {
};
var downloadWin = function (entry) {
- verifyDownload(entry);
+ verifyDownload(entry, specContext);
done();
};
var internalFilePath;
- if (root.toInternalURL) {
- internalFilePath = root.toInternalURL() + fileName;
+ if (specContext.root.toInternalURL) {
+ internalFilePath = specContext.root.toInternalURL() + specContext.fileName;
} else {
- internalFilePath = localFilePath;
+ internalFilePath = specContext.localFilePath;
+ }
+
+ var downloadFail = function() {
+ unexpectedCallbacks.httpFail();
+ done();
}
// This is an undocumented interface to File which exists only for testing
@@ -657,7 +777,7 @@ exports.defineAutoTests = function () {
// location, we can pass that to transfer.download() to make sure that previously-stored
// paths are still valid.
cordova.exec(function (localPath) {
- transfer.download(fileURL, localPath, downloadWin, unexpectedCallbacks.httpFail);
+ specContext.transfer.download(fileURL, localPath, downloadWin, downloadFail);
}, unsupported, "File", "_getLocalFilesystemPath", [internalFilePath]);
});
@@ -677,7 +797,12 @@ exports.defineAutoTests = function () {
done();
};
- transfer.download(imageURL + "?q=" + lastModified.getTime(), localFilePath, unexpectedCallbacks.httpWin, downloadFail, null,
+ var downloadWin = function() {
+ unexpectedCallbacks.httpWin();
+ done();
+ };
+
+ this.transfer.download(imageURL + "?q=" + lastModified.getTime(), this.localFilePath, downloadWin, downloadFail, null,
{
headers: {
"If-Modified-Since": lastModified.toUTCString()
@@ -694,17 +819,38 @@ exports.defineAutoTests = function () {
var imageURL = "http://apache.org/images/feather-small.gif";
var lastModified = new Date();
+ var specContext = this;
+
+ var fileOperationFail = function() {
+ unexpectedCallbacks.fileOperationFail();
+ done();
+ };
+
+ var fileSystemFail = function() {
+ unexpectedCallbacks.fileSystemFail();
+ done();
+ };
+
+ var httpWin = function() {
+ unexpectedCallbacks.httpWin();
+ done();
+ };
+
+ var httpFail = function() {
+ unexpectedCallbacks.httpFail();
+ done();
+ };
var downloadFail = function (error) {
expect(error.http_status).toBe(304);
expect(error.code).toBe(FileTransferError.NOT_MODIFIED_ERR);
- persistentRoot.getFile(fileName, { create: false },
+ specContext.persistentRoot.getFile(specContext.fileName, { create: false },
function (entry) {
var fileWin = function (file) {
var reader = new FileReader();
- reader.onerror = unexpectedCallbacks.fileOperationFail;
+ reader.onerror = fileOperationFail;
reader.onloadend = function () {
expect(reader.result).toBeTruthy();
@@ -718,10 +864,10 @@ exports.defineAutoTests = function () {
reader.readAsBinaryString(file);
};
- entry.file(fileWin, unexpectedCallbacks.fileSystemFail);
+ entry.file(fileWin, fileSystemFail);
},
function (err) {
- expect("Could not open test file '" + fileName + "': " + JSON.stringify(err)).not.toBeDefined();
+ expect("Could not open test file '" + specContext.fileName + "': " + JSON.stringify(err)).not.toBeDefined();
done();
}
);
@@ -729,14 +875,14 @@ exports.defineAutoTests = function () {
// Adding parameters to the requests to avoid caching on iOS, which leads to 200
// instead of 304 in result of the second request. (a similar issue is described in CB-8606, CB-10088)
- transfer.download(imageURL + "?q=" + lastModified.getTime(), localFilePath, function () {
- transfer.download(imageURL + "?q=" + (lastModified.getTime() + 1), localFilePath, unexpectedCallbacks.httpWin, downloadFail, null,
+ specContext.transfer.download(imageURL + "?q=" + lastModified.getTime(), specContext.localFilePath, function () {
+ specContext.transfer.download(imageURL + "?q=" + (lastModified.getTime() + 1), specContext.localFilePath, httpWin, downloadFail, null,
{
headers: {
"If-Modified-Since": lastModified.toUTCString()
}
});
- }, unexpectedCallbacks.httpFail);
+ }, httpFail);
}, DOWNLOAD_TIMEOUT * 2);
it("filetransfer.spec.36 should handle non-UTF8 encoded download response", function (done) {
@@ -747,11 +893,27 @@ exports.defineAutoTests = function () {
}
var fileURL = SERVER + '/download_non_utf';
+ var specContext = this;
+
+ var fileOperationFail = function() {
+ unexpectedCallbacks.fileOperationFail();
+ done();
+ };
+
+ var fileSystemFail = function() {
+ unexpectedCallbacks.fileSystemFail();
+ done();
+ };
+
+ var httpFail = function() {
+ unexpectedCallbacks.httpFail();
+ done();
+ };
var fileWin = function (blob) {
- if (transfer.onprogress.calls.any()) {
- var lastProgressEvent = transfer.onprogress.calls.mostRecent().args[0];
+ if (specContext.transfer.onprogress.calls.any()) {
+ var lastProgressEvent = specContext.transfer.onprogress.calls.mostRecent().args[0];
expect(lastProgressEvent.loaded).not.toBeGreaterThan(blob.size);
} else {
console.log("no progress events were emitted");
@@ -761,7 +923,7 @@ exports.defineAutoTests = function () {
var reader = new FileReader();
- reader.onerror = unexpectedCallbacks.fileOperationFail;
+ reader.onerror = fileOperationFail;
reader.onloadend = function () {
expect(reader.result.indexOf(LATIN1_SYMBOLS)).not.toBe(-1);
done();
@@ -772,27 +934,25 @@ exports.defineAutoTests = function () {
var downloadWin = function (entry) {
- verifyDownload(entry);
+ verifyDownload(entry, specContext);
// verify the FileEntry representing this file
- entry.file(fileWin, unexpectedCallbacks.fileSystemFail);
+ entry.file(fileWin, fileSystemFail);
};
- transfer.download(fileURL, localFilePath, downloadWin, unexpectedCallbacks.httpFail);
+ specContext.transfer.download(fileURL, specContext.localFilePath, downloadWin, httpFail);
}, UPLOAD_TIMEOUT);
});
describe("upload", function() {
-
- var uploadParams;
- var uploadOptions;
-
- var fileName;
- var fileContents;
- var localFilePath;
+ this.uploadParams = null;
+ this.uploadOptions = null;
+ this.fileName = null;
+ this.fileContents = null;
+ this.localFilePath = null;
// helpers
- var verifyUpload = function (uploadResult) {
+ var verifyUpload = function (uploadResult, specContext) {
expect(uploadResult.bytesSent).toBeGreaterThan(0);
expect(uploadResult.responseCode).toBe(200);
@@ -807,45 +967,47 @@ exports.defineAutoTests = function () {
expect(obj).not.toBeNull("returned data from server should be valid json");
}
- expect(transfer.onprogress).toHaveBeenCalled();
+ expect(specContext.transfer.onprogress).toHaveBeenCalled();
};
beforeEach(function(done) {
+ var specContext = this;
- fileName = "fileToUpload.txt";
- fileContents = "upload test file";
+ specContext.fileName = "fileToUpload.txt";
+ specContext.fileContents = "upload test file";
- uploadParams = {};
- uploadParams.value1 = "test";
- uploadParams.value2 = "param";
+ specContext.uploadParams = {};
+ specContext.uploadParams.value1 = "test";
+ specContext.uploadParams.value2 = "param";
- uploadOptions = new FileUploadOptions();
- uploadOptions.fileKey = "file";
- uploadOptions.fileName = fileName;
- uploadOptions.mimeType = "text/plain";
- uploadOptions.params = uploadParams;
+ specContext.uploadOptions = new FileUploadOptions();
+ specContext.uploadOptions.fileKey = "file";
+ specContext.uploadOptions.fileName = specContext.fileName;
+ specContext.uploadOptions.mimeType = "text/plain";
+ specContext.uploadOptions.params = specContext.uploadParams;
var fileWin = function (entry) {
- localFilePath = entry.toURL();
+ specContext.localFilePath = entry.toURL();
done();
};
// create a file to upload
- writeFile(root, fileName, fileContents, fileWin);
+ writeFile(specContext.root, specContext.fileName, specContext.fileContents, fileWin, done);
});
// delete the uploaded file
afterEach(function (done) {
- deleteFile(root, fileName, done);
+ deleteFile(this.root, this.fileName, done);
});
it("filetransfer.spec.18 should be able to upload a file", function (done) {
var fileURL = SERVER + "/upload";
+ var specContext = this;
var uploadWin = function (uploadResult) {
- verifyUpload(uploadResult);
+ verifyUpload(uploadResult, specContext);
if (cordova.platformId === "ios") {
expect(uploadResult.headers).toBeDefined("Expected headers to be defined.");
@@ -855,27 +1017,39 @@ exports.defineAutoTests = function () {
done();
};
+ var uploadFail = function() {
+ unexpectedCallbacks.httpFail();
+ done();
+ };
+
// NOTE: removing uploadOptions cause Android to timeout
- transfer.upload(localFilePath, fileURL, uploadWin, unexpectedCallbacks.httpFail, uploadOptions);
+ specContext.transfer.upload(specContext.localFilePath, fileURL, uploadWin, uploadFail, specContext.uploadOptions);
}, UPLOAD_TIMEOUT);
it("filetransfer.spec.19 should be able to upload a file with http basic auth", function (done) {
var fileURL = SERVER_WITH_CREDENTIALS + "/upload_basic_auth";
+ var specContext = this;
var uploadWin = function (uploadResult) {
- verifyUpload(uploadResult);
+ verifyUpload(uploadResult, specContext);
+ done();
+ };
+
+ var uploadFail = function() {
+ unexpectedCallbacks.httpFail();
done();
};
// NOTE: removing uploadOptions cause Android to timeout
- transfer.upload(localFilePath, fileURL, uploadWin, unexpectedCallbacks.httpFail, uploadOptions);
+ specContext.transfer.upload(specContext.localFilePath, fileURL, uploadWin, uploadFail, specContext.uploadOptions);
}, UPLOAD_TIMEOUT);
it("filetransfer.spec.21 should be stopped by abort() right away", function (done) {
var fileURL = SERVER + "/upload";
var startTime;
+ var specContext = this;
var uploadFail = function (e) {
expect(e.code).toBe(FileTransferError.ABORT_ERR);
@@ -885,24 +1059,29 @@ exports.defineAutoTests = function () {
setTimeout(done, GRACE_TIME_DELTA * 2);
};
+ var uploadWin = function() {
+ unexpectedCallbacks.httpWin();
+ done();
+ };
+
var fileWin = function () {
startTime = +new Date();
- expect(transfer.abort).not.toThrow();
+ expect(specContext.transfer.abort).not.toThrow();
// NOTE: removing uploadOptions cause Android to timeout
- transfer.upload(localFilePath, fileURL, unexpectedCallbacks.httpWin, uploadFail, uploadOptions);
+ specContext.transfer.upload(specContext.localFilePath, fileURL, uploadWin, uploadFail, specContext.uploadOptions);
setTimeout(function() {
- transfer.abort();
+ specContext.transfer.abort();
}, ABORT_DELAY);
setTimeout(function () {
- expect(transfer.abort).not.toThrow();
+ expect(specContext.transfer.abort).not.toThrow();
}, GRACE_TIME_DELTA);
};
- writeFile(root, fileName, new Array(200000).join("aborttest!"), fileWin);
+ writeFile(specContext.root, specContext.fileName, new Array(200000).join("aborttest!"), fileWin, done);
}, UPLOAD_TIMEOUT);
it("filetransfer.spec.22 should get http status and body on failure", function (done) {
@@ -915,7 +1094,12 @@ exports.defineAutoTests = function () {
done();
};
- transfer.upload(localFilePath, fileURL, unexpectedCallbacks.httpWin, uploadFail, uploadOptions);
+ var uploadWin = function() {
+ unexpectedCallbacks.httpWin();
+ done();
+ };
+
+ this.transfer.upload(this.localFilePath, fileURL, uploadWin, uploadFail, this.uploadOptions);
}, UPLOAD_TIMEOUT);
it("filetransfer.spec.24 should handle malformed urls", function (done) {
@@ -928,7 +1112,12 @@ exports.defineAutoTests = function () {
done();
};
- transfer.upload(localFilePath, fileURL, unexpectedCallbacks.httpWin, uploadFail, {});
+ var uploadWin = function() {
+ unexpectedCallbacks.httpWin();
+ done();
+ };
+
+ this.transfer.upload(this.localFilePath, fileURL, uploadWin, uploadFail, {});
});
it("filetransfer.spec.25 should handle unknown host", function (done) {
@@ -941,7 +1130,12 @@ exports.defineAutoTests = function () {
done();
};
- transfer.upload(localFilePath, fileURL, unexpectedCallbacks.httpWin, uploadFail, {});
+ var uploadWin = function() {
+ unexpectedCallbacks.httpWin();
+ done();
+ };
+
+ this.transfer.upload(this.localFilePath, fileURL, uploadWin, uploadFail, {});
}, UPLOAD_TIMEOUT);
it("filetransfer.spec.25 should handle missing file", function (done) {
@@ -954,7 +1148,12 @@ exports.defineAutoTests = function () {
done();
};
- transfer.upload("does_not_exist.txt", fileURL, unexpectedCallbacks.httpWin, uploadFail);
+ var uploadWin = function() {
+ unexpectedCallbacks.httpWin();
+ done();
+ };
+
+ this.transfer.upload("does_not_exist.txt", fileURL, uploadWin, uploadFail);
}, UPLOAD_TIMEOUT);
it("filetransfer.spec.26 should handle bad file path", function (done) {
@@ -966,7 +1165,12 @@ exports.defineAutoTests = function () {
done();
};
- transfer.upload("c:\\54321", fileURL, unexpectedCallbacks.httpWin, uploadFail);
+ var uploadWin = function() {
+ unexpectedCallbacks.httpWin();
+ done();
+ };
+
+ this.transfer.upload("c:\\54321", fileURL, uploadWin, uploadFail);
});
it("filetransfer.spec.27 should be able to set custom headers", function (done) {
@@ -987,18 +1191,24 @@ exports.defineAutoTests = function () {
done();
};
- uploadOptions.headers = {
+ var uploadFail = function() {
+ unexpectedCallbacks.httpFail();
+ done();
+ };
+
+ this.uploadOptions.headers = {
"CustomHeader1": "CustomValue1",
"CustomHeader2": ["CustomValue2", "CustomValue3"],
};
// NOTE: removing uploadOptions cause Android to timeout
- transfer.upload(localFilePath, fileURL, uploadWin, unexpectedCallbacks.httpFail, uploadOptions);
+ this.transfer.upload(this.localFilePath, fileURL, uploadWin, uploadFail, this.uploadOptions);
}, UPLOAD_TIMEOUT);
it("filetransfer.spec.29 (compatibility) should be able to upload a file using local paths", function (done) {
var fileURL = SERVER + "/upload";
+ var specContext = this;
var unsupported = function (response) {
expectedCallbacks.unsupportedOperation(response);
@@ -1006,15 +1216,20 @@ exports.defineAutoTests = function () {
};
var uploadWin = function (uploadResult) {
- verifyUpload(uploadResult);
+ verifyUpload(uploadResult, specContext);
done();
};
+ var uploadFail = function() {
+ unexpectedCallbacks.httpFail();
+ done();
+ }
+
var internalFilePath;
- if (root.toInternalURL) {
- internalFilePath = root.toInternalURL() + fileName;
+ if (specContext.root.toInternalURL) {
+ internalFilePath = specContext.root.toInternalURL() + specContext.fileName;
} else {
- internalFilePath = localFilePath;
+ internalFilePath = specContext.localFilePath;
}
// This is an undocumented interface to File which exists only for testing
@@ -1022,17 +1237,18 @@ exports.defineAutoTests = function () {
// location, we can pass that to transfer.download() to make sure that previously-stored
// paths are still valid.
cordova.exec(function (localPath) {
- transfer.upload(localPath, fileURL, uploadWin, unexpectedCallbacks.httpFail, uploadOptions);
+ specContext.transfer.upload(localPath, fileURL, uploadWin, uploadFail, specContext.uploadOptions);
}, unsupported, "File", "_getLocalFilesystemPath", [internalFilePath]);
}, UPLOAD_TIMEOUT);
it("filetransfer.spec.31 should be able to upload a file using PUT method", function (done) {
var fileURL = SERVER + "/upload";
+ var specContext = this;
var uploadWin = function (uploadResult) {
- verifyUpload(uploadResult);
+ verifyUpload(uploadResult, specContext);
if (cordova.platformId === "ios") {
expect(uploadResult.headers).toBeDefined("Expected headers to be defined.");
@@ -1042,15 +1258,21 @@ exports.defineAutoTests = function () {
done();
};
- uploadOptions.httpMethod = "PUT";
+ var uploadFail = function() {
+ unexpectedCallbacks.httpFail();
+ done();
+ };
+
+ specContext.uploadOptions.httpMethod = "PUT";
// NOTE: removing uploadOptions cause Android to timeout
- transfer.upload(localFilePath, fileURL, uploadWin, unexpectedCallbacks.httpFail, uploadOptions);
+ specContext.transfer.upload(specContext.localFilePath, fileURL, uploadWin, uploadFail, specContext.uploadOptions);
}, UPLOAD_TIMEOUT);
it("filetransfer.spec.32 should be able to upload a file (non-multipart)", function (done) {
var fileURL = SERVER + "/upload";
+ var specContext = this;
var uploadWin = function (uploadResult) {
@@ -1058,9 +1280,9 @@ exports.defineAutoTests = function () {
expect(uploadResult.responseCode).toBe(200);
expect(uploadResult.response).toBeDefined();
if (uploadResult.response) {
- expect(uploadResult.response).toEqual(fileContents + "\n");
+ expect(uploadResult.response).toEqual(specContext.fileContents + "\n");
}
- expect(transfer.onprogress).toHaveBeenCalled();
+ expect(specContext.transfer.onprogress).toHaveBeenCalled();
if (cordova.platformId === "ios") {
expect(uploadResult.headers).toBeDefined("Expected headers to be defined.");
@@ -1070,25 +1292,31 @@ exports.defineAutoTests = function () {
done();
};
+ var uploadFail = function() {
+ unexpectedCallbacks.httpFail();
+ done();
+ };
+
// Content-Type header disables multipart
- uploadOptions.headers = {
+ specContext.uploadOptions.headers = {
"Content-Type": "text/plain"
};
// NOTE: removing uploadOptions cause Android to timeout
- transfer.upload(localFilePath, fileURL, uploadWin, unexpectedCallbacks.httpFail, uploadOptions);
+ specContext.transfer.upload(specContext.localFilePath, fileURL, uploadWin, uploadFail, specContext.uploadOptions);
}, UPLOAD_TIMEOUT);
it("filetransfer.spec.34 should not delete a file on upload error", function (done) {
var fileURL = SERVER + "/upload";
+ var specContext = this;
var uploadFail = function (e) {
expect(e.code).toBe(FileTransferError.ABORT_ERR);
- expect(transfer.onprogress).toHaveBeenCalled();
+ expect(specContext.transfer.onprogress).toHaveBeenCalled();
// check that the file is there
- root.getFile(fileName, null, function(entry) {
+ specContext.root.getFile(specContext.fileName, null, function(entry) {
expect(entry).toBeDefined();
// delay calling done() to wait for the bogus abort()
@@ -1099,24 +1327,29 @@ exports.defineAutoTests = function () {
});
};
- var fileWin = function () {
+ var uploadWin = function() {
+ unexpectedCallbacks.httpWin();
+ done();
+ };
- expect(transfer.abort).not.toThrow();
+ var fileWin = function () {
- // NOTE: removing uploadOptions cause Android to timeout
- transfer.upload(localFilePath, fileURL, unexpectedCallbacks.httpWin, uploadFail, uploadOptions);
+ expect(specContext.transfer.abort).not.toThrow();
// abort at the first onprogress event
- transfer.onprogress = function (event) {
+ specContext.transfer.onprogress = function (event) {
if (event.loaded > 0) {
- transfer.abort();
+ specContext.transfer.abort();
}
};
- spyOn(transfer, "onprogress").and.callThrough();
+ spyOn(specContext.transfer, "onprogress").and.callThrough();
+
+ // NOTE: removing uploadOptions cause Android to timeout
+ specContext.transfer.upload(specContext.localFilePath, fileURL, uploadWin, uploadFail, specContext.uploadOptions);
};
- writeFile(root, fileName, new Array(100000).join("aborttest!"), fileWin);
+ writeFile(specContext.root, specContext.fileName, new Array(100000).join("aborttest!"), fileWin, done);
}, UPLOAD_TIMEOUT);
it("filetransfer.spec.37 should handle non-UTF8 encoded upload response", function (done) {
@@ -1127,10 +1360,11 @@ exports.defineAutoTests = function () {
}
var fileURL = SERVER + '/upload_non_utf';
+ var specContext = this;
var uploadWin = function (uploadResult) {
- verifyUpload(uploadResult);
+ verifyUpload(uploadResult, specContext);
var obj = null;
try {
@@ -1148,17 +1382,23 @@ exports.defineAutoTests = function () {
done();
};
+ var uploadFail = function() {
+ unexpectedCallbacks.httpFail();
+ done();
+ };
+
// NOTE: removing uploadOptions cause Android to timeout
- transfer.upload(localFilePath, fileURL, uploadWin, unexpectedCallbacks.httpFail, uploadOptions);
+ specContext.transfer.upload(specContext.localFilePath, fileURL, uploadWin, uploadFail, specContext.uploadOptions);
}, UPLOAD_TIMEOUT);
it("filetransfer.spec.38 should be able to upload a file using data: source uri", function (done) {
var fileURL = SERVER + "/upload";
+ var specContext = this;
var uploadWin = function (uploadResult) {
- verifyUpload(uploadResult);
+ verifyUpload(uploadResult,specContext);
var obj = null;
try {
@@ -1178,11 +1418,11 @@ exports.defineAutoTests = function () {
var dataUri = DATA_URI_PREFIX + DATA_URI_CONTENT;
// NOTE: removing uploadOptions cause Android to timeout
- transfer.upload(dataUri, fileURL, uploadWin, function (err) {
+ specContext.transfer.upload(dataUri, fileURL, uploadWin, function (err) {
console.error('err: ' + JSON.stringify(err));
expect(err).not.toBeDefined();
done();
- }, uploadOptions);
+ }, specContext.uploadOptions);
}, UPLOAD_TIMEOUT);
it("filetransfer.spec.39 should be able to upload a file using data: source uri (non-multipart)", function (done) {
@@ -1202,14 +1442,19 @@ exports.defineAutoTests = function () {
done();
};
+ var uploadFail = function() {
+ unexpectedCallbacks.httpFail();
+ done();
+ };
+
// Content-Type header disables multipart
- uploadOptions.headers = {
+ this.uploadOptions.headers = {
"Content-Type": "image/png"
};
var dataUri = DATA_URI_PREFIX + DATA_URI_CONTENT;
// NOTE: removing uploadOptions cause Android to timeout
- transfer.upload(dataUri, fileURL, uploadWin, unexpectedCallbacks.httpFail, uploadOptions);
+ this.transfer.upload(dataUri, fileURL, uploadWin, uploadFail, this.uploadOptions);
}, UPLOAD_TIMEOUT);
it("filetransfer.spec.40 should not fail to upload a file using data: source uri when the data is empty", function (done) {
@@ -1217,8 +1462,14 @@ exports.defineAutoTests = function () {
var fileURL = SERVER + "/upload";
var dataUri = DATA_URI_PREFIX;
+
+ var uploadFail = function() {
+ unexpectedCallbacks.httpFail();
+ done();
+ };
+
// NOTE: removing uploadOptions cause Android to timeout
- transfer.upload(dataUri, fileURL, done, unexpectedCallbacks.httpFail, uploadOptions);
+ this.transfer.upload(dataUri, fileURL, done, uploadFail, this.uploadOptions);
}, UPLOAD_TIMEOUT);
it("filetransfer.spec.41 should not fail to upload a file using data: source uri when the data is empty (non-multipart)", function (done) {
@@ -1226,16 +1477,22 @@ exports.defineAutoTests = function () {
var fileURL = SERVER + "/upload";
// Content-Type header disables multipart
- uploadOptions.headers = {
+ this.uploadOptions.headers = {
"Content-Type": "image/png"
};
// turn off the onprogress handler
- transfer.onprogress = function () { };
+ this.transfer.onprogress = function () { };
var dataUri = DATA_URI_PREFIX;
+
+ var uploadFail = function() {
+ unexpectedCallbacks.httpFail();
+ done();
+ };
+
// NOTE: removing uploadOptions cause Android to timeout
- transfer.upload(dataUri, fileURL, done, unexpectedCallbacks.httpFail, uploadOptions);
+ this.transfer.upload(dataUri, fileURL, done, uploadFail, this.uploadOptions);
}, UPLOAD_TIMEOUT);
});
});
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cordova.apache.org
For additional commands, e-mail: commits-help@cordova.apache.org