示例#1
0
        public void TestProcess_Empty()
        {
            Guid jobId = Guid.NewGuid();

            using (var db = new ProducerContext())
            {
                var item       = db.Sessions.Single(s => s.Id == sessionId);
                var user       = db.Users.Single(u => u.Name == userName);
                var simulation = db.Simulations.Single(s => s.Name == simulationName);
                var job        = new Turbine.Data.Entities.Job
                {
                    Id         = jobId,
                    Session    = item,
                    Create     = DateTime.UtcNow,
                    State      = "create",
                    User       = user,
                    Simulation = simulation
                };
                db.Jobs.Add(job);
                db.SaveChanges();
            }
            using (var db = new ProducerContext())
            {
                var item = db.Jobs.Single(s => s.Id == jobId);
                item.Process = new Turbine.Data.Entities.Process
                {
                };
                db.SaveChanges();
            }
        }
示例#2
0
 public void TestJob_NoUser()
 {
     using (var db = new ProducerContext())
     {
         var item     = db.Sessions.Single(s => s.Id == sessionId);
         var app      = db.Applications.Single(a => a.Name == "ACM");
         var consumer = new Turbine.Data.Entities.JobConsumer
         {
             Id          = Guid.NewGuid(),
             keepalive   = DateTime.UtcNow,
             status      = "up",
             Application = app
         };
         var user       = db.Users.Single(u => u.Name == userName);
         var simulation = db.Simulations.Single(s => s.Name == simulationName);
         var job        = new Turbine.Data.Entities.Job
         {
             Id      = Guid.NewGuid(),
             Session = item,
             Create  = DateTime.UtcNow,
             State   = "create",
             //User = user,
             Consumer   = consumer,
             Simulation = simulation
         };
         db.Jobs.Add(job);
         try
         {
             db.SaveChanges();
         }
         catch (System.Data.Entity.Validation.DbEntityValidationException e)
         {
             foreach (var eve in e.EntityValidationErrors)
             {
                 Console.WriteLine("Entity of type \"{0}\" in state \"{1}\" has the following validation errors:",
                                   eve.Entry.Entity.GetType().Name, eve.Entry.State);
                 foreach (var ve in eve.ValidationErrors)
                 {
                     Console.WriteLine("- Property: \"{0}\", Error: \"{1}\"",
                                       ve.PropertyName, ve.ErrorMessage);
                 }
             }
             throw;
         }
     }
 }
示例#3
0
        public void TestProcess_Full()
        {
            Guid jobId = Guid.NewGuid();

            using (var db = new ProducerContext())
            {
                var item       = db.Sessions.Single(s => s.Id == sessionId);
                var user       = db.Users.Single(u => u.Name == userName);
                var simulation = db.Simulations.Single(s => s.Name == simulationName);
                var job        = new Turbine.Data.Entities.Job
                {
                    Id         = jobId,
                    Session    = item,
                    Create     = DateTime.UtcNow,
                    State      = "create",
                    User       = user,
                    Simulation = simulation
                };
                db.Jobs.Add(job);
                db.SaveChanges();
            }
            using (var db = new ProducerContext())
            {
                var item = db.Jobs.Single(s => s.Id == jobId);
                item.Process = new Turbine.Data.Entities.Process
                {
                    Input      = "Input string",
                    Output     = "Output string",
                    WorkingDir = "MYDIR",
                    Status     = -1,
                    Stdin      = "",
                    Stderr     = "",
                    Stdout     = ""
                };
                db.SaveChanges();
            }
        }
示例#4
0
        private static Dictionary <string, object> GetJobRepresentation(Turbine.Data.Entities.Job entity, bool verbose)
        {
            var    dict  = new Dictionary <string, Object>();
            string input = entity.Process.Input;
            IDictionary <string, Object> inputDict = new Dictionary <string, Object>()
            {
            };

            if (input != null)
            {
                inputDict = Newtonsoft.Json.JsonConvert.DeserializeObject <Dictionary <string, Object> >(input);
            }

            string output = entity.Process.Output;
            IDictionary <string, Object> outputDict = null;

            if (output != null)
            {
                outputDict = Newtonsoft.Json.JsonConvert.DeserializeObject <Dictionary <string, Object> >(output);
            }

            string[] msg_array = null;
            if (verbose)
            {
                msg_array = entity.Messages.Select <Turbine.Data.Entities.Message, string>(s => s.Value).ToArray <string>();
            }

            /*
             * Serialize.ProcessErrorList errorList = new Serialize.ProcessErrorList();
             *
             * foreach (var error in entity.Process.Errors)
             * {
             *  var pe = new Serialize.ProcessError();
             *  pe.Error = error.Error;
             *  pe.Type = error.Type;
             *  pe.Name = error.Name;
             *  errorList.Add(pe);
             * }
             */
            ProcessErrorList errorList = new ProcessErrorList();

            foreach (var error in entity.Process.Error)
            {
                var pe = new ProcessError()
                {
                    Error = error.Error, Name = error.Name, Type = error.Type
                };
                errorList.Add(pe);
            }
            int status;

            try
            {
                status = (int)entity.Process.Status;
            }
            catch (Exception)
            {
                status = -1;
            }

            dict["Id"]         = entity.Count;
            dict["Guid"]       = entity.Id;
            dict["Simulation"] = entity.Simulation.Name;
            dict["State"]      = entity.State;
            dict["Messages"]   = msg_array;
            dict["Input"]      = inputDict;
            dict["Output"]     = outputDict;
            dict["Errors"]     = errorList;
            dict["Status"]     = status;
            dict["Session"]    = entity.Session.Id;
            dict["Initialize"] = entity.Initialize;
            dict["Reset"]      = entity.Reset;
            dict["Visible"]    = entity.Visible;

            if (entity.Consumer != null)
            {
                dict["Consumer"] = entity.Consumer.Id;
            }
            if (entity.Create != null)
            {
                dict["Create"] = ConvertDateTime((DateTime)entity.Create);
            }
            if (entity.Submit != null)
            {
                dict["Submit"] = ConvertDateTime((DateTime)entity.Submit);
            }
            if (entity.Setup != null)
            {
                dict["Setup"] = ConvertDateTime((DateTime)entity.Setup);
            }
            if (entity.Running != null)
            {
                dict["Running"] = ConvertDateTime((DateTime)entity.Running);
            }
            if (entity.Finished != null)
            {
                dict["Finished"] = ConvertDateTime((DateTime)entity.Finished);
            }

            return(dict);
        }
        public static void Initialize(TestContext context)
        {
            BaseDatabaseTest.CleanUpDatabase();

            using (var db = new ProducerContext())
            {
                var app = new Turbine.Data.Entities.Application {
                    Name = "ACM", Version = "7.3"
                };
                db.Applications.Add(app);
                var user = new Turbine.Data.Entities.User {
                    Name = userName
                };
                db.Users.Add(user);
                db.SaveChanges();
            }
            using (var db = new ProducerContext())
            {
                var item = db.Applications.Single(s => s.Name == "ACM");
                item.InputFileTypes.Add(new Turbine.Data.Entities.InputFileType
                {
                    Id       = Guid.NewGuid(),
                    Name     = "configuration",
                    Required = true,
                    Type     = "plain/text"
                });
                item.InputFileTypes.Add(new Turbine.Data.Entities.InputFileType
                {
                    Id       = Guid.NewGuid(),
                    Name     = "aspenfile",
                    Required = true,
                    Type     = "plain/text"
                });
                db.SaveChanges();
            }
            using (var db = new ProducerContext())
            {
                var app  = db.Applications.Single(s => s.Name == "ACM");
                var user = db.Users.Single(u => u.Name == userName);
                var sim  = new Turbine.Data.Entities.Simulation
                {
                    Id          = Guid.NewGuid(),
                    Application = app,
                    Create      = DateTime.UtcNow,
                    Name        = simulationName,
                    Update      = DateTime.UtcNow,
                    User        = user
                };
                db.Simulations.Add(sim);
                db.SaveChanges();
            }
            using (var db = new ProducerContext())
            {
                var item = new Turbine.Data.Entities.Session
                {
                    Id          = sessionId,
                    Description = "testing simulation",
                    Create      = DateTime.UtcNow
                };
                db.Sessions.Add(item);
                db.SaveChanges();
            }


            List <Turbine.Data.Entities.Job> jobsList = new List <Turbine.Data.Entities.Job>();

            // Session
            using (var db = new ProducerContext())
            {
                var item       = db.Sessions.Single(s => s.Id == sessionId);
                var user       = db.Users.Single(u => u.Name == userName);
                var simulation = db.Simulations.Single(s => s.Name == simulationName);

                for (int i = 0; i < 10; i++)
                {
                    var job = new Turbine.Data.Entities.Job
                    {
                        Id         = Guid.NewGuid(),
                        Session    = item,
                        Create     = DateTime.UtcNow,
                        State      = "success",
                        User       = user,
                        Simulation = simulation
                    };
                    jobsList.Add(job);
                    db.Jobs.Add(job);
                }

                db.SaveChanges();
            }


            using (var db = new ProducerContext())
            {
                var session = db.Sessions.Single(s => s.Id == sessionId);
                var item    = new Turbine.Data.Entities.Generator
                {
                    Id      = generatorId,
                    Page    = 1,
                    Session = session,
                    Create  = DateTime.UtcNow
                };
                db.Generators.Add(item);
                db.SaveChanges();
            }

            using (var db = new ProducerContext())
            {
                var generator = db.Generators.Single(g => g.Id == generatorId);
                var session   = db.Sessions.Single(s => s.Id == sessionId);

                Debug.WriteLine("Generator Page num: " + generator.Page);

                foreach (var job in session.Jobs)
                {
                    var item = new Turbine.Data.Entities.GeneratorJob
                    {
                        Id        = Guid.NewGuid(),
                        Page      = 2,
                        Generator = generator,
                        Job       = job
                    };
                    db.GeneratorJobs.Add(item);
                }

                db.SaveChanges();
            }
        }
        public void TestGenerator_OtherJobs()
        {
            using (var db = new ProducerContext())
            {
                var item       = db.Sessions.Single(s => s.Id == sessionId);
                var user       = db.Users.Single(u => u.Name == userName);
                var simulation = db.Simulations.Single(s => s.Name == simulationName);

                for (int i = 0; i < 10; i++)
                {
                    var job = new Turbine.Data.Entities.Job
                    {
                        Id         = Guid.NewGuid(),
                        Session    = item,
                        Create     = DateTime.UtcNow,
                        State      = "error",
                        User       = user,
                        Simulation = simulation
                    };
                    db.Jobs.Add(job);
                }
                db.SaveChanges();
            }

            using (var db = new ProducerContext())
            {
                // Getting Jobs that are not in the Generators table
                // By doing a left join and getting all the nulls
                var jobs = from j in db.Jobs
                           join g in db.GeneratorJobs on j.Id equals g.JobId into joinedtable
                           from x in joinedtable.DefaultIfEmpty()
                           where x.JobId == null
                           select j;

                foreach (var job in jobs)
                {
                    Debug.WriteLine("Job: " + job.Count + " is not in Generator"
                                    , "GeneratorClassTest.TestGenerator_Create");
                }
            }


            // Add Another generator
            Guid generatorId2 = Guid.NewGuid();

            using (var db = new ProducerContext())
            {
                var session = db.Sessions.Single(s => s.Id == sessionId);
                var item    = new Turbine.Data.Entities.Generator
                {
                    Id      = generatorId2,
                    Page    = 1,
                    Session = session,
                    Create  = DateTime.UtcNow
                };
                db.Generators.Add(item);
                db.SaveChanges();
            }

            using (var db = new ProducerContext())
            {
                var item       = db.Sessions.Single(s => s.Id == sessionId);
                var user       = db.Users.Single(u => u.Name == userName);
                var simulation = db.Simulations.Single(s => s.Name == simulationName);

                for (int i = 0; i < 10; i++)
                {
                    var job = new Turbine.Data.Entities.Job
                    {
                        Id         = Guid.NewGuid(),
                        Session    = item,
                        Create     = DateTime.UtcNow,
                        State      = "terminate",
                        User       = user,
                        Simulation = simulation
                    };
                    db.Jobs.Add(job);
                }
                db.SaveChanges();
            }

            using (var db = new ProducerContext())
            {
                var generator = db.Generators.Single(g => g.Id == generatorId2);
                var session   = db.Sessions.Single(s => s.Id == sessionId);

                Debug.WriteLine("Generator Page num: " + generator.Page);

                foreach (var job in session.Jobs.Where(j => j.Count > 20))
                {
                    var item = new Turbine.Data.Entities.GeneratorJob
                    {
                        Id        = Guid.NewGuid(),
                        Page      = 2,
                        Generator = generator,
                        Job       = job
                    };
                    db.GeneratorJobs.Add(item);
                }

                db.SaveChanges();
            }


            using (var db = new ProducerContext())
            {
                // Getting Jobs that are not in the Generators table
                // By doing a left join and getting all the nulls

                /*var jobs = from j in db.Jobs
                 *         join g in db.GeneratorJobs.Where(y => y.GeneratorId == generatorId2) on j.Id equals g.JobId into joinedtable
                 *         from x in joinedtable.DefaultIfEmpty()
                 *         where x.JobId == null
                 *         select j;*/

                var jobs = from j in db.Jobs
                           join g in db.GeneratorJobs.Where(y => y.GeneratorId == generatorId2) on j.Id equals g.JobId into joinedtable
                           from x in joinedtable.DefaultIfEmpty()
                           where x.JobId == null && j.SessionId == sessionId && (j.State == "success" || j.State == "error" || j.State == "terminate")
                           select j;

                foreach (var job in db.Jobs.OrderBy(j => j.Count))
                {
                    Debug.WriteLine("Job: " + job.Count
                                    , "GeneratorClassTest.TestGenerator_Create");
                }

                foreach (var job in jobs)
                {
                    Debug.WriteLine("Job: " + job.Count + " is not in Generator"
                                    , "GeneratorClassTest.TestGenerator_Create");
                }
            }
        }
        //[DeploymentItem(@"models\Hybrid_v0.51_rev1.1_UQ_0809.acmf")]
        //[DeploymentItem(@"models\Hybrid_v0.51_rev1.1_UQ_0809_sinter.json")]
        public void TestApplication_Write()
        {
            //AppDomain.CurrentDomain.SetData("DataDirectory",
            //    Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData));
            var guid           = Guid.NewGuid();
            var simulationName = "Test";

            using (var db = new ProducerContext())
            {
                var app = new Turbine.Data.Entities.Application {
                    Name = "ACM", Version = "7.3"
                };
                db.Applications.Add(app);
                var user = new Turbine.Data.Entities.User {
                    Name = "testuser"
                };
                db.Users.Add(user);
                db.SaveChanges();
            }
            using (var db = new ProducerContext())
            {
                var item = db.Applications.Single(s => s.Name == "ACM");
                item.InputFileTypes.Add(new Turbine.Data.Entities.InputFileType {
                    Id = Guid.NewGuid(), Name = "configuration", Required = true, Type = "plain/text"
                });
                item.InputFileTypes.Add(new Turbine.Data.Entities.InputFileType {
                    Id = Guid.NewGuid(), Name = "aspenfile", Required = true, Type = "plain/text"
                });
                db.SaveChanges();
            }

            using (var db = new ProducerContext())
            {
                var app  = db.Applications.Single(s => s.Name == "ACM");
                var user = db.Users.Single(u => u.Name == username);
                var sim  = new Turbine.Data.Entities.Simulation {
                    Id          = Guid.NewGuid(),
                    Application = app,
                    Create      = DateTime.UtcNow,
                    Name        = simulationName,
                    Update      = DateTime.UtcNow,
                    User        = user
                };
                db.Simulations.Add(sim);
                db.SaveChanges();
            }

            byte[] dataACMF;
            using (var fstream = File.Open(@"models\Hybrid_v0.51_rev1.1_UQ_0809.acmf", FileMode.Open))
            {
                using (var ms = new MemoryStream())
                {
                    fstream.CopyTo(ms);
                    dataACMF = ms.ToArray();
                }
            }
            byte[] dataConfig;
            using (var fstream = File.Open(@"models\Hybrid_v0.51_rev1.1_UQ_0809_sinter.json", FileMode.Open))
            {
                using (var ms = new MemoryStream())
                {
                    fstream.CopyTo(ms);
                    dataConfig = ms.ToArray();
                }
            }
            using (var db = new ProducerContext())
            {
                var sim = db.Simulations.Single(s => s.Name == simulationName);
                Console.WriteLine("App: " + sim.Application.Name);
                Console.WriteLine("Sim: " + sim.Name);
                foreach (var i in sim.Application.InputFileTypes)
                {
                    Console.WriteLine("IT: " + i.Name);
                }
                var it = sim.Application.InputFileTypes.Single(s => s.Name == "aspenfile");

                var item = new Turbine.Data.Entities.SimulationStagedInput
                {
                    //InputFileType = it,
                    Simulation = sim,
                    Content    = dataACMF,
                    Hash       = "",
                    Id         = Guid.NewGuid(),
                    Name       = it.Name
                };
                sim.SimulationStagedInputs.Add(item);

                it   = sim.Application.InputFileTypes.Single(s => s.Name == "configuration");
                item = new Turbine.Data.Entities.SimulationStagedInput
                {
                    //InputFileType = it,
                    Simulation = sim,
                    Content    = dataConfig,
                    Hash       = "",
                    Id         = Guid.NewGuid(),
                    Name       = it.Name
                };
                sim.SimulationStagedInputs.Add(item);

                db.SaveChanges();
            }

            // Session
            var sessionId = Guid.NewGuid();

            using (var db = new ProducerContext())
            {
                var item = new Turbine.Data.Entities.Session {
                    Id = sessionId, Create = DateTime.UtcNow, Description = "testing simulation"
                };
                db.Sessions.Add(item);
                db.SaveChanges();
            }
            var jobId      = Guid.NewGuid();
            var workingDir = String.Format("WorkingDir_{0}", Guid.NewGuid());

            using (var db = new ProducerContext())
            {
                var item       = db.Sessions.Single(s => s.Id == sessionId);
                var user       = db.Users.Single(u => u.Name == username);
                var simulation = db.Simulations.Single(s => s.Name == simulationName);
                var job        = new Turbine.Data.Entities.Job
                {
                    Id         = jobId,
                    Session    = item,
                    Create     = DateTime.UtcNow,
                    Setup      = DateTime.UtcNow,
                    State      = "setup",
                    User       = user,
                    Simulation = simulation,
                    Process    = new Turbine.Data.Entities.Process {
                        Input = "{}", WorkingDir = workingDir
                    },
                };
                var msg = new Turbine.Data.Entities.Message
                {
                    Id     = Guid.NewGuid(),
                    Create = DateTime.UtcNow,
                    Value  = "Test Job"
                };
                job.Messages.Add(msg);
                db.Jobs.Add(job);
                db.SaveChanges();
            }
            using (var db = new ProducerContext())
            {
                var job = db.Jobs.Single(j => j.Id == jobId);
                foreach (var f in job.Simulation.SimulationStagedInputs)
                {
                    job.StagedInputFiles.Add(new Turbine.Data.Entities.StagedInputFile
                    {
                        Content = f.Content,
                        Name    = f.Name
                    });
                }
            }

            // READ JOB Save to Filesystem
            using (var db = new ProducerContext())
            {
                var job = db.Jobs.Single(j => j.State == "setup");
                Assert.AreEqual(job.Id, jobId);
                var dinfo = Directory.CreateDirectory(job.Process.WorkingDir);
                Console.WriteLine("Working Directory: " + dinfo.FullName);
                foreach (var f in job.StagedInputFiles)
                {
                    Console.WriteLine("Save File: " + f.Name);
                    var fd = File.Create(Path.Combine(dinfo.FullName, f.Name));
                    fd.Write(f.Content, 0, f.Content.Length);
                    fd.Close();
                }
            }
        }
示例#8
0
        public void TestProcess_FullProcessErrors()
        {
            Guid jobId = Guid.NewGuid();

            using (var db = new ProducerContext())
            {
                var item       = db.Sessions.Single(s => s.Id == sessionId);
                var user       = db.Users.Single(u => u.Name == userName);
                var simulation = db.Simulations.Single(s => s.Name == simulationName);
                var job        = new Turbine.Data.Entities.Job
                {
                    Id         = jobId,
                    Session    = item,
                    Create     = DateTime.UtcNow,
                    State      = "create",
                    User       = user,
                    Simulation = simulation
                };
                db.Jobs.Add(job);
                db.SaveChanges();
            }
            using (var db = new ProducerContext())
            {
                var item = db.Jobs.Single(s => s.Id == jobId);
                item.Process = new Turbine.Data.Entities.Process
                {
                    Input      = "Input string",
                    Output     = "Output string",
                    WorkingDir = "MYDIR",
                    Status     = -1,
                    Stdin      = "",
                    Stderr     = "",
                    Stdout     = ""
                };
                db.SaveChanges();
            }
            using (var db = new ProducerContext())
            {
                var item = db.Jobs.Single(s => s.Id == jobId);
                item.Process.Error.Add(new Turbine.Data.Entities.ProcessError
                {
                    Error = "ERROR1",
                    Type  = "SystemError",
                    Name  = "Bad Working Directory",
                    Id    = Guid.NewGuid()
                });
                db.SaveChanges();
            }
            using (var db = new ProducerContext())
            {
                var item = db.Jobs.Single(s => s.Id == jobId);
                item.Process.Error.Add(new Turbine.Data.Entities.ProcessError
                {
                    Error = "ERROR2",
                    Type  = "SystemError",
                    Name  = "Bad File",
                    Id    = Guid.NewGuid()
                });
                db.SaveChanges();
            }
            using (var db = new ProducerContext())
            {
                var item = db.Jobs.Single(s => s.Id == jobId);
                Assert.IsTrue(item.Process.Error.Count == 2);
            }
        }
示例#9
0
        public void TestJob_UpdateRunning()
        {
            Guid   jobId      = Guid.NewGuid();
            Guid   consumerId = Guid.NewGuid();
            string createMsg  = "Created new Job";
            string submitMsg  = "Job Moved to Submit";
            string setupMsg   = "Job Moved to Setup";
            string runMsg     = "Job Moved to Running";

            using (var db = new ProducerContext())
            {
                var item       = db.Sessions.Single(s => s.Id == sessionId);
                var user       = db.Users.Single(u => u.Name == userName);
                var simulation = db.Simulations.Single(s => s.Name == simulationName);
                var job        = new Turbine.Data.Entities.Job
                {
                    Id         = jobId,
                    Session    = item,
                    Create     = DateTime.UtcNow,
                    State      = "create",
                    User       = user,
                    Simulation = simulation
                };
                var msg = new Turbine.Data.Entities.Message
                {
                    Id     = Guid.NewGuid(),
                    Create = DateTime.UtcNow,
                    Value  = createMsg
                };
                job.Messages.Add(msg);
                db.Jobs.Add(job);
                db.SaveChanges();
            }
            using (var db = new ProducerContext())
            {
                var app      = db.Applications.Single(a => a.Name == "ACM");
                var consumer = new Turbine.Data.Entities.JobConsumer
                {
                    Id          = consumerId,
                    keepalive   = DateTime.UtcNow,
                    status      = "up",
                    Application = app
                };
                db.Consumers.Add(consumer);
                db.SaveChanges();
            }

            using (var db = new ProducerContext())
            {
                var job = db.Jobs.Single(j => j.Id == jobId);
                job.State      = "submit";
                job.Submit     = DateTime.UtcNow;
                job.ConsumerId = consumerId;

                Assert.IsFalse(job.Initialize);
                Assert.IsFalse(job.Reset);

                var msg = new Turbine.Data.Entities.Message
                {
                    Id     = Guid.NewGuid(),
                    Create = DateTime.UtcNow,
                    Value  = submitMsg
                };
                job.Messages.Add(msg);

                try
                {
                    db.SaveChanges();
                }
                catch (System.Data.Entity.Validation.DbEntityValidationException e)
                {
                    foreach (var eve in e.EntityValidationErrors)
                    {
                        Console.WriteLine("Entity of type \"{0}\" in state \"{1}\" has the following validation errors:",
                                          eve.Entry.Entity.GetType().Name, eve.Entry.State);
                        foreach (var ve in eve.ValidationErrors)
                        {
                            Console.WriteLine("- Property: \"{0}\", Error: \"{1}\"",
                                              ve.PropertyName, ve.ErrorMessage);
                        }
                    }
                    throw;
                }
            }
            using (var db = new ProducerContext())
            {
                var job = db.Jobs.Single(j => j.Id == jobId);
                job.State = "setup";
                job.Setup = DateTime.UtcNow;
                var msg = new Turbine.Data.Entities.Message
                {
                    Id     = Guid.NewGuid(),
                    Create = DateTime.UtcNow,
                    Value  = setupMsg
                };
                job.Messages.Add(msg);

                try
                {
                    db.SaveChanges();
                }
                catch (System.Data.Entity.Validation.DbEntityValidationException e)
                {
                    foreach (var eve in e.EntityValidationErrors)
                    {
                        Console.WriteLine("Entity of type \"{0}\" in state \"{1}\" has the following validation errors:",
                                          eve.Entry.Entity.GetType().Name, eve.Entry.State);
                        foreach (var ve in eve.ValidationErrors)
                        {
                            Console.WriteLine("- Property: \"{0}\", Error: \"{1}\"",
                                              ve.PropertyName, ve.ErrorMessage);
                        }
                    }
                    throw;
                }
            }
            using (var db = new ProducerContext())
            {
                var job = db.Jobs.Single(j => j.Id == jobId);
                job.State   = "running";
                job.Running = DateTime.UtcNow;
                var msg = new Turbine.Data.Entities.Message
                {
                    Id     = Guid.NewGuid(),
                    Create = DateTime.UtcNow,
                    Value  = runMsg
                };
                job.Messages.Add(msg);
                job.Process = new Turbine.Data.Entities.Process
                {
                };
                try
                {
                    db.SaveChanges();
                }
                catch (System.Data.Entity.Validation.DbEntityValidationException e)
                {
                    foreach (var eve in e.EntityValidationErrors)
                    {
                        Console.WriteLine("Entity of type \"{0}\" in state \"{1}\" has the following validation errors:",
                                          eve.Entry.Entity.GetType().Name, eve.Entry.State);
                        foreach (var ve in eve.ValidationErrors)
                        {
                            Console.WriteLine("- Property: \"{0}\", Error: \"{1}\"",
                                              ve.PropertyName, ve.ErrorMessage);
                        }
                    }
                    throw;
                }
            }
            using (var db = new ProducerContext())
            {
                var job = db.Jobs.Single(j => j.Id == jobId);
                Assert.IsTrue(job.Messages.Count == 4);
                Assert.AreEqual <string>(job.Messages.ElementAt(0).Value, createMsg);
                Assert.AreEqual <string>(job.Messages.ElementAt(1).Value, submitMsg);
                Assert.AreEqual <string>(job.Messages.ElementAt(2).Value, setupMsg);
                Assert.AreEqual <string>(job.Messages.ElementAt(3).Value, runMsg);
            }
        }