You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cordova.apache.org by fi...@apache.org on 2013/01/31 23:03:46 UTC

[1/10] git commit: using cli tools, bootstrap now creates a project for use as text fixtures on install. bootstrap now uses the check_requirements function for platform-specific req checks on install as well. removed old cordova project fixture that was

using cli tools, bootstrap now creates a project for use as text fixtures on install. bootstrap now uses the check_requirements function for platform-specific req checks on install as well. removed old cordova project fixture that was "manually" added.


Project: http://git-wip-us.apache.org/repos/asf/cordova-cli/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-cli/commit/5ef109bd
Tree: http://git-wip-us.apache.org/repos/asf/cordova-cli/tree/5ef109bd
Diff: http://git-wip-us.apache.org/repos/asf/cordova-cli/diff/5ef109bd

Branch: refs/heads/master
Commit: 5ef109bd60148de11b8b6330d39066542262ca88
Parents: ff34f5d
Author: Fil Maj <ma...@gmail.com>
Authored: Mon Jan 28 20:54:23 2013 -0800
Committer: Fil Maj <ma...@gmail.com>
Committed: Mon Jan 28 20:54:23 2013 -0800

----------------------------------------------------------------------
 .gitignore                                 |    3 +-
 bootstrap.js                               |   53 +++++-
 spec/cli.spec.js                           |  226 -----------------------
 spec/cordova.spec.js                       |  195 -------------------
 spec/fixtures/projects/test/.cordova       |    1 -
 spec/fixtures/projects/test/www/config.xml |    5 -
 spec/metadata/android_parser.spec.js       |  134 +++++++-------
 src/metadata/android_parser.js             |    2 +-
 8 files changed, 115 insertions(+), 504 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/5ef109bd/.gitignore
----------------------------------------------------------------------
diff --git a/.gitignore b/.gitignore
index a690a1c..7bf8a35 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,4 +3,5 @@ npm-debug.log
 temp
 .DS_Store
 spec/fixtures/projects/native
-lib/**
+spec/fixtures/projects/cordova
+lib

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/5ef109bd/bootstrap.js
----------------------------------------------------------------------
diff --git a/bootstrap.js b/bootstrap.js
index 6e18e85..87baff8 100644
--- a/bootstrap.js
+++ b/bootstrap.js
@@ -21,22 +21,57 @@
  **/
 
 var util      = require('./src/util'),
+    create    = require('./src/create'),
+    a_parser  = require('./src/metadata/android_parser'),
+    b_parser  = require('./src/metadata/blackberry_parser'),
+    i_parser  = require('./src/metadata/ios_parser'),
     path      = require('path'),
     shell     = require('shelljs'),
     platforms = require('./platforms');
 
+// Library requirements checkers
+var min_reqs = {
+    "android":a_parser.check_requirements,
+    "ios":i_parser.check_requirements,
+    "blackberry":b_parser.check_requirements
+}
+
 // Create native projects using bin/create
-var tempDir = path.join(__dirname, 'spec', 'fixtures', 'projects', 'native');
+var projectFixtures = path.join(__dirname, 'spec', 'fixtures', 'projects');
+var tempDir = path.join(projectFixtures, 'native');
 shell.rm('-rf', tempDir);
 shell.mkdir('-p', tempDir);
 
+// Also create a standard cordova project for tests
+var cordovaDir = path.join(projectFixtures, 'cordova');
+shell.rm('-rf', cordovaDir);
+create(cordovaDir);
+var platformsDir = path.join(cordovaDir, 'platforms');
+
 platforms.forEach(function(platform) {
-    var fix_path = path.join(tempDir, platform + '_fixture');
-    var create = path.join(util.libDirectory, 'cordova-' + platform, 'bin', 'create'); 
-    console.log('Creating cordova-' + platform + ' project using live project lib for tests...');
-    var cmd = create + ' "' + fix_path + '" org.apache.cordova.cordovaExample cordovaExample';
-    if (platform == 'blackberry') cmd = create + ' "' + fix_path + '" cordovaExample';
-    var create_result = shell.exec(cmd, {silent:true});
-    if (create_result.code > 0) throw ('Could not create a native ' + platform + ' project test fixture: ' + create_result.output);
-    console.log('.. complete.');
+    min_reqs[platform](function(err) {
+        if (err) {
+            console.error('WARNING: Your system does not meet requirements to create ' + platform + 'projects. See error output below.');
+            console.error(err);
+            console.error('SKIPPING ' + platform + ' bootstrap.');
+        } else {
+            console.log('SUCCESS: Minimum requirements for ' + platform + ' met.');
+            var fix_path = path.join(tempDir, platform + '_fixture');
+            var create = path.join(util.libDirectory, 'cordova-' + platform, 'bin', 'create'); 
+            console.log('BOOTSTRAPPING ' + platform + '...');
+            var cmd = create + ' "' + fix_path + '" org.apache.cordova.cordovaExample cordovaExample';
+            if (platform == 'blackberry') cmd = create + ' "' + fix_path + '" cordovaExample';
+            shell.exec(cmd, {silent:true, async:true}, function(code, output) {
+                if (code > 0) {
+                    console.error('ERROR! Could not create a native ' + platform + ' project test fixture. See below for error output.');
+                    console.error(output);
+                } else {
+                    var platformDir = path.join(platformsDir, platform);
+                    shell.mkdir('-p', platformDir);
+                    shell.cp('-rf', path.join(fix_path, '*'), platformDir); 
+                    console.log('SUCCESS: ' + platform + ' ready to rock!');
+                }
+            });
+        }
+    });
 });

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/5ef109bd/spec/cli.spec.js
----------------------------------------------------------------------
diff --git a/spec/cli.spec.js b/spec/cli.spec.js
deleted file mode 100644
index 70b8777..0000000
--- a/spec/cli.spec.js
+++ /dev/null
@@ -1,226 +0,0 @@
-
-/**
-    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 shell = require('shelljs'),
-    path = require('path'),
-    fs = require('fs'),
-    cordova = require('../cordova'),
-    tempDir = path.join(__dirname, '..', 'temp'),
-    plugins = path.join(__dirname, 'fixtures', 'plugins'),
-    androidPlugin = path.join(plugins, 'android'),
-    testPlugin = path.join(plugins, 'test'),
-    bin = path.join(__dirname, '..', 'bin', 'cordova');
-
-var cwd = process.cwd();
-
-describe('cli interface', function() {
-    beforeEach(function() {
-        shell.rm('-rf', tempDir);
-    });
-    afterEach(function() {
-        shell.rm('-rf', tempDir);
-    });
-
-    it('should print out version with -v', function() {
-        var cmd = bin + ' -v';
-        var output = shell.exec(cmd, {silent:true}).output;
-        expect(output.indexOf(require('../package').version)).toBe(0);
-    });
-    
-    describe('create', function() {
-        it('should create a project when only dir is specified', function() {
-            var cmd = bin + ' create ' + tempDir;
-            var result = shell.exec(cmd, {silent:true});
-            expect(result.code).toEqual(0);
-            expect(fs.existsSync(path.join(tempDir, '.cordova'))).toBe(true);
-        });
-        it('should create a project when dir + name are specified', function() {
-            var cmd = bin + ' create ' + tempDir + ' foobar';
-            var result = shell.exec(cmd, {silent:true});
-            expect(result.code).toEqual(0);
-            expect(fs.existsSync(path.join(tempDir, '.cordova'))).toBe(true);
-            expect(fs.readFileSync(path.join(tempDir, 'www', 'config.xml'), 'utf-8')).toMatch(/<name>foobar/i);
-        });
-        it('should create a project when all parameters are specified', function() {
-            var cmd = bin + ' create ' + tempDir + ' ca.filmaj.foobar foobar';
-            var result = shell.exec(cmd, {silent:true});
-            expect(result.code).toEqual(0);
-            expect(fs.existsSync(path.join(tempDir, '.cordova'))).toBe(true);
-            var config = fs.readFileSync(path.join(tempDir, 'www', 'config.xml'), 'utf-8');
-            expect(config).toMatch(/<name>foobar/i);
-            expect(config).toMatch(/id="ca.filmaj.foobar"/i);
-        });
-    });
-
-    describe('help', function() {
-        it('should print out docs as default command', function() {
-            var result = shell.exec(bin, {silent:true});
-            expect(result.code).toEqual(0);
-            expect(result.output).toMatch(new RegExp(fs.readFileSync(path.join(__dirname, '..', 'doc', 'help.txt'), 'utf-8').split('\n')[0]));
-        });
-        it('should print out docs when explicitly specified', function() {
-            var result = shell.exec(bin + ' help', {silent:true});
-            expect(result.code).toEqual(0);
-            expect(result.output).toMatch(new RegExp(fs.readFileSync(path.join(__dirname, '..', 'doc', 'help.txt'), 'utf-8').split('\n')[0]));
-        });
-    });
-
-    describe('platform', function() {
-        beforeEach(function() {
-            cordova.create(tempDir);
-            process.chdir(tempDir);
-        });
-        afterEach(function() {
-            process.chdir(cwd);
-        });
-        describe('add', function() {
-            it('should be able to add multiple platforms from a single invocation', function() {
-                var cmd = bin + ' platform add android ios';
-                var result = shell.exec(cmd, {silent:true});
-                expect(result.code).toEqual(0);
-                var platforms = fs.readdirSync(path.join(tempDir, 'platforms'));
-                expect(platforms.length).toEqual(2);
-                expect(platforms.indexOf('ios') > -1).toBe(true);
-                expect(platforms.indexOf('android') > -1).toBe(true);
-            });
-            it('should be able to add a single platform', function() {
-                var cmd = bin + ' platform add android';
-                var result = shell.exec(cmd, {silent:true});
-                expect(result.code).toEqual(0);
-                var platforms = fs.readdirSync(path.join(tempDir, 'platforms'));
-                expect(platforms.length).toEqual(1);
-                expect(platforms.indexOf('android') > -1).toBe(true);
-            });
-        });
-        describe('remove', function() {
-            beforeEach(function() {
-                cordova.platform('add', 'android');
-            });
-            it('should be able to remove multiple platforms from a single invocation', function() {
-                var cb = jasmine.createSpy();
-                runs(function() {
-                    cordova.platform('add', 'ios', cb);
-                });
-                waitsFor(function() { return cb.wasCalled; }, 'add ios');
-                runs(function() {
-                    var result = shell.exec(bin + ' platform rm ios android', {silent:true});
-                    expect(result.code).toEqual(0);
-                    expect(fs.readdirSync(path.join(tempDir, 'platforms')).length).toEqual(0);
-                });
-            });
-            it('should be able to remove a single platform', function() {
-                var result = shell.exec(bin + ' platform rm android', {silent:true});
-                expect(result.code).toEqual(0);
-                expect(fs.readdirSync(path.join(tempDir, 'platforms')).length).toEqual(0);
-            });
-        });
-        describe('ls', function() {
-            beforeEach(function() {
-                cordova.platform('add', 'android');
-            });
-            it('should be able to list platforms with no sub-command specified', function() {
-                var result = shell.exec(bin + ' platform', {silent:true});
-                expect(result.code).toEqual(0);
-                expect(result.output).toMatch(/android/);
-            });
-            it('should be able to list platforms with sub-command specified', function() {
-                var result = shell.exec(bin + ' platform ls', {silent:true});
-                expect(result.code).toEqual(0);
-                expect(result.output).toMatch(/android/);
-            });
-        });
-    });
-
-    describe('plugin', function() {
-        beforeEach(function() {
-            cordova.create(tempDir);
-            process.chdir(tempDir);
-            cordova.platform('add', 'android');
-        });
-        afterEach(function() {
-            process.chdir(cwd);
-        });
-        describe('add', function() {
-            it('should be able to add multiple plugins from a single invocation', function() {
-                var cmd = bin + ' plugin add ' + testPlugin + ' ' + androidPlugin;
-                var result = shell.exec(cmd, {silent:true});
-                expect(result.code).toEqual(0);
-                var addedPlugins = fs.readdirSync(path.join(tempDir, 'plugins'));
-                expect(addedPlugins.length).toEqual(2);
-                expect(addedPlugins.indexOf('android') > -1).toBe(true);
-                expect(addedPlugins.indexOf('test') > -1).toBe(true);
-            });
-            it('should be able to add a single plugin', function() {
-                var cmd = bin + ' plugin add ' + testPlugin;
-                var result = shell.exec(cmd, {silent:true});
-                expect(result.code).toEqual(0);
-                var addedPlugins = fs.readdirSync(path.join(tempDir, 'plugins'));
-                expect(addedPlugins.length).toEqual(1);
-                expect(addedPlugins.indexOf('test') > -1).toBe(true);
-            });
-        });
-        describe('remove', function() {
-            beforeEach(function() {
-                cordova.plugin('add', [testPlugin, androidPlugin]);
-            });
-            it('should be able to remove multiple plugins from a single invocation', function() {
-                var cmd = bin + ' plugin rm test android';
-                var result = shell.exec(cmd, {silent:true});
-                expect(result.code).toEqual(0);
-                var addedPlugins = fs.readdirSync(path.join(tempDir, 'plugins'));
-                expect(addedPlugins.length).toEqual(0);
-            });
-            it('should be able to remove a single plugin', function() {
-                var cmd = bin + ' plugin rm test';
-                var result = shell.exec(cmd, {silent:true});
-                expect(result.code).toEqual(0);
-                var addedPlugins = fs.readdirSync(path.join(tempDir, 'plugins'));
-                expect(addedPlugins.length).toEqual(1);
-                expect(addedPlugins.indexOf('android') > -1).toBe(true);
-            });
-        });
-        describe('ls', function() {
-            beforeEach(function() {
-                cordova.plugin('add', androidPlugin);
-            });
-            it('should be able to list plugins with no sub-command specified', function() {
-                var result = shell.exec(bin + ' plugin', {silent:true});
-                expect(result.code).toEqual(0);
-                expect(result.output).toMatch(/android/);
-            });
-            it('should be able to list plugins with sub-command specified', function() {
-                var result = shell.exec(bin + ' plugin list', {silent:true});
-                expect(result.code).toEqual(0);
-                expect(result.output).toMatch(/android/);
-            });
-        });
-    });
-
-    describe('build', function() {
-        xit('should be able to build all platforms when none are specified');
-        xit('should be able to build a specific single platform');
-        xit('should be able to build multiple, specific platforms from a single invocation');
-    });
-
-    describe('emulate', function() {
-        xit('should be able to emulate all platforms when none are specified');
-        xit('should be able to emulate a specific single platform');
-        xit('should be able to emulate multiple, specific platforms from a single invocation');
-    });
-});

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/5ef109bd/spec/cordova.spec.js
----------------------------------------------------------------------
diff --git a/spec/cordova.spec.js b/spec/cordova.spec.js
deleted file mode 100644
index c501e21..0000000
--- a/spec/cordova.spec.js
+++ /dev/null
@@ -1,195 +0,0 @@
-
-/**
-    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 cordova = require('../cordova'),
-    path = require('path'),
-    shell = require('shelljs'),
-    androidPlugin = path.join(__dirname, 'fixtures', 'plugins', 'android'),
-    tempDir = path.join(__dirname, '..', 'temp');
-
-var cwd = process.cwd();
-
-describe('top-level cordova module', function() {
-    beforeEach(function() {
-        cordova.create(tempDir);
-        process.chdir(tempDir);
-    });
-    afterEach(function() {
-        shell.rm('-rf', tempDir);
-        process.chdir(cwd);
-    });
-
-    describe('hooks/events', function() {
-        describe('for build command', function() {
-            beforeEach(function() {
-                cordova.platform('add', 'android');
-            });
-            it('should fire before_build event', function() {
-                var s = jasmine.createSpy('event listener');
-                cordova.on('before_build', s);
-                spyOn(shell, 'exec').andReturn({code:0});
-                cordova.build();
-                expect(s).toHaveBeenCalled();
-            });
-            it('should fire after_build event', function() {
-                var s = jasmine.createSpy('event listener');
-                cordova.on('after_build', s);
-                spyOn(shell, 'exec').andReturn({code:0});
-                cordova.build();
-                expect(s).toHaveBeenCalled();
-            });
-        });
-        
-        describe('for docs command', function() {
-            // TODO how the f do you spy on express? srsly
-            xit('should fire before_docs event', function() {
-                var s = jasmine.createSpy('event listener');
-                cordova.on('before_docs', s);
-                cordova.docs();
-                expect(s).toHaveBeenCalled();
-            });
-            xit('should fire after_docs event', function() {
-                var s = jasmine.createSpy('event listener');
-                cordova.on('after_docs', s);
-                cordova.docs();
-                expect(s).toHaveBeenCalled();
-            });
-        });
-
-        describe('for emulate command', function() {
-            beforeEach(function() {
-                cordova.platform('add', 'android');
-            });
-            it('should fire before_emulate event', function() {
-                var s = jasmine.createSpy('event listener');
-                cordova.on('before_emulate', s);
-                spyOn(shell, 'exec').andReturn({code:0});
-                cordova.emulate();
-                expect(s).toHaveBeenCalled();
-            });
-            it('should fire after_emulate event', function() {
-                var s = jasmine.createSpy('event listener');
-                cordova.on('after_emulate', s);
-                spyOn(shell, 'exec').andReturn({code:0});
-                cordova.emulate();
-                expect(s).toHaveBeenCalled();
-            });
-        });
-
-        describe('for platform command', function() {
-            describe('`add`', function() {
-                it('should fire before_platform_add event', function() {
-                    var s = jasmine.createSpy('event listener');
-                    cordova.on('before_platform_add', s);
-                    cordova.platform('add', 'android');
-                    expect(s).toHaveBeenCalled();
-                });
-                it('should fire after_platform_add event', function() {
-                    var s = jasmine.createSpy('event listener');
-                    cordova.on('after_platform_add', s);
-                    cordova.platform('add', 'android');
-                    expect(s).toHaveBeenCalled();
-                });
-            });
-            describe('`rm`', function() {
-                beforeEach(function() {
-                    cordova.platform('add', 'android');
-                });
-                it('should fire before_platform_rm event', function() {
-                    var s = jasmine.createSpy('event listener');
-                    cordova.on('before_platform_rm', s);
-                    cordova.platform('rm', 'android');
-                    expect(s).toHaveBeenCalled();
-                });
-                it('should fire after_platform_rm event', function() {
-                    var s = jasmine.createSpy('event listener');
-                    cordova.on('after_platform_rm', s);
-                    cordova.platform('rm', 'android');
-                    expect(s).toHaveBeenCalled();
-                });
-            });
-            describe('`ls`', function() {
-                it('should fire before_platform_ls event', function() {
-                    var s = jasmine.createSpy('event listener');
-                    cordova.on('before_platform_ls', s);
-                    cordova.platform('ls');
-                    expect(s).toHaveBeenCalled();
-                });
-                it('should fire after_platform_ls event', function() {
-                    var s = jasmine.createSpy('event listener');
-                    cordova.on('after_platform_ls', s);
-                    cordova.platform('ls');
-                    expect(s).toHaveBeenCalled();
-                });
-            });
-        });
-
-        describe('for plugin command', function() {
-            describe('`add`', function() {
-                beforeEach(function() {
-                    cordova.platform('add', 'android');
-                });
-                it('should fire before_plugin_add event', function() {
-                    var s = jasmine.createSpy('event listener');
-                    cordova.on('before_plugin_add', s);
-                    cordova.plugin('add', androidPlugin);
-                    expect(s).toHaveBeenCalled();
-                });
-                it('should fire after_plugin_add event', function() {
-                    var s = jasmine.createSpy('event listener');
-                    cordova.on('after_plugin_add', s);
-                    cordova.plugin('add', androidPlugin);
-                    expect(s).toHaveBeenCalled();
-                });
-            });
-            describe('`rm`', function() {
-                beforeEach(function() {
-                    cordova.platform('add', 'android');
-                    cordova.plugin('add', androidPlugin);
-                });
-                it('should fire before_plugin_rm event', function() {
-                    var s = jasmine.createSpy('event listener');
-                    cordova.on('before_plugin_rm', s);
-                    cordova.plugin('rm', 'android');
-                    expect(s).toHaveBeenCalled();
-                });
-                it('should fire after_plugin_rm event', function() {
-                    var s = jasmine.createSpy('event listener');
-                    cordova.on('after_plugin_rm', s);
-                    cordova.plugin('rm', 'android');
-                    expect(s).toHaveBeenCalled();
-                });
-            });
-            describe('`ls`', function() {
-                it('should fire before_plugin_ls event', function() {
-                    var s = jasmine.createSpy('event listener');
-                    cordova.on('before_plugin_ls', s);
-                    cordova.plugin('ls');
-                    expect(s).toHaveBeenCalled();
-                });
-                it('should fire after_plugin_ls event', function() {
-                    var s = jasmine.createSpy('event listener');
-                    cordova.on('after_plugin_ls', s);
-                    cordova.plugin('ls');
-                    expect(s).toHaveBeenCalled();
-                });
-            });
-        });
-    });
-});

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/5ef109bd/spec/fixtures/projects/test/.cordova
----------------------------------------------------------------------
diff --git a/spec/fixtures/projects/test/.cordova b/spec/fixtures/projects/test/.cordova
deleted file mode 100644
index 44ab66e..0000000
--- a/spec/fixtures/projects/test/.cordova
+++ /dev/null
@@ -1 +0,0 @@
-{"name":"test","id":"org.apache.cordova","platforms":["android", "ios"]}

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/5ef109bd/spec/fixtures/projects/test/www/config.xml
----------------------------------------------------------------------
diff --git a/spec/fixtures/projects/test/www/config.xml b/spec/fixtures/projects/test/www/config.xml
deleted file mode 100644
index cfb59fc..0000000
--- a/spec/fixtures/projects/test/www/config.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version='1.0' encoding='utf-8'?>
-<widget id="ca.filmaj.dewd" version="2.0.0" xmlns="http://www.w3.org/ns/widgets" xmlns:gap="http://phonegap.com/ns/1.0">
-    <name>bond. james bond.</name>
-    <access origin="*" />
-</widget>

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/5ef109bd/spec/metadata/android_parser.spec.js
----------------------------------------------------------------------
diff --git a/spec/metadata/android_parser.spec.js b/spec/metadata/android_parser.spec.js
index 0fdf881..61eedc1 100644
--- a/spec/metadata/android_parser.spec.js
+++ b/spec/metadata/android_parser.spec.js
@@ -26,45 +26,46 @@ var android_parser = require('../../src/metadata/android_parser'),
     et = require('elementtree'),
     tempDir = path.join(__dirname, '..', '..', 'temp'),
     cordova = require('../../cordova');
-    cfg_path = path.join(__dirname, '..', 'fixtures', 'projects', 'test', 'www', 'config.xml'),
-    android_path = path.join(__dirname, '..', 'fixtures', 'projects', 'native', 'android_fixture'),
-    create = path.join(__dirname, '..', '..', 'lib', 'android', 'bin', 'create');
+    projects_path = path.join(__dirname, '..', 'fixtures', 'projects')
+    android_path = path.join(projects_path, 'native', 'android_fixture'),
+    project_path = path.join(projects_path, 'cordova'),
+    android_project_path = path.join(project_path, 'platforms', 'android');
 
-var cwd = process.cwd();
-
-var android_strings = path.join(android_path, 'res', 'values', 'strings.xml');
-var android_manifest = path.join(android_path, 'AndroidManifest.xml');
-var android_config = path.join(android_path, 'res', 'xml', 'config.xml');
-var original_strings = fs.readFileSync(android_strings, 'utf-8');
-var original_manifest = fs.readFileSync(android_manifest, 'utf-8');
-var original_config = fs.readFileSync(cfg_path, 'utf-8');
-var original_android_config = fs.readFileSync(android_config, 'utf-8');
+var www_config = path.join(project_path, 'www', 'config.xml');
+var original_www_config = fs.readFileSync(www_config, 'utf-8');
 
 describe('android project parser', function() {
     it('should throw an exception with a path that is not a native android project', function() {
         expect(function() {
-            var project = new android_parser(cwd);
+            var project = new android_parser(process.cwd());
         }).toThrow();
     });
     it('should accept a proper native android project path as construction parameter', function() {
-        var project;
         expect(function() {
-            project = new android_parser(android_path);
+            var project = new android_parser(android_path);
+            expect(project).toBeDefined();
         }).not.toThrow();
-        expect(project).toBeDefined();
     });
 
     describe('update_from_config method', function() {
         var project, config;
+        
+        var android_strings = path.join(android_path, 'res', 'values', 'strings.xml');
+        var android_manifest = path.join(android_path, 'AndroidManifest.xml');
+        var android_config = path.join(android_path, 'res', 'xml', 'config.xml');
+
+        var original_strings = fs.readFileSync(android_strings, 'utf-8');
+        var original_manifest = fs.readFileSync(android_manifest, 'utf-8');
+        var original_android_config = fs.readFileSync(android_config, 'utf-8');
 
         beforeEach(function() {
             project = new android_parser(android_path);
-            config = new config_parser(cfg_path);
+            config = new config_parser(www_config);
         });
         afterEach(function() {
             fs.writeFileSync(android_strings, original_strings, 'utf-8');
             fs.writeFileSync(android_manifest, original_manifest, 'utf-8');
-            fs.writeFileSync(cfg_path, original_config, 'utf-8');
+            fs.writeFileSync(www_config, original_www_config, 'utf-8');
             fs.writeFileSync(android_config, original_android_config, 'utf-8');
         });
         it('should throw an exception if a non config_parser object is passed into it', function() {
@@ -117,11 +118,11 @@ describe('android project parser', function() {
 
                 var native_config = new et.ElementTree(et.XML(fs.readFileSync(android_config, 'utf-8')));
                 var ps = native_config.findall('preference');
-                expect(ps.length).toEqual(3);
+                expect(ps.length).toEqual(7);
                 expect(ps[0].attrib.name).toEqual('useBrowserHistory');
                 expect(ps[0].attrib.value).toEqual('true');
-                expect(ps[2].attrib.name).toEqual('henrik');
-                expect(ps[2].attrib.value).toEqual('sedin');
+                expect(ps[6].attrib.name).toEqual('henrik');
+                expect(ps[6].attrib.value).toEqual('sedin');
             });
             it('should override a default project preference if applicable', function() {
                 config.preference.add({name:'useBrowserHistory',value:'false'});
@@ -129,64 +130,65 @@ describe('android project parser', function() {
 
                 var native_config = new et.ElementTree(et.XML(fs.readFileSync(android_config, 'utf-8')));
                 var ps = native_config.findall('preference');
-                expect(ps.length).toEqual(2);
+                expect(ps.length).toEqual(6);
                 expect(ps[0].attrib.name).toEqual('useBrowserHistory');
                 expect(ps[0].attrib.value).toEqual('false');
             });
         });
     });
 
-    describe('update_www method', function() {
-        var parser, android_platform;
+    describe('cross-platform project level methods', function() {
+        var parser, config;
+        var android_strings = path.join(android_project_path, 'res', 'values', 'strings.xml');
+        var android_manifest = path.join(android_project_path, 'AndroidManifest.xml');
+        var android_config = path.join(android_project_path, 'res', 'xml', 'config.xml');
 
-        beforeEach(function() {
-            shell.rm('-rf', tempDir);
-            cordova.create(tempDir);
-            process.chdir(tempDir);
-            cordova.platform('add', 'android');
-            android_platform = path.join(tempDir, 'platforms', 'android');
-            parser = new android_parser(android_platform);
-        });
-        afterEach(function() {
-            process.chdir(cwd);
-        });
-
-        it('should update all www assets', function() {
-            var newFile = path.join(tempDir, 'www', 'somescript.js');
-            fs.writeFileSync(newFile, 'alert("sup");', 'utf-8');
-            parser.update_www();
-            expect(fs.existsSync(path.join(android_platform, 'assets', 'www', 'somescript.js'))).toBe(true);
-        });
-        it('should write out android js to cordova.js', function() {
-            parser.update_www();
-            expect(fs.readFileSync(path.join(android_platform, 'assets', 'www', 'cordova.js'),'utf-8')).toBe(fs.readFileSync(path.join(util.libDirectory, 'cordova-android', 'framework', 'assets', 'js', 'cordova.android.js'), 'utf-8'));
-        });
-    });
-
-    describe('update_project method', function() {
-        var parser, android_platform, cfg;
+        var original_strings = fs.readFileSync(android_strings, 'utf-8');
+        var original_manifest = fs.readFileSync(android_manifest, 'utf-8');
+        var original_android_config = fs.readFileSync(android_config, 'utf-8');
 
         beforeEach(function() {
-            shell.rm('-rf', tempDir);
-            cordova.create(tempDir);
-            process.chdir(tempDir);
-            cordova.platform('add', 'android');
-            android_platform = path.join(tempDir, 'platforms', 'android');
-            parser = new android_parser(android_platform);
-            cfg = new config_parser(cfg_path);
+            parser = new android_parser(android_project_path);
+            config = new config_parser(www_config);
         });
         afterEach(function() {
-            process.chdir(cwd);
+            fs.writeFileSync(android_strings, original_strings, 'utf-8');
+            fs.writeFileSync(android_manifest, original_manifest, 'utf-8');
+            fs.writeFileSync(www_config, original_www_config, 'utf-8');
+            fs.writeFileSync(android_config, original_android_config, 'utf-8');
         });
-        it('should invoke update_www', function() {
-            var spyWww = spyOn(parser, 'update_www');
-            parser.update_project(cfg);
-            expect(spyWww).toHaveBeenCalled();
+        describe('update_www method', function() {
+            it('should update all www assets', function() {
+                var newFile = path.join(project_path, 'www', 'somescript.js');
+                this.after(function() {
+                    shell.rm('-f', newFile);
+                });
+                fs.writeFileSync(newFile, 'alert("sup");', 'utf-8');
+                parser.update_www();
+                expect(fs.existsSync(path.join(android_project_path, 'assets', 'www', 'somescript.js'))).toBe(true);
+            });
+            it('should write out android js to cordova.js', function() {
+                parser.update_www();
+                expect(fs.readFileSync(path.join(android_project_path, 'assets', 'www', 'cordova.js'),'utf-8')).toBe(fs.readFileSync(path.join(util.libDirectory, 'cordova-android', 'framework', 'assets', 'js', 'cordova.android.js'), 'utf-8'));
+            });
+            it('should call out to util.deleteSvnFolders', function() {
+                var spy = spyOn(util, 'deleteSvnFolders');
+                parser.update_www();
+                expect(spy).toHaveBeenCalled();
+            });
         });
-        it('should invoke update_from_config', function() {
-            var spyConfig = spyOn(parser, 'update_from_config');
-            parser.update_project(cfg);
-            expect(spyConfig).toHaveBeenCalled();
+
+        describe('update_project method', function() {
+            it('should invoke update_www', function() {
+                var spyWww = spyOn(parser, 'update_www');
+                parser.update_project(config);
+                expect(spyWww).toHaveBeenCalled();
+            });
+            it('should invoke update_from_config', function() {
+                var spyConfig = spyOn(parser, 'update_from_config');
+                parser.update_project(config);
+                expect(spyConfig).toHaveBeenCalled();
+            });
         });
     });
 });

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/5ef109bd/src/metadata/android_parser.js
----------------------------------------------------------------------
diff --git a/src/metadata/android_parser.js b/src/metadata/android_parser.js
index ab22fee..16737be 100644
--- a/src/metadata/android_parser.js
+++ b/src/metadata/android_parser.js
@@ -128,7 +128,7 @@ module.exports.prototype = {
     },
 
     update_www:function() {
-        var projectRoot = util.isCordova(process.cwd());
+        var projectRoot = util.isCordova(this.path);
         var www = path.join(projectRoot, 'www');
         var platformWww = path.join(this.path, 'assets');
         // remove stock platform assets