// Copyright 2016 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.net.smoke;
import static com.google.common.truth.Truth.assertThat;
import static com.google.common.truth.Truth.assertWithMessage;
import static org.chromium.net.smoke.CronetSmokeTestRule.assertJavaEngine;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.SmallTest;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.junit.runner.RunWith;
import org.chromium.net.CronetEngine;
import org.chromium.net.CronetProvider;
import org.chromium.net.ExperimentalCronetEngine;
import java.util.List;
/**
* Tests scenarios when the native shared library file is missing in the APK or was built for a
* wrong architecture.
*/
@RunWith(AndroidJUnit4.class)
public class MissingNativeLibraryTest {
@Rule public CronetSmokeTestRule mRule = new CronetPlatformSmokeTestRule();
@Rule public ExpectedException thrown = ExpectedException.none();
/** If the ".so" file is missing, instantiating the Cronet engine should throw an exception. */
@Test
@SmallTest
public void testExceptionWhenSoFileIsAbsent() throws Exception {
ExperimentalCronetEngine.Builder builder =
new ExperimentalCronetEngine.Builder(ApplicationProvider.getApplicationContext());
thrown.expect(UnsatisfiedLinkError.class);
builder.build();
}
/**
* Tests the embedder ability to select Java (platform) based implementation when the native
* library is missing or doesn't load for some reason,
*/
@Test
@SmallTest
public void testForceChoiceOfJavaEngine() throws Exception {
List<CronetProvider> availableProviders =
CronetProvider.getAllProviders(ApplicationProvider.getApplicationContext());
boolean foundNativeProvider = false;
CronetProvider platformProvider = null;
for (CronetProvider provider : availableProviders) {
if (provider.getName().equals(CronetProvider.PROVIDER_NAME_APP_PACKAGED)) {
assertThat(provider.isEnabled()).isTrue();
foundNativeProvider = true;
} else if (provider.getName().equals(CronetProvider.PROVIDER_NAME_FALLBACK)) {
assertThat(provider.isEnabled()).isTrue();
platformProvider = provider;
}
}
assertWithMessage("Unable to find the native cronet provider")
.that(foundNativeProvider)
.isTrue();
assertWithMessage("Unable to find the platform cronet provider")
.that(platformProvider)
.isNotNull();
CronetEngine.Builder builder = platformProvider.createBuilder();
CronetEngine engine = builder.build();
assertJavaEngine(engine);
assertWithMessage(
"It should be always possible to cast the created builder to"
+ " ExperimentalCronetEngine.Builder")
.that(builder)
.isInstanceOf(ExperimentalCronetEngine.Builder.class);
assertWithMessage(
"It should be always possible to cast the created engine to"
+ " ExperimentalCronetEngine.Builder")
.that(engine)
.isInstanceOf(ExperimentalCronetEngine.class);
}
}