github.com/Laplace-Game-Development/Laplace-Entangled-Environment@v0.0.3/internal/schedule/schedule_test.go (about)

     1  package schedule
     2  
     3  import (
     4  	"flag"
     5  	"fmt"
     6  	"math/rand"
     7  	"os"
     8  	"testing"
     9  
    10  	"github.com/Laplace-Game-Development/Laplace-Entangled-Environment/internal/event"
    11  	"github.com/Laplace-Game-Development/Laplace-Entangled-Environment/internal/redis"
    12  	"github.com/Laplace-Game-Development/Laplace-Entangled-Environment/internal/startup"
    13  	"github.com/Laplace-Game-Development/Laplace-Entangled-Environment/internal/zeromq"
    14  	"github.com/mediocregopher/radix/v3"
    15  	"github.com/pebbe/zmq4"
    16  )
    17  
    18  //// Configurables
    19  const eventHealthRecNum int = 10
    20  
    21  var (
    22  	cwd_arg = flag.String("cwd", "", "set cwd")
    23  )
    24  
    25  func TestMain(m *testing.M) {
    26  	flag.Parse()
    27  	if *cwd_arg != "" {
    28  		if err := os.Chdir(*cwd_arg); err != nil {
    29  			fmt.Println("Chdir error:", err)
    30  		}
    31  	}
    32  
    33  	os.Exit(m.Run())
    34  }
    35  
    36  func TestStartupAndCleanup(t *testing.T) {
    37  	cleanup, err := StartCronScheduler()
    38  	if err != nil {
    39  		t.Errorf("Error occurred in starting Cron Scheduler! Err: %v\n", err)
    40  	}
    41  	cleanup()
    42  }
    43  
    44  func TestEventHealthCheck(t *testing.T) {
    45  	cleanup := startup.InitServerStartupOnTaskList(
    46  		[]startup.ServerTask{
    47  			redis.StartDatabase,
    48  			zeromq.StartZeroMqComms,
    49  		})
    50  	defer cleanup()
    51  
    52  	// Empty Queue Should Return
    53  	eventCheckHealth()
    54  
    55  	// Publish some records
    56  	nums := make([]int64, eventHealthRecNum)
    57  	cmds := make([]radix.CmdAction, eventHealthRecNum)
    58  	check := map[string]bool{}
    59  
    60  	for i := 0; i < eventHealthRecNum; i++ {
    61  		nums[i] = rand.Int63()
    62  		cmds[i] = radix.Cmd(nil, "LPUSH", event.HealthTaskQueue, fmt.Sprintf("%d", nums[i]))
    63  		check[fmt.Sprintf("%d", nums[i])] = false
    64  	}
    65  
    66  	err := redis.MainRedis.Do(radix.Pipeline(cmds...))
    67  	if err != nil {
    68  		t.Errorf("Error occurred in sendin records to Redis! Err: %v\n", err)
    69  	}
    70  
    71  	// Receive Records via Zeromq
    72  	zmqREP, err := zeromq.MainZeroMQ.NewSocket(zmq4.Type(zmq4.REP))
    73  	if err != nil {
    74  		t.Errorf("Error occured creating zeromq socket! Err: %v\n", err)
    75  	}
    76  
    77  	zmqREP.Bind(zeromq.ZeromqMask + ProxyFEPort)
    78  
    79  	go eventCheckHealth()
    80  
    81  	var msg string
    82  	var args []string
    83  	var exists bool
    84  	var value bool
    85  	for i := 0; i < eventHealthRecNum; i++ {
    86  		t.Log("Waiting For Message")
    87  		msg, err = zmqREP.Recv(zmq4.Flag(0))
    88  		for msg == "" {
    89  			msg, err = zmqREP.Recv(zmq4.Flag(0))
    90  		}
    91  		t.Logf("Got Message: %s\n", msg)
    92  
    93  		t.Logf("Sending Confirmation!\n")
    94  		zmqREP.Send("OK", zmq4.Flag(0))
    95  
    96  		_, args = parseTask(msg)
    97  		if len(args) == 0 {
    98  			t.Errorf("Message was illformatted: %s\n", msg)
    99  		}
   100  
   101  		value, exists = check[args[0]]
   102  		if !exists {
   103  			t.Errorf("Got a GameID that did not exist! Msg: %s\n", msg)
   104  		} else if value {
   105  			t.Errorf("Got a repeated GameID! Msg: %s\n", msg)
   106  		} else {
   107  			t.Logf("Message Looks Unique!\n")
   108  		}
   109  
   110  		check[args[0]] = true
   111  	}
   112  
   113  	// Do it once more to verify no errors or problems
   114  	eventCheckHealth()
   115  
   116  	// Not Closing Here Seemed to cause a leak...
   117  	zmqREP.Close()
   118  }