chromium/ash/webui/firmware_update_ui/resources/mojo_interface_provider.ts

// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import {assert} from 'chrome://resources/js/assert.js';

import {fakeFirmwareUpdates} from './fake_data.js';
import {FakeUpdateController} from './fake_update_controller.js';
import {FakeUpdateProvider} from './fake_update_provider.js';
import {InstallController, InstallControllerInterface, UpdateProvider, UpdateProviderInterface} from './firmware_update.mojom-webui.js';

/**
 * @fileoverview
 * Provides singleton access to mojo interfaces with the ability
 * to override them with test/fake implementations.
 */

/**
 * If true this will replace UpdateProvider with a fake.
 */
let useFakeProviders = false;

let updateProvider: UpdateProviderInterface|null = null;

let updateController: InstallControllerInterface|null = null;

export function setUseFakeProviders(value: boolean): void {
  useFakeProviders = value;
}

export function setUpdateProviderForTesting(
    testProvider: UpdateProviderInterface): void {
  updateProvider = testProvider;
}

export function setUpdateControllerForTesting(
    testUpdateController: InstallControllerInterface): void {
  updateController = testUpdateController;
}

/**
 * Sets up a FakeUpdateProvider to be used at runtime.
 */
function setupFakeUpdateProvider(): void {
  const provider = new FakeUpdateProvider();

  provider.setFakeFirmwareUpdates(fakeFirmwareUpdates);
  setUpdateProviderForTesting(provider);
}

/**
 * Sets up a FakeUpdateController to be used at runtime.
 */
function setupFakeUpdateController(): void {
  setUpdateControllerForTesting(new FakeUpdateController());
}

export function getUpdateProvider(): UpdateProviderInterface {
  if (!updateProvider) {
    if (useFakeProviders) {
      setupFakeUpdateProvider();
    } else {
      updateProvider = UpdateProvider.getRemote();
    }
  }

  assert(!!updateProvider);
  return updateProvider;
}

export function getUpdateController(): InstallControllerInterface {
  if (!updateController) {
    if (useFakeProviders) {
      setupFakeUpdateController();
    } else {
      updateController = InstallController.getRemote();
    }
  }

  assert(!!updateController);
  return updateController;
}