[ 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: issues-unsubscr...@cordova.apache.org For additional commands, e-mail: issues-h...@cordova.apache.org