Reland "base/android: Remove linker tests support."
This reverts commit 8e6f857273
.
Reason for reland: The dependency which broke was removed in
https://chromium-review.googlesource.com/c/chromium/src/+/2093606
Original change's description:
> base/android: Remove linker tests support.
>
> The linker tests don't run on bots (and likely not locally either) and
> do not support the latest library loading patterns. This is the first
> step to remove them, as they add non-trivial complexity in the codebase.
>
> Bug: 1059707
> Change-Id: Ia14693419792f57dc4f65b2fc7f999e833aec42e
> Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2095059
> Reviewed-by: Yaron Friedman <yfriedman@chromium.org>
> Reviewed-by: Egor Pasko <pasko@chromium.org>
> Commit-Queue: Benoit L <lizeb@chromium.org>
> Cr-Commit-Position: refs/heads/master@{#748365}
Bug: 1059707
Change-Id: I3ad7347fdf4868d83ebf1895bee1bd85940ea324
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2098785
Reviewed-by: Egor Pasko <pasko@chromium.org>
Reviewed-by: Yaron Friedman <yfriedman@chromium.org>
Reviewed-by: Benoit L <lizeb@chromium.org>
Commit-Queue: Benoit L <lizeb@chromium.org>
Cr-Commit-Position: refs/heads/master@{#750278}
This commit is contained in:
base/android/java/src/org/chromium/base/library_loader
content/public/android/java/src/org/chromium/content
@@ -36,6 +36,7 @@ class LegacyLinker extends Linker {
|
|||||||
void loadLibraryImplLocked(String library, boolean isFixedAddressPermitted) {
|
void loadLibraryImplLocked(String library, boolean isFixedAddressPermitted) {
|
||||||
ensureInitializedLocked();
|
ensureInitializedLocked();
|
||||||
assert mState == State.INITIALIZED; // Only one successful call.
|
assert mState == State.INITIALIZED; // Only one successful call.
|
||||||
|
assert !NativeLibraries.sEnableLinkerTests;
|
||||||
|
|
||||||
boolean provideRelro = mInBrowserProcess;
|
boolean provideRelro = mInBrowserProcess;
|
||||||
long loadAddress = isFixedAddressPermitted ? mBaseLoadAddress : 0;
|
long loadAddress = isFixedAddressPermitted ? mBaseLoadAddress : 0;
|
||||||
@@ -50,17 +51,6 @@ class LegacyLinker extends Linker {
|
|||||||
}
|
}
|
||||||
libInfo.mLibFilePath = libFilePath;
|
libInfo.mLibFilePath = libFilePath;
|
||||||
|
|
||||||
// Print the load address to the logcat when testing the linker. The format
|
|
||||||
// of the string is expected by the Python test_runner script as one of:
|
|
||||||
// BROWSER_LIBRARY_ADDRESS: <library-name> <address>
|
|
||||||
// RENDERER_LIBRARY_ADDRESS: <library-name> <address>
|
|
||||||
// Where <library-name> is the library name, and <address> is the hexadecimal load
|
|
||||||
// address.
|
|
||||||
if (NativeLibraries.sEnableLinkerTests) {
|
|
||||||
String tag = mInBrowserProcess ? "BROWSER_LIBRARY_ADDRESS" : "RENDERER_LIBRARY_ADDRESS";
|
|
||||||
Log.i(TAG, "%s: %s %x", tag, libFilePath, libInfo.mLoadAddress);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (provideRelro) {
|
if (provideRelro) {
|
||||||
if (!nativeCreateSharedRelro(sharedRelRoName, mBaseLoadAddress, libInfo)) {
|
if (!nativeCreateSharedRelro(sharedRelRoName, mBaseLoadAddress, libInfo)) {
|
||||||
Log.w(TAG, "Could not create shared RELRO for %s at %x", libFilePath,
|
Log.w(TAG, "Could not create shared RELRO for %s at %x", libFilePath,
|
||||||
@@ -85,9 +75,6 @@ class LegacyLinker extends Linker {
|
|||||||
mLibInfo = null;
|
mLibInfo = null;
|
||||||
mState = State.DONE;
|
mState = State.DONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// If testing, run tests now that all libraries are loaded and initialized.
|
|
||||||
if (NativeLibraries.sEnableLinkerTests) runTestRunnerClassForTesting(mInBrowserProcess);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -256,10 +256,6 @@ public class LibraryLoader {
|
|||||||
return mUseModernLinker;
|
return mUseModernLinker;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean areTestsEnabled() {
|
|
||||||
return NativeLibraries.sEnableLinkerTests;
|
|
||||||
}
|
|
||||||
|
|
||||||
@RemovableInRelease
|
@RemovableInRelease
|
||||||
public void enableJniChecks() {
|
public void enableJniChecks() {
|
||||||
if (!BuildConfig.DCHECK_IS_ON) return;
|
if (!BuildConfig.DCHECK_IS_ON) return;
|
||||||
@@ -711,7 +707,8 @@ public class LibraryLoader {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Override the library loader (normally with a mock) for testing.
|
* Overrides the library loader (normally with a mock) for testing.
|
||||||
|
*
|
||||||
* @param loader the mock library loader.
|
* @param loader the mock library loader.
|
||||||
*/
|
*/
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
|
@@ -129,16 +129,6 @@ public abstract class Linker {
|
|||||||
public static final String EXTRA_LINKER_SHARED_RELROS =
|
public static final String EXTRA_LINKER_SHARED_RELROS =
|
||||||
"org.chromium.base.android.linker.shared_relros";
|
"org.chromium.base.android.linker.shared_relros";
|
||||||
|
|
||||||
// The name of a class that implements TestRunner.
|
|
||||||
private String mTestRunnerClassName;
|
|
||||||
|
|
||||||
// Constants used to indicate a given Linker implementation, for testing.
|
|
||||||
// LEGACY -> Always uses the LegacyLinker implementation.
|
|
||||||
// MODERN -> Always uses the ModernLinker implementation.
|
|
||||||
// NOTE: These names are known and expected by the Linker test scripts.
|
|
||||||
public static final int LINKER_IMPLEMENTATION_LEGACY = 1;
|
|
||||||
public static final int LINKER_IMPLEMENTATION_MODERN = 2;
|
|
||||||
|
|
||||||
// Singleton.
|
// Singleton.
|
||||||
protected static final Object sLock = new Object();
|
protected static final Object sLock = new Object();
|
||||||
|
|
||||||
@@ -239,7 +229,7 @@ public abstract class Linker {
|
|||||||
// regular library loading. See http://crbug.com/980304 as example.
|
// regular library loading. See http://crbug.com/980304 as example.
|
||||||
//
|
//
|
||||||
// This is only called if LibraryLoader.useChromiumLinker() returns true, meaning this is
|
// This is only called if LibraryLoader.useChromiumLinker() returns true, meaning this is
|
||||||
// either Chrome{,Modern}, the linker tests or Trichrome.
|
// either Chrome{,Modern} or Trichrome.
|
||||||
synchronized (sLock) {
|
synchronized (sLock) {
|
||||||
if (sSingleton == null) {
|
if (sSingleton == null) {
|
||||||
// With incremental install, it's important to fall back to the "normal"
|
// With incremental install, it's important to fall back to the "normal"
|
||||||
@@ -593,128 +583,6 @@ public abstract class Linker {
|
|||||||
public int mRelroFd = -1; // shared RELRO file descriptor, or -1
|
public int mRelroFd = -1; // shared RELRO file descriptor, or -1
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ---------------------- Testing support methods. ---------------------- */
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get Linker implementation type.
|
|
||||||
* For testing.
|
|
||||||
*
|
|
||||||
* @return LINKER_IMPLEMENTATION_LEGACY or LINKER_IMPLEMENTATION_MODERN
|
|
||||||
*/
|
|
||||||
public final int getImplementationForTesting() {
|
|
||||||
// Sanity check. This method may only be called during tests.
|
|
||||||
assert NativeLibraries.sEnableLinkerTests;
|
|
||||||
|
|
||||||
synchronized (sLock) {
|
|
||||||
assert sSingleton == this;
|
|
||||||
|
|
||||||
if (sSingleton instanceof ModernLinker) {
|
|
||||||
return LINKER_IMPLEMENTATION_MODERN;
|
|
||||||
} else if (sSingleton instanceof LegacyLinker) {
|
|
||||||
return LINKER_IMPLEMENTATION_LEGACY;
|
|
||||||
}
|
|
||||||
throw new AssertionError("Invalid linker: " + sSingleton.getClass().getName());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A public interface used to run runtime linker tests after loading
|
|
||||||
* libraries. Should only be used to implement the linker unit tests,
|
|
||||||
* which is controlled by the value of NativeLibraries.sEnableLinkerTests
|
|
||||||
* configured at build time.
|
|
||||||
*/
|
|
||||||
public interface TestRunner {
|
|
||||||
/**
|
|
||||||
* Run runtime checks and return true if they all pass.
|
|
||||||
*
|
|
||||||
* @param inBrowserProcess true iff this is the browser process.
|
|
||||||
* @return true if all checks pass.
|
|
||||||
*/
|
|
||||||
public boolean runChecks(boolean inBrowserProcess);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Call this to retrieve the name of the current TestRunner class name
|
|
||||||
* if any. This can be useful to pass it from the browser process to
|
|
||||||
* child ones.
|
|
||||||
*
|
|
||||||
* @return null or a String holding the name of the class implementing
|
|
||||||
* the TestRunner set by calling setTestRunnerClassNameForTesting() previously.
|
|
||||||
*/
|
|
||||||
public final String getTestRunnerClassNameForTesting() {
|
|
||||||
assert NativeLibraries.sEnableLinkerTests;
|
|
||||||
|
|
||||||
synchronized (sLock) {
|
|
||||||
return mTestRunnerClassName;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set up the Linker for a test.
|
|
||||||
* Convenience function that calls setImplementationForTesting() to force an
|
|
||||||
* implementation, and then setTestRunnerClassNameForTesting() to set the test
|
|
||||||
* class name.
|
|
||||||
*
|
|
||||||
* On first call, instantiates a Linker of the requested type and sets its test
|
|
||||||
* runner class name. On subsequent calls, checks that the singleton produced by
|
|
||||||
* the first call matches the requested type and test runner class name.
|
|
||||||
*/
|
|
||||||
public static final void setupForTesting(int type, String testRunnerClassName) {
|
|
||||||
assert NativeLibraries.sEnableLinkerTests;
|
|
||||||
assert type == LINKER_IMPLEMENTATION_LEGACY || type == LINKER_IMPLEMENTATION_MODERN;
|
|
||||||
|
|
||||||
if (DEBUG) Log.i(TAG, "setupForTesting(%d, %s) called", type, testRunnerClassName);
|
|
||||||
|
|
||||||
synchronized (sLock) {
|
|
||||||
assert sSingleton == null;
|
|
||||||
if (type == LINKER_IMPLEMENTATION_MODERN) {
|
|
||||||
sSingleton = new ModernLinker();
|
|
||||||
} else if (type == LINKER_IMPLEMENTATION_LEGACY) {
|
|
||||||
sSingleton = new LegacyLinker();
|
|
||||||
}
|
|
||||||
Log.i(TAG, "Forced linker: %s", sSingleton.getClass().getName());
|
|
||||||
Linker.getInstance().mTestRunnerClassName = testRunnerClassName;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Instantiate and run the current TestRunner, if any. The TestRunner implementation
|
|
||||||
* must be instantiated _after_ all libraries are loaded to ensure that its
|
|
||||||
* native methods are properly registered.
|
|
||||||
*
|
|
||||||
* @param inBrowserProcess true if in the browser process
|
|
||||||
*/
|
|
||||||
protected final void runTestRunnerClassForTesting(boolean inBrowserProcess) {
|
|
||||||
assert NativeLibraries.sEnableLinkerTests;
|
|
||||||
if (DEBUG) Log.i(TAG, "runTestRunnerClassForTesting called");
|
|
||||||
|
|
||||||
synchronized (sLock) {
|
|
||||||
if (mTestRunnerClassName == null) {
|
|
||||||
Log.wtf(TAG, "Linker runtime tests not set up for this process");
|
|
||||||
assert false;
|
|
||||||
}
|
|
||||||
if (DEBUG) {
|
|
||||||
Log.i(TAG, "Instantiating " + mTestRunnerClassName);
|
|
||||||
}
|
|
||||||
TestRunner testRunner = null;
|
|
||||||
try {
|
|
||||||
testRunner = (TestRunner) Class.forName(mTestRunnerClassName)
|
|
||||||
.getDeclaredConstructor()
|
|
||||||
.newInstance();
|
|
||||||
} catch (Exception e) {
|
|
||||||
Log.wtf(TAG, "Could not instantiate test runner class by name", e);
|
|
||||||
assert false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!testRunner.runChecks(inBrowserProcess)) {
|
|
||||||
Log.wtf(TAG, "Linker runtime tests failed in this process");
|
|
||||||
assert false;
|
|
||||||
}
|
|
||||||
|
|
||||||
Log.i(TAG, "All linker tests passed");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return a random address that should be free to be mapped with the given size.
|
* Return a random address that should be free to be mapped with the given size.
|
||||||
* Maps an area large enough for the largest library we might attempt to load,
|
* Maps an area large enough for the largest library we might attempt to load,
|
||||||
|
@@ -163,13 +163,6 @@ public class ContentChildProcessServiceDelegate implements ChildProcessServiceDe
|
|||||||
|
|
||||||
// Return a Linker instance. If testing, the Linker needs special setup.
|
// Return a Linker instance. If testing, the Linker needs special setup.
|
||||||
private Linker getLinker() {
|
private Linker getLinker() {
|
||||||
if (LibraryLoader.getInstance().areTestsEnabled()) {
|
|
||||||
// For testing, set the Linker implementation and the test runner
|
|
||||||
// class name to match those used by the parent.
|
|
||||||
assert mLinkerParams != null;
|
|
||||||
Linker.setupForTesting(mLinkerParams.mLinkerImplementationForTesting,
|
|
||||||
mLinkerParams.mTestRunnerClassNameForTesting);
|
|
||||||
}
|
|
||||||
return Linker.getInstance();
|
return Linker.getInstance();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -640,14 +640,7 @@ public final class ChildProcessLauncherHelperImpl {
|
|||||||
|
|
||||||
// Always wait for the shared RELROs in service processes.
|
// Always wait for the shared RELROs in service processes.
|
||||||
final boolean waitForSharedRelros = true;
|
final boolean waitForSharedRelros = true;
|
||||||
if (LibraryLoader.getInstance().areTestsEnabled()) {
|
return new ChromiumLinkerParams(sLinkerLoadAddress, waitForSharedRelros);
|
||||||
Linker linker = Linker.getInstance();
|
|
||||||
return new ChromiumLinkerParams(sLinkerLoadAddress, waitForSharedRelros,
|
|
||||||
linker.getTestRunnerClassNameForTesting(),
|
|
||||||
linker.getImplementationForTesting());
|
|
||||||
} else {
|
|
||||||
return new ChromiumLinkerParams(sLinkerLoadAddress, waitForSharedRelros);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Bundle populateServiceBundle(Bundle bundle) {
|
private static Bundle populateServiceBundle(Bundle bundle) {
|
||||||
|
Reference in New Issue
Block a user