diff --git a/server/server.go b/server/server.go new file mode 100644 index 0000000..976028f --- /dev/null +++ b/server/server.go @@ -0,0 +1,62 @@ +package server + +import ( + "fmt" + "log" + "net/url" + "os" + "strconv" + + "github.com/BBVA/kapow/server/control" + "github.com/BBVA/kapow/server/data" + "github.com/BBVA/kapow/server/user" +) + +// StartServer Starts one instance of each server in a goroutine and remains listening on a channel for trace events generated by them +func StartServer(bindAddr, certfile, keyfile string, interactive bool) error { + + // Parse URI and manage parameters to extract + userBindAddr, err := url.Parse(bindAddr) + if err != nil { + return err + } + + userPort, err := strconv.ParseInt(userBindAddr.Port(), 10, 64) + if err != nil { + return fmt.Errorf("Error extracting port from provided address %s", bindAddr) + } + + if certfile != "" { + if _, err := os.Stat(certfile); err != nil { + if os.IsNotExist(err) { + return fmt.Errorf("Certfile %s does not exist", certfile) + } + } + } + + if keyfile != "" { + if _, err := os.Stat(keyfile); err != nil { + if os.IsNotExist(err) { + return fmt.Errorf("Keyfile %s does not exist", keyfile) + } + } + } + + ctrlPort := userPort + 1 + dataPort := ctrlPort + 1 + + dataServer := data.NewDataServer(userBindAddr.Host(), dataPort, certfile, keyfile) + ctrlServer := control.NewControlServer(userBindAddr.Host(), ctrlPort, certfile, keyfile) // Needs a reference to the user server in order to manage routes + userServer := user.NewUserServer(userBindAddr.Host(), controlServerPort, certfile, keyfile) // Needs a reference to the data server in order to manage handlers + + traceChannel := make(chan string) + + go ctrlServer.Start(traceChannel) + go dataServer.Start(traceChannel) + go ctrlServer.Start(traceChannel) + + // Wait for ever while writing logs + for { + log.Print(<-traceChannel) + } +} diff --git a/server/server_test.go b/server/server_test.go new file mode 100644 index 0000000..75c1b30 --- /dev/null +++ b/server/server_test.go @@ -0,0 +1,39 @@ +package server_test + +import ( + "testing" + + "github.com/BBVA/kapow/server" +) + +func TestStartServerWhenInvalidBindAddrReturnsError(t *testing.T) { + + err := server.StartServer("foo;bar", "", "", true) + if err == nil { + t.Errorf("Expected error not found") + } +} + +func TestStartServerWhenInvalidPortNumberReturnsError(t *testing.T) { + + err := server.StartServer("0.0.0.0:bar", "", "", true) + if err == nil { + t.Errorf("Expected error not found") + } +} + +func TestStartServerWhenCertfileDontExistReturnsError(t *testing.T) { + + err := server.StartServer("0.0.0.0:8080", "/notExist", "", true) + if err == nil { + t.Errorf("Expected error not found") + } +} + +func TestStartServerWhenKeyfileDontExistReturnsError(t *testing.T) { + + err := server.StartServer("0.0.0.0:8080", "", "/notExist", true) + if err == nil { + t.Errorf("Expected error not found") + } +}