agones.dev/agones@v1.53.0/test/sdk/go/sdk-client-test.go (about) 1 // Copyright 2019 Google LLC All Rights Reserved. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 // Binary sdk-client-test tests the Go SDK client. 16 package main 17 18 import ( 19 "log" 20 "os" 21 "strconv" 22 "strings" 23 "time" 24 25 "github.com/google/go-cmp/cmp" 26 "github.com/spf13/pflag" 27 "github.com/spf13/viper" 28 29 pkgSdk "agones.dev/agones/pkg/sdk" 30 "agones.dev/agones/pkg/util/runtime" 31 goSdk "agones.dev/agones/sdks/go" 32 ) 33 34 func main() { 35 viper.AllowEmptyEnv(true) 36 runtime.FeaturesBindFlags() 37 pflag.Parse() 38 viper.SetEnvKeyReplacer(strings.NewReplacer("-", "_")) 39 runtime.Must(runtime.FeaturesBindEnv()) 40 runtime.Must(runtime.ParseFeaturesFromEnv()) 41 42 // Use to delays to prevent Game Servers from churning too quickly on a running cluster. 43 shutdownDelaySec := 0 44 gracefulTerminationDelaySec := 0 45 if sds := os.Getenv("SHUTDOWN_DELAY_SECONDS"); sds != "" { 46 sec, err := strconv.Atoi(sds) 47 if err != nil { 48 log.Fatalf("Could not parse SHUTDOWN_DELAY_SECONDS: %v", err) 49 } 50 shutdownDelaySec = sec 51 } 52 if gtds := os.Getenv("GRACEFUL_TERMINATION_DELAY_SECONDS"); gtds != "" { 53 sec, err := strconv.Atoi(gtds) 54 if err != nil { 55 log.Fatalf("Could not parse GRACEFUL_TERMINATION_DELAY_SECONDS: %v", err) 56 } 57 gracefulTerminationDelaySec = sec 58 } 59 60 log.SetFlags(log.Lshortfile) 61 log.Println("Client is starting") 62 log.Printf("Feature Flags: %s\n", runtime.EncodeFeatures()) 63 time.Sleep(100 * time.Millisecond) 64 sdk, err := goSdk.NewSDK() 65 if err != nil { 66 log.Fatalf("Could not connect to sdk: %v\n", err) 67 } 68 69 c := make(chan string) 70 71 once := true 72 err = sdk.WatchGameServer(func(gs *pkgSdk.GameServer) { 73 log.Println("Received GameServer update") 74 log.Println(gs) 75 uid := gs.ObjectMeta.Uid 76 if once { 77 c <- uid 78 once = false 79 } 80 }) 81 if err != nil { 82 log.Fatalf("Error on watch GameServer %s", err) 83 } 84 err = sdk.Ready() 85 if err != nil { 86 log.Fatalf("Could not send ready message %s", err) 87 } 88 if err = sdk.Reserve(5 * time.Second); err != nil { 89 log.Fatalf("Could not send Reserve command: %s", err) 90 } 91 err = sdk.Allocate() 92 if err != nil { 93 log.Fatalf("Err sending allocate request %s", err) 94 } 95 err = sdk.Health() 96 if err != nil { 97 log.Fatalf("Could not send Health check: %s", err) 98 } 99 gs, err := sdk.GameServer() 100 if err != nil { 101 log.Fatalf("Could not get gameserver parameters: %s", err) 102 } 103 log.Println(gs) 104 105 err = sdk.SetLabel("creationTimestamp", strconv.FormatInt(gs.ObjectMeta.CreationTimestamp, 10)) 106 if err != nil { 107 log.Fatalf("Could not set label: %s", err) 108 } 109 if err != nil { 110 log.Fatalf("Error received on watch gameserver %s", err) 111 } 112 uid := <-c 113 err = sdk.SetAnnotation("UID", uid) 114 if err != nil { 115 log.Fatalf("Could not set annotation: %s", err) 116 } 117 118 if runtime.FeatureEnabled(runtime.FeaturePlayerTracking) { 119 testPlayerTracking(sdk) 120 } 121 122 if runtime.FeatureEnabled(runtime.FeatureCountsAndLists) { 123 testCounts(sdk) 124 testLists(sdk) 125 } 126 127 log.Printf("Waiting %d seconds before shutting down game server", shutdownDelaySec) 128 time.Sleep(time.Duration(shutdownDelaySec) * time.Second) 129 130 err = sdk.Shutdown() 131 if err != nil { 132 log.Fatalf("Could not shutdown GameServer: %s", err) 133 } 134 135 log.Printf("Waiting %d seconds before exiting", gracefulTerminationDelaySec) 136 time.Sleep(time.Duration(gracefulTerminationDelaySec) * time.Second) 137 } 138 139 func testPlayerTracking(sdk *goSdk.SDK) { 140 capacity := int64(10) 141 if err := sdk.Alpha().SetPlayerCapacity(capacity); err != nil { 142 log.Fatalf("Error setting player capacity: %s", err) 143 } 144 145 c, err := sdk.Alpha().GetPlayerCapacity() 146 if err != nil { 147 log.Fatalf("Error getting player capacity: %s", err) 148 } 149 if c != capacity { 150 log.Fatalf("Player Capacity should be %d, but is %d", capacity, c) 151 } 152 153 playerID := "1234" 154 if ok, err := sdk.Alpha().PlayerConnect(playerID); err != nil { 155 log.Fatalf("Error registering player as connected: %s", err) 156 } else if !ok { 157 log.Fatalf("PlayerConnect returned false") 158 } 159 160 if ok, err := sdk.Alpha().IsPlayerConnected(playerID); err != nil { 161 log.Fatalf("Error checking if player is connected: %s", err) 162 } else if !ok { 163 log.Fatalf("IsPlayerConnected returned false") 164 } 165 166 if list, err := sdk.Alpha().GetConnectedPlayers(); err != nil { 167 log.Fatalf("Error getting connected player: %s", err) 168 } else if len(list) == 0 { 169 log.Fatalf("No connected players returned") 170 } 171 172 if ok, err := sdk.Alpha().PlayerDisconnect(playerID); err != nil { 173 log.Fatalf("Error registering player as disconnected: %s", err) 174 } else if !ok { 175 log.Fatalf("PlayerDisconnect returned false") 176 } 177 178 if c, err = sdk.Alpha().GetPlayerCount(); err != nil { 179 log.Fatalf("Error retrieving player count: %s", err) 180 } else if c != int64(0) { 181 log.Fatalf("Player Count should be 0, but is %d", c) 182 } 183 } 184 185 func testCounts(sdk *goSdk.SDK) { 186 // LocalSDKServer starting "rooms": {Count: 1, Capacity: 10} 187 counter := "rooms" 188 count, err := sdk.Beta().GetCounterCount(counter) 189 if err != nil { 190 log.Fatalf("Error getting Counter count: %s", err) 191 } else if count != int64(1) { 192 log.Fatalf("Counter count should be 1, but is %d", count) 193 } 194 195 err = sdk.Beta().IncrementCounter(counter, 9) 196 if err != nil { 197 log.Fatalf("Error incrementing Counter: %s", err) 198 } 199 200 err = sdk.Beta().DecrementCounter(counter, 10) 201 if err != nil { 202 log.Fatalf("Error decrementing Counter: %s", err) 203 } 204 205 err = sdk.Beta().SetCounterCount(counter, 10) 206 if err != nil { 207 log.Fatalf("Error setting Counter count: %s", err) 208 } 209 210 capacity, err := sdk.Beta().GetCounterCapacity(counter) 211 if err != nil { 212 log.Fatalf("Error getting Counter capacity: %s", err) 213 } else if capacity != int64(10) { 214 log.Fatalf("Counter capacity should be 10, but is %d", capacity) 215 } 216 217 err = sdk.Beta().SetCounterCapacity(counter, 1) 218 if err != nil { 219 log.Fatalf("Error setting Counter capacity: %s", err) 220 } 221 } 222 223 func testLists(sdk *goSdk.SDK) { 224 // LocalSDKServer starting "players": {Values: []string{"test0", "test1", "test2"}, Capacity: 100}} 225 list := "players" 226 vals := []string{"test0", "test1", "test2"} 227 228 contains, err := sdk.Beta().ListContains(list, "test1") 229 if !contains { 230 log.Fatalf("List should contain value \"test1\" err: %s", err) 231 } 232 233 length, err := sdk.Beta().GetListLength(list) 234 if err != nil { 235 log.Fatalf("Error getting List length: %s", err) 236 } else if int64(length) != 3 { 237 log.Fatalf("List length should be 3, but is %d", length) 238 } 239 240 values, err := sdk.Beta().GetListValues(list) 241 if err != nil { 242 log.Fatalf("Error getting List values: %s", err) 243 } else if !cmp.Equal(vals, values) { 244 log.Fatalf("List values should be %v, but is %v", vals, values) 245 } 246 247 err = sdk.Beta().AppendListValue(list, "test3") 248 if err != nil { 249 log.Fatalf("Unable to append value \"test3\" err: %s", err) 250 } 251 252 err = sdk.Beta().DeleteListValue(list, "test2") 253 if err != nil { 254 log.Fatalf("Unable to delete value \"test2\" err: %s", err) 255 } 256 257 capacity, err := sdk.Beta().GetListCapacity(list) 258 if err != nil { 259 log.Fatalf("Error getting List capacity: %s", err) 260 } else if capacity != int64(100) { 261 log.Fatalf("List capacity should be 100, but is %d", capacity) 262 } 263 264 err = sdk.Beta().SetListCapacity(list, 2) 265 if err != nil { 266 log.Fatalf("Error setting List capacity: %s", err) 267 } 268 }