blob: ec300026a2a9e760c468a6711455c51dc124fd68 [file] [log] [blame]
// 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")
}
}