~ubuntu-branches/ubuntu/trusty/nordugrid-arc/trusty-proposed

« back to all changes in this revision

Viewing changes to src/hed/libs/compute/test/JobInformationStorageTest.cpp

  • Committer: Package Import Robot
  • Author(s): Mattias Ellert
  • Date: 2013-11-29 13:39:10 UTC
  • mfrom: (1.1.10)
  • Revision ID: package-import@ubuntu.com-20131129133910-altaxrfowczzl2ev
Tags: 4.0.0-1
4.0.0 Release (Closes: #715131) (LP: #1049798)

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#ifdef HAVE_CONFIG_H
 
2
#include <config.h>
 
3
#endif
 
4
 
 
5
#include <iostream>
 
6
 
 
7
#include <cppunit/extensions/HelperMacros.h>
 
8
 
 
9
#include <arc/DateTime.h>
 
10
#include <arc/FileLock.h>
 
11
#include <arc/URL.h>
 
12
#include <arc/XMLNode.h>
 
13
#include <arc/compute/Job.h>
 
14
#include <arc/compute/JobInformationStorage.h>
 
15
 
 
16
#define JISTEST_ASSERT(CONDITION, JISTYPE) \
 
17
  CPPUNIT_ASSERT_MESSAGE("failed for JobInformationStorage" + JISTYPE, \
 
18
                         CONDITION)
 
19
 
 
20
#define JISTEST_ASSERT_EQUAL(EXPECTED, ACTUAL, JISTYPE) \
 
21
  CPPUNIT_ASSERT_EQUAL_MESSAGE("failed for JobInformationStorage" + JISTYPE, \
 
22
                               (EXPECTED), (ACTUAL))
 
23
 
 
24
class JobInformationStorageTest
 
25
  : public CppUnit::TestFixture {
 
26
 
 
27
  CPPUNIT_TEST_SUITE(JobInformationStorageTest);
 
28
  CPPUNIT_TEST(GeneralTest);
 
29
  CPPUNIT_TEST(ReadJobsTest);
 
30
  CPPUNIT_TEST_SUITE_END();
 
31
 
 
32
public:
 
33
  JobInformationStorageTest();
 
34
  void setUp() {}
 
35
  void tearDown() { remove("jobs.dat"); }
 
36
  void GeneralTest();
 
37
  void ReadJobsTest();
 
38
  
 
39
private:
 
40
  Arc::XMLNode xmlJob;
 
41
};
 
42
 
 
43
JobInformationStorageTest::JobInformationStorageTest() : xmlJob(Arc::XMLNode("<ComputingActivity>"
 
44
    "<ServiceInformationURL>https://testbed-emi4.grid.upjs.sk:60000/arex</ServiceInformationURL>"
 
45
    "<ServiceInformationInterfaceName>org.ogf.glue.emies.resourceinfo</ServiceInformationInterfaceName>"
 
46
    "<JobStatusURL>https://testbed-emi4.grid.upjs.sk:60000/arex</JobStatusURL>"
 
47
    "<JobStatusInterfaceName>org.ogf.glue.emies.activitymanagement</JobStatusInterfaceName>"
 
48
    "<JobManagementURL>https://testbed-emi4.grid.upjs.sk:60000/arex</JobManagementURL>"
 
49
    "<JobManagementInterfaceName>org.ogf.glue.emies.activitymanagement</JobManagementInterfaceName>"
 
50
    "<JobID>https://testbed-emi4.grid.upjs.sk:60000/arex/HiqNDmAiivgnIfnhppWRvMapABFKDmABFKDmQhJKDmCBFKDmmdhHxm</JobID>"
 
51
    "<IDFromEndpoint>HiqNDmAiivgnIfnhppWRvMapABFKDmABFKDmQhJKDmCBFKDmmdhHxm</IDFromEndpoint>"
 
52
    "<StageInDir>https://testbed-emi4.grid.upjs.sk:60000/arex</StageInDir>"
 
53
    "<StageOutDir>https://testbed-emi4.grid.upjs.sk:60000/arex</StageOutDir>"
 
54
    "<SessionDir>https://testbed-emi4.grid.upjs.sk:60000/arex</SessionDir>"
 
55
    "<Name>mc08.1050.J7</Name>"
 
56
    "<Type>single</Type>"
 
57
    "<LocalIDFromManager>345.ce01</LocalIDFromManager>"
 
58
    "<JobDescription>nordugrid:xrsl</JobDescription>"
 
59
    "<JobDescriptionDocument>&amp;(executable=\"helloworld.sh\")(arguments=\"random.dat\")(inputfiles=(\"helloworld.sh\")(\"random.dat\"))(stdout=\"helloworld.out\")(join=\"yes\")</JobDescriptionDocument>"
 
60
    "<State>bes:failed</State>"
 
61
    "<State>nordugrid:FAILED</State>"
 
62
    "<RestartState>bes:running</RestartState>"
 
63
    "<RestartState>nordugrid:FINISHING</RestartState>"
 
64
    "<ExitCode>0</ExitCode>"
 
65
    "<ComputingManagerExitCode>0</ComputingManagerExitCode>"
 
66
    "<Error>Uploading timed out</Error>"
 
67
    "<Error>Failed stage-out</Error>"
 
68
    "<WaitingPosition>0</WaitingPosition>"
 
69
    "<UserDomain>vo:atlas</UserDomain>"
 
70
    "<Owner>CONFIDENTIAL</Owner>"
 
71
    "<LocalOwner>grid02</LocalOwner>"
 
72
    "<RequestedTotalWallTime>5000</RequestedTotalWallTime>"
 
73
    "<RequestedTotalCPUTime>20000</RequestedTotalCPUTime>"
 
74
    "<RequestedSlots>4</RequestedSlots>"
 
75
    "<RequestedApplicationEnvironment>ENV/JAVA/JRE-1.6.0</RequestedApplicationEnvironment>"
 
76
    "<RequestedApplicationEnvironment>APPS/HEP/ATLAS-14.2.23.4</RequestedApplicationEnvironment>"
 
77
    "<StdIn>input.dat</StdIn>"
 
78
    "<StdOut>job.out</StdOut>"
 
79
    "<StdErr>err.out</StdErr>"
 
80
    "<LogDir>celog</LogDir>"
 
81
    "<ExecutionNode>wn043</ExecutionNode>"
 
82
    "<ExecutionNode>wn056</ExecutionNode>"
 
83
    "<Queue>pbs-short</Queue>"
 
84
    "<UsedTotalWallTime>2893</UsedTotalWallTime>"
 
85
    "<UsedTotalCPUTime>12340</UsedTotalCPUTime>"
 
86
    "<UsedMainMemory>4453</UsedMainMemory>"
 
87
    "<LocalSubmissionTime>2008-04-21T10:04:36Z</LocalSubmissionTime>"
 
88
    "<SubmissionTime>2008-04-21T10:05:12Z</SubmissionTime>"
 
89
    "<ComputingManagerSubmissionTime>2008-04-20T06:05:12Z</ComputingManagerSubmissionTime>"
 
90
    "<StartTime>2008-04-20T06:45:12Z</StartTime>"
 
91
    "<ComputingManagerEndTime>2008-04-20T10:05:12Z</ComputingManagerEndTime>"
 
92
    "<EndTime>2008-04-20T10:15:12Z</EndTime>"
 
93
    "<WorkingAreaEraseTime>2008-04-24T10:05:12Z</WorkingAreaEraseTime>"
 
94
    "<ProxyExpirationTime>2008-04-30T10:05:12Z</ProxyExpirationTime>"
 
95
    "<SubmissionHost>pc4.niif.hu:3432</SubmissionHost>"
 
96
    "<SubmissionClientName>nordugrid-arc-0.94</SubmissionClientName>"
 
97
    "<OtherMessages>Cached input file is outdated; downloading again</OtherMessages>"
 
98
    "<OtherMessages>User proxy has expired</OtherMessages>"
 
99
    "<Associations>"
 
100
      "<ActivityOldID>https://example-ce.com:443/arex/765234</ActivityOldID>"
 
101
      "<ActivityOldID>https://helloworld-ce.com:12345/arex/543678</ActivityOldID>"
 
102
      "<LocalInputFile>"
 
103
        "<Source>helloworld.sh</Source>"
 
104
        "<CheckSum>c0489bec6f7f4454d6cfe1b0a07ad5b8</CheckSum>"
 
105
      "</LocalInputFile>"
 
106
      "<LocalInputFile>"
 
107
        "<Source>random.dat</Source>"
 
108
        "<CheckSum>e52b14b10b967d9135c198fd11b9b8bc</CheckSum>"
 
109
      "</LocalInputFile>"
 
110
    "</Associations>"
 
111
  "</ComputingActivity>")) {}
 
112
 
 
113
void JobInformationStorageTest::GeneralTest() {
 
114
  Arc::JobInformationStorage* jis = NULL;
 
115
  for (int i = 0; Arc::JobInformationStorage::AVAILABLE_TYPES[i].name != NULL; ++i) {
 
116
    const std::string jisType = Arc::JobInformationStorage::AVAILABLE_TYPES[i].name;
 
117
    jis = (Arc::JobInformationStorage::AVAILABLE_TYPES[i].instance)("jobs.dat");
 
118
    JISTEST_ASSERT(jis != NULL, jisType);
 
119
    JISTEST_ASSERT(jis->IsValid(), jisType);
 
120
 
 
121
    std::list<Arc::Job> inJobs, outJobs;
 
122
  
 
123
    inJobs.push_back(xmlJob);
 
124
    inJobs.back().Name = "Job0";
 
125
    inJobs.back().JobID = "https://ce00.niif.hu:60000/arex/job0";
 
126
    inJobs.back().ServiceInformationURL = Arc::URL("https://info00.niif.hu:2135/aris");
 
127
    inJobs.push_back(xmlJob);
 
128
    inJobs.back().Name = "Job1";
 
129
    inJobs.back().JobID = "https://ce01.niif.hu:60000/arex/job1";
 
130
    inJobs.back().ServiceInformationURL = Arc::URL("https://info01.niif.hu:2135/aris");
 
131
    inJobs.push_back(xmlJob);
 
132
    inJobs.back().Name = "Job2";
 
133
    inJobs.back().JobID = "https://ce01.niif.hu:60000/arex/job2";
 
134
    inJobs.back().ServiceInformationURL = Arc::URL("https://info01.niif.hu:2135/aris");
 
135
    inJobs.push_back(xmlJob);
 
136
    inJobs.back().Name = "Job3";
 
137
    inJobs.back().JobID = "https://ce01.niif.hu:60000/arex/job3";
 
138
    inJobs.back().ServiceInformationURL = Arc::URL("https://info01.niif.hu:2135/aris");
 
139
    inJobs.push_back(xmlJob);
 
140
    inJobs.back().Name = "Other Job";
 
141
    inJobs.back().JobID = "https://ce-other.niif.hu:60000/arex/other-job";
 
142
    inJobs.back().ServiceInformationURL = Arc::URL("https://info-other.niif.hu:2135/aris");
 
143
  
 
144
    // Write and read jobs.
 
145
    JISTEST_ASSERT(jis->Clean(), jisType);
 
146
    JISTEST_ASSERT(jis->Write(inJobs), jisType);
 
147
    JISTEST_ASSERT(jis->ReadAll(outJobs), jisType);
 
148
    JISTEST_ASSERT_EQUAL(5, (int)outJobs.size(), jisType);
 
149
    {
 
150
    std::set<std::string> jobNames;
 
151
    jobNames.insert("Job0"); jobNames.insert("Job1"); jobNames.insert("Job2"); jobNames.insert("Job3"); jobNames.insert("Other Job");
 
152
    for (std::list<Arc::Job>::const_iterator itJ = outJobs.begin();
 
153
         itJ != outJobs.end(); ++itJ) {
 
154
      CPPUNIT_ASSERT_EQUAL_MESSAGE("JobInformationStorage" + jisType + ": Job with name \"" + itJ->Name + "\" was unexpected" , 1, (int)jobNames.erase(itJ->Name));
 
155
    }
 
156
    }
 
157
  
 
158
    inJobs.clear();
 
159
    std::set<std::string> prunedServices;
 
160
    prunedServices.insert("info01.niif.hu");
 
161
    prunedServices.insert("info02.niif.hu");
 
162
    inJobs.push_back(xmlJob);
 
163
    inJobs.back().Name = "Job4";
 
164
    inJobs.back().JobID = "https://ce02.niif.hu:60000/arex/job4";
 
165
    inJobs.back().ServiceInformationURL = Arc::URL("https://info02.niif.hu:2135/aris");
 
166
  
 
167
    inJobs.push_back(xmlJob);
 
168
    inJobs.back().Name = "Job2";
 
169
    inJobs.back().JobID = "https://ce01.niif.hu:60000/arex/job2";
 
170
    inJobs.back().ServiceInformationURL = Arc::URL("https://info01.niif.hu:2135/aris");
 
171
  
 
172
    // Check that pointers to new jobs are added to the list, and that jobs on services specified to be pruned are removed.
 
173
    std::list<const Arc::Job*> newJobs;
 
174
    JISTEST_ASSERT(jis->Write(inJobs, prunedServices, newJobs), jisType);
 
175
    JISTEST_ASSERT_EQUAL(1, (int)newJobs.size(), jisType);
 
176
    JISTEST_ASSERT_EQUAL((std::string)"Job4", newJobs.front()->Name, jisType);
 
177
    JISTEST_ASSERT_EQUAL((std::string)"https://ce02.niif.hu:60000/arex/job4", newJobs.front()->JobID, jisType);
 
178
    JISTEST_ASSERT(jis->ReadAll(outJobs), jisType);
 
179
    JISTEST_ASSERT_EQUAL(4, (int)outJobs.size(), jisType);
 
180
    {
 
181
    std::set<std::string> jobNames;
 
182
    jobNames.insert("Job0"); jobNames.insert("Job2"); jobNames.insert("Job4"); jobNames.insert("Other Job");
 
183
    for (std::list<Arc::Job>::const_iterator itJ = outJobs.begin();
 
184
         itJ != outJobs.end(); ++itJ) {
 
185
      CPPUNIT_ASSERT_EQUAL_MESSAGE("JobInformationStorage" + jisType + ": Job with name \"" + itJ->Name + "\" was unexpected" , 1, (int)jobNames.erase(itJ->Name));
 
186
    }
 
187
    }
 
188
  
 
189
    // Check whether file is truncated.
 
190
    JISTEST_ASSERT(jis->Clean(), jisType);
 
191
    JISTEST_ASSERT(jis->Write(inJobs), jisType);
 
192
    JISTEST_ASSERT(jis->ReadAll(outJobs), jisType);
 
193
    JISTEST_ASSERT_EQUAL(2, (int)outJobs.size(), jisType);
 
194
    if      ("https://ce02.niif.hu:60000/arex/job4" == outJobs.front().JobID) {
 
195
      JISTEST_ASSERT_EQUAL((std::string)"Job4", outJobs.front().Name, jisType);
 
196
  
 
197
      JISTEST_ASSERT_EQUAL((std::string)"Job2", outJobs.back().Name, jisType);
 
198
      JISTEST_ASSERT_EQUAL((std::string)"https://ce01.niif.hu:60000/arex/job2", outJobs.back().JobID, jisType);
 
199
    }
 
200
    else if ("https://ce01.niif.hu:60000/arex/job2" == outJobs.front().JobID) {
 
201
      JISTEST_ASSERT_EQUAL((std::string)"Job2", outJobs.front().Name, jisType);
 
202
  
 
203
      JISTEST_ASSERT_EQUAL((std::string)"Job4", outJobs.back().Name, jisType);
 
204
      JISTEST_ASSERT_EQUAL((std::string)"https://ce02.niif.hu:60000/arex/job4", outJobs.back().JobID, jisType);
 
205
    }
 
206
    else {
 
207
      CPPUNIT_FAIL((  "JobInformationStorage" + jisType + "\n"
 
208
                    "- Expected: \"https://ce01.niif.hu:60000/arex/job2\" or \"https://ce02.niif.hu:60000/arex/job4\"\n"
 
209
                    "- Actual:   \"" + outJobs.front().JobID + "\"").c_str());
 
210
    } 
 
211
  
 
212
    inJobs.push_back(xmlJob);
 
213
    inJobs.back().Name = "Job5";
 
214
    inJobs.back().JobID = "https://ce01.niif.hu:60000/arex/job5";
 
215
  
 
216
    inJobs.push_back(xmlJob);
 
217
    inJobs.back().Name = "Job6";
 
218
    inJobs.back().JobID = "https://ce01.niif.hu:60000/arex/job6";
 
219
  
 
220
    inJobs.push_back(inJobs.back());
 
221
    inJobs.back().Name = "Job6New";
 
222
  
 
223
    // Duplicate jobs will be overwritten.
 
224
    JISTEST_ASSERT(jis->Clean(), jisType);
 
225
    JISTEST_ASSERT(jis->Write(inJobs), jisType);
 
226
    JISTEST_ASSERT(jis->ReadAll(outJobs), jisType);
 
227
    JISTEST_ASSERT_EQUAL(4, (int)outJobs.size(), jisType);
 
228
    bool job6NewExists = false;
 
229
    for (std::list<Arc::Job>::const_iterator itJob = outJobs.begin();
 
230
         itJob != outJobs.end(); ++itJob) {
 
231
      JISTEST_ASSERT(itJob->Name != "Job6", jisType);
 
232
      if (itJob->Name == "Job6New") job6NewExists = true;
 
233
    }
 
234
    JISTEST_ASSERT(job6NewExists, jisType);
 
235
  
 
236
    // Truncate file.
 
237
    JISTEST_ASSERT(jis->Clean(), jisType);
 
238
    newJobs.clear();
 
239
    JISTEST_ASSERT(jis->Write(inJobs, std::set<std::string>(), newJobs), jisType);
 
240
    JISTEST_ASSERT_EQUAL(4, (int)newJobs.size(), jisType);
 
241
    JISTEST_ASSERT(jis->ReadAll(outJobs), jisType);
 
242
    JISTEST_ASSERT_EQUAL(4, (int)outJobs.size(), jisType);
 
243
    job6NewExists = false;
 
244
    for (std::list<Arc::Job>::const_iterator itJob = outJobs.begin();
 
245
         itJob != outJobs.end(); ++itJob) {
 
246
      JISTEST_ASSERT(itJob->Name != "Job6", jisType);
 
247
      if (itJob->Name == "Job6New") job6NewExists = true;
 
248
    }
 
249
    JISTEST_ASSERT(job6NewExists, jisType);
 
250
  
 
251
    inJobs.pop_back();
 
252
  
 
253
    // Adding more jobs to file.
 
254
    JISTEST_ASSERT(jis->Clean(), jisType);
 
255
    JISTEST_ASSERT(jis->Write(inJobs), jisType);
 
256
    JISTEST_ASSERT(jis->ReadAll(outJobs), jisType);
 
257
    JISTEST_ASSERT_EQUAL(4, (int)outJobs.size(), jisType);
 
258
  
 
259
    std::list<std::string> toberemoved;
 
260
    toberemoved.push_back("https://ce02.niif.hu:60000/arex/job4");
 
261
    toberemoved.push_back("https://ce01.niif.hu:60000/arex/job5");
 
262
  
 
263
    // Check whether jobs are removed correctly.
 
264
    JISTEST_ASSERT(jis->Remove(toberemoved), jisType);
 
265
    JISTEST_ASSERT(jis->ReadAll(outJobs), jisType);
 
266
    JISTEST_ASSERT_EQUAL(2, (int)outJobs.size(), jisType);
 
267
    JISTEST_ASSERT_EQUAL((std::string)"Job2", outJobs.front().Name, jisType);
 
268
    JISTEST_ASSERT_EQUAL((std::string)"https://ce01.niif.hu:60000/arex/job2", outJobs.front().JobID, jisType);
 
269
    JISTEST_ASSERT_EQUAL((std::string)"Job6", outJobs.back().Name, jisType);
 
270
    JISTEST_ASSERT_EQUAL((std::string)"https://ce01.niif.hu:60000/arex/job6", outJobs.back().JobID, jisType);
 
271
    remove("jobs.dat");
 
272
    delete jis;
 
273
  }
 
274
 
 
275
}
 
276
 
 
277
void JobInformationStorageTest::ReadJobsTest() {
 
278
  Arc::JobInformationStorage* jis = NULL;
 
279
  for (int i = 0; Arc::JobInformationStorage::AVAILABLE_TYPES[i].name != NULL; ++i) {
 
280
    const std::string jisType = Arc::JobInformationStorage::AVAILABLE_TYPES[i].name;
 
281
    jis = (Arc::JobInformationStorage::AVAILABLE_TYPES[i].instance)("jobs.dat");
 
282
    JISTEST_ASSERT(jis != NULL, jisType);
 
283
    JISTEST_ASSERT(jis->IsValid(), jisType);
 
284
 
 
285
    std::list<Arc::Job> inJobs, outJobs;
 
286
  
 
287
    // Check if jobs are read when specified by the jobIdentifiers argument.
 
288
    // Also check that the jobIdentifiers list is modified according to found jobs.
 
289
    {
 
290
      inJobs.push_back(Arc::Job());
 
291
      inJobs.back().Name = "foo-job-1";
 
292
      inJobs.back().JobID = "https://ce.grid.org/1234567890-foo-job-1";
 
293
      inJobs.back().IDFromEndpoint = "1234567890-foo-job-1";
 
294
      inJobs.back().ServiceInformationURL = Arc::URL("https://ce.grid.org/");
 
295
      inJobs.back().ServiceInformationInterfaceName = "org.nordugrid.test";
 
296
      inJobs.back().JobStatusURL = Arc::URL("https://ce.grid.org/");
 
297
      inJobs.back().JobStatusInterfaceName = "org.nordugrid.test";
 
298
      inJobs.back().JobManagementURL = Arc::URL("https://ce.grid.org/");
 
299
      inJobs.back().JobManagementInterfaceName = "org.nordugrid.test";
 
300
  
 
301
      inJobs.push_back(Arc::Job());
 
302
      inJobs.back().Name = "foo-job-2";
 
303
      inJobs.back().JobID = "https://ce.grid.org/1234567890-foo-job-2";
 
304
      inJobs.back().IDFromEndpoint = "1234567890-foo-job-2";
 
305
      inJobs.back().ServiceInformationURL = Arc::URL("https://ce.grid.org/");
 
306
      inJobs.back().ServiceInformationInterfaceName = "org.nordugrid.test";
 
307
      inJobs.back().JobStatusURL = Arc::URL("https://ce.grid.org/");
 
308
      inJobs.back().JobStatusInterfaceName = "org.nordugrid.test";
 
309
      inJobs.back().JobManagementURL = Arc::URL("https://ce.grid.org/");
 
310
      inJobs.back().JobManagementInterfaceName = "org.nordugrid.test";
 
311
  
 
312
      inJobs.push_back(Arc::Job());
 
313
      inJobs.back().Name = "foo-job-2";
 
314
      inJobs.back().JobID = "https://ce.grid.org/0987654321-foo-job-2";
 
315
      inJobs.back().IDFromEndpoint = "0987654321-foo-job-2";
 
316
      inJobs.back().ServiceInformationURL = Arc::URL("https://ce.grid.org/");
 
317
      inJobs.back().ServiceInformationInterfaceName = "org.nordugrid.test";
 
318
      inJobs.back().JobStatusURL = Arc::URL("https://ce.grid.org/");
 
319
      inJobs.back().JobStatusInterfaceName = "org.nordugrid.test";
 
320
      inJobs.back().JobManagementURL = Arc::URL("https://ce.grid.org/");
 
321
      inJobs.back().JobManagementInterfaceName = "org.nordugrid.test";
 
322
  
 
323
      inJobs.push_back(Arc::Job());
 
324
      inJobs.back().Name = "foo-job-3";
 
325
      inJobs.back().JobID = "https://ce.grid.org/1234567890-foo-job-3";
 
326
      inJobs.back().IDFromEndpoint = "1234567890-foo-job-3";
 
327
      inJobs.back().ServiceInformationURL = Arc::URL("https://ce.grid.org/");
 
328
      inJobs.back().ServiceInformationInterfaceName = "org.nordugrid.test";
 
329
      inJobs.back().JobStatusURL = Arc::URL("https://ce.grid.org/");
 
330
      inJobs.back().JobStatusInterfaceName = "org.nordugrid.test";
 
331
      inJobs.back().JobManagementURL = Arc::URL("https://ce.grid.org/");
 
332
      inJobs.back().JobManagementInterfaceName = "org.nordugrid.test";
 
333
  
 
334
      JISTEST_ASSERT(jis->Clean(), jisType);
 
335
      JISTEST_ASSERT(jis->Write(inJobs), jisType);
 
336
  
 
337
      std::list<std::string> jobIdentifiers;
 
338
      jobIdentifiers.push_back("https://ce.grid.org/1234567890-foo-job-1");
 
339
      // Having the same identifier twice should only result in one Job object being added to the list.
 
340
      jobIdentifiers.push_back("https://ce.grid.org/1234567890-foo-job-1");
 
341
      jobIdentifiers.push_back("foo-job-2");
 
342
      jobIdentifiers.push_back("nonexistent-job");
 
343
      
 
344
      JISTEST_ASSERT(jis->Read(outJobs, jobIdentifiers), jisType);
 
345
      JISTEST_ASSERT_EQUAL(3, (int)outJobs.size(), jisType);
 
346
      std::list<Arc::Job>::const_iterator itJ = outJobs.begin();
 
347
      JISTEST_ASSERT_EQUAL((std::string)"foo-job-1", itJ->Name, jisType);
 
348
      JISTEST_ASSERT_EQUAL((std::string)"https://ce.grid.org/1234567890-foo-job-1", itJ->JobID, jisType);
 
349
      ++itJ;
 
350
      JISTEST_ASSERT_EQUAL((std::string)"foo-job-2", itJ->Name, jisType);
 
351
      if      ("https://ce.grid.org/1234567890-foo-job-2" == itJ->JobID) {
 
352
        ++itJ;
 
353
        JISTEST_ASSERT_EQUAL((std::string)"foo-job-2", itJ->Name, jisType);
 
354
        JISTEST_ASSERT_EQUAL((std::string)"https://ce.grid.org/0987654321-foo-job-2", itJ->JobID, jisType);
 
355
      }
 
356
      else if ("https://ce.grid.org/0987654321-foo-job-2" == itJ->JobID) {
 
357
        ++itJ;
 
358
        JISTEST_ASSERT_EQUAL((std::string)"foo-job-2", itJ->Name, jisType);
 
359
        JISTEST_ASSERT_EQUAL((std::string)"https://ce.grid.org/1234567890-foo-job-2", itJ->JobID, jisType);
 
360
      }
 
361
      else {
 
362
        CPPUNIT_FAIL((  "JobInformationStorage" + jisType + "\n"
 
363
                      "- Expected: \"https://ce.grid.org/1234567890-foo-job-2\" or \"https://ce.grid.org/0987654321-foo-job-2\"\n"
 
364
                      "- Actual:   \"" + itJ->JobID + "\"").c_str());
 
365
      }
 
366
  
 
367
      JISTEST_ASSERT_EQUAL(1, (int)jobIdentifiers.size(), jisType);
 
368
      JISTEST_ASSERT_EQUAL((std::string)"nonexistent-job", jobIdentifiers.front(), jisType);
 
369
    }
 
370
  
 
371
    // Check if jobs are read when specified by the endpoints argument.
 
372
    // Also check if jobs are read when specified by the rejectEndpoints argument.
 
373
    {
 
374
      inJobs.clear();
 
375
  
 
376
      inJobs.push_back(Arc::Job());
 
377
      inJobs.back().Name = "foo-job-1";
 
378
      inJobs.back().JobID = "https://ce1.grid.org/1234567890-foo-job-1";
 
379
      inJobs.back().IDFromEndpoint = "1234567890-foo-job-1";
 
380
      inJobs.back().ServiceInformationURL = Arc::URL("https://ce1.grid.org/");
 
381
      inJobs.back().ServiceInformationInterfaceName = "org.nordugrid.test";
 
382
      inJobs.back().JobStatusURL = Arc::URL("https://ce1.grid.org/");
 
383
      inJobs.back().JobStatusInterfaceName = "org.nordugrid.test";
 
384
      inJobs.back().JobManagementURL = Arc::URL("https://ce1.grid.org/");
 
385
      inJobs.back().JobManagementInterfaceName = "org.nordugrid.test";
 
386
  
 
387
      inJobs.push_back(Arc::Job());
 
388
      inJobs.back().Name = "foo-job-2";
 
389
      inJobs.back().JobID = "https://ce2.grid.org/1234567890-foo-job-2";
 
390
      inJobs.back().IDFromEndpoint = "1234567890-foo-job-2";
 
391
      inJobs.back().ServiceInformationURL = Arc::URL("https://ce2.grid.org/");
 
392
      inJobs.back().ServiceInformationInterfaceName = "org.nordugrid.test";
 
393
      inJobs.back().JobStatusURL = Arc::URL("https://ce2.grid.org/");
 
394
      inJobs.back().JobStatusInterfaceName = "org.nordugrid.test";
 
395
      inJobs.back().JobManagementURL = Arc::URL("https://ce2.grid.org/");
 
396
      inJobs.back().JobManagementInterfaceName = "org.nordugrid.test";
 
397
  
 
398
      inJobs.push_back(Arc::Job());
 
399
      inJobs.back().Name = "foo-job-3";
 
400
      inJobs.back().JobID = "https://ce2.grid.org/1234567890-foo-job-3";
 
401
      inJobs.back().IDFromEndpoint = "1234567890-foo-job-3";
 
402
      inJobs.back().ServiceInformationURL = Arc::URL("https://ce2.grid.org/");
 
403
      inJobs.back().ServiceInformationInterfaceName = "org.nordugrid.test";
 
404
      inJobs.back().JobStatusURL = Arc::URL("https://ce2.grid.org/");
 
405
      inJobs.back().JobStatusInterfaceName = "org.nordugrid.test";
 
406
      inJobs.back().JobManagementURL = Arc::URL("https://ce2.grid.org/");
 
407
      inJobs.back().JobManagementInterfaceName = "org.nordugrid.test";
 
408
  
 
409
      inJobs.push_back(Arc::Job());
 
410
      inJobs.back().Name = "foo-job-4";
 
411
      inJobs.back().JobID = "https://ce3.grid.org/1234567890-foo-job-4";
 
412
      inJobs.back().IDFromEndpoint = "1234567890-foo-job-4";
 
413
      inJobs.back().ServiceInformationURL = Arc::URL("https://ce3.grid.org/");
 
414
      inJobs.back().ServiceInformationInterfaceName = "org.nordugrid.test";
 
415
      inJobs.back().JobStatusURL = Arc::URL("https://ce3.grid.org/");
 
416
      inJobs.back().JobStatusInterfaceName = "org.nordugrid.test";
 
417
      inJobs.back().JobManagementURL = Arc::URL("https://ce3.grid.org/");
 
418
      inJobs.back().JobManagementInterfaceName = "org.nordugrid.test";
 
419
  
 
420
      JISTEST_ASSERT(jis->Clean(), jisType);
 
421
      JISTEST_ASSERT(jis->Write(inJobs), jisType);
 
422
  
 
423
      std::list<std::string> jobIdentifiers, endpoints, rejectEndpoints;
 
424
      endpoints.push_back("ce2.grid.org");
 
425
  
 
426
      JISTEST_ASSERT(jis->Read(outJobs, jobIdentifiers, endpoints), jisType);
 
427
      JISTEST_ASSERT_EQUAL(2, (int)outJobs.size(), jisType);
 
428
  
 
429
      JISTEST_ASSERT_EQUAL((std::string)"foo-job-2", outJobs.front().Name, jisType);
 
430
      JISTEST_ASSERT_EQUAL((std::string)"https://ce2.grid.org/1234567890-foo-job-2", outJobs.front().JobID, jisType);
 
431
      JISTEST_ASSERT_EQUAL((std::string)"foo-job-3", outJobs.back().Name, jisType);
 
432
      JISTEST_ASSERT_EQUAL((std::string)"https://ce2.grid.org/1234567890-foo-job-3", outJobs.back().JobID, jisType);
 
433
  
 
434
      outJobs.clear();
 
435
      rejectEndpoints.push_back("ce2.grid.org");
 
436
  
 
437
      JISTEST_ASSERT(jis->ReadAll(outJobs, rejectEndpoints), jisType);
 
438
      JISTEST_ASSERT_EQUAL(2, (int)outJobs.size(), jisType);
 
439
  
 
440
      JISTEST_ASSERT_EQUAL((std::string)"foo-job-1", outJobs.front().Name, jisType);
 
441
      JISTEST_ASSERT_EQUAL((std::string)"https://ce1.grid.org/1234567890-foo-job-1", outJobs.front().JobID, jisType);
 
442
      JISTEST_ASSERT_EQUAL((std::string)"foo-job-4", outJobs.back().Name, jisType);
 
443
      JISTEST_ASSERT_EQUAL((std::string)"https://ce3.grid.org/1234567890-foo-job-4", outJobs.back().JobID, jisType);
 
444
    }
 
445
    
 
446
    remove("jobs.dat");
 
447
    delete jis;
 
448
  }
 
449
}
 
450
 
 
451
CPPUNIT_TEST_SUITE_REGISTRATION(JobInformationStorageTest);