package main import ( "code.google.com/p/go.net/websocket" "encoding/json" "log" "net/http" "testing" ) type result struct { b bool msg string } type clientIDTest struct { clientid ClientID expected result } var clientIDTests = []clientIDTest{ {ClientID{Type: "robot"}, result{true, ""}}, {ClientID{Type: "spectator"}, result{true, ""}}, {ClientID{Type: "schmarglenoggler"}, result{false, "usergent must be 'robot' or 'spectator'"}}, } func TestClientIDs(t *testing.T) { for _, tt := range clientIDTests { v, msg := tt.clientid.Valid() actual := result{v, msg} if actual.b != tt.expected.b || actual.msg != tt.expected.msg { t.Errorf("%+v: expected %v, actual %v", tt.clientid, tt.expected, actual) } } } func TestClientIDParse(t *testing.T) { var s ClientID err := json.Unmarshal( []byte(`{ "type": "robot", "name": "dummy", "id": "24601", "useragent": "gorobots.js" }`), &s) if err != nil { t.Errorf("fail to parse: %v", err) } } var handled bool func DummyServer() (*websocket.Conn, error) { if !handled { http.Handle("/ws/", websocket.Handler(addPlayer)) handled = true } g = NewGame() go g.run() go http.ListenAndServe(*addr, nil) origin := "http://localhost/" url := "ws://localhost:8666/ws/" return websocket.Dial(url, "", origin) } func TestGoodProtocol(t *testing.T) { ws, err := DummyServer() var idreq IdRequest err = websocket.JSON.Receive(ws, &idreq) if err != nil { t.Errorf("fail: %v", err) } err = websocket.JSON.Send(ws, ClientID{ "robot", "smcquay test robot 2", "unittest", }) if err != nil { t.Error(err) } var gameparam GameParam err = websocket.JSON.Receive(ws, &gameparam) if gameparam.Type != "gameparam" { t.Errorf("didn't receive a good gameparam") } err = websocket.JSON.Send(ws, &Config{ "bogus", stats{ Hp: 200, Speed: 100, WeaponRadius: 50, ScannerRadius: 50, }, }) var handshake Handshake websocket.JSON.Receive(ws, &handshake) if !handshake.Success { t.Errorf("failed to validate correct stats request") } } func TestTooManyStatsProtocol(t *testing.T) { ws, err := DummyServer() var idreq IdRequest err = websocket.JSON.Receive(ws, &idreq) if err != nil { t.Errorf("fail: %v", err) } err = websocket.JSON.Send(ws, ClientID{ "robot", "smcquay test robot", "unittest", }) if err != nil { t.Error(err) } var gameparam GameParam err = websocket.JSON.Receive(ws, &gameparam) if gameparam.Type != "gameparam" { t.Errorf("didn't receive a good gameparam") } err = websocket.JSON.Send(ws, &Config{ "bogus", stats{ Hp: 200, Speed: 100, WeaponRadius: 150, ScannerRadius: 150, }, }) var handshake Handshake websocket.JSON.Receive(ws, &handshake) if handshake.Success { t.Errorf("failed to detect bad stats request") } } func TestBadUseragent(t *testing.T) { ws, err := DummyServer() var idreq IdRequest err = websocket.JSON.Receive(ws, &idreq) if err != nil { t.Errorf("fail: %v", err) } err = websocket.JSON.Send(ws, ClientID{ "shitsnacks", "smcquay test robot", "unittest", }) if err != nil { t.Error(err) } var gameparam GameParam err = websocket.JSON.Receive(ws, &gameparam) if gameparam.Type != "failure" { t.Errorf("tried sending bad type, didn't detect it") } }