// Run runs the Queue component. func (queue *Queue) Run() { l, err := pythia.Listen(pythia.QueueAddr) if err != nil { log.Fatal(err) } log.Println("Listening to", pythia.QueueAddr) closing := false master := make(chan queueMessage) queue.master = master go func() { <-queue.quit closing = true l.Close() }() queue.wg.Add(1) go queue.main(master) nextid := 0 for { conn, err := l.Accept() if closing { break } else if err != nil { log.Print(err) continue } response := make(chan pythia.Message) client := &queueClient{ Id: nextid, Response: response, Running: make(map[string]*queueJob), Submitted: make(map[string]*queueJob), } master <- queueMessage{pythia.Message{Message: connectMsg}, client} queue.wg.Add(1) go queue.handle(conn, client, response) nextid++ } master <- queueMessage{pythia.Message{Message: quitMsg}, nil} queue.wg.Wait() }
// Setup an environment for testing the Pool component. // The pool capacity is configured with capacity. The test will fail if the pool // does not register correctly. func SetupPoolFixture(t *testing.T, capacity int) *PoolFixture { var err error f := new(PoolFixture) // Setup mock queue t.Log("Setup queue") addr, err := pythia.LocalAddr() if err != nil { t.Fatal(err) } pythia.QueueAddr = addr f.Queue, err = pythia.Listen(addr) if err != nil { t.Fatal(err) } // Setup pool t.Log("Setup pool") f.Pool = NewPool() f.Pool.Capacity = capacity f.Pool.UmlPath = pytest.UmlPath f.Pool.EnvDir = pytest.VmDir f.Pool.TasksDir = pytest.TasksDir go f.Pool.Run() // Establish connection t.Log("Establish connection") conn, err := f.Queue.Accept() if err != nil { f.Queue.Close() t.Fatal(err) } f.Conn = &pytest.Conn{t, conn} // Wait for register-pool message f.Conn.Expect(2, pythia.Message{ Message: pythia.RegisterPoolMsg, Capacity: capacity, }) return f }