func TestGetServices(t *testing.T) { db, err := openDB() defer db.Close() svc := steward.Service{ID: -1, Name: "lol", Port: 10, CheckerPath: "/test", UDP: false} const services_amount int = 5 for i := 0; i < services_amount; i++ { svc.Port = i err = steward.AddService(db.db, svc) } services, err := steward.GetServices(db.db) if err != nil { log.Fatalln("Get services fail:", err) } if len(services) != services_amount { log.Fatalln("Get services moar than add") } for i := 0; i < len(services); i++ { svc.ID = i + 1 svc.Port = i if services[i] != svc { log.Fatalln("Get service", services[i], "instead", svc) } } }
// CollectLastResult returns actual scoreboard func CollectLastResult(db *sql.DB) (r Result, err error) { teams, err := steward.GetTeams(db) if err != nil { return } services, err := steward.GetServices(db) if err != nil { return } for _, svc := range services { r.Services = append(r.Services, svc.Name) } for _, team := range teams { tr, err := collectTeamResult(db, team, services) if err != nil { return r, err } r.Teams = append(r.Teams, tr) } return }
// NewGame create new Game object func NewGame(db *sql.DB, priv *rsa.PrivateKey, roundLen time.Duration, timeout time.Duration) (g Game, err error) { g.priv = priv g.roundLen = roundLen g.timeout = timeout g.db = db rand.Seed(time.Now().UnixNano()) g.teams, err = steward.GetTeams(g.db) if err != nil { return } g.services, err = steward.GetServices(g.db) if err != nil { return } return }
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) } }
func TestFlagsWork(t *testing.T) { db, err := openDB() if err != nil { log.Fatalln("Open database failed:", err) } defer db.Close() 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 := newDummyService("python-api/dummy_service.py", port) service.Stop() // if already run priv, err := vexillary.GenerateKey() if err != nil { log.Fatalln("Generate key failed:", err) } fillTestTeams(db.db) checker_path := "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, 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) } err = checker.PutFlags(db.db, priv, round, teams, services) if err != nil { log.Fatalln("Put flags failed:", err) } // No services -> all down checkServicesStatus(db.db, round, teams, services, steward.StatusDown) // Start service service.Start() time.Sleep(time.Second) service.BrokeLogic() err = checker.PutFlags(db.db, priv, round, teams, services) if err != nil { log.Fatalln("Put flags failed:", err) } checkServicesStatus(db.db, round, teams, services, steward.StatusMumble) service.RestoreLogic() time.Sleep(time.Second) round, err = steward.NewRound(db.db, time.Minute) if err != nil { log.Fatalln("Create new round failed:", err) } log.Println("Put flags to correct service...") err = checker.PutFlags(db.db, priv, round, teams, services) if err != nil { log.Fatalln("Put flags failed:", err) } checkServicesStatus(db.db, round, teams, services, steward.StatusUP) log.Println("Check flags of correct service...") err = checker.CheckFlags(db.db, round, teams, services) if err != nil { log.Fatalln("Check flags failed:", err) } checkServicesStatus(db.db, round, teams, services, steward.StatusUP) service.ClearFlags() log.Println("Check flags of service with removed flags...") err = checker.CheckFlags(db.db, round, teams, services) if err != nil { log.Fatalln("Check flags failed:", err) } checkServicesStatus(db.db, round, teams, services, steward.StatusCorrupt) log.Println("Stop service...") service.Stop() log.Println("Check flags of stopped service...") err = checker.CheckFlags(db.db, round, teams, services) if err != nil { log.Fatalln("Check flags failed:", err) } checkServicesStatus(db.db, round, teams, services, steward.StatusDown) }