// 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. "internal/third_party/uritemplates/uritemplates.go": true, // This file is licensed to an individual. "internal/third_party/uritemplates/uritemplates_test.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) } }