Skip to content
Open
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
130 changes: 74 additions & 56 deletions flags/flags_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,16 @@
package flags

import (
"context"
"errors"
"os"
"path/filepath"
"testing"
"time"

"github.com/parca-dev/parca-agent/config"
"github.com/stretchr/testify/require"
"go.opentelemetry.io/otel/trace/noop"
)

func TestParse_OnlyRelabelConfigs(t *testing.T) {
Expand All @@ -42,39 +45,39 @@ func TestParse_OnlyRelabelConfigs(t *testing.T) {
// Save original args and restore after test
oldArgs := os.Args
defer func() { os.Args = oldArgs }()

// Set args with config path
os.Args = []string{"parca-agent", "--config-path", configPath}

// Parse flags
flags, err := Parse()
if err != nil {
t.Fatalf("Failed to parse flags: %v", err)
}

// Verify default values are still set
if flags.HTTPAddress != "127.0.0.1:7071" {
t.Errorf("Expected default HTTPAddress, got %s", flags.HTTPAddress)
}

if flags.Log.Level != "info" {
t.Errorf("Expected default log level 'info', got %s", flags.Log.Level)
}

// Also test config.LoadFile() to ensure relabel configs are loaded correctly
cfg, err := config.LoadFile(configPath)
if err != nil {
t.Fatalf("Failed to load config file: %v", err)
}

if cfg == nil {
t.Fatal("Expected config to be loaded, got nil")
}

if len(cfg.RelabelConfigs) != 2 {
t.Errorf("Expected 2 relabel configs, got %d", len(cfg.RelabelConfigs))
}

if len(cfg.RelabelConfigs) >= 2 {
if cfg.RelabelConfigs[0].TargetLabel != "exec" {
t.Errorf("Expected first relabel config target_label 'exec', got %s", cfg.RelabelConfigs[0].TargetLabel)
Expand Down Expand Up @@ -107,63 +110,63 @@ metadata-external-labels:
// Save original args and restore after test
oldArgs := os.Args
defer func() { os.Args = oldArgs }()

// Set args with config path
os.Args = []string{"parca-agent", "--config-path", configPath}

// Parse flags
flags, err := Parse()
if err != nil {
t.Fatalf("Failed to parse flags: %v", err)
}

// Verify values from config file
if flags.HTTPAddress != "0.0.0.0:8080" {
t.Errorf("Expected HTTPAddress from config, got %s", flags.HTTPAddress)
}

if flags.Log.Level != "debug" {
t.Errorf("Expected log level 'debug' from config, got %s", flags.Log.Level)
}

if flags.Log.Format != "json" {
t.Errorf("Expected log format 'json' from config, got %s", flags.Log.Format)
}

if flags.Profiling.Duration != 10*time.Second {
t.Errorf("Expected profiling duration 10s from config, got %v", flags.Profiling.Duration)
}

if flags.Profiling.CPUSamplingFrequency != 97 {
t.Errorf("Expected CPU sampling frequency 97 from config, got %d", flags.Profiling.CPUSamplingFrequency)
}

if flags.RemoteStore.Address != "grpc.example.com:443" {
t.Errorf("Expected remote store address from config, got %s", flags.RemoteStore.Address)
}

if flags.RemoteStore.Insecure != false {
t.Errorf("Expected remote store insecure=false from config, got %v", flags.RemoteStore.Insecure)
}

if flags.Metadata.ExternalLabels["cluster"] != "production" {
t.Errorf("Expected external label 'cluster=production' from config, got %s", flags.Metadata.ExternalLabels["cluster"])
}

if flags.Metadata.ExternalLabels["region"] != "us-west-2" {
t.Errorf("Expected external label 'region=us-west-2' from config, got %s", flags.Metadata.ExternalLabels["region"])
}

// Also test config.LoadFile() - this config has no relabel configs
cfg, err := config.LoadFile(configPath)
if err != nil {
t.Fatalf("Failed to load config file: %v", err)
}

if cfg == nil {
t.Fatal("Expected config to be loaded, got nil")
}

if len(cfg.RelabelConfigs) != 0 {
t.Errorf("Expected 0 relabel configs, got %d", len(cfg.RelabelConfigs))
}
Expand Down Expand Up @@ -208,87 +211,87 @@ offline-mode-rotation-interval: 15m
// Save original args and restore after test
oldArgs := os.Args
defer func() { os.Args = oldArgs }()

// Set args with config path
os.Args = []string{"parca-agent", "--config-path", configPath}

// Parse flags
flags, err := Parse()
if err != nil {
t.Fatalf("Failed to parse flags: %v", err)
}

// Verify CLI flags from config file
if flags.HTTPAddress != "0.0.0.0:9090" {
t.Errorf("Expected HTTPAddress from config, got %s", flags.HTTPAddress)
}

if flags.Log.Level != "warn" {
t.Errorf("Expected log level 'warn' from config, got %s", flags.Log.Level)
}

if flags.Profiling.Duration != 15*time.Second {
t.Errorf("Expected profiling duration 15s from config, got %v", flags.Profiling.Duration)
}

if flags.Profiling.LabelTTL != 20*time.Minute {
t.Errorf("Expected label TTL 20m from config, got %v", flags.Profiling.LabelTTL)
}

if !flags.Profiling.EnableErrorFrames {
t.Errorf("Expected enable_error_frames=true from config")
}

if flags.RemoteStore.Address != "remote.parca.dev:443" {
t.Errorf("Expected remote store address from config, got %s", flags.RemoteStore.Address)
}

if flags.RemoteStore.BearerTokenFile != "/etc/parca/token" {
t.Errorf("Expected bearer token file from config, got %s", flags.RemoteStore.BearerTokenFile)
}

if !flags.RemoteStore.InsecureSkipVerify {
t.Errorf("Expected insecure_skip_verify=true from config")
}

if !flags.Debuginfo.UploadDisable {
t.Errorf("Expected debuginfo upload_disable=true from config")
}

if len(flags.Debuginfo.Directories) != 2 {
t.Errorf("Expected 2 debuginfo directories from config, got %d", len(flags.Debuginfo.Directories))
}

if !flags.BPF.VerboseLogging {
t.Errorf("Expected BPF verbose_logging=true from config")
}

if flags.BPF.MapScaleFactor != 2 {
t.Errorf("Expected BPF map_scale_factor=2 from config, got %d", flags.BPF.MapScaleFactor)
}

if flags.OfflineMode.StoragePath != "/var/lib/parca-agent" {
t.Errorf("Expected offline mode storage_path from config, got %s", flags.OfflineMode.StoragePath)
}

if flags.OfflineMode.RotationInterval != 15*time.Minute {
t.Errorf("Expected offline mode rotation_interval=15m from config, got %v", flags.OfflineMode.RotationInterval)
}

// Also test config.LoadFile() to ensure relabel configs are loaded correctly
cfg, err := config.LoadFile(configPath)
if err != nil {
t.Fatalf("Failed to load config file: %v", err)
}

if cfg == nil {
t.Fatal("Expected config to be loaded, got nil")
}

if len(cfg.RelabelConfigs) != 2 {
t.Errorf("Expected 2 relabel configs, got %d", len(cfg.RelabelConfigs))
}

if len(cfg.RelabelConfigs) >= 2 {
if cfg.RelabelConfigs[0].TargetLabel != "exec" {
t.Errorf("Expected first relabel config target_label 'exec', got %s", cfg.RelabelConfigs[0].TargetLabel)
Expand All @@ -314,45 +317,45 @@ profiling-duration: 10s
// Save original args and restore after test
oldArgs := os.Args
defer func() { os.Args = oldArgs }()

// Set args with config path and override some values
os.Args = []string{
"parca-agent",
"--config-path", configPath,
"--http-address", "127.0.0.1:9999",
"--log-level", "error",
}

// Parse flags
flags, err := Parse()
if err != nil {
t.Fatalf("Failed to parse flags: %v", err)
}

// Verify command-line args override config file values
if flags.HTTPAddress != "127.0.0.1:9999" {
t.Errorf("Expected HTTPAddress from command line, got %s", flags.HTTPAddress)
}

if flags.Log.Level != "error" {
t.Errorf("Expected log level 'error' from command line, got %s", flags.Log.Level)
}

// Verify config file value that wasn't overridden
if flags.Profiling.Duration != 10*time.Second {
t.Errorf("Expected profiling duration 10s from config, got %v", flags.Profiling.Duration)
}

// Also test config.LoadFile() - this config has no relabel configs
cfg, err := config.LoadFile(configPath)
if err != nil {
t.Fatalf("Failed to load config file: %v", err)
}

if cfg == nil {
t.Fatal("Expected config to be loaded, got nil")
}

if len(cfg.RelabelConfigs) != 0 {
t.Errorf("Expected 0 relabel configs, got %d", len(cfg.RelabelConfigs))
}
Expand All @@ -369,25 +372,25 @@ func TestParse_WithConfigFile_EmptyConfig(t *testing.T) {
// Save original args and restore after test
oldArgs := os.Args
defer func() { os.Args = oldArgs }()

// Set args with config path
os.Args = []string{"parca-agent", "--config-path", configPath}

// Parse flags - should not error, just use defaults
flags, err := Parse()
if err != nil {
t.Fatalf("Failed to parse flags: %v", err)
}

// Verify default values are set
if flags.HTTPAddress != "127.0.0.1:7071" {
t.Errorf("Expected default HTTPAddress, got %s", flags.HTTPAddress)
}

if flags.Log.Level != "info" {
t.Errorf("Expected default log level 'info', got %s", flags.Log.Level)
}

// Also test config.LoadFile() - empty config should return ErrEmptyConfig
_, err = config.LoadFile(configPath)
if err == nil {
Expand All @@ -396,4 +399,19 @@ func TestParse_WithConfigFile_EmptyConfig(t *testing.T) {
if !errors.Is(err, config.ErrEmptyConfig) {
t.Errorf("Expected ErrEmptyConfig, got %v", err)
}
}
}

func TestSetupGrpcConnectionReturnsErrorForUnreadableBearerTokenFile(t *testing.T) {
t.Parallel()

f := FlagsRemoteStore{
Address: "127.0.0.1:1",
BearerTokenFile: filepath.Join(t.TempDir(), "missing-token"),
Insecure: true,
GRPCConnectionTimeout: time.Millisecond,
}

_, err := f.setupGrpcConnection(context.Background(), nil, noop.NewTracerProvider())
require.Error(t, err)
require.Contains(t, err.Error(), "failed to read bearer token from file")
}
Loading