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