blob: fbb70499bb49735eebf9ef70b1f56dacb6b0c9f0 [file] [log] [blame]
// Copyright 2021 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'chrome://resources/cr_elements/cr_dialog/cr_dialog.m.js';
import {fakeFirmwareUpdates} from 'chrome://accessory-update/fake_data.js';
import {FakeUpdateController} from 'chrome://accessory-update/fake_update_controller.js';
import {FakeUpdateProvider} from 'chrome://accessory-update/fake_update_provider.js';
import {FirmwareUpdateAppElement} from 'chrome://accessory-update/firmware_update_app.js';
import {FirmwareUpdate, UpdateProviderInterface, UpdateState} from 'chrome://accessory-update/firmware_update_types.js';
import {getUpdateProvider, setUpdateControllerForTesting, setUpdateProviderForTesting} from 'chrome://accessory-update/mojo_interface_provider.js';
import {mojoString16ToString} from 'chrome://accessory-update/mojo_utils.js';
import {UpdateCardElement} from 'chrome://accessory-update/update_card.js';
import {assertEquals, assertFalse, assertTrue} from '../../chai_assert.js';
import {flushTasks} from '../../test_util.js';
export function firmwareUpdateAppTest() {
/** @type {?FirmwareUpdateAppElement} */
let page = null;
/** @type {?FakeUpdateProvider} */
let provider = null;
/** @type {?FakeUpdateController} */
let controller = null;
setup(() => {
document.body.innerHTML = '';
controller = new FakeUpdateController();
controller.setUpdateIntervalInMs(0);
setUpdateControllerForTesting(controller);
provider = new FakeUpdateProvider();
setUpdateProviderForTesting(provider);
provider.setFakeFirmwareUpdates(fakeFirmwareUpdates);
page = /** @type {!FirmwareUpdateAppElement} */ (
document.createElement('firmware-update-app'));
document.body.appendChild(page);
});
teardown(() => {
controller.reset();
controller = null;
provider.reset();
provider = null;
page.remove();
page = null;
});
/** @return {!CrDialogElement} */
function getUpdateDialog() {
return page.shadowRoot.querySelector('firmware-update-dialog')
.shadowRoot.querySelector('#updateDialog');
}
/** @return {!Array<!UpdateCardElement>} */
function getUpdateCards() {
const updateList = page.shadowRoot.querySelector('peripheral-updates-list');
return updateList.shadowRoot.querySelectorAll('update-card');
}
/**
* @param {!CrDialogElement} dialogElement
*/
function getNextButton(dialogElement) {
return /** @type {!CrButtonElement} */ (
dialogElement.querySelector('#nextButton'));
}
/** @return {!UpdateState} */
function getUpdateState() {
return page.shadowRoot.querySelector('firmware-update-dialog')
.installationProgress.state;
}
/** @return {!FirmwareUpdate} */
function getFirmwareUpdateFromDialog() {
return page.shadowRoot.querySelector('firmware-update-dialog').update;
}
function getUpdateDialogTitle() {
return /** @type {!HTMLDivElement} */ (
page.shadowRoot.querySelector('firmware-update-dialog')
.shadowRoot.querySelector('#updateDialogTitle'));
}
test('LandingPageLoaded', () => {
// TODO(michaelcheco): Remove this stub test once the page has more
// capabilities to test.
assertEquals(
'Update peripherals',
page.shadowRoot.querySelector('#header').textContent.trim());
});
test('SettingGettingTestProvider', () => {
let fake_provider =
/** @type {!UpdateProviderInterface} */ (new FakeUpdateProvider());
setUpdateProviderForTesting(fake_provider);
assertEquals(fake_provider, getUpdateProvider());
});
test('OpenUpdateDialog', async () => {
await flushTasks();
// Open dialog for first firmware update card.
getUpdateCards()[0].shadowRoot.querySelector(`#updateButton`).click();
// Process |OnStateChanged| and |OnProgressChanged| calls.
await flushTasks();
await flushTasks();
assertTrue(getUpdateDialog().open);
});
test('SuccessfulUpdate', async () => {
await flushTasks();
// Open dialog for firmware update.
getUpdateCards()[1].shadowRoot.querySelector(`#updateButton`).click();
// Process |OnStateChanged| and |OnProgressChanged| calls.
await flushTasks();
await flushTasks();
assertEquals(UpdateState.kUpdating, getUpdateState());
const fakeFirmwareUpdate = getFirmwareUpdateFromDialog();
assertEquals(
`Updating ${mojoString16ToString(fakeFirmwareUpdate.deviceName)}`,
getUpdateDialogTitle().innerText.trim());
// Allow firmware update to complete.
await controller.getUpdateCompletedPromiseForTesting();
await flushTasks();
assertEquals(UpdateState.kSuccess, getUpdateState());
assertTrue(getUpdateDialog().open);
assertEquals(
`Your ${
mojoString16ToString(fakeFirmwareUpdate.deviceName)} is up to date`,
getUpdateDialogTitle().innerText.trim());
});
test('UpdateFailed', async () => {
await flushTasks();
// Open dialog for firmware update. The third fake update in the list
// will fail.
getUpdateCards()[2].shadowRoot.querySelector(`#updateButton`).click();
// Process |OnStateChanged| and |OnProgressChanged| calls.
await flushTasks();
await flushTasks();
assertEquals(UpdateState.kUpdating, getUpdateState());
const fakeFirmwareUpdate = getFirmwareUpdateFromDialog();
assertEquals(
`Updating ${mojoString16ToString(fakeFirmwareUpdate.deviceName)}`,
getUpdateDialogTitle().innerText.trim());
// Allow firmware update to complete.
await controller.getUpdateCompletedPromiseForTesting();
await flushTasks();
assertEquals(UpdateState.kFailed, getUpdateState());
assertTrue(getUpdateDialog().open);
assertEquals(
`Failed to update ${
mojoString16ToString(fakeFirmwareUpdate.deviceName)}`,
getUpdateDialogTitle().innerText.trim());
});
}