Free cookie consent management tool by TermsFeed Policy Generator

source: branches/HeuristicLab.Hive-3.4/sources/HeuristicLab.Services.Hive.Tests/ServiceTests.cs @ 5155

Last change on this file since 5155 was 5155, checked in by cneumuel, 13 years ago

#1233

  • minor changes
File size: 6.1 KB
Line 
1using System;
2using System.Text;
3using System.Collections.Generic;
4using System.Linq;
5using Microsoft.VisualStudio.TestTools.UnitTesting;
6using HeuristicLab.Services.Hive.Common.DataTransfer;
7using HeuristicLab.Services.Hive.Common.ServiceContracts;
8using HeuristicLab.Clients.Hive.Slave.Tests;
9using HeuristicLab.Clients.Hive;
10
11namespace HeuristicLab.Services.Hive.Tests {
12  using DA = HeuristicLab.Services.Hive.DataAccess;
13  using DT = HeuristicLab.Services.Hive.Common.DataTransfer;
14  using HeuristicLab.Services.Hive.Common;
15  using System.Threading;
16  using HeuristicLab.Hive;
17
18  [TestClass]
19  public class ServiceTests {
20
21    [ClassInitialize]
22    public static void MyClassInitialize(TestContext testContext) {
23      PluginLoader.pluginAssemblies.Any();
24      ServiceLocator.Instance = new MockServiceLocator(ServiceLocator.Instance);
25    }
26
27    private IHiveService GetLocalService() {
28      return new HiveService();
29    }
30
31    [TestMethod]
32    public void TestJobs() {
33      var service = GetLocalService();
34
35      DT.HiveExperiment experiment = new DT.HiveExperiment() {
36        Name = "TestExperiment",
37        Description = ""
38      };
39
40      DT.Job job = new DT.Job() {
41        CoresNeeded = 1,
42        MemoryNeeded = 0,
43        Priority = 0
44      };
45
46      DT.JobData jobData = new DT.JobData() {
47        Data = PersistenceUtil.Serialize(new MockJob(500, true))
48      };
49
50      job.Id = service.AddJob(job, jobData, null);
51      experiment.RootJobId = job.Id;
52
53      DT.Job jobLoaded = service.GetJob(job.Id);
54      Assert.AreEqual(job.Id, jobLoaded.Id);
55      Assert.AreEqual(job.CoresNeeded, jobLoaded.CoresNeeded);
56      Assert.AreEqual(job.MemoryNeeded, jobLoaded.MemoryNeeded);
57      Assert.AreEqual(job.Priority, jobLoaded.Priority);
58      Assert.AreEqual(JobState.Waiting, jobLoaded.JobState);
59      Assert.AreEqual(ServiceLocator.Instance.AuthorizationManager.UserId, job.UserId);
60
61      DT.JobData jobDataLoaded = service.GetJobData(job.Id);
62      Assert.AreEqual(job.Id, jobDataLoaded.JobId);
63      Assert.IsTrue(jobData.Data.SequenceEqual(jobDataLoaded.Data));
64
65      experiment.Id = service.AddHiveExperiment(experiment);
66
67      DT.HiveExperiment experimentLoaded = service.GetHiveExperiment(experiment.Id);
68      Assert.AreEqual(experiment.Id, experimentLoaded.Id);
69      Assert.AreEqual(experiment.Name, experimentLoaded.Name);
70      Assert.AreEqual(experiment.Description, experimentLoaded.Description);
71      Assert.AreEqual(experiment.RootJobId, experimentLoaded.RootJobId);
72
73      service.DeleteHiveExperiment(experiment.Id);
74      Assert.AreEqual(null, service.GetHiveExperiment(experiment.Id));
75      Assert.AreEqual(null, service.GetJob(job.Id));
76      Assert.AreEqual(null, service.GetJobData(job.Id));
77    }
78
79    List<DT.Job> jobs = new List<DT.Job>();
80
81    [TestMethod]
82    public void TestHeartbeats() {
83      var service = GetLocalService();
84      Guid groupId = service.AddSlaveGroup(new SlaveGroup() { Name = "TestGroup", Description = "Used for unit tests" });
85
86      for (int i = 0; i < 2; i++) {
87        Job job = new Job() {
88          CoresNeeded = 1, MemoryNeeded = 0
89        };
90        JobData jobData = new JobData() { Data = PersistenceUtil.Serialize(new MockJob(500, false)) };
91        job.Id = service.AddJob(job, jobData, null);
92        jobs.Add(job);
93      }
94
95      var slaves = new List<DT.Slave>();
96      for (int i = 0; i < 1; i++) {
97        DT.Slave slave = new DT.Slave() {
98          Cores = 2,
99          Memory = 4096,
100          Name = "Slave " + i,
101          IsAllowedToCalculate = true,
102          SlaveState = SlaveState.Idle,
103          CpuSpeed = 2800,
104          FreeCores = 2,
105          FreeMemory = 3000
106        };
107        slave.Id = service.AddSlave(slave);
108        service.AddResourceToGroup(groupId, slave.Id);
109        slaves.Add(slave);
110      }
111
112      foreach (var slave in slaves) {
113        new Thread(new ParameterizedThreadStart(RunSlaveThread)).Start(slave);
114      }
115
116      // send heartbeats
117      IEnumerable<LightweightJob> lightweightJobs;
118      do {
119        Thread.Sleep(500);
120        lightweightJobs = service.GetLightweightJobs(jobs.Select(x => x.Id));
121      } while (!lightweightJobs.All(x => x.JobState == JobState.Finished));
122
123      // delete slaves
124      foreach (var slave in slaves) {
125        service.DeleteSlave(slave.Id);
126        Assert.AreEqual(null, service.GetSlave(slave.Id));
127      }
128
129      // delete group
130      service.DeleteSlaveGroup(groupId);
131
132      // delete jobs
133      foreach (var job in jobs) {
134        service.DeleteJob(job.Id);
135      }
136    }
137
138    public void RunSlaveThread(object slaveobj) {
139      try {
140        var service = GetLocalService();
141        Slave slave = (Slave)slaveobj;
142        int freeCores = slave.Cores.Value;
143
144        var messages = service.Heartbeat(new Heartbeat() { SlaveId = slave.Id, FreeMemory = 2423, FreeCores = freeCores, JobProgress = new Dictionary<Guid, TimeSpan>() });
145        if (messages.Count == 0)
146          return; // no more jobs
147
148        Assert.IsTrue(messages.Where(x => x.Message == MessageContainer.MessageType.AbortJob).Count() == 0);
149        Assert.IsTrue(messages.Where(x => x.Message == MessageContainer.MessageType.SayHello).Count() == 0);
150        Assert.IsTrue(messages.Where(x => x.Message == MessageContainer.MessageType.PauseJob).Count() == 0);
151
152        if (messages.Where(x => x.Message == MessageContainer.MessageType.AquireJob).Count() > 0) {
153          Guid jobId = messages.Where(x => x.Message == MessageContainer.MessageType.AquireJob).SingleOrDefault().JobId;
154          service.AquireJob(jobId);
155          Job job = service.GetJob(jobId);
156          JobData jobData = service.GetJobData(jobId);
157          IJob deserializedJob = PersistenceUtil.Deserialize<IJob>(jobData.Data);
158          deserializedJob.Start();
159          job.JobState = JobState.Finished;
160          jobs.Where(x => x.Id == jobId).Single().JobState = JobState.Finished;
161          jobData.Data = PersistenceUtil.Serialize(deserializedJob);
162          service.UpdateJob(job, jobData);
163        }
164      }
165      catch (Exception e) {
166        Assert.Fail(e.Message, e);
167      }
168    }
169  }
170}
Note: See TracBrowser for help on using the repository browser.