mobile-cli-lib
Version:
common lib used by different CLI
332 lines (331 loc) • 20 kB
JavaScript
;
var __extends = (this && this.__extends) || function (d, b) {
for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
var yok_1 = require("../../../yok");
var chai_1 = require("chai");
var stubs_1 = require("../stubs");
var Future = require("fibers/future");
var events_1 = require("events");
var project_constants_1 = require("../../../appbuilder/project-constants");
var device_emitter_1 = require("../../../appbuilder/device-emitter");
var AndroidDeviceDiscoveryMock = (function (_super) {
__extends(AndroidDeviceDiscoveryMock, _super);
function AndroidDeviceDiscoveryMock() {
_super.apply(this, arguments);
}
AndroidDeviceDiscoveryMock.prototype.ensureAdbServerStarted = function () {
return Future.fromResult();
};
return AndroidDeviceDiscoveryMock;
}(events_1.EventEmitter));
var companionAppIdentifiers = {
"cordova": {
"android": "cordova-android",
"ios": "cordova-ios",
"wp8": "cordova-wp8"
},
"nativescript": {
"android": "nativescript-android",
"ios": "nativescript-ios"
}
};
function createTestInjector() {
var testInjector = new yok_1.Yok();
testInjector.register("androidDeviceDiscovery", AndroidDeviceDiscoveryMock);
testInjector.register("iOSDeviceDiscovery", events_1.EventEmitter);
testInjector.register("iOSSimulatorDiscovery", events_1.EventEmitter);
testInjector.register("devicesService", {
initialize: function (opts) { return Future.fromResult(); }
});
testInjector.register("deviceLogProvider", events_1.EventEmitter);
testInjector.register("companionAppsService", {
getAllCompanionAppIdentifiers: function () { return companionAppIdentifiers; }
});
testInjector.register("projectConstants", project_constants_1.ProjectConstants);
testInjector.register("logger", stubs_1.CommonLoggerStub);
testInjector.register("deviceEmitter", device_emitter_1.DeviceEmitter);
return testInjector;
}
describe("deviceEmitter", function () {
var testInjector, deviceEmitter, isOpenDeviceLogStreamCalled = false;
beforeEach(function () {
testInjector = createTestInjector();
deviceEmitter = testInjector.resolve("deviceEmitter");
isOpenDeviceLogStreamCalled = false;
});
describe("initialize", function () {
it("does not throw when ensureAdbServerStarted throws", function () {
var androidDeviceDiscovery = testInjector.resolve("androidDeviceDiscovery"), logger = testInjector.resolve("logger");
androidDeviceDiscovery.ensureAdbServerStarted = function () {
return (function () {
throw new Error("error1");
}).future()();
};
var warnOutput = "";
logger.warn = function (warnMsg) { warnOutput += warnMsg; };
deviceEmitter.initialize().wait();
chai_1.assert.isTrue(warnOutput.indexOf("Unable to start adb server") !== -1, "When ensureAdbServerStarted throws, the string 'Unable to start adb server' must be shown as warning.");
chai_1.assert.isTrue(warnOutput.indexOf("error1") !== -1, "When ensureAdbServerStarted throws, the error message must be shown as warning.");
});
});
describe("raises correct events after initialize is called:", function () {
var androidDeviceDiscovery, iOSDeviceDiscovery, iOSSimulatorDiscovery, androidDevice, iOSDevice, iOSSimulator;
beforeEach(function () {
deviceEmitter.initialize().wait();
androidDeviceDiscovery = testInjector.resolve("androidDeviceDiscovery");
iOSDeviceDiscovery = testInjector.resolve("iOSDeviceDiscovery");
iOSSimulatorDiscovery = testInjector.resolve("iOSSimulatorDiscovery");
androidDevice = {
deviceInfo: {
"identifier": "androidDeviceId",
"platform": "android"
},
applicationManager: new events_1.EventEmitter(),
openDeviceLogStream: function () { return isOpenDeviceLogStreamCalled = true; }
};
iOSDevice = {
deviceInfo: {
"identifier": "iOSDeviceId",
"platform": "iOS"
},
applicationManager: new events_1.EventEmitter(),
openDeviceLogStream: function () { return isOpenDeviceLogStreamCalled = true; }
};
iOSSimulator = {
deviceInfo: {
"identifier": "iOSSimulatorDeviceId",
"platform": "iOS"
},
applicationManager: new events_1.EventEmitter(),
openDeviceLogStream: function () { return isOpenDeviceLogStreamCalled = true; }
};
});
_.each(["deviceFound", "deviceLost"], function (deviceEvent) {
describe(deviceEvent, function () {
var attachDeviceEventVerificationHandler = function (expectedDeviceInfo, done) {
deviceEmitter.on(deviceEvent, function (deviceInfo) {
chai_1.assert.deepEqual(deviceInfo, expectedDeviceInfo);
setTimeout(function () { return done(); }, 0);
});
};
it("is raised when working with android device", function (done) {
attachDeviceEventVerificationHandler(androidDevice.deviceInfo, done);
androidDeviceDiscovery.emit(deviceEvent, androidDevice);
});
it("is raised when working with iOS device", function (done) {
attachDeviceEventVerificationHandler(iOSDevice.deviceInfo, done);
iOSDeviceDiscovery.emit(deviceEvent, iOSDevice);
});
it("is raised when working with iOS simulator", function (done) {
attachDeviceEventVerificationHandler(iOSSimulator.deviceInfo, done);
iOSSimulatorDiscovery.emit(deviceEvent, iOSSimulator);
});
});
});
describe("openDeviceLogStream", function () {
var attachDeviceEventVerificationHandler = function (expectedDeviceInfo, done) {
deviceEmitter.on("deviceFound", function (deviceInfo) {
chai_1.assert.deepEqual(deviceInfo, expectedDeviceInfo);
setTimeout(function () {
chai_1.assert.isTrue(isOpenDeviceLogStreamCalled, "When device is found, openDeviceLogStream must be called immediately.");
done();
}, 0);
});
};
it("is called when working with android device", function (done) {
attachDeviceEventVerificationHandler(androidDevice.deviceInfo, done);
androidDeviceDiscovery.emit("deviceFound", androidDevice);
});
it("is called when working with iOS device", function (done) {
attachDeviceEventVerificationHandler(iOSDevice.deviceInfo, done);
iOSDeviceDiscovery.emit("deviceFound", iOSDevice);
});
it("is called when working with iOS simulator", function (done) {
attachDeviceEventVerificationHandler(iOSSimulator.deviceInfo, done);
iOSSimulatorDiscovery.emit("deviceFound", iOSSimulator);
});
});
describe("deviceLogProvider on data", function () {
var deviceLogProvider;
beforeEach(function () {
deviceLogProvider = testInjector.resolve("deviceLogProvider");
});
describe("raises deviceLogData with correct identifier and data", function () {
var expectedDeviceLogData = "This is some log data from device.";
var attachDeviceLogDataVerificationHandler = function (expectedDeviceIdentifier, done) {
deviceEmitter.on("deviceLogData", function (identifier, data) {
chai_1.assert.deepEqual(identifier, expectedDeviceIdentifier);
chai_1.assert.deepEqual(data, expectedDeviceLogData);
setTimeout(function () { return done(); }, 0);
});
};
it("is called when android device reports data", function (done) {
attachDeviceLogDataVerificationHandler(androidDevice.deviceInfo.identifier, done);
androidDeviceDiscovery.emit("deviceFound", androidDevice);
deviceLogProvider.emit("data", androidDevice.deviceInfo.identifier, expectedDeviceLogData);
});
it("is called when iOS device reports data", function (done) {
attachDeviceLogDataVerificationHandler(iOSDevice.deviceInfo.identifier, done);
iOSDeviceDiscovery.emit("deviceFound", iOSDevice);
deviceLogProvider.emit("data", iOSDevice.deviceInfo.identifier, expectedDeviceLogData);
});
it("is called when iOS simulator reports data", function (done) {
attachDeviceLogDataVerificationHandler(iOSSimulator.deviceInfo.identifier, done);
iOSSimulatorDiscovery.emit("deviceFound", iOSSimulator);
deviceLogProvider.emit("data", iOSSimulator.deviceInfo.identifier, expectedDeviceLogData);
});
});
});
_.each(["applicationInstalled", "applicationUninstalled"], function (applicationEvent) {
describe(applicationEvent, function () {
var expectedApplicationIdentifier = "application identifier";
var attachApplicationEventVerificationHandler = function (expectedDeviceIdentifier, done) {
deviceEmitter.on(applicationEvent, function (deviceIdentifier, appIdentifier) {
chai_1.assert.deepEqual(deviceIdentifier, expectedDeviceIdentifier);
chai_1.assert.deepEqual(appIdentifier, expectedApplicationIdentifier);
setTimeout(function () { return done(); }, 0);
});
};
it("is raised when working with android device", function (done) {
attachApplicationEventVerificationHandler(androidDevice.deviceInfo.identifier, done);
androidDeviceDiscovery.emit("deviceFound", androidDevice);
androidDevice.applicationManager.emit(applicationEvent, expectedApplicationIdentifier);
});
it("is raised when working with iOS device", function (done) {
attachApplicationEventVerificationHandler(iOSDevice.deviceInfo.identifier, done);
iOSDeviceDiscovery.emit("deviceFound", iOSDevice);
iOSDevice.applicationManager.emit(applicationEvent, expectedApplicationIdentifier);
});
it("is raised when working with iOS simulator", function (done) {
attachApplicationEventVerificationHandler(iOSSimulator.deviceInfo.identifier, done);
iOSSimulatorDiscovery.emit("deviceFound", iOSSimulator);
iOSSimulator.applicationManager.emit(applicationEvent, expectedApplicationIdentifier);
});
});
});
_.each(["debuggableAppFound", "debuggableAppLost"], function (applicationEvent) {
describe(applicationEvent, function () {
var attachDebuggableEventVerificationHandler = function (expectedDebuggableAppInfo, done) {
deviceEmitter.on(applicationEvent, function (debuggableAppInfo) {
chai_1.assert.deepEqual(debuggableAppInfo, expectedDebuggableAppInfo);
setTimeout(function () { return done(); }, 0);
});
};
it("is raised when working with android device", function (done) {
var debuggableAppInfo = {
appIdentifier: "app identifier",
deviceIdentifier: androidDevice.deviceInfo.identifier,
framework: "cordova"
};
attachDebuggableEventVerificationHandler(debuggableAppInfo, done);
androidDeviceDiscovery.emit("deviceFound", androidDevice);
androidDevice.applicationManager.emit(applicationEvent, debuggableAppInfo);
});
it("is raised when working with iOS device", function (done) {
var debuggableAppInfo = {
appIdentifier: "app identifier",
deviceIdentifier: iOSDevice.deviceInfo.identifier,
framework: "cordova"
};
attachDebuggableEventVerificationHandler(debuggableAppInfo, done);
iOSDeviceDiscovery.emit("deviceFound", iOSDevice);
iOSDevice.applicationManager.emit(applicationEvent, debuggableAppInfo);
});
it("is raised when working with iOS simulator", function (done) {
var debuggableAppInfo = {
appIdentifier: "app identifier",
deviceIdentifier: iOSSimulator.deviceInfo.identifier,
framework: "cordova"
};
attachDebuggableEventVerificationHandler(debuggableAppInfo, done);
iOSSimulatorDiscovery.emit("deviceFound", iOSSimulator);
iOSSimulator.applicationManager.emit(applicationEvent, debuggableAppInfo);
});
});
});
_.each(["debuggableViewFound", "debuggableViewLost", "debuggableViewChanged"], function (applicationEvent) {
describe(applicationEvent, function () {
var createDebuggableWebView = function (uniqueId) {
return {
description: "description_" + uniqueId,
devtoolsFrontendUrl: "devtoolsFrontendUrl_" + uniqueId,
id: "" + uniqueId,
title: "title_" + uniqueId,
type: "type_" + uniqueId,
url: "url_" + uniqueId,
webSocketDebuggerUrl: "webSocketDebuggerUrl_" + uniqueId,
};
};
var appId = "appId";
var attachDebuggableEventVerificationHandler = function (expectedDeviceIdentifier, expectedAppIdentifier, expectedDebuggableViewInfo, done) {
deviceEmitter.on(applicationEvent, function (deviceIdentifier, appIdentifier, debuggableViewInfo) {
chai_1.assert.deepEqual(deviceIdentifier, expectedDeviceIdentifier);
chai_1.assert.deepEqual(appIdentifier, expectedAppIdentifier);
chai_1.assert.deepEqual(debuggableViewInfo, expectedDebuggableViewInfo);
setTimeout(done, 0);
});
};
it("is raised when working with android device", function (done) {
var expectedDebuggableViewInfo = createDebuggableWebView("test1");
attachDebuggableEventVerificationHandler(androidDevice.deviceInfo.identifier, appId, expectedDebuggableViewInfo, done);
androidDeviceDiscovery.emit("deviceFound", androidDevice);
androidDevice.applicationManager.emit(applicationEvent, appId, expectedDebuggableViewInfo);
});
it("is raised when working with iOS device", function (done) {
var expectedDebuggableViewInfo = createDebuggableWebView("test1");
attachDebuggableEventVerificationHandler(iOSDevice.deviceInfo.identifier, appId, expectedDebuggableViewInfo, done);
iOSDeviceDiscovery.emit("deviceFound", iOSDevice);
iOSDevice.applicationManager.emit(applicationEvent, appId, expectedDebuggableViewInfo);
});
it("is raised when working with iOS simulator", function (done) {
var expectedDebuggableViewInfo = createDebuggableWebView("test1");
attachDebuggableEventVerificationHandler(iOSSimulator.deviceInfo.identifier, appId, expectedDebuggableViewInfo, done);
iOSSimulatorDiscovery.emit("deviceFound", iOSSimulator);
iOSSimulator.applicationManager.emit(applicationEvent, appId, expectedDebuggableViewInfo);
});
});
});
_.each(["companionAppInstalled", "companionAppUninstalled"], function (applicationEvent) {
describe(applicationEvent, function () {
_.each(companionAppIdentifiers, function (companionAppIdentifersForPlatform, applicationFramework) {
describe("is raised for " + applicationFramework, function () {
var attachCompanionEventVerificationHandler = function (expectedDeviceIdentifier, done) {
deviceEmitter.on(applicationEvent, function (deviceIdentifier, framework) {
chai_1.assert.deepEqual(deviceIdentifier, expectedDeviceIdentifier);
chai_1.assert.deepEqual(framework, applicationFramework);
setTimeout(function () { return done(); }, 0);
});
};
it("when working with android device", function (done) {
attachCompanionEventVerificationHandler(androidDevice.deviceInfo.identifier, done);
androidDeviceDiscovery.emit("deviceFound", androidDevice);
androidDevice.applicationManager.emit("applicationInstalled", companionAppIdentifersForPlatform["android"]);
if (applicationEvent === "companionAppUninstalled") {
androidDevice.applicationManager.emit("applicationUninstalled", companionAppIdentifersForPlatform["android"]);
}
});
it("when working with iOS device", function (done) {
attachCompanionEventVerificationHandler(iOSDevice.deviceInfo.identifier, done);
iOSDeviceDiscovery.emit("deviceFound", iOSDevice);
iOSDevice.applicationManager.emit("applicationInstalled", companionAppIdentifersForPlatform["ios"]);
if (applicationEvent === "companionAppUninstalled") {
iOSDevice.applicationManager.emit("applicationUninstalled", companionAppIdentifersForPlatform["ios"]);
}
});
it("when working with iOS simulator", function (done) {
attachCompanionEventVerificationHandler(iOSSimulator.deviceInfo.identifier, done);
iOSSimulatorDiscovery.emit("deviceFound", iOSSimulator);
iOSSimulator.applicationManager.emit("applicationInstalled", companionAppIdentifersForPlatform["ios"]);
if (applicationEvent === "companionAppUninstalled") {
iOSSimulator.applicationManager.emit("applicationUninstalled", companionAppIdentifersForPlatform["ios"]);
}
});
});
});
});
});
});
});