blob: f91eab230a9f93abec52bc76c17709c5bc917b1a [file]
/*
* Copyright (C) 2022 The Android Open Source Project
*
* 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 android.test.lib;
import static com.google.common.truth.Truth.assertThat;
import static com.google.common.truth.Truth.assertWithMessage;
import static org.junit.Assert.assertThrows;
import android.os.SystemProperties;
import androidx.test.platform.app.InstrumentationRegistry;
import com.android.modules.utils.build.SdkLevel;
import org.junit.function.ThrowingRunnable;
import java.io.File;
public final class TestUtils {
public static void assertLibraryInaccessible(ThrowingRunnable loadLibrary) {
Throwable t = assertThrows(UnsatisfiedLinkError.class, loadLibrary);
assertThat(t.getMessage())
.containsMatch("dlopen failed: .* (not found|not accessible for the namespace)");
}
public static String libPath(String dir, String libName) {
String libDirName = InstrumentationRegistry.getArguments().getString("libDirName");
return dir + "/" + libDirName + "/lib" + libName + ".so";
}
// True if we have to skip testing public libraries in the product
// partition, which got supported in T.
public static boolean skipPublicProductLibTests() {
return !SdkLevel.isAtLeastT();
}
// True if apps in product partitions get shared library namespaces, so we
// cannot test that libs in system and system_ext get blocked.
public static boolean productAppsAreShared() {
return !SdkLevel.isAtLeastU() && SystemProperties.get("ro.product.vndk.version").isEmpty();
}
// True if apps and shared Java libs in system/product/vendor partitions are
// able to load private native libs in the same partition.
public static boolean canLoadPrivateLibsFromSamePartition() {
return SdkLevel.isAtLeastV();
}
// Test that private libs are present, as a safeguard so that the dlopen
// failures we expect in other tests aren't due to them not being there.
public static void testPrivateLibsExist(String libDir, String libStem) {
// Remember to update pushPrivateLibs in LibnativeloaderTest.java when
// the number of libraries changes.
for (int i = 1; i <= 10; ++i) {
String libPath = libPath(libDir, libStem + i);
assertWithMessage(libPath + " does not exist")
.that(new File(libPath).exists())
.isTrue();
}
}
}