Files
Pulse/internal/dockeragent/agent_flushbuffer_test.go
rcourtman 44fa50eed7 feat(dockeragent): improve test coverage and refactor registry dependencies
- Add comprehensive test coverage for agent report, flush buffer, and deps
- Expand flow, HTTP, CPU, and swarm test coverage
- Refactor registry access to use deps interface for better testability
- Add container update and self-update test scenarios
2025-12-29 09:57:45 +00:00

91 lines
2.7 KiB
Go

package dockeragent
import (
"context"
"errors"
"net/http"
"net/http/httptest"
"testing"
"github.com/rcourtman/pulse-go-rewrite/internal/buffer"
agentsdocker "github.com/rcourtman/pulse-go-rewrite/pkg/agents/docker"
"github.com/rs/zerolog"
)
func TestFlushBuffer(t *testing.T) {
t.Run("empty buffer", func(t *testing.T) {
agent := &Agent{
logger: zerolog.Nop(),
reportBuffer: buffer.New[agentsdocker.Report](5),
}
agent.flushBuffer(context.Background())
})
t.Run("send report error stops", func(t *testing.T) {
agent := &Agent{
logger: zerolog.Nop(),
targets: []TargetConfig{{URL: "http://example", Token: "token"}},
httpClients: map[bool]*http.Client{
false: {Transport: roundTripFunc(func(*http.Request) (*http.Response, error) {
return nil, errors.New("send failed")
})},
},
reportBuffer: buffer.New[agentsdocker.Report](5),
}
agent.reportBuffer.Push(agentsdocker.Report{Agent: agentsdocker.AgentInfo{ID: "queued"}})
agent.flushBuffer(context.Background())
if agent.reportBuffer.Len() != 1 {
t.Fatalf("expected buffered report to remain")
}
})
t.Run("stop requested halts flush", func(t *testing.T) {
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusBadRequest)
_, _ = w.Write([]byte(`{"error":"host was removed","code":"invalid_report"}`))
}))
defer server.Close()
agent := &Agent{
logger: zerolog.Nop(),
hostID: "host1",
targets: []TargetConfig{{URL: server.URL, Token: "token"}},
httpClients: map[bool]*http.Client{
false: server.Client(),
},
reportBuffer: buffer.New[agentsdocker.Report](5),
}
agent.reportBuffer.Push(agentsdocker.Report{Agent: agentsdocker.AgentInfo{ID: "queued"}})
agent.flushBuffer(context.Background())
if agent.reportBuffer.Len() != 1 {
t.Fatalf("expected buffered report to remain on stop")
}
})
t.Run("drains buffer", func(t *testing.T) {
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK)
_, _ = w.Write([]byte(`{}`))
}))
defer server.Close()
agent := &Agent{
logger: zerolog.Nop(),
targets: []TargetConfig{{URL: server.URL, Token: "token"}},
httpClients: map[bool]*http.Client{
false: server.Client(),
},
reportBuffer: buffer.New[agentsdocker.Report](5),
}
agent.reportBuffer.Push(agentsdocker.Report{Agent: agentsdocker.AgentInfo{ID: "queued"}})
agent.reportBuffer.Push(agentsdocker.Report{Agent: agentsdocker.AgentInfo{ID: "queued2"}})
agent.flushBuffer(context.Background())
if agent.reportBuffer.Len() != 0 {
t.Fatalf("expected buffer to be drained")
}
})
}