blob: 63c67f53247be36b7214f96aec223c5b4fbe09d3 [file] [log] [blame]
package impl_test
import (
"testing"
rps "veyron/examples/rockpaperscissors"
"veyron/examples/rockpaperscissors/impl"
"veyron/runtimes/google/naming/mounttable"
mtlib "veyron/services/mounttable/lib"
"veyron2"
"veyron2/ipc"
"veyron2/naming"
"veyron2/rt"
"veyron2/vlog"
)
func startMountTable(t *testing.T, runtime veyron2.Runtime) (string, func()) {
server, err := runtime.NewServer()
if err != nil {
t.Fatalf("NewServer() failed: %v", err)
}
dispatcher, err := mtlib.NewMountTable("")
suffix := "mt"
if err := server.Register(suffix, dispatcher); err != nil {
t.Fatalf("Register(%v, %v) failed: %v", suffix, dispatcher, err)
}
protocol, hostname := "tcp", "localhost:0"
endpoint, err := server.Listen(protocol, hostname)
if err != nil {
t.Fatalf("Listen(%v, %v) failed: %v", protocol, hostname, err)
}
address := naming.JoinAddressName(endpoint.String(), suffix)
vlog.VI(1).Infof("Mount table running at endpoint: %s", address)
return address, func() {
if err := server.Stop(); err != nil {
t.Fatalf("Stop() failed: %v", err)
}
}
}
func startRockPaperScissors(t *testing.T, rt veyron2.Runtime, mtAddress string) (*impl.RPS, func()) {
mt, err := mounttable.New(rt, mtAddress)
if err != nil {
t.Fatalf("mounttable.New failed: %v", err)
}
server, err := rt.NewServer(veyron2.MountTable(mt))
if err != nil {
t.Fatalf("NewServer failed: %v", err)
}
rpsService := impl.NewRPS(mt)
if err := server.Register("", ipc.SoloDispatcher(rps.NewServerRockPaperScissors(rpsService), nil)); err != nil {
t.Fatalf("Register failed: %v", err)
}
if _, err = server.Listen("tcp", "localhost:0"); err != nil {
t.Fatalf("Listen failed: %v", err)
}
names := []string{"rps/judge/test", "rps/player/test", "rps/scorekeeper/test"}
for _, n := range names {
if err := server.Publish(n); err != nil {
t.Fatalf("Publish(%v) failed: %v", n, err)
}
}
return rpsService, func() {
if err := server.Stop(); err != nil {
t.Fatalf("Stop() failed: %v", err)
}
}
}
// TestRockPaperScissorsImpl runs one rock-paper-scissors game and verifies
// that all the counters are consistent.
func TestRockPaperScissorsImpl(t *testing.T) {
runtime := rt.Init()
defer runtime.Shutdown()
mtAddress, mtStop := startMountTable(t, runtime)
defer mtStop()
rpsService, rpsStop := startRockPaperScissors(t, runtime, mtAddress)
defer rpsStop()
if err := rpsService.Player().InitiateGame(); err != nil {
t.Errorf("Failed to initiate game: %v", err)
}
// There was only one game, but the player played twice. So, we
// expected the player to show that it played 2 games, and won 1.
played, won := rpsService.Player().Stats()
if want, got := int64(2), played; want != got {
t.Errorf("Unexpected number of played games. Got %d, want %d", got, want)
}
if want, got := int64(1), won; want != got {
t.Errorf("Unexpected number of won games. Got %d, want %d", got, want)
}
// The Judge ran exactly one game.
if want, got := int64(1), rpsService.Judge().Stats(); want != got {
t.Errorf("Unexpected number of games run. Got %d, want %d", got, want)
}
// The Score Keeper received one score card.
if want, got := int64(1), rpsService.ScoreKeeper().Stats(); want != got {
t.Errorf("Unexpected number of score cards. Got %d, want %d", got, want)
}
}