mirror of
https://github.com/NativeScript/NativeScript.git
synced 2025-11-05 13:26:48 +08:00
Add android definitions to check if they will get downloaded Set the language to android Attempt starting the app Add a new redirection to the testapp-runner - a runOnly verb Disable the install prompt Enable the buildOnly- and runOnly- commands Fix the version of the packages Comment cleanup code. Workflow to be reworked Install android 23 to make the app build Build the test app with the @next android runtime Add @next ability. Build with it Specify oracle java version 8 Use switcher to switch to oraclejdk8 Switch to a single step so that build breaks on first failure Reorder attempting to use higher nodejs Attempt using node 5.10.1 Detect test failure Add detection for test failures Decrease verbosity Extract the test checkers to a separate script Unignore the build folder recursively. Add the fixed script Remove the redundant node-version messages Run the tests with Api level 21
352 lines
14 KiB
JavaScript
352 lines
14 KiB
JavaScript
module.exports = {
|
|
|
|
run: function(grunt) {
|
|
var pathModule = require("path");
|
|
|
|
var modulesPackageConfig = grunt.file.readJSON('package.json');
|
|
|
|
//Construct and validate the arguments
|
|
var args = {
|
|
platform: grunt.option("platform"),
|
|
modulesPath: grunt.option("modulesPath"),
|
|
tnsPath: grunt.option("tnsPath"),
|
|
emulatorProcessIdentifier: grunt.option("emuPId"),
|
|
emuAvdName: grunt.option("avd"),
|
|
outFile: grunt.option("logFilePath"),
|
|
runtimePath: grunt.option("runtimePath"),
|
|
runtimeVersion: grunt.option("runtimeVersion"),
|
|
showEmu: grunt.option("showEmu"),
|
|
runAppOnly: grunt.option("runAppOnly"),
|
|
pathToApp: grunt.option("pathToApp")
|
|
};
|
|
|
|
(function validateInput(){
|
|
if (!(/^(Android|iOS)$/).test(args.platform)) {
|
|
throw new Error("Invalid target platform specified! Use --platform=Android|iOS");
|
|
}
|
|
|
|
if (args.platform === "Android") {
|
|
if (!args.emulatorProcessIdentifier) {
|
|
throw new Error("Please, specify an identifier of the emulator process so that it can be stopped (--emuPId=...). Too many emulators started might cause machine overload");
|
|
}
|
|
if (!args.emuAvdName) {
|
|
throw new Error("Please, specify the name of the AVD to start (--avd=...).");
|
|
}
|
|
}
|
|
|
|
if (args.runAppOnly && !args.pathToApp) {
|
|
throw new Error("runAppOnly called, but no path to application specified. Please, add the path via the (--pathToApp=...) parameter.");
|
|
}
|
|
}());
|
|
|
|
var localCfg = {
|
|
tnsPath: args.tnsPath || "tns",
|
|
emulatorProcessIdentifier: args.emulatorProcessIdentifier,
|
|
modulesPath: args.modulesPath || "./bin/dist/tns-core-modules-" + modulesPackageConfig.version + ".tgz",
|
|
emuAvdName: args.emuAvdName,
|
|
outFile: args.outFile || "./TestRunResult.txt",
|
|
frameworkArgument: args.runtimePath ? " --frameworkPath=" + args.runtimePath : "",
|
|
runtimeVersionArgument: args.runtimeVersion ? "@" + args.runtimeVersion : "",
|
|
showEmu: args.showEmu || false,
|
|
runAppOnly: args.runAppOnly || false,
|
|
|
|
workingDir:".testsapprun",
|
|
testsAppName:"TestsApp",
|
|
applicationDir: pathModule.join(".testsapprun", "TestsApp"),
|
|
appDir: pathModule.join(".testsapprun", "TestsApp", "app"),
|
|
pathToApk: "./platforms/android/build/outputs/apk/TestsApp-debug.apk",
|
|
pathToApp: "./platforms/ios/build/emulator/TestsApp.app",
|
|
deployedAppName:"org.nativescript.TestsApp",
|
|
mainActivityName:"com.tns.NativeScriptActivity",
|
|
pathToCompiledTests: "bin/dist/apps/tests",
|
|
simulatorSysLog: pathModule.join(process.env.HOME, "Library/Logs/CoreSimulator", args.emuAvdName, "/system.log"),
|
|
platform: args.platform
|
|
}
|
|
|
|
if (localCfg.runAppOnly) {
|
|
localCfg.pathToApp = localCfg.pathToApk = args.pathToApp;
|
|
localCfg.applicationDir = "./";
|
|
}
|
|
|
|
grunt.initConfig({
|
|
clean: {
|
|
workingDir: {
|
|
src: localCfg.workingDir
|
|
},
|
|
originalAppDir: {
|
|
src: [
|
|
localCfg.appDir + "/*",
|
|
"!" + pathModule.join(localCfg.appDir, "App_Resources") + ""
|
|
]
|
|
},
|
|
modules: {
|
|
src: pathModule.join(localCfg.applicationDir, "node_modules", "tns-core-modules")
|
|
},
|
|
tempExtractedModules: {
|
|
src: pathModule.join(localCfg.applicationDir, "node_modules", "package")
|
|
},
|
|
simulatorLog: {
|
|
src: localCfg.simulatorSysLog,
|
|
options: {
|
|
force: true
|
|
}
|
|
}
|
|
},
|
|
mkdir: {
|
|
workingDir: {
|
|
options: {
|
|
create: [localCfg.workingDir],
|
|
mode: 0700
|
|
}
|
|
}
|
|
},
|
|
copy: {
|
|
testsAppToRunDir: {
|
|
src: "**/*.*",
|
|
dest: localCfg.appDir,
|
|
cwd: localCfg.pathToCompiledTests,
|
|
expand: true
|
|
},
|
|
modulesToDir: {
|
|
expand: true,
|
|
src: "**/*.*",
|
|
cwd: pathModule.join(localCfg.applicationDir, "node_modules", "package"),
|
|
dest: pathModule.join(localCfg.applicationDir, "node_modules", "tns-core-modules")
|
|
},
|
|
addAndroidPermissions: {
|
|
src: "AndroidManifest.xml",
|
|
dest: localCfg.applicationDir + "/platforms/android/src/main/",
|
|
cwd: localCfg.applicationDir + "/platforms/android/src/main",
|
|
expand: true,
|
|
options: {
|
|
process: function(content, srcPath) {
|
|
var newContent = content;
|
|
|
|
var internetPermissionFinder = /((\s*)<uses-permission[^>]*android\.permission\.INTERNET[^>]*>)/;
|
|
|
|
if (!/uses-permission[^>]*android\.permission\.ACCESS_NETWORK_STATE/.test(content)) {
|
|
newContent = newContent.replace(internetPermissionFinder, "$1$2<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>");
|
|
}
|
|
if (!/uses-permission[^>]*android\.permission\.ACCESS_FINE_LOCATION/.test(content)) {
|
|
newContent = newContent.replace(internetPermissionFinder, "$1$2<uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\"/>");
|
|
}
|
|
return newContent;
|
|
}
|
|
}
|
|
},
|
|
addiOSPermissions: {
|
|
src: localCfg.testsAppName + "-Info.plist",
|
|
dest: pathModule.join(localCfg.applicationDir,"/platforms/ios/", localCfg.testsAppName) + "/",
|
|
cwd: pathModule.join(localCfg.applicationDir,"/platforms/ios/", localCfg.testsAppName),
|
|
expand: true,
|
|
options: {
|
|
process: function(content, srcPath) {
|
|
var newContent = content;
|
|
|
|
var lastDictLocator = /(<\/dict>\s*<\/plist>)$/gm;
|
|
|
|
if (!/NSAppTransportSecurity/.test(content)) {
|
|
newContent = newContent.replace(lastDictLocator, "<key>NSAppTransportSecurity</key>\n$1");
|
|
}
|
|
if (!/NSAllowsArbitraryLoads/.test(content)) {
|
|
newContent = newContent.replace(lastDictLocator, "<dict>\n<key>NSAllowsArbitraryLoads</key>\n<true/>\n</dict>\n$1");
|
|
}
|
|
return newContent;
|
|
}
|
|
}
|
|
},
|
|
simulatorLog: {
|
|
src: localCfg.simulatorSysLog,
|
|
dest: localCfg.outFile
|
|
}
|
|
},
|
|
exec: {
|
|
killAndroidEmulator: {
|
|
cmd: "pkill '" + localCfg.emulatorProcessIdentifier + "'",
|
|
exitCode: [0, 1]
|
|
},
|
|
killiOSEmulator: {
|
|
cmd: "pkill Simulator",
|
|
exitCode: [0, 1]
|
|
},
|
|
createApp: {
|
|
cmd: localCfg.tnsPath + " create " + localCfg.testsAppName,
|
|
cwd: localCfg.workingDir
|
|
},
|
|
restartAdb: {
|
|
cmd: "adb kill-server && adb start-server"
|
|
},
|
|
uninstallExistingAndroidApp: {
|
|
cmd: "adb uninstall " + localCfg.deployedAppName
|
|
},
|
|
installNewAndroidApp: {
|
|
cmd: "adb install " + localCfg.pathToApk,
|
|
cwd: localCfg.applicationDir
|
|
},
|
|
startAndroidEmulator: {
|
|
cmd: "emulator -avd " + localCfg.emuAvdName + " -no-audio " + (args.showEmu ? "" : "-no-window") + "&"
|
|
},
|
|
startAndroidApp: {
|
|
cmd: "adb shell am start -n " + localCfg.deployedAppName + "/" + localCfg.mainActivityName
|
|
},
|
|
uninstallExistingiOSApp: {
|
|
cmd: "xcrun simctl uninstall " + localCfg.emuAvdName + " org.nativescript." + localCfg.testsAppName,
|
|
cwd: localCfg.applicationDir
|
|
},
|
|
installNewiOSApp: {
|
|
cmd: "xcrun simctl install " + localCfg.emuAvdName + " " + localCfg.pathToApp,
|
|
cwd: localCfg.applicationDir
|
|
},
|
|
startiOSApp: {
|
|
cmd: "xcrun simctl launch " + localCfg.emuAvdName + " org.nativescript." + localCfg.testsAppName
|
|
}
|
|
},
|
|
untar: {
|
|
modules: {
|
|
src: localCfg.modulesPath,
|
|
dest: pathModule.join(localCfg.applicationDir, "node_modules")
|
|
}
|
|
},
|
|
shell: {
|
|
collectAndroidLog: {
|
|
command: "./expect.exp " + "'adb logcat' " + localCfg.outFile,
|
|
options: {
|
|
execOptions: {
|
|
maxBuffer: Infinity
|
|
}
|
|
}
|
|
},
|
|
waitiOSLogCompletion: {
|
|
command: "./expect.exp " + "'tail -f " + localCfg.simulatorSysLog + "' " + localCfg.outFile,
|
|
options: {
|
|
execOptions: {
|
|
maxBuffer: Infinity
|
|
}
|
|
}
|
|
},
|
|
startiOSSimulator: {
|
|
command: "xcrun instruments -w " + localCfg.emuAvdName,
|
|
options: {
|
|
failOnError: false
|
|
},
|
|
},
|
|
buildApp: {
|
|
command: "tns build " + localCfg.platform.toLowerCase(),
|
|
options: {
|
|
execOptions: {
|
|
maxBuffer: Infinity,
|
|
cwd: localCfg.applicationDir
|
|
}
|
|
}
|
|
},
|
|
addPlatform: {
|
|
command: "tns platform add " + localCfg.platform.toLowerCase() + localCfg.runtimeVersionArgument + " " + localCfg.frameworkArgument,
|
|
options: {
|
|
execOptions: {
|
|
maxBuffer: Infinity,
|
|
cwd: localCfg.applicationDir
|
|
}
|
|
}
|
|
},
|
|
}
|
|
});
|
|
|
|
grunt.loadNpmTasks("grunt-shell");
|
|
grunt.loadNpmTasks("grunt-exec");
|
|
grunt.loadNpmTasks("grunt-mkdir");
|
|
grunt.loadNpmTasks("grunt-contrib-clean");
|
|
grunt.loadNpmTasks("grunt-contrib-copy");
|
|
grunt.loadNpmTasks("grunt-untar");
|
|
|
|
var getPlatformSpecificTask = function(templatedTaskName) {
|
|
return templatedTaskName.replace(/\{platform\}/, localCfg.platform);
|
|
}
|
|
|
|
grunt.registerTask("startEmulatorAndroid", [
|
|
getPlatformSpecificTask("exec:startAndroidEmulator"),
|
|
]);
|
|
|
|
grunt.registerTask("startEmulatoriOS", [
|
|
getPlatformSpecificTask("shell:startiOSSimulator"),
|
|
]);
|
|
|
|
grunt.registerTask("collectLogAndroid", [
|
|
"shell:collectAndroidLog"
|
|
]);
|
|
|
|
grunt.registerTask("collectLogiOS", [
|
|
"shell:waitiOSLogCompletion",
|
|
"copy:simulatorLog"
|
|
]);
|
|
|
|
grunt.registerTask("doPreUninstallAppAndroid", [
|
|
"exec:restartAdb"
|
|
]);
|
|
|
|
grunt.registerTask("doPreUninstallAppiOS", [
|
|
"clean:simulatorLog"
|
|
]);
|
|
|
|
grunt.registerTask("cleanup", [
|
|
// getPlatformSpecificTask("exec:kill{platform}Emulator"),
|
|
"clean:workingDir"
|
|
]);
|
|
|
|
grunt.registerTask("buildOnly", [
|
|
"exec:createApp",
|
|
"clean:originalAppDir",
|
|
"copy:testsAppToRunDir",
|
|
"clean:modules",
|
|
"untar:modules",
|
|
"copy:modulesToDir",
|
|
"clean:tempExtractedModules",
|
|
|
|
"shell:addPlatform",
|
|
getPlatformSpecificTask("copy:add{platform}Permissions"),
|
|
"shell:buildApp",
|
|
]);
|
|
|
|
grunt.registerTask("buildTestsApp", [
|
|
"cleanup",
|
|
"mkdir:workingDir",
|
|
"buildOnly"
|
|
|
|
]);
|
|
grunt.registerTask("buildOnlyTestsApp", ["buildTestsApp"]);
|
|
|
|
grunt.registerTask("runOnly", [
|
|
// getPlatformSpecificTask("doPreUninstallApp{platform}"),
|
|
|
|
getPlatformSpecificTask("exec:uninstallExisting{platform}App"),
|
|
getPlatformSpecificTask("exec:installNew{platform}App"),
|
|
getPlatformSpecificTask("exec:start{platform}App"),
|
|
getPlatformSpecificTask("collectLog{platform}"),
|
|
]);
|
|
|
|
grunt.registerTask("runApp", [
|
|
// "cleanup",
|
|
// getPlatformSpecificTask("startEmulator{platform}"),
|
|
"runOnly",
|
|
"cleanup"
|
|
|
|
]);
|
|
|
|
grunt.registerTask("runOnlyTestsApp", ["runApp"]);
|
|
|
|
|
|
var tasksToExecute = ["runApp"];
|
|
if (!localCfg.runAppOnly) {
|
|
tasksToExecute = [
|
|
"cleanup",
|
|
"mkdir:workingDir",
|
|
getPlatformSpecificTask("startEmulator{platform}"),
|
|
"buildOnly",
|
|
"runOnly",
|
|
"cleanup"
|
|
];
|
|
}
|
|
|
|
grunt.registerTask("testsapp", tasksToExecute);
|
|
}
|
|
}
|