Use go_test to verify manifest (#1044)

diff --git a/gazelle/manifest/defs.bzl b/gazelle/manifest/defs.bzl
index 8540c0e..78e0c27 100644
--- a/gazelle/manifest/defs.bzl
+++ b/gazelle/manifest/defs.bzl
@@ -16,7 +16,7 @@
 for updating and testing the Gazelle manifest file.
 """
 
-load("@io_bazel_rules_go//go:def.bzl", "GoSource", "go_binary")
+load("@io_bazel_rules_go//go:def.bzl", "GoSource", "go_binary", "go_test")
 
 def gazelle_python_manifest(
         name,
@@ -81,31 +81,22 @@
         tags = ["manual"],
     )
 
-    test_binary = "_{}_test_bin".format(name)
-
-    go_binary(
-        name = test_binary,
-        embed = [Label("//manifest/test:test_lib")],
-        visibility = ["//visibility:private"],
-    )
-
-    native.sh_test(
+    go_test(
         name = "{}.test".format(name),
-        srcs = [Label("//manifest/test:run.sh")],
+        srcs = [Label("//manifest/test:test.go")],
         data = [
-            ":{}".format(test_binary),
             manifest,
             requirements,
             manifest_generator_hash,
         ],
         env = {
-            "_TEST_BINARY": "$(rootpath :{})".format(test_binary),
             "_TEST_MANIFEST": "$(rootpath {})".format(manifest),
             "_TEST_MANIFEST_GENERATOR_HASH": "$(rootpath {})".format(manifest_generator_hash),
             "_TEST_REQUIREMENTS": "$(rootpath {})".format(requirements),
         },
-        visibility = ["//visibility:private"],
-        timeout = "short",
+        rundir = ".",
+        deps = [Label("//manifest")],
+        size = "small",
     )
 
     native.filegroup(
diff --git a/gazelle/manifest/test/BUILD.bazel b/gazelle/manifest/test/BUILD.bazel
index c8b2828..28c6c54 100644
--- a/gazelle/manifest/test/BUILD.bazel
+++ b/gazelle/manifest/test/BUILD.bazel
@@ -1,20 +1,6 @@
-load("@io_bazel_rules_go//go:def.bzl", "go_binary", "go_library")
+# gazelle:ignore
 
-go_library(
-    name = "test_lib",
-    srcs = ["test.go"],
-    importpath = "github.com/bazelbuild/rules_python/gazelle/manifest/test",
-    visibility = ["//visibility:public"],
-    deps = ["//manifest"],
-)
-
-go_binary(
-    name = "test",
-    embed = [":test_lib"],
-    visibility = ["//visibility:public"],
-)
-
-exports_files(["run.sh"])
+exports_files(["test.go"])
 
 filegroup(
     name = "distribution",
diff --git a/gazelle/manifest/test/run.sh b/gazelle/manifest/test/run.sh
deleted file mode 100755
index 95efef0..0000000
--- a/gazelle/manifest/test/run.sh
+++ /dev/null
@@ -1,25 +0,0 @@
-#!/usr/bin/env bash
-# Copyright 2023 The Bazel Authors. All rights reserved.
-#
-# 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.
-
-
-# This file exists to allow passing the runfile paths to the Go program via
-# environment variables.
-
-set -o errexit -o nounset
-
-"${_TEST_BINARY}" \
-    --manifest-generator-hash "${_TEST_MANIFEST_GENERATOR_HASH}" \
-    --requirements "${_TEST_REQUIREMENTS}" \
-    --manifest "${_TEST_MANIFEST}"
diff --git a/gazelle/manifest/test/test.go b/gazelle/manifest/test/test.go
index ae9fdfe..72cb260 100644
--- a/gazelle/manifest/test/test.go
+++ b/gazelle/manifest/test/test.go
@@ -13,85 +13,66 @@
 // limitations under the License.
 
 /*
-test.go is a program that asserts the Gazelle YAML manifest is up-to-date in
+test.go is a unit test that asserts the Gazelle YAML manifest is up-to-date in
 regards to the requirements.txt.
 
 It re-hashes the requirements.txt and compares it to the recorded one in the
 existing generated Gazelle manifest.
 */
-package main
+package test
 
 import (
-	"flag"
-	"log"
 	"os"
 	"path/filepath"
+	"testing"
 
 	"github.com/bazelbuild/rules_python/gazelle/manifest"
 )
 
-func main() {
-	var manifestGeneratorHashPath string
-	var requirementsPath string
-	var manifestPath string
-	flag.StringVar(
-		&manifestGeneratorHashPath,
-		"manifest-generator-hash",
-		"",
-		"The file containing the hash for the source code of the manifest generator."+
-			"This is important to force manifest updates when the generator logic changes.")
-	flag.StringVar(
-		&requirementsPath,
-		"requirements",
-		"",
-		"The requirements.txt file.")
-	flag.StringVar(
-		&manifestPath,
-		"manifest",
-		"",
-		"The manifest YAML file.")
-	flag.Parse()
-
+func TestGazelleManifestIsUpdated(t *testing.T) {
+	requirementsPath := os.Getenv("_TEST_REQUIREMENTS")
 	if requirementsPath == "" {
-		log.Fatalln("ERROR: --requirements must be set")
+		t.Fatalf("_TEST_REQUIREMENTS must be set")
 	}
 
+	manifestPath := os.Getenv("_TEST_MANIFEST")
 	if manifestPath == "" {
-		log.Fatalln("ERROR: --manifest must be set")
+		t.Fatalf("_TEST_MANIFEST must be set")
 	}
 
 	manifestFile := new(manifest.File)
 	if err := manifestFile.Decode(manifestPath); err != nil {
-		log.Fatalf("ERROR: %v\n", err)
+		t.Fatalf("decoding manifest file: %v", err)
 	}
 
 	if manifestFile.Integrity == "" {
-		log.Fatalln("ERROR: failed to find the Gazelle manifest file integrity")
+		t.Fatal("failed to find the Gazelle manifest file integrity")
 	}
 
+	manifestGeneratorHashPath := os.Getenv("_TEST_MANIFEST_GENERATOR_HASH")
 	manifestGeneratorHash, err := os.Open(manifestGeneratorHashPath)
 	if err != nil {
-		log.Fatalf("ERROR: %v\n", err)
+		t.Fatalf("opening %q: %v", manifestGeneratorHashPath, err)
 	}
 	defer manifestGeneratorHash.Close()
 
 	requirements, err := os.Open(requirementsPath)
 	if err != nil {
-		log.Fatalf("ERROR: %v\n", err)
+		t.Fatalf("opening %q: %v", requirementsPath, err)
 	}
 	defer requirements.Close()
 
 	valid, err := manifestFile.VerifyIntegrity(manifestGeneratorHash, requirements)
 	if err != nil {
-		log.Fatalf("ERROR: %v\n", err)
+		t.Fatalf("verifying integrity: %v", err)
 	}
 	if !valid {
 		manifestRealpath, err := filepath.EvalSymlinks(manifestPath)
 		if err != nil {
-			log.Fatalf("ERROR: %v\n", err)
+			t.Fatalf("evaluating symlink %q: %v", manifestPath, err)
 		}
-		log.Fatalf(
-			"ERROR: %q is out-of-date. Follow the update instructions in that file to resolve this.\n",
+		t.Errorf(
+			"%q is out-of-date. Follow the update instructions in that file to resolve this",
 			manifestRealpath)
 	}
 }