| // Copyright 2018 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.chrome.browser.customtabs.dynamicmodule; |
| |
| import static org.junit.Assert.assertEquals; |
| import static org.junit.Assert.assertNotNull; |
| |
| import static org.chromium.chrome.browser.customtabs.dynamicmodule |
| .CustomTabsDynamicModuleTestUtils.FAKE_MODULE_COMPONENT_NAME; |
| |
| import android.support.test.filters.SmallTest; |
| |
| import org.junit.Before; |
| import org.junit.Rule; |
| import org.junit.Test; |
| import org.junit.runner.RunWith; |
| |
| import org.chromium.base.Callback; |
| import org.chromium.base.library_loader.LibraryLoader; |
| import org.chromium.base.library_loader.LibraryProcessType; |
| import org.chromium.base.test.util.CallbackHelper; |
| import org.chromium.chrome.browser.ChromeFeatureList; |
| import org.chromium.chrome.test.ChromeJUnit4ClassRunner; |
| import org.chromium.chrome.test.util.browser.Features; |
| |
| import java.util.ArrayList; |
| import java.util.List; |
| import java.util.concurrent.TimeoutException; |
| |
| /** |
| * Tests for {@link ModuleLoader}. |
| */ |
| @RunWith(ChromeJUnit4ClassRunner.class) |
| public class CustomTabsDynamicModuleLoaderTest { |
| @Before |
| public void setUp() throws Exception { |
| LibraryLoader.getInstance().ensureInitialized(LibraryProcessType.PROCESS_BROWSER); |
| } |
| |
| @Rule |
| public Features.JUnitProcessor mProcessor = new Features.JUnitProcessor(); |
| |
| /** |
| * Test fake dynamic module is correctly loaded. |
| */ |
| @Test |
| @SmallTest |
| public void testModuleLoading() throws TimeoutException, InterruptedException { |
| ModuleLoader moduleLoader = new ModuleLoader(FAKE_MODULE_COMPONENT_NAME); |
| moduleLoader.loadModule(); |
| |
| CallbackHelper onLoaded = new CallbackHelper(); |
| moduleLoader.addCallbackAndIncrementUseCount( |
| result -> { |
| assertNotNull(result); |
| onLoaded.notifyCalled(); |
| }); |
| |
| onLoaded.waitForCallback(); |
| } |
| |
| /** |
| * Test the ModuleLoader correctly update module usage counter. |
| */ |
| @Test |
| @SmallTest |
| @Features.EnableFeatures({ChromeFeatureList.CCT_MODULE, ChromeFeatureList.CCT_MODULE_CACHE}) |
| public void testModuleUseCounter() throws TimeoutException, InterruptedException { |
| final int callbacksNumber = 3; |
| ModuleLoader moduleLoader = new ModuleLoader(FAKE_MODULE_COMPONENT_NAME); |
| |
| CallbackHelper onLoaded = new CallbackHelper(); |
| |
| // Test we correctly unregister callbacks which were never notified. |
| List<Callback<ModuleEntryPoint>> unusedCallbacks = new ArrayList<>(); |
| for (int i = 0; i < callbacksNumber; i++) { |
| unusedCallbacks.add(result -> {}); |
| moduleLoader.addCallbackAndIncrementUseCount(unusedCallbacks.get(i)); |
| } |
| // module has not been loaded, therefore there is no usage |
| assertEquals(0, moduleLoader.getModuleUseCount()); |
| |
| // unregister all callbacks so they should not increment module usage |
| for (int i = 0; i < callbacksNumber; i++) { |
| moduleLoader.removeCallbackAndDecrementUseCount(unusedCallbacks.get(i)); |
| } |
| |
| assertEquals(0, moduleLoader.getModuleUseCount()); |
| |
| moduleLoader.loadModule(); |
| |
| List<Callback<ModuleEntryPoint>> callbacks = new ArrayList<>(); |
| // register callbacks and wait for the notification when module is loaded |
| for (int i = 0; i < callbacksNumber; i++) { |
| callbacks.add(result -> onLoaded.notifyCalled()); |
| moduleLoader.addCallbackAndIncrementUseCount(callbacks.get(i)); |
| } |
| onLoaded.waitForCallback(0, callbacksNumber); |
| |
| assertEquals(callbacksNumber, moduleLoader.getModuleUseCount()); |
| |
| // unregister already notified callbacks |
| for (int i = 0; i < callbacksNumber; i++) { |
| moduleLoader.removeCallbackAndDecrementUseCount(callbacks.get(i)); |
| } |
| assertEquals(0, moduleLoader.getModuleUseCount()); |
| } |
| } |