// Copyright 2019 Google LLC.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package api

import (
	"bytes"
	"io/ioutil"
	"os"
	"path/filepath"
	"regexp"
	"testing"
)

// Files in this package use a BSD-style license.
var sentinel = regexp.MustCompile(`(//|#) Copyright \d\d\d\d (Google LLC|The Go Authors)(\.)*( All rights reserved\.)*
(//|#) Use of this source code is governed by a BSD-style
(//|#) license that can be found in the LICENSE file.
`)

const prefix = "// Copyright"

// A few files have to be skipped.
var skip = map[string]bool{
	"tools.go": true, // This file requires another comment above the license.
	"googleapi/internal/uritemplates/uritemplates.go": true, // This file is licensed to an individual.
}

// This test validates that all go files in the repo start with an appropriate license.
func TestLicense(t *testing.T) {
	err := filepath.Walk(".", func(path string, fi os.FileInfo, err error) error {
		if skip[path] {
			return nil
		}

		if err != nil {
			return err
		}

		if filepath.Ext(path) != ".go" && filepath.Ext(path) != ".sh" {
			return nil
		}

		src, err := ioutil.ReadFile(path)
		if err != nil {
			return nil
		}

		// Verify that the license is matched.
		if !sentinel.Match(src) {
			t.Errorf("%v: license header not present", path)
			return nil
		}

		// Also check it is at the top of .go files (but not .sh files, because they must have a shebang first).
		if filepath.Ext(path) == ".go" && !bytes.HasPrefix(src, []byte(prefix)) {
			t.Errorf("%v: license header not at the top", path)
		}
		return nil
	})
	if err != nil {
		t.Fatal(err)
	}
}
