/* * Copyright 2022 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.android.libraries.mobiledatadownload.testing; import android.content.Context; import com.google.android.libraries.mobiledatadownload.TimeSource; import com.google.android.libraries.mobiledatadownload.internal.logging.LoggingStateStore; import com.google.android.libraries.mobiledatadownload.internal.logging.SharedPreferencesLoggingState; import com.google.common.base.Optional; import com.google.common.util.concurrent.ListeningExecutorService; import com.google.common.util.concurrent.MoreExecutors; import com.google.common.util.concurrent.ThreadFactoryBuilder; import java.util.Random; import java.util.concurrent.Executor; import java.util.concurrent.Executors; /** * Utility class that provides support for building MDD with different types of dependencies for * Testing. * *
If multiple type of dependencies need to be supported across tests, they can be defined here * so all tests can rely on a single definition. This is useful for parameterizing tests, such as * the case for ControlExecutor: * *
{@code
* // In the test, define a parameter for ExecutorType
* @TestParameter ExecutorType controlExecutorType;
*
* // When building MDD in the test, rely on the shared provider:
* MobileDataDownloadBuilder.newBuilder()
* .setControlExecutor(controlExecutorType.executor())
* // include other dependencies...
* .build();
*
* }
*/
public final class MddTestDependencies {
private static final String ALPHABET = "abcdefghijklmnopqrstuvwxyz";
private static final int INSTANCE_ID_CHAR_LIMIT = 10;
private static final Random random = new Random();
private MddTestDependencies() {
}
/**
* Generates a random instance id.
*
* This prevents potential cross test conflicts from occurring since metadata will be siloed * between tests. */ public static String randomInstanceId() { StringBuilder sb = new StringBuilder(); for (int i = 0; i < INSTANCE_ID_CHAR_LIMIT; i++) { sb.append(ALPHABET.charAt(random.nextInt(ALPHABET.length()))); } return sb.toString(); } /** * Type of executor passed when building MDD. * *
Used for parameterizing tests. */ public enum ExecutorType { SINGLE_THREADED, MULTI_THREADED; public ListeningExecutorService executor() { switch (this) { case SINGLE_THREADED: return MoreExecutors.listeningDecorator( Executors.newSingleThreadExecutor( new ThreadFactoryBuilder().setNameFormat( "MddSingleThreaded-%d").build())); case MULTI_THREADED: return MoreExecutors.listeningDecorator( Executors.newCachedThreadPool( new ThreadFactoryBuilder().setNameFormat( "MddMultiThreaded-%d").build())); } throw new AssertionError("ExecutorType unsupported"); } } /** * Differentiates between Downloader Configurations. * *
Used for parameterizing tests, as well as for making configuration-specific test
* assertions.
*/
// public enum DownloaderConfigurationType {
// V2_PLATFORM;
//
// public Supplier Used for parameterizing tests, as well as for making configuration-specific test
* assertions.
*/
public enum LoggingStateStoreImpl {
SHARED_PREFERENCES;
public LoggingStateStore loggingStateStore(
Context context,
Optional