Skip to content

Commit

Permalink
feat: add listTarget api (apache#1602)
Browse files Browse the repository at this point in the history
* feat: add listTarget api
* test: write Platform API target list specs
  • Loading branch information
erisu authored and breautek committed Oct 21, 2023
1 parent c4b012e commit 0986637
Show file tree
Hide file tree
Showing 4 changed files with 97 additions and 0 deletions.
6 changes: 6 additions & 0 deletions lib/Api.js
Original file line number Diff line number Diff line change
Expand Up @@ -277,6 +277,12 @@ class Api {
});
}

listTargets (options) {
return require('./check_reqs').check_android().then(() => {
return require('./run').runListDevices.call(this, options);
});
}

/**
* Cleans out the build artifacts from platform's directory, and also
* cleans out the platform www directory if called without options specified.
Expand Down
46 changes: 46 additions & 0 deletions lib/run.js
Original file line number Diff line number Diff line change
Expand Up @@ -83,3 +83,49 @@ module.exports.run = async function (runOptions = {}) {

return target.install(resolvedTarget, { manifest, buildResults, cordovaGradleConfigParser });
};

module.exports.listDevices = async function () {
events.emit('log', `\nAvailable ${this.platform} devices:`);

const { list } = require('./target');

await list().then(targets => {
const deviceIds = targets
.filter(({ type }) => type === 'device')
.map(({ id }) => id);

console.log(deviceIds.join('\n'));
}, function (err) {
console.error('ERROR: ' + err);
process.exit(2);
});
};

module.exports.listEmulators = async function () {
events.emit('log', `\nAvailable ${this.platform} virtual devices:`);
const emulators = require('./emulator');

await emulators.list_images().then(function (emulator_list) {
emulator_list && emulator_list.forEach(function (emu) {
console.log(emu.name);
});
}, function (err) {
console.error('ERROR: ' + err);
process.exit(2);
});
};

module.exports.runListDevices = async function (options = {}) {
const { options: cliArgs = {} } = options;

if (cliArgs?.device) {
await module.exports.listDevices.call(this);
} else if (cliArgs?.emulator) {
await module.exports.listEmulators.call(this);
} else {
await module.exports.listDevices.call(this);
await module.exports.listEmulators.call(this);
}

return true;
};
17 changes: 17 additions & 0 deletions spec/unit/Api.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@ const EventEmitter = require('events');

const Api = require('../../lib/Api');
const AndroidProject = require('../../lib/AndroidProject');
const check_reqs = require('../../lib/check_reqs');
const run_mod = require('../../lib/run');

const PluginInfo = common.PluginInfo;

Expand Down Expand Up @@ -60,4 +62,19 @@ describe('Api', () => {
});
});
});

describe('listTargets', () => {
let api;

beforeEach(() => {
api = new Api('android', FAKE_PROJECT_DIR, new EventEmitter());
spyOn(check_reqs, 'run').and.returnValue(Promise.resolve());
});
it('should call into lib/run module', () => {
spyOn(run_mod, 'runListDevices');
return api.listTargets().then(() => {
expect(run_mod.runListDevices).toHaveBeenCalled();
});
});
});
});
28 changes: 28 additions & 0 deletions spec/unit/run.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -106,4 +106,32 @@ describe('run', () => {
.toBeRejectedWithError(/Package type "bundle" is not supported/);
});
});

describe('--list option', () => {
beforeEach(() => {
spyOn(run, 'listDevices').and.returnValue(Promise.resolve());
spyOn(run, 'listEmulators').and.returnValue(Promise.resolve());
});

it('should delegate to "listDevices" when the "runListDevices" method options param contains "options.device".', () => {
return run.runListDevices({ options: { device: true } }).then(() => {
expect(run.listDevices).toHaveBeenCalled();
expect(run.listEmulators).not.toHaveBeenCalled();
});
});

it('should delegate to "listDevices" when the "runListDevices" method options param contains "options.emulator".', () => {
return run.runListDevices({ options: { emulator: true } }).then(() => {
expect(run.listDevices).not.toHaveBeenCalled();
expect(run.listEmulators).toHaveBeenCalled();
});
});

it('should delegate to both "listEmulators" and "listDevices" when the "runListDevices" method does not contain "options.device" or "options.emulator".', () => {
return run.runListDevices({ options: {} }).then(() => {
expect(run.listDevices).toHaveBeenCalled();
expect(run.listEmulators).toHaveBeenCalled();
});
});
});
});

0 comments on commit 0986637

Please sign in to comment.