Ctrl K
ComunidadGuías…

internal/caddylogs/hub_clear_test.go

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
// SPDX-License-Identifier: Apache-2.0

package caddylogs

import "testing"

// v2.35.5 (issue #60): Clear must drop only the selected server's entries,
// keep IDs monotonic so a reconnecting page's cursor stays valid, and leave
// the buffer usable afterwards. Lines use logger=admin so they stay clear of
// the certificate-projection path, which is not what's under test.
func TestHubClearDropsOnlyThatServer(t *testing.T) {
	h := New(nil)
	h.AcceptLine([]byte(`{"ts":1.0,"level":"info","logger":"admin","msg":"one","caddyui_server_id":1}`))
	h.AcceptLine([]byte(`{"ts":2.0,"level":"info","logger":"admin","msg":"two","caddyui_server_id":2}`))
	h.AcceptLine([]byte(`{"ts":3.0,"level":"info","logger":"admin","msg":"three","caddyui_server_id":1}`))
	if got := len(h.Since(0, 0, 0)); got != 3 {
		t.Fatalf("seeded %d entries, want 3", got)
	}

	if n := h.Clear(1); n != 2 {
		t.Errorf("Clear(1) removed %d entries, want 2", n)
	}
	rest := h.Since(0, 0, 0)
	if len(rest) != 1 || rest[0].ServerID != 2 || rest[0].Message != "two" {
		t.Fatalf("after Clear(1) the buffer holds %+v, want only server 2's entry", rest)
	}
	if got := h.Since(0, 1, 0); len(got) != 0 {
		t.Errorf("server 1 still has %d entries after Clear(1)", len(got))
	}

	// IDs keep counting up: a page that reconnects with its old cursor (3)
	// must neither replay purged rows nor miss the next new one.
	h.AcceptLine([]byte(`{"ts":4.0,"level":"info","logger":"admin","msg":"four","caddyui_server_id":1}`))
	fresh := h.Since(3, 1, 0)
	if len(fresh) != 1 || fresh[0].ID != 4 || fresh[0].Message != "four" {
		t.Fatalf("after Clear(1) + one new line, Since(3, server 1) = %+v; want just the new entry with ID 4", fresh)
	}

	if n := h.Clear(0); n != 2 {
		t.Errorf("Clear(0) removed %d entries, want 2 (everything left)", n)
	}
	if got := len(h.Since(0, 0, 0)); got != 0 {
		t.Errorf("Clear(0) left %d entries behind", got)
	}
	// And the buffer still accepts lines afterwards.
	h.AcceptLine([]byte(`{"ts":5.0,"level":"info","logger":"admin","msg":"five","caddyui_server_id":2}`))
	if got := h.Since(0, 2, 0); len(got) != 1 || got[0].ID != 5 {
		t.Errorf("buffer unusable after Clear(0): Since(0, server 2) = %+v", got)
	}
}