// 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") } }