Fix run_android_tests.go with shared library builds.

In particular, the FIPS builds use shared libraries.

Change-Id: I4ca3a289ad3af8ab24c4bf1aecd5de67f9496f15
Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/38147
Commit-Queue: David Benjamin <davidben@google.com>
Commit-Queue: Adam Langley <agl@google.com>
Reviewed-by: Adam Langley <agl@google.com>
diff --git a/util/run_android_tests.go b/util/run_android_tests.go
index 115c3da..c5abdcb 100644
--- a/util/run_android_tests.go
+++ b/util/run_android_tests.go
@@ -268,6 +268,19 @@
 		}
 	}
 
+	var libraries []string
+	if _, err := os.Stat(filepath.Join(*buildDir, "crypto/libcrypto.so")); err == nil {
+		libraries = []string{
+			"libboringssl_gtest.so",
+			"crypto/libcrypto.so",
+			"decrepit/libdecrepit.so",
+			"ssl/libssl.so",
+		}
+	} else if !os.IsNotExist(err) {
+		fmt.Printf("Failed to stat crypto/libcrypto.so: %s\n", err)
+		os.Exit(1)
+	}
+
 	fmt.Printf("Copying test binaries...\n")
 	for _, binary := range binaries {
 		if err := copyFile(filepath.Join(tmpDir, "build", binary), filepath.Join(*buildDir, binary)); err != nil {
@@ -276,6 +289,20 @@
 		}
 	}
 
+	var envPrefix string
+	if len(libraries) > 0 {
+		fmt.Printf("Copying libraries...\n")
+		for _, library := range libraries {
+			// Place all the libraries in a common directory so they
+			// can be passed to LD_LIBRARY_PATH once.
+			if err := copyFile(filepath.Join(tmpDir, "build", "lib", filepath.Base(library)), filepath.Join(*buildDir, library)); err != nil {
+				fmt.Printf("Failed to copy %s: %s\n", library, err)
+				os.Exit(1)
+			}
+		}
+		envPrefix = "env LD_LIBRARY_PATH=/data/local/tmp/boringssl-tmp/build/lib "
+	}
+
 	fmt.Printf("Copying data files...\n")
 	for _, file := range files {
 		if err := copyFile(filepath.Join(tmpDir, file), file); err != nil {
@@ -293,7 +320,7 @@
 	var unitTestExit int
 	if enableUnitTests() {
 		fmt.Printf("Running unit tests...\n")
-		unitTestExit, err = adbShell(fmt.Sprintf("cd /data/local/tmp/boringssl-tmp && ./util/all_tests -json-output results.json %s", *allTestsArgs))
+		unitTestExit, err = adbShell(fmt.Sprintf("cd /data/local/tmp/boringssl-tmp && %s./util/all_tests -json-output results.json %s", envPrefix, *allTestsArgs))
 		if err != nil {
 			fmt.Printf("Failed to run unit tests: %s\n", err)
 			os.Exit(1)
@@ -303,7 +330,7 @@
 	var sslTestExit int
 	if enableSSLTests() {
 		fmt.Printf("Running SSL tests...\n")
-		sslTestExit, err = adbShell(fmt.Sprintf("cd /data/local/tmp/boringssl-tmp/ssl/test/runner && ./runner -json-output ../../../results.json %s", *runnerArgs))
+		sslTestExit, err = adbShell(fmt.Sprintf("cd /data/local/tmp/boringssl-tmp/ssl/test/runner && %s./runner -json-output ../../../results.json %s", envPrefix, *runnerArgs))
 		if err != nil {
 			fmt.Printf("Failed to run SSL tests: %s\n", err)
 			os.Exit(1)