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 TestResolveNotices(t *testing.T) { 23 tests := []struct { 24 name string 25 roots []string 26 edges []annotated 27 expectedResolutions []res 28 }{ 29 { 30 name: "firstparty", 31 roots: []string{"apacheBin.meta_lic"}, 32 edges: []annotated{ 33 {"apacheBin.meta_lic", "apacheLib.meta_lic", []string{"static"}}, 34 }, 35 expectedResolutions: []res{ 36 {"apacheBin.meta_lic", "apacheBin.meta_lic", "notice"}, 37 {"apacheBin.meta_lic", "apacheLib.meta_lic", "notice"}, 38 }, 39 }, 40 { 41 name: "firstpartydynamic", 42 roots: []string{"apacheBin.meta_lic"}, 43 edges: []annotated{ 44 {"apacheBin.meta_lic", "apacheLib.meta_lic", []string{"dynamic"}}, 45 }, 46 expectedResolutions: []res{ 47 {"apacheBin.meta_lic", "apacheBin.meta_lic", "notice"}, 48 }, 49 }, 50 { 51 name: "firstpartydynamicshipped", 52 roots: []string{"apacheBin.meta_lic", "apacheLib.meta_lic"}, 53 edges: []annotated{ 54 {"apacheBin.meta_lic", "apacheLib.meta_lic", []string{"dynamic"}}, 55 }, 56 expectedResolutions: []res{ 57 {"apacheBin.meta_lic", "apacheBin.meta_lic", "notice"}, 58 {"apacheLib.meta_lic", "apacheLib.meta_lic", "notice"}, 59 }, 60 }, 61 { 62 name: "restricted", 63 roots: []string{"apacheBin.meta_lic"}, 64 edges: []annotated{ 65 {"apacheBin.meta_lic", "gplLib.meta_lic", []string{"static"}}, 66 {"apacheBin.meta_lic", "mitLib.meta_lic", []string{"static"}}, 67 }, 68 expectedResolutions: []res{ 69 {"apacheBin.meta_lic", "apacheBin.meta_lic", "notice|restricted"}, 70 {"apacheBin.meta_lic", "gplLib.meta_lic", "restricted"}, 71 {"apacheBin.meta_lic", "mitLib.meta_lic", "notice|restricted"}, 72 }, 73 }, 74 { 75 name: "restrictedtool", 76 roots: []string{"apacheBin.meta_lic"}, 77 edges: []annotated{ 78 {"apacheBin.meta_lic", "gplBin.meta_lic", []string{"toolchain"}}, 79 {"apacheBin.meta_lic", "mitLib.meta_lic", []string{"static"}}, 80 }, 81 expectedResolutions: []res{ 82 {"apacheBin.meta_lic", "apacheBin.meta_lic", "notice"}, 83 {"apacheBin.meta_lic", "mitLib.meta_lic", "notice"}, 84 }, 85 }, 86 { 87 name: "restricteddeep", 88 roots: []string{"apacheContainer.meta_lic"}, 89 edges: []annotated{ 90 {"apacheContainer.meta_lic", "apacheBin.meta_lic", []string{"static"}}, 91 {"apacheContainer.meta_lic", "mitBin.meta_lic", []string{"static"}}, 92 {"apacheBin.meta_lic", "gplLib.meta_lic", []string{"static"}}, 93 {"apacheBin.meta_lic", "mplLib.meta_lic", []string{"static"}}, 94 {"mitBin.meta_lic", "mitLib.meta_lic", []string{"static"}}, 95 }, 96 expectedResolutions: []res{ 97 {"apacheContainer.meta_lic", "apacheContainer.meta_lic", "notice|restricted"}, 98 {"apacheContainer.meta_lic", "apacheBin.meta_lic", "notice|restricted"}, 99 {"apacheContainer.meta_lic", "gplLib.meta_lic", "restricted"}, 100 {"apacheContainer.meta_lic", "mitBin.meta_lic", "notice"}, 101 {"apacheContainer.meta_lic", "mitLib.meta_lic", "notice"}, 102 {"apacheContainer.meta_lic", "mplLib.meta_lic", "reciprocal|restricted"}, 103 {"apacheBin.meta_lic", "apacheBin.meta_lic", "notice|restricted"}, 104 {"apacheBin.meta_lic", "gplLib.meta_lic", "restricted"}, 105 {"apacheBin.meta_lic", "mplLib.meta_lic", "reciprocal|restricted"}, 106 {"mitBin.meta_lic", "mitBin.meta_lic", "notice"}, 107 {"mitBin.meta_lic", "mitLib.meta_lic", "notice"}, 108 }, 109 }, 110 { 111 name: "restrictedwide", 112 roots: []string{"apacheContainer.meta_lic"}, 113 edges: []annotated{ 114 {"apacheContainer.meta_lic", "apacheBin.meta_lic", []string{"static"}}, 115 {"apacheContainer.meta_lic", "gplLib.meta_lic", []string{"static"}}, 116 }, 117 expectedResolutions: []res{ 118 {"apacheContainer.meta_lic", "apacheContainer.meta_lic", "notice|restricted"}, 119 {"apacheContainer.meta_lic", "apacheBin.meta_lic", "notice"}, 120 {"apacheContainer.meta_lic", "gplLib.meta_lic", "restricted"}, 121 {"apacheBin.meta_lic", "apacheBin.meta_lic", "notice"}, 122 {"gplLib.meta_lic", "gplLib.meta_lic", "restricted"}, 123 }, 124 }, 125 { 126 name: "restricteddynamic", 127 roots: []string{"apacheBin.meta_lic"}, 128 edges: []annotated{ 129 {"apacheBin.meta_lic", "gplLib.meta_lic", []string{"dynamic"}}, 130 {"apacheBin.meta_lic", "mitLib.meta_lic", []string{"dynamic"}}, 131 }, 132 expectedResolutions: []res{ 133 {"apacheBin.meta_lic", "apacheBin.meta_lic", "notice"}, 134 {"apacheBin.meta_lic", "apacheBin.meta_lic", "restricted"}, 135 }, 136 }, 137 { 138 name: "restricteddynamicshipped", 139 roots: []string{"apacheBin.meta_lic", "mitLib.meta_lic"}, 140 edges: []annotated{ 141 {"apacheBin.meta_lic", "gplLib.meta_lic", []string{"dynamic"}}, 142 {"apacheBin.meta_lic", "mitLib.meta_lic", []string{"dynamic"}}, 143 }, 144 expectedResolutions: []res{ 145 {"apacheBin.meta_lic", "apacheBin.meta_lic", "notice|restricted"}, 146 {"apacheBin.meta_lic", "mitLib.meta_lic", "restricted"}, 147 {"mitLib.meta_lic", "mitLib.meta_lic", "notice|restricted"}, 148 }, 149 }, 150 { 151 name: "restricteddynamicdeep", 152 roots: []string{"apacheContainer.meta_lic"}, 153 edges: []annotated{ 154 {"apacheContainer.meta_lic", "apacheBin.meta_lic", []string{"static"}}, 155 {"apacheContainer.meta_lic", "mitBin.meta_lic", []string{"static"}}, 156 {"apacheBin.meta_lic", "gplLib.meta_lic", []string{"dynamic"}}, 157 {"apacheBin.meta_lic", "mplLib.meta_lic", []string{"dynamic"}}, 158 {"mitBin.meta_lic", "mitLib.meta_lic", []string{"dynamic"}}, 159 }, 160 expectedResolutions: []res{ 161 {"apacheContainer.meta_lic", "apacheContainer.meta_lic", "notice|restricted"}, 162 {"apacheContainer.meta_lic", "apacheBin.meta_lic", "notice|restricted"}, 163 {"apacheContainer.meta_lic", "mitBin.meta_lic", "notice"}, 164 {"apacheBin.meta_lic", "apacheBin.meta_lic", "notice|restricted"}, 165 {"mitBin.meta_lic", "mitBin.meta_lic", "notice"}, 166 }, 167 }, 168 { 169 name: "restricteddynamicwide", 170 roots: []string{"apacheContainer.meta_lic"}, 171 edges: []annotated{ 172 {"apacheContainer.meta_lic", "apacheBin.meta_lic", []string{"static"}}, 173 {"apacheContainer.meta_lic", "gplLib.meta_lic", []string{"dynamic"}}, 174 }, 175 expectedResolutions: []res{ 176 {"apacheContainer.meta_lic", "apacheContainer.meta_lic", "notice|restricted"}, 177 {"apacheContainer.meta_lic", "apacheBin.meta_lic", "notice"}, 178 {"apacheBin.meta_lic", "apacheBin.meta_lic", "notice"}, 179 }, 180 }, 181 { 182 name: "restricteddynamicwideshipped", 183 roots: []string{"apacheContainer.meta_lic", "gplLib.meta_lic"}, 184 edges: []annotated{ 185 {"apacheContainer.meta_lic", "apacheBin.meta_lic", []string{"static"}}, 186 {"apacheContainer.meta_lic", "gplLib.meta_lic", []string{"dynamic"}}, 187 }, 188 expectedResolutions: []res{ 189 {"apacheContainer.meta_lic", "apacheContainer.meta_lic", "notice|restricted"}, 190 {"apacheContainer.meta_lic", "apacheBin.meta_lic", "notice"}, 191 {"apacheContainer.meta_lic", "gplLib.meta_lic", "restricted"}, 192 {"apacheBin.meta_lic", "apacheBin.meta_lic", "notice"}, 193 {"gplLib.meta_lic", "gplLib.meta_lic", "restricted"}, 194 }, 195 }, 196 { 197 name: "weakrestricted", 198 roots: []string{"apacheBin.meta_lic"}, 199 edges: []annotated{ 200 {"apacheBin.meta_lic", "lgplLib.meta_lic", []string{"static"}}, 201 {"apacheBin.meta_lic", "mitLib.meta_lic", []string{"static"}}, 202 }, 203 expectedResolutions: []res{ 204 {"apacheBin.meta_lic", "apacheBin.meta_lic", "notice|restricted_if_statically_linked"}, 205 {"apacheBin.meta_lic", "lgplLib.meta_lic", "restricted_if_statically_linked"}, 206 {"apacheBin.meta_lic", "mitLib.meta_lic", "notice|restricted_if_statically_linked"}, 207 }, 208 }, 209 { 210 name: "weakrestrictedtool", 211 roots: []string{"apacheBin.meta_lic"}, 212 edges: []annotated{ 213 {"apacheBin.meta_lic", "lgplBin.meta_lic", []string{"toolchain"}}, 214 {"apacheBin.meta_lic", "mitLib.meta_lic", []string{"static"}}, 215 }, 216 expectedResolutions: []res{ 217 {"apacheBin.meta_lic", "apacheBin.meta_lic", "notice"}, 218 {"apacheBin.meta_lic", "mitLib.meta_lic", "notice"}, 219 }, 220 }, 221 { 222 name: "weakrestrictedtoolshipped", 223 roots: []string{"apacheBin.meta_lic", "lgplBin.meta_lic"}, 224 edges: []annotated{ 225 {"apacheBin.meta_lic", "lgplBin.meta_lic", []string{"toolchain"}}, 226 {"apacheBin.meta_lic", "mitLib.meta_lic", []string{"static"}}, 227 }, 228 expectedResolutions: []res{ 229 {"apacheBin.meta_lic", "apacheBin.meta_lic", "notice"}, 230 {"apacheBin.meta_lic", "mitLib.meta_lic", "notice"}, 231 {"lgplBin.meta_lic", "lgplBin.meta_lic", "restricted_if_statically_linked"}, 232 }, 233 }, 234 { 235 name: "weakrestricteddeep", 236 roots: []string{"apacheContainer.meta_lic"}, 237 edges: []annotated{ 238 {"apacheContainer.meta_lic", "apacheBin.meta_lic", []string{"static"}}, 239 {"apacheBin.meta_lic", "lgplLib.meta_lic", []string{"static"}}, 240 {"apacheBin.meta_lic", "mitLib.meta_lic", []string{"static"}}, 241 }, 242 expectedResolutions: []res{ 243 {"apacheContainer.meta_lic", "apacheContainer.meta_lic", "notice|restricted_if_statically_linked"}, 244 {"apacheContainer.meta_lic", "apacheBin.meta_lic", "notice|restricted_if_statically_linked"}, 245 {"apacheContainer.meta_lic", "lgplLib.meta_lic", "restricted_if_statically_linked"}, 246 {"apacheContainer.meta_lic", "mitLib.meta_lic", "notice|restricted_if_statically_linked"}, 247 {"apacheBin.meta_lic", "apacheBin.meta_lic", "notice|restricted_if_statically_linked"}, 248 {"apacheBin.meta_lic", "lgplLib.meta_lic", "restricted_if_statically_linked"}, 249 {"apacheBin.meta_lic", "mitLib.meta_lic", "notice|restricted_if_statically_linked"}, 250 }, 251 }, 252 { 253 name: "weakrestrictedwide", 254 roots: []string{"apacheContainer.meta_lic"}, 255 edges: []annotated{ 256 {"apacheContainer.meta_lic", "apacheBin.meta_lic", []string{"static"}}, 257 {"apacheContainer.meta_lic", "lgplLib.meta_lic", []string{"static"}}, 258 }, 259 expectedResolutions: []res{ 260 {"apacheContainer.meta_lic", "apacheContainer.meta_lic", "notice|restricted_if_statically_linked"}, 261 {"apacheContainer.meta_lic", "apacheBin.meta_lic", "notice"}, 262 {"apacheContainer.meta_lic", "lgplLib.meta_lic", "restricted_if_statically_linked"}, 263 {"apacheBin.meta_lic", "apacheBin.meta_lic", "notice"}, 264 {"lgplLib.meta_lic", "lgplLib.meta_lic", "restricted_if_statically_linked"}, 265 }, 266 }, 267 { 268 name: "weakrestricteddynamic", 269 roots: []string{"apacheBin.meta_lic"}, 270 edges: []annotated{ 271 {"apacheBin.meta_lic", "lgplLib.meta_lic", []string{"dynamic"}}, 272 {"apacheBin.meta_lic", "mitLib.meta_lic", []string{"static"}}, 273 }, 274 expectedResolutions: []res{ 275 {"apacheBin.meta_lic", "apacheBin.meta_lic", "notice"}, 276 {"apacheBin.meta_lic", "mitLib.meta_lic", "notice"}, 277 }, 278 }, 279 { 280 name: "weakrestricteddynamicshipped", 281 roots: []string{"apacheBin.meta_lic", "lgplLib.meta_lic"}, 282 edges: []annotated{ 283 {"apacheBin.meta_lic", "lgplLib.meta_lic", []string{"dynamic"}}, 284 {"apacheBin.meta_lic", "mitLib.meta_lic", []string{"static"}}, 285 }, 286 expectedResolutions: []res{ 287 {"apacheBin.meta_lic", "apacheBin.meta_lic", "notice"}, 288 {"apacheBin.meta_lic", "mitLib.meta_lic", "notice"}, 289 {"lgplLib.meta_lic", "lgplLib.meta_lic", "restricted_if_statically_linked"}, 290 }, 291 }, 292 { 293 name: "weakrestricteddynamicdeep", 294 roots: []string{"apacheContainer.meta_lic"}, 295 edges: []annotated{ 296 {"apacheContainer.meta_lic", "apacheBin.meta_lic", []string{"static"}}, 297 {"apacheBin.meta_lic", "lgplLib.meta_lic", []string{"dynamic"}}, 298 }, 299 expectedResolutions: []res{ 300 {"apacheContainer.meta_lic", "apacheContainer.meta_lic", "notice"}, 301 {"apacheContainer.meta_lic", "apacheBin.meta_lic", "notice"}, 302 {"apacheBin.meta_lic", "apacheBin.meta_lic", "notice"}, 303 }, 304 }, 305 { 306 name: "weakrestricteddynamicdeepshipped", 307 roots: []string{"apacheContainer.meta_lic", "lgplLib.meta_lic"}, 308 edges: []annotated{ 309 {"apacheContainer.meta_lic", "apacheBin.meta_lic", []string{"static"}}, 310 {"apacheBin.meta_lic", "lgplLib.meta_lic", []string{"dynamic"}}, 311 }, 312 expectedResolutions: []res{ 313 {"apacheContainer.meta_lic", "apacheContainer.meta_lic", "notice"}, 314 {"apacheContainer.meta_lic", "apacheBin.meta_lic", "notice"}, 315 {"apacheBin.meta_lic", "apacheBin.meta_lic", "notice"}, 316 {"lgplLib.meta_lic", "lgplLib.meta_lic", "restricted_if_statically_linked"}, 317 }, 318 }, 319 { 320 name: "weakrestricteddynamicwide", 321 roots: []string{"apacheContainer.meta_lic"}, 322 edges: []annotated{ 323 {"apacheContainer.meta_lic", "apacheBin.meta_lic", []string{"static"}}, 324 {"apacheContainer.meta_lic", "lgplLib.meta_lic", []string{"dynamic"}}, 325 }, 326 expectedResolutions: []res{ 327 {"apacheContainer.meta_lic", "apacheContainer.meta_lic", "notice"}, 328 {"apacheContainer.meta_lic", "apacheBin.meta_lic", "notice"}, 329 {"apacheBin.meta_lic", "apacheBin.meta_lic", "notice"}, 330 }, 331 }, 332 { 333 name: "weakrestricteddynamicwideshipped", 334 roots: []string{"apacheContainer.meta_lic", "lgplLib.meta_lic"}, 335 edges: []annotated{ 336 {"apacheContainer.meta_lic", "apacheBin.meta_lic", []string{"static"}}, 337 {"apacheContainer.meta_lic", "lgplLib.meta_lic", []string{"dynamic"}}, 338 }, 339 expectedResolutions: []res{ 340 {"apacheContainer.meta_lic", "apacheContainer.meta_lic", "notice"}, 341 {"apacheContainer.meta_lic", "apacheBin.meta_lic", "notice"}, 342 {"apacheBin.meta_lic", "apacheBin.meta_lic", "notice"}, 343 {"lgplLib.meta_lic", "lgplLib.meta_lic", "restricted_if_statically_linked"}, 344 }, 345 }, 346 { 347 name: "classpath", 348 roots: []string{"apacheBin.meta_lic"}, 349 edges: []annotated{ 350 {"apacheBin.meta_lic", "gplWithClasspathException.meta_lic", []string{"static"}}, 351 {"apacheBin.meta_lic", "mitLib.meta_lic", []string{"static"}}, 352 }, 353 expectedResolutions: []res{ 354 {"apacheBin.meta_lic", "apacheBin.meta_lic", "notice"}, 355 {"apacheBin.meta_lic", "gplWithClasspathException.meta_lic", "permissive"}, 356 {"apacheBin.meta_lic", "mitLib.meta_lic", "notice"}, 357 }, 358 }, 359 { 360 name: "classpathdependent", 361 roots: []string{"dependentModule.meta_lic"}, 362 edges: []annotated{ 363 {"dependentModule.meta_lic", "gplWithClasspathException.meta_lic", []string{"static"}}, 364 {"dependentModule.meta_lic", "mitLib.meta_lic", []string{"static"}}, 365 }, 366 expectedResolutions: []res{ 367 {"dependentModule.meta_lic", "dependentModule.meta_lic", "notice"}, 368 {"dependentModule.meta_lic", "gplWithClasspathException.meta_lic", "permissive"}, 369 {"dependentModule.meta_lic", "mitLib.meta_lic", "notice"}, 370 }, 371 }, 372 { 373 name: "classpathdynamic", 374 roots: []string{"apacheBin.meta_lic"}, 375 edges: []annotated{ 376 {"apacheBin.meta_lic", "gplWithClasspathException.meta_lic", []string{"dynamic"}}, 377 {"apacheBin.meta_lic", "mitLib.meta_lic", []string{"static"}}, 378 }, 379 expectedResolutions: []res{ 380 {"apacheBin.meta_lic", "apacheBin.meta_lic", "notice"}, 381 {"apacheBin.meta_lic", "mitLib.meta_lic", "notice"}, 382 }, 383 }, 384 { 385 name: "classpathdynamicshipped", 386 roots: []string{"apacheBin.meta_lic", "gplWithClasspathException.meta_lic"}, 387 edges: []annotated{ 388 {"apacheBin.meta_lic", "gplWithClasspathException.meta_lic", []string{"dynamic"}}, 389 {"apacheBin.meta_lic", "mitLib.meta_lic", []string{"static"}}, 390 }, 391 expectedResolutions: []res{ 392 {"apacheBin.meta_lic", "apacheBin.meta_lic", "notice"}, 393 {"apacheBin.meta_lic", "mitLib.meta_lic", "notice"}, 394 {"gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "permissive"}, 395 }, 396 }, 397 { 398 name: "classpathdependentdynamic", 399 roots: []string{"dependentModule.meta_lic"}, 400 edges: []annotated{ 401 {"dependentModule.meta_lic", "gplWithClasspathException.meta_lic", []string{"dynamic"}}, 402 {"dependentModule.meta_lic", "mitLib.meta_lic", []string{"static"}}, 403 }, 404 expectedResolutions: []res{ 405 {"dependentModule.meta_lic", "dependentModule.meta_lic", "notice"}, 406 {"dependentModule.meta_lic", "mitLib.meta_lic", "notice"}, 407 }, 408 }, 409 { 410 name: "classpathdependentdynamicshipped", 411 roots: []string{"dependentModule.meta_lic", "gplWithClasspathException.meta_lic"}, 412 edges: []annotated{ 413 {"dependentModule.meta_lic", "gplWithClasspathException.meta_lic", []string{"dynamic"}}, 414 {"dependentModule.meta_lic", "mitLib.meta_lic", []string{"static"}}, 415 }, 416 expectedResolutions: []res{ 417 {"dependentModule.meta_lic", "dependentModule.meta_lic", "notice"}, 418 {"dependentModule.meta_lic", "mitLib.meta_lic", "notice"}, 419 {"gplWithClasspathException.meta_lic", "gplWithClasspathException.meta_lic", "permissive"}, 420 }, 421 }, 422 } 423 for _, tt := range tests { 424 t.Run(tt.name, func(t *testing.T) { 425 stderr := &bytes.Buffer{} 426 lg, err := toGraph(stderr, tt.roots, tt.edges) 427 if err != nil { 428 t.Errorf("unexpected test data error: got %s, want no error", err) 429 return 430 } 431 expectedRs := toResolutionSet(lg, tt.expectedResolutions) 432 actualRs := ResolveNotices(lg) 433 checkSame(actualRs, expectedRs, t) 434 }) 435 } 436} 437