diff --git a/bin/templates/cordova/lib/emulator.js b/bin/templates/cordova/lib/emulator.js index 6828176b..edb7c800 100644 --- a/bin/templates/cordova/lib/emulator.js +++ b/bin/templates/cordova/lib/emulator.js @@ -207,11 +207,11 @@ module.exports.best_image = function () { var closest = 9999; var best = images[0]; - var project_target = check_reqs.get_target().replace('android-', ''); + var project_target = parseInt(check_reqs.get_target().replace('android-', '')); for (var i in images) { var target = images[i].target; - if (target) { - var num = target.split('(API level ')[1].replace(')', ''); + if (target && target.indexOf('API level') > -1) { + var num = parseInt(target.split('(API level ')[1].replace(')', '')); if (num === project_target) { return images[i]; } else if (project_target - num < closest && project_target > num) { diff --git a/package.json b/package.json index f40983f3..88a0da7f 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "author": "Apache Software Foundation", "license": "Apache-2.0", "dependencies": { - "android-versions": "^1.2.0", + "android-versions": "^1.2.1", "cordova-common": "^2.1.0", "elementtree": "0.1.6", "nopt": "^3.0.1", @@ -38,6 +38,7 @@ "shelljs": "^0.5.3" }, "bundledDependencies": [ + "android-versions", "cordova-common", "elementtree", "nopt", diff --git a/spec/unit/emulator.spec.js b/spec/unit/emulator.spec.js index 551ab6d0..60d7a8ac 100644 --- a/spec/unit/emulator.spec.js +++ b/spec/unit/emulator.spec.js @@ -18,6 +18,7 @@ */ var emu = require('../../bin/templates/cordova/lib/emulator'); +var check_reqs = require('../../bin/templates/cordova/lib/check_reqs'); var superspawn = require('cordova-common').superspawn; var Q = require('q'); var fs = require('fs'); @@ -156,4 +157,68 @@ describe('emulator', function () { }); }); }); + describe('best_image', function () { + var avds_promise; + var target_mock; + beforeEach(function () { + avds_promise = Q.defer(); + spyOn(emu, 'list_images').and.returnValue(avds_promise.promise); + target_mock = spyOn(check_reqs, 'get_target').and.returnValue('android-26'); + }); + it('should return undefined if there are no defined AVDs', function (done) { + avds_promise.resolve([]); + emu.best_image().then(function (best_avd) { + expect(best_avd).toBeUndefined(); + }).fail(function (err) { + expect(err).toBeUndefined(); + }).fin(done); + }); + it('should return the first available image if there is no available target information for existing AVDs', function (done) { + var fake_avd = { name: 'MyFakeAVD' }; + var second_fake_avd = { name: 'AnotherAVD' }; + avds_promise.resolve([fake_avd, second_fake_avd]); + emu.best_image().then(function (best_avd) { + expect(best_avd).toBe(fake_avd); + }).fail(function (err) { + expect(err).toBeUndefined(); + }).fin(done); + }); + it('should return the first AVD for the API level that matches the project target', function (done) { + target_mock.and.returnValue('android-25'); + var fake_avd = { name: 'MyFakeAVD', target: 'Android 7.0 (API level 24)' }; + var second_fake_avd = { name: 'AnotherAVD', target: 'Android 7.1 (API level 25)' }; + var third_fake_avd = { name: 'AVDThree', target: 'Android 8.0 (API level 26)' }; + avds_promise.resolve([fake_avd, second_fake_avd, third_fake_avd]); + emu.best_image().then(function (best_avd) { + expect(best_avd).toBe(second_fake_avd); + }).fail(function (err) { + expect(err).toBeUndefined(); + }).fin(done); + }); + it('should return the AVD with API level that is closest to the project target API level, without going over', function (done) { + target_mock.and.returnValue('android-26'); + var fake_avd = { name: 'MyFakeAVD', target: 'Android 7.0 (API level 24)' }; + var second_fake_avd = { name: 'AnotherAVD', target: 'Android 7.1 (API level 25)' }; + var third_fake_avd = { name: 'AVDThree', target: 'Android 99.0 (API level 134)' }; + avds_promise.resolve([fake_avd, second_fake_avd, third_fake_avd]); + emu.best_image().then(function (best_avd) { + expect(best_avd).toBe(second_fake_avd); + }).fail(function (err) { + expect(err).toBeUndefined(); + }).fin(done); + }); + it('should not try to compare API levels when an AVD definition is missing API level info', function (done) { + avds_promise.resolve([ { name: 'Samsung_S8_API_26', + device: 'Samsung S8+ (User)', + path: '/Users/daviesd/.android/avd/Samsung_S8_API_26.avd', + abi: 'google_apis/x86', + target: 'Android 8.0' + }]); + emu.best_image().then(function (best_avd) { + expect(best_avd).toBeDefined(); + }).fail(function (err) { + expect(err).toBeUndefined(); + }).fin(done); + }); + }); });