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:45 UTC

[10/10] git commit: sped up emulate tests

Updated Branches:
  refs/heads/master ff34f5dbf -> 8296edaca


sped up emulate tests


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

Branch: refs/heads/master
Commit: 8296edacade0e4f77f9cb5234ff6e3a84d90cc8a
Parents: 2cfdf55
Author: Fil Maj <ma...@gmail.com>
Authored: Thu Jan 31 14:05:23 2013 -0800
Committer: Fil Maj <ma...@gmail.com>
Committed: Thu Jan 31 14:05:23 2013 -0800

----------------------------------------------------------------------
 bootstrap.js         |   26 ++---
 spec/emulate.spec.js |  244 ++++++++++++---------------------------------
 src/emulate.js       |   31 +++---
 3 files changed, 90 insertions(+), 211 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/8296edac/bootstrap.js
----------------------------------------------------------------------
diff --git a/bootstrap.js b/bootstrap.js
index c4f403b..4df2089 100644
--- a/bootstrap.js
+++ b/bootstrap.js
@@ -67,24 +67,20 @@ platforms.forEach(function(platform) {
                     console.error('ERROR! Could not create a native ' + platform + ' project test fixture. See below for error output.');
                     console.error(output);
                 } else {
-                    // set permissions on executables
-                    switch (platform) {
-                        case 'android':
-                            break;
-                        case 'ios':
-                            var scripts_path = path.join(fix_path, 'cordova');
-                            var scripts = fs.readdirSync(scripts_path);
-                            scripts.forEach(function(script) {
-                                var script_path = path.join(scripts_path, script);
-                                shell.chmod('+x', script_path);
-                            });
-                            break;
-                        case 'blackberry':
-                            break;
-                    };
+                    // copy over to full cordova project test fixture
                     var platformDir = path.join(platformsDir, platform);
                     shell.mkdir('-p', platformDir);
                     shell.cp('-rf', path.join(fix_path, '*'), platformDir); 
+                    // set permissions on executables
+                    var scripts_path = path.join(fix_path, 'cordova');
+                    var other_path = path.join(platformDir, 'cordova');
+                    var scripts = fs.readdirSync(scripts_path);
+                    scripts.forEach(function(script) {
+                        var script_path = path.join(scripts_path, script);
+                        var other_script_path = path.join(other_path, script);
+                        shell.chmod('+x', script_path);
+                        shell.chmod('+x', other_script_path);
+                    });
                     console.log('SUCCESS: ' + platform + ' ready to rock!');
                 }
             });

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/8296edac/spec/emulate.spec.js
----------------------------------------------------------------------
diff --git a/spec/emulate.spec.js b/spec/emulate.spec.js
index a936e1e..ac6d115 100644
--- a/spec/emulate.spec.js
+++ b/spec/emulate.spec.js
@@ -26,13 +26,15 @@ var cordova = require('../cordova'),
     ios_parser = require('../src/metadata/ios_parser'),
     blackberry_parser = require('../src/metadata/blackberry_parser'),
     hooker = require('../src/hooker'),
-    tempDir = path.join(__dirname, '..', 'temp');
+    fixtures = path.join(__dirname, 'fixtures'),
+    hooks = path.join(fixtures, 'hooks'),
+    tempDir = path.join(__dirname, '..', 'temp'),
+    cordova_project = path.join(fixtures, 'projects', 'cordova');
 
 var cwd = process.cwd();
 
-xdescribe('emulate command', function() {
+describe('emulate command', function() {
     beforeEach(function() {
-        // Make a temp directory
         shell.rm('-rf', tempDir);
         shell.mkdir('-p', tempDir);
     });
@@ -50,237 +52,109 @@ xdescribe('emulate command', function() {
     });
     
     it('should run inside a Cordova-based project with at least one added platform', function() {
+        shell.mv('-f', path.join(cordova_project, 'platforms', 'blackberry'), path.join(tempDir));
+        shell.mv('-f', path.join(cordova_project, 'platforms', 'ios'), path.join(tempDir));
         this.after(function() {
             process.chdir(cwd);
+            shell.mv('-f', path.join(tempDir, 'blackberry'), path.join(cordova_project, 'platforms', 'blackberry'));
+            shell.mv('-f', path.join(tempDir, 'ios'), path.join(cordova_project, 'platforms', 'ios'));
         });
 
-        var cb = jasmine.createSpy();
-        var cbem = jasmine.createSpy();
-        var s;
+        process.chdir(cordova_project);
 
-        runs(function() {
-            cordova.create(tempDir);
-            process.chdir(tempDir);
-            cordova.platform('add', 'ios', cb);
-        });
-        waitsFor(function() { return cb.wasCalled; }, 'platform add ios');
-
-        runs(function() {
-            s = spyOn(shell, 'exec').andReturn({code:0});
-            expect(function() {
-                cordova.emulate(cbem);
-            }).not.toThrow();
-        });
-        waitsFor(function() { return cbem.wasCalled; }, 'ios emulate');
-
-        runs(function() {
+        var s = spyOn(shell, 'exec');
+        spyOn(android_parser.prototype, 'update_project');
+        expect(function() {
+            cordova.emulate();
             expect(s).toHaveBeenCalled();
-        });
+        }).not.toThrow();
     });
-    
     it('should not run outside of a Cordova-based project', function() {
         this.after(function() {
             process.chdir(cwd);
         });
 
+        shell.mkdir('-p', tempDir);
         process.chdir(tempDir);
 
         expect(function() {
             cordova.emulate();
         }).toThrow();
     });
-    
     describe('per platform', function() {
         beforeEach(function() {
-            cordova.create(tempDir);
-            process.chdir(tempDir);
+            process.chdir(cordova_project);
         });
 
         afterEach(function() {
             process.chdir(cwd);
         });
-        
+       
         describe('Android', function() {
+            var s;
             beforeEach(function() {
-                cordova.platform('add', 'android');
+                s = spyOn(require('shelljs'), 'exec');
             });
-
             it('should shell out to run command on Android', function() {
-                var s = spyOn(require('shelljs'), 'exec').andReturn({code:0});
-                cordova.emulate();
-                expect(s.mostRecentCall.args[0].match(/android\/cordova\/run/)).not.toBeNull();
+                cordova.emulate('android');
+                expect(s.mostRecentCall.args[0].match(/\/cordova\/run/)).not.toBeNull();
             });
             it('should call android_parser\'s update_project', function() {
-                spyOn(require('shelljs'), 'exec').andReturn({code:0});
-                var s = spyOn(android_parser.prototype, 'update_project');
-                cordova.emulate();
-                expect(s).toHaveBeenCalled();
+                var spy = spyOn(android_parser.prototype, 'update_project');
+                cordova.emulate('android');
+                expect(spy).toHaveBeenCalled();
             });
         });
         describe('iOS', function() {
             it('should shell out to emulate command on iOS', function() {
-                var cb = jasmine.createSpy();
-                var buildcb = jasmine.createSpy();
-                var s;
-
-                runs(function() {
-                    cordova.platform('add', 'ios', cb);
-                });
-                waitsFor(function() { return cb.wasCalled; }, 'platform add ios callback');
-                runs(function() {
-                    s = spyOn(require('shelljs'), 'exec').andReturn({code:0});
-                    cordova.emulate(buildcb);
-                });
-                waitsFor(function() { return buildcb.wasCalled; }, 'emulate ios');
-                runs(function() {
-                    expect(s).toHaveBeenCalled();
-                    expect(s.mostRecentCall.args[0].match(/ios\/cordova\/emulate/)).not.toBeNull();
-                });
+                var s = spyOn(require('shelljs'), 'exec');
+                var proj_spy = spyOn(ios_parser.prototype, 'update_project');
+                cordova.emulate('ios');
+                proj_spy.mostRecentCall.args[1]();
+                expect(s).toHaveBeenCalled();
+                expect(s.mostRecentCall.args[0].match(/\/cordova\/emulate/)).not.toBeNull();
             });
             it('should call ios_parser\'s update_project', function() {
-                var cb = jasmine.createSpy();
-                var buildcb = jasmine.createSpy();
-                var s;
-
-                runs(function() {
-                    cordova.platform('add', 'ios', cb);
-                });
-                waitsFor(function() { return cb.wasCalled; }, 'platform add ios callback');
-                runs(function() {
-                    s = spyOn(ios_parser.prototype, 'update_project');
-                    cordova.emulate(buildcb);
-                    expect(s).toHaveBeenCalled();
-                });
+                var s = spyOn(ios_parser.prototype, 'update_project');
+                cordova.emulate('ios');
+                expect(s).toHaveBeenCalled();
             });
         });
         describe('BlackBerry', function() {
             it('should shell out to ant command on blackberry', function() {
-                var buildcb = jasmine.createSpy();
-                var cb = jasmine.createSpy();
-                var s, t = spyOn(require('prompt'), 'get').andReturn(true);
-
-                runs(function() {
-                    cordova.platform('add', 'blackberry', cb);
-                    // Fake prompt invoking its callback
-                    t.mostRecentCall.args[1](null, {});
-                });
-                waitsFor(function() { return cb.wasCalled; }, 'platform add blackberry');
-                runs(function() {
-                    s = spyOn(require('shelljs'), 'exec').andReturn({code:0});
-                    cordova.emulate(buildcb);
-                });
-                waitsFor(function() { return buildcb.wasCalled; }, 'build call', 20000);
-                runs(function() {
-                    expect(s).toHaveBeenCalled();
-                    expect(s.mostRecentCall.args[0].match(/ant -f .*build\.xml qnx load-simulator/)).not.toBeNull();
-                });
+                var proj_spy = spyOn(blackberry_parser.prototype, 'update_project');
+                var s = spyOn(require('shelljs'), 'exec');
+                cordova.emulate('blackberry');
+                proj_spy.mostRecentCall.args[1](); // update_project fake
+                expect(s).toHaveBeenCalled();
+                expect(s.mostRecentCall.args[0]).toMatch(/ant -f .*build\.xml" qnx load-simulator/);
             });
             it('should call blackberry_parser\'s update_project', function() {
-                var cb = jasmine.createSpy();
-                var buildcb = jasmine.createSpy();
-                var s;
-
-                runs(function() {
-                    var p = spyOn(require('prompt'), 'get');
-                    cordova.platform('add', 'blackberry', cb);
-                    p.mostRecentCall.args[1](null, {});
-                });
-                waitsFor(function() { return cb.wasCalled; }, 'platform add bb');
-                runs(function() {
-                    s = spyOn(blackberry_parser.prototype, 'update_project');
-                    cordova.emulate(buildcb);
-                    expect(s).toHaveBeenCalled();
-                });
-            });
-        });
-    });
-    describe('specifying platforms to emulate', function() {
-        beforeEach(function() {
-            cordova.create(tempDir);
-            process.chdir(tempDir);
-            cordova.platform('add', 'android');
-        });
-
-        afterEach(function() {
-            process.chdir(cwd);
-            shell.rm('-rf', tempDir);
-        });
-        it('should only emulate the specified platform (array notation)', function() {
-            var cb = jasmine.createSpy();
-            var buildcb = jasmine.createSpy();
-            var s;
-            runs(function() {
-                cordova.platform('add', 'ios', cb);
-            });
-            waitsFor(function() { return cb.wasCalled; }, 'platform add ios');
-            runs(function() {
-                s = spyOn(shell, 'exec').andReturn({code:0});
-                cordova.build(['android'], buildcb);
-            });
-            waitsFor(function() { return buildcb.wasCalled; }, 'emulate android');
-            runs(function() {
-                expect(s.callCount).toEqual(1);
-            });
-        });
-        it('should only emulate the specified platform (string notation)', function() {
-            var cb = jasmine.createSpy();
-            var buildcb = jasmine.createSpy();
-            var s;
-            runs(function() {
-                cordova.platform('add', 'ios', cb);
-            });
-            waitsFor(function() { return cb.wasCalled; }, 'platform add ios');
-            runs(function() {
-                s = spyOn(shell, 'exec').andReturn({code:0});
-                cordova.build('android', buildcb);
-            });
-            waitsFor(function() { return buildcb.wasCalled; }, 'emulate android');
-            runs(function() {
-                expect(s.callCount).toEqual(1);
-            });
-        });
-        it('should handle multiple platforms to be emulated', function() {
-            var cb = jasmine.createSpy();
-            var bbcb = jasmine.createSpy();
-            var buildcb = jasmine.createSpy();
-            var s;
-            runs(function() {
-                cordova.platform('add', 'ios', cb);
-            });
-            waitsFor(function() { return cb.wasCalled; }, 'platform add ios');
-            runs(function() {
-                var g = spyOn(require('prompt'), 'get');
-                cordova.platform('add', 'blackberry', bbcb);
-                g.mostRecentCall.args[1](null, {}); // fake out prompt io
-            });
-            waitsFor(function() { return bbcb.wasCalled; }, 'platform add bb');
-            runs(function() {
-                s = spyOn(shell, 'exec').andReturn({code:0});
-                cordova.build(['android','ios'], buildcb);
-            });
-            waitsFor(function() { return buildcb.wasCalled; }, 'emulate android+ios');
-            runs(function() {
-                expect(s.callCount).toEqual(2);
+                var s = spyOn(blackberry_parser.prototype, 'update_project');
+                cordova.emulate('blackberry');
+                expect(s).toHaveBeenCalled();
             });
         });
     });
 
     describe('hooks', function() {
-        var s;
+        var s, sh, ap;
         beforeEach(function() {
-            cordova.create(tempDir);
-            process.chdir(tempDir);
             s = spyOn(hooker.prototype, 'fire').andReturn(true);
         });
-        afterEach(function() {
-            process.chdir(cwd);
-            shell.rm('-rf', tempDir);
-        });
 
         describe('when platforms are added', function() {
             beforeEach(function() {
-                cordova.platform('add', 'android');
-                spyOn(shell, 'exec').andReturn({code:0});
+                shell.mv('-f', path.join(cordova_project, 'platforms', 'blackberry'), path.join(tempDir));
+                shell.mv('-f', path.join(cordova_project, 'platforms', 'ios'), path.join(tempDir));
+                sh = spyOn(shell, 'exec');
+                ap = spyOn(android_parser.prototype, 'update_project');
+                process.chdir(cordova_project);
+            });
+            afterEach(function() {
+                shell.mv('-f', path.join(tempDir, 'blackberry'), path.join(cordova_project, 'platforms', 'blackberry'));
+                shell.mv('-f', path.join(tempDir, 'ios'), path.join(cordova_project, 'platforms', 'ios'));
+                process.chdir(cwd);
             });
 
             it('should fire before hooks through the hooker module', function() {
@@ -289,13 +163,21 @@ xdescribe('emulate command', function() {
             });
             it('should fire after hooks through the hooker module', function() {
                 cordova.emulate();
+                sh.mostRecentCall.args[2](0); //fake shell call
                 expect(s).toHaveBeenCalledWith('after_emulate');
             });
         });
 
         describe('with no platforms added', function() {
+            beforeEach(function() {
+                cordova.create(tempDir);
+                process.chdir(tempDir);
+            });
+            afterEach(function() {
+                process.chdir(cwd);
+            });
             it('should not fire the hooker', function() {
-                spyOn(shell, 'exec').andReturn({code:0});
+                spyOn(shell, 'exec');
                 expect(function() {
                     cordova.emulate();
                 }).toThrow();

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/8296edac/src/emulate.js
----------------------------------------------------------------------
diff --git a/src/emulate.js b/src/emulate.js
index 3e8f08c..39cbb22 100644
--- a/src/emulate.js
+++ b/src/emulate.js
@@ -1,4 +1,3 @@
-
 /**
     Licensed to the Apache Software Foundation (ASF) under one
     or more contributor license agreements.  See the NOTICE file
@@ -31,16 +30,21 @@ var cordova_util = require('./util'),
     hooker = require('../src/hooker'),
     util = require('util');
 
-function shell_out_to_emulate(root, platform) {
+function shell_out_to_emulate(root, platform, callback) {
     var cmd = path.join(root, 'platforms', platform, 'cordova', 'emulate');
     // TODO: PLATFORM LIBRARY INCONSISTENCY 
     if (platform == 'blackberry') {
-        cmd = 'ant -f ' + path.join(root, 'platforms', platform, 'build.xml') + ' qnx load-simulator';
+        cmd = 'ant -f "' + path.join(root, 'platforms', platform, 'build.xml') + '" qnx load-simulator';
     } else if (platform.indexOf('android') > -1) {
         cmd = path.join(root, 'platforms', platform, 'cordova', 'run');
     }
-    var em = shell.exec(cmd, {silent:true});
-    if (em.code > 0) throw 'An error occurred while emulating/deploying the ' + platform + ' project.' + em.output;
+    shell.exec(cmd, {silent:true, async:true}, function(code, output) {
+        if (code > 0) {
+            throw new Error('An error occurred while emulating/deploying the ' + platform + ' project.' + output);
+        } else {
+            callback();
+        }
+    });
 }
 
 module.exports = function emulate (platforms, callback) {
@@ -55,22 +59,22 @@ module.exports = function emulate (platforms, callback) {
 
     if (arguments.length === 0 || (platforms instanceof Array && platforms.length === 0)) {
         platforms = ls(path.join(projectRoot, 'platforms'));
-    } else if (platforms instanceof String) platforms = [platforms];
+    } else if (typeof platforms == 'string') platforms = [platforms];
     else if (platforms instanceof Function && callback === undefined) {
         callback = platforms;
         platforms = ls(path.join(projectRoot, 'platforms'));
     }
 
-    if (platforms.length === 0) throw 'No platforms added to this project. Please use `cordova platform add <platform>`.';
+    if (platforms.length === 0) throw new Error('No platforms added to this project. Please use `cordova platform add <platform>`.');
 
     var hooks = new hooker(projectRoot);
     if (!(hooks.fire('before_emulate'))) {
-        throw 'before_emulate hooks exited with non-zero code. Aborting build.';
+        throw new Error('before_emulate hooks exited with non-zero code. Aborting build.');
     }
 
     var end = n(platforms.length, function() {
         if (!(hooks.fire('after_emulate'))) {
-            throw 'after_emulate hooks exited with non-zero code. Aborting.';
+            throw new Error('after_emulate hooks exited with non-zero code. Aborting.');
         }
         if (callback) callback();
     });
@@ -85,8 +89,7 @@ module.exports = function emulate (platforms, callback) {
 
                 // Update the related platform project from the config
                 parser.update_project(cfg);
-                shell_out_to_emulate(projectRoot, 'android');
-                end();
+                shell_out_to_emulate(projectRoot, 'android', end);
                 break;
             case 'blackberry':
                 platformPath = path.join(projectRoot, 'platforms', 'blackberry');
@@ -95,8 +98,7 @@ module.exports = function emulate (platforms, callback) {
                 // Update the related platform project from the config
                 parser.update_project(cfg, function() {
                     // Shell it
-                    shell_out_to_emulate(projectRoot, 'blackberry');
-                    end();
+                    shell_out_to_emulate(projectRoot, 'blackberry', end);
                 });
                 break;
             case 'ios':
@@ -104,8 +106,7 @@ module.exports = function emulate (platforms, callback) {
                 parser = new ios_parser(platformPath);
                 // Update the related platform project from the config
                 parser.update_project(cfg, function() {
-                    shell_out_to_emulate(projectRoot, 'ios');
-                    end();
+                    shell_out_to_emulate(projectRoot, 'ios', end);
                 });
                 break;
         }