Removed vex files and changed package name
							parent
							
								
									105de0509c
								
							
						
					
					
						commit
						8b7eb57673
					
				| @ -1,446 +0,0 @@ | |||||||
| package main |  | ||||||
| 
 |  | ||||||
| import ( |  | ||||||
|   "github.com/graphql-go/graphql" |  | ||||||
|   "reflect" |  | ||||||
|   "fmt" |  | ||||||
|   "errors" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| func GQLVexTypes() map[reflect.Type]*graphql.Object { |  | ||||||
|   types := map[reflect.Type]*graphql.Object{} |  | ||||||
|   types[reflect.TypeOf((*Match)(nil))] = GQLVexTypeMatch() |  | ||||||
| 
 |  | ||||||
|   return types |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func GQLVexMutations() map[string]*graphql.Field { |  | ||||||
|   mutations := map[string]*graphql.Field{} |  | ||||||
|   mutations["setMatchState"] = GQLVexMutationSetMatchState() |  | ||||||
|   return mutations |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func GQLVexQueries() map[string]*graphql.Field { |  | ||||||
|   queries := map[string]*graphql.Field{} |  | ||||||
|   queries["Arenas"] = GQLVexQueryArenas() |  | ||||||
|   return queries |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func GQLVexSubscriptions() map[string]*graphql.Field { |  | ||||||
|   subs := map[string]*graphql.Field{} |  | ||||||
|   subs["Arena"] = GQLVexSubscriptionArena() |  | ||||||
|   return subs |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| var gql_vex_subscription_arena *graphql.Field = nil |  | ||||||
| func GQLVexSubscriptionArena() *graphql.Field { |  | ||||||
|   if gql_vex_subscription_arena == nil { |  | ||||||
|     gql_vex_subscription_arena = &graphql.Field{ |  | ||||||
|       Type: GQLVexTypeArena(), |  | ||||||
|       Args: graphql.FieldConfigArgument{ |  | ||||||
|         "arena_id": &graphql.ArgumentConfig{ |  | ||||||
|           Type: graphql.String, |  | ||||||
|         }, |  | ||||||
|       }, |  | ||||||
|       Resolve: func(p graphql.ResolveParams) (interface{}, error) { |  | ||||||
|         return p.Source, nil |  | ||||||
|       }, |  | ||||||
|       Subscribe: GQLVexSubscribeArena, |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
|   return gql_vex_subscription_arena |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func GQLVexSubscribeArena(p graphql.ResolveParams)(interface{}, error) { |  | ||||||
|   server, ok := p.Context.Value("gql_server").(*GQLServer) |  | ||||||
|   if ok == false { |  | ||||||
|     return nil, fmt.Errorf("Failed to get gql_Server from context and cast to GQLServer") |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   c := make(chan interface{}) |  | ||||||
|   arena_id, ok := p.Args["arena_id"].(string) |  | ||||||
|   if ok == false { |  | ||||||
|     return nil, fmt.Errorf("Failed to get arena_id arg") |  | ||||||
|   } |  | ||||||
|   owner, ok := server.Owner().(Event) |  | ||||||
|   if ok == false { |  | ||||||
|     return nil, fmt.Errorf("Failed to cast owner to event") |  | ||||||
|   } |  | ||||||
|   resource := FindRequiredResource(owner, arena_id) |  | ||||||
|   if resource == nil { |  | ||||||
|     return nil, fmt.Errorf("Failed to find resource under owner") |  | ||||||
|   } |  | ||||||
|   arena, ok := resource.(Arena) |  | ||||||
|   if ok == false { |  | ||||||
|     return nil, fmt.Errorf("Failed to cast resource to arena") |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   sig_c := arena.UpdateChannel() |  | ||||||
|   go func(c chan interface{}, sig_c chan GraphSignal, arena Arena) { |  | ||||||
|     c <- arena |  | ||||||
|     for { |  | ||||||
|       _, ok := <- sig_c |  | ||||||
|       if ok == false { |  | ||||||
|         return |  | ||||||
|       } |  | ||||||
|       c <- arena |  | ||||||
|     } |  | ||||||
|   }(c, sig_c, arena) |  | ||||||
|   return c, nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| var gql_vex_mutation_set_match_state *graphql.Field= nil |  | ||||||
| func GQLVexMutationSetMatchState() *graphql.Field { |  | ||||||
|   if gql_vex_mutation_set_match_state == nil { |  | ||||||
|     gql_vex_mutation_set_match_state = &graphql.Field{ |  | ||||||
|       Type: GQLTypeSignal(), |  | ||||||
|       Args: graphql.FieldConfigArgument{ |  | ||||||
|         "id": &graphql.ArgumentConfig{ |  | ||||||
|           Type: graphql.String, |  | ||||||
|         }, |  | ||||||
|         "state": &graphql.ArgumentConfig{ |  | ||||||
|           Type: graphql.String, |  | ||||||
|         }, |  | ||||||
|         "time": &graphql.ArgumentConfig{ |  | ||||||
|           Type: graphql.DateTime, |  | ||||||
|         }, |  | ||||||
|       }, |  | ||||||
|       Resolve: func(p graphql.ResolveParams) (interface{}, error) { |  | ||||||
|         server, ok := p.Context.Value("gql_server").(*GQLServer) |  | ||||||
|         if ok == false { |  | ||||||
|           return nil, fmt.Errorf("Failed to cast context gql_server to GQLServer: %+v", p.Context.Value("gql_server")) |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         id, ok := p.Args["id"].(string) |  | ||||||
|         if ok == false { |  | ||||||
|           return nil, errors.New("Failed to cast arg id to string") |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         state, ok := p.Args["state"].(string) |  | ||||||
|         if ok == false { |  | ||||||
|           return nil, errors.New("Failed to cast arg state to string") |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         signal := NewDownSignal(server, state) |  | ||||||
| 
 |  | ||||||
|         owner := server.Owner() |  | ||||||
|         if owner == nil { |  | ||||||
|           return nil, errors.New("Cannot send update without owner") |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         root_event, ok := owner.(Event) |  | ||||||
|         if ok == false { |  | ||||||
|           return nil, errors.New("Cannot send update to Event unless owned by an Event") |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         node := FindChild(root_event, id) |  | ||||||
|         if node == nil { |  | ||||||
|           return nil, errors.New("Failed to find id in event tree from server") |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         SendUpdate(node, signal) |  | ||||||
| 
 |  | ||||||
|         return signal, nil |  | ||||||
|       }, |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
|   return gql_vex_mutation_set_match_state |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| var gql_vex_query_arenas *graphql.Field = nil |  | ||||||
| func GQLVexQueryArenas() *graphql.Field { |  | ||||||
|   if gql_vex_query_arenas == nil { |  | ||||||
|     gql_vex_query_arenas = &graphql.Field{ |  | ||||||
|       Type: GQLVexListArena(), |  | ||||||
|       Resolve: func(p graphql.ResolveParams) (interface{}, error) { |  | ||||||
|         server, ok := p.Context.Value("gql_server").(*GQLServer) |  | ||||||
|         if ok == false { |  | ||||||
|           panic("Failed to get/cast gql_server from context") |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         owner, is_event := server.Owner().(Event) |  | ||||||
|         if is_event == false { |  | ||||||
|           return nil, fmt.Errorf("Can't enumerate arenas when server is attached to resource") |  | ||||||
|         } |  | ||||||
|         return FindResources(owner, reflect.TypeOf((*VirtualArena)(nil))), nil |  | ||||||
|       }, |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
|   return gql_vex_query_arenas |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| var gql_vex_list_arena * graphql.List = nil |  | ||||||
| func GQLVexListArena() * graphql.List { |  | ||||||
|   if gql_vex_list_arena == nil { |  | ||||||
|     gql_vex_list_arena = graphql.NewList(GQLVexTypeArena()) |  | ||||||
|   } |  | ||||||
|   return gql_vex_list_arena |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| var gql_vex_list_team * graphql.List = nil |  | ||||||
| func GQLVexListTeam() * graphql.List { |  | ||||||
|   if gql_vex_list_team == nil { |  | ||||||
|     gql_vex_list_team = graphql.NewList(GQLVexTypeTeam()) |  | ||||||
|   } |  | ||||||
|   return gql_vex_list_team |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| var gql_vex_list_alliance * graphql.List = nil |  | ||||||
| func GQLVexListAlliance() * graphql.List { |  | ||||||
|   if gql_vex_list_alliance == nil { |  | ||||||
|     gql_vex_list_alliance = graphql.NewList(GQLVexTypeAlliance()) |  | ||||||
|   } |  | ||||||
|   return gql_vex_list_alliance |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func GQLVexMatchAlliances(p graphql.ResolveParams) (interface{}, error) { |  | ||||||
|   return GQLEventFn(p, func(event Event, p graphql.ResolveParams) (interface{}, error) { |  | ||||||
|     return event.(*Match).alliances, nil |  | ||||||
|   }) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func GQLVexMatchArena(p graphql.ResolveParams) (interface{}, error) { |  | ||||||
|   return GQLEventFn(p, func(event Event, p graphql.ResolveParams) (interface{}, error) { |  | ||||||
|     return event.(*Match).arena, nil |  | ||||||
|   }) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func GQLVexMatchControl(p graphql.ResolveParams) (interface{}, error) { |  | ||||||
|   return GQLEventFn(p, func(event Event, p graphql.ResolveParams) (interface{}, error) { |  | ||||||
|     return event.(*Match).control, nil |  | ||||||
|   }) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func GQLVexMatchState(p graphql.ResolveParams) (interface{}, error) { |  | ||||||
|   return GQLEventFn(p, func(event Event, p graphql.ResolveParams) (interface{}, error) { |  | ||||||
|     return event.(*Match).state, nil |  | ||||||
|   }) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func GQLVexMatchStateStart(p graphql.ResolveParams) (interface{}, error) { |  | ||||||
|   return GQLEventFn(p, func(event Event, p graphql.ResolveParams) (interface{}, error) { |  | ||||||
|     return event.(*Match).control_start, nil |  | ||||||
|   }) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func GQLVexMatchStateDuration(p graphql.ResolveParams) (interface{}, error) { |  | ||||||
|   return GQLEventFn(p, func(event Event, p graphql.ResolveParams) (interface{}, error) { |  | ||||||
|     return event.(*Match).control_duration, nil |  | ||||||
|   }) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func GQLVexAllianceTeams(p graphql.ResolveParams) (interface{}, error) { |  | ||||||
|   return GQLResourceFn(p, func(resource Resource, p graphql.ResolveParams) (interface{}, error) { |  | ||||||
|     return resource.(*Alliance).teams, nil |  | ||||||
|   }) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| var gql_vex_type_arena * graphql.Object = nil |  | ||||||
| func GQLVexTypeArena() * graphql.Object { |  | ||||||
|   if gql_vex_type_arena == nil { |  | ||||||
|     gql_vex_type_arena = graphql.NewObject(graphql.ObjectConfig{ |  | ||||||
|       Name: "Arena", |  | ||||||
|       Interfaces: []*graphql.Interface{ |  | ||||||
|         GQLInterfaceNode(), |  | ||||||
|         GQLInterfaceResource(), |  | ||||||
|       }, |  | ||||||
|       IsTypeOf: func(p graphql.IsTypeOfParams) bool { |  | ||||||
|         _, ok := p.Value.(Arena) |  | ||||||
|         return ok |  | ||||||
|       }, |  | ||||||
|       Fields: graphql.Fields{}, |  | ||||||
|     }) |  | ||||||
| 
 |  | ||||||
|     gql_vex_type_arena.AddFieldConfig("ID", &graphql.Field{ |  | ||||||
|       Type: graphql.String, |  | ||||||
|       Resolve: GQLResourceID, |  | ||||||
|     }) |  | ||||||
| 
 |  | ||||||
|     gql_vex_type_arena.AddFieldConfig("Name", &graphql.Field{ |  | ||||||
|       Type: graphql.String, |  | ||||||
|       Resolve: GQLResourceName, |  | ||||||
|     }) |  | ||||||
| 
 |  | ||||||
|     gql_vex_type_arena.AddFieldConfig("Description", &graphql.Field{ |  | ||||||
|       Type: graphql.String, |  | ||||||
|       Resolve: GQLResourceDescription, |  | ||||||
|     }) |  | ||||||
| 
 |  | ||||||
|     gql_vex_type_arena.AddFieldConfig("Parents", &graphql.Field{ |  | ||||||
|       Type: GQLListResource(), |  | ||||||
|       Resolve: GQLResourceParents, |  | ||||||
|     }) |  | ||||||
| 
 |  | ||||||
|     gql_vex_type_arena.AddFieldConfig("Owner", &graphql.Field{ |  | ||||||
|       Type: GQLInterfaceNode(), |  | ||||||
|       Resolve: GQLResourceOwner, |  | ||||||
|     }) |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   return gql_vex_type_arena |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| var gql_vex_type_match * graphql.Object = nil |  | ||||||
| func GQLVexTypeMatch() * graphql.Object { |  | ||||||
|   if gql_vex_type_match == nil { |  | ||||||
|     gql_vex_type_match = graphql.NewObject(graphql.ObjectConfig{ |  | ||||||
|       Name: "Match", |  | ||||||
|       Interfaces: []*graphql.Interface{ |  | ||||||
|         GQLInterfaceNode(), |  | ||||||
|         GQLInterfaceEvent(), |  | ||||||
|       }, |  | ||||||
|       IsTypeOf: func(p graphql.IsTypeOfParams) bool { |  | ||||||
|         _, ok := p.Value.(*Match) |  | ||||||
|         return ok |  | ||||||
|       }, |  | ||||||
|       Fields: graphql.Fields{}, |  | ||||||
|     }) |  | ||||||
| 
 |  | ||||||
|     gql_vex_type_match.AddFieldConfig("ID", &graphql.Field{ |  | ||||||
|       Type: graphql.String, |  | ||||||
|       Resolve: GQLEventID, |  | ||||||
|     }) |  | ||||||
| 
 |  | ||||||
|     gql_vex_type_match.AddFieldConfig("Name", &graphql.Field{ |  | ||||||
|       Type: graphql.String, |  | ||||||
|       Resolve: GQLEventName, |  | ||||||
|     }) |  | ||||||
| 
 |  | ||||||
|     gql_vex_type_match.AddFieldConfig("Description", &graphql.Field{ |  | ||||||
|       Type: graphql.String, |  | ||||||
|       Resolve: GQLEventDescription, |  | ||||||
|     }) |  | ||||||
| 
 |  | ||||||
|     gql_vex_type_match.AddFieldConfig("Children", &graphql.Field{ |  | ||||||
|       Type: GQLListEvent(), |  | ||||||
|       Resolve: GQLEventChildren, |  | ||||||
|     }) |  | ||||||
| 
 |  | ||||||
|     gql_vex_type_match.AddFieldConfig("Alliances", &graphql.Field{ |  | ||||||
|       Type: GQLVexListAlliance(), |  | ||||||
|       Resolve: GQLVexMatchAlliances, |  | ||||||
|     }) |  | ||||||
| 
 |  | ||||||
|     gql_vex_type_match.AddFieldConfig("Arena", &graphql.Field{ |  | ||||||
|       Type: graphql.String, |  | ||||||
|       Resolve: GQLVexMatchArena, |  | ||||||
|     }) |  | ||||||
| 
 |  | ||||||
|     gql_vex_type_match.AddFieldConfig("Control", &graphql.Field{ |  | ||||||
|       Type: graphql.String, |  | ||||||
|       Resolve: GQLVexMatchControl, |  | ||||||
|     }) |  | ||||||
| 
 |  | ||||||
|     gql_vex_type_match.AddFieldConfig("State", &graphql.Field{ |  | ||||||
|       Type: graphql.String, |  | ||||||
|       Resolve: GQLVexMatchState, |  | ||||||
|     }) |  | ||||||
| 
 |  | ||||||
|     gql_vex_type_match.AddFieldConfig("StateStart", &graphql.Field{ |  | ||||||
|       Type: graphql.DateTime, |  | ||||||
|       Resolve: GQLVexMatchStateStart, |  | ||||||
|     }) |  | ||||||
| 
 |  | ||||||
|     gql_vex_type_match.AddFieldConfig("StateDuration", &graphql.Field{ |  | ||||||
|       Type: graphql.Int, |  | ||||||
|       Resolve: GQLVexMatchStateDuration, |  | ||||||
|     }) |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   return gql_vex_type_match |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| var gql_vex_type_alliance * graphql.Object = nil |  | ||||||
| func GQLVexTypeAlliance() * graphql.Object { |  | ||||||
|   if gql_vex_type_alliance == nil { |  | ||||||
|     gql_vex_type_alliance = graphql.NewObject(graphql.ObjectConfig{ |  | ||||||
|       Name: "Alliance", |  | ||||||
|       Interfaces: []*graphql.Interface{ |  | ||||||
|         GQLInterfaceNode(), |  | ||||||
|         GQLInterfaceResource(), |  | ||||||
|       }, |  | ||||||
|       IsTypeOf: func(p graphql.IsTypeOfParams) bool { |  | ||||||
|         _, ok := p.Value.(*Alliance) |  | ||||||
|         return ok |  | ||||||
|       }, |  | ||||||
|       Fields: graphql.Fields{}, |  | ||||||
|     }) |  | ||||||
| 
 |  | ||||||
|     gql_vex_type_alliance.AddFieldConfig("ID", &graphql.Field{ |  | ||||||
|       Type: graphql.String, |  | ||||||
|       Resolve: GQLResourceID, |  | ||||||
|     }) |  | ||||||
| 
 |  | ||||||
|     gql_vex_type_alliance.AddFieldConfig("Name", &graphql.Field{ |  | ||||||
|       Type: graphql.String, |  | ||||||
|       Resolve: GQLResourceName, |  | ||||||
|     }) |  | ||||||
| 
 |  | ||||||
|     gql_vex_type_alliance.AddFieldConfig("Description", &graphql.Field{ |  | ||||||
|       Type: graphql.String, |  | ||||||
|       Resolve: GQLResourceDescription, |  | ||||||
|     }) |  | ||||||
| 
 |  | ||||||
|     gql_vex_type_alliance.AddFieldConfig("Parents", &graphql.Field{ |  | ||||||
|       Type: GQLListResource(), |  | ||||||
|       Resolve: GQLResourceParents, |  | ||||||
|     }) |  | ||||||
| 
 |  | ||||||
|     gql_vex_type_alliance.AddFieldConfig("Owner", &graphql.Field{ |  | ||||||
|       Type: GQLInterfaceNode(), |  | ||||||
|       Resolve: GQLResourceOwner, |  | ||||||
|     }) |  | ||||||
| 
 |  | ||||||
|     gql_vex_type_alliance.AddFieldConfig("Teams", &graphql.Field{ |  | ||||||
|       Type: GQLVexListTeam(), |  | ||||||
|       Resolve: GQLVexAllianceTeams, |  | ||||||
|     }) |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   return gql_vex_type_alliance |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| var gql_vex_type_team * graphql.Object = nil |  | ||||||
| func GQLVexTypeTeam() * graphql.Object { |  | ||||||
|   if gql_vex_type_team == nil { |  | ||||||
|     gql_vex_type_team = graphql.NewObject(graphql.ObjectConfig{ |  | ||||||
|       Name: "Team", |  | ||||||
|       Interfaces: []*graphql.Interface{ |  | ||||||
|         GQLInterfaceNode(), |  | ||||||
|         GQLInterfaceResource(), |  | ||||||
|       }, |  | ||||||
|       IsTypeOf: func(p graphql.IsTypeOfParams) bool { |  | ||||||
|         _, ok := p.Value.(*Team) |  | ||||||
|         return ok |  | ||||||
|       }, |  | ||||||
|       Fields: graphql.Fields{}, |  | ||||||
|     }) |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   gql_vex_type_team.AddFieldConfig("ID", &graphql.Field{ |  | ||||||
|     Type: graphql.String, |  | ||||||
|     Resolve: GQLResourceID, |  | ||||||
|   }) |  | ||||||
| 
 |  | ||||||
|   gql_vex_type_team.AddFieldConfig("Name", &graphql.Field{ |  | ||||||
|     Type: graphql.String, |  | ||||||
|     Resolve: GQLResourceName, |  | ||||||
|   }) |  | ||||||
| 
 |  | ||||||
|   gql_vex_type_team.AddFieldConfig("Description", &graphql.Field{ |  | ||||||
|     Type: graphql.String, |  | ||||||
|     Resolve: GQLResourceDescription, |  | ||||||
|   }) |  | ||||||
| 
 |  | ||||||
|   gql_vex_type_team.AddFieldConfig("Parents", &graphql.Field{ |  | ||||||
|     Type: GQLListResource(), |  | ||||||
|     Resolve: GQLResourceParents, |  | ||||||
|   }) |  | ||||||
| 
 |  | ||||||
|   gql_vex_type_team.AddFieldConfig("Owner", &graphql.Field{ |  | ||||||
|     Type: GQLInterfaceNode(), |  | ||||||
|     Resolve: GQLResourceOwner, |  | ||||||
|   }) |  | ||||||
| 
 |  | ||||||
|   return gql_vex_type_team |  | ||||||
| } |  | ||||||
| @ -1,219 +0,0 @@ | |||||||
| package main |  | ||||||
| 
 |  | ||||||
| import ( |  | ||||||
|   "time" |  | ||||||
|   "runtime/pprof" |  | ||||||
|   "os" |  | ||||||
|   "os/signal" |  | ||||||
|   "syscall" |  | ||||||
|   "fmt" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| func fake_team(org string, id string, names []string) (*Team, []*Member) { |  | ||||||
|   members := []*Member{} |  | ||||||
|   for _, name := range(names) { |  | ||||||
|     members = append(members, NewMember(name)) |  | ||||||
|   } |  | ||||||
|   team := NewTeam(org, id, members) |  | ||||||
|   return team, members |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func fake_data() (* EventManager) { |  | ||||||
|   resources := []Resource{} |  | ||||||
| 
 |  | ||||||
|   teams_div1 := []*Team{} |  | ||||||
|   t1,  m1  := fake_team("6659", "A", []string{"jimmy"}) |  | ||||||
|   t2,  m2  := fake_team("6659", "B", []string{"timmy"}) |  | ||||||
|   t3,  m3  := fake_team("6659", "C", []string{"grace"}) |  | ||||||
|   t4,  m4  := fake_team("6659", "D", []string{"jeremy"}) |  | ||||||
|   t5,  m5  := fake_team("210",  "W", []string{"bobby"}) |  | ||||||
|   t6,  m6  := fake_team("210",  "X", []string{"toby"}) |  | ||||||
|   t7,  m7  := fake_team("210",  "Y", []string{"jennifer"}) |  | ||||||
|   t8,  m8  := fake_team("210",  "Z", []string{"emily"}) |  | ||||||
|   teams_div2 := []*Team{} |  | ||||||
|   t9,  m9  := fake_team("666",  "A", []string{"jimmy"}) |  | ||||||
|   t10, m10 := fake_team("666",  "B", []string{"timmy"}) |  | ||||||
|   t11, m11 := fake_team("666",  "C", []string{"grace"}) |  | ||||||
|   t12, m12 := fake_team("666",  "D", []string{"jeremy"}) |  | ||||||
|   t13, m13 := fake_team("315",  "W", []string{"bobby"}) |  | ||||||
|   t14, m14 := fake_team("315",  "X", []string{"toby"}) |  | ||||||
|   t15, m15 := fake_team("315",  "Y", []string{"jennifer"}) |  | ||||||
|   t16, m16 := fake_team("315",  "Z", []string{"emily"}) |  | ||||||
| 
 |  | ||||||
|   teams_div1 = append(teams_div1, t1) |  | ||||||
|   teams_div1 = append(teams_div1, t2) |  | ||||||
|   teams_div1 = append(teams_div1, t3) |  | ||||||
|   teams_div1 = append(teams_div1, t4) |  | ||||||
|   teams_div1 = append(teams_div1, t5) |  | ||||||
|   teams_div1 = append(teams_div1, t6) |  | ||||||
|   teams_div1 = append(teams_div1, t7) |  | ||||||
|   teams_div1 = append(teams_div1, t8) |  | ||||||
|   teams_div2 = append(teams_div2, t9) |  | ||||||
|   teams_div2 = append(teams_div2, t10) |  | ||||||
|   teams_div2 = append(teams_div2, t11) |  | ||||||
|   teams_div2 = append(teams_div2, t12) |  | ||||||
|   teams_div2 = append(teams_div2, t13) |  | ||||||
|   teams_div2 = append(teams_div2, t14) |  | ||||||
|   teams_div2 = append(teams_div2, t15) |  | ||||||
|   teams_div2 = append(teams_div2, t16) |  | ||||||
| 
 |  | ||||||
|   resources = append(resources, m1[0]) |  | ||||||
|   resources = append(resources, m2[0]) |  | ||||||
|   resources = append(resources, m3[0]) |  | ||||||
|   resources = append(resources, m4[0]) |  | ||||||
|   resources = append(resources, m5[0]) |  | ||||||
|   resources = append(resources, m6[0]) |  | ||||||
|   resources = append(resources, m7[0]) |  | ||||||
|   resources = append(resources, m8[0]) |  | ||||||
|   resources = append(resources, m9[0]) |  | ||||||
|   resources = append(resources, m10[0]) |  | ||||||
|   resources = append(resources, m11[0]) |  | ||||||
|   resources = append(resources, m12[0]) |  | ||||||
|   resources = append(resources, m13[0]) |  | ||||||
|   resources = append(resources, m14[0]) |  | ||||||
|   resources = append(resources, m15[0]) |  | ||||||
|   resources = append(resources, m16[0]) |  | ||||||
| 
 |  | ||||||
|   arenas_div1 := []Arena{} |  | ||||||
|   arenas_div1 = append(arenas_div1, NewVirtualArena("Arena 1")) |  | ||||||
|   arenas_div1 = append(arenas_div1, NewVirtualArena("Arena 2")) |  | ||||||
|   arenas_div2 := []Arena{} |  | ||||||
|   arenas_div2 = append(arenas_div2, NewVirtualArena("Arena 3")) |  | ||||||
|   arenas_div2 = append(arenas_div2, NewVirtualArena("Arena 4")) |  | ||||||
| 
 |  | ||||||
|   for _, arena := range arenas_div1 { |  | ||||||
|     resources = append(resources, arena) |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   for _, arena := range arenas_div2 { |  | ||||||
|     resources = append(resources, arena) |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   for _, team := range teams_div1 { |  | ||||||
|     resources = append(resources, team) |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   for _, team := range teams_div2 { |  | ||||||
|     resources = append(resources, team) |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   alliances_div1 := []*Alliance{} |  | ||||||
|   alliances_div1 = append(alliances_div1, NewAlliance(t1, t2)) |  | ||||||
|   alliances_div1 = append(alliances_div1, NewAlliance(t3, t4)) |  | ||||||
|   alliances_div1 = append(alliances_div1, NewAlliance(t5, t6)) |  | ||||||
|   alliances_div1 = append(alliances_div1, NewAlliance(t7, t8)) |  | ||||||
|   alliances_div2 := []*Alliance{} |  | ||||||
|   alliances_div2 = append(alliances_div2, NewAlliance(t9,  t10)) |  | ||||||
|   alliances_div2 = append(alliances_div2, NewAlliance(t11, t12)) |  | ||||||
|   alliances_div2 = append(alliances_div2, NewAlliance(t13, t14)) |  | ||||||
|   alliances_div2 = append(alliances_div2, NewAlliance(t15, t16)) |  | ||||||
| 
 |  | ||||||
|   for _, alliance := range alliances_div1 { |  | ||||||
|     resources = append(resources, alliance) |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   for _, alliance := range alliances_div2 { |  | ||||||
|     resources = append(resources, alliance) |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|   gql_server := NewGQLServer(":8080", GQLVexTypes(), GQLVexQueries(), GQLVexMutations(), GQLVexSubscriptions()) |  | ||||||
|   resources = append(resources, gql_server) |  | ||||||
| 
 |  | ||||||
|   root_event := NewEventQueue("root_event", "", []Resource{gql_server}) |  | ||||||
| 
 |  | ||||||
|   div_1 := NewEventQueue("Division 1", "", []Resource{}) |  | ||||||
|   err := AddChild(root_event, div_1, NewEventQueueInfo(1)) |  | ||||||
|   if err != nil { |  | ||||||
|     panic(fmt.Sprintf("Failed to add div_1: %s", err)) |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   div_2 := NewEventQueue("Division 2", "", []Resource{}) |  | ||||||
|   err = AddChild(root_event, div_2, NewEventQueueInfo(1)) |  | ||||||
|   if err != nil { |  | ||||||
|     panic(fmt.Sprintf("Failed to add div_2: %s", err)) |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   event_manager := NewEventManager(root_event, resources) |  | ||||||
| 
 |  | ||||||
|   for i, alliance := range(alliances_div1) { |  | ||||||
|     for j, alliance2 := range(alliances_div1) { |  | ||||||
|       if j != i { |  | ||||||
|         if alliance.Children()[0] == alliance2.Children()[0] || alliance.Children()[0] == alliance2.Children()[1] || alliance.Children()[1] == alliance2.Children()[0] || alliance.Children()[1] == alliance2.Children()[1] { |  | ||||||
|         } else { |  | ||||||
|           for arena_idx := 0; arena_idx < len(arenas_div1); arena_idx++ { |  | ||||||
|             match := NewMatch(alliance, alliance2, arenas_div1[arena_idx]) |  | ||||||
|             log.Logf("test", "Adding %s", match.Name()) |  | ||||||
|             err := event_manager.AddEvent(div_1, match, NewEventQueueInfo(i)) |  | ||||||
|             if err != nil { |  | ||||||
|               log.Logf("test", "Error adding %s: %s", match.Name(), err) |  | ||||||
|             } |  | ||||||
|           } |  | ||||||
|         } |  | ||||||
|       } |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   for i, alliance := range(alliances_div2) { |  | ||||||
|     for j, alliance2 := range(alliances_div2) { |  | ||||||
|       if j != i { |  | ||||||
|         if alliance.Children()[0] == alliance2.Children()[0] || alliance.Children()[0] == alliance2.Children()[1] || alliance.Children()[1] == alliance2.Children()[0] || alliance.Children()[1] == alliance2.Children()[1] { |  | ||||||
|         } else { |  | ||||||
|           for arena_idx := 0; arena_idx < len(arenas_div2); arena_idx++ { |  | ||||||
|             match := NewMatch(alliance, alliance2, arenas_div2[arena_idx]) |  | ||||||
|             log.Logf("test", "Adding %s", match.Name()) |  | ||||||
|             err := event_manager.AddEvent(div_2, match, NewEventQueueInfo(i)) |  | ||||||
|             if err != nil { |  | ||||||
|               log.Logf("test", "Error adding %s: %s", match.Name(), err) |  | ||||||
|             } |  | ||||||
|           } |  | ||||||
|         } |  | ||||||
|       } |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   return event_manager |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func main() { |  | ||||||
|   event_manager := fake_data() |  | ||||||
| 
 |  | ||||||
|   sigs := make(chan os.Signal, 1) |  | ||||||
|   signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM) |  | ||||||
| 
 |  | ||||||
|   go func() { |  | ||||||
|     cpufile, err := os.OpenFile("graphvent.cpu", os.O_TRUNC|os.O_CREATE|os.O_WRONLY, 0666) |  | ||||||
|     if err != nil { |  | ||||||
|       panic("Failed to open cpu profile file") |  | ||||||
|     } |  | ||||||
|     memfile, err := os.OpenFile("graphvent.mem", os.O_TRUNC|os.O_CREATE|os.O_WRONLY, 0666) |  | ||||||
|     if err != nil { |  | ||||||
|       panic("Failed to open mem profile file") |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     pprof.StartCPUProfile(cpufile) |  | ||||||
|     time.Sleep(3000 * time.Millisecond) |  | ||||||
|     pprof.WriteHeapProfile(memfile) |  | ||||||
|   }() |  | ||||||
| 
 |  | ||||||
|   go func() { |  | ||||||
|     for true { |  | ||||||
|       select { |  | ||||||
|       case <-sigs: |  | ||||||
|         pprof.Lookup("goroutine").WriteTo(os.Stdout, 1) |  | ||||||
|         signal := NewDownSignal(nil, "abort") |  | ||||||
|         SendUpdate(event_manager.root_event, signal) |  | ||||||
|         break |  | ||||||
|       } |  | ||||||
|     } |  | ||||||
|   }() |  | ||||||
| 
 |  | ||||||
|   log.Logf("test", "Starting event_manager") |  | ||||||
|   err := event_manager.Run() |  | ||||||
|   if err != nil { |  | ||||||
|     log.Logf("test", "Error running event_manager: %s", err) |  | ||||||
|   } else { |  | ||||||
|     log.Logf("test", "Finished event_manager") |  | ||||||
|   } |  | ||||||
|   pprof.StopCPUProfile() |  | ||||||
| } |  | ||||||
| @ -1,275 +0,0 @@ | |||||||
| package main |  | ||||||
| 
 |  | ||||||
| import ( |  | ||||||
|   "fmt" |  | ||||||
|   "time" |  | ||||||
|   "errors" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| type Member struct { |  | ||||||
|   BaseResource |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func NewMember(name string) * Member { |  | ||||||
|   member := &Member{ |  | ||||||
|     BaseResource: NewBaseResource(name, "A Team Member", []Resource{}), |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   return member |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| type Team struct { |  | ||||||
|   BaseResource |  | ||||||
|   Org string |  | ||||||
|   Team string |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (team * Team) Members() []*Member { |  | ||||||
|   ret := make([]*Member, len(team.children)) |  | ||||||
|   for idx, member := range(team.children) { |  | ||||||
|     ret[idx] = member.(*Member) |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   return ret |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func NewTeam(org string, team string, members []*Member) * Team { |  | ||||||
|   name := fmt.Sprintf("%s%s", org, team) |  | ||||||
|   description := fmt.Sprintf("Team %s", name) |  | ||||||
|   resource := &Team{ |  | ||||||
|     BaseResource: NewBaseResource(name, description, make([]Resource, len(members))), |  | ||||||
|     Org: org, |  | ||||||
|     Team: team, |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   for idx, member := range(members) { |  | ||||||
|     resource.children[idx] = member |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   return resource |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| type Alliance struct { |  | ||||||
|   BaseResource |  | ||||||
|   teams []*Team |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func NewAlliance(team0 * Team, team1 * Team) * Alliance { |  | ||||||
|   name := fmt.Sprintf("Alliance %s/%s", team0.Name(), team1.Name()) |  | ||||||
|   description := "" |  | ||||||
| 
 |  | ||||||
|   resource := &Alliance{ |  | ||||||
|     BaseResource: NewBaseResource(name, description, []Resource{team0, team1}), |  | ||||||
|     teams: []*Team{team0, team1}, |  | ||||||
|   } |  | ||||||
|   return resource |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| type Arena interface { |  | ||||||
|   Resource |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| type VirtualArena struct { |  | ||||||
|   BaseResource |  | ||||||
|   connected bool |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func NewVirtualArena(name string) * VirtualArena { |  | ||||||
|   arena := &VirtualArena{ |  | ||||||
|     BaseResource: NewBaseResource(name, "A virtual vex arena", []Resource{}), |  | ||||||
|     connected: false, |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   return arena |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (arena * VirtualArena) lock(node GraphNode) error { |  | ||||||
|   if arena.connected == false { |  | ||||||
|     log.Logf("vex", "ARENA NOT CONNECTED: %s", arena.Name()) |  | ||||||
|     error_str := fmt.Sprintf("%s is not connected, cannot lock", arena.Name()) |  | ||||||
|     return errors.New(error_str) |  | ||||||
|   } |  | ||||||
|   return nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (arena * VirtualArena) update(signal GraphSignal) { |  | ||||||
|   arena.signal <- signal |  | ||||||
|   arena.BaseResource.update(signal) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (arena * VirtualArena) Init(abort chan error) bool { |  | ||||||
|   log.Logf("vex", "Initializing %s", arena.Name()) |  | ||||||
|   go func(arena * VirtualArena, abort chan error) { |  | ||||||
|     signal := NewSignal(arena, "resource_connected") |  | ||||||
|     arena.connected = true |  | ||||||
|     SendUpdate(arena, signal) |  | ||||||
|     log.Logf("vex", "VIRTUAL_ARENA goroutine starting: %s", arena.Name()) |  | ||||||
|     for true { |  | ||||||
|       select { |  | ||||||
|       case <- abort: |  | ||||||
|         log.Logf("vex", "Virtual arena %s aborting", arena.Name()) |  | ||||||
|         break |  | ||||||
|       case update := <- arena.signal: |  | ||||||
|         log.Logf("vex", "VIRTUAL_ARENA_ACTION: %s : %+v", arena.Name(), update) |  | ||||||
|       } |  | ||||||
|     } |  | ||||||
|   }(arena, abort) |  | ||||||
|   return true |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| type VexEvent struct { |  | ||||||
|   BaseEvent |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func NewVexEvent(name string, description string) * VexEvent { |  | ||||||
|   event := &VexEvent{ |  | ||||||
|     BaseEvent: NewBaseEvent(name, description, []Resource{}), |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   event.actions["wait"] = EventWait(event) |  | ||||||
|   event.handlers["abort"] = EventAbort(event) |  | ||||||
|   event.actions["start"] = func() (string, error) { |  | ||||||
|     log.Logf("vex", "STARTING_VEX_TOURNAMENT %s", event.Name()) |  | ||||||
|     return "wait", nil |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   return event |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| const start_slack = 250 * time.Millisecond |  | ||||||
| const TEMP_AUTON_TIME = 5 * time.Second |  | ||||||
| const TEMP_DRIVE_TIME = 5 * time.Second |  | ||||||
| 
 |  | ||||||
| type Match struct { |  | ||||||
|   BaseEvent |  | ||||||
|   arena Arena |  | ||||||
|   state string |  | ||||||
|   control string |  | ||||||
|   control_start time.Time |  | ||||||
|   control_duration time.Duration |  | ||||||
|   alliances []*Alliance |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func NewMatch(alliance0 * Alliance, alliance1 * Alliance, arena Arena) * Match { |  | ||||||
|   name := fmt.Sprintf("Match: %s vs. %s on %s", alliance0.Name(), alliance1.Name(), arena.Name()) |  | ||||||
|   description := "A vex match" |  | ||||||
| 
 |  | ||||||
|   match := &Match{ |  | ||||||
|     BaseEvent: NewBaseEvent(name, description, []Resource{alliance0, alliance1, arena}), |  | ||||||
|     state: "init", |  | ||||||
|     control: "init", |  | ||||||
|     control_start: time.UnixMilli(0), |  | ||||||
|     control_duration: 0, |  | ||||||
|     arena: arena, |  | ||||||
|     alliances: []*Alliance{alliance0, alliance1}, |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   match.actions["wait"] = EventWait(match) |  | ||||||
|   match.handlers["abort"] = EventAbort(match) |  | ||||||
| 
 |  | ||||||
|   match.actions["start"] = func() (string, error) { |  | ||||||
|     log.Logf("vex", "STARTING_MATCH %s", match.Name()) |  | ||||||
|     match.control = "none" |  | ||||||
|     match.state = "scheduled" |  | ||||||
|     match.control_start = time.Now() |  | ||||||
|     return "wait", nil |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   match.handlers["queue_autonomous"] = func(signal GraphSignal) (string, error) { |  | ||||||
|     if match.state != "scheduled" { |  | ||||||
|       log.Logf("vex", "BAD_STATE: %s: %s - %s", signal.Type(), match.state, match.Name()) |  | ||||||
|       return "wait", nil |  | ||||||
|     } |  | ||||||
|     log.Logf("vex", "AUTONOMOUS_QUEUED: %s", match.Name()) |  | ||||||
|     match.control = "none" |  | ||||||
|     match.state = "autonomous_queued" |  | ||||||
|     match.control_start = time.Now().Add(start_slack) |  | ||||||
|     new_signal := NewSignal(match, "autonomous_queued") |  | ||||||
|     go SendUpdate(match, new_signal) |  | ||||||
|     return "wait", nil |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   match.handlers["start_autonomous"] = func(signal GraphSignal) (string, error) { |  | ||||||
|     if match.state != "autonomous_queued" { |  | ||||||
|       log.Logf("vex", "BAD_STATE: %s: %s - %s", signal.Type(), match.state, match.Name()) |  | ||||||
|       return "wait", nil |  | ||||||
|     } |  | ||||||
|     log.Logf("vex", "AUTONOMOUS_RUNNING: %s", match.Name()) |  | ||||||
|     match.control = "program" |  | ||||||
|     match.state = "autonomous_running" |  | ||||||
|     match.control_start = time.Now() // TODO
 |  | ||||||
|     match.control_duration = TEMP_AUTON_TIME |  | ||||||
| 
 |  | ||||||
|     go SendUpdate(match, NewSignal(match, "autonomous_running")) |  | ||||||
| 
 |  | ||||||
|     end_time := match.control_start.Add(TEMP_AUTON_TIME) |  | ||||||
|     match.SetTimeout(end_time, "autonomous_done") |  | ||||||
|     log.Logf("vex", "AUTONOMOUS@%s: %s UNTIL %s", time.Now(), match.control_start, end_time) |  | ||||||
|     return "wait", nil |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   match.handlers["autonomous_done"] = func(signal GraphSignal) (string, error) { |  | ||||||
|     if match.state != "autonomous_running" { |  | ||||||
|       log.Logf("vex", "BAD_STATE: %s: %s - %s", signal.Type(), match.state, match.Name()) |  | ||||||
|       return "wait", nil |  | ||||||
|     } |  | ||||||
|     log.Logf("vex", "AUTONOMOUS_DONE: %s", match.Name()) |  | ||||||
|     match.control = "none" |  | ||||||
|     match.state = "autonomous_done" |  | ||||||
| 
 |  | ||||||
|     return "wait", nil |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   match.handlers["queue_driver"] = func(signal GraphSignal) (string, error) { |  | ||||||
|     if match.state != "autonomous_done"{ |  | ||||||
|       log.Logf("vex", "BAD_STATE: %s: %s - %s", signal.Type(), match.state, match.Name()) |  | ||||||
|       return "wait", nil |  | ||||||
|     } |  | ||||||
|     match.control = "none" |  | ||||||
|     match.state = "driver_queued" |  | ||||||
|     match.control_start = time.Now().Add(start_slack) |  | ||||||
|     new_signal := NewSignal(match, "driver_queued") |  | ||||||
|     go SendUpdate(match, new_signal) |  | ||||||
|     return "wait", nil |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   match.handlers["start_driver"] = func(signal GraphSignal) (string, error) { |  | ||||||
|     if match.state != "driver_queued" { |  | ||||||
|       log.Logf("vex", "BAD_STATE: %s: %s - %s", signal.Type(), match.state, match.Name()) |  | ||||||
|       return "wait", nil |  | ||||||
|     } |  | ||||||
|     match.control = "driver" |  | ||||||
|     match.state = "driver_running" |  | ||||||
|     match.control_start = time.Now() // TODO
 |  | ||||||
|     match.control_duration = TEMP_DRIVE_TIME |  | ||||||
| 
 |  | ||||||
|     go SendUpdate(match, NewSignal(match, "driver_running")) |  | ||||||
| 
 |  | ||||||
|     end_time := match.control_start.Add(TEMP_DRIVE_TIME) |  | ||||||
|     match.SetTimeout(end_time, "driver_done") |  | ||||||
| 
 |  | ||||||
|     return "wait", nil |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   match.handlers["driver_done"] = func(signal GraphSignal) (string, error) { |  | ||||||
|     if match.state != "driver_running" { |  | ||||||
|       log.Logf("vex", "BAD_STATE: %s: %s - %s", signal.Type(), match.state, match.Name()) |  | ||||||
|       return "wait", nil |  | ||||||
|     } |  | ||||||
|     match.control = "none" |  | ||||||
|     match.state = "driver_done" |  | ||||||
| 
 |  | ||||||
|     return "", nil |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   match.actions["driver_done"] = func() (string, error) { |  | ||||||
|     SendUpdate(match, NewSignal(match, "driver_done")) |  | ||||||
|     return "wait", nil |  | ||||||
|   } |  | ||||||
|   match.actions["autonomous_done"] = func() (string, error) { |  | ||||||
|     SendUpdate(match, NewSignal(match, "autonomous_done")) |  | ||||||
|     return "wait", nil |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   return match |  | ||||||
| } |  | ||||||
| @ -1,174 +0,0 @@ | |||||||
| package main |  | ||||||
| 
 |  | ||||||
| import ( |  | ||||||
|   "testing" |  | ||||||
|   "fmt" |  | ||||||
|   "runtime/pprof" |  | ||||||
|   "os" |  | ||||||
|   "time" |  | ||||||
| ) |  | ||||||
| 
 |  | ||||||
| type vex_tester graph_tester |  | ||||||
| 
 |  | ||||||
| func TestNewMemberAdd(t *testing.T) { |  | ||||||
|   name := "Noah" |  | ||||||
| 
 |  | ||||||
|   member := NewMember(name) |  | ||||||
|   root_event := NewEvent("", "", []Resource{member}) |  | ||||||
|   event_manager := NewEventManager(root_event, []Resource{member}) |  | ||||||
|   res := event_manager.FindResource(member.ID()) |  | ||||||
| 
 |  | ||||||
|   if res == nil { |  | ||||||
|     t.Fatal("Failed to find member in event_manager") |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   if res.Name() != name || res.ID() != member.ID() { |  | ||||||
|     t.Fatal("Name/ID of returned resource did not match") |  | ||||||
|   } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func TestNewTeamAdd(t *testing.T) { |  | ||||||
|   name_1 := "Noah" |  | ||||||
|   name_2 := "Ben" |  | ||||||
| 
 |  | ||||||
|   org := "6659" |  | ||||||
|   team_id := "S" |  | ||||||
| 
 |  | ||||||
|   member_1 := NewMember(name_1) |  | ||||||
|   member_2 := NewMember(name_2) |  | ||||||
| 
 |  | ||||||
|   team := NewTeam(org, team_id, []*Member{member_1, member_2}) |  | ||||||
| 
 |  | ||||||
|   root_event := NewEvent("", "", []Resource{team}) |  | ||||||
|   event_manager := NewEventManager(root_event, []Resource{member_1, member_2, team}) |  | ||||||
|   res := event_manager.FindResource(team.ID()) |  | ||||||
| 
 |  | ||||||
|   if res == nil { |  | ||||||
|     t.Fatal("Failed to find team in event_manager") |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   if res.Name() !=  fmt.Sprintf("%s%s", org, team_id) || res.ID() != team.ID() { |  | ||||||
|     t.Fatal("Name/ID of returned team did not match") |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   if res.Children()[0].ID() != member_1.ID() && res.Children()[1].ID() != member_1.ID() { |  | ||||||
|     t.Fatal("Could not find member_1 in team") |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   if res.Children()[0].ID() != member_2.ID() && res.Children()[1].ID() != member_2.ID() { |  | ||||||
|     t.Fatal("Could not find member_2 in team") |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   res = event_manager.FindResource(member_1.ID()) |  | ||||||
| 
 |  | ||||||
|   if res == nil { |  | ||||||
|     t.Fatal("Failed to find member_1 in event_manager") |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   if res.Name() != name_1 || res.ID() != member_1.ID() { |  | ||||||
|     t.Fatal("Name/ID of returned member_1 did not match") |  | ||||||
|   } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func TestNewAllianceAdd(t *testing.T) { |  | ||||||
|   name_1 := "Noah" |  | ||||||
|   name_2 := "Ben" |  | ||||||
| 
 |  | ||||||
|   org_1 := "6659" |  | ||||||
|   team_id_1 := "S" |  | ||||||
| 
 |  | ||||||
|   org_2 := "210" |  | ||||||
|   team_id_2 := "Y" |  | ||||||
| 
 |  | ||||||
|   member_1 := NewMember(name_1) |  | ||||||
|   member_2 := NewMember(name_2) |  | ||||||
| 
 |  | ||||||
|   team_1 := NewTeam(org_1, team_id_1, []*Member{member_1}) |  | ||||||
|   team_2 := NewTeam(org_2, team_id_2, []*Member{member_2}) |  | ||||||
| 
 |  | ||||||
|   alliance := NewAlliance(team_1, team_2) |  | ||||||
| 
 |  | ||||||
|   root_event := NewEvent("", "", []Resource{alliance}) |  | ||||||
|   event_manager := NewEventManager(root_event, []Resource{member_1, member_2, team_1, team_2, alliance}) |  | ||||||
|   res := event_manager.FindResource(alliance.ID()) |  | ||||||
| 
 |  | ||||||
|   if res == nil { |  | ||||||
|     t.Fatal("Failed to find alliance in event_manager") |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   if res.Name() !=  fmt.Sprintf("Alliance %s/%s", team_1.Name(), team_2.Name()) || res.ID() != alliance.ID() { |  | ||||||
|     t.Fatal("Name/ID of returned alliance did not match") |  | ||||||
|   } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func TestNewMatch(t *testing.T) { |  | ||||||
|   name_1 := "Noah" |  | ||||||
|   name_2 := "Ben" |  | ||||||
|   name_3 := "Justin" |  | ||||||
|   name_4 := "Ian" |  | ||||||
| 
 |  | ||||||
|   org_1 := "6659" |  | ||||||
|   org_2 := "210" |  | ||||||
| 
 |  | ||||||
|   team_id_1 := "S" |  | ||||||
|   team_id_2 := "Y" |  | ||||||
| 
 |  | ||||||
|   arena_name := "Center Arena" |  | ||||||
| 
 |  | ||||||
|   member_1 := NewMember(name_1) |  | ||||||
|   member_2 := NewMember(name_2) |  | ||||||
| 
 |  | ||||||
|   member_3 := NewMember(name_3) |  | ||||||
|   member_4 := NewMember(name_4) |  | ||||||
| 
 |  | ||||||
|   team_1 := NewTeam(org_1, team_id_1, []*Member{member_1}) |  | ||||||
|   team_2 := NewTeam(org_1, team_id_2, []*Member{member_2}) |  | ||||||
| 
 |  | ||||||
|   team_3 := NewTeam(org_2, team_id_1, []*Member{member_3}) |  | ||||||
|   team_4 := NewTeam(org_2, team_id_2, []*Member{member_4}) |  | ||||||
| 
 |  | ||||||
|   alliance_1 := NewAlliance(team_1, team_2) |  | ||||||
|   alliance_2 := NewAlliance(team_3, team_4) |  | ||||||
| 
 |  | ||||||
|   arena := NewVirtualArena(arena_name) |  | ||||||
|   arena_c := arena.UpdateChannel() |  | ||||||
| 
 |  | ||||||
|   match := NewMatch(alliance_1, alliance_2, arena) |  | ||||||
|   root_event := NewEventQueue("root_event", "", []Resource{}) |  | ||||||
|   r := root_event.DoneResource() |  | ||||||
| 
 |  | ||||||
|   event_manager := NewEventManager(root_event, []Resource{member_1, member_2, member_3, member_4, team_1, team_2, team_3, team_4, alliance_1, alliance_2, arena}) |  | ||||||
|   event_manager.AddEvent(root_event, match, NewEventQueueInfo(1)) |  | ||||||
| 
 |  | ||||||
|   go func() { |  | ||||||
|     time.Sleep(time.Second * 20) |  | ||||||
|     if r.Owner() != nil { |  | ||||||
|       pprof.Lookup("goroutine").WriteTo(os.Stdout, 1) |  | ||||||
|       abort_signal := NewDownSignal(root_event, "abort") |  | ||||||
|       SendUpdate(root_event, abort_signal) |  | ||||||
|     } |  | ||||||
|   }() |  | ||||||
| 
 |  | ||||||
|   go func(arena_c chan GraphSignal) { |  | ||||||
|     (*graph_tester)(t).WaitForValue(arena_c, "event_start", match, 1*time.Second, "no event_start") |  | ||||||
|     SendUpdate(arena, NewDownSignal(nil, "queue_autonomous")) |  | ||||||
|     (*graph_tester)(t).WaitForValue(arena_c, "autonomous_queued", match, 1*time.Second, "no autonomous_queued") |  | ||||||
|     auton_signal := NewDownSignal(nil, "start_autonomous") |  | ||||||
|     SendUpdate(arena, auton_signal) |  | ||||||
|     (*graph_tester)(t).WaitForValue(arena_c, "autonomous_running", match, 1*time.Second, "no autonomous_running") |  | ||||||
|     (*graph_tester)(t).WaitForValue(arena_c, "autonomous_done", match, 6*time.Second, "no autonomous_done") |  | ||||||
|     SendUpdate(arena, NewDownSignal(nil, "queue_driver")) |  | ||||||
|     (*graph_tester)(t).WaitForValue(arena_c, "driver_queued", match, 1*time.Second, "no driver_queued") |  | ||||||
|     driver_signal := NewDownSignal(nil, "start_driver") |  | ||||||
|     SendUpdate(arena, driver_signal) |  | ||||||
|     (*graph_tester)(t).WaitForValue(arena_c, "driver_running", match, 1*time.Second, "no driver_running") |  | ||||||
|     (*graph_tester)(t).WaitForValue(arena_c, "driver_done", match, 6*time.Second, "no driver_done") |  | ||||||
|     cancel_signal := NewDownSignal(nil, "cancel") |  | ||||||
|     SendUpdate(root_event, cancel_signal) |  | ||||||
|   }(arena_c) |  | ||||||
| 
 |  | ||||||
|   err := event_manager.Run() |  | ||||||
|   if err != nil { |  | ||||||
|     t.Fatal(err) |  | ||||||
|   } |  | ||||||
| } |  | ||||||
		Loading…
	
		Reference in New Issue