| // 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. |
| |
| /* |
| 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 test |
| |
| import ( |
| "os" |
| "path/filepath" |
| "testing" |
| |
| "github.com/bazelbuild/rules_go/go/runfiles" |
| "github.com/bazelbuild/rules_python/gazelle/manifest" |
| ) |
| |
| func TestGazelleManifestIsUpdated(t *testing.T) { |
| requirementsPath := os.Getenv("_TEST_REQUIREMENTS") |
| if requirementsPath == "" { |
| t.Fatal("_TEST_REQUIREMENTS must be set") |
| } |
| |
| manifestPath := os.Getenv("_TEST_MANIFEST") |
| if manifestPath == "" { |
| t.Fatal("_TEST_MANIFEST must be set") |
| } |
| |
| manifestFile := new(manifest.File) |
| if err := manifestFile.Decode(manifestPath); err != nil { |
| t.Fatalf("decoding manifest file: %v", err) |
| } |
| |
| if manifestFile.Integrity == "" { |
| t.Fatal("failed to find the Gazelle manifest file integrity") |
| } |
| |
| manifestGeneratorHashPath, err := runfiles.Rlocation( |
| os.Getenv("_TEST_MANIFEST_GENERATOR_HASH")) |
| if err != nil { |
| t.Fatalf("failed to resolve runfiles path of manifest: %v", err) |
| } |
| |
| manifestGeneratorHash, err := os.Open(manifestGeneratorHashPath) |
| if err != nil { |
| t.Fatalf("opening %q: %v", manifestGeneratorHashPath, err) |
| } |
| defer manifestGeneratorHash.Close() |
| |
| requirements, err := os.Open(requirementsPath) |
| if err != nil { |
| t.Fatalf("opening %q: %v", requirementsPath, err) |
| } |
| defer requirements.Close() |
| |
| valid, err := manifestFile.VerifyIntegrity(manifestGeneratorHash, requirements) |
| if err != nil { |
| t.Fatalf("verifying integrity: %v", err) |
| } |
| if !valid { |
| manifestRealpath, err := filepath.EvalSymlinks(manifestPath) |
| if err != nil { |
| t.Fatalf("evaluating symlink %q: %v", manifestPath, err) |
| } |
| t.Errorf( |
| "%q is out-of-date. Follow the update instructions in that file to resolve this", |
| manifestRealpath) |
| } |
| } |