From 32b2817fb2d5f9fbc17d8ef520373c12e214b579 Mon Sep 17 00:00:00 2001 From: Fabrice Kabongo <4486484+fabricekabongo@users.noreply.github.com> Date: Sun, 30 Nov 2025 01:02:53 +0400 Subject: [PATCH] Add tests for welcome message output --- main.go | 21 +++++++++- main_welcome_test.go | 91 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 110 insertions(+), 2 deletions(-) create mode 100644 main_welcome_test.go diff --git a/main.go b/main.go index 38e4ede..d78b48d 100644 --- a/main.go +++ b/main.go @@ -16,8 +16,25 @@ import ( "github.com/fabricekabongo/loggerhead/query" "github.com/fabricekabongo/loggerhead/server" "github.com/fabricekabongo/loggerhead/world" + "github.com/hashicorp/memberlist" ) +type nodeInfoProvider interface { + LocalNode() *memberlist.Node +} + +type clusterInfo interface { + MemberList() nodeInfoProvider +} + +type clusterAdapter struct { + cluster *clustering.Cluster +} + +func (c clusterAdapter) MemberList() nodeInfoProvider { + return c.cluster.MemberList() +} + func main() { ctx := context.Background() @@ -60,7 +77,7 @@ func main() { defer svr.Stop() - printWelcomeMessage(cfg, cluster) + printWelcomeMessage(cfg, clusterAdapter{cluster: cluster}) sigc := make(chan os.Signal, 1) signal.Notify(sigc, syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT) @@ -83,7 +100,7 @@ func main() { svr.Start() } -func printWelcomeMessage(cfg config.Config, cluster *clustering.Cluster) { +func printWelcomeMessage(cfg config.Config, cluster clusterInfo) { fmt.Println("===========================================================") fmt.Println("Starting the Database Server") fmt.Println("===========================================================") diff --git a/main_welcome_test.go b/main_welcome_test.go new file mode 100644 index 0000000..1bdf19c --- /dev/null +++ b/main_welcome_test.go @@ -0,0 +1,91 @@ +package main + +import ( + "bytes" + "net" + "os" + "strings" + "testing" + "time" + + "github.com/fabricekabongo/loggerhead/clustering" + "github.com/fabricekabongo/loggerhead/config" + "github.com/hashicorp/memberlist" +) + +type stubMemberList struct { + node *memberlist.Node +} + +func (s stubMemberList) LocalNode() *memberlist.Node { + return s.node +} + +type stubCluster struct { + memberList nodeInfoProvider +} + +func (s stubCluster) MemberList() nodeInfoProvider { + return s.memberList +} + +func TestPrintWelcomeMessage(t *testing.T) { + cfg := config.Config{ + ClusterDNS: "cluster.local", + MaxConnections: 15, + SeedNode: "10.0.0.1", + ReadPort: 1111, + WritePort: 2222, + HttpPort: 3333, + ClusterPort: 4444, + MaxEOFWait: 5 * time.Second, + } + + cluster := stubCluster{ + memberList: stubMemberList{node: &memberlist.Node{ + Name: "node-1", + Addr: net.ParseIP("192.168.0.1"), + State: memberlist.StateAlive, + }}, + } + + readEnd, writeEnd, err := os.Pipe() + if err != nil { + t.Fatalf("failed to create pipe: %v", err) + } + + originalStdout := os.Stdout + os.Stdout = writeEnd + defer func() { + os.Stdout = originalStdout + }() + + printWelcomeMessage(cfg, cluster) + writeEnd.Close() + + var output bytes.Buffer + if _, err := output.ReadFrom(readEnd); err != nil { + t.Fatalf("failed to read output: %v", err) + } + + got := output.String() + expectedSnippets := []string{ + "Read Port: 1111", + "Write Port: 2222", + "Cluster Port: 4444", + "Admin & Prometheus Port: 3333", + "Max Connections: 15", + "Max EOF Wait: 5s", + "Cluster DNS: cluster.local", + "Seed Node: 10.0.0.1", + "My IP: 192.168.0.1", + "Node Name: node-1", + "Node State: " + clustering.StateToString(memberlist.StateAlive), + } + + for _, snippet := range expectedSnippets { + if !strings.Contains(got, snippet) { + t.Fatalf("expected output to contain %q, got %q", snippet, got) + } + } +}