From 958653a505890cbc17fe14ff375867d5bbf45caa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Mierzwa?= Date: Fri, 25 Sep 2020 17:49:07 +0100 Subject: [PATCH] fix(tests): refactor testscript tests --- cmd/karma/main.go | 60 +++++++++++++++-- cmd/karma/script_test.go | 20 ++---- .../{acl_example.txt => 001_acl_example.txt} | 0 ...alid_file.txt => 002_acl_invalid_file.txt} | 0 ...sing_file.txt => 003_acl_missing_file.txt} | 0 ...on.txt => 004_acl_rule_invalid_action.txt} | 0 ... => 005_acl_rule_invalid_alertmanager.txt} | 0 ...> 006_acl_rule_invalid_filter_name_re.txt} | 0 ... 007_acl_rule_invalid_filter_value_re.txt} | 0 ...oup.txt => 008_acl_rule_invalid_group.txt} | 0 ... 009_acl_rule_invalid_matcher_name_re.txt} | 0 ...010_acl_rule_invalid_matcher_value_re.txt} | 0 ...matcher_missing_both_name_and_name_re.txt} | 0 ...tcher_missing_both_value_and_value_re.txt} | 0 ...t => 013_acl_rule_missing_filter_name.txt} | 0 ... => 014_acl_rule_missing_filter_value.txt} | 0 ... => 015_acl_rule_missing_matcher_name.txt} | 0 ... 016_acl_rule_missing_matcher_name_re.txt} | 0 ...=> 017_acl_rule_missing_matcher_value.txt} | 0 ...018_acl_rule_missing_matcher_value_re.txt} | 0 ...on.txt => 019_acl_rule_missing_reason.txt} | 0 ...e_scope_missing_both_name_and_name_re.txt} | 0 ...scope_missing_both_value_and_value_re.txt} | 0 ... => 022_auth_basicAuth_no_credentials.txt} | 0 ...txt => 023_auth_basicAuth_no_password.txt} | 0 ...txt => 024_auth_basicAuth_no_username.txt} | 0 ...txt => 025_auth_group_missing_members.txt} | 0 ...me.txt => 026_auth_group_missing_name.txt} | 0 ....txt => 027_auth_header_and_basicAuth.txt} | 0 ...o_name.txt => 028_auth_header_no_name.txt} | 0 ...regex.txt => 029_auth_header_no_regex.txt} | 0 ....txt => 030_auth_header_regex_invalid.txt} | 0 ...{check-config.txt => 031_check-config.txt} | 0 ....txt => 032_config_file_flag_over_env.txt} | 0 ...m_env.txt => 033_config_file_from_env.txt} | 0 ...flag.txt => 034_config_file_from_flag.txt} | 0 cmd/karma/tests/testscript/035_debug.txt | 12 ++++ ...g_file.txt => 036_default_config_file.txt} | 0 ..._duplicated_alertmanager_default_name.txt} | 0 ...t => 038_duplicated_alertmanager_name.txt} | 0 ...xt => 039_duplicated_alertmanager_uri.txt} | 0 ...me.txt => 040_empty_alertmanager_name.txt} | 0 ...invalid_alertmanager_cors_credentials.txt} | 0 ...2_invalid_config_alertmanager_timeout.txt} | 2 +- ...{invalid_flag.txt => 043_invalid_flag.txt} | 0 ...044_invalid_flag_alertmanager_timeout.txt} | 0 ...efix.txt => 045_invalid_listen_prefix.txt} | 0 ..._format.txt => 046_invalid_log_format.txt} | 0 ...og_level.txt => 047_invalid_log_level.txt} | 0 ...onfig.txt => 048_invalid_proxy_config.txt} | 0 ..._config.txt => 049_invalid_tls_config.txt} | 0 .../{invalid_ttl.txt => 050_invalid_ttl.txt} | 0 .../{invalid_uri.txt => 051_invalid_uri.txt} | 0 ...052_labels_color_custom_invalid_regex.txt} | 0 ...053_labels_color_custom_missing_value.txt} | 0 ...x.txt => 054_linkDetect_invalid_regex.txt} | 0 ..._regex.txt => 055_linkDetect_no_regex.txt} | 0 ...t_no_uri.txt => 056_linkDetect_no_uri.txt} | 0 ...ig.txt => 057_linkDetect_valid_config.txt} | 0 ...ormat_json.txt => 058_log_format_json.txt} | 0 ...ig_env.txt => 059_log_full_config_env.txt} | 0 ..._file.txt => 060_log_full_config_file.txt} | 0 ...61_log_full_config_file_invalid_values.txt | 59 ++++++++++++++++ ...og_timestamp.txt => 062_log_timestamp.txt} | 0 .../testscript/063_missing_config_file.txt | 4 ++ .../{no_args.txt => 064_no_args.txt} | 0 ...adonly.txt => 065_proxy-with-readonly.txt} | 0 .../testscript/{proxy.txt => 066_proxy.txt} | 0 .../{readonly.txt => 067_readonly.txt} | 0 cmd/karma/tests/testscript/068_sentry.txt | 23 +++++++ .../tests/testscript/069_simple_config.txt | 13 ++++ ..._case_keys.txt => 070_upper_case_keys.txt} | 0 .../{version.txt => 071_version.txt} | 0 .../testscript/072_pid_file_write_error.txt | 5 ++ .../testscript/073_pid_file_remove_error.txt | 15 +++++ cmd/karma/tests/testscript/debug.txt | 3 - .../log_full_config_file_invalid_values.txt | 67 ------------------- .../tests/testscript/missing_config_file.txt | 4 -- cmd/karma/tests/testscript/sentry.txt | 14 ---- cmd/karma/tests/testscript/simple_config.txt | 4 -- cmd/karma/views_test.go | 5 +- internal/alertmanager/benchmark_test.go | 2 +- internal/alertmanager/dedup_test.go | 2 +- internal/config/config.go | 53 ++++++++------- internal/config/config_test.go | 60 +++++------------ scripts/testscript-one-by-one.sh | 7 ++ 86 files changed, 249 insertions(+), 185 deletions(-) rename cmd/karma/tests/testscript/{acl_example.txt => 001_acl_example.txt} (100%) rename cmd/karma/tests/testscript/{acl_invalid_file.txt => 002_acl_invalid_file.txt} (100%) rename cmd/karma/tests/testscript/{acl_missing_file.txt => 003_acl_missing_file.txt} (100%) rename cmd/karma/tests/testscript/{acl_rule_invalid_action.txt => 004_acl_rule_invalid_action.txt} (100%) rename cmd/karma/tests/testscript/{acl_rule_invalid_alertmanager.txt => 005_acl_rule_invalid_alertmanager.txt} (100%) rename cmd/karma/tests/testscript/{acl_rule_invalid_filter_name_re.txt => 006_acl_rule_invalid_filter_name_re.txt} (100%) rename cmd/karma/tests/testscript/{acl_rule_invalid_filter_value_re.txt => 007_acl_rule_invalid_filter_value_re.txt} (100%) rename cmd/karma/tests/testscript/{acl_rule_invalid_group.txt => 008_acl_rule_invalid_group.txt} (100%) rename cmd/karma/tests/testscript/{acl_rule_invalid_matcher_name_re.txt => 009_acl_rule_invalid_matcher_name_re.txt} (100%) rename cmd/karma/tests/testscript/{acl_rule_invalid_matcher_value_re.txt => 010_acl_rule_invalid_matcher_value_re.txt} (100%) rename cmd/karma/tests/testscript/{acl_rule_matcher_missing_both_name_and_name_re.txt => 011_acl_rule_matcher_missing_both_name_and_name_re.txt} (100%) rename cmd/karma/tests/testscript/{acl_rule_matcher_missing_both_value_and_value_re.txt => 012_acl_rule_matcher_missing_both_value_and_value_re.txt} (100%) rename cmd/karma/tests/testscript/{acl_rule_missing_filter_name.txt => 013_acl_rule_missing_filter_name.txt} (100%) rename cmd/karma/tests/testscript/{acl_rule_missing_filter_value.txt => 014_acl_rule_missing_filter_value.txt} (100%) rename cmd/karma/tests/testscript/{acl_rule_missing_matcher_name.txt => 015_acl_rule_missing_matcher_name.txt} (100%) rename cmd/karma/tests/testscript/{acl_rule_missing_matcher_name_re.txt => 016_acl_rule_missing_matcher_name_re.txt} (100%) rename cmd/karma/tests/testscript/{acl_rule_missing_matcher_value.txt => 017_acl_rule_missing_matcher_value.txt} (100%) rename cmd/karma/tests/testscript/{acl_rule_missing_matcher_value_re.txt => 018_acl_rule_missing_matcher_value_re.txt} (100%) rename cmd/karma/tests/testscript/{acl_rule_missing_reason.txt => 019_acl_rule_missing_reason.txt} (100%) rename cmd/karma/tests/testscript/{acl_rule_scope_missing_both_name_and_name_re.txt => 020_acl_rule_scope_missing_both_name_and_name_re.txt} (100%) rename cmd/karma/tests/testscript/{acl_rule_scope_missing_both_value_and_value_re.txt => 021_acl_rule_scope_missing_both_value_and_value_re.txt} (100%) rename cmd/karma/tests/testscript/{auth_basicAuth_no_credentials.txt => 022_auth_basicAuth_no_credentials.txt} (100%) rename cmd/karma/tests/testscript/{auth_basicAuth_no_password.txt => 023_auth_basicAuth_no_password.txt} (100%) rename cmd/karma/tests/testscript/{auth_basicAuth_no_username.txt => 024_auth_basicAuth_no_username.txt} (100%) rename cmd/karma/tests/testscript/{auth_group_missing_members.txt => 025_auth_group_missing_members.txt} (100%) rename cmd/karma/tests/testscript/{auth_group_missing_name.txt => 026_auth_group_missing_name.txt} (100%) rename cmd/karma/tests/testscript/{auth_header_and_basicAuth.txt => 027_auth_header_and_basicAuth.txt} (100%) rename cmd/karma/tests/testscript/{auth_header_no_name.txt => 028_auth_header_no_name.txt} (100%) rename cmd/karma/tests/testscript/{auth_header_no_regex.txt => 029_auth_header_no_regex.txt} (100%) rename cmd/karma/tests/testscript/{auth_header_regex_invalid.txt => 030_auth_header_regex_invalid.txt} (100%) rename cmd/karma/tests/testscript/{check-config.txt => 031_check-config.txt} (100%) rename cmd/karma/tests/testscript/{config_file_flag_over_env.txt => 032_config_file_flag_over_env.txt} (100%) rename cmd/karma/tests/testscript/{config_file_from_env.txt => 033_config_file_from_env.txt} (100%) rename cmd/karma/tests/testscript/{config_file_from_flag.txt => 034_config_file_from_flag.txt} (100%) create mode 100644 cmd/karma/tests/testscript/035_debug.txt rename cmd/karma/tests/testscript/{default_config_file.txt => 036_default_config_file.txt} (100%) rename cmd/karma/tests/testscript/{duplicated_alertmanager_default_name.txt => 037_duplicated_alertmanager_default_name.txt} (100%) rename cmd/karma/tests/testscript/{duplicated_alertmanager_name.txt => 038_duplicated_alertmanager_name.txt} (100%) rename cmd/karma/tests/testscript/{duplicated_alertmanager_uri.txt => 039_duplicated_alertmanager_uri.txt} (100%) rename cmd/karma/tests/testscript/{empty_alertmanager_name.txt => 040_empty_alertmanager_name.txt} (100%) rename cmd/karma/tests/testscript/{invalid_alertmanager_cors_credentials.txt => 041_invalid_alertmanager_cors_credentials.txt} (100%) rename cmd/karma/tests/testscript/{invalid_config_alertmanager_timeout.txt => 042_invalid_config_alertmanager_timeout.txt} (83%) rename cmd/karma/tests/testscript/{invalid_flag.txt => 043_invalid_flag.txt} (100%) rename cmd/karma/tests/testscript/{invalid_flag_alertmanager_timeout.txt => 044_invalid_flag_alertmanager_timeout.txt} (100%) rename cmd/karma/tests/testscript/{invalid_listen_prefix.txt => 045_invalid_listen_prefix.txt} (100%) rename cmd/karma/tests/testscript/{invalid_log_format.txt => 046_invalid_log_format.txt} (100%) rename cmd/karma/tests/testscript/{invalid_log_level.txt => 047_invalid_log_level.txt} (100%) rename cmd/karma/tests/testscript/{invalid_proxy_config.txt => 048_invalid_proxy_config.txt} (100%) rename cmd/karma/tests/testscript/{invalid_tls_config.txt => 049_invalid_tls_config.txt} (100%) rename cmd/karma/tests/testscript/{invalid_ttl.txt => 050_invalid_ttl.txt} (100%) rename cmd/karma/tests/testscript/{invalid_uri.txt => 051_invalid_uri.txt} (100%) rename cmd/karma/tests/testscript/{labels_color_custom_invalid_regex.txt => 052_labels_color_custom_invalid_regex.txt} (100%) rename cmd/karma/tests/testscript/{labels_color_custom_missing_value.txt => 053_labels_color_custom_missing_value.txt} (100%) rename cmd/karma/tests/testscript/{linkDetect_invalid_regex.txt => 054_linkDetect_invalid_regex.txt} (100%) rename cmd/karma/tests/testscript/{linkDetect_no_regex.txt => 055_linkDetect_no_regex.txt} (100%) rename cmd/karma/tests/testscript/{linkDetect_no_uri.txt => 056_linkDetect_no_uri.txt} (100%) rename cmd/karma/tests/testscript/{linkDetect_valid_config.txt => 057_linkDetect_valid_config.txt} (100%) rename cmd/karma/tests/testscript/{log_format_json.txt => 058_log_format_json.txt} (100%) rename cmd/karma/tests/testscript/{log_full_config_env.txt => 059_log_full_config_env.txt} (100%) rename cmd/karma/tests/testscript/{log_full_config_file.txt => 060_log_full_config_file.txt} (100%) create mode 100644 cmd/karma/tests/testscript/061_log_full_config_file_invalid_values.txt rename cmd/karma/tests/testscript/{log_timestamp.txt => 062_log_timestamp.txt} (100%) create mode 100644 cmd/karma/tests/testscript/063_missing_config_file.txt rename cmd/karma/tests/testscript/{no_args.txt => 064_no_args.txt} (100%) rename cmd/karma/tests/testscript/{proxy-with-readonly.txt => 065_proxy-with-readonly.txt} (100%) rename cmd/karma/tests/testscript/{proxy.txt => 066_proxy.txt} (100%) rename cmd/karma/tests/testscript/{readonly.txt => 067_readonly.txt} (100%) create mode 100644 cmd/karma/tests/testscript/068_sentry.txt create mode 100644 cmd/karma/tests/testscript/069_simple_config.txt rename cmd/karma/tests/testscript/{upper_case_keys.txt => 070_upper_case_keys.txt} (100%) rename cmd/karma/tests/testscript/{version.txt => 071_version.txt} (100%) create mode 100644 cmd/karma/tests/testscript/072_pid_file_write_error.txt create mode 100644 cmd/karma/tests/testscript/073_pid_file_remove_error.txt delete mode 100644 cmd/karma/tests/testscript/debug.txt delete mode 100644 cmd/karma/tests/testscript/log_full_config_file_invalid_values.txt delete mode 100644 cmd/karma/tests/testscript/missing_config_file.txt delete mode 100644 cmd/karma/tests/testscript/sentry.txt delete mode 100644 cmd/karma/tests/testscript/simple_config.txt create mode 100755 scripts/testscript-one-by-one.sh diff --git a/cmd/karma/main.go b/cmd/karma/main.go index a8ec84edc..3e76bba06 100644 --- a/cmd/karma/main.go +++ b/cmd/karma/main.go @@ -4,6 +4,7 @@ import ( "context" "fmt" "html/template" + "io/ioutil" "mime" "net" "net/http" @@ -11,6 +12,7 @@ import ( "os/signal" "path" "regexp" + "strconv" "strings" "syscall" "time" @@ -54,6 +56,8 @@ var ( protectedEndpoints *gin.RouterGroup silenceACLs = []*silenceACL{} + + pidFile string ) func getViewURL(sub string) string { @@ -252,6 +256,7 @@ func mainSetup(errorHandling pflag.ErrorHandling) (*gin.Engine, error) { f := pflag.NewFlagSet("karma", errorHandling) printVersion := f.Bool("version", false, "Print version and exit") validateConfig := f.Bool("check-config", false, "Validate configuration and exit") + f.StringVar(&pidFile, "pid-file", "", "If set PID of karma process will be written to this file") config.SetupFlags(f) err := f.Parse(os.Args[1:]) @@ -264,7 +269,11 @@ func mainSetup(errorHandling pflag.ErrorHandling) (*gin.Engine, error) { return nil, nil } - configFile := config.Config.Read(f) + configFile, err := config.Config.Read(f) + if err != nil { + return nil, err + } + err = setupLogger() if err != nil { return nil, err @@ -368,13 +377,41 @@ func mainSetup(errorHandling pflag.ErrorHandling) (*gin.Engine, error) { return router, nil } -func main() { - router, err := mainSetup(pflag.ExitOnError) +func writePidFile() error { + if pidFile != "" { + log.Infof("Writing PID file to %q", pidFile) + pid := os.Getpid() + err := ioutil.WriteFile(pidFile, []byte(strconv.Itoa(pid)), 0644) + if err != nil { + return fmt.Errorf("Failed to write a PID file: %s", err) + } + } + return nil +} + +func removePidFile() error { + if pidFile != "" { + log.Infof("Removing PID file %q", pidFile) + err := os.Remove(pidFile) + if err != nil { + return fmt.Errorf("Failed to remove PID file: %s", err) + } + } + return nil +} + +func serve(errorHandling pflag.ErrorHandling) error { + router, err := mainSetup(errorHandling) if err != nil { - log.Fatal(err) + return err } if router == nil { - return + return nil + } + + err = writePidFile() + if err != nil { + return err } // before we start try to fetch data from Alertmanager @@ -389,7 +426,7 @@ func main() { listen := fmt.Sprintf("%s:%d", config.Config.Listen.Address, config.Config.Listen.Port) listener, err := net.Listen("tcp", listen) if err != nil { - log.Fatal(err) + return err } log.Infof("Listening on %s", listener.Addr()) @@ -409,7 +446,16 @@ func main() { ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) defer cancel() if err := httpServer.Shutdown(ctx); err != nil { - log.Fatalf("Shutdown failed: %s", err) + return fmt.Errorf("Shutdown failed: %s", err) } log.Info("HTTP server shut down") + + return removePidFile() +} + +func main() { + err := serve(pflag.ExitOnError) + if err != nil { + log.Fatal(err) + } } diff --git a/cmd/karma/script_test.go b/cmd/karma/script_test.go index 57fb265ec..2f636fd97 100644 --- a/cmd/karma/script_test.go +++ b/cmd/karma/script_test.go @@ -11,25 +11,13 @@ import ( ) func mainShoulFail() int { - var wasFatal bool - defer func() { - if r := recover(); r != nil { - wasFatal = true - } - }() - defer func() { log.StandardLogger().ExitFunc = nil }() - log.StandardLogger().ExitFunc = func(int) { wasFatal = true } - - _, err := mainSetup(pflag.ContinueOnError) + err := serve(pflag.ContinueOnError) if err != nil { log.Error(err) - } else if wasFatal { return 0 - } else { - log.Error("No error logged") - return 100 } - return 0 + log.Error("No error logged") + return 100 } func mainShoulFailNoTimestamp() int { @@ -40,7 +28,7 @@ func mainShoulFailNoTimestamp() int { } func mainShouldWork() int { - _, err := mainSetup(pflag.ContinueOnError) + err := serve(pflag.ContinueOnError) if err != nil { log.Error(err) return 100 diff --git a/cmd/karma/tests/testscript/acl_example.txt b/cmd/karma/tests/testscript/001_acl_example.txt similarity index 100% rename from cmd/karma/tests/testscript/acl_example.txt rename to cmd/karma/tests/testscript/001_acl_example.txt diff --git a/cmd/karma/tests/testscript/acl_invalid_file.txt b/cmd/karma/tests/testscript/002_acl_invalid_file.txt similarity index 100% rename from cmd/karma/tests/testscript/acl_invalid_file.txt rename to cmd/karma/tests/testscript/002_acl_invalid_file.txt diff --git a/cmd/karma/tests/testscript/acl_missing_file.txt b/cmd/karma/tests/testscript/003_acl_missing_file.txt similarity index 100% rename from cmd/karma/tests/testscript/acl_missing_file.txt rename to cmd/karma/tests/testscript/003_acl_missing_file.txt diff --git a/cmd/karma/tests/testscript/acl_rule_invalid_action.txt b/cmd/karma/tests/testscript/004_acl_rule_invalid_action.txt similarity index 100% rename from cmd/karma/tests/testscript/acl_rule_invalid_action.txt rename to cmd/karma/tests/testscript/004_acl_rule_invalid_action.txt diff --git a/cmd/karma/tests/testscript/acl_rule_invalid_alertmanager.txt b/cmd/karma/tests/testscript/005_acl_rule_invalid_alertmanager.txt similarity index 100% rename from cmd/karma/tests/testscript/acl_rule_invalid_alertmanager.txt rename to cmd/karma/tests/testscript/005_acl_rule_invalid_alertmanager.txt diff --git a/cmd/karma/tests/testscript/acl_rule_invalid_filter_name_re.txt b/cmd/karma/tests/testscript/006_acl_rule_invalid_filter_name_re.txt similarity index 100% rename from cmd/karma/tests/testscript/acl_rule_invalid_filter_name_re.txt rename to cmd/karma/tests/testscript/006_acl_rule_invalid_filter_name_re.txt diff --git a/cmd/karma/tests/testscript/acl_rule_invalid_filter_value_re.txt b/cmd/karma/tests/testscript/007_acl_rule_invalid_filter_value_re.txt similarity index 100% rename from cmd/karma/tests/testscript/acl_rule_invalid_filter_value_re.txt rename to cmd/karma/tests/testscript/007_acl_rule_invalid_filter_value_re.txt diff --git a/cmd/karma/tests/testscript/acl_rule_invalid_group.txt b/cmd/karma/tests/testscript/008_acl_rule_invalid_group.txt similarity index 100% rename from cmd/karma/tests/testscript/acl_rule_invalid_group.txt rename to cmd/karma/tests/testscript/008_acl_rule_invalid_group.txt diff --git a/cmd/karma/tests/testscript/acl_rule_invalid_matcher_name_re.txt b/cmd/karma/tests/testscript/009_acl_rule_invalid_matcher_name_re.txt similarity index 100% rename from cmd/karma/tests/testscript/acl_rule_invalid_matcher_name_re.txt rename to cmd/karma/tests/testscript/009_acl_rule_invalid_matcher_name_re.txt diff --git a/cmd/karma/tests/testscript/acl_rule_invalid_matcher_value_re.txt b/cmd/karma/tests/testscript/010_acl_rule_invalid_matcher_value_re.txt similarity index 100% rename from cmd/karma/tests/testscript/acl_rule_invalid_matcher_value_re.txt rename to cmd/karma/tests/testscript/010_acl_rule_invalid_matcher_value_re.txt diff --git a/cmd/karma/tests/testscript/acl_rule_matcher_missing_both_name_and_name_re.txt b/cmd/karma/tests/testscript/011_acl_rule_matcher_missing_both_name_and_name_re.txt similarity index 100% rename from cmd/karma/tests/testscript/acl_rule_matcher_missing_both_name_and_name_re.txt rename to cmd/karma/tests/testscript/011_acl_rule_matcher_missing_both_name_and_name_re.txt diff --git a/cmd/karma/tests/testscript/acl_rule_matcher_missing_both_value_and_value_re.txt b/cmd/karma/tests/testscript/012_acl_rule_matcher_missing_both_value_and_value_re.txt similarity index 100% rename from cmd/karma/tests/testscript/acl_rule_matcher_missing_both_value_and_value_re.txt rename to cmd/karma/tests/testscript/012_acl_rule_matcher_missing_both_value_and_value_re.txt diff --git a/cmd/karma/tests/testscript/acl_rule_missing_filter_name.txt b/cmd/karma/tests/testscript/013_acl_rule_missing_filter_name.txt similarity index 100% rename from cmd/karma/tests/testscript/acl_rule_missing_filter_name.txt rename to cmd/karma/tests/testscript/013_acl_rule_missing_filter_name.txt diff --git a/cmd/karma/tests/testscript/acl_rule_missing_filter_value.txt b/cmd/karma/tests/testscript/014_acl_rule_missing_filter_value.txt similarity index 100% rename from cmd/karma/tests/testscript/acl_rule_missing_filter_value.txt rename to cmd/karma/tests/testscript/014_acl_rule_missing_filter_value.txt diff --git a/cmd/karma/tests/testscript/acl_rule_missing_matcher_name.txt b/cmd/karma/tests/testscript/015_acl_rule_missing_matcher_name.txt similarity index 100% rename from cmd/karma/tests/testscript/acl_rule_missing_matcher_name.txt rename to cmd/karma/tests/testscript/015_acl_rule_missing_matcher_name.txt diff --git a/cmd/karma/tests/testscript/acl_rule_missing_matcher_name_re.txt b/cmd/karma/tests/testscript/016_acl_rule_missing_matcher_name_re.txt similarity index 100% rename from cmd/karma/tests/testscript/acl_rule_missing_matcher_name_re.txt rename to cmd/karma/tests/testscript/016_acl_rule_missing_matcher_name_re.txt diff --git a/cmd/karma/tests/testscript/acl_rule_missing_matcher_value.txt b/cmd/karma/tests/testscript/017_acl_rule_missing_matcher_value.txt similarity index 100% rename from cmd/karma/tests/testscript/acl_rule_missing_matcher_value.txt rename to cmd/karma/tests/testscript/017_acl_rule_missing_matcher_value.txt diff --git a/cmd/karma/tests/testscript/acl_rule_missing_matcher_value_re.txt b/cmd/karma/tests/testscript/018_acl_rule_missing_matcher_value_re.txt similarity index 100% rename from cmd/karma/tests/testscript/acl_rule_missing_matcher_value_re.txt rename to cmd/karma/tests/testscript/018_acl_rule_missing_matcher_value_re.txt diff --git a/cmd/karma/tests/testscript/acl_rule_missing_reason.txt b/cmd/karma/tests/testscript/019_acl_rule_missing_reason.txt similarity index 100% rename from cmd/karma/tests/testscript/acl_rule_missing_reason.txt rename to cmd/karma/tests/testscript/019_acl_rule_missing_reason.txt diff --git a/cmd/karma/tests/testscript/acl_rule_scope_missing_both_name_and_name_re.txt b/cmd/karma/tests/testscript/020_acl_rule_scope_missing_both_name_and_name_re.txt similarity index 100% rename from cmd/karma/tests/testscript/acl_rule_scope_missing_both_name_and_name_re.txt rename to cmd/karma/tests/testscript/020_acl_rule_scope_missing_both_name_and_name_re.txt diff --git a/cmd/karma/tests/testscript/acl_rule_scope_missing_both_value_and_value_re.txt b/cmd/karma/tests/testscript/021_acl_rule_scope_missing_both_value_and_value_re.txt similarity index 100% rename from cmd/karma/tests/testscript/acl_rule_scope_missing_both_value_and_value_re.txt rename to cmd/karma/tests/testscript/021_acl_rule_scope_missing_both_value_and_value_re.txt diff --git a/cmd/karma/tests/testscript/auth_basicAuth_no_credentials.txt b/cmd/karma/tests/testscript/022_auth_basicAuth_no_credentials.txt similarity index 100% rename from cmd/karma/tests/testscript/auth_basicAuth_no_credentials.txt rename to cmd/karma/tests/testscript/022_auth_basicAuth_no_credentials.txt diff --git a/cmd/karma/tests/testscript/auth_basicAuth_no_password.txt b/cmd/karma/tests/testscript/023_auth_basicAuth_no_password.txt similarity index 100% rename from cmd/karma/tests/testscript/auth_basicAuth_no_password.txt rename to cmd/karma/tests/testscript/023_auth_basicAuth_no_password.txt diff --git a/cmd/karma/tests/testscript/auth_basicAuth_no_username.txt b/cmd/karma/tests/testscript/024_auth_basicAuth_no_username.txt similarity index 100% rename from cmd/karma/tests/testscript/auth_basicAuth_no_username.txt rename to cmd/karma/tests/testscript/024_auth_basicAuth_no_username.txt diff --git a/cmd/karma/tests/testscript/auth_group_missing_members.txt b/cmd/karma/tests/testscript/025_auth_group_missing_members.txt similarity index 100% rename from cmd/karma/tests/testscript/auth_group_missing_members.txt rename to cmd/karma/tests/testscript/025_auth_group_missing_members.txt diff --git a/cmd/karma/tests/testscript/auth_group_missing_name.txt b/cmd/karma/tests/testscript/026_auth_group_missing_name.txt similarity index 100% rename from cmd/karma/tests/testscript/auth_group_missing_name.txt rename to cmd/karma/tests/testscript/026_auth_group_missing_name.txt diff --git a/cmd/karma/tests/testscript/auth_header_and_basicAuth.txt b/cmd/karma/tests/testscript/027_auth_header_and_basicAuth.txt similarity index 100% rename from cmd/karma/tests/testscript/auth_header_and_basicAuth.txt rename to cmd/karma/tests/testscript/027_auth_header_and_basicAuth.txt diff --git a/cmd/karma/tests/testscript/auth_header_no_name.txt b/cmd/karma/tests/testscript/028_auth_header_no_name.txt similarity index 100% rename from cmd/karma/tests/testscript/auth_header_no_name.txt rename to cmd/karma/tests/testscript/028_auth_header_no_name.txt diff --git a/cmd/karma/tests/testscript/auth_header_no_regex.txt b/cmd/karma/tests/testscript/029_auth_header_no_regex.txt similarity index 100% rename from cmd/karma/tests/testscript/auth_header_no_regex.txt rename to cmd/karma/tests/testscript/029_auth_header_no_regex.txt diff --git a/cmd/karma/tests/testscript/auth_header_regex_invalid.txt b/cmd/karma/tests/testscript/030_auth_header_regex_invalid.txt similarity index 100% rename from cmd/karma/tests/testscript/auth_header_regex_invalid.txt rename to cmd/karma/tests/testscript/030_auth_header_regex_invalid.txt diff --git a/cmd/karma/tests/testscript/check-config.txt b/cmd/karma/tests/testscript/031_check-config.txt similarity index 100% rename from cmd/karma/tests/testscript/check-config.txt rename to cmd/karma/tests/testscript/031_check-config.txt diff --git a/cmd/karma/tests/testscript/config_file_flag_over_env.txt b/cmd/karma/tests/testscript/032_config_file_flag_over_env.txt similarity index 100% rename from cmd/karma/tests/testscript/config_file_flag_over_env.txt rename to cmd/karma/tests/testscript/032_config_file_flag_over_env.txt diff --git a/cmd/karma/tests/testscript/config_file_from_env.txt b/cmd/karma/tests/testscript/033_config_file_from_env.txt similarity index 100% rename from cmd/karma/tests/testscript/config_file_from_env.txt rename to cmd/karma/tests/testscript/033_config_file_from_env.txt diff --git a/cmd/karma/tests/testscript/config_file_from_flag.txt b/cmd/karma/tests/testscript/034_config_file_from_flag.txt similarity index 100% rename from cmd/karma/tests/testscript/config_file_from_flag.txt rename to cmd/karma/tests/testscript/034_config_file_from_flag.txt diff --git a/cmd/karma/tests/testscript/035_debug.txt b/cmd/karma/tests/testscript/035_debug.txt new file mode 100644 index 000000000..0eacd8bcc --- /dev/null +++ b/cmd/karma/tests/testscript/035_debug.txt @@ -0,0 +1,12 @@ +# Passing --debug enables Gin debug mode + +exec sh -ex ./test.sh & +karma.bin-should-work --pid-file=karma.pid --log.format=text --log.config=false --debug --alertmanager.uri=http://localhost --listen.address=127.0.0.1 --listen.port=8035 +stdout '\[GIN-debug\] \[WARNING\] Running in "debug" mode. Switch to "release" mode in production.' + +-- test.sh -- +#!/bin/sh + +while [ ! -f karma.pid ]; do sleep 1 ; done +sleep 1 +cat karma.pid | xargs kill diff --git a/cmd/karma/tests/testscript/default_config_file.txt b/cmd/karma/tests/testscript/036_default_config_file.txt similarity index 100% rename from cmd/karma/tests/testscript/default_config_file.txt rename to cmd/karma/tests/testscript/036_default_config_file.txt diff --git a/cmd/karma/tests/testscript/duplicated_alertmanager_default_name.txt b/cmd/karma/tests/testscript/037_duplicated_alertmanager_default_name.txt similarity index 100% rename from cmd/karma/tests/testscript/duplicated_alertmanager_default_name.txt rename to cmd/karma/tests/testscript/037_duplicated_alertmanager_default_name.txt diff --git a/cmd/karma/tests/testscript/duplicated_alertmanager_name.txt b/cmd/karma/tests/testscript/038_duplicated_alertmanager_name.txt similarity index 100% rename from cmd/karma/tests/testscript/duplicated_alertmanager_name.txt rename to cmd/karma/tests/testscript/038_duplicated_alertmanager_name.txt diff --git a/cmd/karma/tests/testscript/duplicated_alertmanager_uri.txt b/cmd/karma/tests/testscript/039_duplicated_alertmanager_uri.txt similarity index 100% rename from cmd/karma/tests/testscript/duplicated_alertmanager_uri.txt rename to cmd/karma/tests/testscript/039_duplicated_alertmanager_uri.txt diff --git a/cmd/karma/tests/testscript/empty_alertmanager_name.txt b/cmd/karma/tests/testscript/040_empty_alertmanager_name.txt similarity index 100% rename from cmd/karma/tests/testscript/empty_alertmanager_name.txt rename to cmd/karma/tests/testscript/040_empty_alertmanager_name.txt diff --git a/cmd/karma/tests/testscript/invalid_alertmanager_cors_credentials.txt b/cmd/karma/tests/testscript/041_invalid_alertmanager_cors_credentials.txt similarity index 100% rename from cmd/karma/tests/testscript/invalid_alertmanager_cors_credentials.txt rename to cmd/karma/tests/testscript/041_invalid_alertmanager_cors_credentials.txt diff --git a/cmd/karma/tests/testscript/invalid_config_alertmanager_timeout.txt b/cmd/karma/tests/testscript/042_invalid_config_alertmanager_timeout.txt similarity index 83% rename from cmd/karma/tests/testscript/invalid_config_alertmanager_timeout.txt rename to cmd/karma/tests/testscript/042_invalid_config_alertmanager_timeout.txt index 40144a004..3d7cff376 100644 --- a/cmd/karma/tests/testscript/invalid_config_alertmanager_timeout.txt +++ b/cmd/karma/tests/testscript/042_invalid_config_alertmanager_timeout.txt @@ -1,7 +1,7 @@ # Raises an error if we pass alertmanager.interval value that doesn't parse karma.bin-should-fail-no-timestamp --log.format=text --log.config=false --log.level=error --config.file karma.yaml ! stdout . -stderr 'level=fatal msg=".* invalid duration \\"abc123\\""' +stderr 'msg=".* invalid duration \\"abc123\\""' -- karma.yaml -- alertmanager: diff --git a/cmd/karma/tests/testscript/invalid_flag.txt b/cmd/karma/tests/testscript/043_invalid_flag.txt similarity index 100% rename from cmd/karma/tests/testscript/invalid_flag.txt rename to cmd/karma/tests/testscript/043_invalid_flag.txt diff --git a/cmd/karma/tests/testscript/invalid_flag_alertmanager_timeout.txt b/cmd/karma/tests/testscript/044_invalid_flag_alertmanager_timeout.txt similarity index 100% rename from cmd/karma/tests/testscript/invalid_flag_alertmanager_timeout.txt rename to cmd/karma/tests/testscript/044_invalid_flag_alertmanager_timeout.txt diff --git a/cmd/karma/tests/testscript/invalid_listen_prefix.txt b/cmd/karma/tests/testscript/045_invalid_listen_prefix.txt similarity index 100% rename from cmd/karma/tests/testscript/invalid_listen_prefix.txt rename to cmd/karma/tests/testscript/045_invalid_listen_prefix.txt diff --git a/cmd/karma/tests/testscript/invalid_log_format.txt b/cmd/karma/tests/testscript/046_invalid_log_format.txt similarity index 100% rename from cmd/karma/tests/testscript/invalid_log_format.txt rename to cmd/karma/tests/testscript/046_invalid_log_format.txt diff --git a/cmd/karma/tests/testscript/invalid_log_level.txt b/cmd/karma/tests/testscript/047_invalid_log_level.txt similarity index 100% rename from cmd/karma/tests/testscript/invalid_log_level.txt rename to cmd/karma/tests/testscript/047_invalid_log_level.txt diff --git a/cmd/karma/tests/testscript/invalid_proxy_config.txt b/cmd/karma/tests/testscript/048_invalid_proxy_config.txt similarity index 100% rename from cmd/karma/tests/testscript/invalid_proxy_config.txt rename to cmd/karma/tests/testscript/048_invalid_proxy_config.txt diff --git a/cmd/karma/tests/testscript/invalid_tls_config.txt b/cmd/karma/tests/testscript/049_invalid_tls_config.txt similarity index 100% rename from cmd/karma/tests/testscript/invalid_tls_config.txt rename to cmd/karma/tests/testscript/049_invalid_tls_config.txt diff --git a/cmd/karma/tests/testscript/invalid_ttl.txt b/cmd/karma/tests/testscript/050_invalid_ttl.txt similarity index 100% rename from cmd/karma/tests/testscript/invalid_ttl.txt rename to cmd/karma/tests/testscript/050_invalid_ttl.txt diff --git a/cmd/karma/tests/testscript/invalid_uri.txt b/cmd/karma/tests/testscript/051_invalid_uri.txt similarity index 100% rename from cmd/karma/tests/testscript/invalid_uri.txt rename to cmd/karma/tests/testscript/051_invalid_uri.txt diff --git a/cmd/karma/tests/testscript/labels_color_custom_invalid_regex.txt b/cmd/karma/tests/testscript/052_labels_color_custom_invalid_regex.txt similarity index 100% rename from cmd/karma/tests/testscript/labels_color_custom_invalid_regex.txt rename to cmd/karma/tests/testscript/052_labels_color_custom_invalid_regex.txt diff --git a/cmd/karma/tests/testscript/labels_color_custom_missing_value.txt b/cmd/karma/tests/testscript/053_labels_color_custom_missing_value.txt similarity index 100% rename from cmd/karma/tests/testscript/labels_color_custom_missing_value.txt rename to cmd/karma/tests/testscript/053_labels_color_custom_missing_value.txt diff --git a/cmd/karma/tests/testscript/linkDetect_invalid_regex.txt b/cmd/karma/tests/testscript/054_linkDetect_invalid_regex.txt similarity index 100% rename from cmd/karma/tests/testscript/linkDetect_invalid_regex.txt rename to cmd/karma/tests/testscript/054_linkDetect_invalid_regex.txt diff --git a/cmd/karma/tests/testscript/linkDetect_no_regex.txt b/cmd/karma/tests/testscript/055_linkDetect_no_regex.txt similarity index 100% rename from cmd/karma/tests/testscript/linkDetect_no_regex.txt rename to cmd/karma/tests/testscript/055_linkDetect_no_regex.txt diff --git a/cmd/karma/tests/testscript/linkDetect_no_uri.txt b/cmd/karma/tests/testscript/056_linkDetect_no_uri.txt similarity index 100% rename from cmd/karma/tests/testscript/linkDetect_no_uri.txt rename to cmd/karma/tests/testscript/056_linkDetect_no_uri.txt diff --git a/cmd/karma/tests/testscript/linkDetect_valid_config.txt b/cmd/karma/tests/testscript/057_linkDetect_valid_config.txt similarity index 100% rename from cmd/karma/tests/testscript/linkDetect_valid_config.txt rename to cmd/karma/tests/testscript/057_linkDetect_valid_config.txt diff --git a/cmd/karma/tests/testscript/log_format_json.txt b/cmd/karma/tests/testscript/058_log_format_json.txt similarity index 100% rename from cmd/karma/tests/testscript/log_format_json.txt rename to cmd/karma/tests/testscript/058_log_format_json.txt diff --git a/cmd/karma/tests/testscript/log_full_config_env.txt b/cmd/karma/tests/testscript/059_log_full_config_env.txt similarity index 100% rename from cmd/karma/tests/testscript/log_full_config_env.txt rename to cmd/karma/tests/testscript/059_log_full_config_env.txt diff --git a/cmd/karma/tests/testscript/log_full_config_file.txt b/cmd/karma/tests/testscript/060_log_full_config_file.txt similarity index 100% rename from cmd/karma/tests/testscript/log_full_config_file.txt rename to cmd/karma/tests/testscript/060_log_full_config_file.txt diff --git a/cmd/karma/tests/testscript/061_log_full_config_file_invalid_values.txt b/cmd/karma/tests/testscript/061_log_full_config_file_invalid_values.txt new file mode 100644 index 000000000..84b559154 --- /dev/null +++ b/cmd/karma/tests/testscript/061_log_full_config_file_invalid_values.txt @@ -0,0 +1,59 @@ +# Print out and compare logged config set via config file that includes invalid values +karma.bin-should-fail-no-timestamp --config.file=karma.yaml --check-config +! stdout . +stderr 'Failed to unmarshal configuration: 12 error\(s\) decoding:' + +-- karma.yaml -- +alertmanager: + interval: jjs88 + servers: + - name: ha1 + uri: "http://localhost:9093" + timeout: bbb + proxy: YEs + cors: + credentials: foo + - name: ha2 + uri: "http://localhost:9094" + timeout: 11 + readonly: 1 + - name: local + uri: http://localhost:9095 + timeout: z + proxy: true + readonly: 0 + headers: + - X-Auth-Test=some-token-or-other-string + - name: client-auth + uri: https://localhost:9096 + timeout: 10s + tls: + ca: ca.pem + cert: cert.pem + key: key.pem +alertAcknowledgement: + enabled: zzz + duration: 7m0s + author: karma + commentPrefix: ACK! +annotations: + default: + hidden: z + hidden: {} + visible: + - visible +filters: + default: [] +karma: + name: karma-demo +log: + level: 123 + format: foo +ui: + refresh: 10sm + hideFiltersWhenIdle: z + colorTitlebar: yum + theme: x + minimalGroupWidth: abc4 + alertsPerGroup: 5a + collapseGroups: collapsedOanMobile diff --git a/cmd/karma/tests/testscript/log_timestamp.txt b/cmd/karma/tests/testscript/062_log_timestamp.txt similarity index 100% rename from cmd/karma/tests/testscript/log_timestamp.txt rename to cmd/karma/tests/testscript/062_log_timestamp.txt diff --git a/cmd/karma/tests/testscript/063_missing_config_file.txt b/cmd/karma/tests/testscript/063_missing_config_file.txt new file mode 100644 index 000000000..251cba382 --- /dev/null +++ b/cmd/karma/tests/testscript/063_missing_config_file.txt @@ -0,0 +1,4 @@ +# Errors when config.file points to missing file +karma.bin-should-fail --config.file=404.yaml +! stdout . +stderr 'msg="Failed to load configuration file \\"404.yaml\\": open 404.yaml: no such file or directory' diff --git a/cmd/karma/tests/testscript/no_args.txt b/cmd/karma/tests/testscript/064_no_args.txt similarity index 100% rename from cmd/karma/tests/testscript/no_args.txt rename to cmd/karma/tests/testscript/064_no_args.txt diff --git a/cmd/karma/tests/testscript/proxy-with-readonly.txt b/cmd/karma/tests/testscript/065_proxy-with-readonly.txt similarity index 100% rename from cmd/karma/tests/testscript/proxy-with-readonly.txt rename to cmd/karma/tests/testscript/065_proxy-with-readonly.txt diff --git a/cmd/karma/tests/testscript/proxy.txt b/cmd/karma/tests/testscript/066_proxy.txt similarity index 100% rename from cmd/karma/tests/testscript/proxy.txt rename to cmd/karma/tests/testscript/066_proxy.txt diff --git a/cmd/karma/tests/testscript/readonly.txt b/cmd/karma/tests/testscript/067_readonly.txt similarity index 100% rename from cmd/karma/tests/testscript/readonly.txt rename to cmd/karma/tests/testscript/067_readonly.txt diff --git a/cmd/karma/tests/testscript/068_sentry.txt b/cmd/karma/tests/testscript/068_sentry.txt new file mode 100644 index 000000000..b216d5065 --- /dev/null +++ b/cmd/karma/tests/testscript/068_sentry.txt @@ -0,0 +1,23 @@ +# Configures sentry when enabled + +exec sh -ex ./test.sh & +karma.bin-should-work --pid-file=karma.pid --log.format=text --log.config=true --config.file=karma.yaml --listen.address=127.0.0.1 --listen.port=8068 +! stdout . +stderr 'msg=" private: secret"' +stderr 'msg=" public: \\"123456789\\""' + +-- karma.yaml -- +alertmanager: + servers: + - name: default + uri: http://localhost:9093 +sentry: + private: secret + public: 123456789 + +-- test.sh -- +#!/bin/sh + +while [ ! -f karma.pid ]; do sleep 1 ; done +sleep 1 +cat karma.pid | xargs kill diff --git a/cmd/karma/tests/testscript/069_simple_config.txt b/cmd/karma/tests/testscript/069_simple_config.txt new file mode 100644 index 000000000..9409a3e59 --- /dev/null +++ b/cmd/karma/tests/testscript/069_simple_config.txt @@ -0,0 +1,13 @@ +# Works in simple mode when single --alertmanager.uri flag is passed + +exec sh -ex ./test.sh & +karma.bin-should-work --pid-file=karma.pid --log.format=text --log.config=false --alertmanager.uri=http://localhost --listen.address=127.0.0.1 --listen.port=8069 +! stdout . +stderr 'msg="\[default\] Configured Alertmanager source at http://localhost \(proxied: false\, readonly: false\)"' + +-- test.sh -- +#!/bin/sh + +while [ ! -f karma.pid ]; do sleep 1 ; done +sleep 1 +cat karma.pid | xargs kill diff --git a/cmd/karma/tests/testscript/upper_case_keys.txt b/cmd/karma/tests/testscript/070_upper_case_keys.txt similarity index 100% rename from cmd/karma/tests/testscript/upper_case_keys.txt rename to cmd/karma/tests/testscript/070_upper_case_keys.txt diff --git a/cmd/karma/tests/testscript/version.txt b/cmd/karma/tests/testscript/071_version.txt similarity index 100% rename from cmd/karma/tests/testscript/version.txt rename to cmd/karma/tests/testscript/071_version.txt diff --git a/cmd/karma/tests/testscript/072_pid_file_write_error.txt b/cmd/karma/tests/testscript/072_pid_file_write_error.txt new file mode 100644 index 000000000..482e6eefe --- /dev/null +++ b/cmd/karma/tests/testscript/072_pid_file_write_error.txt @@ -0,0 +1,5 @@ +# Fails is we cannot write a PID file + +karma.bin-should-fail --pid-file=/foo/bar/karma.pid --log.format=text --log.config=false --alertmanager.uri=http://localhost +! stdout . +stderr 'msg="Failed to write a PID file:' diff --git a/cmd/karma/tests/testscript/073_pid_file_remove_error.txt b/cmd/karma/tests/testscript/073_pid_file_remove_error.txt new file mode 100644 index 000000000..890dbc124 --- /dev/null +++ b/cmd/karma/tests/testscript/073_pid_file_remove_error.txt @@ -0,0 +1,15 @@ +# Fails is we cannot remove a PID file + +exec sh -ex ./test.sh & +karma.bin-should-fail --pid-file=karma.pid --log.format=text --log.config=false --alertmanager.uri=http://localhost --listen.address=127.0.0.1 --listen.port=8073 +! stdout . +stderr 'msg="Failed to remove PID file:' + +-- test.sh -- +#!/bin/sh + +while [ ! -f karma.pid ]; do sleep 1 ; done +sleep 1 +PID=$(cat karma.pid) +rm karma.pid +kill $PID diff --git a/cmd/karma/tests/testscript/debug.txt b/cmd/karma/tests/testscript/debug.txt deleted file mode 100644 index 2554eb134..000000000 --- a/cmd/karma/tests/testscript/debug.txt +++ /dev/null @@ -1,3 +0,0 @@ -# Passing --debug enables Gin debug mode -karma.bin-should-work --log.format=text --log.config=false --debug --alertmanager.uri=http://localhost -stdout '\[GIN-debug\] \[WARNING\] Running in "debug" mode. Switch to "release" mode in production.' diff --git a/cmd/karma/tests/testscript/log_full_config_file_invalid_values.txt b/cmd/karma/tests/testscript/log_full_config_file_invalid_values.txt deleted file mode 100644 index 1b9a3ee14..000000000 --- a/cmd/karma/tests/testscript/log_full_config_file_invalid_values.txt +++ /dev/null @@ -1,67 +0,0 @@ -# Print out and compare logged config set via config file that includes invalid values -karma.bin-should-fail-no-timestamp --config.file=karma.yaml --check-config -! stdout . -cmp stderr expected.stderr - --- karma.yaml -- -alertmanager: - interval: jjs88 - servers: - - name: ha1 - uri: "http://localhost:9093" - timeout: bbb - proxy: YEs - cors: - credentials: foo - - name: ha2 - uri: "http://localhost:9094" - timeout: 11 - readonly: 1 - - name: local - uri: http://localhost:9095 - timeout: z - proxy: true - readonly: 0 - headers: - - X-Auth-Test=some-token-or-other-string - - name: client-auth - uri: https://localhost:9096 - timeout: 10s - tls: - ca: ca.pem - cert: cert.pem - key: key.pem -alertAcknowledgement: - enabled: zzz - duration: 7m0s - author: karma - commentPrefix: ACK! -annotations: - default: - hidden: z - hidden: {} - visible: - - visible -filters: - default: [] -karma: - name: karma-demo -log: - level: 123 - format: foo -ui: - refresh: 10sm - hideFiltersWhenIdle: z - colorTitlebar: yum - theme: x - minimalGroupWidth: abc4 - alertsPerGroup: 5a - collapseGroups: collapsedOanMobile - --- expected.stderr -- -level=fatal msg="Failed to unmarshal configuration: 12 error(s) decoding:\n\n* 'Alertmanager.Servers[2].Headers[0]' expected a map, got 'string'\n* cannot parse 'Alertmanager.Servers[0].Proxy' as bool: strconv.ParseBool: parsing \"YEs\": invalid syntax\n* cannot parse 'Annotations.Default.Hidden' as bool: strconv.ParseBool: parsing \"z\": invalid syntax\n* cannot parse 'UI.alertsPerGroup' as int: strconv.ParseInt: parsing \"5a\": invalid syntax\n* cannot parse 'UI.colorTitlebar' as bool: strconv.ParseBool: parsing \"yum\": invalid syntax\n* cannot parse 'UI.hideFiltersWhenIdle' as bool: strconv.ParseBool: parsing \"z\": invalid syntax\n* cannot parse 'UI.minimalGroupWidth' as int: strconv.ParseInt: parsing \"abc4\": invalid syntax\n* cannot parse 'alertAcknowledgement.Enabled' as bool: strconv.ParseBool: parsing \"zzz\": invalid syntax\n* error decoding 'Alertmanager.Interval': time: invalid duration \"jjs88\"\n* error decoding 'Alertmanager.Servers[0].Timeout': time: invalid duration \"bbb\"\n* error decoding 'Alertmanager.Servers[2].Timeout': time: invalid duration \"z\"\n* error decoding 'UI.Refresh': time: unknown unit \"sm\" in duration \"10sm\"" -level=fatal msg="Invalid alertmanager.cors.credentials value '', allowed options: omit, inclue, same-origin" -level=fatal msg="Invalid grid.sorting.order value '', allowed options: disabled, startsAt, label" -level=fatal msg="Invalid ui.collapseGroups value '', allowed options: expanded, collapsed, collapsedOnMobile" -level=fatal msg="Invalid ui.theme value '', allowed options: light, dark, auto" -level=error msg="Unknown log level ''" diff --git a/cmd/karma/tests/testscript/missing_config_file.txt b/cmd/karma/tests/testscript/missing_config_file.txt deleted file mode 100644 index 5437560ce..000000000 --- a/cmd/karma/tests/testscript/missing_config_file.txt +++ /dev/null @@ -1,4 +0,0 @@ -# Errors when config.file points to missing file -karma.bin-should-fail --config.file=404.yaml -! stdout . -stderr 'level=fatal msg="Failed to load configuration file \\"404.yaml\\": open 404.yaml: no such file or directory' diff --git a/cmd/karma/tests/testscript/sentry.txt b/cmd/karma/tests/testscript/sentry.txt deleted file mode 100644 index 4ec3a6deb..000000000 --- a/cmd/karma/tests/testscript/sentry.txt +++ /dev/null @@ -1,14 +0,0 @@ -# Configures sentry when enabled -karma.bin-should-work --log.format=text --log.config=true --config.file=karma.yaml -! stdout . -stderr 'msg=" private: secret"' -stderr 'msg=" public: \\"123456789\\""' - --- karma.yaml -- -alertmanager: - servers: - - name: default - uri: http://localhost:9093 -sentry: - private: secret - public: 123456789 diff --git a/cmd/karma/tests/testscript/simple_config.txt b/cmd/karma/tests/testscript/simple_config.txt deleted file mode 100644 index 61ff96330..000000000 --- a/cmd/karma/tests/testscript/simple_config.txt +++ /dev/null @@ -1,4 +0,0 @@ -# Works in simple mode when single --alertmanager.uri flag is passed -karma.bin-should-work --log.format=text --log.config=false --alertmanager.uri=http://localhost -! stdout . -stderr 'msg="\[default\] Configured Alertmanager source at http://localhost \(proxied: false\, readonly: false\)"' diff --git a/cmd/karma/views_test.go b/cmd/karma/views_test.go index 4a728bd0f..af7e3b405 100644 --- a/cmd/karma/views_test.go +++ b/cmd/karma/views_test.go @@ -37,7 +37,10 @@ func mockConfig() { f := pflag.NewFlagSet(".", pflag.ExitOnError) config.SetupFlags(f) - config.Config.Read(f) + _, err := config.Config.Read(f) + if err != nil { + log.Fatal(err) + } if !upstreamSetup { upstreamSetup = true diff --git a/internal/alertmanager/benchmark_test.go b/internal/alertmanager/benchmark_test.go index 09483ff71..dbfe913e8 100644 --- a/internal/alertmanager/benchmark_test.go +++ b/internal/alertmanager/benchmark_test.go @@ -39,7 +39,7 @@ func BenchmarkDedupColors(b *testing.B) { f := pflag.NewFlagSet(".", pflag.ExitOnError) config.SetupFlags(f) - config.Config.Read(f) + _, _ = config.Config.Read(f) if err := pullAlerts(); err != nil { b.Error(err) diff --git a/internal/alertmanager/dedup_test.go b/internal/alertmanager/dedup_test.go index a31b0c57c..dff74fe6c 100644 --- a/internal/alertmanager/dedup_test.go +++ b/internal/alertmanager/dedup_test.go @@ -52,7 +52,7 @@ func pullAlerts() error { func mockConfigRead() { f := pflag.NewFlagSet(".", pflag.ExitOnError) config.SetupFlags(f) - config.Config.Read(f) + _, _ = config.Config.Read(f) } func TestDedupAlerts(t *testing.T) { diff --git a/internal/config/config.go b/internal/config/config.go index b7002f9d1..41d8002d4 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -3,6 +3,7 @@ package config import ( "bufio" "bytes" + "fmt" "os" "strings" "time" @@ -122,7 +123,7 @@ func SetupFlags(f *pflag.FlagSet) { f.String("ui.collapseGroups", "collapsedOnMobile", "Default state for alert groups") } -func readConfigFile(k *koanf.Koanf, flags *pflag.FlagSet) string { +func readConfigFile(k *koanf.Koanf, flags *pflag.FlagSet) (string, error) { var configFile string // 1. Load file from flags is set @@ -141,11 +142,11 @@ func readConfigFile(k *koanf.Koanf, flags *pflag.FlagSet) string { } if configFile != "" { if err := k.Load(file.Provider(configFile), yamlParser.Parser()); err != nil { - log.Fatalf("Failed to load configuration file %q: %v", configFile, err) + return "", fmt.Errorf("Failed to load configuration file %q: %v", configFile, err) } - return configFile + return configFile, nil } - return configFile + return configFile, nil } func readEnvVariables(k *koanf.Koanf) { @@ -206,14 +207,18 @@ func readFlags(k *koanf.Koanf, flags *pflag.FlagSet) { // 1. CLI flags // 2. Config file // 3. Environment variables -func (config *configSchema) Read(flags *pflag.FlagSet) string { +func (config *configSchema) Read(flags *pflag.FlagSet) (string, error) { k := koanf.New(".") var configFileUsed string // 3. read all environemnt variables readEnvVariables(k) // 2. read config file - if cf := readConfigFile(k, flags); cf != "" { + cf, err := readConfigFile(k, flags) + if err != nil { + return "", err + } + if cf != "" { configFileUsed = cf } // 1. read flags @@ -233,30 +238,30 @@ func (config *configSchema) Read(flags *pflag.FlagSet) string { FlatPaths: false, DecoderConfig: &dConf, } - err := k.UnmarshalWithConf("", &config, kConf) + err = k.UnmarshalWithConf("", &config, kConf) if err != nil { - log.Fatalf("Failed to unmarshal configuration: %v", err) + return "", fmt.Errorf("Failed to unmarshal configuration: %v", err) } if config.Authentication.Header.Name != "" && len(config.Authentication.BasicAuth.Users) > 0 { - log.Fatalf("Both authentication.basicAuth.users and authentication.header.name is set, only one can be enabled") + return "", fmt.Errorf("Both authentication.basicAuth.users and authentication.header.name is set, only one can be enabled") } if config.Authentication.Header.ValueRegex != "" { _, err = regex.CompileAnchored(config.Authentication.Header.ValueRegex) if err != nil { - log.Fatalf("Invalid regex for authentication.header.value_re: %s", err.Error()) + return "", fmt.Errorf("Invalid regex for authentication.header.value_re: %s", err.Error()) } if config.Authentication.Header.Name == "" { - log.Fatalf("authentication.header.name is required when authentication.header.value_re is set") + return "", fmt.Errorf("authentication.header.name is required when authentication.header.value_re is set") } } else if config.Authentication.Header.Name != "" { - log.Fatalf("authentication.header.value_re is required when authentication.header.name is set") + return "", fmt.Errorf("authentication.header.value_re is required when authentication.header.name is set") } for _, u := range config.Authentication.BasicAuth.Users { if u.Username == "" || u.Password == "" { - log.Fatalf("authentication.basicAuth.users require both username and password to be set") + return "", fmt.Errorf("authentication.basicAuth.users require both username and password to be set") } } @@ -265,7 +270,7 @@ func (config *configSchema) Read(flags *pflag.FlagSet) string { } if !slices.StringInSlice([]string{"omit", "include", "same-origin"}, config.Alertmanager.CORS.Credentials) { - log.Fatalf("Invalid alertmanager.cors.credentials value '%s', allowed options: omit, inclue, same-origin", config.Alertmanager.CORS.Credentials) + return "", fmt.Errorf("Invalid alertmanager.cors.credentials value '%s', allowed options: omit, inclue, same-origin", config.Alertmanager.CORS.Credentials) } for i, s := range config.Alertmanager.Servers { @@ -279,47 +284,47 @@ func (config *configSchema) Read(flags *pflag.FlagSet) string { config.Alertmanager.Servers[i].CORS.Credentials = config.Alertmanager.CORS.Credentials } if !slices.StringInSlice([]string{"omit", "include", "same-origin"}, config.Alertmanager.Servers[i].CORS.Credentials) { - log.Fatalf("Invalid cors.credentials value '%s' for alertmanager '%s', allowed options: omit, inclue, same-origin", config.Alertmanager.Servers[i].CORS.Credentials, s.Name) + return "", fmt.Errorf("Invalid cors.credentials value '%s' for alertmanager '%s', allowed options: omit, inclue, same-origin", config.Alertmanager.Servers[i].CORS.Credentials, s.Name) } } for _, authGroup := range config.Authorization.Groups { if authGroup.Name == "" { - log.Fatalf("'name' is required for every authorization group") + return "", fmt.Errorf("'name' is required for every authorization group") } if len(authGroup.Members) == 0 { - log.Fatalf("'members' is required for every authorization group") + return "", fmt.Errorf("'members' is required for every authorization group") } } for labelName, customColors := range config.Labels.Color.Custom { for i, customColor := range customColors { if customColor.Value == "" && customColor.ValueRegex == "" { - log.Fatalf("Custom label color for '%s' is missing 'value' or 'value_re'", labelName) + return "", fmt.Errorf("Custom label color for '%s' is missing 'value' or 'value_re'", labelName) } if customColor.ValueRegex != "" { config.Labels.Color.Custom[labelName][i].CompiledRegex, err = regex.CompileAnchored(customColor.ValueRegex) if err != nil { - log.Fatalf("Failed to parse custom color regex rule '%s' for '%s' label: %s", customColor.ValueRegex, labelName, err) + return "", fmt.Errorf("Failed to parse custom color regex rule '%s' for '%s' label: %s", customColor.ValueRegex, labelName, err) } } } } if !slices.StringInSlice([]string{"disabled", "startsAt", "label"}, config.Grid.Sorting.Order) { - log.Fatalf("Invalid grid.sorting.order value '%s', allowed options: disabled, startsAt, label", config.Grid.Sorting.Order) + return "", fmt.Errorf("Invalid grid.sorting.order value '%s', allowed options: disabled, startsAt, label", config.Grid.Sorting.Order) } if !slices.StringInSlice([]string{"expanded", "collapsed", "collapsedOnMobile"}, config.UI.CollapseGroups) { - log.Fatalf("Invalid ui.collapseGroups value '%s', allowed options: expanded, collapsed, collapsedOnMobile", config.UI.CollapseGroups) + return "", fmt.Errorf("Invalid ui.collapseGroups value '%s', allowed options: expanded, collapsed, collapsedOnMobile", config.UI.CollapseGroups) } if !slices.StringInSlice([]string{"light", "dark", "auto"}, config.UI.Theme) { - log.Fatalf("Invalid ui.theme value '%s', allowed options: light, dark, auto", config.UI.Theme) + return "", fmt.Errorf("Invalid ui.theme value '%s', allowed options: light, dark, auto", config.UI.Theme) } if config.Listen.Prefix != "" && !strings.HasPrefix(config.Listen.Prefix, "/") { - log.Fatalf("listen.prefix must start with '/', got %q", config.Listen.Prefix) + return "", fmt.Errorf("listen.prefix must start with '/', got %q", config.Listen.Prefix) } // accept single Alertmanager server from flag/env if nothing is set yet @@ -340,7 +345,7 @@ func (config *configSchema) Read(flags *pflag.FlagSet) string { Config = config - return configFileUsed + return configFileUsed, nil } // LogValues will dump runtime config to logs diff --git a/internal/config/config_test.go b/internal/config/config_test.go index 10f81b64e..00543cbc2 100644 --- a/internal/config/config_test.go +++ b/internal/config/config_test.go @@ -150,10 +150,10 @@ ui: } } -func mockConfigRead() { +func mockConfigRead() (string, error) { f := pflag.NewFlagSet(".", pflag.ExitOnError) SetupFlags(f) - Config.Read(f) + return Config.Read(f) } func TestReadConfig(t *testing.T) { @@ -177,7 +177,7 @@ func TestReadConfig(t *testing.T) { os.Setenv("LISTEN_PORT", "80") os.Setenv("SENTRY_PRIVATE", "secret key") os.Setenv("SENTRY_PUBLIC", "public key") - mockConfigRead() + _, _ = mockConfigRead() testReadConfig(t) } @@ -190,7 +190,7 @@ func TestReadSimpleConfig(t *testing.T) { os.Setenv("ALERTMANAGER_TIMEOUT", "15s") os.Setenv("ALERTMANAGER_PROXY", "true") os.Setenv("ALERTMANAGER_INTERVAL", "3m") - mockConfigRead() + _, _ = mockConfigRead() if len(Config.Alertmanager.Servers) != 1 { t.Errorf("Expected 1 Alertmanager server, got %d", len(Config.Alertmanager.Servers)) } else { @@ -255,7 +255,7 @@ func TestUrlSecretTest(t *testing.T) { // FIXME check logged values func TestLogValues(t *testing.T) { - mockConfigRead() + _, _ = mockConfigRead() Config.LogValues() } @@ -263,15 +263,9 @@ func TestInvalidGridSortingOrder(t *testing.T) { resetEnv() os.Setenv("GRID_SORTING_ORDER", "foo") - log.SetLevel(log.PanicLevel) - defer func() { log.StandardLogger().ExitFunc = nil }() - var wasFatal bool - log.StandardLogger().ExitFunc = func(int) { wasFatal = true } - - mockConfigRead() - - if !wasFatal { - t.Error("Invalid grid.sorting.order value didn't cause log.Fatal()") + _, err := mockConfigRead() + if err == nil { + t.Error("Invalid grid.sorting.order value didn't return any error") } } @@ -279,15 +273,9 @@ func TestInvalidUICollapseGroups(t *testing.T) { resetEnv() os.Setenv("UI_COLLAPSEGROUPS", "foo") - log.SetLevel(log.PanicLevel) - defer func() { log.StandardLogger().ExitFunc = nil }() - var wasFatal bool - log.StandardLogger().ExitFunc = func(int) { wasFatal = true } - - mockConfigRead() - - if !wasFatal { - t.Error("Invalid ui.collapseGroups value didn't cause log.Fatal()") + _, err := mockConfigRead() + if err == nil { + t.Error("Invalid ui.collapseGroups value didn't return any error") } } @@ -295,15 +283,9 @@ func TestInvalidUITheme(t *testing.T) { resetEnv() os.Setenv("UI_THEME", "foo") - log.SetLevel(log.PanicLevel) - defer func() { log.StandardLogger().ExitFunc = nil }() - var wasFatal bool - log.StandardLogger().ExitFunc = func(int) { wasFatal = true } - - mockConfigRead() - - if !wasFatal { - t.Error("Invalid ui.theme value didn't cause log.Fatal()") + _, err := mockConfigRead() + if err == nil { + t.Error("Invalid ui.theme value didn't return any error") } } @@ -311,22 +293,16 @@ func TestInvalidCORSCredentials(t *testing.T) { resetEnv() os.Setenv("ALERTMANAGER_CORS_CREDENTIALS", "foo") - log.SetLevel(log.PanicLevel) - defer func() { log.StandardLogger().ExitFunc = nil }() - var wasFatal bool - log.StandardLogger().ExitFunc = func(int) { wasFatal = true } - - mockConfigRead() - - if !wasFatal { - t.Error("Invalid alertmanager.cors.credentials value didn't cause log.Fatal()") + _, err := mockConfigRead() + if err == nil { + t.Error("Invalid alertmanager.cors.credentials value didn't return any error") } } func TestDefaultConfig(t *testing.T) { resetEnv() log.SetLevel(log.ErrorLevel) - mockConfigRead() + _, _ = mockConfigRead() expectedConfig := configSchema{} expectedConfig.Annotations.Hidden = []string{} diff --git a/scripts/testscript-one-by-one.sh b/scripts/testscript-one-by-one.sh new file mode 100755 index 000000000..1c8fd5904 --- /dev/null +++ b/scripts/testscript-one-by-one.sh @@ -0,0 +1,7 @@ +#!/bin/bash -e + +for I in ./cmd/karma/tests/testscript/*.txt ; do + T=`basename "${I}" | cut -d. -f1` + echo ">>> ${T}" + go test -count=1 -timeout=30s -v -run=TestScript/${T} ./cmd/karma +done