[
https://issues.apache.org/jira/browse/CB-8123?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14297478#comment-14297478
]
ASF GitHub Bot commented on CB-8123:
------------------------------------
Github user purplecabbage commented on a diff in the pull request:
https://github.com/apache/cordova-lib/pull/155#discussion_r23798529
--- Diff: cordova-lib/spec-plugman/platforms/windows.spec.js ---
@@ -0,0 +1,415 @@
+/**
+ 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 windows = require('../../src/plugman/platforms/windows'),
+ common = require('../../src/plugman/platforms/common'),
+ install = require('../../src/plugman/install'),
+ path = require('path'),
+ fs = require('fs'),
+ shell = require('shelljs'),
+ et = require('elementtree'),
+ os = require('osenv'),
+ cordovaProjectDir = path.join(os.tmpdir(), 'plugman'),
+ cordovaProjectWindowsPlatformDir = path.join(cordovaProjectDir,
'platforms', 'windows'),
+ cordovaProjectPluginsDir = path.join(cordovaProjectDir, 'plugins'),
+ xml_helpers = require('../../src/util/xml-helpers'),
+ dummyplugin = path.join(__dirname, '..', 'plugins',
'org.test.plugins.dummyplugin'),
+ faultyplugin = path.join(__dirname, '..', 'plugins',
'org.test.plugins.faultyplugin');
+
+var PluginInfo = require('../../src/PluginInfo');
+
+var dummyPluginInfo = new PluginInfo(dummyplugin);
+var dummy_id = dummyPluginInfo.id;
+var valid_source = dummyPluginInfo.getSourceFiles('windows');
+var valid_libfiles = dummyPluginInfo.getLibFiles('windows');
+var valid_frameworks = dummyPluginInfo.getFrameworks('windows');
+
+var faultyPluginInfo = new PluginInfo(faultyplugin);
+var faulty_id = faultyPluginInfo.id;
+var invalid_source = faultyPluginInfo.getSourceFiles('windows');
+var invalid_libfiles = faultyPluginInfo.getLibFiles('windows');
+
+function copyArray(arr) {
+ return Array.prototype.slice.call(arr, 0);
+}
+
+beforeEach(function () {
+ this.addMatchers({
+ toContainXmlPath: function (xpath) {
+ var xml = this.actual;
+ var notText = this.isNot ? 'not ' : '';
+ this.message = function () {
+ return 'Expected xml \'' + et.tostring(xml) + '\' ' +
notText + 'to contain elements matching \'' + xpath + '\'.';
+ };
+
+ return xml.find(xpath) != null;
+ } });
+});
+
+['windows', 'windows8'].forEach(function (platform) {
+ var windows_project = path.join(__dirname, '..', 'projects', platform);
+
+ shell.mkdir('-p', cordovaProjectWindowsPlatformDir);
+ shell.cp('-rf', path.join(windows_project, '*'),
cordovaProjectWindowsPlatformDir);
+ var proj_files =
windows.parseProjectFile(cordovaProjectWindowsPlatformDir);
+ shell.rm('-rf', cordovaProjectDir);
+
+ var platformProjects = {
+ windows: {
+ all: 'CordovaApp.projitems',
+ phone: 'CordovaApp.Phone.jsproj',
+ windows: 'CordovaApp.Windows.jsproj',
+ windows8: 'CordovaApp.Windows80.jsproj'
+ }, windows8: {
+ all: 'TestApp.jsproj',
+ windows8: 'TestApp.jsproj'
+ }
+ }[platform];
+
+ describe(platform + ' project handler', function () {
+ beforeEach(function () {
+ shell.mkdir('-p', cordovaProjectWindowsPlatformDir);
+ shell.mkdir('-p', cordovaProjectPluginsDir);
+ });
+ afterEach(function () {
+ shell.rm('-rf', cordovaProjectDir);
+ });
+
+ describe('www_dir method', function () {
+ it('should return cordova-windows project www location using
www_dir', function () {
+ expect(windows.www_dir(path.sep)).toEqual(path.sep +
'www');
+ });
+ });
+ describe('package_name method', function () {
+ it('should return a windows project\'s proper package name',
function () {
+
expect(windows.package_name(windows_project)).toEqual("CordovaApp");
+ });
+ });
+
+ describe('parseProjectFile method', function () {
+ it('should throw if project is not an windows project',
function () {
+ expect(function () {
+
windows.parseProjectFile(cordovaProjectWindowsPlatformDir);
+ }).toThrow(windows.InvalidProjectPathError);
+ });
+ });
+
+ describe('installation', function () {
+ beforeEach(function () {
+ shell.mkdir('-p', cordovaProjectWindowsPlatformDir);
+ shell.cp('-rf', path.join(windows_project, '*'),
cordovaProjectWindowsPlatformDir);
+ });
+ afterEach(function () {
+ shell.rm('-rf', cordovaProjectDir);
+ });
+
+ function validateInstalledProjects(tag, elementToInstall,
xpath, supportedPlatforms) {
+ jasmine.getEnv().currentSpec.removeAllSpies();
+
+ var projects = copyArray(proj_files.projects);
+ if (platform === 'windows') {
+ projects.push(proj_files.master);
+ }
+
+ var appendToRootFake = function (itemGroup) {
+ expect(itemGroup).toContainXmlPath(xpath);
+ };
+
+ var projectsAddedToSpies = [];
+ var projectsNotAddedToSpies = [];
+
+ var projectsAddedTo = [];
+ supportedPlatforms.forEach(function (platform) {
+ var platformProject = platformProjects[platform];
+ if (platformProject) {
+ projectsAddedTo.push(platformProjects[platform]);
+ }
+ });
+
+ projects.forEach(function (project) {
+ if
(projectsAddedTo.indexOf(path.basename(project.location)) > -1) {
+ projectsAddedToSpies.push(spyOn(project,
'appendToRoot').andCallFake(appendToRootFake));
+ } else {
+ projectsNotAddedToSpies.push(spyOn(project,
'appendToRoot'));
+ }
+ });
+
+ windows[tag].install(elementToInstall, dummyplugin,
cordovaProjectWindowsPlatformDir, dummy_id, null, proj_files);
+
+ projectsAddedToSpies.forEach(function (spy) {
+ expect(spy).toHaveBeenCalled();
+ });
+
+ projectsNotAddedToSpies.forEach(function (spy) {
+ expect(spy).not.toHaveBeenCalled();
+ });
+ }
+
+ describe('of <source-file> elements', function () {
+ it('should copy stuff from one location to another by
calling common.copyFile', function () {
+ var source = copyArray(valid_source);
+ var s = spyOn(common, 'copyFile');
+ windows['source-file'].install(source[0], dummyplugin,
cordovaProjectWindowsPlatformDir, dummy_id, null, proj_files);
+ expect(s).toHaveBeenCalledWith(dummyplugin,
'src/windows/dummer.js', cordovaProjectWindowsPlatformDir, path.join('plugins',
'org.test.plugins.dummyplugin', 'dummer.js'), false);
+ });
+ it('should throw if source-file src cannot be found',
function () {
+ var source = copyArray(invalid_source);
+ expect(function () {
+ windows['source-file'].install(source[1],
faultyplugin, cordovaProjectWindowsPlatformDir, faulty_id, null, proj_files);
+ }).toThrow('"' + path.resolve(faultyplugin,
'src/windows/NotHere.js') + '" not found!');
+ });
+ it('should throw if source-file target already exists',
function () {
+ var source = copyArray(valid_source);
+ var target =
path.join(cordovaProjectWindowsPlatformDir, 'plugins', dummy_id, 'dummer.js');
+ shell.mkdir('-p', path.dirname(target));
+ fs.writeFileSync(target, 'some bs', 'utf-8');
+ expect(function () {
+ windows['source-file'].install(source[0],
dummyplugin, cordovaProjectWindowsPlatformDir, dummy_id, null, proj_files);
+ }).toThrow('"' + target + '" already exists!');
+ });
+ });
+
+ describe('of <lib-file> elements', function () {
+ var libfiles = copyArray(valid_libfiles);
+ var invalidLibFiles = copyArray(invalid_libfiles);
+
+ // This could be separated into individual specs, but that
results in a lot of copying and deleting the
+ // project files, which is not needed.
+ it('should write to correct project files when conditions
are specified', function () {
+ var xpath = 'SDKReference[@Include="TestSDK1,
Version=1.0"][@Condition="\'$(Platform)\'==\'x86\'"]';
+ validateInstalledProjects('lib-file', libfiles[0],
xpath, ['all']);
+
+ xpath = 'SDKReference[@Include="TestSDK2,
Version=1.0"]';
+ validateInstalledProjects('lib-file', libfiles[1],
xpath, ['windows', 'phone']);
+
+ xpath = 'SDKReference[@Include="TestSDK3,
Version=1.0"]';
+ validateInstalledProjects('lib-file', libfiles[2],
xpath, ['phone']);
+
+ xpath = 'SDKReference[@Include="TestSDK4,
Version=1.0"]';
+ validateInstalledProjects('lib-file', libfiles[3],
xpath, ['windows8']);
+ });
+
+ it('should throw if conditions are invalid', function () {
+ expect(function () {
+ windows['lib-file'].install(invalidLibFiles[0],
faultyplugin, cordovaProjectWindowsPlatformDir, faulty_id, null, proj_files);
+ }).toThrow('Invalid lib-file arch attribute (must be
"x86", "x64" or "ARM"): x85');
+
+ expect(function () {
+ windows['lib-file'].install(invalidLibFiles[1],
faultyplugin, cordovaProjectWindowsPlatformDir, faulty_id, null, proj_files);
+ }).toThrow('Invalid lib-file versions attribute (must
be a valid a valid node semantic version range): 8.0a');
+
+ expect(function () {
+ windows['lib-file'].install(invalidLibFiles[2],
faultyplugin, cordovaProjectWindowsPlatformDir, faulty_id, null, proj_files);
+ }).toThrow('Invalid lib-file target attribute (must be
"all", "phone", "windows" or "win"): daphne');
+ });
+ });
+
+ describe('of <framework> elements', function () {
+ var frameworks = copyArray(valid_frameworks);
+
+ // This could be separated into individual specs, but that
results in a lot of copying and deleting the
+ // project files, which is not needed.
+ it('should write to correct project files when conditions
are specified', function () {
+ var xpath =
'Reference[@Include="dummy1"][@Condition="\'$(Platform)\'==\'x64\'"]/HintPath';
+ validateInstalledProjects('framework', frameworks[0],
xpath, ['all']);
+
+ xpath = 'Reference[@Include="dummy2"]/HintPath';
+ validateInstalledProjects('framework', frameworks[1],
xpath, ['all']);
+
+ xpath = 'Reference[@Include="dummy3"]/HintPath';
+ validateInstalledProjects('framework', frameworks[2],
xpath, ['windows', 'windows8']);
+
+ xpath =
'Reference[@Include="dummy4"][@Condition="\'$(Platform)\'==\'ARM\'"]/HintPath';
+ validateInstalledProjects('framework', frameworks[3],
xpath, ['phone']);
+ });
+ });
+
+ describe('of <framework> elements of type
\'projectReference\'', function () {
+ var frameworks = copyArray(valid_frameworks);
+
+ it('should write to correct project files when conditions
are specified', function () {
+ var xpath = 'ProjectReference[@Include="' +
dummyplugin +
'\\src\\windows\\dummy1.vcxproj"][@Condition="\'$(Platform)\'==\'x64\'"]';
--- End diff --
First failing test in Travis.
> Enable version, device, and chip arch specific library / dll / winmd
> references in plugins for the Windows platform
> -------------------------------------------------------------------------------------------------------------------
>
> Key: CB-8123
> URL: https://issues.apache.org/jira/browse/CB-8123
> Project: Apache Cordova
> Issue Type: Improvement
> Components: Plugins, Windows
> Reporter: Tim Barham
> Original Estimate: 72h
> Remaining Estimate: 72h
>
> Because Cordova's windows platform can target multiple target platforms,
> projects and frameworks referenced by the plugin may need to target only a
> subset of those platforms. To enable this, support the following attributes
> on the <lib-file> and <framework> elements:
> 1. device - indicates the reference is specific to a target device. Supported
> values are "phone", "windows" or "all" (default is "all").
> 2. versions - specify platform versions the reference supports (node semantic
> version ranges supported). Default is to support all versions.
> 3. arch - indicates the reference is specific to a particular chip
> architecture (x86 or x64).
> The "arch" attribute should result in a Condition="'$(Platform)'=='XXX"
> attribute on the reference. The other attributes will impact which generated
> jsproj files the reference is actually added to.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]