blob: 241a5f89e7f2d115883d2d95a9423341dfc487da [file] [log] [blame]
// Copyright 2019 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.
package org.chromium.components.module_installer.builder;
import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.inOrder;
import static org.mockito.Mockito.mock;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InOrder;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.chromium.base.test.BaseRobolectricTestRunner;
import org.chromium.components.module_installer.engine.InstallEngine;
import org.chromium.components.module_installer.engine.InstallListener;
/**
* Test suite for the Module class.
*/
@RunWith(BaseRobolectricTestRunner.class)
public class ModuleTest {
@Mock
private InstallEngine mInstallEngineMock;
private final String mModuleName = "module_stub";
private final Class mInterface = ModuleTestStubInterface.class;
private final String mImplName = ModuleTestStub.class.getName();
private Module<ModuleTestStub> mModule;
/**
* This class needs to be static (for testing purposes).
* https://stackoverflow.com/questions/31396758/why-i-get-java-lang-instantiationexception-here
*/
public static class ModuleTestStub implements ModuleTestStubInterface {}
private interface ModuleTestStubInterface {}
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
mModule = new Module<ModuleTestStub>(mModuleName, mInterface, mImplName);
mModule.setInstallEngine(mInstallEngineMock);
}
@Test
public void whenVerifyingIsInstalled_VerifySequence() {
// Arrange.
InOrder inOrder = inOrder(mInstallEngineMock);
// Act.
mModule.isInstalled();
// Assert.
inOrder.verify(mInstallEngineMock).isInstalled(mModuleName);
inOrder.verifyNoMoreInteractions();
}
@Test
public void whenInstalling_VerifySequence() {
// Arrange.
InstallListener listenerMock = mock(InstallListener.class);
InOrder inOrder = inOrder(mInstallEngineMock, listenerMock);
// Act.
mModule.install(listenerMock);
// Assert.
inOrder.verify(mInstallEngineMock).install(mModuleName, listenerMock);
inOrder.verifyNoMoreInteractions();
}
@Test
public void whenInstallingDeferred_VerifySequence() {
// Arrange.
InOrder inOrder = inOrder(mInstallEngineMock);
// Act.
mModule.installDeferred();
// Assert.
inOrder.verify(mInstallEngineMock).installDeferred(mModuleName);
inOrder.verifyNoMoreInteractions();
}
@Test
public void whenGetImpl_VerifyCorrectInstance() {
// Arrange.
Class expectedType = ModuleTestStub.class;
doReturn(true).when(mInstallEngineMock).isInstalled(mModuleName);
// Act.
ModuleTestStub impl = mModule.getImpl();
// Assert.
assertEquals(expectedType, impl.getClass());
}
@Test(expected = RuntimeException.class)
public void whenGettingUnknownImpl_VerifyError() {
// Arrange.
String impl = "some unknown type";
Module<ModuleTestStub> module = new Module<ModuleTestStub>(mModuleName, mInterface, impl);
doReturn(true).when(mInstallEngineMock).isInstalled(mModuleName);
module.setInstallEngine(mInstallEngineMock);
// Act & Assert.
module.getImpl();
}
}