blob: efdff82bc56c61f543d3dec5bde148dc1af35126 [file] [log] [blame]
// Copyright 2021 Google LLC
//
// 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 compliance
import (
"sort"
"testing"
)
var (
// bottomUp describes the bottom-up resolve of a hypothetical graph
// the graph has a container image, a couple binaries, and a couple
// libraries. bin1 statically links lib1 and dynamically links lib2;
// bin2 dynamically links lib1 and statically links lib2.
// binc represents a compiler or other toolchain binary used for
// building the other binaries.
bottomUp = []res{
{"image", "image", "notice|restricted"},
{"image", "bin1", "reciprocal"},
{"image", "bin2", "restricted"},
{"image", "lib1", "notice"},
{"image", "lib2", "notice"},
{"binc", "binc", "proprietary"},
{"bin1", "bin1", "reciprocal"},
{"bin1", "lib1", "notice"},
{"bin2", "bin2", "restricted"},
{"bin2", "lib2", "notice"},
{"lib1", "lib1", "notice"},
{"lib2", "lib2", "notice"},
}
// notice describes bottomUp after a top-down notice resolve.
notice = []res{
{"image", "image", "notice|restricted"},
{"image", "bin1", "reciprocal"},
{"image", "bin2", "restricted"},
{"image", "lib1", "notice"},
{"image", "lib2", "notice|restricted"},
{"bin1", "bin1", "reciprocal"},
{"bin1", "lib1", "notice"},
{"bin2", "bin2", "restricted"},
{"bin2", "lib2", "notice|restricted"},
{"lib1", "lib1", "notice"},
{"lib2", "lib2", "notice"},
}
// share describes bottomUp after a top-down share resolve.
share = []res{
{"image", "image", "restricted"},
{"image", "bin1", "reciprocal"},
{"image", "bin2", "restricted"},
{"image", "lib2", "restricted"},
{"bin1", "bin1", "reciprocal"},
{"bin2", "bin2", "restricted"},
{"bin2", "lib2", "restricted"},
}
// proprietary describes bottomUp after a top-down proprietary resolve.
// Note that the proprietary binc is not reachable through the toolchain
// dependency.
proprietary = []res{}
)
func TestResolutionSet_AttachesTo(t *testing.T) {
lg := newLicenseGraph()
rsShare := toResolutionSet(lg, share)
t.Logf("checking resolution set %s", rsShare.String())
actual := rsShare.AttachesTo().Names()
sort.Strings(actual)
expected := []string{"bin1", "bin2", "image"}
t.Logf("actual rsShare: %v", actual)
t.Logf("expected rsShare: %v", expected)
if len(actual) != len(expected) {
t.Errorf("rsShare: wrong number of targets: got %d, want %d", len(actual), len(expected))
return
}
for i := 0; i < len(actual); i++ {
if actual[i] != expected[i] {
t.Errorf("rsShare: unexpected target at index %d: got %s, want %s", i, actual[i], expected[i])
}
}
rsPrivate := toResolutionSet(lg, proprietary)
actual = rsPrivate.AttachesTo().Names()
expected = []string{}
t.Logf("actual rsPrivate: %v", actual)
t.Logf("expected rsPrivate: %v", expected)
if len(actual) != len(expected) {
t.Errorf("rsPrivate: wrong number of targets: got %d, want %d", len(actual), len(expected))
return
}
for i := 0; i < len(actual); i++ {
if actual[i] != expected[i] {
t.Errorf("rsPrivate: unexpected target at index %d: got %s, want %s", i, actual[i], expected[i])
}
}
}
func TestResolutionSet_AttachesToTarget(t *testing.T) {
lg := newLicenseGraph()
rsShare := toResolutionSet(lg, share)
t.Logf("checking resolution set %s", rsShare.String())
if rsShare.AttachesToTarget(newTestNode(lg, "binc")) {
t.Errorf("actual.AttachesToTarget(\"binc\"): got true, want false")
}
if !rsShare.AttachesToTarget(newTestNode(lg, "image")) {
t.Errorf("actual.AttachesToTarget(\"image\"): got false want true")
}
}