blob: 7371ccf94b0b0b7c4b1bbbefef21da203fd9c857 [file] [log] [blame]
Bob Badour9ee7d032021-10-25 16:51:48 -07001// Copyright 2021 Google LLC
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package compliance
16
17import (
18 "bytes"
19 "testing"
20)
21
22func TestResolveSourceSharing(t *testing.T) {
23 tests := []struct {
24 name string
25 roots []string
26 edges []annotated
27 expectedResolutions []res
28 }{
29 {
30 name: "independentmodulerestricted",
31 roots: []string{"apacheBin.meta_lic"},
32 edges: []annotated{
33 {"apacheBin.meta_lic", "gplWithClasspathException.meta_lic", []string{"dynamic"}},
34 },
35 expectedResolutions: []res{},
36 },
37 {
38 name: "independentmodulerestrictedshipped",
39 roots: []string{"apacheBin.meta_lic", "gplWithClasspathException.meta_lic"},
40 edges: []annotated{
41 {"apacheBin.meta_lic", "gplWithClasspathException.meta_lic", []string{"dynamic"}},
42 },
43 expectedResolutions: []res{
44 {"gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
45 },
46 },
47 {
48 name: "independentmodulestaticrestricted",
49 roots: []string{"apacheBin.meta_lic"},
50 edges: []annotated{
51 {"apacheBin.meta_lic", "gplWithClasspathException.meta_lic", []string{"static"}},
52 },
53 expectedResolutions: []res{
54 {"apacheBin.meta_lic", "apacheBin.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
55 {"apacheBin.meta_lic", "gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
56 },
57 },
58 {
59 name: "dependentmodulerestricted",
60 roots: []string{"dependentModule.meta_lic"},
61 edges: []annotated{
62 {"dependentModule.meta_lic", "gplWithClasspathException.meta_lic", []string{"dynamic"}},
63 },
64 expectedResolutions: []res{
65 {"dependentModule.meta_lic", "dependentModule.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
66 },
67 },
68 {
69 name: "dependentmodulerestrictedshipclasspath",
70 roots: []string{"dependentModule.meta_lic", "gplWithClasspathException.meta_lic"},
71 edges: []annotated{
72 {"dependentModule.meta_lic", "gplWithClasspathException.meta_lic", []string{"dynamic"}},
73 },
74 expectedResolutions: []res{
75 {"dependentModule.meta_lic", "dependentModule.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
76 {"dependentModule.meta_lic", "gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
77 {"gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
78 },
79 },
80 {
81 name: "lgplonfprestricted",
82 roots: []string{"lgplBin.meta_lic"},
83 edges: []annotated{
84 {"lgplBin.meta_lic", "apacheLib.meta_lic", []string{"static"}},
85 },
86 expectedResolutions: []res{
87 {"lgplBin.meta_lic", "lgplBin.meta_lic", "lgplBin.meta_lic", "restricted"},
88 {"lgplBin.meta_lic", "apacheLib.meta_lic", "lgplBin.meta_lic", "restricted"},
89 },
90 },
91 {
92 name: "lgplonfpdynamicrestricted",
93 roots: []string{"lgplBin.meta_lic"},
94 edges: []annotated{
95 {"lgplBin.meta_lic", "apacheLib.meta_lic", []string{"dynamic"}},
96 },
97 expectedResolutions: []res{
98 {"lgplBin.meta_lic", "lgplBin.meta_lic", "lgplBin.meta_lic", "restricted"},
99 },
100 },
101 {
102 name: "lgplonfpdynamicrestrictedshiplib",
103 roots: []string{"lgplBin.meta_lic", "apacheLib.meta_lic"},
104 edges: []annotated{
105 {"lgplBin.meta_lic", "apacheLib.meta_lic", []string{"dynamic"}},
106 },
107 expectedResolutions: []res{
108 {"lgplBin.meta_lic", "lgplBin.meta_lic", "lgplBin.meta_lic", "restricted"},
109 },
110 },
111 {
112 name: "gplonfprestricted",
113 roots: []string{"gplBin.meta_lic"},
114 edges: []annotated{
115 {"gplBin.meta_lic", "apacheLib.meta_lic", []string{"static"}},
116 },
117 expectedResolutions: []res{
118 {"gplBin.meta_lic", "gplBin.meta_lic", "gplBin.meta_lic", "restricted"},
119 {"gplBin.meta_lic", "apacheLib.meta_lic", "gplBin.meta_lic", "restricted"},
120 },
121 },
122 {
123 name: "gplcontainerrestricted",
124 roots: []string{"gplContainer.meta_lic"},
125 edges: []annotated{
126 {"gplContainer.meta_lic", "apacheLib.meta_lic", []string{"static"}},
127 },
128 expectedResolutions: []res{
129 {"gplContainer.meta_lic", "gplContainer.meta_lic", "gplContainer.meta_lic", "restricted"},
130 {"gplContainer.meta_lic", "apacheLib.meta_lic", "gplContainer.meta_lic", "restricted"},
131 {"apacheLib.meta_lic", "apacheLib.meta_lic", "gplContainer.meta_lic", "restricted"},
132 },
133 },
134 {
135 name: "gploncontainerrestricted",
136 roots: []string{"apacheContainer.meta_lic"},
137 edges: []annotated{
138 {"apacheContainer.meta_lic", "apacheLib.meta_lic", []string{"static"}},
139 {"apacheContainer.meta_lic", "gplLib.meta_lic", []string{"static"}},
140 },
141 expectedResolutions: []res{
142 {"apacheContainer.meta_lic", "apacheContainer.meta_lic", "gplLib.meta_lic", "restricted"},
143 {"apacheContainer.meta_lic", "gplLib.meta_lic", "gplLib.meta_lic", "restricted"},
144 {"gplLib.meta_lic", "gplLib.meta_lic", "gplLib.meta_lic", "restricted"},
145 },
146 },
147 {
148 name: "gplonbinrestricted",
149 roots: []string{"apacheBin.meta_lic"},
150 edges: []annotated{
151 {"apacheBin.meta_lic", "apacheLib.meta_lic", []string{"static"}},
152 {"apacheBin.meta_lic", "gplLib.meta_lic", []string{"static"}},
153 },
154 expectedResolutions: []res{
155 {"apacheBin.meta_lic", "apacheBin.meta_lic", "gplLib.meta_lic", "restricted"},
156 {"apacheBin.meta_lic", "gplLib.meta_lic", "gplLib.meta_lic", "restricted"},
157 {"apacheBin.meta_lic", "apacheLib.meta_lic", "gplLib.meta_lic", "restricted"},
158 },
159 },
160 {
161 name: "gplonfpdynamicrestricted",
162 roots: []string{"gplBin.meta_lic"},
163 edges: []annotated{
164 {"gplBin.meta_lic", "apacheLib.meta_lic", []string{"dynamic"}},
165 },
166 expectedResolutions: []res{
167 {"gplBin.meta_lic", "gplBin.meta_lic", "gplBin.meta_lic", "restricted"},
168 },
169 },
170 {
171 name: "gplonfpdynamicrestrictedshiplib",
172 roots: []string{"gplBin.meta_lic", "apacheLib.meta_lic"},
173 edges: []annotated{
174 {"gplBin.meta_lic", "apacheLib.meta_lic", []string{"dynamic"}},
175 },
176 expectedResolutions: []res{
177 {"gplBin.meta_lic", "gplBin.meta_lic", "gplBin.meta_lic", "restricted"},
178 {"gplBin.meta_lic", "apacheLib.meta_lic", "gplBin.meta_lic", "restricted"},
179 },
180 },
181 {
182 name: "independentmodulereverserestricted",
183 roots: []string{"gplWithClasspathException.meta_lic"},
184 edges: []annotated{
185 {"gplWithClasspathException.meta_lic", "apacheBin.meta_lic", []string{"dynamic"}},
186 },
187 expectedResolutions: []res{
188 {"gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
189 },
190 },
191 {
192 name: "independentmodulereversestaticrestricted",
193 roots: []string{"gplWithClasspathException.meta_lic"},
194 edges: []annotated{
195 {"gplWithClasspathException.meta_lic", "apacheBin.meta_lic", []string{"static"}},
196 },
197 expectedResolutions: []res{
198 {"gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
199 {"gplWithClasspathException.meta_lic", "apacheBin.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
200 },
201 },
202 {
203 name: "dependentmodulereverserestricted",
204 roots: []string{"gplWithClasspathException.meta_lic"},
205 edges: []annotated{
206 {"gplWithClasspathException.meta_lic", "dependentModule.meta_lic", []string{"dynamic"}},
207 },
208 expectedResolutions: []res{
209 {"gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
210 },
211 },
212 {
213 name: "dependentmodulereverserestrictedshipdependent",
214 roots: []string{"gplWithClasspathException.meta_lic", "dependentModule.meta_lic"},
215 edges: []annotated{
216 {"gplWithClasspathException.meta_lic", "dependentModule.meta_lic", []string{"dynamic"}},
217 },
218 expectedResolutions: []res{
219 {"gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
220 {"gplWithClasspathException.meta_lic", "dependentModule.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
221 },
222 },
223 {
224 name: "ponrrestricted",
225 roots: []string{"proprietary.meta_lic"},
226 edges: []annotated{
227 {"proprietary.meta_lic", "gplLib.meta_lic", []string{"static"}},
228 },
229 expectedResolutions: []res{
230 {"proprietary.meta_lic", "proprietary.meta_lic", "gplLib.meta_lic", "restricted"},
231 {"proprietary.meta_lic", "gplLib.meta_lic", "gplLib.meta_lic", "restricted"},
232 },
233 },
234 {
235 name: "ronprestricted",
236 roots: []string{"gplBin.meta_lic"},
237 edges: []annotated{
238 {"gplBin.meta_lic", "proprietary.meta_lic", []string{"static"}},
239 },
240 expectedResolutions: []res{
241 {"gplBin.meta_lic", "gplBin.meta_lic", "gplBin.meta_lic", "restricted"},
242 {"gplBin.meta_lic", "proprietary.meta_lic", "gplBin.meta_lic", "restricted"},
243 },
244 },
245 {
246 name: "noticeonb_e_orestricted",
247 roots: []string{"mitBin.meta_lic"},
248 edges: []annotated{
249 {"mitBin.meta_lic", "by_exception.meta_lic", []string{"static"}},
250 },
251 expectedResolutions: []res{},
252 },
253 {
254 name: "b_e_oonnoticerestricted",
255 roots: []string{"by_exception.meta_lic"},
256 edges: []annotated{
257 {"by_exception.meta_lic", "mitLib.meta_lic", []string{"static"}},
258 },
259 expectedResolutions: []res{},
260 },
261 {
262 name: "noticeonreciprecip",
263 roots: []string{"mitBin.meta_lic"},
264 edges: []annotated{
265 {"mitBin.meta_lic", "mplLib.meta_lic", []string{"static"}},
266 },
267 expectedResolutions: []res{
268 {"mitBin.meta_lic", "mplLib.meta_lic", "mplLib.meta_lic", "reciprocal"},
269 },
270 },
271 {
272 name: "reciponnoticerecip",
273 roots: []string{"mplBin.meta_lic"},
274 edges: []annotated{
275 {"mplBin.meta_lic", "mitLib.meta_lic", []string{"static"}},
276 },
277 expectedResolutions: []res{
278 {"mplBin.meta_lic", "mplBin.meta_lic", "mplBin.meta_lic", "reciprocal"},
279 },
280 },
281 }
282 for _, tt := range tests {
283 t.Run(tt.name, func(t *testing.T) {
284 stderr := &bytes.Buffer{}
285 lg, err := toGraph(stderr, tt.roots, tt.edges)
286 if err != nil {
287 t.Errorf("unexpected test data error: got %w, want no error", err)
288 return
289 }
290 expectedRs := toResolutionSet(lg, tt.expectedResolutions)
291 actualRs := ResolveSourceSharing(lg)
292 checkSame(actualRs, expectedRs, t)
293 })
294 }
295}