mirror of
https://github.com/apache/cordova-plugin-file-transfer.git
synced 2026-04-28 00:02:49 +08:00
updated ios references, added docs & tests
This commit is contained in:
@@ -0,0 +1,753 @@
|
||||
/*
|
||||
*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
describe('FileTransfer', function() {
|
||||
// https://github.com/apache/cordova-labs/tree/cordova-filetransfer
|
||||
var server = "http://cordova-filetransfer.jitsu.com";
|
||||
var server_with_credentials = "http://cordova_user:cordova_password@cordova-filetransfer.jitsu.com";
|
||||
|
||||
// deletes and re-creates the specified content
|
||||
var writeFile = function(fileName, fileContent, success, error) {
|
||||
deleteFile(fileName, function() {
|
||||
root.getFile(fileName, {create: true}, function(fileEntry) {
|
||||
fileEntry.createWriter(function (writer) {
|
||||
|
||||
writer.onwrite = function(evt) {
|
||||
success(fileEntry);
|
||||
};
|
||||
|
||||
writer.onabort = function(evt) {
|
||||
error(evt);
|
||||
};
|
||||
|
||||
writer.error = function(evt) {
|
||||
error(evt);
|
||||
};
|
||||
|
||||
writer.write(fileContent + "\n");
|
||||
}, error);
|
||||
}, error);
|
||||
});
|
||||
};
|
||||
|
||||
var readFileEntry = function(entry, success, error) {
|
||||
entry.file(function(file) {
|
||||
var reader = new FileReader();
|
||||
reader.onerror = error;
|
||||
reader.onload = function(e) {
|
||||
success(reader.result);
|
||||
};
|
||||
reader.readAsText(file);
|
||||
}, error);
|
||||
};
|
||||
|
||||
var getMalformedUrl = function() {
|
||||
if (device.platform.match(/Android/i)) {
|
||||
// bad protocol causes a MalformedUrlException on Android
|
||||
return "httpssss://example.com";
|
||||
} else {
|
||||
// iOS doesn't care about protocol, space in hostname causes error
|
||||
return "httpssss://exa mple.com";
|
||||
}
|
||||
};
|
||||
|
||||
// deletes file, if it exists, then invokes callback
|
||||
var deleteFile = function(fileName, callback) {
|
||||
callback = callback || function() {};
|
||||
var spy = jasmine.createSpy().andCallFake(callback);
|
||||
root.getFile(fileName, null,
|
||||
// remove file system entry
|
||||
function(entry) {
|
||||
entry.remove(spy, spy);
|
||||
},
|
||||
// doesn't exist
|
||||
spy);
|
||||
waitsFor(function() { return spy.wasCalled; }, Tests.TEST_TIMEOUT);
|
||||
};
|
||||
|
||||
it("filetransfer.spec.1 should exist and be constructable", function() {
|
||||
var ft = new FileTransfer();
|
||||
expect(ft).toBeDefined();
|
||||
});
|
||||
it("filetransfer.spec.2 should contain proper functions", function() {
|
||||
var ft = new FileTransfer();
|
||||
expect(typeof ft.upload).toBe('function');
|
||||
expect(typeof ft.download).toBe('function');
|
||||
});
|
||||
describe('FileTransferError', function() {
|
||||
it("filetransfer.spec.3 FileTransferError constants should be defined", function() {
|
||||
expect(FileTransferError.FILE_NOT_FOUND_ERR).toBe(1);
|
||||
expect(FileTransferError.INVALID_URL_ERR).toBe(2);
|
||||
expect(FileTransferError.CONNECTION_ERR).toBe(3);
|
||||
});
|
||||
});
|
||||
|
||||
describe('download method', function() {
|
||||
|
||||
// NOTE: if download tests are failing, check the white list
|
||||
//
|
||||
// <access origin="httpssss://example.com"/>
|
||||
// <access origin="apache.org" subdomains="true" />
|
||||
// <access origin="cordova-filetransfer.jitsu.com"/>
|
||||
|
||||
it("filetransfer.spec.4 should be able to download a file using http", function() {
|
||||
var fail = createDoNotCallSpy('downloadFail');
|
||||
var remoteFile = server + "/robots.txt"
|
||||
var localFileName = remoteFile.substring(remoteFile.lastIndexOf('/')+1);
|
||||
var lastProgressEvent = null;
|
||||
|
||||
var downloadWin = jasmine.createSpy().andCallFake(function(entry) {
|
||||
expect(entry.name).toBe(localFileName);
|
||||
expect(lastProgressEvent.loaded).toBeGreaterThan(1);
|
||||
});
|
||||
|
||||
this.after(function() {
|
||||
deleteFile(localFileName);
|
||||
});
|
||||
runs(function() {
|
||||
var ft = new FileTransfer();
|
||||
ft.onprogress = function(e) {
|
||||
lastProgressEvent = e;
|
||||
};
|
||||
ft.download(remoteFile, root.fullPath + "/" + localFileName, downloadWin, fail);
|
||||
});
|
||||
|
||||
waitsForAny(downloadWin, fail);
|
||||
});
|
||||
it("filetransfer.spec.5 should be able to download a file using http basic auth", function() {
|
||||
var fail = createDoNotCallSpy('downloadFail');
|
||||
var remoteFile = server_with_credentials + "/download_basic_auth"
|
||||
var localFileName = remoteFile.substring(remoteFile.lastIndexOf('/')+1);
|
||||
var lastProgressEvent = null;
|
||||
|
||||
var downloadWin = jasmine.createSpy().andCallFake(function(entry) {
|
||||
expect(entry.name).toBe(localFileName);
|
||||
expect(lastProgressEvent.loaded).toBeGreaterThan(1);
|
||||
});
|
||||
|
||||
this.after(function() {
|
||||
deleteFile(localFileName);
|
||||
});
|
||||
runs(function() {
|
||||
var ft = new FileTransfer();
|
||||
ft.onprogress = function(e) {
|
||||
lastProgressEvent = e;
|
||||
};
|
||||
ft.download(remoteFile, root.fullPath + "/" + localFileName, downloadWin, fail);
|
||||
});
|
||||
|
||||
waitsForAny(downloadWin, fail);
|
||||
});
|
||||
it("filetransfer.spec.6 should get http status on basic auth failure", function() {
|
||||
var downloadWin = createDoNotCallSpy('downloadWin');
|
||||
|
||||
var remoteFile = server + "/download_basic_auth";
|
||||
var localFileName = remoteFile.substring(remoteFile.lastIndexOf('/')+1);
|
||||
var downloadFail = jasmine.createSpy().andCallFake(function(error) {
|
||||
expect(error.http_status).toBe(401);
|
||||
expect(error.http_status).not.toBe(404, "Ensure " + remoteFile + " is in the white list");
|
||||
});
|
||||
|
||||
this.after(function() {
|
||||
deleteFile(localFileName);
|
||||
});
|
||||
runs(function() {
|
||||
var ft = new FileTransfer();
|
||||
ft.download(remoteFile, root.fullPath + "/" + localFileName, downloadWin, downloadFail);
|
||||
});
|
||||
|
||||
waitsForAny(downloadWin, downloadFail);
|
||||
});
|
||||
it("filetransfer.spec.7 should be able to download a file using file:// (when hosted from file://)", function() {
|
||||
var fail = createDoNotCallSpy('downloadFail');
|
||||
var remoteFile = window.location.href.replace(/\?.*/, '').replace(/ /g, '%20');
|
||||
var localFileName = remoteFile.substring(remoteFile.lastIndexOf('/')+1);
|
||||
var lastProgressEvent = null;
|
||||
|
||||
if (!/^file/.exec(remoteFile)) {
|
||||
expect(remoteFile).toMatch(/^file:/);
|
||||
return;
|
||||
}
|
||||
|
||||
var downloadWin = jasmine.createSpy().andCallFake(function(entry) {
|
||||
expect(entry.name).toBe(localFileName);
|
||||
expect(lastProgressEvent.loaded).toBeGreaterThan(1);
|
||||
});
|
||||
|
||||
this.after(function() {
|
||||
deleteFile(localFileName);
|
||||
});
|
||||
|
||||
var ft = new FileTransfer();
|
||||
ft.onprogress = function(e) {
|
||||
lastProgressEvent = e;
|
||||
};
|
||||
ft.download(remoteFile, root.fullPath + "/" + localFileName, downloadWin, fail);
|
||||
|
||||
waitsForAny(downloadWin, fail);
|
||||
});
|
||||
it("filetransfer.spec.8 should be able to download a file using https", function() {
|
||||
var remoteFile = "https://www.apache.org/licenses/";
|
||||
var localFileName = 'httpstest.html';
|
||||
var downloadFail = createDoNotCallSpy('downloadFail', 'Ensure ' + remoteFile + ' is in the white-list');
|
||||
var fileFail = createDoNotCallSpy('fileFail');
|
||||
var downloadWin = function(entry) {
|
||||
readFileEntry(entry, fileWin, fileFail);
|
||||
};
|
||||
var fileWin = jasmine.createSpy().andCallFake(function(content) {
|
||||
expect(content).toMatch(/The Apache Software Foundation/);
|
||||
});
|
||||
|
||||
this.after(function() {
|
||||
deleteFile(localFileName);
|
||||
});
|
||||
runs(function() {
|
||||
var ft = new FileTransfer();
|
||||
ft.download(remoteFile, root.fullPath + "/" + localFileName, downloadWin, downloadFail);
|
||||
});
|
||||
|
||||
waitsForAny(fileWin, downloadFail, fileFail);
|
||||
});
|
||||
it("filetransfer.spec.9 should not leave partial file due to abort", function() {
|
||||
var downloadWin = createDoNotCallSpy('downloadWin');
|
||||
var remoteFile = 'http://cordova.apache.org/downloads/logos_2.zip';
|
||||
var localFileName = remoteFile.substring(remoteFile.lastIndexOf('/')+1);
|
||||
var startTime = +new Date();
|
||||
|
||||
var downloadFail = jasmine.createSpy().andCallFake(function(e) {
|
||||
expect(e.code).toBe(FileTransferError.ABORT_ERR);
|
||||
var didNotExistSpy = jasmine.createSpy();
|
||||
var existedSpy = createDoNotCallSpy('file existed after abort');
|
||||
root.getFile(localFileName, null, existedSpy, didNotExistSpy);
|
||||
waitsForAny(didNotExistSpy, existedSpy);
|
||||
});
|
||||
|
||||
runs(function() {
|
||||
var ft = new FileTransfer();
|
||||
ft.onprogress = function(e) {
|
||||
if (e.loaded > 0) {
|
||||
ft.abort();
|
||||
}
|
||||
};
|
||||
ft.download(remoteFile, root.fullPath + "/" + localFileName, downloadWin, downloadFail);
|
||||
});
|
||||
|
||||
waitsForAny(downloadWin, downloadFail);
|
||||
});
|
||||
it("filetransfer.spec.10 should be stopped by abort() right away", function() {
|
||||
var downloadWin = createDoNotCallSpy('downloadWin');
|
||||
var remoteFile = 'http://cordova.apache.org/downloads/BlueZedEx.mp3';
|
||||
var localFileName = remoteFile.substring(remoteFile.lastIndexOf('/')+1);
|
||||
var startTime = +new Date();
|
||||
|
||||
var downloadFail = jasmine.createSpy().andCallFake(function(e) {
|
||||
expect(e.code).toBe(FileTransferError.ABORT_ERR);
|
||||
expect(new Date() - startTime).toBeLessThan(300);
|
||||
});
|
||||
|
||||
this.after(function() {
|
||||
deleteFile(localFileName);
|
||||
});
|
||||
runs(function() {
|
||||
var ft = new FileTransfer();
|
||||
ft.abort(); // should be a no-op.
|
||||
ft.download(remoteFile, root.fullPath + "/" + localFileName, downloadWin, downloadFail);
|
||||
ft.abort();
|
||||
ft.abort(); // should be a no-op.
|
||||
});
|
||||
|
||||
waitsForAny(downloadWin, downloadFail);
|
||||
});
|
||||
it("filetransfer.spec.11 should call the error callback on abort()", function() {
|
||||
var downloadWin = createDoNotCallSpy('downloadWin');
|
||||
var downloadFail = jasmine.createSpy().andCallFake(function(e) { console.log("Abort called") });
|
||||
var remoteFile = 'http://cordova.apache.org/downloads/BlueZedEx.mp3';
|
||||
var localFileName = remoteFile.substring(remoteFile.lastIndexOf('/')+1);
|
||||
var startTime = +new Date();
|
||||
|
||||
this.after(function() {
|
||||
deleteFile(localFileName);
|
||||
});
|
||||
runs(function() {
|
||||
var ft = new FileTransfer();
|
||||
ft.abort(); // should be a no-op.
|
||||
ft.download(remoteFile, root.fullPath + "/" + localFileName, downloadWin, downloadFail);
|
||||
ft.abort();
|
||||
ft.abort(); // should be a no-op.
|
||||
});
|
||||
|
||||
waitsForAny(downloadFail);
|
||||
});
|
||||
it("filetransfer.spec.12 should get http status on failure", function() {
|
||||
var downloadWin = createDoNotCallSpy('downloadWin');
|
||||
|
||||
var remoteFile = server + "/404";
|
||||
var localFileName = remoteFile.substring(remoteFile.lastIndexOf('/')+1);
|
||||
var downloadFail = jasmine.createSpy().andCallFake(function(error) {
|
||||
expect(error.http_status).toBe(404);
|
||||
expect(error.http_status).not.toBe(401, "Ensure " + remoteFile + " is in the white list");
|
||||
});
|
||||
|
||||
this.after(function() {
|
||||
deleteFile(localFileName);
|
||||
});
|
||||
runs(function() {
|
||||
var ft = new FileTransfer();
|
||||
ft.download(remoteFile, root.fullPath + "/" + localFileName, downloadWin, downloadFail);
|
||||
});
|
||||
|
||||
waitsForAny(downloadWin, downloadFail);
|
||||
});
|
||||
it("filetransfer.spec.13 should get response body on failure", function() {
|
||||
var downloadWin = createDoNotCallSpy('downloadWin');
|
||||
|
||||
var remoteFile = server + "/404";
|
||||
var localFileName = remoteFile.substring(remoteFile.lastIndexOf('/')+1);
|
||||
var downloadFail = jasmine.createSpy().andCallFake(function(error) {
|
||||
expect(error.body).toBeDefined();
|
||||
expect(error.body).toEqual('You requested a 404\n');
|
||||
});
|
||||
|
||||
this.after(function() {
|
||||
deleteFile(localFileName);
|
||||
});
|
||||
runs(function() {
|
||||
var ft = new FileTransfer();
|
||||
ft.download(remoteFile, root.fullPath + "/" + localFileName, downloadWin, downloadFail);
|
||||
});
|
||||
|
||||
waitsForAny(downloadWin, downloadFail);
|
||||
});
|
||||
it("filetransfer.spec.14 should handle malformed urls", function() {
|
||||
var downloadWin = createDoNotCallSpy('downloadWin');
|
||||
|
||||
var remoteFile = getMalformedUrl();
|
||||
var localFileName = "download_malformed_url.txt";
|
||||
var downloadFail = jasmine.createSpy().andCallFake(function(error) {
|
||||
// Note: Android needs the bad protocol to be added to the access list
|
||||
// <access origin=".*"/> won't match because ^https?:// is prepended to the regex
|
||||
// The bad protocol must begin with http to avoid automatic prefix
|
||||
expect(error.http_status).not.toBe(401, "Ensure " + remoteFile + " is in the white list");
|
||||
expect(error.code).toBe(FileTransferError.INVALID_URL_ERR);
|
||||
});
|
||||
|
||||
this.after(function() {
|
||||
deleteFile(localFileName);
|
||||
});
|
||||
runs(function() {
|
||||
var ft = new FileTransfer();
|
||||
ft.download(remoteFile, root.fullPath + "/" + localFileName, downloadWin, downloadFail);
|
||||
});
|
||||
|
||||
waitsForAny(downloadWin, downloadFail);
|
||||
});
|
||||
it("filetransfer.spec.15 should handle unknown host", function() {
|
||||
var downloadWin = createDoNotCallSpy('downloadWin');
|
||||
|
||||
var remoteFile = "http://foobar.apache.org/index.html";
|
||||
var localFileName = remoteFile.substring(remoteFile.lastIndexOf('/')+1);
|
||||
var downloadFail = jasmine.createSpy().andCallFake(function(error) {
|
||||
expect(error.code).toBe(FileTransferError.CONNECTION_ERR);
|
||||
});
|
||||
|
||||
runs(function() {
|
||||
var ft = new FileTransfer();
|
||||
ft.download(remoteFile, root.fullPath + "/" + localFileName, downloadWin, downloadFail);
|
||||
});
|
||||
|
||||
waitsForAny(downloadWin, downloadFail);
|
||||
});
|
||||
it("filetransfer.spec.16 should handle bad file path", function() {
|
||||
var downloadWin = createDoNotCallSpy('downloadWin');
|
||||
|
||||
var remoteFile = server;
|
||||
var badFilePath = "c:\\54321";
|
||||
var downloadFail = jasmine.createSpy().andCallFake(function(error) {
|
||||
expect(error.code).toBe(FileTransferError.FILE_NOT_FOUND_ERR);
|
||||
});
|
||||
|
||||
runs(function() {
|
||||
var ft = new FileTransfer();
|
||||
ft.download(remoteFile, badFilePath, downloadWin, downloadFail);
|
||||
});
|
||||
|
||||
waitsForAny(downloadWin, downloadFail);
|
||||
});
|
||||
it("filetransfer.spec.17 progress should work with gzip encoding", function() {
|
||||
var downloadFail = createDoNotCallSpy('downloadFail');
|
||||
var remoteFile = "http://www.apache.org/";
|
||||
var localFileName = "index.html";
|
||||
var lastProgressEvent = null;
|
||||
|
||||
var downloadWin = jasmine.createSpy().andCallFake(function(entry) {
|
||||
expect(entry.name).toBe(localFileName);
|
||||
expect(lastProgressEvent.loaded).toBeGreaterThan(1, 'loaded');
|
||||
expect(lastProgressEvent.total).not.toBeLessThan(lastProgressEvent.loaded);
|
||||
expect(lastProgressEvent.lengthComputable).toBe(true, 'lengthComputable');
|
||||
});
|
||||
|
||||
this.after(function() {
|
||||
deleteFile(localFileName);
|
||||
});
|
||||
runs(function() {
|
||||
var ft = new FileTransfer();
|
||||
ft.onprogress = function(e) {
|
||||
lastProgressEvent = e;
|
||||
};
|
||||
ft.download(remoteFile, root.fullPath + "/" + localFileName, downloadWin, downloadFail);
|
||||
});
|
||||
waitsForAny(downloadWin, downloadFail);
|
||||
});
|
||||
});
|
||||
describe('upload method', function() {
|
||||
it("filetransfer.spec.18 should be able to upload a file", function() {
|
||||
var remoteFile = server + "/upload";
|
||||
var localFileName = "upload.txt";
|
||||
var fileContents = 'This file should upload';
|
||||
|
||||
var fileFail = createDoNotCallSpy('fileFail');
|
||||
var uploadFail = createDoNotCallSpy('uploadFail', "Ensure " + remoteFile + " is in the white list");
|
||||
var lastProgressEvent = null;
|
||||
|
||||
var uploadWin = jasmine.createSpy().andCallFake(function(uploadResult) {
|
||||
expect(uploadResult.bytesSent).toBeGreaterThan(0);
|
||||
expect(uploadResult.responseCode).toBe(200);
|
||||
expect(uploadResult.response).toMatch(/fields:\s*{\s*value1.*/);
|
||||
});
|
||||
|
||||
var fileWin = function(fileEntry) {
|
||||
ft = new FileTransfer();
|
||||
|
||||
var options = new FileUploadOptions();
|
||||
options.fileKey = "file";
|
||||
options.fileName = localFileName;
|
||||
options.mimeType = "text/plain";
|
||||
|
||||
var params = new Object();
|
||||
params.value1 = "test";
|
||||
params.value2 = "param";
|
||||
options.params = params;
|
||||
|
||||
ft.onprogress = function(e) {
|
||||
expect(e.lengthComputable).toBe(true);
|
||||
expect(e.total).toBeGreaterThan(0);
|
||||
expect(e.loaded).toBeGreaterThan(0);
|
||||
lastProgressEvent = e;
|
||||
};
|
||||
|
||||
// removing options cause Android to timeout
|
||||
ft.upload(fileEntry.fullPath, remoteFile, uploadWin, uploadFail, options);
|
||||
};
|
||||
|
||||
this.after(function() {
|
||||
deleteFile(localFileName);
|
||||
});
|
||||
runs(function() {
|
||||
writeFile(localFileName, fileContents, fileWin, fileFail);
|
||||
});
|
||||
|
||||
waitsForAny(uploadWin, uploadFail, fileFail);
|
||||
runs(function() {
|
||||
expect(lastProgressEvent).not.toBeNull('expected progress events');
|
||||
});
|
||||
});
|
||||
it("filetransfer.spec.19 should be able to upload a file with http basic auth", function() {
|
||||
var remoteFile = server_with_credentials + "/upload_basic_auth";
|
||||
var localFileName = "upload.txt";
|
||||
var fileContents = 'This file should upload';
|
||||
|
||||
var fileFail = createDoNotCallSpy('fileFail');
|
||||
var uploadFail = createDoNotCallSpy('uploadFail', "Ensure " + remoteFile + " is in the white list");
|
||||
var lastProgressEvent = null;
|
||||
|
||||
var uploadWin = jasmine.createSpy().andCallFake(function(uploadResult) {
|
||||
expect(uploadResult.bytesSent).toBeGreaterThan(0);
|
||||
expect(uploadResult.responseCode).toBe(200);
|
||||
expect(uploadResult.response).toMatch(/fields:\s*{\s*value1.*/);
|
||||
});
|
||||
|
||||
var fileWin = function(fileEntry) {
|
||||
ft = new FileTransfer();
|
||||
|
||||
var options = new FileUploadOptions();
|
||||
options.fileKey = "file";
|
||||
options.fileName = localFileName;
|
||||
options.mimeType = "text/plain";
|
||||
|
||||
var params = new Object();
|
||||
params.value1 = "test";
|
||||
params.value2 = "param";
|
||||
options.params = params;
|
||||
|
||||
ft.onprogress = function(e) {
|
||||
expect(e.lengthComputable).toBe(true);
|
||||
expect(e.total).toBeGreaterThan(0);
|
||||
expect(e.loaded).toBeGreaterThan(0);
|
||||
lastProgressEvent = e;
|
||||
};
|
||||
|
||||
// removing options cause Android to timeout
|
||||
ft.upload(fileEntry.fullPath, remoteFile, uploadWin, uploadFail, options);
|
||||
};
|
||||
|
||||
this.after(function() {
|
||||
deleteFile(localFileName);
|
||||
});
|
||||
runs(function() {
|
||||
writeFile(localFileName, fileContents, fileWin, fileFail);
|
||||
});
|
||||
|
||||
waitsForAny(uploadWin, uploadFail, fileFail);
|
||||
runs(function() {
|
||||
expect(lastProgressEvent).not.toBeNull('expected progress events');
|
||||
});
|
||||
});
|
||||
it("filetransfer.spec.6 should get http status on basic auth failure", function() {
|
||||
var fileFail = createDoNotCallSpy('fileFail');
|
||||
var uploadWin = createDoNotCallSpy('uploadWin');
|
||||
|
||||
var remoteFile = server + "/upload_basic_auth";
|
||||
var localFileName = "upload_expect_fail.txt";
|
||||
var uploadFail = jasmine.createSpy().andCallFake(function(error) {
|
||||
expect(error.http_status).toBe(401);
|
||||
expect(error.http_status).not.toBe(404, "Ensure " + remoteFile + " is in the white list");
|
||||
});
|
||||
|
||||
var fileWin = function(fileEntry) {
|
||||
var ft = new FileTransfer();
|
||||
|
||||
var options = new FileUploadOptions();
|
||||
options.fileKey="file";
|
||||
options.fileName=fileEntry.name;
|
||||
options.mimeType="text/plain";
|
||||
|
||||
ft.upload(fileEntry.fullPath, remoteFile, uploadWin, uploadFail, options);
|
||||
};
|
||||
|
||||
this.after(function() {
|
||||
deleteFile(localFileName);
|
||||
});
|
||||
runs(function() {
|
||||
writeFile(localFileName, "this file should fail to upload", fileWin, fileFail);
|
||||
});
|
||||
|
||||
waitsForAny(uploadWin, uploadFail, fileFail);
|
||||
});
|
||||
it("filetransfer.spec.21 should be stopped by abort() right away.", function() {
|
||||
var remoteFile = server + "/upload";
|
||||
var localFileName = "upload.txt";
|
||||
|
||||
var fileFail = createDoNotCallSpy('fileFail');
|
||||
var uploadWin = createDoNotCallSpy('uploadWin', 'Should have been aborted');
|
||||
var startTime;
|
||||
|
||||
var uploadFail = jasmine.createSpy().andCallFake(function(e) {
|
||||
expect(e.code).toBe(FileTransferError.ABORT_ERR);
|
||||
expect(new Date() - startTime).toBeLessThan(300);
|
||||
});
|
||||
|
||||
var fileWin = function(fileEntry) {
|
||||
ft = new FileTransfer();
|
||||
|
||||
var options = new FileUploadOptions();
|
||||
options.fileKey = "file";
|
||||
options.fileName = localFileName;
|
||||
options.mimeType = "text/plain";
|
||||
|
||||
startTime = +new Date();
|
||||
// removing options cause Android to timeout
|
||||
ft.abort(); // should be a no-op.
|
||||
ft.upload(fileEntry.fullPath, remoteFile, uploadWin, uploadFail, options);
|
||||
ft.abort();
|
||||
ft.abort(); // should be a no-op.
|
||||
};
|
||||
|
||||
this.after(function() {
|
||||
deleteFile(localFileName);
|
||||
});
|
||||
runs(function() {
|
||||
writeFile(localFileName, new Array(10000).join('aborttest!'), fileWin, fileFail);
|
||||
});
|
||||
|
||||
waitsForAny(uploadWin, uploadFail, fileFail);
|
||||
});
|
||||
it("filetransfer.spec.12 should get http status on failure", function() {
|
||||
var fileFail = createDoNotCallSpy('fileFail');
|
||||
var uploadWin = createDoNotCallSpy('uploadWin');
|
||||
|
||||
var remoteFile = server + "/403";
|
||||
var localFileName = "upload_expect_fail.txt";
|
||||
var uploadFail = jasmine.createSpy().andCallFake(function(error) {
|
||||
expect(error.http_status).toBe(403);
|
||||
expect(error.http_status).not.toBe(401, "Ensure " + remoteFile + " is in the white list");
|
||||
});
|
||||
|
||||
var fileWin = function(fileEntry) {
|
||||
var ft = new FileTransfer();
|
||||
|
||||
var options = new FileUploadOptions();
|
||||
options.fileKey="file";
|
||||
options.fileName=fileEntry.name;
|
||||
options.mimeType="text/plain";
|
||||
|
||||
ft.upload(fileEntry.fullPath, remoteFile, uploadWin, uploadFail, options);
|
||||
};
|
||||
|
||||
this.after(function() {
|
||||
deleteFile(localFileName);
|
||||
});
|
||||
runs(function() {
|
||||
writeFile(localFileName, "this file should fail to upload", fileWin, fileFail);
|
||||
});
|
||||
|
||||
waitsForAny(uploadWin, uploadFail, fileFail);
|
||||
});
|
||||
it("filetransfer.spec.14 should handle malformed urls", function() {
|
||||
var fileFail = createDoNotCallSpy('fileFail');
|
||||
var uploadWin = createDoNotCallSpy('uploadWin');
|
||||
|
||||
var remoteFile = getMalformedUrl();
|
||||
var localFileName = "malformed_url.txt";
|
||||
var uploadFail = jasmine.createSpy().andCallFake(function(error) {
|
||||
expect(error.code).toBe(FileTransferError.INVALID_URL_ERR);
|
||||
expect(error.http_status).not.toBe(401, "Ensure " + remoteFile + " is in the white list");
|
||||
});
|
||||
var fileWin = function(fileEntry) {
|
||||
var ft = new FileTransfer();
|
||||
ft.upload(fileEntry.fullPath, remoteFile, uploadWin, uploadFail, {});
|
||||
};
|
||||
|
||||
this.after(function() {
|
||||
deleteFile(localFileName);
|
||||
});
|
||||
runs(function() {
|
||||
writeFile(localFileName, "Some content", fileWin, fileFail);
|
||||
});
|
||||
|
||||
waitsForAny(uploadWin, uploadFail, fileFail);
|
||||
});
|
||||
it("filetransfer.spec.15 should handle unknown host", function() {
|
||||
var fileFail = createDoNotCallSpy('fileFail');
|
||||
var uploadWin = createDoNotCallSpy('uploadWin');
|
||||
|
||||
var remoteFile = "http://foobar.apache.org/robots.txt";
|
||||
var localFileName = remoteFile.substring(remoteFile.lastIndexOf('/')+1);
|
||||
var uploadFail = jasmine.createSpy().andCallFake(function(error) {
|
||||
expect(error.code).toBe(FileTransferError.CONNECTION_ERR);
|
||||
expect(error.http_status).not.toBe(401, "Ensure " + remoteFile + " is in the white list");
|
||||
});
|
||||
var fileWin = function(fileEntry) {
|
||||
var ft = new FileTransfer();
|
||||
ft.upload(fileEntry.fullPath, remoteFile, uploadWin, uploadFail, {});
|
||||
};
|
||||
|
||||
this.after(function() {
|
||||
deleteFile(localFileName);
|
||||
});
|
||||
runs(function() {
|
||||
writeFile(localFileName, "# allow all", fileWin, fileFail);
|
||||
});
|
||||
|
||||
waitsForAny(uploadWin, uploadFail, fileFail);
|
||||
});
|
||||
it("filetransfer.spec.25 should handle missing file", function() {
|
||||
var uploadWin = createDoNotCallSpy('uploadWin');
|
||||
|
||||
var remoteFile = server + "/upload";
|
||||
var localFileName = "does_not_exist.txt";
|
||||
|
||||
var uploadFail = jasmine.createSpy().andCallFake(function(error) {
|
||||
expect(error.code).toBe(FileTransferError.FILE_NOT_FOUND_ERR);
|
||||
expect(error.http_status).not.toBe(401, "Ensure " + remoteFile + " is in the white list");
|
||||
});
|
||||
|
||||
runs(function() {
|
||||
var ft = new FileTransfer();
|
||||
ft.upload(root.fullPath + "/" + localFileName, remoteFile, uploadWin, uploadFail);
|
||||
});
|
||||
|
||||
waitsForAny(uploadWin, uploadFail);
|
||||
});
|
||||
it("filetransfer.spec.16 should handle bad file path", function() {
|
||||
var uploadWin = createDoNotCallSpy('uploadWin');
|
||||
|
||||
var remoteFile = server + "/upload";
|
||||
|
||||
var uploadFail = jasmine.createSpy().andCallFake(function(error) {
|
||||
expect(error.code).toBe(FileTransferError.FILE_NOT_FOUND_ERR);
|
||||
expect(error.http_status).not.toBe(401, "Ensure " + remoteFile + " is in the white list");
|
||||
});
|
||||
|
||||
runs(function() {
|
||||
var ft = new FileTransfer();
|
||||
ft.upload("/usr/local/bad/file/path.txt", remoteFile, uploadWin, uploadFail);
|
||||
});
|
||||
|
||||
waitsForAny(uploadWin, uploadFail);
|
||||
});
|
||||
it("filetransfer.spec.27 should be able to set custom headers", function() {
|
||||
var remoteFile = "http://whatheaders.com";
|
||||
var localFileName = "upload.txt";
|
||||
|
||||
var fileFail = function() {};
|
||||
var uploadFail = createDoNotCallSpy('uploadFail', "Ensure " + remoteFile + " is in the white list and that Content-Length header is being set.");
|
||||
|
||||
var uploadWin = jasmine.createSpy().andCallFake(function(uploadResult) {
|
||||
expect(uploadResult.bytesSent).toBeGreaterThan(0);
|
||||
expect(uploadResult.responseCode).toBe(200);
|
||||
expect(uploadResult.response).toBeDefined();
|
||||
var responseHtml = decodeURIComponent(uploadResult.response);
|
||||
expect(responseHtml).toMatch(/CustomHeader1[\s\S]*CustomValue1/i);
|
||||
expect(responseHtml).toMatch(/CustomHeader2[\s\S]*CustomValue2[\s\S]*CustomValue3/i, "Should allow array values");
|
||||
});
|
||||
|
||||
var fileWin = function(fileEntry) {
|
||||
ft = new FileTransfer();
|
||||
|
||||
var options = new FileUploadOptions();
|
||||
options.fileKey = "file";
|
||||
options.fileName = localFileName;
|
||||
options.mimeType = "text/plain";
|
||||
|
||||
var params = new Object();
|
||||
params.value1 = "test";
|
||||
params.value2 = "param";
|
||||
options.params = params;
|
||||
options.headers = {
|
||||
"CustomHeader1": "CustomValue1",
|
||||
"CustomHeader2": ["CustomValue2", "CustomValue3"],
|
||||
};
|
||||
|
||||
// removing options cause Android to timeout
|
||||
ft.upload(fileEntry.fullPath, remoteFile, uploadWin, uploadFail, options);
|
||||
};
|
||||
|
||||
this.after(function() {
|
||||
deleteFile(localFileName);
|
||||
});
|
||||
runs(function() {
|
||||
writeFile(localFileName, "this file should upload", fileWin, fileFail);
|
||||
});
|
||||
|
||||
waitsForAny(uploadWin, uploadFail);
|
||||
});
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user