2020-04-06 13:44:03 +02:00
|
|
|
package notifier
|
2020-02-21 22:15:05 +01:00
|
|
|
|
|
|
|
import (
|
2020-05-10 18:58:17 +02:00
|
|
|
"context"
|
2020-02-21 22:15:05 +01:00
|
|
|
"encoding/json"
|
|
|
|
"net/http"
|
|
|
|
"net/http/httptest"
|
2020-06-21 12:32:46 +02:00
|
|
|
"strconv"
|
2020-02-21 22:15:05 +01:00
|
|
|
"testing"
|
|
|
|
"time"
|
2022-02-02 13:11:41 +01:00
|
|
|
|
|
|
|
"github.com/VictoriaMetrics/VictoriaMetrics/lib/promauth"
|
2020-02-21 22:15:05 +01:00
|
|
|
)
|
|
|
|
|
2021-08-31 11:28:02 +02:00
|
|
|
func TestAlertManager_Addr(t *testing.T) {
|
|
|
|
const addr = "http://localhost"
|
2022-04-09 08:21:16 +02:00
|
|
|
am, err := NewAlertManager(addr, nil, promauth.HTTPClientConfig{}, nil, 0)
|
2022-02-02 13:11:41 +01:00
|
|
|
if err != nil {
|
2024-07-12 21:57:56 +02:00
|
|
|
t.Fatalf("unexpected error: %s", err)
|
2022-02-02 13:11:41 +01:00
|
|
|
}
|
2021-08-31 11:28:02 +02:00
|
|
|
if am.Addr() != addr {
|
2024-07-12 21:57:56 +02:00
|
|
|
t.Fatalf("expected to have %q; got %q", addr, am.Addr())
|
2021-08-31 11:28:02 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-02-21 22:15:05 +01:00
|
|
|
func TestAlertManager_Send(t *testing.T) {
|
2020-06-29 21:21:03 +02:00
|
|
|
const baUser, baPass = "foo", "bar"
|
2023-04-27 13:02:21 +02:00
|
|
|
const headerKey, headerValue = "TenantID", "foo"
|
2020-02-21 22:15:05 +01:00
|
|
|
mux := http.NewServeMux()
|
|
|
|
mux.HandleFunc("/", func(_ http.ResponseWriter, _ *http.Request) {
|
2024-07-12 21:57:56 +02:00
|
|
|
t.Fatalf("should not be called")
|
2020-02-21 22:15:05 +01:00
|
|
|
})
|
|
|
|
c := -1
|
2020-04-06 13:44:03 +02:00
|
|
|
mux.HandleFunc(alertManagerPath, func(w http.ResponseWriter, r *http.Request) {
|
2020-06-29 21:21:03 +02:00
|
|
|
user, pass, ok := r.BasicAuth()
|
|
|
|
if !ok {
|
2024-07-12 21:57:56 +02:00
|
|
|
t.Fatalf("unauthorized request")
|
2020-06-29 21:21:03 +02:00
|
|
|
}
|
|
|
|
if user != baUser || pass != baPass {
|
2024-07-12 21:57:56 +02:00
|
|
|
t.Fatalf("wrong creds %q:%q; expected %q:%q", user, pass, baUser, baPass)
|
2020-06-29 21:21:03 +02:00
|
|
|
}
|
2020-02-21 22:15:05 +01:00
|
|
|
c++
|
|
|
|
if r.Method != http.MethodPost {
|
2024-07-12 21:57:56 +02:00
|
|
|
t.Fatalf("expected POST method got %s", r.Method)
|
2020-02-21 22:15:05 +01:00
|
|
|
}
|
|
|
|
switch c {
|
|
|
|
case 0:
|
|
|
|
conn, _, _ := w.(http.Hijacker).Hijack()
|
|
|
|
_ = conn.Close()
|
|
|
|
case 1:
|
|
|
|
w.WriteHeader(500)
|
|
|
|
case 2:
|
|
|
|
var a []struct {
|
|
|
|
Labels map[string]string `json:"labels"`
|
|
|
|
StartsAt time.Time `json:"startsAt"`
|
|
|
|
EndAt time.Time `json:"endsAt"`
|
|
|
|
Annotations map[string]string `json:"annotations"`
|
|
|
|
GeneratorURL string `json:"generatorURL"`
|
|
|
|
}
|
|
|
|
if err := json.NewDecoder(r.Body).Decode(&a); err != nil {
|
2024-07-12 21:57:56 +02:00
|
|
|
t.Fatalf("can not unmarshal data into alert %s", err)
|
2020-02-21 22:15:05 +01:00
|
|
|
}
|
|
|
|
if len(a) != 1 {
|
2024-07-12 21:57:56 +02:00
|
|
|
t.Fatalf("expected 1 alert in array got %d", len(a))
|
2020-02-21 22:15:05 +01:00
|
|
|
}
|
2020-05-10 18:58:17 +02:00
|
|
|
if a[0].GeneratorURL != "0/0" {
|
2024-07-12 21:57:56 +02:00
|
|
|
t.Fatalf("expected 0/0 as generatorURL got %s", a[0].GeneratorURL)
|
2020-02-21 22:15:05 +01:00
|
|
|
}
|
|
|
|
if a[0].StartsAt.IsZero() {
|
2024-07-12 21:57:56 +02:00
|
|
|
t.Fatalf("expected non-zero start time")
|
2020-02-21 22:15:05 +01:00
|
|
|
}
|
|
|
|
if a[0].EndAt.IsZero() {
|
2024-07-12 21:57:56 +02:00
|
|
|
t.Fatalf("expected non-zero end time")
|
2020-02-21 22:15:05 +01:00
|
|
|
}
|
2023-04-27 13:02:21 +02:00
|
|
|
case 3:
|
|
|
|
if r.Header.Get(headerKey) != headerValue {
|
2024-07-12 21:57:56 +02:00
|
|
|
t.Fatalf("expected header %q to be set to %q; got %q instead", headerKey, headerValue, r.Header.Get(headerKey))
|
2023-04-27 13:02:21 +02:00
|
|
|
}
|
2020-02-21 22:15:05 +01:00
|
|
|
}
|
|
|
|
})
|
|
|
|
srv := httptest.NewServer(mux)
|
|
|
|
defer srv.Close()
|
2022-02-02 13:11:41 +01:00
|
|
|
|
|
|
|
aCfg := promauth.HTTPClientConfig{
|
|
|
|
BasicAuth: &promauth.BasicAuthConfig{
|
|
|
|
Username: baUser,
|
|
|
|
Password: promauth.NewSecret(baPass),
|
|
|
|
},
|
|
|
|
}
|
|
|
|
am, err := NewAlertManager(srv.URL+alertManagerPath, func(alert Alert) string {
|
2020-06-21 12:32:46 +02:00
|
|
|
return strconv.FormatUint(alert.GroupID, 10) + "/" + strconv.FormatUint(alert.ID, 10)
|
2022-04-09 08:21:16 +02:00
|
|
|
}, aCfg, nil, 0)
|
2022-02-02 13:11:41 +01:00
|
|
|
if err != nil {
|
2024-07-12 21:57:56 +02:00
|
|
|
t.Fatalf("unexpected error: %s", err)
|
2022-02-02 13:11:41 +01:00
|
|
|
}
|
2023-04-27 12:17:26 +02:00
|
|
|
if err := am.Send(context.Background(), []Alert{{}, {}}, nil); err == nil {
|
2024-07-12 21:57:56 +02:00
|
|
|
t.Fatalf("expected connection error got nil")
|
2020-02-21 22:15:05 +01:00
|
|
|
}
|
2023-04-27 12:17:26 +02:00
|
|
|
if err := am.Send(context.Background(), []Alert{}, nil); err == nil {
|
2024-07-12 21:57:56 +02:00
|
|
|
t.Fatalf("expected wrong http code error got nil")
|
2020-02-21 22:15:05 +01:00
|
|
|
}
|
2020-05-10 18:58:17 +02:00
|
|
|
if err := am.Send(context.Background(), []Alert{{
|
|
|
|
GroupID: 0,
|
2020-03-13 11:19:31 +01:00
|
|
|
Name: "alert0",
|
|
|
|
Start: time.Now().UTC(),
|
|
|
|
End: time.Now().UTC(),
|
|
|
|
Annotations: map[string]string{"a": "b", "c": "d", "e": "f"},
|
2023-04-27 12:17:26 +02:00
|
|
|
}}, nil); err != nil {
|
2024-07-12 21:57:56 +02:00
|
|
|
t.Fatalf("unexpected error %s", err)
|
2020-02-21 22:15:05 +01:00
|
|
|
}
|
|
|
|
if c != 2 {
|
2024-07-12 21:57:56 +02:00
|
|
|
t.Fatalf("expected 2 calls(count from zero) to server got %d", c)
|
2020-02-21 22:15:05 +01:00
|
|
|
}
|
2023-04-27 13:02:21 +02:00
|
|
|
if err := am.Send(context.Background(), nil, map[string]string{headerKey: headerValue}); err != nil {
|
2024-07-12 21:57:56 +02:00
|
|
|
t.Fatalf("unexpected error %s", err)
|
2023-04-27 13:02:21 +02:00
|
|
|
}
|
2020-02-21 22:15:05 +01:00
|
|
|
}
|