From 4e84594ffbd5e2080a9bb208deecbc7babdc860a Mon Sep 17 00:00:00 2001 From: yseto Date: Mon, 27 Feb 2023 15:10:31 +0000 Subject: [PATCH 1/6] fix dequeue on dry-run --- notification/queue.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/notification/queue.go b/notification/queue.go index 33cffc4..477ca34 100644 --- a/notification/queue.go +++ b/notification/queue.go @@ -48,12 +48,12 @@ func (q *Queue) Dequeue(ctx context.Context) { item := e.Value.(Item) if q.client == nil { log.Printf("receive %q %q\n", item.Addr, item.Message) - return - } - err := q.send(item) - if err != nil { - log.Println(err) - return + } else { + err := q.send(item) + if err != nil { + log.Println(err) + return + } } q.m.Lock() q.q.Remove(e) From 7963d246a3fef436091ad8c13f249de2187bbcb5 Mon Sep 17 00:00:00 2001 From: yseto Date: Mon, 27 Feb 2023 15:51:40 +0000 Subject: [PATCH 2/6] replace a testable client interface --- notification/queue.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/notification/queue.go b/notification/queue.go index 477ca34..eebf142 100644 --- a/notification/queue.go +++ b/notification/queue.go @@ -11,10 +11,14 @@ import ( "github.com/mackerelio/mackerel-client-go" ) +type Client interface { + PostCheckReports(crs *mackerel.CheckReports) error +} + type Queue struct { q *list.List m sync.Mutex - client *mackerel.Client + client Client hostId string } @@ -25,7 +29,7 @@ type Item struct { } // NewQueue is needed mackerel client, host id. -func NewQueue(client *mackerel.Client, hostId string) *Queue { +func NewQueue(client Client, hostId string) *Queue { return &Queue{ q: list.New(), client: client, From 7c9dde662a40ca223b75eee04b8764a5c9130146 Mon Sep 17 00:00:00 2001 From: yseto Date: Mon, 27 Feb 2023 15:52:51 +0000 Subject: [PATCH 3/6] added tests for queue. --- notification/queue_test.go | 132 +++++++++++++++++++++++++++++++++++++ 1 file changed, 132 insertions(+) create mode 100644 notification/queue_test.go diff --git a/notification/queue_test.go b/notification/queue_test.go new file mode 100644 index 0000000..a8deecf --- /dev/null +++ b/notification/queue_test.go @@ -0,0 +1,132 @@ +package notification + +import ( + "bytes" + "context" + "fmt" + "io" + "log" + "os" + "strings" + "testing" + + "github.com/mackerelio/mackerel-client-go" +) + +type mockClient struct { + reports *mackerel.CheckReports +} + +func (m *mockClient) PostCheckReports(crs *mackerel.CheckReports) error { + m.reports = crs + return nil +} + +func TestRoundOffMessage(t *testing.T) { + log.SetOutput(io.Discard) + log.SetFlags(0) + defer func() { + log.SetOutput(os.Stderr) + log.SetFlags(log.LstdFlags) + }() + + client := &mockClient{} + + msg := strings.Repeat("a", 2048) + + q := NewQueue(client, "") + q.Enqueue(Item{OccurredAt: 1, Addr: "192.0.2.1", Message: msg}) + ctx := context.Background() + q.Dequeue(ctx) + + report := client.reports.Reports[0] + + if len(report.Message) != 1024 { + t.Error("invalid round Message") + } +} + +func TestQueue(t *testing.T) { + client := &mockClient{} + q := NewQueue(client, "") + q.Enqueue(Item{OccurredAt: 1, Addr: "192.0.2.1", Message: "message"}) + ctx := context.Background() + q.Dequeue(ctx) + + report := client.reports.Reports[0] + + if report.Name != "sabatrapd 192.0.2.1" { + t.Error("invalid Name") + } + if report.Status != "WARNING" { + t.Error("invalid Status") + } + if report.Message != "message" { + t.Error("invalid Message") + } + if report.OccurredAt != 1 { + t.Error("invalid OccurredAt") + } +} + +func DryRunQueue() { + q := NewQueue(nil, "") + q.Enqueue(Item{OccurredAt: 1, Addr: "192.0.2.1", Message: "message"}) + + ctx := context.Background() + q.Dequeue(ctx) +} + +func TestDryRunQueue(t *testing.T) { + var buf bytes.Buffer + log.SetOutput(&buf) + log.SetFlags(0) + defer func() { + log.SetOutput(os.Stderr) + log.SetFlags(log.LstdFlags) + }() + DryRunQueue() + actual := buf.String() + expected := `receive "192.0.2.1" "message"` + "\n" + if actual != expected { + t.Errorf("log is invalid. get %q, want %q", actual, expected) + } +} + +type mockErrorClient struct { + reports *mackerel.CheckReports +} + +func (m *mockErrorClient) PostCheckReports(crs *mackerel.CheckReports) error { + return fmt.Errorf("error %s", crs.Reports[0].Message) +} + +func QueueClientError(t *testing.T) { + client := &mockErrorClient{} + q := NewQueue(client, "") + q.Enqueue(Item{OccurredAt: 1, Addr: "192.0.2.1", Message: "message"}) + ctx := context.Background() + q.Dequeue(ctx) + + actual := q.q.Len() + expected := 1 + if actual != expected { + t.Errorf("queue length is invalid. want %d, get %d", expected, actual) + } +} + +func TestQueueClientError(t *testing.T) { + var buf bytes.Buffer + log.SetOutput(&buf) + log.SetFlags(0) + defer func() { + log.SetOutput(os.Stderr) + log.SetFlags(log.LstdFlags) + }() + QueueClientError(t) + actual := buf.String() + expected := `error message` + "\n" + if actual != expected { + t.Errorf("log is invalid. get %q, want %q", actual, expected) + } +} From bcc767d4cacb0467414ca50c43d1ccf565670100 Mon Sep 17 00:00:00 2001 From: yseto Date: Mon, 27 Feb 2023 15:56:10 +0000 Subject: [PATCH 4/6] fix errcheck --- charset/charset_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/charset/charset_test.go b/charset/charset_test.go index e57a9ba..a1b579d 100644 --- a/charset/charset_test.go +++ b/charset/charset_test.go @@ -28,8 +28,8 @@ func TestAdd(t *testing.T) { func TestDecoder(t *testing.T) { d := NewDecoder() - d.Register("192.0.2.1", "utf-8") - d.Register("192.0.2.2", "shift-jis") + _ = d.Register("192.0.2.1", "utf-8") + _ = d.Register("192.0.2.2", "shift-jis") t.Run("select utf-8", func(t *testing.T) { actual, err := d.Decode("192.0.2.1", []byte{0x48, 0x65, 0x6c, 0x6c, 0x6f}) From 8b3aeca2498cfbf2f2338fa5f0af73957479636a Mon Sep 17 00:00:00 2001 From: yseto Date: Mon, 27 Feb 2023 16:00:45 +0000 Subject: [PATCH 5/6] added tests on ci --- .github/workflows/test.yml | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 .github/workflows/test.yml diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..31eebca --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,32 @@ +--- +name: test + +on: + push: + branches: + - main + tags: + - v* + pull_request: +env: + DEBIAN_FRONTEND: noninteractive +jobs: + lint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: golangci/golangci-lint-action@v3 + test: + runs-on: ubuntu-latest + steps: + - uses: actions/setup-go@v3 + with: + go-version: "1.19.x" + - uses: actions/checkout@v3 + - uses: actions/cache@v3 + with: + path: ~/go/pkg/mod + key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} + restore-keys: | + ${{ runner.os }}-go- + - run: go test -v ./... From 0f5ad53998b93772310511a634a47df7f7a2df20 Mon Sep 17 00:00:00 2001 From: yseto Date: Mon, 27 Feb 2023 16:02:58 +0000 Subject: [PATCH 6/6] fix lint --- notification/queue_test.go | 1 - 1 file changed, 1 deletion(-) diff --git a/notification/queue_test.go b/notification/queue_test.go index a8deecf..a59700b 100644 --- a/notification/queue_test.go +++ b/notification/queue_test.go @@ -94,7 +94,6 @@ func TestDryRunQueue(t *testing.T) { } type mockErrorClient struct { - reports *mackerel.CheckReports } func (m *mockErrorClient) PostCheckReports(crs *mackerel.CheckReports) error {