// 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_python/gazelle/manifest"
)

func TestGazelleManifestIsUpdated(t *testing.T) {
	requirementsPath := os.Getenv("_TEST_REQUIREMENTS")
	if requirementsPath == "" {
		t.Fatalf("_TEST_REQUIREMENTS must be set")
	}

	manifestPath := os.Getenv("_TEST_MANIFEST")
	if manifestPath == "" {
		t.Fatalf("_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 := os.Getenv("_TEST_MANIFEST_GENERATOR_HASH")
	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)
	}
}
