diff --git a/cmd/main_test.go b/cmd/main_test.go index 3ecb4db4..bad8dc8d 100644 --- a/cmd/main_test.go +++ b/cmd/main_test.go @@ -128,7 +128,7 @@ func initClient(t *testing.T, host string) (client *cws.Client) { if err != nil { panic(err) } - log.Println("return offer", offer) + log.Println("return offer") return cws.WSPacket{ ID: "initwebrtc", Data: gamertc.Encode(offer), @@ -340,66 +340,70 @@ func TestReconnectRoomNoOverlord(t *testing.T) { } // This test currently doesn't work -//func TestReconnectRoomWithOverlord(t *testing.T) { -//o := initOverlord() -//defer o.Close() +func TestReconnectRoomWithOverlord(t *testing.T) { + o := initOverlord() + defer o.Close() -//oconn := connectTestOverlordServer(t, o.URL) -//defer oconn.Close() -//// Init slave server -//s := initServer(t, oconn) + oconn := connectTestOverlordServer(t, o.URL) + // Init slave server + s := initServer(t, oconn) -//client := initClient(t, s.URL) + client := initClient(t, s.URL) -//fmt.Println("Sending start...") -//roomID := make(chan string) -//client.Send(cws.WSPacket{ -//ID: "start", -//Data: "Contra.nes", -//RoomID: "", -//PlayerIndex: 1, -//}, func(resp cws.WSPacket) { -//fmt.Println("RoomID:", resp.RoomID) -//roomID <- resp.RoomID -//}) + fmt.Println("Sending start...") + roomID := make(chan string) + client.Send(cws.WSPacket{ + ID: "start", + Data: "Contra.nes", + RoomID: "", + PlayerIndex: 1, + }, func(resp cws.WSPacket) { + fmt.Println("RoomID:", resp.RoomID) + roomID <- resp.RoomID + }) -//saveRoomID := <-roomID -//if saveRoomID == "" { -//fmt.Println("RoomID should not be empty") -//t.Fail() -//} + saveRoomID := <-roomID + if saveRoomID == "" { + fmt.Println("RoomID should not be empty") + t.Fail() + } -//log.Println("Closing room and server") -//client.Close() -//s.Close() -//// Close server and reconnect + log.Println("Closing room and server") + client.Close() + s.Close() + oconn.Close() -//log.Println("Server respawn") -//// Init slave server -//s = initServer(t, oconn) -//defer s.Close() + time.Sleep(time.Second) + // Close server and reconnect -//client = initClient(t, s.URL) -//defer client.Close() + log.Println("Server respawn") + // Init slave server again + oconn = connectTestOverlordServer(t, o.URL) + defer oconn.Close() + s = initServer(t, oconn) + defer s.Close() -//fmt.Println("Re-access room ", saveRoomID) -//roomID = make(chan string) -//client.Send(cws.WSPacket{ -//ID: "start", -//Data: "Contra.nes", -//RoomID: saveRoomID, -//PlayerIndex: 1, -//}, func(resp cws.WSPacket) { -//fmt.Println("RoomID:", resp.RoomID) -//roomID <- resp.RoomID -//}) + client = initClient(t, s.URL) + defer client.Close() -//respRoomID := <-roomID -//if respRoomID == "" || respRoomID != saveRoomID { -//fmt.Println("The room ID should be equal to the saved room") -//t.Fail() -//} + fmt.Println("Re-access room ", saveRoomID) + roomID = make(chan string) + client.Send(cws.WSPacket{ + ID: "start", + Data: "Contra.nes", + RoomID: saveRoomID, + PlayerIndex: 1, + }, func(resp cws.WSPacket) { + fmt.Println("RoomID:", resp.RoomID) + roomID <- resp.RoomID + }) -//fmt.Println("Done") + respRoomID := <-roomID + if respRoomID == "" || respRoomID != saveRoomID { + fmt.Println("The room ID should be equal to the saved room") + t.Fail() + } -//} + time.Sleep(time.Second) + fmt.Println("Done") +} diff --git a/overlord/overlord.go b/overlord/overlord.go index 37b0d8a3..4b7cfb5e 100644 --- a/overlord/overlord.go +++ b/overlord/overlord.go @@ -21,7 +21,9 @@ var upgrader = websocket.Upgrader{} func NewServer() *Server { return &Server{ - servers: map[string]*cws.Client{}, + // Mapping serverID to client + servers: map[string]*cws.Client{}, + // Mapping roomID to server roomToServer: map[string]string{}, } } @@ -34,8 +36,6 @@ func (o *Server) WSO(w http.ResponseWriter, r *http.Request) { log.Print("Overlord: [!] WS upgrade:", err) return } - defer c.Close() - // Register new server serverID := strconv.Itoa(rand.Int()) log.Println("Overlord: A new server connected to Overlord", serverID) @@ -43,12 +43,7 @@ func (o *Server) WSO(w http.ResponseWriter, r *http.Request) { // Register to servers map the client connection client := cws.NewClient(c) o.servers[serverID] = client - - //wssession := &Session{ - //client: client, - //peerconnection: webrtc.NewWebRTC(), - //// The server session is maintaining - //} + defer o.cleanConnection(client, serverID) // Sendback the ID to server client.Send( @@ -72,6 +67,7 @@ func (o *Server) WSO(w http.ResponseWriter, r *http.Request) { // getRoom returns the server ID based on requested roomID. client.Receive("getRoom", func(resp cws.WSPacket) cws.WSPacket { log.Println("Overlord: Received a getroom request") + log.Println("Result: ", o.roomToServer[resp.Data]) return cws.WSPacket{ ID: "getRoom", Data: o.roomToServer[resp.Data], @@ -142,3 +138,17 @@ func (o *Server) WSO(w http.ResponseWriter, r *http.Request) { client.Listen() } + +func (o *Server) cleanConnection(client *cws.Client, serverID string) { + log.Println("Unregister server from overlord") + // Remove serverID from servers + delete(o.servers, serverID) + // Clean all rooms connecting to that server + for roomID, roomServer := range o.roomToServer { + if roomServer == serverID { + delete(o.roomToServer, roomID) + } + } + + client.Close() +}