Files
2017-06-21 09:33:06 -05:00

140 lines
3.7 KiB
JavaScript

module.exports = function(options) {
var fs = require('fs');
var path = require('path');
var request = require('request');
var inputDir = path.join(__dirname, '..', '..' , 'dist', 'e2e', 'tests');
var uploadQueue = [];
var ignoreFiles = /(\/test\/|\/ts\/|\/q\/|\/ionic-site\/|\/docs\/|\/examples\/|\/inquirer\/|\/lodash\/|\/tooling\/|\/colors\/|\/bin\/|\.ts$|\.bin|\.map$|\.md$|\.git|\.scss$|\.yml$|\.yaml$|\.dart$|\.txt|\.npm|bower|DS_Store|LICENSE)/i;
function uploadFiles(dir, urlPath) {
fs.readdir(dir, function(err, list) {
list.forEach(function(file) {
var url = path.join(urlPath, file);
fs.stat(path.join(dir, file), function(err, stat) {
if (stat && stat.isDirectory()) {
uploadFiles(path.join(dir, file), path.join(urlPath, file);
} else {
if ( shouldProcessPath (url) ){
uploadFile(url, path.join(dir, file));
}
}
});
});
});
setTimeout(postNextUpload, 100);
}
function uploadFile(archiveFileUrlPath, archiveFileLocalPath) {
uploadQueue.push({
url_path: archiveFileUrlPath,
local_path: archiveFileLocalPath,
group_id: options.groupId,
app_id: options.appId,
test_id: options.testId,
access_key: process.env.IONIC_SNAPSHOT_KEY
});
}
function postNextUpload() {
var uploadData = null;
var totalUploading = 0;
for (var i = 0; i < uploadQueue.length; i++) {
if (uploadQueue[i].status === 'uploaded') {
continue;
} else if (uploadQueue[i].status === 'uploading') {
totalUploading++;
continue;
} else {
uploadData = uploadQueue[i];
}
}
if (!uploadData || totalUploading > 20) {
return;
} else if (options.verbose) {
console.log('Uploading: ' + uploadData.url_path);
}
uploadData.status = 'uploading';
request.post({
uri: 'http://' + options.domain + '/e2e/upload-url',
formData: uploadData
},
function(err, httpResponse, body) {
if (err) {
uploadData.status = 'failed';
console.error('Get upload failed:', uploadData.url_path, err);
} else {
if (httpResponse.statusCode == 200) {
uploadE2E(body, uploadData);
} else {
console.error('Get upload error:', httpResponse.statusCode, body);
}
}
}
);
}
function uploadE2E(uploadUrl, uploadData) {
var formData = {
file: fs.createReadStream(uploadData.local_path)
};
request.post({
uri: uploadUrl,
formData: formData
},
function(err, httpResponse, body) {
setTimeout(postNextUpload, 100);
if (err) {
console.error('Upload failed:', uploadUrl, err);
uploadData.status = 'failed';
} else {
if (httpResponse.statusCode == 200) {
uploadData.status = 'uploaded';
if (options.verbose) {
console.error('Uploaded:', uploadData.url_path);
}
} else {
console.error('Upload error:', httpResponse.statusCode, body);
uploadData.status = 'failed';
}
}
}
);
}
function shouldProcessPath(urlPath) {
if ( urlPath && urlPath.length > 0 ) {
var cleanedUpString = urlPath.substring(1);
var tokens = cleanedUpString.split('/');
// {component}/test/{testName}/{file}
var extension = path.extname(cleanedUpString);
return tokens && tokens.length > 3 && tokens[1] === 'test' && ( extension === '.html' || extension === '.js' );
}
return false;
}
console.log('Uploading e2e tests:', options.testId);
uploadFiles(inputDir, '');
};