github.com/anchore/syft@v1.38.2/syft/pkg/cataloger/java/cataloger_test.go (about)

     1  package java
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/anchore/syft/syft/cataloging"
     7  	"github.com/anchore/syft/syft/cpe"
     8  	"github.com/anchore/syft/syft/file"
     9  	"github.com/anchore/syft/syft/pkg"
    10  	"github.com/anchore/syft/syft/pkg/cataloger/internal/pkgtest"
    11  )
    12  
    13  func Test_ArchiveCataloger_Globs(t *testing.T) {
    14  	tests := []struct {
    15  		name     string
    16  		fixture  string
    17  		expected []string
    18  	}{
    19  		{
    20  			name:    "obtain java archive files",
    21  			fixture: "test-fixtures/glob-paths",
    22  			expected: []string{
    23  				"java-archives/example.jar",
    24  				"java-archives/example.war",
    25  				"java-archives/example.ear",
    26  				"java-archives/example.par",
    27  				"java-archives/example.sar",
    28  				"java-archives/example.nar",
    29  				"java-archives/example.kar",
    30  				"java-archives/example.jpi",
    31  				"java-archives/example.hpi",
    32  				"java-archives/example.far",
    33  				"java-archives/example.lpkg",
    34  				"java-archives/example.rar",
    35  				"archives/example.zip",
    36  				"archives/example.tar",
    37  				"archives/example.tar.gz",
    38  				"archives/example.tgz",
    39  				"archives/example.tar.bz",
    40  				"archives/example.tar.bz2",
    41  				"archives/example.tbz",
    42  				"archives/example.tbz2",
    43  				"archives/example.tar.br",
    44  				"archives/example.tbr",
    45  				"archives/example.tar.lz4",
    46  				"archives/example.tlz4",
    47  				"archives/example.tar.sz",
    48  				"archives/example.tsz",
    49  				"archives/example.tar.xz",
    50  				"archives/example.txz",
    51  				"archives/example.tar.zst",
    52  				"archives/example.tzst",
    53  				"archives/example.tar.zstd",
    54  				"archives/example.tzstd",
    55  			},
    56  		},
    57  	}
    58  
    59  	for _, test := range tests {
    60  		t.Run(test.name, func(t *testing.T) {
    61  			pkgtest.NewCatalogTester().
    62  				FromDirectory(t, test.fixture).
    63  				ExpectsResolverContentQueries(test.expected).
    64  				TestCataloger(t,
    65  					NewArchiveCataloger(
    66  						ArchiveCatalogerConfig{
    67  							ArchiveSearchConfig: cataloging.ArchiveSearchConfig{
    68  								IncludeIndexedArchives:   true,
    69  								IncludeUnindexedArchives: true,
    70  							},
    71  						},
    72  					),
    73  				)
    74  		})
    75  	}
    76  }
    77  
    78  func Test_POMCataloger_Globs(t *testing.T) {
    79  	tests := []struct {
    80  		name     string
    81  		fixture  string
    82  		expected []string
    83  	}{
    84  		{
    85  			name:    "obtain java pom files",
    86  			fixture: "test-fixtures/glob-paths",
    87  			expected: []string{
    88  				"src/pom.xml",
    89  			},
    90  		},
    91  	}
    92  
    93  	for _, test := range tests {
    94  		t.Run(test.name, func(t *testing.T) {
    95  			pkgtest.NewCatalogTester().
    96  				FromDirectory(t, test.fixture).
    97  				ExpectsResolverContentQueries(test.expected).
    98  				TestCataloger(t,
    99  					NewPomCataloger(
   100  						ArchiveCatalogerConfig{
   101  							ArchiveSearchConfig: cataloging.ArchiveSearchConfig{
   102  								IncludeIndexedArchives:   true,
   103  								IncludeUnindexedArchives: true,
   104  							},
   105  						},
   106  					))
   107  		})
   108  	}
   109  }
   110  
   111  func TestJvmDistributionCataloger(t *testing.T) {
   112  
   113  	cases := []struct {
   114  		name     string
   115  		fixture  string
   116  		expected pkg.Package
   117  	}{
   118  		{
   119  			name:    "valid 1.8.0",
   120  			fixture: "test-fixtures/jvm-installs/oracle-jdk-se-8",
   121  			expected: pkg.Package{
   122  				Name:      "jdk",
   123  				Version:   "1.8.0_411-b25",
   124  				FoundBy:   "java-jvm-cataloger",
   125  				Locations: file.NewLocationSet(file.NewLocation("usr/lib/jvm/jdk-1.8-oracle-x64/release")),
   126  				Licenses:  pkg.NewLicenseSet(),
   127  				Type:      pkg.BinaryPkg,
   128  				CPEs: []cpe.CPE{
   129  					cpe.Must("cpe:2.3:a:oracle:java_se:1.8.0:update411:*:*:*:*:*:*", cpe.DeclaredSource),
   130  					cpe.Must("cpe:2.3:a:oracle:jre:1.8.0:update411:*:*:*:*:*:*", cpe.DeclaredSource),
   131  					cpe.Must("cpe:2.3:a:oracle:jdk:1.8.0:update411:*:*:*:*:*:*", cpe.DeclaredSource),
   132  				},
   133  				PURL: "pkg:generic/oracle/jdk@1.8.0_411-b25",
   134  				Metadata: pkg.JavaVMInstallation{
   135  					Release: pkg.JavaVMRelease{
   136  						JavaRuntimeVersion: "1.8.0_411-b25",
   137  						JavaVersion:        "1.8.0_411",
   138  						OsArch:             "amd64",
   139  						OsName:             "Linux",
   140  						OsVersion:          "2.6",
   141  						Source:             ".:git:71ec2089cf8c+",
   142  						BuildType:          "commercial",
   143  					},
   144  					Files: []string{
   145  						"usr/lib/jvm/jdk-1.8-oracle-x64/bin/javac",
   146  						"usr/lib/jvm/jdk-1.8-oracle-x64/release",
   147  					},
   148  				},
   149  			},
   150  		},
   151  		{
   152  			name:    "valid post-jep223",
   153  			fixture: "test-fixtures/jvm-installs/valid-post-jep223",
   154  			expected: pkg.Package{
   155  				Name:      "openjdk",
   156  				Version:   "21.0.4+7-LTS",
   157  				FoundBy:   "java-jvm-cataloger",
   158  				Locations: file.NewLocationSet(file.NewLocation("jvm/openjdk/release")),
   159  				Licenses:  pkg.NewLicenseSet(),
   160  				Type:      pkg.BinaryPkg,
   161  				CPEs:      []cpe.CPE{cpe.Must("cpe:2.3:a:oracle:openjdk:21.0.4:*:*:*:*:*:*:*", cpe.DeclaredSource)},
   162  				PURL:      "pkg:generic/oracle/openjdk@21.0.4%2B7-LTS?repository_url=https%3A%2F%2Fgithub.com%2Fadoptium%2Fjdk21u.git",
   163  				Metadata: pkg.JavaVMInstallation{
   164  					Release: pkg.JavaVMRelease{
   165  						Implementor:        "Eclipse Adoptium",
   166  						ImplementorVersion: "Temurin-21.0.4+7",
   167  						JavaRuntimeVersion: "21.0.4+7-LTS",
   168  						JavaVersion:        "21.0.4",
   169  						JavaVersionDate:    "2024-07-16",
   170  						Libc:               "gnu",
   171  						Modules: []string{
   172  							"java.base", "java.compiler", "java.datatransfer", "java.xml", "java.prefs",
   173  							"java.desktop", "java.instrument", "java.logging", "java.management",
   174  							"java.security.sasl", "java.naming", "java.rmi", "java.management.rmi",
   175  							"java.net.http", "java.scripting", "java.security.jgss",
   176  							"java.transaction.xa", "java.sql", "java.sql.rowset", "java.xml.crypto", "java.se",
   177  							"java.smartcardio", "jdk.accessibility", "jdk.internal.jvmstat", "jdk.attach",
   178  							"jdk.charsets", "jdk.internal.opt", "jdk.zipfs", "jdk.compiler", "jdk.crypto.ec",
   179  							"jdk.crypto.cryptoki", "jdk.dynalink", "jdk.internal.ed", "jdk.editpad", "jdk.hotspot.agent",
   180  							"jdk.httpserver", "jdk.incubator.vector", "jdk.internal.le", "jdk.internal.vm.ci",
   181  							"jdk.internal.vm.compiler", "jdk.internal.vm.compiler.management", "jdk.jartool",
   182  							"jdk.javadoc", "jdk.jcmd", "jdk.management", "jdk.management.agent", "jdk.jconsole",
   183  							"jdk.jdeps", "jdk.jdwp.agent", "jdk.jdi", "jdk.jfr", "jdk.jlink", "jdk.jpackage", "jdk.jshell",
   184  							"jdk.jsobject", "jdk.jstatd", "jdk.localedata", "jdk.management.jfr", "jdk.naming.dns",
   185  							"jdk.naming.rmi", "jdk.net", "jdk.nio.mapmode", "jdk.random", "jdk.sctp", "jdk.security.auth",
   186  							"jdk.security.jgss", "jdk.unsupported", "jdk.unsupported.desktop", "jdk.xml.dom",
   187  						},
   188  						OsArch:          "aarch64",
   189  						OsName:          "Linux",
   190  						Source:          ".:git:13710926b798",
   191  						BuildSource:     "git:1271f10a26c47e1489a814dd2731f936a588d621",
   192  						BuildSourceRepo: "https://github.com/adoptium/temurin-build.git",
   193  						SourceRepo:      "https://github.com/adoptium/jdk21u.git",
   194  						FullVersion:     "21.0.4+7-LTS",
   195  						SemanticVersion: "21.0.4+7",
   196  						BuildInfo:       "OS: Linux Version: 5.4.0-150-generic",
   197  						JvmVariant:      "Hotspot",
   198  						JvmVersion:      "21.0.4+7-LTS",
   199  						ImageType:       "JDK",
   200  					},
   201  					Files: []string{
   202  						"jvm/openjdk/release",
   203  						"jvm/openjdk/sibling/child/file1.txt",
   204  					},
   205  				},
   206  			},
   207  		},
   208  	}
   209  
   210  	for _, tt := range cases {
   211  		t.Run(tt.name, func(t *testing.T) {
   212  			p := tt.expected
   213  			p.SetID()
   214  
   215  			pkgtest.TestCataloger(t, tt.fixture, NewJvmDistributionCataloger(), []pkg.Package{p}, nil)
   216  		})
   217  	}
   218  
   219  }
   220  
   221  func TestJvmDistributionCatalogerFromFile(t *testing.T) {
   222  
   223  	cases := []struct {
   224  		name     string
   225  		fixture  string
   226  		expected pkg.Package
   227  	}{
   228  		{
   229  			name:    "valid 1.8.0",
   230  			fixture: "test-fixtures/jvm-installs/oracle-jdk-se-8/usr/lib/jvm/jdk-1.8-oracle-x64/release",
   231  			expected: pkg.Package{
   232  				Name:      "jdk",
   233  				Version:   "1.8.0_411-b25",
   234  				FoundBy:   "java-jvm-cataloger",
   235  				Locations: file.NewLocationSet(file.NewLocation("/release")),
   236  				Licenses:  pkg.NewLicenseSet(),
   237  				Type:      pkg.BinaryPkg,
   238  				CPEs: []cpe.CPE{
   239  					cpe.Must("cpe:2.3:a:oracle:java_se:1.8.0:update411:*:*:*:*:*:*", cpe.DeclaredSource),
   240  					cpe.Must("cpe:2.3:a:oracle:jre:1.8.0:update411:*:*:*:*:*:*", cpe.DeclaredSource),
   241  					cpe.Must("cpe:2.3:a:oracle:jdk:1.8.0:update411:*:*:*:*:*:*", cpe.DeclaredSource),
   242  				},
   243  				PURL: "pkg:generic/oracle/jdk@1.8.0_411-b25",
   244  				Metadata: pkg.JavaVMInstallation{
   245  					Release: pkg.JavaVMRelease{
   246  						JavaRuntimeVersion: "1.8.0_411-b25",
   247  						JavaVersion:        "1.8.0_411",
   248  						OsArch:             "amd64",
   249  						OsName:             "Linux",
   250  						OsVersion:          "2.6",
   251  						Source:             ".:git:71ec2089cf8c+",
   252  						BuildType:          "commercial",
   253  					},
   254  					Files: []string{
   255  						"/release",
   256  					},
   257  				},
   258  			},
   259  		},
   260  		{
   261  			name:    "valid post-jep223",
   262  			fixture: "test-fixtures/jvm-installs/valid-post-jep223/jvm/openjdk/release",
   263  			expected: pkg.Package{
   264  				Name:      "openjdk",
   265  				Version:   "21.0.4+7-LTS",
   266  				FoundBy:   "java-jvm-cataloger",
   267  				Locations: file.NewLocationSet(file.NewLocation("/release")),
   268  				Licenses:  pkg.NewLicenseSet(),
   269  				Type:      pkg.BinaryPkg,
   270  				CPEs:      []cpe.CPE{cpe.Must("cpe:2.3:a:oracle:openjdk:21.0.4:*:*:*:*:*:*:*", cpe.DeclaredSource)},
   271  				PURL:      "pkg:generic/oracle/openjdk@21.0.4%2B7-LTS?repository_url=https%3A%2F%2Fgithub.com%2Fadoptium%2Fjdk21u.git",
   272  				Metadata: pkg.JavaVMInstallation{
   273  					Release: pkg.JavaVMRelease{
   274  						Implementor:        "Eclipse Adoptium",
   275  						ImplementorVersion: "Temurin-21.0.4+7",
   276  						JavaRuntimeVersion: "21.0.4+7-LTS",
   277  						JavaVersion:        "21.0.4",
   278  						JavaVersionDate:    "2024-07-16",
   279  						Libc:               "gnu",
   280  						Modules: []string{
   281  							"java.base", "java.compiler", "java.datatransfer", "java.xml", "java.prefs",
   282  							"java.desktop", "java.instrument", "java.logging", "java.management",
   283  							"java.security.sasl", "java.naming", "java.rmi", "java.management.rmi",
   284  							"java.net.http", "java.scripting", "java.security.jgss",
   285  							"java.transaction.xa", "java.sql", "java.sql.rowset", "java.xml.crypto", "java.se",
   286  							"java.smartcardio", "jdk.accessibility", "jdk.internal.jvmstat", "jdk.attach",
   287  							"jdk.charsets", "jdk.internal.opt", "jdk.zipfs", "jdk.compiler", "jdk.crypto.ec",
   288  							"jdk.crypto.cryptoki", "jdk.dynalink", "jdk.internal.ed", "jdk.editpad", "jdk.hotspot.agent",
   289  							"jdk.httpserver", "jdk.incubator.vector", "jdk.internal.le", "jdk.internal.vm.ci",
   290  							"jdk.internal.vm.compiler", "jdk.internal.vm.compiler.management", "jdk.jartool",
   291  							"jdk.javadoc", "jdk.jcmd", "jdk.management", "jdk.management.agent", "jdk.jconsole",
   292  							"jdk.jdeps", "jdk.jdwp.agent", "jdk.jdi", "jdk.jfr", "jdk.jlink", "jdk.jpackage", "jdk.jshell",
   293  							"jdk.jsobject", "jdk.jstatd", "jdk.localedata", "jdk.management.jfr", "jdk.naming.dns",
   294  							"jdk.naming.rmi", "jdk.net", "jdk.nio.mapmode", "jdk.random", "jdk.sctp", "jdk.security.auth",
   295  							"jdk.security.jgss", "jdk.unsupported", "jdk.unsupported.desktop", "jdk.xml.dom",
   296  						},
   297  						OsArch:          "aarch64",
   298  						OsName:          "Linux",
   299  						Source:          ".:git:13710926b798",
   300  						BuildSource:     "git:1271f10a26c47e1489a814dd2731f936a588d621",
   301  						BuildSourceRepo: "https://github.com/adoptium/temurin-build.git",
   302  						SourceRepo:      "https://github.com/adoptium/jdk21u.git",
   303  						FullVersion:     "21.0.4+7-LTS",
   304  						SemanticVersion: "21.0.4+7",
   305  						BuildInfo:       "OS: Linux Version: 5.4.0-150-generic",
   306  						JvmVariant:      "Hotspot",
   307  						JvmVersion:      "21.0.4+7-LTS",
   308  						ImageType:       "JDK",
   309  					},
   310  					Files: []string{
   311  						"/release",
   312  					},
   313  				},
   314  			},
   315  		},
   316  	}
   317  
   318  	for _, tt := range cases {
   319  		t.Run(tt.name, func(t *testing.T) {
   320  			p := tt.expected
   321  			p.SetID()
   322  
   323  			pkgtest.TestCatalogerFromFileSource(t, tt.fixture, NewJvmDistributionCataloger(), []pkg.Package{p}, nil)
   324  		})
   325  	}
   326  
   327  }