github.com/anchore/syft@v1.4.2-0.20240516191711-1bec1fc5d397/syft/pkg/cataloger/java/package_url_test.go (about)

     1  package java
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/stretchr/testify/assert"
     7  
     8  	"github.com/anchore/syft/syft/pkg"
     9  )
    10  
    11  func Test_packageURL(t *testing.T) {
    12  	tests := []struct {
    13  		name   string
    14  		pkg    pkg.Package
    15  		expect string
    16  	}{
    17  		{
    18  			name: "maven",
    19  			pkg: pkg.Package{
    20  				Name:     "example-java-app-maven",
    21  				Version:  "0.1.0",
    22  				Language: pkg.Java,
    23  				Type:     pkg.JavaPkg,
    24  				Metadata: pkg.JavaArchive{
    25  					VirtualPath: "test-fixtures/java-builds/packages/example-java-app-maven-0.1.0.jar",
    26  					Manifest: &pkg.JavaManifest{
    27  						Main: []pkg.KeyValue{
    28  							{
    29  								Key:   "Manifest-Version",
    30  								Value: "1.0",
    31  							},
    32  						},
    33  					},
    34  					PomProperties: &pkg.JavaPomProperties{
    35  						Path:       "META-INF/maven/org.anchore/example-java-app-maven/pom.properties",
    36  						GroupID:    "org.anchore",
    37  						ArtifactID: "example-java-app-maven",
    38  						Version:    "0.1.0",
    39  						Extra:      make(map[string]string),
    40  					},
    41  				},
    42  			},
    43  			expect: "pkg:maven/org.anchore/example-java-app-maven@0.1.0",
    44  		},
    45  		{
    46  			name: "POM properties have explicit group ID without . in it",
    47  			pkg: pkg.Package{
    48  				Name:     "example-java-app-maven",
    49  				Version:  "0.1.0",
    50  				Language: pkg.Java,
    51  				Type:     pkg.JavaPkg,
    52  				Metadata: pkg.JavaArchive{
    53  					VirtualPath: "test-fixtures/java-builds/packages/example-java-app-maven-0.1.0.jar",
    54  					Manifest: &pkg.JavaManifest{
    55  						Main: []pkg.KeyValue{
    56  							{
    57  								Key:   "Manifest-Version",
    58  								Value: "1.0",
    59  							},
    60  						},
    61  					},
    62  					PomProperties: &pkg.JavaPomProperties{
    63  						Path:       "META-INF/maven/org.anchore/example-java-app-maven/pom.properties",
    64  						GroupID:    "commons",
    65  						ArtifactID: "example-java-app-maven",
    66  						Version:    "0.1.0",
    67  						Extra:      make(map[string]string),
    68  					},
    69  				},
    70  			},
    71  			expect: "pkg:maven/commons/example-java-app-maven@0.1.0",
    72  		},
    73  		{
    74  			name: "POM project has explicit group ID without . in it",
    75  			pkg: pkg.Package{
    76  				Name:     "example-java-app-maven",
    77  				Version:  "0.1.0",
    78  				Language: pkg.Java,
    79  				Type:     pkg.JavaPkg,
    80  				Metadata: pkg.JavaArchive{
    81  					VirtualPath: "test-fixtures/java-builds/packages/example-java-app-maven-0.1.0.jar",
    82  					Manifest: &pkg.JavaManifest{
    83  						Main: []pkg.KeyValue{
    84  							{
    85  								Key:   "Manifest-Version",
    86  								Value: "1.0",
    87  							},
    88  						},
    89  					},
    90  					PomProperties: &pkg.JavaPomProperties{
    91  						Path:       "META-INF/maven/org.anchore/example-java-app-maven/pom.properties",
    92  						ArtifactID: "example-java-app-maven",
    93  						Version:    "0.1.0",
    94  						Extra:      make(map[string]string),
    95  					},
    96  					PomProject: &pkg.JavaPomProject{
    97  						GroupID: "commons",
    98  					},
    99  				},
   100  			},
   101  			expect: "pkg:maven/commons/example-java-app-maven@0.1.0",
   102  		},
   103  		{
   104  			name: "POM project has explicit group ID without . in it",
   105  			pkg: pkg.Package{
   106  				Name:     "example-java-app-maven",
   107  				Version:  "0.1.0",
   108  				Language: pkg.Java,
   109  				Type:     pkg.JavaPkg,
   110  				Metadata: pkg.JavaArchive{
   111  					VirtualPath: "test-fixtures/java-builds/packages/example-java-app-maven-0.1.0.jar",
   112  					Manifest: &pkg.JavaManifest{
   113  						Main: []pkg.KeyValue{
   114  							{
   115  								Key:   "Manifest-Version",
   116  								Value: "1.0",
   117  							},
   118  						},
   119  					},
   120  					PomProperties: &pkg.JavaPomProperties{
   121  						Path:       "META-INF/maven/org.anchore/example-java-app-maven/pom.properties",
   122  						ArtifactID: "example-java-app-maven",
   123  						Version:    "0.1.0",
   124  						Extra:      make(map[string]string),
   125  					},
   126  					PomProject: &pkg.JavaPomProject{
   127  						Parent: &pkg.JavaPomParent{
   128  							GroupID: "parent",
   129  						},
   130  					},
   131  				},
   132  			},
   133  			expect: "pkg:maven/parent/example-java-app-maven@0.1.0",
   134  		},
   135  	}
   136  	for _, tt := range tests {
   137  		t.Run(tt.expect, func(t *testing.T) {
   138  			assert.Equal(t, tt.expect, packageURL(tt.pkg.Name, tt.pkg.Version, tt.pkg.Metadata.(pkg.JavaArchive)))
   139  		})
   140  	}
   141  }
   142  
   143  func Test_groupIDFromJavaMetadata(t *testing.T) {
   144  	tests := []struct {
   145  		name     string
   146  		pkgName  string
   147  		metadata pkg.JavaArchive
   148  		expect   string
   149  	}{
   150  		{
   151  			name: "pom properties",
   152  			metadata: pkg.JavaArchive{
   153  				PomProperties: &pkg.JavaPomProperties{
   154  					GroupID: "org.anchore",
   155  				},
   156  			},
   157  			expect: "org.anchore",
   158  		},
   159  		{
   160  			name: "pom project",
   161  			metadata: pkg.JavaArchive{
   162  				PomProject: &pkg.JavaPomProject{
   163  					GroupID: "org.anchore",
   164  				},
   165  			},
   166  			expect: "org.anchore",
   167  		},
   168  		{
   169  			name:     "known package list",
   170  			pkgName:  "ant-antlr",
   171  			metadata: pkg.JavaArchive{},
   172  			expect:   "org.apache.ant",
   173  		},
   174  		{
   175  			name: "java manifest",
   176  			metadata: pkg.JavaArchive{
   177  				Manifest: &pkg.JavaManifest{
   178  					Main: []pkg.KeyValue{
   179  						{
   180  							Key:   "Implementation-Vendor",
   181  							Value: "org.anchore",
   182  						},
   183  					},
   184  				},
   185  			},
   186  			expect: "org.anchore",
   187  		},
   188  		{
   189  			name:     "no group id",
   190  			metadata: pkg.JavaArchive{},
   191  			expect:   "",
   192  		},
   193  	}
   194  
   195  	for _, tt := range tests {
   196  		t.Run(tt.name, func(t *testing.T) {
   197  			assert.Equal(t, tt.expect, groupIDFromJavaMetadata(tt.pkgName, tt.metadata))
   198  		})
   199  	}
   200  }