// RunTest a single test - takes a test-file as a string that will be copied // to the deterlab-server func RunTest(rc platform.RunConfig) (*monitor.Stats, error) { done := make(chan struct{}) CheckHosts(rc) rc.Delete("simulation") rs := monitor.NewStats(rc.Map(), "hosts", "bf") monitor := monitor.NewMonitor(rs) if err := deployP.Deploy(rc); err != nil { log.Error(err) return rs, err } monitor.SinkPort = monitorPort if err := deployP.Cleanup(); err != nil { log.Error(err) return rs, err } monitor.SinkPort = monitorPort go func() { if err := monitor.Listen(); err != nil { log.Fatal("Could not monitor.Listen():", err) } }() // Start monitor before so ssh tunnel can connect to the monitor // in case of deterlab. err := deployP.Start() if err != nil { log.Error(err) return rs, err } go func() { var err error if err = deployP.Wait(); err != nil { log.Lvl3("Test failed:", err) if err := deployP.Cleanup(); err != nil { log.Lvl3("Couldn't cleanup platform:", err) } done <- struct{}{} } log.Lvl3("Test complete:", rs) done <- struct{}{} }() timeOut := getRunWait(rc) // can timeout the command if it takes too long select { case <-done: monitor.Stop() return rs, nil case <-time.After(time.Second * time.Duration(timeOut)): monitor.Stop() return rs, errors.New("Simulation timeout") } }