func TestGetRoundResult(t *testing.T) { db, err := openDB() if err != nil { log.Fatalln("Open database failed:", err) } defer db.Close() first := steward.RoundResult{ID: -1, TeamID: 10, Round: 1, AttackScore: 30, DefenceScore: 40} second := steward.RoundResult{ID: -1, TeamID: first.TeamID, Round: first.Round + 1, AttackScore: 130, DefenceScore: 140} _, err = steward.AddRoundResult(db.db, first) if err != nil { log.Fatalln("Add round result failed:", err) } _, err = steward.AddRoundResult(db.db, second) if err != nil { log.Fatalln("Add round result failed:", err) } last_res, err := steward.GetLastResult(db.db, second.TeamID) if err != nil { log.Fatalln("Get last result failed:", err) } res, err := steward.GetRoundResult(db.db, second.TeamID, second.Round) if err != nil { log.Fatalln("Get round result failed:", err) } if res != last_res { log.Fatalln("Last result != round result", res, last_res) } attack_sum := first.AttackScore + second.AttackScore defence_sum := first.DefenceScore + second.DefenceScore if res.AttackScore != attack_sum { log.Fatalln("Invalid attack score value", res.AttackScore, attack_sum) } if res.DefenceScore != defence_sum { log.Fatalln("Invalid defence score value", res.DefenceScore, defence_sum) } }
func TestGame(*testing.T) { db, err := openDB() if err != nil { log.Fatalln("Open database fail:", err) } min_port_num := 1024 max_port_num := 65535 rand.Seed(time.Now().UnixNano()) port := min_port_num + rand.Intn(max_port_num-min_port_num) log.Println("Use port", port) service_path := "../checker/python-api/dummy_service.py" svc := newDummyService(service_path, port) svc.Stop() // kill svc.Start() time.Sleep(time.Second) // wait for service init defer svc.Stop() priv, err := vexillary.GenerateKey() if err != nil { log.Fatalln("Generate key fail:", err) } for index, team := range []string{"FooTeam", "BarTeam", "BazTeam"} { // just trick for bypass UNIQUE team subnet subnet := fmt.Sprintf("127.%d.0.1/24", index) vulnbox := fmt.Sprintf("127.0.%d.3", index) t := steward.Team{ID: -1, Name: team, Subnet: subnet, Vulnbox: vulnbox} _, err = steward.AddTeam(db.db, t) if err != nil { log.Fatalln("Add team failed:", err) } } checker_path := "../checker/python-api/dummy_checker.py" for _, service := range []string{"Foo", "Bar", "Baz"} { err = steward.AddService(db.db, steward.Service{ID: -1, Name: service, Port: port, CheckerPath: checker_path, UDP: false}) if err != nil { log.Fatalln("Add service failed:", err) } } round_len := 30 * time.Second timeout_between_check := 10 * time.Second game, err := pulse.NewGame(db.db, priv, round_len, timeout_between_check) defer game.Over() end_time := time.Now().Add(time.Minute + 10*time.Second) err = game.Run(end_time) if err != nil { log.Fatalln("Game error:", err) } for round := 1; round <= 2; round++ { for team_id := 1; team_id <= 3; team_id++ { res, err := steward.GetRoundResult(db.db, team_id, round) if err != nil { log.Fatalf("Get round %d result fail: %s", round, err) } if res.DefenceScore != float64(round*2) { log.Fatalln("Invalid defence score") } if res.AttackScore != 0 { log.Fatalln("Invalid attack score") } } } }
func TestCountRound(*testing.T) { db, err := openDB() if err != nil { log.Fatalln("Open database failed:", err) } defer db.Close() fillTestTeams(db.db) fillTestServices(db.db) priv, err := vexillary.GenerateKey() if err != nil { log.Fatalln("Generate key failed:", err) } round, err := steward.NewRound(db.db, time.Minute) if err != nil { log.Fatalln("Create new round failed:", err) } teams, err := steward.GetTeams(db.db) if err != nil { log.Fatalln("Get teams failed:", err) } services, err := steward.GetServices(db.db) if err != nil { log.Fatalln("Get services failed:", err) } flags := make([]string, 0) for _, team := range teams { for _, svc := range services { flag, err := vexillary.GenerateFlag(priv) if err != nil { log.Fatalln("Generate flag failed:", err) } flags = append(flags, flag) flg := steward.Flag{ID: -1, Flag: flag, Round: round, TeamID: team.ID, ServiceID: svc.ID, Cred: ""} err = steward.AddFlag(db.db, flg) if err != nil { log.Fatalln("Add flag to database failed:", err) } err = steward.PutStatus(db.db, steward.Status{ Round: round, TeamID: team.ID, ServiceID: svc.ID, State: steward.StatusUP}) if err != nil { log.Fatalln("Put status to database failed:", err) } } } flag1, err := steward.GetFlagInfo(db.db, flags[2]) if err != nil { log.Fatalln("Get flag info failed:", err) } err = steward.CaptureFlag(db.db, flag1.ID, teams[2].ID) if err != nil { log.Fatalln("Capture flag failed:", err) } flag2, err := steward.GetFlagInfo(db.db, flags[7]) if err != nil { log.Fatalln("Get flag info failed:", err) } err = steward.CaptureFlag(db.db, flag2.ID, teams[3].ID) if err != nil { log.Fatalln("Capture flag failed:", err) } err = counter.CountRound(db.db, round, teams, services) if err != nil { log.Fatalln("Count round failed:", err) } res, err := steward.GetRoundResult(db.db, teams[0].ID, round) if err != nil || res.AttackScore != 0.0 || res.DefenceScore != 1.75 { log.Fatalln("Invalid result:", res) } res, err = steward.GetRoundResult(db.db, teams[1].ID, round) if err != nil || res.AttackScore != 0.0 || res.DefenceScore != 1.75 { log.Fatalln("Invalid result:", res) } res, err = steward.GetRoundResult(db.db, teams[2].ID, round) if err != nil || res.AttackScore != 0.25 || res.DefenceScore != 2.0 { log.Fatalln("Invalid result:", res) } res, err = steward.GetRoundResult(db.db, teams[3].ID, round) if err != nil || res.AttackScore != 0.25 || res.DefenceScore != 2.0 { log.Fatalln("Invalid result:", res) } }