Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 19 additions & 2 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down Expand Up @@ -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)

Expand All @@ -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("===========================================================")
Expand Down
91 changes: 91 additions & 0 deletions main_welcome_test.go
Original file line number Diff line number Diff line change
@@ -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)
}
}
}