Skip to content

Commit

Permalink
E2E Tests for GameServer Player Tracking (googleforgames#1541)
Browse files Browse the repository at this point in the history
* E2E Tests for GameServer Player Tracking

Updated the udp-simple example to accept various player tracking
commands, and also implemented e2e tests to test it working on a
singular GameServer instance.

Work on googleforgames#1507
  • Loading branch information
markmandel authored and ilkercelikyilmaz committed Oct 23, 2020
1 parent aad9d70 commit 4c502f3
Show file tree
Hide file tree
Showing 5 changed files with 110 additions and 0 deletions.
4 changes: 4 additions & 0 deletions build/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -57,9 +57,13 @@ KIND_PROFILE ?= agones
KIND_CONTAINER_NAME=$(KIND_PROFILE)-control-plane

# Game Server image to use while doing end-to-end tests
<<<<<<< HEAD
GS_TEST_IMAGE ?= gcr.io/agones-images/simple-game-server:0.1

ALPHA_FEATURE_GATES ?= "PlayerTracking=true&SDKWatchSendOnExecute=true&RollingUpdateOnReady=true"
=======
GS_TEST_IMAGE ?= gcr.io/agones-images/udp-server:0.20
>>>>>>> d60a566e (E2E Tests for GameServer Player Tracking (#1541))

ALL_FEATURE_GATES ?= "PlayerTracking=true&ContainerPortAllocation=true"

Expand Down
4 changes: 4 additions & 0 deletions examples/simple-udp/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,11 @@ REPOSITORY = gcr.io/agones-scale-test-1

mkfile_path := $(abspath $(lastword $(MAKEFILE_LIST)))
project_path := $(dir $(mkfile_path))
<<<<<<< HEAD
server_tag = $(REPOSITORY)/udp-server:0.21
=======
server_tag = $(REPOSITORY)/udp-server:0.20
>>>>>>> d60a566e (E2E Tests for GameServer Player Tracking (#1541))
root_path = $(realpath $(project_path)/../..)

# _____ _
Expand Down
4 changes: 4 additions & 0 deletions examples/simple-udp/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -217,7 +217,11 @@ func readWriteLoop(conn net.PacketConn, stop chan struct{}, s *sdk.SDK) {
continue
case 2:
if cap, err := strconv.Atoi(parts[1]); err != nil {
<<<<<<< HEAD
respond(conn, sender, fmt.Sprintf("ERROR: %s\n", err))
=======
respond(conn, sender, err.Error()+"\n")
>>>>>>> d60a566e (E2E Tests for GameServer Player Tracking (#1541))
continue
} else {
setPlayerCapacity(s, int64(cap))
Expand Down
24 changes: 24 additions & 0 deletions test/e2e/framework/framework.go
Original file line number Diff line number Diff line change
Expand Up @@ -171,18 +171,27 @@ func ParseTestFlags() error {
// NewFromFlags sets up the testing framework with the standard command line flags.
func NewFromFlags() (*Framework, error) {
<<<<<<< HEAD
<<<<<<< HEAD
=======
>>>>>>> d60a566e (E2E Tests for GameServer Player Tracking (#1541))
usr, err := user.Current()
if err != nil {
return nil, err
}

<<<<<<< HEAD
viper.SetDefault(kubeconfigFlag, filepath.Join(usr.HomeDir, ".kube", "config"))
viper.SetDefault(gsimageFlag, "gcr.io/agones-images/simple-game-server:0.1")
=======
viper.SetDefault(kubeconfigFlag, filepath.Join(usr.HomeDir, "/.kube/config"))
viper.SetDefault(gsimageFlag, "gcr.io/agones-images/udp-server:0.20")
>>>>>>> d60a566e (E2E Tests for GameServer Player Tracking (#1541))
viper.SetDefault(pullSecretFlag, "")
viper.SetDefault(stressTestLevelFlag, 0)
viper.SetDefault(perfOutputDirFlag, "")
viper.SetDefault(versionFlag, "")
viper.SetDefault(runtime.FeatureGateFlag, "")
<<<<<<< HEAD
viper.SetDefault(namespaceFlag, "")

pflag.String(kubeconfigFlag, viper.GetString(kubeconfigFlag), "kube config path, e.g. $HOME/.kube/config")
Expand All @@ -192,6 +201,15 @@ func NewFromFlags() (*Framework, error) {
pflag.String(perfOutputDirFlag, viper.GetString(perfOutputDirFlag), "write performance statistics to the specified directory")
pflag.String(versionFlag, viper.GetString(versionFlag), "agones controller version to be tested, consists of release version plus a short hash of the latest commit")
pflag.String(namespaceFlag, viper.GetString(namespaceFlag), "namespace is used to isolate test runs to their own namespaces")
=======

kubeconfig := pflag.String(kubeconfigFlag, viper.GetString(kubeconfigFlag), "kube config path, e.g. $HOME/.kube/config")
gsimage := pflag.String(gsimageFlag, viper.GetString(gsimageFlag), "gameserver image to use for those tests, gcr.io/agones-images/udp-server:0.20")
pullSecret := pflag.String(pullSecretFlag, viper.GetString(pullSecretFlag), "optional secret to be used for pulling the gameserver and/or Agones SDK sidecar images")
stressTestLevel := pflag.Int(stressTestLevelFlag, viper.GetInt(stressTestLevelFlag), "enable stress test at given level 0-100")
perfOutputDir := pflag.String(perfOutputDirFlag, viper.GetString(perfOutputDirFlag), "write performance statistics to the specified directory")
version := pflag.String(versionFlag, viper.GetString(versionFlag), "agones controller version to be tested, consists of release version plus a short hash of the latest commit")
>>>>>>> d60a566e (E2E Tests for GameServer Player Tracking (#1541))
runtime.FeaturesBindFlags()
pflag.Parse()

Expand All @@ -202,11 +220,15 @@ func NewFromFlags() (*Framework, error) {
runtime.Must(viper.BindEnv(stressTestLevelFlag))
runtime.Must(viper.BindEnv(perfOutputDirFlag))
runtime.Must(viper.BindEnv(versionFlag))
<<<<<<< HEAD
runtime.Must(viper.BindEnv(namespaceFlag))
=======
>>>>>>> d60a566e (E2E Tests for GameServer Player Tracking (#1541))
runtime.Must(viper.BindPFlags(pflag.CommandLine))
runtime.Must(runtime.FeaturesBindEnv())
runtime.Must(runtime.ParseFeaturesFromEnv())

<<<<<<< HEAD
framework, err := New(viper.GetString(kubeconfigFlag))
=======
usr, _ := user.Current()
Expand All @@ -221,6 +243,8 @@ func NewFromFlags() (*Framework, error) {
version := flag.String("version", "", "agones controller version to be tested, consists of release version plus a short hash of the latest commit")

flag.Parse()
=======
>>>>>>> d60a566e (E2E Tests for GameServer Player Tracking (#1541))
framework, err := New(*kubeconfig)
>>>>>>> 40103599 (Be able to run individual e2e tests in Intellij (#1506))
if err != nil {
Expand Down
74 changes: 74 additions & 0 deletions test/e2e/gameserver_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -787,18 +787,27 @@ func TestGameServerSetPlayerCapacity(t *testing.T) {
t.Parallel()

t.Run("no initial capacity set", func(t *testing.T) {
<<<<<<< HEAD
gs := framework.DefaultGameServer(framework.Namespace)
gs, err := framework.CreateGameServerAndWaitUntilReady(framework.Namespace, gs)
=======
gs := framework.DefaultGameServer(defaultNs)
gs, err := framework.CreateGameServerAndWaitUntilReady(defaultNs, gs)
>>>>>>> d60a566e (E2E Tests for GameServer Player Tracking (#1541))
if err != nil {
t.Fatalf("Could not get a GameServer ready: %v", err)
}
assert.Equal(t, gs.Status.State, agonesv1.GameServerStateReady)
assert.Equal(t, int64(0), gs.Status.Players.Capacity)

reply, err := e2eframework.SendGameServerUDP(gs, "PLAYER_CAPACITY")
<<<<<<< HEAD
if err != nil {
t.Fatalf("Could not message GameServer: %v", err)
}
=======
assert.NoError(t, err)
>>>>>>> d60a566e (E2E Tests for GameServer Player Tracking (#1541))
assert.Equal(t, "0\n", reply)

reply, err = e2eframework.SendGameServerUDP(gs, "PLAYER_CAPACITY 20")
Expand All @@ -808,13 +817,21 @@ func TestGameServerSetPlayerCapacity(t *testing.T) {
assert.Equal(t, "ACK: PLAYER_CAPACITY 20\n", reply)

reply, err = e2eframework.SendGameServerUDP(gs, "PLAYER_CAPACITY")
<<<<<<< HEAD
if err != nil {
t.Fatalf("Could not message GameServer: %v", err)
}
assert.Equal(t, "20\n", reply)

err = wait.PollImmediate(time.Second, time.Minute, func() (bool, error) {
gs, err := framework.AgonesClient.AgonesV1().GameServers(framework.Namespace).Get(gs.ObjectMeta.Name, metav1.GetOptions{})
=======
assert.NoError(t, err)
assert.Equal(t, "20\n", reply)

err = wait.PollImmediate(time.Second, time.Minute, func() (bool, error) {
gs, err := framework.AgonesClient.AgonesV1().GameServers(defaultNs).Get(gs.ObjectMeta.Name, metav1.GetOptions{})
>>>>>>> d60a566e (E2E Tests for GameServer Player Tracking (#1541))
if err != nil {
return false, err
}
Expand All @@ -824,19 +841,29 @@ func TestGameServerSetPlayerCapacity(t *testing.T) {
})

t.Run("initial capacity set", func(t *testing.T) {
<<<<<<< HEAD
gs := framework.DefaultGameServer(framework.Namespace)
gs.Spec.Players = &agonesv1.PlayersSpec{InitialCapacity: 10}
gs, err := framework.CreateGameServerAndWaitUntilReady(framework.Namespace, gs)
=======
gs := framework.DefaultGameServer(defaultNs)
gs.Spec.Players = &agonesv1.PlayersSpec{InitialCapacity: 10}
gs, err := framework.CreateGameServerAndWaitUntilReady(defaultNs, gs)
>>>>>>> d60a566e (E2E Tests for GameServer Player Tracking (#1541))
if err != nil {
t.Fatalf("Could not get a GameServer ready: %v", err)
}
assert.Equal(t, gs.Status.State, agonesv1.GameServerStateReady)
assert.Equal(t, int64(10), gs.Status.Players.Capacity)

reply, err := e2eframework.SendGameServerUDP(gs, "PLAYER_CAPACITY")
<<<<<<< HEAD
if err != nil {
t.Fatalf("Could not message GameServer: %v", err)
}
=======
assert.NoError(t, err)
>>>>>>> d60a566e (E2E Tests for GameServer Player Tracking (#1541))
assert.Equal(t, "10\n", reply)

reply, err = e2eframework.SendGameServerUDP(gs, "PLAYER_CAPACITY 20")
Expand All @@ -846,13 +873,21 @@ func TestGameServerSetPlayerCapacity(t *testing.T) {
assert.Equal(t, "ACK: PLAYER_CAPACITY 20\n", reply)

reply, err = e2eframework.SendGameServerUDP(gs, "PLAYER_CAPACITY")
<<<<<<< HEAD
if err != nil {
t.Fatalf("Could not message GameServer: %v", err)
}
assert.Equal(t, "20\n", reply)

err = wait.PollImmediate(time.Second, time.Minute, func() (bool, error) {
gs, err := framework.AgonesClient.AgonesV1().GameServers(framework.Namespace).Get(gs.ObjectMeta.Name, metav1.GetOptions{})
=======
assert.NoError(t, err)
assert.Equal(t, "20\n", reply)

err = wait.PollImmediate(time.Second, time.Minute, func() (bool, error) {
gs, err := framework.AgonesClient.AgonesV1().GameServers(defaultNs).Get(gs.ObjectMeta.Name, metav1.GetOptions{})
>>>>>>> d60a566e (E2E Tests for GameServer Player Tracking (#1541))
if err != nil {
return false, err
}
Expand All @@ -870,10 +905,17 @@ func TestPlayerConnectAndDisconnect(t *testing.T) {
}
t.Parallel()

<<<<<<< HEAD
gs := framework.DefaultGameServer(framework.Namespace)
playerCount := int64(3)
gs.Spec.Players = &agonesv1.PlayersSpec{InitialCapacity: playerCount}
gs, err := framework.CreateGameServerAndWaitUntilReady(framework.Namespace, gs)
=======
gs := framework.DefaultGameServer(defaultNs)
playerCount := int64(3)
gs.Spec.Players = &agonesv1.PlayersSpec{InitialCapacity: playerCount}
gs, err := framework.CreateGameServerAndWaitUntilReady(defaultNs, gs)
>>>>>>> d60a566e (E2E Tests for GameServer Player Tracking (#1541))
if err != nil {
t.Fatalf("Could not get a GameServer ready: %v", err)
}
Expand All @@ -894,6 +936,7 @@ func TestPlayerConnectAndDisconnect(t *testing.T) {
// deliberately do this before polling, to test the SDK returning the correct
// results before it is committed to the GameServer resource.
reply, err := e2eframework.SendGameServerUDP(gs, "PLAYER_CONNECTED 1")
<<<<<<< HEAD
if err != nil {
t.Fatalf("Could not message GameServer: %v", err)
}
Expand All @@ -913,6 +956,21 @@ func TestPlayerConnectAndDisconnect(t *testing.T) {

err = wait.Poll(time.Second, time.Minute, func() (bool, error) {
gs, err = framework.AgonesClient.AgonesV1().GameServers(framework.Namespace).Get(gs.ObjectMeta.Name, metav1.GetOptions{})
=======
assert.NoError(t, err)
assert.Equal(t, "true\n", reply)

reply, err = e2eframework.SendGameServerUDP(gs, "GET_PLAYERS")
assert.NoError(t, err)
assert.ElementsMatch(t, []string{"1", "2", "3"}, strings.Split(strings.TrimSpace(reply), ","))

reply, err = e2eframework.SendGameServerUDP(gs, "PLAYER_COUNT")
assert.NoError(t, err)
assert.Equal(t, "3\n", reply)

err = wait.Poll(time.Second, time.Minute, func() (bool, error) {
gs, err = framework.AgonesClient.AgonesV1().GameServers(defaultNs).Get(gs.ObjectMeta.Name, metav1.GetOptions{})
>>>>>>> d60a566e (E2E Tests for GameServer Player Tracking (#1541))
if err != nil {
return false, err
}
Expand All @@ -930,6 +988,7 @@ func TestPlayerConnectAndDisconnect(t *testing.T) {
assert.Equal(t, "ACK: PLAYER_DISCONNECT 2\n", reply)

reply, err = e2eframework.SendGameServerUDP(gs, "PLAYER_CONNECTED 2")
<<<<<<< HEAD
if err != nil {
t.Fatalf("Could not message GameServer: %v", err)
}
Expand All @@ -949,6 +1008,21 @@ func TestPlayerConnectAndDisconnect(t *testing.T) {

err = wait.Poll(time.Second, time.Minute, func() (bool, error) {
gs, err = framework.AgonesClient.AgonesV1().GameServers(framework.Namespace).Get(gs.ObjectMeta.Name, metav1.GetOptions{})
=======
assert.NoError(t, err)
assert.Equal(t, "false\n", reply)

reply, err = e2eframework.SendGameServerUDP(gs, "GET_PLAYERS")
assert.NoError(t, err)
assert.ElementsMatch(t, []string{"1", "3"}, strings.Split(strings.TrimSpace(reply), ","))

reply, err = e2eframework.SendGameServerUDP(gs, "PLAYER_COUNT")
assert.NoError(t, err)
assert.Equal(t, "2\n", reply)

err = wait.Poll(time.Second, time.Minute, func() (bool, error) {
gs, err = framework.AgonesClient.AgonesV1().GameServers(defaultNs).Get(gs.ObjectMeta.Name, metav1.GetOptions{})
>>>>>>> d60a566e (E2E Tests for GameServer Player Tracking (#1541))
if err != nil {
return false, err
}
Expand Down

0 comments on commit 4c502f3

Please sign in to comment.