blob: 6f2359d986820fa817016bb0a92ac3d4cb3e8984 [file] [log] [blame]
/*
*
* 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.
*
*/
var path = require("path"),
util = require("util"),
fs = require("fs"),
childProcess = require("child_process"),
wrench = require("wrench"),
srcPath = __dirname + "/../../../../../templates/project/cordova/lib/",
nativePkgr = require(srcPath + "/native-packager"),
pkgrUtils = require(srcPath + "/packager-utils"),
testUtils = require("./test-utilities"),
testData = require("./test-data"),
logger = require(srcPath + "logger"),
localize = require(srcPath + "/localize"),
conf = require(srcPath + "./conf"),
callback,
config,
session,
target,
result,
orgDebugEnabled,
orgDebugTokenPath,
NL = pkgrUtils.isWindows() ? "\r\n" : "\n";
describe("Native packager", function () {
beforeEach(function () {
process.env.CORDOVA_BBTOOLS = "";
callback = jasmine.createSpy();
config = testData.config;
session = testData.session;
target = session.targets[0];
result = {
stdout: {
on: jasmine.createSpy()
},
stderr: {
on: jasmine.createSpy()
},
on: function (eventName, callback) {
callback(0);
}
};
// Store original debug token setting and later restore them in afterEach
// to be able to test positive and negative cases of each.
orgDebugEnabled = session.debug;
orgDebugTokenPath = session.conf.DEBUG_TOKEN;
spyOn(wrench, "readdirSyncRecursive").andReturn(["abc", "xyz"]);
spyOn(fs, "statSync").andReturn({
isDirectory: function () {
return false;
}
});
spyOn(fs, "writeFileSync");
spyOn(childProcess, "spawn").andReturn(result);
spyOn(fs, "existsSync").andCallFake(function (path) {
//Return true if this is the bbndk folder check
return path.indexOf("bbndk") !== -1;
});
});
afterEach(function () {
session.debug = orgDebugEnabled;
session.conf.DEBUG_TOKEN = orgDebugTokenPath;
});
it("should not display empty messages in logger", function () {
spyOn(pkgrUtils, "writeFile");
spyOn(logger, "warn");
spyOn(logger, "error");
spyOn(logger, "info");
nativePkgr.exec(session, target, testData.config, callback);
expect(logger.warn).not.toHaveBeenCalledWith("");
expect(logger.error).not.toHaveBeenCalledWith("");
expect(logger.info).not.toHaveBeenCalledWith("");
});
it("shows debug token warning when path to file is not valid", function () {
spyOn(pkgrUtils, "writeFile");
spyOn(logger, "warn");
session.debug = true;
//Current time will ensure that the file doesn't exist.
session.conf.DEBUG_TOKEN = new Date().getTime() + ".bar";
nativePkgr.exec(session, target, testData.config, callback);
expect(logger.warn).toHaveBeenCalled();
});
it("won't show debug token warning when -d options wasn't provided", function () {
spyOn(pkgrUtils, "writeFile");
spyOn(logger, "warn");
session.debug = false;
//Current time will ensure that the file doesn't exist.
session.conf.DEBUG_TOKEN = new Date().getTime() + ".bar";
nativePkgr.exec(session, target, testData.config, callback);
expect(logger.warn).not.toHaveBeenCalled();
});
it("exec blackberry-nativepackager", function () {
var bbTabletXML = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
"<qnx><id>" + config.id + "</id>" +
"<versionNumber>" + config.version + "</versionNumber>" +
"<author>" + config.author + "</author>" +
"<asset entry=\"true\" type=\"qnx/elf\">wwe</asset>" +
"<asset>abc</asset>" +
"<asset>xyz</asset>" +
"<entryPointType>Qnx/WebKit</entryPointType>" +
"<cascadesTheme>" + config.theme + "</cascadesTheme>" +
"<initialWindow><systemChrome>none</systemChrome><transparent>true</transparent><autoOrients>true</autoOrients></initialWindow>",
bbTabletXML2 = "<permission system=\"true\">run_native</permission>" +
"<permission system=\"false\">access_internet</permission>" +
"<name>" + config.name['default'] + "</name>" +
"<description>" + config.description['default'] + "</description></qnx>",
cmd = "blackberry-nativepackager" + (pkgrUtils.isWindows() ? ".bat" : "");
spyOn(pkgrUtils, "writeFile").andCallFake(function (sourceDir, outputDir, data) {
expect(sourceDir).toEqual(session.sourceDir);
expect(outputDir).toEqual(conf.BAR_DESCRIPTOR);
//We have to validate the xml data in 2 chucks, because the WEBWORKS_VERSION env variable
//has a different value for SCM builds and we can't mock the webworks-info file
expect(data).toContain(bbTabletXML);
expect(data).toContain(bbTabletXML2);
});
nativePkgr.exec(session, target, testData.config, callback);
expect(fs.writeFileSync).toHaveBeenCalledWith(jasmine.any(String), jasmine.any(String));
expect(childProcess.spawn).toHaveBeenCalledWith(cmd, ["@../options"], {"cwd": session.sourceDir, "env": process.env});
expect(callback).toHaveBeenCalledWith(0);
});
it("makes sure slog2 logging is enabled in debug mode", function () {
var tabletXMLEntry = "<env value=\"slog2\" var=\"CONSOLE_MODE\"></env>";
//Silence the logger during unit tests
spyOn(logger, "warn").andCallFake(function () { });
spyOn(pkgrUtils, "writeFile").andCallFake(function (sourceDir, outputDir, data) {
expect(data).toContain(tabletXMLEntry);
});
session.debug = true;
nativePkgr.exec(session, target, testData.config, callback);
});
it("makes sure slog2 logging is not enabled when not in debug mode", function () {
var tabletXMLEntry = "<env value=\"slog2\" var=\"CONSOLE_MODE\"></env>";
spyOn(pkgrUtils, "writeFile").andCallFake(function (sourceDir, outputDir, data) {
expect(data).not.toContain(tabletXMLEntry);
});
session.debug = false;
nativePkgr.exec(session, target, testData.config, callback);
});
it("can process application name", function () {
var config = testUtils.cloneObj(testData.config);
config.name = {"default": "API Smoke Test"};
spyOn(pkgrUtils, "writeFile").andCallFake(function (fileLocation, fileName, fileData) {
expect(fileData).toContain("<name>API Smoke Test</name>");
});
nativePkgr.exec(session, target, config, callback);
});
it("can process localized application name", function () {
var config = testUtils.cloneObj(testData.config);
config.name = {"FR": "API Smoke Test - FR"};
spyOn(pkgrUtils, "writeFile").andCallFake(function (fileLocation, fileName, fileData) {
expect(fileData).toContain('<name><text xml:lang="FR">API Smoke Test - FR</text></name>');
});
nativePkgr.exec(session, target, config, callback);
});
it("can process mutiple application names", function () {
var config = testUtils.cloneObj(testData.config);
config.name = {
"default": "API Smoke Test",
"EN": "API Smoke Test - EN",
"FR": "API Smoke Test - FR"
};
spyOn(pkgrUtils, "writeFile").andCallFake(function (fileLocation, fileName, fileData) {
expect(fileData).toContain('<name>API Smoke Test<text xml:lang="EN">API Smoke Test - EN</text><text xml:lang="FR">API Smoke Test - FR</text></name>');
});
nativePkgr.exec(session, target, config, callback);
});
it("can process application description", function () {
var config = testUtils.cloneObj(testData.config);
config.description = {"default": "My app description"};
spyOn(pkgrUtils, "writeFile").andCallFake(function (fileLocation, fileName, fileData) {
expect(fileData).toContain("<description>My app description</description>");
});
nativePkgr.exec(session, target, config, callback);
});
it("can process localized application description", function () {
var config = testUtils.cloneObj(testData.config);
config.description = {"FR": "My app description - FR"};
spyOn(pkgrUtils, "writeFile").andCallFake(function (fileLocation, fileName, fileData) {
expect(fileData).toContain('<description><text xml:lang="FR">My app description - FR</text></description>');
});
nativePkgr.exec(session, target, config, callback);
});
it("can process mutiple application descriptions", function () {
var config = testUtils.cloneObj(testData.config);
config.description = {
"default": "My app description",
"EN": "My app description - EN",
"FR": "My app description - FR"
};
spyOn(pkgrUtils, "writeFile").andCallFake(function (fileLocation, fileName, fileData) {
expect(fileData).toContain('<description>My app description<text xml:lang="EN">My app description - EN</text><text xml:lang="FR">My app description - FR</text></description>');
});
nativePkgr.exec(session, target, config, callback);
});
it("can process permissions with no attributes", function () {
var config = testUtils.cloneObj(testData.config);
config.permissions = ['read_device_identifying_information'];
spyOn(pkgrUtils, "writeFile").andCallFake(function (fileLocation, fileName, fileData) {
expect(fileData).toContain("<permission>read_device_identifying_information</permission>");
});
nativePkgr.exec(session, target, config, callback);
});
it("can process permissions with attributes", function () {
var config = testUtils.cloneObj(testData.config);
config.permissions = [{ '#': 'systemPerm', '@': {"system": "true"}}];
spyOn(pkgrUtils, "writeFile").andCallFake(function (fileLocation, fileName, fileData) {
expect(fileData).toContain("<permission system=\"true\">systemPerm</permission>");
});
nativePkgr.exec(session, target, config, callback);
});
it("adds the mandatory permissions for webworks", function () {
var config = testUtils.cloneObj(testData.config);
config.permissions = [];
spyOn(pkgrUtils, "writeFile").andCallFake(function (fileLocation, fileName, fileData) {
expect(fileData).toContain("<permission system=\"false\">access_internet</permission>");
expect(fileData).toContain("<permission system=\"true\">run_native</permission>");
});
nativePkgr.exec(session, target, config, callback);
});
it("omits -devMode when signing and specifying -d", function () {
testUtils.mockResolve(path);
spyOn(pkgrUtils, "writeFile");
var session = testUtils.cloneObj(testData.session),
config = testUtils.cloneObj(testData.config),
target = "device",
optionsFile = "-package" + NL +
"-buildId" + NL +
"100" + NL +
path.normalize("c:/device/Demo.bar") + NL +
"-barVersion" + NL +
"1.5" + NL +
"-C" + NL +
path.normalize("c:/src/") + NL +
conf.BAR_DESCRIPTOR + NL +
path.normalize("c:/src/abc") + NL +
path.normalize("c:/src/xyz") + NL;
//Set signing params [-g --buildId]
session.keystore = path.normalize("c:/author.p12");
session.storepass = "password";
config.buildId = "100";
session.barPath = path.normalize("c:/%s/" + "Demo.bar");
session.sourceDir = path.normalize("c:/src/");
session.isSigningRequired = function () {
return true;
};
//Set -d param
session.debug = "";
nativePkgr.exec(session, target, config, callback);
//options file should NOT contain -devMode
expect(fs.writeFileSync).toHaveBeenCalledWith(jasmine.any(String), optionsFile);
});
it("exec blackberry-nativepackager with additional params", function () {
var cmd = "blackberry-nativepackager" + (pkgrUtils.isWindows() ? ".bat" : "");
spyOn(pkgrUtils, "writeFile");
session.getParams = jasmine.createSpy("session getParams").andReturn({
"-installApp": "",
"-device": "192.168.1.114",
"-password": "abc"
});
nativePkgr.exec(session, "simulator", testData.config, callback);
expect(fs.writeFileSync.mostRecentCall.args[0]).toBe(path.resolve(session.sourceDir + "/../", "options"));
expect(fs.writeFileSync.mostRecentCall.args[1]).toContain("-package" + NL);
expect(fs.writeFileSync.mostRecentCall.args[1]).toContain("-password" + NL);
expect(fs.writeFileSync.mostRecentCall.args[1]).toContain("abc" + NL);
expect(fs.writeFileSync.mostRecentCall.args[1]).toContain("-device" + NL);
expect(fs.writeFileSync.mostRecentCall.args[1]).toContain("192.168.1.114" + NL);
expect(fs.writeFileSync.mostRecentCall.args[1]).toContain("-installApp" + NL);
expect(childProcess.spawn).toHaveBeenCalledWith(cmd, ["@../options"], {"cwd": session.sourceDir, "env": process.env});
expect(callback).toHaveBeenCalledWith(0);
});
});