• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// 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				{"apacheLib.meta_lic", "apacheLib.meta_lic", "gplBin.meta_lic", "restricted"},
180			},
181		},
182		{
183			name:  "independentmodulereverserestricted",
184			roots: []string{"gplWithClasspathException.meta_lic"},
185			edges: []annotated{
186				{"gplWithClasspathException.meta_lic", "apacheBin.meta_lic", []string{"dynamic"}},
187			},
188			expectedResolutions: []res{
189				{"gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
190			},
191		},
192		{
193			name:  "independentmodulereversestaticrestricted",
194			roots: []string{"gplWithClasspathException.meta_lic"},
195			edges: []annotated{
196				{"gplWithClasspathException.meta_lic", "apacheBin.meta_lic", []string{"static"}},
197			},
198			expectedResolutions: []res{
199				{"gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
200				{"gplWithClasspathException.meta_lic", "apacheBin.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
201			},
202		},
203		{
204			name:  "dependentmodulereverserestricted",
205			roots: []string{"gplWithClasspathException.meta_lic"},
206			edges: []annotated{
207				{"gplWithClasspathException.meta_lic", "dependentModule.meta_lic", []string{"dynamic"}},
208			},
209			expectedResolutions: []res{
210				{"gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
211			},
212		},
213		{
214			name:  "dependentmodulereverserestrictedshipdependent",
215			roots: []string{"gplWithClasspathException.meta_lic", "dependentModule.meta_lic"},
216			edges: []annotated{
217				{"gplWithClasspathException.meta_lic", "dependentModule.meta_lic", []string{"dynamic"}},
218			},
219			expectedResolutions: []res{
220				{"gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
221				{"gplWithClasspathException.meta_lic", "dependentModule.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
222				{"dependentModule.meta_lic", "dependentModule.meta_lic", "gplWithClasspathException.meta_lic", "restricted"},
223			},
224		},
225		{
226			name:  "ponrrestricted",
227			roots: []string{"proprietary.meta_lic"},
228			edges: []annotated{
229				{"proprietary.meta_lic", "gplLib.meta_lic", []string{"static"}},
230			},
231			expectedResolutions: []res{
232				{"proprietary.meta_lic", "proprietary.meta_lic", "gplLib.meta_lic", "restricted"},
233				{"proprietary.meta_lic", "gplLib.meta_lic", "gplLib.meta_lic", "restricted"},
234			},
235		},
236		{
237			name:  "ronprestricted",
238			roots: []string{"gplBin.meta_lic"},
239			edges: []annotated{
240				{"gplBin.meta_lic", "proprietary.meta_lic", []string{"static"}},
241			},
242			expectedResolutions: []res{
243				{"gplBin.meta_lic", "gplBin.meta_lic", "gplBin.meta_lic", "restricted"},
244				{"gplBin.meta_lic", "proprietary.meta_lic", "gplBin.meta_lic", "restricted"},
245			},
246		},
247		{
248			name:  "noticeonb_e_orestricted",
249			roots: []string{"mitBin.meta_lic"},
250			edges: []annotated{
251				{"mitBin.meta_lic", "by_exception.meta_lic", []string{"static"}},
252			},
253			expectedResolutions: []res{},
254		},
255		{
256			name:  "b_e_oonnoticerestricted",
257			roots: []string{"by_exception.meta_lic"},
258			edges: []annotated{
259				{"by_exception.meta_lic", "mitLib.meta_lic", []string{"static"}},
260			},
261			expectedResolutions: []res{},
262		},
263		{
264			name:  "noticeonreciprecip",
265			roots: []string{"mitBin.meta_lic"},
266			edges: []annotated{
267				{"mitBin.meta_lic", "mplLib.meta_lic", []string{"static"}},
268			},
269			expectedResolutions: []res{
270				{"mitBin.meta_lic", "mplLib.meta_lic", "mplLib.meta_lic", "reciprocal"},
271			},
272		},
273		{
274			name:  "reciponnoticerecip",
275			roots: []string{"mplBin.meta_lic"},
276			edges: []annotated{
277				{"mplBin.meta_lic", "mitLib.meta_lic", []string{"static"}},
278			},
279			expectedResolutions: []res{
280				{"mplBin.meta_lic", "mplBin.meta_lic", "mplBin.meta_lic", "reciprocal"},
281			},
282		},
283	}
284	for _, tt := range tests {
285		t.Run(tt.name, func(t *testing.T) {
286			stderr := &bytes.Buffer{}
287			lg, err := toGraph(stderr, tt.roots, tt.edges)
288			if err != nil {
289				t.Errorf("unexpected test data error: got %s, want no error", err)
290				return
291			}
292			expectedRs := toResolutionSet(lg, tt.expectedResolutions)
293			actualRs := ResolveSourceSharing(lg)
294			checkResolves(actualRs, expectedRs, t)
295		})
296	}
297}
298