Project

General

Profile

1 6309 cjones
/**
2
 *  '$RCSfile$'
3
 *  Copyright: 2010 Regents of the University of California and the
4
 *              National Center for Ecological Analysis and Synthesis
5
 *  Purpose: To test the Access Controls in metacat by JUnit
6
 *
7
 *   '$Author:$'
8
 *     '$Date:$'
9
 * '$Revision:$'
10
 *
11
 * This program is free software; you can redistribute it and/or modify
12
 * it under the terms of the GNU General Public License as published by
13
 * the Free Software Foundation; either version 2 of the License, or
14
 * (at your option) any later version.
15
 *
16
 * This program is distributed in the hope that it will be useful,
17
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19
 * GNU General Public License for more details.
20
 *
21
 * You should have received a copy of the GNU General Public License
22
 * along with this program; if not, write to the Free Software
23
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
24
 */
25
26
package edu.ucsb.nceas.metacat.dataone;
27
28 6338 cjones
import static org.junit.Assert.assertTrue;
29
30 6309 cjones
import java.io.ByteArrayInputStream;
31
import java.io.InputStream;
32
import java.io.UnsupportedEncodingException;
33 6326 leinfelder
import java.text.SimpleDateFormat;
34 6312 cjones
import java.util.Calendar;
35 6309 cjones
import java.util.Date;
36 6354 cjones
import java.util.List;
37 6309 cjones
38
import junit.framework.Test;
39
import junit.framework.TestSuite;
40
41 6324 leinfelder
import org.apache.commons.io.IOUtils;
42 6348 leinfelder
import org.dataone.configuration.Settings;
43 6309 cjones
import org.dataone.service.Constants;
44
import org.dataone.service.exceptions.IdentifierNotUnique;
45
import org.dataone.service.exceptions.InsufficientResources;
46
import org.dataone.service.exceptions.InvalidRequest;
47
import org.dataone.service.exceptions.InvalidSystemMetadata;
48
import org.dataone.service.exceptions.InvalidToken;
49
import org.dataone.service.exceptions.NotAuthorized;
50
import org.dataone.service.exceptions.NotFound;
51
import org.dataone.service.exceptions.NotImplemented;
52
import org.dataone.service.exceptions.ServiceFailure;
53 6333 leinfelder
import org.dataone.service.exceptions.SynchronizationFailed;
54 6309 cjones
import org.dataone.service.exceptions.UnsupportedType;
55 6366 leinfelder
import org.dataone.service.types.v1.AccessPolicy;
56
import org.dataone.service.types.v1.AccessRule;
57
import org.dataone.service.types.v1.Checksum;
58
import org.dataone.service.types.v1.DescribeResponse;
59
import org.dataone.service.types.v1.Event;
60
import org.dataone.service.types.v1.Identifier;
61
import org.dataone.service.types.v1.Log;
62
import org.dataone.service.types.v1.MonitorList;
63
import org.dataone.service.types.v1.Node;
64
import org.dataone.service.types.v1.NodeReference;
65
import org.dataone.service.types.v1.ObjectFormat;
66
import org.dataone.service.types.v1.ObjectFormatIdentifier;
67
import org.dataone.service.types.v1.ObjectList;
68
import org.dataone.service.types.v1.Permission;
69
import org.dataone.service.types.v1.Session;
70
import org.dataone.service.types.v1.Subject;
71
import org.dataone.service.types.v1.SystemMetadata;
72 6309 cjones
import org.junit.After;
73
import org.junit.Before;
74
75
/**
76
 * A JUnit test to exercise the Metacat Member Node service implementation.
77
 * This also tests a few of the D1NodeService superclass methods
78
 *
79
 * @author cjones
80
 *
81
 */
82 6324 leinfelder
public class MNodeServiceTest extends D1NodeServiceTest {
83 6309 cjones
84 6354 cjones
  /**
85
   * Set up the test fixtures
86
   *
87
   * @throws Exception
88
   */
89
  @Before
90
  public void setUp() throws Exception {
91
    super.setUp();
92
    // set up the configuration for d1client
93
    Settings.getConfiguration().setProperty("D1Client.cnClassName", MockCNode.class.getName());
94
  }
95 6309 cjones
96 6354 cjones
  /**
97
   * Remove the test fixtures
98
   */
99
  @After
100
  public void tearDown() {
101
  }
102
103
  /**
104
   * Build the test suite
105
   * @return
106
   */
107
  public static Test suite() {
108
109
    TestSuite suite = new TestSuite();
110 6309 cjones
    suite.addTest(new MNodeServiceTest("initialize"));
111
    // MNStorage tests
112
    suite.addTest(new MNodeServiceTest("testCreate"));
113 6314 cjones
    suite.addTest(new MNodeServiceTest("testUpdate"));
114
    suite.addTest(new MNodeServiceTest("testDelete"));
115 6309 cjones
    // MNRead tests
116 6314 cjones
    suite.addTest(new MNodeServiceTest("testGet"));
117
    suite.addTest(new MNodeServiceTest("testGetChecksum"));
118
    suite.addTest(new MNodeServiceTest("testGetSystemMetadata"));
119
    suite.addTest(new MNodeServiceTest("testDescribe"));
120 6326 leinfelder
    suite.addTest(new MNodeServiceTest("testListObjects"));
121 6333 leinfelder
    suite.addTest(new MNodeServiceTest("testSynchronizationFailed"));
122 6309 cjones
    // MNCore tests
123
    suite.addTest(new MNodeServiceTest("testPing"));
124
    suite.addTest(new MNodeServiceTest("testGetLogRecords"));
125 6327 leinfelder
    suite.addTest(new MNodeServiceTest("testGetOperationStatistics"));
126
    suite.addTest(new MNodeServiceTest("testGetCapabilities"));
127 6329 leinfelder
    // include these when they are part of the MN interface definitions
128 6327 leinfelder
    // suite.addTest(new MNodeServiceTest("testGetObjectStatistics"));
129
    // suite.addTest(new MNodeServiceTest("testGetStatus"));
130 6309 cjones
    // MNAuthorization tests
131 6325 leinfelder
    suite.addTest(new MNodeServiceTest("testIsAuthorized"));
132
    suite.addTest(new MNodeServiceTest("testSetAccessPolicy"));
133 6309 cjones
    // MNreplication tests
134 6329 leinfelder
    suite.addTest(new MNodeServiceTest("testReplicate"));
135 6309 cjones
136 6354 cjones
137
    return suite;
138
139
  }
140
141
  /**
142
   * Constructor for the tests
143
   *
144
   * @param name - the name of the test
145
   */
146
  public MNodeServiceTest(String name) {
147
    super(name);
148
149
  }
150 6309 cjones
151 6354 cjones
  /**
152
   * Initial blank test
153
   */
154
  public void initialize() {
155
    assertTrue(1 == 1);
156
157
  }
158
159
  /**
160
   * Test getting a known object
161
   */
162
  public void testGet() {
163 6309 cjones
    printTestHeader("testGet");
164
165 6354 cjones
    try {
166
      Session session = getTestSession();
167
      Identifier guid = new Identifier();
168
      guid.setValue("testGet." + System.currentTimeMillis());
169
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
170
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
171
      Identifier pid = MNodeService.getInstance().create(session, guid, object, sysmeta);
172
      InputStream result = MNodeService.getInstance().get(session, guid);
173
      // go back to beginning of original stream
174
      object.reset();
175
      // check
176
      assertTrue(object.available() > 0);
177
      assertTrue(result.available() > 0);
178
      assertTrue(IOUtils.contentEquals(result, object));
179
180 6309 cjones
    } catch (UnsupportedEncodingException e) {
181 6354 cjones
      e.printStackTrace();
182
      fail("Unexpected error: " + e.getMessage());
183 6309 cjones
184
    } catch (InvalidToken e) {
185 6354 cjones
      e.printStackTrace();
186
      fail("Unexpected error: " + e.getMessage());
187
188 6309 cjones
    } catch (ServiceFailure e) {
189 6354 cjones
      e.printStackTrace();
190
      fail("Unexpected error: " + e.getMessage());
191
192 6309 cjones
    } catch (NotAuthorized e) {
193 6354 cjones
      e.printStackTrace();
194
      fail("Unexpected error: " + e.getMessage());
195
196 6309 cjones
    } catch (IdentifierNotUnique e) {
197 6354 cjones
      e.printStackTrace();
198
      fail("Unexpected error: " + e.getMessage());
199
200 6309 cjones
    } catch (UnsupportedType e) {
201 6354 cjones
      e.printStackTrace();
202
      fail("Unexpected error: " + e.getMessage());
203
204 6309 cjones
    } catch (InsufficientResources e) {
205 6354 cjones
      e.printStackTrace();
206
      fail("Unexpected error: " + e.getMessage());
207
208 6309 cjones
    } catch (InvalidSystemMetadata e) {
209 6354 cjones
      e.printStackTrace();
210
      fail("Unexpected error: " + e.getMessage());
211
212 6309 cjones
    } catch (NotImplemented e) {
213 6354 cjones
      e.printStackTrace();
214
      fail("Unexpected error: " + e.getMessage());
215
216 6309 cjones
    } catch (InvalidRequest e) {
217 6354 cjones
      e.printStackTrace();
218
      fail("Unexpected error: " + e.getMessage());
219
220 6309 cjones
    } catch (NotFound e) {
221 6354 cjones
      e.printStackTrace();
222
      fail("Unexpected error: " + e.getMessage());
223
224 6309 cjones
    } catch (Exception e) {
225 6354 cjones
      e.printStackTrace();
226
      fail("Unexpected error: " + e.getMessage());
227
228 6309 cjones
    }
229
230 6354 cjones
  }
231 6309 cjones
232 6354 cjones
  /**
233
   * Test getting the system metadata of an object
234
   */
235
  public void testGetSystemMetadata() {
236 6309 cjones
    printTestHeader("testGetSystemMetadata");
237
238
    try {
239 6354 cjones
      Session session = getTestSession();
240
      Identifier guid = new Identifier();
241
      guid.setValue("testGetSystemMetadata." + System.currentTimeMillis());
242
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
243
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
244
      Identifier pid = MNodeService.getInstance().create(session, guid, object, sysmeta);
245
      SystemMetadata newsysmeta = MNodeService.getInstance().getSystemMetadata(session, pid);
246
      assertEquals(newsysmeta.getIdentifier().getValue(), sysmeta.getIdentifier().getValue());
247
248 6309 cjones
    } catch (UnsupportedEncodingException e) {
249 6354 cjones
      e.printStackTrace();
250
      fail("Unexpected error: " + e.getMessage());
251 6309 cjones
252
    } catch (InvalidToken e) {
253 6354 cjones
      e.printStackTrace();
254
      fail("Unexpected error: " + e.getMessage());
255 6309 cjones
256
    } catch (ServiceFailure e) {
257 6354 cjones
      e.printStackTrace();
258
      fail("Unexpected error: " + e.getMessage());
259 6309 cjones
260
    } catch (NotAuthorized e) {
261 6354 cjones
      e.printStackTrace();
262
      fail("Unexpected error: " + e.getMessage());
263 6309 cjones
264
    } catch (IdentifierNotUnique e) {
265 6354 cjones
      e.printStackTrace();
266
      fail("Unexpected error: " + e.getMessage());
267
268 6309 cjones
    } catch (UnsupportedType e) {
269 6354 cjones
      e.printStackTrace();
270
      fail("Unexpected error: " + e.getMessage());
271 6309 cjones
272
    } catch (InsufficientResources e) {
273 6354 cjones
      e.printStackTrace();
274
      fail("Unexpected error: " + e.getMessage());
275 6309 cjones
276
    } catch (InvalidSystemMetadata e) {
277 6354 cjones
      e.printStackTrace();
278
      fail("Unexpected error: " + e.getMessage());
279 6309 cjones
280
    } catch (NotImplemented e) {
281 6354 cjones
      e.printStackTrace();
282
      fail("Unexpected error: " + e.getMessage());
283 6309 cjones
284
    } catch (InvalidRequest e) {
285 6354 cjones
      e.printStackTrace();
286
      fail("Unexpected error: " + e.getMessage());
287 6309 cjones
288
    } catch (NotFound e) {
289 6354 cjones
      e.printStackTrace();
290
      fail("Unexpected error: " + e.getMessage());
291 6309 cjones
292
    } catch (Exception e) {
293 6354 cjones
      e.printStackTrace();
294
      fail("Unexpected error: " + e.getMessage());
295 6309 cjones
296
    }
297
298 6354 cjones
  }
299 6309 cjones
300 6354 cjones
  /**
301
   * Test object creation
302
   */
303
  public void testCreate() {
304 6309 cjones
    printTestHeader("testCreate");
305
306 6354 cjones
    try {
307
      Session session = getTestSession();
308
      Identifier guid = new Identifier();
309
      guid.setValue("testCreate." + System.currentTimeMillis());
310
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
311
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
312
      Identifier pid = MNodeService.getInstance().create(session, guid, object, sysmeta);
313
      assertEquals(guid.getValue(), pid.getValue());
314 6309 cjones
    } catch (UnsupportedEncodingException e) {
315 6354 cjones
      e.printStackTrace();
316
      fail("Unexpected error: " + e.getMessage());
317 6309 cjones
318
    } catch (InvalidToken e) {
319 6354 cjones
      e.printStackTrace();
320
      fail("Unexpected error: " + e.getMessage());
321 6309 cjones
322
    } catch (ServiceFailure e) {
323 6354 cjones
      e.printStackTrace();
324
      fail("Unexpected error: " + e.getMessage());
325 6309 cjones
326
    } catch (NotAuthorized e) {
327 6354 cjones
      e.printStackTrace();
328
      fail("Unexpected error: " + e.getMessage());
329 6309 cjones
330
    } catch (IdentifierNotUnique e) {
331 6354 cjones
      e.printStackTrace();
332
      fail("Unexpected error: " + e.getMessage());
333 6309 cjones
334
    } catch (UnsupportedType e) {
335 6354 cjones
      e.printStackTrace();
336
      fail("Unexpected error: " + e.getMessage());
337 6309 cjones
338
    } catch (InsufficientResources e) {
339 6354 cjones
      e.printStackTrace();
340
      fail("Unexpected error: " + e.getMessage());
341 6309 cjones
342
    } catch (InvalidSystemMetadata e) {
343 6354 cjones
      e.printStackTrace();
344
      fail("Unexpected error: " + e.getMessage());
345 6309 cjones
346
    } catch (NotImplemented e) {
347 6354 cjones
      e.printStackTrace();
348
      fail("Unexpected error: " + e.getMessage());
349 6309 cjones
350
    } catch (InvalidRequest e) {
351 6354 cjones
      e.printStackTrace();
352
      fail("Unexpected error: " + e.getMessage());
353 6309 cjones
354
    } catch (Exception e) {
355 6354 cjones
      e.printStackTrace();
356
      fail("Unexpected error: " + e.getMessage());
357 6309 cjones
358
    }
359
360
  }
361
362 6354 cjones
  /**
363
   * test object deletion
364
   */
365
  public void testDelete() {
366 6309 cjones
    printTestHeader("testDelete");
367
368 6354 cjones
    try {
369
      Session session = getTestSession();
370
      Identifier guid = new Identifier();
371
      guid.setValue("testDelete." + System.currentTimeMillis());
372
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
373
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
374
      Identifier pid = MNodeService.getInstance().create(session, guid, object, sysmeta);
375 6309 cjones
      Identifier deletedPid = MNodeService.getInstance().delete(session, pid);
376 6333 leinfelder
      assertEquals(pid.getValue(), deletedPid.getValue());
377 6309 cjones
378 6354 cjones
    } catch (UnsupportedEncodingException e) {
379
      e.printStackTrace();
380
381 6324 leinfelder
    } catch (Exception e) {
382 6354 cjones
      e.printStackTrace();
383
      fail("Unexpected error: " + e.getMessage());
384 6309 cjones
385 6324 leinfelder
    }
386 6309 cjones
387 6354 cjones
  }
388 6309 cjones
389 6354 cjones
  /**
390
   * Test object updating
391
   */
392
  public void testUpdate() {
393 6309 cjones
    printTestHeader("testUpdate");
394
395 6354 cjones
    try {
396
      Session session = getTestSession();
397
      Identifier guid = new Identifier();
398
      guid.setValue("testUpdate." + System.currentTimeMillis());
399
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
400
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
401
      Identifier newPid = new Identifier();
402
      newPid.setValue("testUpdate." + System.currentTimeMillis());
403
      Identifier pid =
404
        MNodeService.getInstance().create(session, guid, object, sysmeta);
405 6338 cjones
406 6354 cjones
      SystemMetadata newSysMeta = createSystemMetadata(newPid, session.getSubject(), object);
407
408
      // do the update
409
      Identifier updatedPid =
410
        MNodeService.getInstance().update(session, pid, object, newPid, newSysMeta);
411 6338 cjones
412 6354 cjones
      // get the updated system metadata
413 6338 cjones
      SystemMetadata updatedSysMeta =
414 6354 cjones
        MNodeService.getInstance().getSystemMetadata(session, updatedPid);
415 6338 cjones
416 6354 cjones
      assertEquals(updatedPid.getValue(), newPid.getValue());
417 6366 leinfelder
//      assertTrue(updatedSysMeta.getObsolete(0).getValue().equals(pid.getValue()));
418
//      assertTrue(updatedSysMeta.getDerivedFrom(0).getValue().equals(pid.getValue()));
419 6354 cjones
420 6309 cjones
    } catch (UnsupportedEncodingException e) {
421 6354 cjones
      e.printStackTrace();
422
      fail("Unexpected error: " + e.getMessage());
423 6309 cjones
424
    } catch (InvalidToken e) {
425 6354 cjones
      e.printStackTrace();
426
      fail("Unexpected error: " + e.getMessage());
427 6309 cjones
428
    } catch (ServiceFailure e) {
429 6354 cjones
      e.printStackTrace();
430
      fail("Unexpected error: " + e.getMessage());
431 6309 cjones
432
    } catch (NotAuthorized e) {
433 6354 cjones
      e.printStackTrace();
434
      fail("Unexpected error: " + e.getMessage());
435 6309 cjones
436
    } catch (IdentifierNotUnique e) {
437 6354 cjones
      e.printStackTrace();
438
      fail("Unexpected error: " + e.getMessage());
439 6309 cjones
440
    } catch (UnsupportedType e) {
441 6354 cjones
      e.printStackTrace();
442
      fail("Unexpected error: " + e.getMessage());
443 6309 cjones
444
    } catch (InsufficientResources e) {
445 6354 cjones
      e.printStackTrace();
446
      fail("Unexpected error: " + e.getMessage());
447 6309 cjones
448
    } catch (InvalidSystemMetadata e) {
449 6354 cjones
      e.printStackTrace();
450
      fail("Unexpected error: " + e.getMessage());
451 6309 cjones
452
    } catch (NotImplemented e) {
453 6354 cjones
      e.printStackTrace();
454
      fail("Unexpected error: " + e.getMessage());
455 6309 cjones
456
    } catch (InvalidRequest e) {
457 6354 cjones
      e.printStackTrace();
458
      fail("Unexpected error: " + e.getMessage());
459 6309 cjones
460
    } catch (Exception e) {
461 6354 cjones
      e.printStackTrace();
462
      fail("Unexpected error: " + e.getMessage());
463 6309 cjones
464
    }
465 6354 cjones
  }
466 6309 cjones
467 6354 cjones
  /**
468
   * We currently expect this unit test to fail because it should rely on a different member node
469
   * to retrieve the object from. Currently it gets the object from itself and throws
470
   * and expected error for duplicate entry.
471
   *
472
   */
473
  public void testReplicate() {
474
      printTestHeader("testReplicate");
475
      try {
476
        Session session = getTestSession();
477
        Identifier guid = new Identifier();
478
        guid.setValue("testReplicate." + System.currentTimeMillis());
479
        InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
480
        SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
481
        // save locally
482
        Identifier pid = MNodeService.getInstance().create(session, guid, object, sysmeta);
483
        // get our node reference (attempting to replicate with self)
484
        NodeReference sourceNode = MNodeService.getInstance().getCapabilities().getIdentifier();
485
        // attempt to replicate with ourselves -- this should fail!
486
      boolean result = false;
487
      try {
488
        result = MNodeService.getInstance().replicate(session, sysmeta, sourceNode);
489
      } catch (Exception inu) {
490
        // we are expecting this to fail since we already have the doc
491
        result = true;
492
      }
493
      assertTrue(result);
494
      } catch (Exception e) {
495
        e.printStackTrace();
496
      fail("Probably not yet implemented: " + e.getMessage());
497
    }
498
  }
499 6309 cjones
500 6354 cjones
  /**
501
   * Test describing an object
502
   */
503
  public void testDescribe() {
504 6314 cjones
    printTestHeader("testDescribe");
505 6309 cjones
506
    try {
507 6354 cjones
      Session session = getTestSession();
508
      Identifier guid = new Identifier();
509
      guid.setValue("testGetSystemMetadata." + System.currentTimeMillis());
510
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
511
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
512
      Identifier pid = MNodeService.getInstance().create(session, guid, object, sysmeta);
513
      DescribeResponse describeResponse = MNodeService.getInstance().describe(session, pid);
514
      assertEquals(describeResponse.getDataONE_Checksum().getValue(), sysmeta.getChecksum().getValue());
515
      assertEquals(describeResponse.getDataONE_ObjectFormat().getFormatName(), sysmeta.getObjectFormat().getFormatName());
516
517 6309 cjones
    } catch (UnsupportedEncodingException e) {
518 6354 cjones
      e.printStackTrace();
519
      fail("Unexpected error: " + e.getMessage());
520 6309 cjones
521
    } catch (InvalidToken e) {
522 6354 cjones
      e.printStackTrace();
523
      fail("Unexpected error: " + e.getMessage());
524 6309 cjones
525
    } catch (ServiceFailure e) {
526 6354 cjones
      e.printStackTrace();
527
      fail("Unexpected error: " + e.getMessage());
528 6309 cjones
529
    } catch (NotAuthorized e) {
530 6354 cjones
      e.printStackTrace();
531
      fail("Unexpected error: " + e.getMessage());
532 6309 cjones
533
    } catch (IdentifierNotUnique e) {
534 6354 cjones
      e.printStackTrace();
535
      fail("Unexpected error: " + e.getMessage());
536
537 6309 cjones
    } catch (UnsupportedType e) {
538 6354 cjones
      e.printStackTrace();
539
      fail("Unexpected error: " + e.getMessage());
540 6309 cjones
541
    } catch (InsufficientResources e) {
542 6354 cjones
      e.printStackTrace();
543
      fail("Unexpected error: " + e.getMessage());
544 6309 cjones
545
    } catch (InvalidSystemMetadata e) {
546 6354 cjones
      e.printStackTrace();
547
      fail("Unexpected error: " + e.getMessage());
548 6309 cjones
549
    } catch (NotImplemented e) {
550 6354 cjones
      e.printStackTrace();
551
      fail("Unexpected error: " + e.getMessage());
552 6309 cjones
553
    } catch (InvalidRequest e) {
554 6354 cjones
      e.printStackTrace();
555
      fail("Unexpected error: " + e.getMessage());
556 6309 cjones
557
    } catch (NotFound e) {
558 6354 cjones
      e.printStackTrace();
559
      fail("Unexpected error: " + e.getMessage());
560 6309 cjones
561
    } catch (Exception e) {
562 6354 cjones
      e.printStackTrace();
563
      fail("Unexpected error: " + e.getMessage());
564 6309 cjones
565
    }
566 6354 cjones
  }
567 6309 cjones
568 6354 cjones
  /**
569
   * Test getting the checksum of an object
570
   */
571
  public void testGetChecksum() {
572 6309 cjones
    printTestHeader("testGetChecksum");
573
574 6354 cjones
    try {
575
      Session session = getTestSession();
576
      Identifier guid = new Identifier();
577
      guid.setValue("testGetChecksum." + System.currentTimeMillis());
578
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
579
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
580
      Identifier pid = MNodeService.getInstance().create(session, guid, object, sysmeta);
581
      Checksum checksum = MNodeService.getInstance().getChecksum(session, pid, "MD5");
582
      assertEquals(checksum.getValue(), sysmeta.getChecksum().getValue());
583 6309 cjones
584 6354 cjones
    } catch (UnsupportedEncodingException e) {
585
      e.printStackTrace();
586
      fail("Unexpected error: " + e.getMessage());
587 6309 cjones
588
    } catch (InvalidToken e) {
589 6354 cjones
      e.printStackTrace();
590
      fail("Unexpected error: " + e.getMessage());
591 6309 cjones
592
    } catch (ServiceFailure e) {
593 6354 cjones
      e.printStackTrace();
594
      fail("Unexpected error: " + e.getMessage());
595 6309 cjones
596
    } catch (NotAuthorized e) {
597 6354 cjones
      e.printStackTrace();
598
      fail("Unexpected error: " + e.getMessage());
599 6309 cjones
600
    } catch (IdentifierNotUnique e) {
601 6354 cjones
      e.printStackTrace();
602
      fail("Unexpected error: " + e.getMessage());
603 6309 cjones
604
    } catch (UnsupportedType e) {
605 6354 cjones
      e.printStackTrace();
606
      fail("Unexpected error: " + e.getMessage());
607 6309 cjones
608
    } catch (InsufficientResources e) {
609 6354 cjones
      e.printStackTrace();
610
      fail("Unexpected error: " + e.getMessage());
611 6309 cjones
612
    } catch (InvalidSystemMetadata e) {
613 6354 cjones
      e.printStackTrace();
614
      fail("Unexpected error: " + e.getMessage());
615 6309 cjones
616
    } catch (NotImplemented e) {
617 6354 cjones
      e.printStackTrace();
618
      fail("Unexpected error: " + e.getMessage());
619 6309 cjones
620
    } catch (InvalidRequest e) {
621 6354 cjones
      e.printStackTrace();
622
      fail("Unexpected error: " + e.getMessage());
623 6309 cjones
624
    } catch (NotFound e) {
625 6354 cjones
      e.printStackTrace();
626
      fail("Unexpected error: " + e.getMessage());
627 6309 cjones
628
    } catch (Exception e) {
629 6354 cjones
      e.printStackTrace();
630
      fail("Unexpected error: " + e.getMessage());
631 6309 cjones
632
    }
633 6354 cjones
634
  }
635 6309 cjones
636 6354 cjones
  /**
637
   * Testing listing objects on the Member Node
638
   */
639
  public void testListObjects() {
640
      printTestHeader("testListObjects");
641
642
      try {
643
644
        Session session = getTestSession();
645
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
646
        Date startTime = sdf.parse("2010-01-01");
647
        Date endTime = new Date();
648
        ObjectFormatIdentifier objectFormatId = null;
649
        boolean replicaStatus = false;
650
        int start = 0;
651
        int count = 1;
652
653
        // insert at least one object
654
        testCreate();
655
        // now check that we have at least one
656
        ObjectList objectList =
657
          MNodeService.getInstance().listObjects(session, startTime, endTime,
658
              objectFormatId, replicaStatus, start, count);
659
        assertNotNull(objectList);
660
        assertTrue(objectList.getCount() == count);
661
        assertTrue(objectList.getStart() == 0);
662
        assertTrue(objectList.getTotal() > 1);
663
664
      } catch (Exception e) {
665
        e.printStackTrace();
666
        fail("Unexpected error: " + e.getMessage());
667
668
      }
669
  }
670 6309 cjones
671 6354 cjones
  public void testGetCapabilities() {
672
      printTestHeader("testGetCapabilities");
673
    try {
674
      Node node = MNodeService.getInstance().getCapabilities();
675
      assertNotNull(node);
676
      // TODO: should probably test other parts of the node information
677
    } catch (Exception e) {
678
      e.printStackTrace();
679
      fail("Probably not yet implemented: " + e.getMessage());
680
    }
681
682
  }
683 6309 cjones
684 6354 cjones
  public void testGetOperationStatistics() {
685
      printTestHeader("testGetOperationStatistics");
686
    try {
687
      Session session = getTestSession();
688
      SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
689
        Date startTime = sdf.parse("2010-01-01");
690
        Date endTime = new Date();
691
      MonitorList monitorList =
692
        MNodeService.getInstance().getOperationStatistics(
693
            session,
694
            startTime,
695
            endTime,
696
            session.getSubject(),
697
            Event.CREATE,
698
            null //formatId
699
            );
700
701
      assertNotNull(monitorList);
702
      // TODO: should probably test other parts of the information
703
    } catch (Exception e) {
704
      e.printStackTrace();
705
      fail("Probably not yet implemented: " + e.getMessage());
706
    }
707
  }
708 6309 cjones
709 6354 cjones
  public void testPing() {
710 6309 cjones
711 6354 cjones
    try {
712
      boolean pingable = MNodeService.getInstance().ping();
713
      assertTrue(pingable);
714
715 6309 cjones
    } catch (NotImplemented e) {
716 6354 cjones
      e.printStackTrace();
717
      fail("Unexpected error: " + e.getMessage());
718 6309 cjones
719
    } catch (ServiceFailure e) {
720 6354 cjones
      e.printStackTrace();
721
      fail("Unexpected error: " + e.getMessage());
722 6309 cjones
723
    } catch (NotAuthorized e) {
724 6354 cjones
      e.printStackTrace();
725
      fail("Unexpected error: " + e.getMessage());
726 6309 cjones
727
    } catch (InvalidRequest e) {
728 6354 cjones
      e.printStackTrace();
729
      fail("Unexpected error: " + e.getMessage());
730 6309 cjones
731
    } catch (InsufficientResources e) {
732 6354 cjones
      e.printStackTrace();
733
      fail("Unexpected error: " + e.getMessage());
734 6309 cjones
735
    } catch (UnsupportedType e) {
736 6354 cjones
      e.printStackTrace();
737
      fail("Unexpected error: " + e.getMessage());
738 6309 cjones
739
    }
740 6354 cjones
741
  }
742 6309 cjones
743 6354 cjones
  public void testSynchronizationFailed() {
744
    printTestHeader("testSynchronizationFailed");
745
    try {
746
        Session session = getTestSession();
747
748
        // create the object
749
        Identifier pid = new Identifier();
750
        pid.setValue("testSynchronizationFailed." + System.currentTimeMillis());
751
        InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
752
        SystemMetadata sysmeta = createSystemMetadata(pid, session.getSubject(), object);
753
        Identifier retPid = MNodeService.getInstance().create(session, pid, object, sysmeta);
754
        assertEquals(retPid.getValue(), pid.getValue());
755
756
        // pretend the sync failed
757
      SynchronizationFailed syncFailed =
758
        new SynchronizationFailed("0000", "Testing Synch Failure");
759 6366 leinfelder
      syncFailed.setPid(pid.getValue());
760 6354 cjones
      MNodeService.getInstance().synchronizationFailed(session, syncFailed );
761
    } catch (Exception e) {
762
      e.printStackTrace();
763
        fail("Unexpected error: " + e.getMessage());
764
    }
765 6333 leinfelder
766 6354 cjones
  }
767 6309 cjones
768 6354 cjones
  public void testGetLogRecords() {
769 6312 cjones
    printTestHeader("testLogRecords");
770 6309 cjones
771
    Log log = null;
772
    Session session = getTestSession();
773 6312 cjones
    Date fromDate = new Date();
774
    Calendar calendar = Calendar.getInstance();
775
    calendar.setTime(fromDate);
776
    calendar.roll(Calendar.YEAR, false);
777
    fromDate = calendar.getTime();
778 6309 cjones
    Date toDate = new Date();
779
    Event event = Event.CREATE;
780 6324 leinfelder
    int start = 0;
781
    int count = 1;
782 6309 cjones
783 6354 cjones
    try {
784
      log = MNodeService.getInstance().getLogRecords(session, fromDate, toDate,
785
        event, start, count);
786
787
      assertNotNull(log);
788
      assertTrue(log.getCount() == count);
789
      assertTrue(log.getStart() == start);
790
      assertTrue(log.getTotal() >= 1);
791
792 6309 cjones
    } catch (InvalidToken e) {
793 6354 cjones
      e.printStackTrace();
794
      fail("Unexpected error: " + e.getMessage());
795 6309 cjones
796
    } catch (ServiceFailure e) {
797 6354 cjones
      e.printStackTrace();
798
      fail("Unexpected error: " + e.getMessage());
799
800 6309 cjones
    } catch (NotAuthorized e) {
801 6354 cjones
      e.printStackTrace();
802
      fail("Unexpected error: " + e.getMessage());
803
804 6309 cjones
    } catch (InvalidRequest e) {
805 6354 cjones
      e.printStackTrace();
806
      fail("Unexpected error: " + e.getMessage());
807
808 6309 cjones
    } catch (NotImplemented e) {
809 6354 cjones
      e.printStackTrace();
810
      fail("Unexpected error: " + e.getMessage());
811
812 6309 cjones
    }
813 6354 cjones
  }
814 6309 cjones
815 6354 cjones
  /**
816
   * Testing setting access on a known object
817
   */
818
  public void testSetAccessPolicy() {
819 6309 cjones
    printTestHeader("testSetAccess");
820
821
    boolean accessWasSet = false;
822
823
    try {
824 6354 cjones
      // create an object to set access on
825
      Session session = getTestSession();
826
      Identifier guid = new Identifier();
827
      guid.setValue("testSetAccess." + System.currentTimeMillis());
828
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
829
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
830
      Identifier pid =
831
        MNodeService.getInstance().create(session, guid, object, sysmeta);
832
      // set the access
833
      AccessPolicy accessPolicy = new AccessPolicy();
834
      AccessRule allow = new AccessRule();
835
      allow.addPermission(Permission.WRITE);
836
      Subject publicSubject = new Subject();
837
      publicSubject.setValue(Constants.PUBLIC_SUBJECT);
838
      allow.addSubject(publicSubject);
839
      accessPolicy.addAllow(allow);
840
841
      accessWasSet =
842
        MNodeService.getInstance().setAccessPolicy(session, pid, accessPolicy);
843
      assertTrue(accessWasSet);
844
      // test that it is enforced
845
      session.setSubject(publicSubject);
846
      boolean isAuthorized = MNodeService.getInstance().isAuthorized(session, pid, Permission.WRITE);
847
      assertTrue(isAuthorized);
848 6325 leinfelder
849 6309 cjones
    } catch (UnsupportedEncodingException e) {
850 6354 cjones
      e.printStackTrace();
851
852 6309 cjones
    } catch (InvalidToken e) {
853 6354 cjones
      e.printStackTrace();
854
      fail("Unexpected error: " + e.getMessage());
855
856 6309 cjones
    } catch (ServiceFailure e) {
857 6354 cjones
      e.printStackTrace();
858
      fail("Unexpected error: " + e.getMessage());
859
860 6309 cjones
    } catch (NotAuthorized e) {
861 6354 cjones
      e.printStackTrace();
862
      fail("Unexpected error: " + e.getMessage());
863
864 6309 cjones
    } catch (IdentifierNotUnique e) {
865 6354 cjones
      e.printStackTrace();
866
      fail("Unexpected error: " + e.getMessage());
867
868 6309 cjones
    } catch (UnsupportedType e) {
869 6354 cjones
      e.printStackTrace();
870
      fail("Unexpected error: " + e.getMessage());
871
872 6309 cjones
    } catch (InsufficientResources e) {
873 6354 cjones
      e.printStackTrace();
874
      fail("Unexpected error: " + e.getMessage());
875
876 6309 cjones
    } catch (InvalidSystemMetadata e) {
877 6354 cjones
      e.printStackTrace();
878
      fail("Unexpected error: " + e.getMessage());
879
880 6309 cjones
    } catch (NotImplemented e) {
881 6354 cjones
      e.printStackTrace();
882
      fail("Unexpected error: " + e.getMessage());
883
884 6309 cjones
    } catch (InvalidRequest e) {
885 6354 cjones
      e.printStackTrace();
886
      fail("Unexpected error: " + e.getMessage());
887
888 6309 cjones
    } catch (NotFound e) {
889 6354 cjones
      e.printStackTrace();
890
      fail("Unexpected error: " + e.getMessage());
891
892 6309 cjones
    } catch (Exception e) {
893 6354 cjones
      e.printStackTrace();
894
      fail("Unexpected error: " + e.getMessage());
895
896 6309 cjones
    }
897 6354 cjones
898
  }
899 6309 cjones
900 6354 cjones
  /**
901
   * Test if a subject is authorized to read a known object
902
   */
903
  public void testIsAuthorized() {
904 6309 cjones
    printTestHeader("testIsAuthorized");
905
906 6354 cjones
    try {
907
      Session session = getTestSession();
908
      Identifier guid = new Identifier();
909
      guid.setValue("testIsAuthorized." + System.currentTimeMillis());
910
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
911
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
912
      Identifier pid =
913
        MNodeService.getInstance().create(session, guid, object, sysmeta);
914
      boolean isAuthorized =
915
        MNodeService.getInstance().isAuthorized(session, pid, Permission.READ);
916
      assertEquals(isAuthorized, true);
917
918 6309 cjones
    } catch (UnsupportedEncodingException e) {
919 6354 cjones
      e.printStackTrace();
920
      fail("Unexpected error: " + e.getMessage());
921 6309 cjones
922
    } catch (InvalidToken e) {
923 6354 cjones
      e.printStackTrace();
924
      fail("Unexpected error: " + e.getMessage());
925 6309 cjones
926
    } catch (ServiceFailure e) {
927 6354 cjones
      e.printStackTrace();
928
      fail("Unexpected error: " + e.getMessage());
929 6309 cjones
930
    } catch (NotAuthorized e) {
931 6354 cjones
      e.printStackTrace();
932
      fail("Unexpected error: " + e.getMessage());
933 6309 cjones
934
    } catch (IdentifierNotUnique e) {
935 6354 cjones
      e.printStackTrace();
936
      fail("Unexpected error: " + e.getMessage());
937 6309 cjones
938
    } catch (UnsupportedType e) {
939 6354 cjones
      e.printStackTrace();
940
      fail("Unexpected error: " + e.getMessage());
941 6309 cjones
942
    } catch (InsufficientResources e) {
943 6354 cjones
      e.printStackTrace();
944
      fail("Unexpected error: " + e.getMessage());
945 6309 cjones
946
    } catch (InvalidSystemMetadata e) {
947 6354 cjones
      e.printStackTrace();
948
      fail("Unexpected error: " + e.getMessage());
949 6309 cjones
950
    } catch (NotImplemented e) {
951 6354 cjones
      e.printStackTrace();
952
      fail("Unexpected error: " + e.getMessage());
953 6309 cjones
954
    } catch (InvalidRequest e) {
955 6354 cjones
      e.printStackTrace();
956
      fail("Unexpected error: " + e.getMessage());
957 6309 cjones
958
    } catch (Exception e) {
959 6354 cjones
      e.printStackTrace();
960
      fail("Unexpected error: " + e.getMessage());
961 6309 cjones
962
    }
963 6354 cjones
  }
964 6309 cjones
965
966 6354 cjones
967
968 6309 cjones
}