diff --git a/crypto/fipsmodule/rand/urandom_test.cc b/crypto/fipsmodule/rand/urandom_test.cc
index 117c315..5935aaf 100644
--- a/crypto/fipsmodule/rand/urandom_test.cc
+++ b/crypto/fipsmodule/rand/urandom_test.cc
@@ -21,7 +21,8 @@
 
 
 #if defined(OPENSSL_X86_64) && defined(OPENSSL_LINUX) && \
-    !defined(BORINGSSL_SHARED_LIBRARY)
+    !defined(BORINGSSL_SHARED_LIBRARY) &&                \
+    !defined(BORINGSSL_UNSAFE_DETERMINISTIC_MODE)
 
 #include <linux/random.h>
 #include <sys/ptrace.h>
@@ -466,6 +467,9 @@
 
 #else
 
-int main(int argc, char **argv) { return 0; }
+int main(int argc, char **argv) {
+  printf("PASS\n");
+  return 0;
+}
 
-#endif  // X86_64 && LINUX && !SHARED_LIBRARY
+#endif  // X86_64 && LINUX && !SHARED_LIBRARY && !UNSAFE_DETERMINISTIC_MODE
diff --git a/util/all_tests.go b/util/all_tests.go
index fbff48c..4dd7f2c 100644
--- a/util/all_tests.go
+++ b/util/all_tests.go
@@ -55,6 +55,7 @@
 }
 
 type test struct {
+	env              []string
 	args             []string
 	shard, numShards int
 	// cpu, if not empty, contains a code to simulate. For SDE, run `sde64
@@ -148,7 +149,7 @@
 	prog := path.Join(*buildDir, test.args[0])
 	args := append([]string{}, test.args[1:]...)
 	if *simulateARMCPUs && test.cpu != "" {
-		args = append(args, "--cpu=" + test.cpu)
+		args = append(args, "--cpu="+test.cpu)
 	}
 	if *useSDE {
 		// SDE is neither compatible with the unwind tester nor automatically
@@ -167,6 +168,11 @@
 	} else {
 		cmd = exec.Command(prog, args...)
 	}
+	if test.env != nil {
+		cmd.Env = make([]string, len(os.Environ()))
+		copy(cmd.Env, os.Environ())
+		cmd.Env = append(cmd.Env, test.env...)
+	}
 	var outBuf bytes.Buffer
 	cmd.Stdout = &outBuf
 	cmd.Stderr = &outBuf
@@ -258,7 +264,12 @@
 
 	var result []test
 	for _, args := range testArgs {
-		result = append(result, test{args: args})
+		var env []string
+		for len(args) > 0 && strings.HasPrefix(args[0], "$") {
+			env = append(env, args[0][1:])
+			args = args[1:]
+		}
+		result = append(result, test{args: args, env: env})
 	}
 	return result, nil
 }
@@ -272,11 +283,18 @@
 }
 
 func (t test) shortName() string {
-	return t.args[0] + t.shardMsg() + t.cpuMsg()
+	return t.args[0] + t.shardMsg() + t.cpuMsg() + t.envMsg()
+}
+
+func SpaceIf(returnSpace bool) string {
+	if !returnSpace {
+		return ""
+	}
+	return " "
 }
 
 func (t test) longName() string {
-	return strings.Join(t.args, " ") + t.cpuMsg()
+	return strings.Join(t.env, " ") + SpaceIf(len(t.env) != 0) + strings.Join(t.args, " ") + t.cpuMsg()
 }
 
 func (t test) shardMsg() string {
@@ -295,6 +313,14 @@
 	return fmt.Sprintf(" (for CPU %q)", t.cpu)
 }
 
+func (t test) envMsg() string {
+	if len(t.env) == 0 {
+		return ""
+	}
+
+	return " (custom environment)"
+}
+
 func (t test) getGTestShards() ([]test, error) {
 	if *numWorkers == 1 || len(t.args) != 1 {
 		return []test{t}, nil
diff --git a/util/all_tests.json b/util/all_tests.json
index 7152ec1..578b727 100644
--- a/util/all_tests.json
+++ b/util/all_tests.json
@@ -1,5 +1,7 @@
 [
 	["crypto/crypto_test"],
+	["crypto/urandom_test"],
+	["$OPENSSL_ia32cap=~0x4000000000000000", "crypto/urandom_test"],
 	["crypto/crypto_test", "--fork_unsafe_buffering", "--gtest_filter=RandTest.*:-RandTest.Fork"],
 	["decrepit/decrepit_test"],
 	["ssl/ssl_test"]
diff --git a/util/run_android_tests.go b/util/run_android_tests.go
index c5abdcb..60009a1 100644
--- a/util/run_android_tests.go
+++ b/util/run_android_tests.go
@@ -135,7 +135,10 @@
 	panic("Couldn't find BUILDING.md in a parent directory!")
 }
 
-type test []string
+type test struct {
+	args []string
+	env []string
+}
 
 func parseTestConfig(filename string) ([]test, error) {
 	in, err := os.Open(filename)
@@ -145,11 +148,22 @@
 	defer in.Close()
 
 	decoder := json.NewDecoder(in)
-	var result []test
+	var result [][]string
 	if err := decoder.Decode(&result); err != nil {
 		return nil, err
 	}
-	return result, nil
+
+	tests := make([]test, 0, len(result))
+	for _, args := range result {
+		var env []string
+		for len(args) > 0 && strings.HasPrefix(args[0], "$") {
+			env = append(env, args[0][1:])
+			args = args[1:]
+		}
+		tests = append(tests, test{args: args, env: env})
+	}
+
+	return tests, nil
 }
 
 func copyFile(dst, src string) error {
@@ -219,11 +233,11 @@
 
 		seenBinary := make(map[string]struct{})
 		for _, test := range tests {
-			if _, ok := seenBinary[test[0]]; !ok {
-				binaries = append(binaries, test[0])
-				seenBinary[test[0]] = struct{}{}
+			if _, ok := seenBinary[test.args[0]]; !ok {
+				binaries = append(binaries, test.args[0])
+				seenBinary[test.args[0]] = struct{}{}
 			}
-			for _, arg := range test[1:] {
+			for _, arg := range test.args[1:] {
 				if strings.Contains(arg, "/") {
 					files = append(files, arg)
 				}
