public string EnqueueTestPlan(string testPlanId, IDictionary<string, string> args) { // Create a new run string runId = results.CreateRun("Run at " + DateTime.Now.TimeOfDay); lock(queue) { queue.Add (delegate() { SystemStatus stat = new SystemStatus(); stat.CurrentTestPlan = testPlanId; stat.CurrentTestRun = runId; stat.MicroStatus = "Initializing Test Plan"; UpdateStatus(stat); // Atomic string testPlanCode; using(Stream tpStream = testPlans.ReadTestPlan(testPlanId)) { using(StreamReader reader = new StreamReader(tpStream)) { testPlanCode = reader.ReadToEnd(); } } // Environment for this run IJSTestProvider provider = new TestProvider( machines.Drivers.SelectMany (d => d.Machines), testDriverManager.Drivers, results, runId); // Javascript runner using(JSTestRunner runner = new JSTestRunner("TEST_INIT", args, provider)) { try { stat.MicroStatus = "Running Test Plan"; UpdateStatus(stat); // Run our javascript runner.Execute(testPlanCode, new Dictionary<string, string>()); } catch(Exception e) { Console.WriteLine(e.Message); } stat.MicroStatus = "Cleaning Up Snapshots"; UpdateStatus(stat); // This will get run by the "using" block, regardless. runner.CleanUp(); } stat.CurrentTestPlan = null; stat.CurrentTestRun = null; stat.CurrentMachine = null; stat.MicroStatus = null; UpdateStatus(stat); }); } return runId; }
void UpdateStatus(SystemStatus stat) { CurrentSystemStatus = stat.Clone() as SystemStatus; }