// Copyright 2019 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.

package licenses

import (
	"archive/zip"
	"bytes"
	"fmt"
	"io"
	"log"
	"math"
	"os"
	"path"
	"path/filepath"
	"runtime"
	"sort"
	"strings"
	"testing"

	"github.com/google/go-cmp/cmp"
	"github.com/google/go-cmp/cmp/cmpopts"
	oldlc "github.com/google/licensecheck/old"
)

const (
	// mitLicense is the contents of the MIT license. It is detectable by the
	// licensecheck package, and is considered redistributable.
	mitLicense = `Copyright 2019 Google Inc

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.`

	// bsd0License is the contents of the BSD-0-Clause license. It is detectable
	// by the licensecheck package, but not considered redistributable.
	bsd0License = `Copyright 2019 Google Inc

Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.`

	// apacheSansAppendix is the contents of the Apache 2.0 license, without the appendix.
	apacheSansAppendix = `Apache License
                          Version 2.0, January 2004
                          http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.`

	// unknownLicense is not detectable by the licensecheck package.
	unknownLicense = `THIS IS A LICENSE THAT I JUST MADE UP. YOU CAN DO WHATEVER YOU WANT WITH THIS CODE, TRUST ME.`
)

var mitCoverage = oldlc.Coverage{
	Percent: 100,
	Match:   []oldlc.Match{{Name: "MIT", Type: oldlc.MIT, Percent: 100}},
}

// testDataPath returns a path corresponding to a path relative to the calling
// test file. For convenience, rel is assumed to be "/"-delimited.
//
// It panics on failure.
func testDataPath(rel string) string {
	_, filename, _, ok := runtime.Caller(1)
	if !ok {
		panic("unable to determine relative path")
	}
	return filepath.Clean(filepath.Join(filepath.Dir(filename), filepath.FromSlash(rel)))
}

func TestModuleIsRedistributable(t *testing.T) {
	// More thorough tests of the helper functions are below. This end-to-end test covers
	// a few key cases using actual zip files.
	for _, test := range []struct {
		filename  string
		module    string
		version   string
		want      bool
		wantMetas []*Metadata
	}{
		{
			filename:  "xtime",
			module:    "golang.org/x/time",
			version:   "v0.0.0-20191024005414-555d28b269f0",
			want:      true,
			wantMetas: []*Metadata{{Types: []string{"BSD-3-Clause"}, FilePath: "LICENSE"}},
		},
		{
			filename:  "smasher",
			module:    "github.com/smasher164/mem",
			version:   "v0.0.0-20191114064341-4e07bd0f0d69",
			want:      true,
			wantMetas: []*Metadata{{Types: []string{"BSD-0-Clause"}, FilePath: "LICENSE.md"}},
		},
		{
			filename: "gioui",
			module:   "gioui.org",
			version:  "v0.0.0-20200103103112-ccbcbdbfbd4f",
			want:     true,
			wantMetas: []*Metadata{
				{Types: []string{"MIT"}, FilePath: "LICENSE-MIT"},
				{Types: []string{"Unlicense"}, FilePath: "UNLICENSE"},
			},
		},
		{
			filename: "gonum",
			module:   "gonum.org/v1/gonum",
			version:  "v0.6.2",
			want:     true,
			wantMetas: []*Metadata{
				{Types: []string{"BSD-3-Clause"}, FilePath: "LICENSE"},
				{Types: []string{"MIT"}, FilePath: "graph/formats/cytoscapejs/testdata/LICENSE"},
				{Types: []string{"MIT"}, FilePath: "graph/formats/sigmajs/testdata/LICENSE.txt"},
			},
		},
	} {
		t.Run(test.filename, func(t *testing.T) {
			f, err := os.Open(filepath.Join(testDataPath("testdata"), test.filename+".zip"))
			if err != nil {
				t.Fatal(err)
			}
			fi, err := f.Stat()
			if err != nil {
				t.Fatal(err)
			}
			defer f.Close()
			zr, err := zip.NewReader(f, fi.Size())
			if err != nil {
				t.Fatal(err)
			}
			d := NewDetector(test.module, test.version, zr, nil)
			got := d.ModuleIsRedistributable()
			if got != test.want {
				for _, l := range d.ModuleLicenses() {
					t.Logf("%v %v", l.Types, l.Coverage)
				}
				t.Fatalf("got %t, want %t", got, test.want)
			}
			var gotMetas []*Metadata
			for _, lic := range d.AllLicenses() {
				gotMetas = append(gotMetas, lic.Metadata)
			}
			opts := []cmp.Option{
				cmpopts.IgnoreFields(Metadata{}, "Coverage"),
				cmpopts.SortSlices(func(m1, m2 *Metadata) bool { return m1.FilePath < m2.FilePath }),
			}
			if diff := cmp.Diff(test.wantMetas, gotMetas, opts...); diff != "" {
				t.Errorf("mismatch(-want, +got):\n%s", diff)
			}
		})
	}
}

func TestRedistributable(t *testing.T) {
	for _, test := range []struct {
		types []string
		want  bool
	}{
		{nil, false},
		{[]string{unknownLicenseType}, false},
		{[]string{"MIT"}, true},
		{[]string{"MIT", "Unlicense"}, true},
		{[]string{"MIT", "JSON"}, true},
		{[]string{"MIT", "CommonsClause"}, false},
		{[]string{"MIT", "GPL2", "ISC"}, true},
	} {
		got := Redistributable(test.types)
		if got != test.want {
			t.Errorf("%v: got %t, want %t", test.types, got, test.want)
		}
	}
}

func TestFiles(t *testing.T) {
	zr := newZipReader(t, "m@v1", map[string]string{
		"LICENSE":            "",
		"LICENSE.md":         "",
		"LICENCE":            "",
		"License":            "",
		"COPYING":            "",
		"liCeNse":            "",
		"foo/LICENSE":        "",
		"foo/LICENSE.md":     "",
		"foo/LICENCE":        "",
		"foo/License":        "",
		"foo/COPYING":        "",
		"foo/license":        "",
		"vendor/pkg/LICENSE": "", // vendored files ignored
		"pkg/vendor/LICENSE": "", // not a vendored file, but a package named "vendor"
	})
	for _, test := range []struct {
		which WhichFiles
		want  []string
	}{
		{
			RootFiles,
			[]string{"m@v1/LICENSE", "m@v1/LICENCE", "m@v1/License", "m@v1/COPYING", "m@v1/LICENSE.md",
				"m@v1/liCeNse"},
		},
		{
			NonRootFiles,
			[]string{
				"m@v1/foo/LICENSE", "m@v1/foo/LICENSE.md", "m@v1/foo/LICENCE", "m@v1/foo/License",
				"m@v1/foo/COPYING", "m@v1/pkg/vendor/LICENSE", "m@v1/foo/license",
			},
		},
		{
			AllFiles,
			[]string{
				"m@v1/LICENSE", "m@v1/LICENCE", "m@v1/License", "m@v1/COPYING", "m@v1/LICENSE.md",
				"m@v1/liCeNse", "m@v1/foo/LICENSE", "m@v1/foo/LICENSE.md", "m@v1/foo/LICENCE", "m@v1/foo/License",
				"m@v1/foo/license", "m@v1/foo/COPYING", "m@v1/pkg/vendor/LICENSE",
			},
		},
	} {
		t.Run(fmt.Sprintf("which=%d", test.which), func(t *testing.T) {
			d := NewDetector("m", "v1", zr, nil)
			gotFiles := d.Files(test.which)
			var got []string
			for _, f := range gotFiles {
				got = append(got, f.Name)
			}
			if diff := cmp.Diff(test.want, got,
				cmpopts.SortSlices(func(a, b string) bool { return a < b })); diff != "" {
				t.Errorf("mismatch(-want, +got):\n%s", diff)
			}
		})
	}
}

func TestDetectFiles(t *testing.T) {
	defer func(m uint64) { maxLicenseSize = m }(maxLicenseSize)
	maxLicenseSize = uint64(len(mitLicense) * 10)
	testCases := []struct {
		name     string
		contents map[string]string
		want     []*Metadata
	}{
		{
			name: "valid license",
			contents: map[string]string{
				"foo/LICENSE": mitLicense,
			},
			want: []*Metadata{{Types: []string{"MIT"}, FilePath: "foo/LICENSE", Coverage: mitCoverage}},
		},

		{
			name: "multiple licenses",
			contents: map[string]string{
				"LICENSE":        mitLicense,
				"foo/LICENSE.md": mitLicense,
				"COPYING":        bsd0License,
			},
			want: []*Metadata{
				{Types: []string{"BSD-0-Clause"}, FilePath: "COPYING", Coverage: oldlc.Coverage{
					Percent: 100,
					Match:   []oldlc.Match{{Name: "BSD-0-Clause", Type: oldlc.BSD, Percent: 100}},
				}},
				{Types: []string{"MIT"}, FilePath: "LICENSE", Coverage: mitCoverage},
				{Types: []string{"MIT"}, FilePath: "foo/LICENSE.md", Coverage: mitCoverage},
			},
		},
		{
			name: "multiple licenses in a single file",
			contents: map[string]string{
				"LICENSE": mitLicense + "\n" + bsd0License,
			},
			want: []*Metadata{
				{Types: []string{"BSD-0-Clause", "MIT"}, FilePath: "LICENSE", Coverage: oldlc.Coverage{
					Percent: 100,
					Match: []oldlc.Match{
						{Name: "MIT", Type: oldlc.MIT, Percent: 100},
						{Name: "BSD-0-Clause", Type: oldlc.BSD, Percent: 100},
					},
				}},
			},
		},
		{
			name: "unknown license",
			contents: map[string]string{
				"LICENSE": unknownLicense,
			},
			want: []*Metadata{
				{Types: []string{"UNKNOWN"}, FilePath: "LICENSE"},
			},
		},
		{
			name: "low coverage license",
			contents: map[string]string{
				"foo/LICENSE": mitLicense + `
		Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod
		tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim
		veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea
		commodo consequat. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod
		tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim
		veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea
		commodo consequat.`,
			},
			want: []*Metadata{
				{
					Types:    []string{"UNKNOWN"},
					FilePath: "foo/LICENSE",
					Coverage: oldlc.Coverage{
						Percent: 69.361,
						Match:   []oldlc.Match{{Name: "MIT", Type: oldlc.MIT, Percent: 100}},
					},
				},
			},
		},
		{
			name: "no license",
			contents: map[string]string{
				"blah.go": "package foo\n\nconst Foo = 42",
			},
			want: nil,
		},
		{
			name: "unreadable license",
			contents: map[string]string{
				"LICENSE": mitLicense,
				"COPYING": strings.Repeat(mitLicense, 11),
			},
			want: []*Metadata{
				{
					Types:    []string{"UNKNOWN"},
					FilePath: "COPYING",
				},
				{
					Types:    []string{"MIT"},
					FilePath: "LICENSE",
					Coverage: mitCoverage,
				},
			},
		},
		{
			name: "apache sans appendix",
			contents: map[string]string{
				"LICENSE": apacheSansAppendix,
			},
			want: []*Metadata{
				{
					Types:    []string{"Apache-2.0"},
					FilePath: "LICENSE",
					Coverage: oldlc.Coverage{
						Percent: 100,
						Match: []oldlc.Match{{
							Name:    "Apache-2.0-Short",
							Type:    oldlc.Apache,
							Percent: 99,
						}},
					},
				},
			},
		},
	}
	for _, test := range testCases {
		t.Run(test.name, func(t *testing.T) {
			d := NewDetector("m", "v1", newZipReader(t, "m@v1", test.contents), log.Printf)
			files := d.Files(AllFiles)
			gotLics := d.detectFiles(files)
			sort.Slice(gotLics, func(i, j int) bool {
				return gotLics[i].FilePath < gotLics[j].FilePath
			})
			var got []*Metadata
			for _, l := range gotLics {
				got = append(got, l.Metadata)
			}

			opts := []cmp.Option{
				cmp.Comparer(coveragePercentEqual),
				cmpopts.IgnoreFields(oldlc.Match{}, "Start", "End"),
			}
			if diff := cmp.Diff(test.want, got, opts...); diff != "" {
				t.Errorf("mismatch (-want +got):\n%s", diff)
			}
		})
	}
}

func TestPackageInfo(t *testing.T) {
	const (
		module  = "mod"
		version = "v1.2.3"
	)
	meta := func(typ, path string) *Metadata {
		return &Metadata{Types: []string{typ}, FilePath: path}
	}

	for _, test := range []struct {
		name       string
		contents   map[string]string
		wantRedist bool
		wantMetas  []*Metadata
	}{
		{
			name: "no package license",
			contents: map[string]string{
				"LICENSE":        mitLicense,
				"dir/pkg/foo.go": "package pkg",
			},
			wantRedist: true,
			wantMetas:  []*Metadata{meta("MIT", "LICENSE")},
		},
		{
			name: "redistributable package license",
			contents: map[string]string{
				"LICENSE":            mitLicense,
				"dir/pkg/foo.go":     "package pkg",
				"dir/pkg/License.md": mitLicense,
			},
			wantRedist: true,
			wantMetas:  []*Metadata{meta("MIT", "LICENSE"), meta("MIT", "dir/pkg/License.md")},
		},
		{

			name: "module is but package is not",
			contents: map[string]string{
				"LICENSE":            mitLicense,
				"dir/pkg/foo.go":     "package pkg",
				"dir/pkg/License.md": unknownLicense,
			},
			wantRedist: false,
			wantMetas:  []*Metadata{meta("MIT", "LICENSE"), meta(unknownLicenseType, "dir/pkg/License.md")},
		},
		{
			name: "package is but module is not",
			contents: map[string]string{
				"LICENSE":            unknownLicense,
				"dir/pkg/foo.go":     "package pkg",
				"dir/pkg/License.md": mitLicense,
			},
			wantRedist: false,
			wantMetas:  []*Metadata{meta(unknownLicenseType, "LICENSE"), meta("MIT", "dir/pkg/License.md")},
		},
		{
			name: "intermediate directories",
			contents: map[string]string{
				"LICENSE":            mitLicense,
				"dir/pkg/foo.go":     "package pkg",
				"dir/pkg/License.md": mitLicense,
				"dir/LICENSE.txt":    unknownLicense,
			},
			wantRedist: false,
			wantMetas: []*Metadata{
				meta("MIT", "LICENSE"),
				meta(unknownLicenseType, "dir/LICENSE.txt"),
				meta("MIT", "dir/pkg/License.md"),
			},
		},
		{
			name: "other package",
			contents: map[string]string{
				"LICENSE":            mitLicense,
				"dir/pkg/foo.go":     "package pkg",
				"dir/pkg/License.md": mitLicense,
				"dir/LICENSE.txt":    mitLicense,
				"dir/pkg2/LICENSE":   unknownLicense, // should be ignored
			},
			wantRedist: true,
			wantMetas: []*Metadata{
				meta("MIT", "LICENSE"),
				meta("MIT", "dir/LICENSE.txt"),
				meta("MIT", "dir/pkg/License.md"),
			},
		},
	} {
		t.Run(test.name, func(t *testing.T) {
			zr := newZipReader(t, contentsDir(module, version), test.contents)
			d := NewDetector(module, version, zr, nil)
			gotRedist, gotLics := d.PackageInfo("dir/pkg")
			if gotRedist != test.wantRedist {
				t.Errorf("redist: got %t, want %t", gotRedist, test.wantRedist)
			}
			var gotMetas []*Metadata
			for _, l := range gotLics {
				gotMetas = append(gotMetas, l.Metadata)
			}
			opts := []cmp.Option{
				cmpopts.IgnoreFields(Metadata{}, "Coverage"),
				cmpopts.SortSlices(func(m1, m2 *Metadata) bool { return m1.FilePath < m2.FilePath }),
			}
			if diff := cmp.Diff(test.wantMetas, gotMetas, opts...); diff != "" {
				t.Errorf("mismatch (-want +got):\n%s", diff)
			}
		})
	}
}

func TestExceptions(t *testing.T) {
	// This is the license in exception-files/atlantis, with different line wrapping and case.
	const in = `
		Atlantis was originally copyrighted and licensed under:
			Copyright 2017 HootSuite Media Inc.
			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.
		In 2018 it was forked from github.com/hootsuite/atlantis to github.com/runatlantis/atlantis.
		The contents of files created before the fork
		are obviously still under the Hootsuite copyright and contain a header to that
		effect in addition to a disclaimer that they have subsequently been modified by
		contributors to github.com/runatlantis/atlantis. Modifications and new files
		hereafter are still under the Apache 2.0 license, but are not under copyright of
		Hootsuite Media Inc.`
	got := exceptionFileTypes([]byte(in))
	want := []string{"Apache-2.0"}
	if !cmp.Equal(got, want) {
		t.Errorf("got %v, want %v", got, want)
	}

	// If we don't have it, it shouldn't match.
	got = exceptionFileTypes([]byte("Not an exception."))
	if got != nil {
		t.Errorf("got %v, want nil", got)
	}
}

// newZipReader creates an in-memory zip of the given contents and returns a reader to it.
func newZipReader(t *testing.T, contentsDir string, contents map[string]string) *zip.Reader {
	var buf bytes.Buffer
	zw := zip.NewWriter(&buf)
	for name, content := range contents {
		fw, err := zw.Create(path.Join(contentsDir, name))
		if err != nil {
			t.Fatal(err)
		}
		_, err = io.WriteString(fw, content)
		if err != nil {
			t.Fatal(err)
		}
	}
	if err := zw.Close(); err != nil {
		t.Fatal(err)
	}
	zr, err := zip.NewReader(bytes.NewReader(buf.Bytes()), int64(buf.Len()))
	if err != nil {
		t.Fatal(err)
	}
	return zr
}

// coveragePercentEqual considers two floats the same if they are within 4
// percentage points, and both are on the same side of 90% (our threshold).
func coveragePercentEqual(a, b float64) bool {
	if (a >= 90) != (b >= 90) {
		return false
	}
	return math.Abs(a-b) <= 4
}
