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  }