mirror of
https://github.com/aquasecurity/trivy.git
synced 2026-02-02 06:43:13 +08:00
476 lines
12 KiB
Go
476 lines
12 KiB
Go
package pom
|
|
|
|
import (
|
|
"net/url"
|
|
"path/filepath"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func Test_ReadSettings(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
envs map[string]string
|
|
wantSettings settings
|
|
}{
|
|
{
|
|
name: "happy path with only global settings",
|
|
envs: map[string]string{
|
|
"HOME": "",
|
|
"MAVEN_HOME": filepath.Join("testdata", "settings", "global"),
|
|
},
|
|
wantSettings: settings{
|
|
LocalRepository: "testdata/repository",
|
|
Servers: []Server{
|
|
{
|
|
ID: "global-server",
|
|
},
|
|
{
|
|
ID: "server-with-credentials",
|
|
Username: "test-user",
|
|
Password: "test-password-from-global",
|
|
},
|
|
{
|
|
ID: "server-with-name-only",
|
|
Username: "test-user-only",
|
|
},
|
|
},
|
|
Profiles: []Profile{
|
|
{
|
|
ID: "mycompany-global",
|
|
Repositories: []pomRepository{
|
|
{
|
|
ID: "mycompany-internal-releases",
|
|
URL: "https://mycompany.example.com/repository/internal-releases",
|
|
ReleasesEnabled: "",
|
|
SnapshotsEnabled: "false",
|
|
},
|
|
{
|
|
ID: "mycompany-global-releases",
|
|
URL: "https://mycompany.example.com/repository/global-releases",
|
|
ReleasesEnabled: "true",
|
|
SnapshotsEnabled: "false",
|
|
},
|
|
},
|
|
ActiveByDefault: false,
|
|
},
|
|
{
|
|
ID: "default",
|
|
Repositories: []pomRepository{
|
|
{
|
|
ID: "mycompany-default-releases",
|
|
URL: "https://mycompany.example.com/repository/default-releases",
|
|
ReleasesEnabled: "true",
|
|
SnapshotsEnabled: "false",
|
|
},
|
|
},
|
|
ActiveByDefault: true,
|
|
},
|
|
},
|
|
ActiveProfiles: []string{},
|
|
},
|
|
},
|
|
{
|
|
name: "happy path with only user settings",
|
|
envs: map[string]string{
|
|
"HOME": filepath.Join("testdata", "settings", "user"),
|
|
"MAVEN_HOME": "NOT_EXISTING_PATH",
|
|
},
|
|
wantSettings: settings{
|
|
LocalRepository: "testdata/user/repository",
|
|
Servers: []Server{
|
|
{
|
|
ID: "user-server",
|
|
},
|
|
{
|
|
ID: "server-with-credentials",
|
|
Username: "test-user",
|
|
Password: "test-password",
|
|
},
|
|
{
|
|
ID: "server-with-name-only",
|
|
Username: "test-user-only",
|
|
},
|
|
},
|
|
Profiles: []Profile{
|
|
{
|
|
ID: "mycompany-global",
|
|
Repositories: []pomRepository{
|
|
{
|
|
ID: "mycompany-releases",
|
|
URL: "https://mycompany.example.com/repository/user-releases",
|
|
ReleasesEnabled: "true",
|
|
SnapshotsEnabled: "false",
|
|
},
|
|
{
|
|
ID: "mycompany-user-snapshots",
|
|
URL: "https://mycompany.example.com/repository/user-snapshots",
|
|
ReleasesEnabled: "false",
|
|
SnapshotsEnabled: "true",
|
|
},
|
|
},
|
|
ActiveByDefault: true,
|
|
},
|
|
},
|
|
ActiveProfiles: []string{
|
|
"mycompany-global",
|
|
},
|
|
},
|
|
},
|
|
{
|
|
// $ mvn help:effective-settings
|
|
// [INFO] ------------------< org.apache.maven:standalone-pom >-------------------
|
|
// [INFO] --- maven-help-plugin:3.4.0:effective-settings (default-cli) @ standalone-pom ---
|
|
// Effective user-specific configuration settings:
|
|
//
|
|
// <?xml version="1.0" encoding="UTF-8"?>
|
|
// <settings xmlns="http://maven.apache.org/SETTINGS/1.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.1.0 http://maven.apache.org/xsd/settings-1.1.0.xsd">
|
|
// <localRepository>/root/testdata/user/repository</localRepository>
|
|
// <servers>
|
|
// <server>
|
|
// <id>user-server</id>
|
|
// </server>
|
|
// <server>
|
|
// <username>test-user</username>
|
|
// <password>***</password>
|
|
// <id>server-with-credentials</id>
|
|
// </server>
|
|
// <server>
|
|
// <username>test-user-only</username>
|
|
// <id>server-with-name-only</id>
|
|
// </server>
|
|
// <server>
|
|
// <id>global-server</id>
|
|
// </server>
|
|
// </servers>
|
|
// <profiles>
|
|
// <profile>
|
|
// <activation>
|
|
// <activeByDefault>true</activeByDefault>
|
|
// </activation>
|
|
// <repositories>
|
|
// <repository>
|
|
// <releases>
|
|
// <checksumPolicy>fail</checksumPolicy>
|
|
// </releases>
|
|
// <snapshots>
|
|
// <enabled>false</enabled>
|
|
// </snapshots>
|
|
// <id>mycompany-releases</id>
|
|
// <url>https://mycompany.example.com/repository/user-releases</url>
|
|
// </repository>
|
|
// <repository>
|
|
// <releases>
|
|
// <enabled>false</enabled>
|
|
// </releases>
|
|
// <snapshots />
|
|
// <id>mycompany-user-snapshots</id>
|
|
// <url>https://mycompany.example.com/repository/user-snapshots</url>
|
|
// </repository>
|
|
// </repositories>
|
|
// <id>mycompany-global</id>
|
|
// </profile>
|
|
// <profile>
|
|
// <activation>
|
|
// <activeByDefault>true</activeByDefault>
|
|
// </activation>
|
|
// <repositories>
|
|
// <repository>
|
|
// <releases />
|
|
// <snapshots>
|
|
// <enabled>false</enabled>
|
|
// </snapshots>
|
|
// <id>mycompany-default-releases</id>
|
|
// <url>https://mycompany.example.com/repository/default-releases</url>
|
|
// </repository>
|
|
// </repositories>
|
|
// </profile>
|
|
// </profiles>
|
|
// <activeProfiles>
|
|
// <activeProfile>mycompany-global</activeProfile>
|
|
// </activeProfiles>
|
|
// </settings>
|
|
name: "happy path with global and user settings",
|
|
envs: map[string]string{
|
|
"HOME": filepath.Join("testdata", "settings", "user"),
|
|
"MAVEN_HOME": filepath.Join("testdata", "settings", "global"),
|
|
},
|
|
wantSettings: settings{
|
|
LocalRepository: "testdata/user/repository",
|
|
Servers: []Server{
|
|
{
|
|
ID: "user-server",
|
|
},
|
|
{
|
|
ID: "server-with-credentials",
|
|
Username: "test-user",
|
|
Password: "test-password",
|
|
},
|
|
{
|
|
ID: "server-with-name-only",
|
|
Username: "test-user-only",
|
|
},
|
|
{
|
|
ID: "global-server",
|
|
},
|
|
},
|
|
Profiles: []Profile{
|
|
{
|
|
ID: "mycompany-global",
|
|
Repositories: []pomRepository{
|
|
{
|
|
ID: "mycompany-releases",
|
|
URL: "https://mycompany.example.com/repository/user-releases",
|
|
ReleasesEnabled: "true",
|
|
SnapshotsEnabled: "false",
|
|
},
|
|
{
|
|
ID: "mycompany-user-snapshots",
|
|
URL: "https://mycompany.example.com/repository/user-snapshots",
|
|
ReleasesEnabled: "false",
|
|
SnapshotsEnabled: "true",
|
|
},
|
|
},
|
|
ActiveByDefault: true,
|
|
},
|
|
{
|
|
ID: "default",
|
|
Repositories: []pomRepository{
|
|
{
|
|
ID: "mycompany-default-releases",
|
|
URL: "https://mycompany.example.com/repository/default-releases",
|
|
ReleasesEnabled: "true",
|
|
SnapshotsEnabled: "false",
|
|
},
|
|
},
|
|
ActiveByDefault: true,
|
|
},
|
|
},
|
|
ActiveProfiles: []string{
|
|
"mycompany-global",
|
|
},
|
|
},
|
|
},
|
|
{
|
|
name: "without settings",
|
|
envs: map[string]string{
|
|
"HOME": "",
|
|
"MAVEN_HOME": "NOT_EXISTING_PATH",
|
|
},
|
|
wantSettings: settings{},
|
|
},
|
|
{
|
|
name: "environment placeholders are dereferenced",
|
|
envs: map[string]string{
|
|
"HOME": filepath.Join("testdata", "settings", "user-settings-with-env-placeholders"),
|
|
"MAVEN_HOME": "NOT_EXISTING_PATH",
|
|
"LOCAL_REPO_PT_1": "part1",
|
|
"LOCAL_REPO_PT_2": "part2",
|
|
"SERVER_ID": "server-id-from-env",
|
|
"USERNAME": "username-from-env",
|
|
"PASSWORD": "password-from-env",
|
|
"PROFILE_ID": "mycompany-global",
|
|
"REPO_ID": "mycompany-releases",
|
|
"REPO_URL": "https://mycompany.example.com",
|
|
},
|
|
wantSettings: settings{
|
|
LocalRepository: "part1/part2/.m2/repository",
|
|
Servers: []Server{
|
|
{
|
|
ID: "user-server",
|
|
},
|
|
{
|
|
ID: "server-id-from-env",
|
|
Username: "username-from-env",
|
|
Password: "password-from-env",
|
|
},
|
|
{
|
|
ID: "server-with-name-only",
|
|
Username: "test-user-only",
|
|
},
|
|
},
|
|
Profiles: []Profile{
|
|
{
|
|
ID: "mycompany-global",
|
|
Repositories: []pomRepository{
|
|
{
|
|
ID: "mycompany-releases",
|
|
URL: "https://mycompany.example.com/repository/user-releases",
|
|
ReleasesEnabled: "true",
|
|
SnapshotsEnabled: "false",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
ActiveProfiles: []string{
|
|
"mycompany-global",
|
|
},
|
|
},
|
|
},
|
|
}
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
for env, settingsDir := range tt.envs {
|
|
t.Setenv(env, settingsDir)
|
|
}
|
|
|
|
gotSettings := readSettings()
|
|
require.Equal(t, tt.wantSettings, gotSettings)
|
|
})
|
|
}
|
|
}
|
|
|
|
func Test_effectiveRepositories(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
s settings
|
|
want []repository
|
|
}{
|
|
{
|
|
name: "single active profile, reversed order",
|
|
s: settings{
|
|
Servers: []Server{
|
|
{
|
|
ID: "r1",
|
|
Username: "u",
|
|
Password: "p",
|
|
},
|
|
},
|
|
Profiles: []Profile{
|
|
{
|
|
ID: "p1",
|
|
Repositories: []pomRepository{
|
|
{
|
|
ID: "r1",
|
|
URL: "https://example.com/repo1",
|
|
// ReleasesEnabled: "true", Release field is not explicitly set.
|
|
SnapshotsEnabled: "false",
|
|
},
|
|
{
|
|
ID: "r2",
|
|
URL: "https://example.com/repo2",
|
|
ReleasesEnabled: "invalid", // invalid value treated as false
|
|
// SnapshotsEnabled: "true", Snapshot field is not explicitly set.
|
|
},
|
|
},
|
|
},
|
|
},
|
|
ActiveProfiles: []string{"p1"},
|
|
},
|
|
want: []repository{
|
|
{
|
|
url: mustParseURL(t, "https://example.com/repo2"),
|
|
releaseEnabled: false,
|
|
snapshotEnabled: true,
|
|
},
|
|
{
|
|
url: mustParseURL(t, "https://u:p@example.com/repo1"),
|
|
releaseEnabled: true,
|
|
snapshotEnabled: false,
|
|
},
|
|
},
|
|
},
|
|
{
|
|
name: "activeByDefault + activeProfiles with dedup and reverse",
|
|
s: settings{
|
|
Servers: nil,
|
|
Profiles: []Profile{
|
|
{
|
|
ID: "p1",
|
|
ActiveByDefault: true,
|
|
Repositories: []pomRepository{
|
|
{
|
|
ID: "dup",
|
|
URL: "https://p1.example.com/dup",
|
|
ReleasesEnabled: "true",
|
|
SnapshotsEnabled: "false",
|
|
},
|
|
{
|
|
ID: "only-p1",
|
|
URL: "https://p1.example.com/only",
|
|
ReleasesEnabled: "true",
|
|
SnapshotsEnabled: "true",
|
|
},
|
|
},
|
|
},
|
|
{
|
|
ID: "p2",
|
|
Repositories: []pomRepository{
|
|
{
|
|
ID: "dup",
|
|
URL: "https://p2.example.com/dup",
|
|
ReleasesEnabled: "true",
|
|
SnapshotsEnabled: "true",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
ActiveProfiles: []string{"p2"},
|
|
},
|
|
// Expected order after dedup (keep first occurrence from p1) and reverse:
|
|
// Input order before reverse: [dup(from p1), only-p1, dup(from p2 - removed by dedup)]
|
|
// After reverse: [only-p1, dup(from p1)]
|
|
want: []repository{
|
|
{
|
|
url: mustParseURL(t, "https://p1.example.com/only"),
|
|
releaseEnabled: true,
|
|
snapshotEnabled: true,
|
|
},
|
|
{
|
|
url: mustParseURL(t, "https://p1.example.com/dup"),
|
|
releaseEnabled: true,
|
|
snapshotEnabled: false,
|
|
},
|
|
},
|
|
},
|
|
{
|
|
name: "disabled repositories are ignored",
|
|
s: settings{
|
|
Profiles: []Profile{
|
|
{
|
|
ID: "p",
|
|
ActiveByDefault: true,
|
|
Repositories: []pomRepository{
|
|
{
|
|
ID: "disabled",
|
|
URL: "https://example.com/disabled",
|
|
ReleasesEnabled: "false",
|
|
SnapshotsEnabled: "false",
|
|
},
|
|
{
|
|
ID: "enabled",
|
|
URL: "https://example.com/enabled",
|
|
ReleasesEnabled: "true",
|
|
SnapshotsEnabled: "false",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
want: []repository{
|
|
{
|
|
url: mustParseURL(t, "https://example.com/enabled"),
|
|
releaseEnabled: true,
|
|
snapshotEnabled: false,
|
|
},
|
|
},
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
got := tt.s.effectiveRepositories()
|
|
require.Equal(t, tt.want, got)
|
|
})
|
|
}
|
|
}
|
|
|
|
// mustParseURL parses a URL and panics on error; handy for test literals
|
|
func mustParseURL(t *testing.T, s string) url.URL {
|
|
t.Helper()
|
|
u, err := url.Parse(s)
|
|
require.NoError(t, err)
|
|
return *u
|
|
}
|