173 lines
4.1 KiB
Go
173 lines
4.1 KiB
Go
// Copyright 2020 Google 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.
|
|
|
|
package classifier
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/google/go-cmp/cmp"
|
|
)
|
|
|
|
func TestInitTrace(t *testing.T) {
|
|
tests := []struct {
|
|
name, licFlag, phaseFlag string
|
|
expectedLics map[string]bool
|
|
expectedPhases map[string]bool
|
|
}{
|
|
{
|
|
name: "empty flags",
|
|
licFlag: "",
|
|
phaseFlag: "",
|
|
expectedLics: map[string]bool{},
|
|
expectedPhases: map[string]bool{},
|
|
},
|
|
{
|
|
name: "single entries",
|
|
licFlag: "one_license",
|
|
phaseFlag: "setup",
|
|
expectedLics: map[string]bool{"one_license": true},
|
|
expectedPhases: map[string]bool{"setup": true},
|
|
},
|
|
{
|
|
name: "multiple entries",
|
|
licFlag: "one_license,two_license",
|
|
phaseFlag: "setup,teardown",
|
|
expectedLics: map[string]bool{"one_license": true, "two_license": true},
|
|
expectedPhases: map[string]bool{"setup": true, "teardown": true},
|
|
},
|
|
}
|
|
|
|
for _, test := range tests {
|
|
t.Run(test.name, func(t *testing.T) {
|
|
tc := &TraceConfiguration{
|
|
TraceLicenses: test.licFlag,
|
|
TracePhases: test.phaseFlag,
|
|
}
|
|
tc.init()
|
|
if !cmp.Equal(tc.traceLicenses, test.expectedLics) {
|
|
t.Errorf("got %v want %v", traceLicenses, test.expectedLics)
|
|
}
|
|
if !cmp.Equal(tc.tracePhases, test.expectedPhases) {
|
|
t.Errorf("got %v want %v", traceLicenses, test.expectedPhases)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestPhaseWildcardMatching(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
phases string
|
|
hits []string
|
|
misses []string
|
|
}{
|
|
{
|
|
name: "exact match",
|
|
phases: "scoring",
|
|
hits: []string{"scoring"},
|
|
misses: []string{"tokenize"},
|
|
},
|
|
{
|
|
name: "all match",
|
|
phases: "*",
|
|
hits: []string{"scoring", "tokenize"},
|
|
misses: nil,
|
|
},
|
|
}
|
|
for _, test := range tests {
|
|
t.Run(test.name, func(t *testing.T) {
|
|
tc := &TraceConfiguration{
|
|
TracePhases: test.phases,
|
|
}
|
|
tc.init()
|
|
for _, h := range test.hits {
|
|
if !tc.shouldTrace(h) {
|
|
t.Errorf("unexpected miss on phase %s", h)
|
|
}
|
|
}
|
|
|
|
for _, m := range test.misses {
|
|
if tc.shouldTrace(m) {
|
|
t.Errorf("unexpected hit on phase %s", m)
|
|
}
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestLicenseWildcardMatching(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
licenses string
|
|
hits []string
|
|
misses []string
|
|
}{
|
|
{
|
|
name: "exact match",
|
|
hits: []string{"GPL-2.0"},
|
|
misses: []string{"Apache-2.0", "GPL-3.0"},
|
|
licenses: "GPL-2.0",
|
|
},
|
|
{
|
|
name: "prefix match",
|
|
hits: []string{"GPL-2.0", "GPL-3.0"},
|
|
misses: []string{"Apache-2.0"},
|
|
licenses: "GPL-*",
|
|
},
|
|
{
|
|
name: "all match",
|
|
hits: []string{"GPL-2.0", "GPL-3.0", "Apache-2.0"},
|
|
misses: nil,
|
|
licenses: "*",
|
|
},
|
|
}
|
|
|
|
for _, test := range tests {
|
|
t.Run(test.name, func(t *testing.T) {
|
|
tc := &TraceConfiguration{
|
|
TraceLicenses: test.licenses,
|
|
}
|
|
tc.init()
|
|
for _, h := range test.hits {
|
|
if !tc.isTraceLicense(h) {
|
|
t.Errorf("unexpected miss on license %s", h)
|
|
}
|
|
}
|
|
|
|
for _, m := range test.misses {
|
|
if tc.isTraceLicense(m) {
|
|
t.Errorf("unexpected hit on license %s", m)
|
|
}
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
// The TraceConfiguration is only explicitly initialized and propagated to a
|
|
// variety of helper structs. For convenience, we just make it work safely in
|
|
// the case the pointer is nil. This test ensures that behavior so users of the
|
|
// TraceConfiguration don't need to explicitly initialize it.
|
|
func TestNilSafety(t *testing.T) {
|
|
var tc *TraceConfiguration
|
|
tc.init()
|
|
if tc.isTraceLicense("GPL-2.0") {
|
|
t.Errorf("unexpected hit on license")
|
|
}
|
|
|
|
if tc.shouldTrace("scoring") {
|
|
t.Errorf("unexpected hit on phase")
|
|
}
|
|
}
|