Add the system image test to the bazel sandwich

Also make -test.sh files executable, while we wait for a bazel update
that will tell us which FileWrite actions should be executable.

Bug: 297268692
Test: m bazel_sandwich
Change-Id: I60498577ba12813bff8bbdbc1b997ea4addefd17
diff --git a/android/allowlists/allowlists.go b/android/allowlists/allowlists.go
index fec2cdc..75f2c3f 100644
--- a/android/allowlists/allowlists.go
+++ b/android/allowlists/allowlists.go
@@ -1645,5 +1645,9 @@
 			Label: "//build/bazel/examples/partitions:system_image",
 			Host:  false,
 		},
+		{
+			Label: "//build/bazel/examples/partitions:run_test",
+			Host:  false,
+		},
 	}
 )
diff --git a/android/bazel_handler.go b/android/bazel_handler.go
index fda8a22..42ba9b4 100644
--- a/android/bazel_handler.go
+++ b/android/bazel_handler.go
@@ -1382,7 +1382,14 @@
 			WriteFileRuleVerbatim(ctx, out, "")
 		case "FileWrite", "SourceSymlinkManifest":
 			out := PathForBazelOut(ctx, buildStatement.OutputPaths[0])
-			WriteFileRuleVerbatim(ctx, out, buildStatement.FileContents)
+			// TODO(b/297366783) This is a hack to make files from skylib's diff_test executable.
+			// We need to update bazel to have aquery tell us whether a file is supposed to be
+			// executable or not.
+			if strings.HasSuffix(buildStatement.OutputPaths[0], "-test.sh") {
+				WriteExecutableFileRuleVerbatim(ctx, out, buildStatement.FileContents)
+			} else {
+				WriteFileRuleVerbatim(ctx, out, buildStatement.FileContents)
+			}
 		case "SymlinkTree":
 			// build-runfiles arguments are the manifest file and the target directory
 			// where it creates the symlink tree according to this manifest (and then
diff --git a/android/defs.go b/android/defs.go
index 18eed2d..682111e 100644
--- a/android/defs.go
+++ b/android/defs.go
@@ -209,12 +209,14 @@
 	buildWriteFileRule(ctx, outputFile, content)
 }
 
-func CatFileRule(ctx BuilderContext, paths Paths, outputFile WritablePath) {
+// WriteExecutableFileRuleVerbatim is the same as WriteFileRuleVerbatim, but runs chmod +x on the result
+func WriteExecutableFileRuleVerbatim(ctx BuilderContext, outputFile WritablePath, content string) {
+	intermediate := PathForIntermediates(ctx, "write_executable_file_intermediates").Join(ctx, outputFile.String())
+	WriteFileRuleVerbatim(ctx, intermediate, content)
 	ctx.Build(pctx, BuildParams{
-		Rule:        Cat,
-		Inputs:      paths,
-		Output:      outputFile,
-		Description: "combine files to " + outputFile.Base(),
+		Rule:   CpExecutable,
+		Output: outputFile,
+		Input:  intermediate,
 	})
 }