Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
95 changes: 95 additions & 0 deletions src/DeviceInfo.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
export interface DeviceInfoResult {
/**
* The host used to fetch this `device-info` response. If an alpha-numeric host was given, this will be the dns-resolved IP address
* @example 192.168.1.10
*/
host: string;
/**
* The port used to run the `device-info` request
* @example 8060
*/
port: number;
/**
* The full device-info URL
* @example "http://192.168.1.10:8060/query/device-info"
*/
url: string;
/**
* All of the `device-info` data retrieved from the device.
* Any "true" and "false" values have been converted to booleans, and strings containing just numbers have been converted to proper numbers
*/
deviceInfo: {
'udn'?: string;
'serial-number'?: string;
'device-id'?: string;
'advertising-id'?: string;
'vendor-name'?: string;
'model-name'?: string;
'model-number'?: string;
'model-region'?: string;
'is-tv'?: boolean;
'is-stick'?: boolean;
'mobile-has-live-tv'?: boolean;
'ui-resolution'?: string;
'supports-ethernet'?: boolean;
'wifi-mac'?: string;
'wifi-driver'?: string;
'has-wifi-extender'?: boolean;
'has-wifi-5G-support'?: boolean;
'can-use-wifi-extender'?: boolean;
'ethernet-mac'?: string;
'network-type'?: string;
'network-name'?: string;
'friendly-device-name'?: string;
'friendly-model-name'?: string;
'default-device-name'?: string;
'user-device-name'?: string;
'user-device-location'?: string;
'build-number'?: string;
'software-version'?: string;
'software-build'?: number;
'secure-device'?: boolean;
'language'?: string;
'country'?: string;
'locale'?: string;
'time-zone-auto'?: boolean;
'time-zone'?: string;
'time-zone-name'?: string;
'time-zone-tz'?: string;
'time-zone-offset'?: number;
'clock-format'?: string;
'uptime'?: number;
'power-mode'?: string;
'supports-suspend'?: boolean;
'supports-find-remote'?: boolean;
'find-remote-is-possible'?: boolean;
'supports-audio-guide'?: boolean;
'supports-rva'?: boolean;
'has-hands-free-voice-remote'?: boolean;
'developer-enabled'?: boolean;
'keyed-developer-id'?: string;
'search-enabled'?: boolean;
'search-channels-enabled'?: boolean;
'voice-search-enabled'?: boolean;
'notifications-enabled'?: boolean;
'notifications-first-use'?: boolean;
'supports-private-listening'?: boolean;
'headphones-connected'?: boolean;
'supports-audio-settings'?: boolean;
'supports-ecs-textedit'?: boolean;
'supports-ecs-microphone'?: boolean;
'supports-wake-on-wlan'?: boolean;
'supports-airplay'?: boolean;
'has-play-on-roku'?: boolean;
'has-mobile-screensaver'?: boolean;
'support-url'?: string;
'grandcentral-version'?: string;
'trc-version'?: number;
'trc-channel-version'?: string;
'davinci-version'?: string;
'av-sync-calibration-enabled'?: number;
'brightscript-debugger-version'?: string;
// catchall index lookup for keys we weren't aware of
[key: string]: any;
};
}
200 changes: 127 additions & 73 deletions src/RokuDeploy.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,7 @@ describe('index', () => {
return {} as any;
});

let results = await rokuDeploy['doGetRequest']({});
let results = await rokuDeploy['doGetRequest']({} as any);
expect(results.body).to.equal(body);
});

Expand All @@ -156,7 +156,7 @@ describe('index', () => {
});

try {
await rokuDeploy['doGetRequest']({});
await rokuDeploy['doGetRequest']({} as any);
} catch (e) {
expect(e).to.equal(error);
return;
Expand Down Expand Up @@ -221,79 +221,133 @@ describe('index', () => {
});

describe('getDeviceInfo', () => {
const body = `<device-info>
<udn>29380007-0800-1025-80a4-d83154332d7e</udn>
<serial-number>123</serial-number>
<device-id>456</device-id>
<advertising-id>2cv488ca-d6ec-5222-9304-1925e72d0122</advertising-id>
<vendor-name>Roku</vendor-name>
<model-name>Roku Ultra</model-name>
<model-number>4660X</model-number>
<model-region>US</model-region>
<is-tv>false</is-tv>
<is-stick>false</is-stick>
<supports-ethernet>true</supports-ethernet>
<wifi-mac>d8:31:34:33:6d:6e</wifi-mac>
<wifi-driver>realtek</wifi-driver>
<has-wifi-extender>false</has-wifi-extender>
<has-wifi-5G-support>true</has-wifi-5G-support>
<can-use-wifi-extender>true</can-use-wifi-extender>
<ethernet-mac>e8:31:34:36:2d:2e</ethernet-mac>
<network-type>ethernet</network-type>
<friendly-device-name>Brian's Roku Ultra</friendly-device-name>
<friendly-model-name>Roku Ultra</friendly-model-name>
<default-device-name>Roku Ultra - YB0072009656</default-device-name>
<user-device-name>Brian's Roku Ultra</user-device-name>
<user-device-location>Hot Tub</user-device-location>
<build-number>469.30E04170A</build-number>
<software-version>9.3.0</software-version>
<software-build>4170</software-build>
<secure-device>true</secure-device>
<language>en</language>
<country>US</country>
<locale>en_US</locale>
<time-zone-auto>true</time-zone-auto>
<time-zone>US/Eastern</time-zone>
<time-zone-name>United States/Eastern</time-zone-name>
<time-zone-tz>America/New_York</time-zone-tz>
<time-zone-offset>-240</time-zone-offset>
<clock-format>12-hour</clock-format>
<uptime>19799</uptime>
<power-mode>PowerOn</power-mode>
<supports-suspend>false</supports-suspend>
<supports-find-remote>true</supports-find-remote>
<find-remote-is-possible>true</find-remote-is-possible>
<supports-audio-guide>true</supports-audio-guide>
<supports-rva>true</supports-rva>
<developer-enabled>true</developer-enabled>
<keyed-developer-id>789</keyed-developer-id>
<search-enabled>true</search-enabled>
<search-channels-enabled>true</search-channels-enabled>
<voice-search-enabled>true</voice-search-enabled>
<notifications-enabled>true</notifications-enabled>
<notifications-first-use>false</notifications-first-use>
<supports-private-listening>true</supports-private-listening>
<headphones-connected>false</headphones-connected>
<supports-ecs-textedit>true</supports-ecs-textedit>
<supports-ecs-microphone>true</supports-ecs-microphone>
<supports-wake-on-wlan>false</supports-wake-on-wlan>
<has-play-on-roku>true</has-play-on-roku>
<has-mobile-screensaver>true</has-mobile-screensaver>
<support-url>roku.com/support</support-url>
<grandcentral-version>3.1.39</grandcentral-version>
<trc-version>3.0</trc-version>
<trc-channel-version>2.9.42</trc-channel-version>
<davinci-version>2.8.20</davinci-version>
</device-info>`;

it('should return device info matching what was returned by ECP', async () => {
const expectedSerialNumber = 'expectedSerialNumber';
const expectedDeviceId = 'expectedDeviceId';
const expectedDeveloperId = 'expectedDeveloperId';
const body = `<device-info>
<udn>29380007-0800-1025-80a4-d83154332d7e</udn>
<serial-number>${expectedSerialNumber}</serial-number>
<device-id>${expectedDeviceId}</device-id>
<advertising-id>2cv488ca-d6ec-5222-9304-1925e72d0122</advertising-id>
<vendor-name>Roku</vendor-name>
<model-name>Roku Ultra</model-name>
<model-number>4660X</model-number>
<model-region>US</model-region>
<is-tv>false</is-tv>
<is-stick>false</is-stick>
<supports-ethernet>true</supports-ethernet>
<wifi-mac>d8:31:34:33:6d:6e</wifi-mac>
<wifi-driver>realtek</wifi-driver>
<has-wifi-extender>false</has-wifi-extender>
<has-wifi-5G-support>true</has-wifi-5G-support>
<can-use-wifi-extender>true</can-use-wifi-extender>
<ethernet-mac>e8:31:34:36:2d:2e</ethernet-mac>
<network-type>ethernet</network-type>
<friendly-device-name>Brian's Roku Ultra</friendly-device-name>
<friendly-model-name>Roku Ultra</friendly-model-name>
<default-device-name>Roku Ultra - YB0072009656</default-device-name>
<user-device-name>Brian's Roku Ultra</user-device-name>
<user-device-location>Hot Tub</user-device-location>
<build-number>469.30E04170A</build-number>
<software-version>9.3.0</software-version>
<software-build>4170</software-build>
<secure-device>true</secure-device>
<language>en</language>
<country>US</country>
<locale>en_US</locale>
<time-zone-auto>true</time-zone-auto>
<time-zone>US/Eastern</time-zone>
<time-zone-name>United States/Eastern</time-zone-name>
<time-zone-tz>America/New_York</time-zone-tz>
<time-zone-offset>-240</time-zone-offset>
<clock-format>12-hour</clock-format>
<uptime>19799</uptime>
<power-mode>PowerOn</power-mode>
<supports-suspend>false</supports-suspend>
<supports-find-remote>true</supports-find-remote>
<find-remote-is-possible>true</find-remote-is-possible>
<supports-audio-guide>true</supports-audio-guide>
<supports-rva>true</supports-rva>
<developer-enabled>true</developer-enabled>
<keyed-developer-id>${expectedDeveloperId}</keyed-developer-id>
<search-enabled>true</search-enabled>
<search-channels-enabled>true</search-channels-enabled>
<voice-search-enabled>true</voice-search-enabled>
<notifications-enabled>true</notifications-enabled>
<notifications-first-use>false</notifications-first-use>
<supports-private-listening>true</supports-private-listening>
<headphones-connected>false</headphones-connected>
<supports-ecs-textedit>true</supports-ecs-textedit>
<supports-ecs-microphone>true</supports-ecs-microphone>
<supports-wake-on-wlan>false</supports-wake-on-wlan>
<has-play-on-roku>true</has-play-on-roku>
<has-mobile-screensaver>true</has-mobile-screensaver>
<support-url>roku.com/support</support-url>
<grandcentral-version>3.1.39</grandcentral-version>
<trc-version>3.0</trc-version>
<trc-channel-version>2.9.42</trc-channel-version>
<davinci-version>2.8.20</davinci-version>
</device-info>`;
mockDoGetRequest(body);
const deviceInfo = await rokuDeploy.getDeviceInfo(options);
expect(deviceInfo['serial-number']).to.equal(expectedSerialNumber);
expect(deviceInfo['device-id']).to.equal(expectedDeviceId);
expect(deviceInfo['keyed-developer-id']).to.equal(expectedDeveloperId);
expect(deviceInfo['serial-number']).to.equal('123');
expect(deviceInfo['device-id']).to.equal('456');
expect(deviceInfo['keyed-developer-id']).to.equal('789');
});

it('should default to port 8060 if not provided', async () => {
mockDoGetRequest(body);
const result = await rokuDeploy.getDeviceInfo('192.168.1.10');
expect(result.port).to.eql(8060);
});

it('should use given port if provided', async () => {
mockDoGetRequest(body);
const result = await rokuDeploy.getDeviceInfo('192.168.1.10', 9999);
expect(result.port).to.eql(9999);
});

it('should sanitize additional data when the host+param+format signature is triggered', async () => {
mockDoGetRequest(body);
const result = await rokuDeploy.getDeviceInfo('192.168.1.10', 8060);
expect(result).to.include({
host: '192.168.1.10',
port: 8060,
url: 'http://192.168.1.10:8060/query/device-info'
});
expect(result.deviceInfo).to.include({
// make sure the number fields are turned into numbers
'software-build': 4170,
'uptime': 19799,
'trc-version': 3.0,
'time-zone-offset': -240,

// string booleans should be turned into booleans
'is-tv': false,
'is-stick': false,
'supports-ethernet': true,
'has-wifi-extender': false,
'has-wifi-5G-support': true,
'secure-device': true,
'time-zone-auto': true,
'supports-suspend': false,
'supports-find-remote': true,
'find-remote-is-possible': true,
'supports-audio-guide': true,
'supports-rva': true,
'developer-enabled': true,
'search-enabled': true,
'search-channels-enabled': true,
'voice-search-enabled': true,
'notifications-enabled': true,
'notifications-first-use': false,
'supports-private-listening': true,
'headphones-connected': false,
'supports-ecs-textedit': true,
'supports-ecs-microphone': true,
'supports-wake-on-wlan': false,
'has-play-on-roku': true,
'has-mobile-screensaver': true
});
});

it('should throw our error on failure', async () => {
Expand Down Expand Up @@ -349,7 +403,7 @@ describe('index', () => {
});
const copyPaths = [] as Array<{ src: string; dest: string }>;
sinon.stub(rokuDeploy.fsExtra as any, 'copy').callsFake((src, dest) => {
copyPaths.push({ src: src, dest: dest });
copyPaths.push({ src: src as string, dest: dest as string });
return Promise.resolve();
});

Expand Down
Loading