Skip to content

Commit

Permalink
Flaky: TestGameServerReserve (googleforgames#1565)
Browse files Browse the repository at this point in the history
* Flaky: TestGameServerReserve

Trying to test transitive state while it is actively changing is
fraught with peril. Tests flake, hair is pulled, and screams echo
throughout the lands.

This PR allows one to send a duration to the RESERVE command to
udp-simple, as well as update TestGameServerReserve to only confirm
concrete states, which therefore can't flake.

Closes googleforgames#1543

* Updated certs for TestTlsWebhook

Included instructions on how to update.
  • Loading branch information
markmandel authored and ilkercelikyilmaz committed Oct 23, 2020
1 parent 4c502f3 commit da66475
Show file tree
Hide file tree
Showing 5 changed files with 50 additions and 1 deletion.
4 changes: 4 additions & 0 deletions build/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -58,12 +58,16 @@ KIND_CONTAINER_NAME=$(KIND_PROFILE)-control-plane

# Game Server image to use while doing end-to-end tests
<<<<<<< HEAD
<<<<<<< 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))
=======
GS_TEST_IMAGE ?= gcr.io/agones-images/udp-server:0.21
>>>>>>> 8bdc911b (Flaky: TestGameServerReserve (#1565))

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 @@ -28,10 +28,14 @@ REPOSITORY = gcr.io/agones-scale-test-1
mkfile_path := $(abspath $(lastword $(MAKEFILE_LIST)))
project_path := $(dir $(mkfile_path))
<<<<<<< HEAD
<<<<<<< HEAD
server_tag = $(REPOSITORY)/udp-server:0.21
=======
server_tag = $(REPOSITORY)/udp-server:0.20
>>>>>>> d60a566e (E2E Tests for GameServer Player Tracking (#1541))
=======
server_tag = $(REPOSITORY)/udp-server:0.21
>>>>>>> 8bdc911b (Flaky: TestGameServerReserve (#1565))
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,11 +217,15 @@ func readWriteLoop(conn net.PacketConn, stop chan struct{}, s *sdk.SDK) {
continue
case 2:
if cap, err := strconv.Atoi(parts[1]); err != nil {
<<<<<<< HEAD
<<<<<<< HEAD
respond(conn, sender, fmt.Sprintf("ERROR: %s\n", err))
=======
respond(conn, sender, err.Error()+"\n")
>>>>>>> d60a566e (E2E Tests for GameServer Player Tracking (#1541))
=======
respond(conn, sender, fmt.Sprintf("ERROR: %s\n", err))
>>>>>>> 8bdc911b (Flaky: TestGameServerReserve (#1565))
continue
} else {
setPlayerCapacity(s, int64(cap))
Expand Down
6 changes: 5 additions & 1 deletion test/e2e/framework/framework.go
Original file line number Diff line number Diff line change
Expand Up @@ -184,8 +184,12 @@ func NewFromFlags() (*Framework, error) {
viper.SetDefault(gsimageFlag, "gcr.io/agones-images/simple-game-server:0.1")
=======
viper.SetDefault(kubeconfigFlag, filepath.Join(usr.HomeDir, "/.kube/config"))
<<<<<<< HEAD
viper.SetDefault(gsimageFlag, "gcr.io/agones-images/udp-server:0.20")
>>>>>>> d60a566e (E2E Tests for GameServer Player Tracking (#1541))
=======
viper.SetDefault(gsimageFlag, "gcr.io/agones-images/udp-server:0.21")
>>>>>>> 8bdc911b (Flaky: TestGameServerReserve (#1565))
viper.SetDefault(pullSecretFlag, "")
viper.SetDefault(stressTestLevelFlag, 0)
viper.SetDefault(perfOutputDirFlag, "")
Expand All @@ -204,7 +208,7 @@ func NewFromFlags() (*Framework, error) {
=======

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")
gsimage := pflag.String(gsimageFlag, viper.GetString(gsimageFlag), "gameserver image to use for those tests, gcr.io/agones-images/udp-server:0.21")
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")
Expand Down
33 changes: 33 additions & 0 deletions test/e2e/gameserver_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -574,6 +574,18 @@ func TestGameServerWithPortsMappedToMultipleContainers(t *testing.T) {

func TestGameServerReserve(t *testing.T) {
t.Parallel()
<<<<<<< HEAD
=======

// We are deliberately not trying to test the transition between Reserved -> Ready.
//
// We have found that trying to catch the GameServer in the Reserved state can be flaky,
// as we can't control the speed in which the Kubernetes API is going to reply to request,
// and we could sometimes miss when the GameServer is in the Reserved State before it goes to Ready.
//
// Therefore we are going to test for concrete states that we don't need to catch while
// in a transitive state.
>>>>>>> 8bdc911b (Flaky: TestGameServerReserve (#1565))

// We are deliberately not trying to test the transition between Reserved -> Ready.
//
Expand All @@ -593,31 +605,52 @@ func TestGameServerReserve(t *testing.T) {
assert.Equal(t, gs.Status.State, agonesv1.GameServerStateReady)

reply, err := e2eframework.SendGameServerUDP(gs, "RESERVE 0")
<<<<<<< HEAD
if err != nil {
assert.FailNow(t, "Could not message GameServer", err.Error())
=======
if !assert.NoError(t, err) {
assert.FailNow(t, "Could not message GameServer")
>>>>>>> 8bdc911b (Flaky: TestGameServerReserve (#1565))
}
assert.Equal(t, "ACK: RESERVE 0\n", reply)

gs, err = framework.WaitForGameServerState(gs, agonesv1.GameServerStateReserved, 3*time.Minute)
<<<<<<< HEAD
if err != nil {
assert.FailNow(t, "Time out on waiting for gs in a Reserved state", err.Error())
}

reply, err = e2eframework.SendGameServerUDP(gs, "ALLOCATE")
if err != nil {
assert.FailNow(t, "Could not message GameServer", err.Error())
=======
assert.NoError(t, err)

reply, err = e2eframework.SendGameServerUDP(gs, "ALLOCATE")
if !assert.NoError(t, err) {
assert.FailNow(t, "Could not message GameServer")
>>>>>>> 8bdc911b (Flaky: TestGameServerReserve (#1565))
}
assert.Equal(t, "ACK: ALLOCATE\n", reply)

// put it in a totally different state, just to reset things.
gs, err = framework.WaitForGameServerState(gs, agonesv1.GameServerStateAllocated, 3*time.Minute)
<<<<<<< HEAD
if err != nil {
assert.FailNow(t, "Time out on waiting for gs in an Allocated state", err.Error())
}

reply, err = e2eframework.SendGameServerUDP(gs, "RESERVE 5s")
if err != nil {
assert.FailNow(t, "Could not message GameServer", err.Error())
=======
assert.NoError(t, err)

reply, err = e2eframework.SendGameServerUDP(gs, "RESERVE 5s")
if !assert.NoError(t, err) {
assert.FailNow(t, "Could not message GameServer")
>>>>>>> 8bdc911b (Flaky: TestGameServerReserve (#1565))
}
assert.Equal(t, "ACK: RESERVE 5s\n", reply)

Expand Down

0 comments on commit da66475

Please sign in to comment.