agones.dev/agones@v1.54.0/test/sdk/websocket-watch/ws-watch-test.go (about)

     1  // Copyright 2022 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 ws-watch-test tests websocket watch in Go.
    16  package main
    17  
    18  import (
    19  	"io"
    20  	"log"
    21  	"net/http"
    22  	"net/url"
    23  	"os"
    24  	"strings"
    25  	"time"
    26  
    27  	"github.com/gorilla/websocket"
    28  )
    29  
    30  func main() {
    31  	portStr := os.Getenv("AGONES_SDK_HTTP_PORT")
    32  	watchURL := url.URL{Scheme: "ws", Host: "localhost:" + portStr, Path: "/watch/gameserver"}
    33  	reserveURL := url.URL{Scheme: "http", Host: "localhost:" + portStr, Path: "/reserve"}
    34  	gameServerURL := url.URL{Scheme: "http", Host: "localhost:" + portStr, Path: "/gameserver"}
    35  
    36  	// Connect watchGameserver API with websocket
    37  	log.Printf("Connecting to %s", watchURL.String())
    38  	websocketClient, connectResponse, dialErr := websocket.DefaultDialer.Dial(watchURL.String(), nil)
    39  	if dialErr != nil {
    40  		log.Fatalf("Could not dial watch websocket: %v", dialErr)
    41  	}
    42  	defer connectResponse.Body.Close() // nolint: errcheck
    43  	defer websocketClient.Close()      // nolint: errcheck
    44  
    45  	// Send reserved request
    46  	log.Printf("Change to status to reserved")
    47  	req, reqErr := http.NewRequest(http.MethodPost, reserveURL.String(), nil)
    48  	if reqErr != nil {
    49  		log.Fatalf("Could not create reserve request: %v", reqErr) // nolint: gocritic
    50  	}
    51  
    52  	httpClient := &http.Client{
    53  		Timeout: time.Second * 10,
    54  	}
    55  	response, respErr := httpClient.Do(req)
    56  	if respErr != nil {
    57  		log.Fatalf("Could not post reserve request: %v", reqErr) // nolint: gocritic
    58  	}
    59  	defer response.Body.Close() // nolint: errcheck
    60  
    61  	// Wait for gameserver become Reserved (max 10 seconds)
    62  	for c := 0; c < 10; c++ {
    63  		log.Printf("Get GameServer status...util GameServer status become Reserved")
    64  		req, reqErr = http.NewRequest(http.MethodGet, gameServerURL.String(), nil)
    65  		if reqErr != nil {
    66  			log.Fatalf("Could not create gameserver request: %v", reqErr) // nolint: gocritic
    67  		}
    68  		response, respErr = httpClient.Do(req)
    69  		if respErr != nil {
    70  			log.Fatalf("Could not get response: %v", respErr)
    71  		}
    72  		gs, err := io.ReadAll(response.Body)
    73  		if err != nil {
    74  			log.Fatalf("Could not read gameserver response body")
    75  		}
    76  		err = response.Body.Close()
    77  		if err != nil {
    78  			log.Fatalf("Could not close response body")
    79  		}
    80  		if strings.Contains(string(gs), "Reserved") {
    81  			break
    82  		}
    83  		time.Sleep(1 * time.Second)
    84  	}
    85  
    86  	// Read message from the sdkserver
    87  	log.Printf("Read message from the websocket server")
    88  	_, message, err := websocketClient.ReadMessage()
    89  	if err != nil {
    90  		log.Fatalf("Unable to read message from websocket: %v", err)
    91  		return
    92  	}
    93  	log.Printf("Received message from websocket: %s", message)
    94  
    95  	// Check if the watchGameserver result has the status: Reserved
    96  	switch {
    97  	case strings.Contains(string(message), "Reserved"):
    98  		log.Printf("Found status 'Reserved' in message")
    99  	case strings.Contains(string(message), "Shutdown"):
   100  		// test time out
   101  		log.Println("Found status 'Shutdown' in message")
   102  	default:
   103  		log.Fatalf("Cloud not find status 'Reserved' or 'Shutdown'")
   104  	}
   105  
   106  	// Write message to the sdkserver
   107  	log.Printf("Write empty message to the websocket server")
   108  	closeErr := websocketClient.WriteMessage(websocket.CloseMessage, websocket.FormatCloseMessage(websocket.CloseNormalClosure, ""))
   109  	if closeErr != nil {
   110  		log.Fatalf("Error writing close message: %v", closeErr)
   111  	}
   112  }