1package domain_test
2
3import (
4 "errors"
5 "testing"
6 "time"
7
8 "github.com/stretchr/testify/assert"
9 "github.com/stretchr/testify/require"
10
11 "github.com/bnema/gordon/internal/domain"
12)
13
14// TestContainerNetworkProbeRequest_Validate proves the bounded probe
15// request fails closed on every missing or malformed field.
16func TestContainerNetworkProbeRequest_Validate(t *testing.T) {
17 valid := domain.ContainerNetworkProbeRequest{
18 TargetContainerID: "abc123",
19 ExpectedStartedAt: time.Now().UTC(),
20 Network: "gordon--app--net",
21 Protocol: domain.ProbeProtocolHTTP,
22 Port: 8080,
23 Path: "/healthz",
24 Timeout: time.Second,
25 }
26 require.NoError(t, valid.Validate())
27
28 tests := []struct {
29 name string
30 mutate func(*domain.ContainerNetworkProbeRequest)
31 }{
32 {"missing target id", func(r *domain.ContainerNetworkProbeRequest) { r.TargetContainerID = " " }},
33 {"missing network", func(r *domain.ContainerNetworkProbeRequest) { r.Network = "" }},
34 {"missing execution start", func(r *domain.ContainerNetworkProbeRequest) { r.ExpectedStartedAt = time.Time{} }},
35 {"zero port", func(r *domain.ContainerNetworkProbeRequest) { r.Port = 0 }},
36 {"port too high", func(r *domain.ContainerNetworkProbeRequest) { r.Port = 70000 }},
37 {"zero timeout", func(r *domain.ContainerNetworkProbeRequest) { r.Timeout = 0 }},
38 {"unknown protocol", func(r *domain.ContainerNetworkProbeRequest) { r.Protocol = "grpc" }},
39 {"http without path", func(r *domain.ContainerNetworkProbeRequest) { r.Path = "" }},
40 {"http path not origin form", func(r *domain.ContainerNetworkProbeRequest) { r.Path = "healthz" }},
41 {"http path with surrounding whitespace", func(r *domain.ContainerNetworkProbeRequest) { r.Path = " /healthz " }},
42 {"tcp with path", func(r *domain.ContainerNetworkProbeRequest) {
43 r.Protocol = domain.ProbeProtocolTCP
44 }},
45 }
46 for _, tc := range tests {
47 t.Run(tc.name, func(t *testing.T) {
48 request := valid
49 tc.mutate(&request)
50 err := request.Validate()
51 require.Error(t, err)
52 assert.True(t, errors.Is(err, domain.ErrInvalidNetworkProbe), "want ErrInvalidNetworkProbe, got %v", err)
53 })
54 }
55}
56
57// TestContainerNetworkProbeRequest_ValidateTCP proves a pathless TCP probe
58// is valid.
59func TestContainerNetworkProbeRequest_ValidateTCP(t *testing.T) {
60 request := domain.ContainerNetworkProbeRequest{
61 TargetContainerID: "abc123",
62 ExpectedStartedAt: time.Now().UTC(),
63 Network: "gordon--app--net",
64 Protocol: domain.ProbeProtocolTCP,
65 Port: 5432,
66 Timeout: time.Second,
67 }
68 require.NoError(t, request.Validate())
69}