[ 
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

Reply via email to