From f95638fd04d47ba90ba474e3ff6f6dc7b8e386e3 Mon Sep 17 00:00:00 2001 From: osaidw Date: Mon, 17 Nov 2025 11:05:55 +0200 Subject: [PATCH 1/2] Run evidence e2e tests from jfrog-cli --- .github/workflows/evidenceTests.yml | 45 ++++++ evidence_test.go | 242 ++++++++++++++++++++++++++++ go.mod | 3 +- go.sum | 4 +- main_test.go | 6 + utils/tests/utils.go | 2 + 6 files changed, 298 insertions(+), 4 deletions(-) create mode 100644 .github/workflows/evidenceTests.yml create mode 100644 evidence_test.go diff --git a/.github/workflows/evidenceTests.yml b/.github/workflows/evidenceTests.yml new file mode 100644 index 000000000..98776ba35 --- /dev/null +++ b/.github/workflows/evidenceTests.yml @@ -0,0 +1,45 @@ +name: Evidence Tests +on: + workflow_dispatch: + push: + branches: + - "master" + # Triggers the workflow on PRs to master branch only. + pull_request_target: + types: [labeled] + branches: + - "master" + +# Ensures that only the latest commit is running for each PR at a time. +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }}-${{ github.ref }} + cancel-in-progress: true +jobs: + Evidence-Tests: + name: Evidence tests (${{ matrix.os }}) + if: github.event_name == 'workflow_dispatch' || github.event_name == 'push' || contains(github.event.pull_request.labels.*.name, 'safe to test') + strategy: + fail-fast: false + matrix: + os: [ubuntu, windows, macos] + runs-on: ${{ matrix.os }}-latest + steps: + - name: Checkout code + uses: actions/checkout@v5 + with: + ref: ${{ github.event.pull_request.head.sha || github.ref }} + + - name: Setup Go with cache + uses: jfrog/.github/actions/install-go-with-cache@main + + - name: Setup JFrog CLI + uses: jfrog/setup-jfrog-cli@v4 + with: + version: latest + env: + JF_URL: ${{ secrets.PLATFORM_URL }} + JF_ACCESS_TOKEN: ${{ secrets.PLATFORM_ADMIN_TOKEN }} + + - name: Run Evidence tests + run: go test -v github.com/jfrog/jfrog-cli --timeout 0 --test.evidence --jfrog.url=${{ secrets.PLATFORM_URL }} --jfrog.adminToken=${{ secrets.PLATFORM_ADMIN_TOKEN }} --jfrog.evidenceToken=${{ secrets.EVIDENCE_USER_TOKEN }} --jfrog.projectKey=${{ secrets.EVIDENCE_PROJECT_KEY }} --jfrog.projectToken=${{ secrets.EVIDENCE_PROJECT_TOKEN }} --ci.runId=${{ runner.os }}-evidence + diff --git a/evidence_test.go b/evidence_test.go new file mode 100644 index 000000000..b36619246 --- /dev/null +++ b/evidence_test.go @@ -0,0 +1,242 @@ +package main + +import ( + "flag" + "fmt" + "testing" + + "github.com/jfrog/jfrog-cli-core/v2/artifactory/utils" + "github.com/jfrog/jfrog-cli-core/v2/utils/config" + coreTests "github.com/jfrog/jfrog-cli-core/v2/utils/tests" + e2e "github.com/jfrog/jfrog-cli-evidence/tests/e2e" + evidenceTests "github.com/jfrog/jfrog-cli-evidence/tests/e2e/tests" + "github.com/jfrog/jfrog-cli/utils/tests" + "github.com/jfrog/jfrog-client-go/access" + "github.com/jfrog/jfrog-client-go/artifactory" + "github.com/jfrog/jfrog-client-go/lifecycle" + clientutils "github.com/jfrog/jfrog-client-go/utils" +) + +// Evidence-specific test flags +var ( + evidenceAccessToken = flag.String("jfrog.evidenceToken", "", "JFrog Evidence service access token") + evidenceProjectKey = flag.String("jfrog.projectKey", "", "JFrog project key for Evidence project-based tests") + evidenceProjectToken = flag.String("jfrog.projectToken", "", "JFrog project-scoped access token for Evidence tests") +) + +var ( + evidenceUserCli *coreTests.JfrogCli + evidenceAdminCli *coreTests.JfrogCli + evidenceProjectCli *coreTests.JfrogCli + evidenceDetails *config.ServerDetails + artifactoryDetails *config.ServerDetails + artifactoryManager artifactory.ArtifactoryServicesManager + accessManager *access.AccessServicesManager + lifecycleManager *lifecycle.LifecycleServicesManager +) + +// TestEvidence runs all Evidence E2E tests using the main runner +func TestEvidence(t *testing.T) { + initEvidenceTest(t) + + runner := evidenceTests.NewEvidenceE2ETestsRunner( + evidenceUserCli, + evidenceAdminCli, + evidenceProjectCli, + artifactoryManager, + accessManager, + lifecycleManager, + ) + + t.Log("=== Setting up shared E2E test data ===") + err := runner.PrepareTestsData() + if err != nil { + t.Errorf("Failed to prepare evidence E2E test data: %v", err) + } + + // Register cleanup to run after all tests (even if tests fail) + t.Cleanup(func() { + t.Log("=== Running cleanup for shared evidence E2E test data ===") + runner.CleanupTestsData() + }) + + // Run all E2E tests using the main runner + runner.RunEvidenceCliTests(t) +} + +// initEvidenceTest initializes evidence tests +func initEvidenceTest(t *testing.T) { + if !*tests.TestEvidence { + t.Skip("Skipping evidence test. To run evidence test add the '-test.evidence=true' option.") + } + + // Verify we have required tokens + if *tests.JfrogAccessToken == "" { + t.Error("Evidence tests require --jfrog.adminToken flag") + } + if *evidenceAccessToken == "" { + t.Error("Evidence tests require --jfrog.evidenceToken flag") + } +} + +// InitEvidenceTests initializes the evidence CLI and server details +func InitEvidenceTests() { + initArtifactoryCli() + initEvidenceUserCli() + initEvidenceAdminCli() + initEvidenceProjectCli() + configureEvidenceServer() + configureEvidenceArtifactory() + initArtifactoryClient() + initAccessClient() + initLifecycleClient() +} + +// initEvidenceUserCli initializes the Evidence CLI with user/evidence token +func initEvidenceUserCli() { + if evidenceUserCli != nil { + return + } + + // Build authentication flags for user CLI + authFlags := fmt.Sprintf("--url=%s --access-token=%s", *tests.JfrogUrl, *evidenceAccessToken) + evidenceUserCli = coreTests.NewJfrogCli(execMain, "jfrog evd", authFlags) + + fmt.Printf("✓ Evidence User CLI initialized with URL: %s\n", *tests.JfrogUrl) +} + +// initEvidenceAdminCli initializes the Evidence CLI with admin token +func initEvidenceAdminCli() { + if evidenceAdminCli != nil { + return + } + + // Build authentication flags for admin CLI + authFlags := fmt.Sprintf("--url=%s --access-token=%s", *tests.JfrogUrl, *tests.JfrogAccessToken) + evidenceAdminCli = coreTests.NewJfrogCli(execMain, "jfrog evd", authFlags) + + fmt.Printf("✓ Evidence Admin CLI initialized with URL: %s\n", *tests.JfrogUrl) +} + +// initEvidenceProjectCli initializes the Evidence CLI with project-scoped token (if available) +func initEvidenceProjectCli() { + // Check if project token and key are provided + if evidenceProjectToken == nil || *evidenceProjectToken == "" { + fmt.Printf("Project token not provided - project-based tests will be skipped\n") + return + } + if evidenceProjectKey == nil || *evidenceProjectKey == "" { + fmt.Printf("Project key not provided - project-based tests will be skipped\n") + return + } + + // Set the global e2e.ProjectKey so tests can use it + e2e.ProjectKey = *evidenceProjectKey + + // Build authentication flags for project CLI + authFlags := fmt.Sprintf("--url=%s --access-token=%s --project=%s", + *tests.JfrogUrl, *evidenceProjectToken, *evidenceProjectKey) + evidenceProjectCli = coreTests.NewJfrogCli(execMain, "jfrog evd", authFlags) + + fmt.Printf("✓ Evidence Project CLI initialized with URL: %s (project: %s)\n", + *tests.JfrogUrl, *evidenceProjectKey) +} + +// configureEvidenceServer sets up server details for Evidence service +func configureEvidenceServer() { + if evidenceDetails != nil { + return + } + + evidenceDetails = &config.ServerDetails{ + Url: *tests.JfrogUrl, + AccessToken: *evidenceAccessToken, + } + + fmt.Printf("Evidence service configured for: %s\n", *tests.JfrogUrl) +} + +// configureEvidenceArtifactory sets up Artifactory details for Evidence tests +func configureEvidenceArtifactory() { + if artifactoryDetails != nil { + return + } + + artifactoryUrl := clientutils.AddTrailingSlashIfNeeded(*tests.JfrogUrl) + "artifactory/" + + artifactoryDetails = &config.ServerDetails{ + Url: *tests.JfrogUrl, + ArtifactoryUrl: artifactoryUrl, + AccessToken: *tests.JfrogAccessToken, + } + + fmt.Printf("Artifactory configured for Evidence tests: %s\n", artifactoryUrl) +} + +// initArtifactoryClient initializes the Artifactory services manager for Evidence tests +func initArtifactoryClient() { + if artifactoryManager != nil { + return + } + + var err error + artifactoryManager, err = utils.CreateServiceManager(artifactoryDetails, -1, 0, false) + if err != nil { + fmt.Printf("Error creating Artifactory services manager: %v\n", err) + return + } + + fmt.Printf("✓ Artifactory services manager initialized for Evidence tests\n") +} + +// initAccessClient initializes the Access services manager for Evidence tests +func initAccessClient() { + if accessManager != nil { + return + } + + var err error + accessManager, err = utils.CreateAccessServiceManager(artifactoryDetails, false) + if err != nil { + fmt.Printf("Warning: Failed to create Access services manager: %v\n", err) + return + } + + fmt.Printf("✓ Access services manager initialized for Evidence tests\n") +} + +// initLifecycleClient initializes the Lifecycle services manager for Evidence tests +func initLifecycleClient() { + if lifecycleManager != nil { + return + } + + // Lifecycle is embedded in Artifactory, prepare the server details + lifecycleDetails := &config.ServerDetails{ + Url: artifactoryDetails.Url, + ArtifactoryUrl: artifactoryDetails.ArtifactoryUrl, + AccessToken: artifactoryDetails.AccessToken, + User: artifactoryDetails.User, + Password: artifactoryDetails.Password, + } + + if lifecycleDetails.Url != "" { + baseUrl := clientutils.AddTrailingSlashIfNeeded(lifecycleDetails.Url) + lifecycleDetails.LifecycleUrl = baseUrl + "artifactory/" + } + + var err error + lifecycleManager, err = utils.CreateLifecycleServiceManager(lifecycleDetails, false) + if err != nil { + fmt.Printf("Warning: Failed to create Lifecycle services manager: %v\n", err) + return + } + + fmt.Printf("✓ Lifecycle services manager initialized for Evidence tests (embedded in Artifactory)\n") +} + +// CleanEvidenceTests cleans up after evidence tests +func CleanEvidenceTests() { + // Evidence tests clean up their own resources (repositories, artifacts, keys) via t.Cleanup() + // No global cleanup needed +} diff --git a/go.mod b/go.mod index e05063fd0..d9089f83e 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,6 @@ go 1.25.4 replace ( // Should not be updated to 0.2.6 due to a bug (https://github.com/jfrog/jfrog-cli-core/pull/372) github.com/c-bata/go-prompt => github.com/c-bata/go-prompt v0.2.5 - // Should not be updated to 0.2.0-beta.2 due to a bug (https://github.com/jfrog/jfrog-cli-core/pull/372) github.com/pkg/term => github.com/pkg/term v1.1.0 ) @@ -21,7 +20,7 @@ require ( github.com/jfrog/jfrog-cli-application v1.0.1 github.com/jfrog/jfrog-cli-artifactory v0.7.3-0.20251111104049-14f72d73276a github.com/jfrog/jfrog-cli-core/v2 v2.60.1-0.20251113080140-6faea9bbe1a0 - github.com/jfrog/jfrog-cli-evidence v0.8.2 + github.com/jfrog/jfrog-cli-evidence v0.8.3-0.20251116083852-12dc534b4d13 github.com/jfrog/jfrog-cli-platform-services v1.10.0 github.com/jfrog/jfrog-cli-security v1.22.0 github.com/jfrog/jfrog-client-go v1.55.1-0.20251106114658-e01e86b037c8 diff --git a/go.sum b/go.sum index 0eb3cbae3..016bc2caf 100644 --- a/go.sum +++ b/go.sum @@ -1163,8 +1163,8 @@ github.com/jfrog/jfrog-cli-artifactory v0.7.3-0.20251111104049-14f72d73276a h1:H github.com/jfrog/jfrog-cli-artifactory v0.7.3-0.20251111104049-14f72d73276a/go.mod h1:l9orAXG293Sx8pyk8nwZyHtnMXmPoVehUKZATIAy14U= github.com/jfrog/jfrog-cli-core/v2 v2.60.1-0.20251113080140-6faea9bbe1a0 h1:HtIFpiy5dvQhMoaFKP9vi2G1G7wkHtxlk9kbJ6XbcQ0= github.com/jfrog/jfrog-cli-core/v2 v2.60.1-0.20251113080140-6faea9bbe1a0/go.mod h1:OmhpDPWjv5k0XWtkllXAekrHuf/dWyoxvSDxTK2HchY= -github.com/jfrog/jfrog-cli-evidence v0.8.2 h1:GQi2BjIruGzTWJ9AJM59frRgiPQoLLDo4IVfwiye0tc= -github.com/jfrog/jfrog-cli-evidence v0.8.2/go.mod h1:6KohlDOtLswaJ4YYi/FqflJEZTvt7yP7SA1cjGG0If4= +github.com/jfrog/jfrog-cli-evidence v0.8.3-0.20251116083852-12dc534b4d13 h1:V9KRanq6ulMMLLwJcnbN2+UlDa0/+sWrUEC2Dex48+E= +github.com/jfrog/jfrog-cli-evidence v0.8.3-0.20251116083852-12dc534b4d13/go.mod h1:6KohlDOtLswaJ4YYi/FqflJEZTvt7yP7SA1cjGG0If4= github.com/jfrog/jfrog-cli-platform-services v1.10.0 h1:O+N/VAF+QjFvq9xkHpmzKLcdl9aJu3IP204Su0L14rw= github.com/jfrog/jfrog-cli-platform-services v1.10.0/go.mod h1:qbu4iqBST9x8LgD8HhzUm91iOB3vHqtoGmaxOnmw0ok= github.com/jfrog/jfrog-cli-security v1.22.0 h1:KNovA+BA1IpE0c0jI6jWF33fOimgylR9a7T84ZmgNJI= diff --git a/main_test.go b/main_test.go index a16417ad7..87c056627 100644 --- a/main_test.go +++ b/main_test.go @@ -80,6 +80,9 @@ func setupIntegrationTests() { if *tests.TestLifecycle { InitLifecycleTests() } + if *tests.TestEvidence { + InitEvidenceTests() + } } func tearDownIntegrationTests() { @@ -101,6 +104,9 @@ func tearDownIntegrationTests() { if *tests.TestLifecycle { CleanLifecycleTests() } + if *tests.TestEvidence { + CleanEvidenceTests() + } } func InitBuildToolsTests() { diff --git a/utils/tests/utils.go b/utils/tests/utils.go index 2c44a3962..298c6c3df 100644 --- a/utils/tests/utils.go +++ b/utils/tests/utils.go @@ -73,6 +73,7 @@ var ( TestAccess *bool TestTransfer *bool TestLifecycle *bool + TestEvidence *bool HideUnitTestLog *bool ciRunId *string InstallDataTransferPlugin *bool @@ -109,6 +110,7 @@ func init() { TestAccess = flag.Bool("test.access", false, "Test Access") TestTransfer = flag.Bool("test.transfer", false, "Test files transfer") TestLifecycle = flag.Bool("test.lifecycle", false, "Test lifecycle") + TestEvidence = flag.Bool("test.evidence", false, "Test evidence") ContainerRegistry = flag.String("test.containerRegistry", "localhost:8082", "Container registry") HideUnitTestLog = flag.Bool("test.hideUnitTestLog", false, "Hide unit tests logs and print it in a file") InstallDataTransferPlugin = flag.Bool("test.installDataTransferPlugin", false, "Install data-transfer plugin on the source Artifactory server") From d443f12038941cd0afb94547bc0c3642bcc7fb15 Mon Sep 17 00:00:00 2001 From: osaidw Date: Mon, 17 Nov 2025 15:53:06 +0200 Subject: [PATCH 2/2] Update env secrets. --- .github/workflows/evidenceTests.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/evidenceTests.yml b/.github/workflows/evidenceTests.yml index 98776ba35..9b32109fd 100644 --- a/.github/workflows/evidenceTests.yml +++ b/.github/workflows/evidenceTests.yml @@ -37,9 +37,9 @@ jobs: with: version: latest env: - JF_URL: ${{ secrets.PLATFORM_URL }} - JF_ACCESS_TOKEN: ${{ secrets.PLATFORM_ADMIN_TOKEN }} + JF_URL: ${{ secrets.EPLUS_PLATFORM_URL }} + JF_ACCESS_TOKEN: ${{ secrets.EPLUS_ADMIN_TOKEN }} - name: Run Evidence tests - run: go test -v github.com/jfrog/jfrog-cli --timeout 0 --test.evidence --jfrog.url=${{ secrets.PLATFORM_URL }} --jfrog.adminToken=${{ secrets.PLATFORM_ADMIN_TOKEN }} --jfrog.evidenceToken=${{ secrets.EVIDENCE_USER_TOKEN }} --jfrog.projectKey=${{ secrets.EVIDENCE_PROJECT_KEY }} --jfrog.projectToken=${{ secrets.EVIDENCE_PROJECT_TOKEN }} --ci.runId=${{ runner.os }}-evidence + run: go test -v github.com/jfrog/jfrog-cli --timeout 0 --test.evidence --jfrog.url=${{ secrets.EPLUS_PLATFORM_URL }} --jfrog.adminToken=${{ secrets.EPLUS_ADMIN_TOKEN }} --jfrog.evidenceToken=${{ secrets.EVIDENCE_USER_TOKEN }} --jfrog.projectKey=${{ secrets.EVIDENCE_PROJECT_KEY }} --jfrog.projectToken=${{ secrets.EVIDENCE_PROJECT_TOKEN }} --ci.runId=${{ runner.os }}-evidence