Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 45 additions & 0 deletions .github/workflows/evidenceTests.yml
Original file line number Diff line number Diff line change
@@ -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

242 changes: 242 additions & 0 deletions evidence_test.go
Original file line number Diff line number Diff line change
@@ -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
}
3 changes: 1 addition & 2 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -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
)
Expand All @@ -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
Expand Down
4 changes: 2 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -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=
Expand Down
6 changes: 6 additions & 0 deletions main_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,9 @@ func setupIntegrationTests() {
if *tests.TestLifecycle {
InitLifecycleTests()
}
if *tests.TestEvidence {
InitEvidenceTests()
}
}

func tearDownIntegrationTests() {
Expand All @@ -101,6 +104,9 @@ func tearDownIntegrationTests() {
if *tests.TestLifecycle {
CleanLifecycleTests()
}
if *tests.TestEvidence {
CleanEvidenceTests()
}
}

func InitBuildToolsTests() {
Expand Down
2 changes: 2 additions & 0 deletions utils/tests/utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ var (
TestAccess *bool
TestTransfer *bool
TestLifecycle *bool
TestEvidence *bool
HideUnitTestLog *bool
ciRunId *string
InstallDataTransferPlugin *bool
Expand Down Expand Up @@ -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")
Expand Down
Loading