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) } }
// Round start new round func (g Game) Round(counters *sync.WaitGroup) (err error) { roundNo, err := steward.NewRound(g.db, g.roundLen) if err != nil { return } log.Println("New round", roundNo) err = checker.PutFlags(g.db, g.priv, roundNo, g.teams, g.services) if err != nil { return } round, err := steward.CurrentRound(g.db) if err != nil { return } roundEnd := round.StartTime.Add(round.Len) for time.Now().Before(roundEnd) { log.Println("Round", round.ID, "check start") err = checker.CheckFlags(g.db, round.ID, g.teams, g.services) if err != nil { return } timeout := RandomizeTimeout(g.timeout, g.timeout/3) if time.Now().Add(timeout).After(roundEnd) { break } log.Println("Round", round.ID, "check end, timeout", timeout) time.Sleep(timeout) } log.Println("Check", round.ID, "over, wait", time.Now().Sub(roundEnd)) for time.Now().Before(roundEnd) { time.Sleep(time.Second / 10) } counters.Add(1) go func() { defer counters.Done() log.Println("Count round", round.ID, "start", time.Now()) err = counter.CountRound(g.db, round.ID, g.teams, g.services) if err != nil { log.Println("Count round", round.ID, "failed:", err) } log.Println("Count round", round.ID, "end", time.Now()) }() return }