Project

General

Profile

1
/**
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

    
29
import java.io.ByteArrayInputStream;
30
import java.io.ByteArrayOutputStream;
31
import java.io.IOException;
32
import java.io.InputStream;
33
import java.io.UnsupportedEncodingException;
34
import java.text.SimpleDateFormat;
35
import java.util.ArrayList;
36
import java.util.Calendar;
37
import java.util.Date;
38
import java.util.List;
39

    
40
import junit.framework.Test;
41
import junit.framework.TestSuite;
42

    
43
import org.apache.commons.io.IOUtils;
44
import org.dataone.configuration.Settings;
45
import org.dataone.service.util.TypeMarshaller;
46
import org.dataone.service.exceptions.IdentifierNotUnique;
47
import org.dataone.service.exceptions.InsufficientResources;
48
import org.dataone.service.exceptions.InvalidRequest;
49
import org.dataone.service.exceptions.InvalidSystemMetadata;
50
import org.dataone.service.exceptions.InvalidToken;
51
import org.dataone.service.exceptions.NotAuthorized;
52
import org.dataone.service.exceptions.NotFound;
53
import org.dataone.service.exceptions.NotImplemented;
54
import org.dataone.service.exceptions.ServiceFailure;
55
import org.dataone.service.exceptions.SynchronizationFailed;
56
import org.dataone.service.exceptions.UnsupportedType;
57
import org.dataone.service.types.v1.AccessPolicy;
58
import org.dataone.service.types.v1.AccessRule;
59
import org.dataone.service.types.v1.Checksum;
60
import org.dataone.service.types.v1.DescribeResponse;
61
import org.dataone.service.types.v1.Event;
62
import org.dataone.service.types.v1.Identifier;
63
import org.dataone.service.types.v1.Log;
64
import org.dataone.service.types.v1.MonitorList;
65
import org.dataone.service.types.v1.Node;
66
import org.dataone.service.types.v1.NodeReference;
67
import org.dataone.service.types.v1.ObjectFormatIdentifier;
68
import org.dataone.service.types.v1.ObjectList;
69
import org.dataone.service.types.v1.Permission;
70
import org.dataone.service.types.v1.Person;
71
import org.dataone.service.types.v1.Session;
72
import org.dataone.service.types.v1.Subject;
73
import org.dataone.service.types.v1.SubjectInfo;
74
import org.dataone.service.types.v1.SystemMetadata;
75
import org.jibx.runtime.JiBXException;
76
import org.junit.After;
77
import org.junit.Before;
78

    
79
/**
80
 * A JUnit test to exercise the Metacat Member Node service implementation.
81
 * This also tests a few of the D1NodeService superclass methods
82
 * 
83
 * @author cjones
84
 *
85
 */
86
public class MNodeServiceTest extends D1NodeServiceTest {
87

    
88
  /**
89
   * Set up the test fixtures
90
   * 
91
   * @throws Exception
92
   */
93
  @Before
94
  public void setUp() throws Exception {
95
    super.setUp();
96
    // set up the configuration for d1client
97
    Settings.getConfiguration().setProperty("D1Client.cnClassName", MockCNode.class.getName());
98
  }
99

    
100
  /**
101
   * Remove the test fixtures
102
   */
103
  @After
104
  public void tearDown() {
105
  }
106
  
107
  /**
108
   * Build the test suite
109
   * @return
110
   */
111
  public static Test suite() {
112
    
113
    TestSuite suite = new TestSuite();
114
    suite.addTest(new MNodeServiceTest("initialize"));
115
    // MNStorage tests
116
    suite.addTest(new MNodeServiceTest("testCreate"));
117
    suite.addTest(new MNodeServiceTest("testUpdate"));
118
    // this requires MN certificate
119
    suite.addTest(new MNodeServiceTest("testDelete"));
120
    
121
    // MNRead tests
122
    suite.addTest(new MNodeServiceTest("testGet"));
123
    suite.addTest(new MNodeServiceTest("testGetChecksum"));
124
    suite.addTest(new MNodeServiceTest("testGetSystemMetadata"));
125
    suite.addTest(new MNodeServiceTest("testDescribe"));
126
    suite.addTest(new MNodeServiceTest("testListObjects"));
127
    // this requires CN certificate
128
    suite.addTest(new MNodeServiceTest("testSynchronizationFailed"));
129
    
130
    // MNCore tests
131
    suite.addTest(new MNodeServiceTest("testPing"));
132
    suite.addTest(new MNodeServiceTest("testGetLogRecords"));
133
    suite.addTest(new MNodeServiceTest("testGetOperationStatistics"));
134
    suite.addTest(new MNodeServiceTest("testGetCapabilities"));
135
    // include these when they are part of the MN interface definitions
136
    // suite.addTest(new MNodeServiceTest("testGetObjectStatistics"));
137
    // suite.addTest(new MNodeServiceTest("testGetStatus"));
138
    // MNAuthorization tests
139
    suite.addTest(new MNodeServiceTest("testIsAuthorized"));
140
    suite.addTest(new MNodeServiceTest("testIsEquivIdentityAuthorized"));
141
    suite.addTest(new MNodeServiceTest("testSetAccessPolicy"));
142
    // MNreplication tests
143
    suite.addTest(new MNodeServiceTest("testReplicate"));
144
    
145
    
146
    return suite;
147
    
148
  }
149
  
150
  /**
151
   * Constructor for the tests
152
   * 
153
   * @param name - the name of the test
154
   */
155
  public MNodeServiceTest(String name) {
156
    super(name);
157
    
158
  }
159

    
160
  /**
161
   * Initial blank test
162
   */
163
  public void initialize() {
164
    assertTrue(1 == 1);
165
    
166
  }
167
  
168
  /**
169
   * Test getting a known object
170
   */
171
  public void testGet() {
172
    printTestHeader("testGet");
173

    
174
    try {
175
      Session session = getTestSession();
176
      Identifier guid = new Identifier();
177
      guid.setValue("testGet." + System.currentTimeMillis());
178
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
179
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
180
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
181
      InputStream result = MNodeService.getInstance(request).get(session, guid);
182
      // go back to beginning of original stream
183
      object.reset();
184
      // check
185
      assertTrue(object.available() > 0);
186
      assertTrue(result.available() > 0);
187
      assertTrue(IOUtils.contentEquals(result, object));
188
      
189
    } catch (UnsupportedEncodingException e) {
190
      e.printStackTrace();
191
      fail("Unexpected error: " + e.getMessage());
192

    
193
    } catch (InvalidToken e) {
194
      e.printStackTrace();
195
      fail("Unexpected error: " + e.getMessage());
196
      
197
    } catch (ServiceFailure e) {
198
      e.printStackTrace();
199
      fail("Unexpected error: " + e.getMessage());
200
      
201
    } catch (NotAuthorized e) {
202
      e.printStackTrace();
203
      fail("Unexpected error: " + e.getMessage());
204
      
205
    } catch (IdentifierNotUnique e) {
206
      e.printStackTrace();
207
      fail("Unexpected error: " + e.getMessage());
208
      
209
    } catch (UnsupportedType e) {
210
      e.printStackTrace();
211
      fail("Unexpected error: " + e.getMessage());
212
      
213
    } catch (InsufficientResources e) {
214
      e.printStackTrace();
215
      fail("Unexpected error: " + e.getMessage());
216
      
217
    } catch (InvalidSystemMetadata e) {
218
      e.printStackTrace();
219
      fail("Unexpected error: " + e.getMessage());
220
      
221
    } catch (NotImplemented e) {
222
      e.printStackTrace();
223
      fail("Unexpected error: " + e.getMessage());
224
      
225
    } catch (InvalidRequest e) {
226
      e.printStackTrace();
227
      fail("Unexpected error: " + e.getMessage());
228
      
229
    } catch (NotFound e) {
230
      e.printStackTrace();
231
      fail("Unexpected error: " + e.getMessage());
232
      
233
    } catch (Exception e) {
234
      e.printStackTrace();
235
      fail("Unexpected error: " + e.getMessage());
236
      
237
    }
238

    
239
  }
240

    
241
  /**
242
   * Test getting the system metadata of an object
243
   */
244
  public void testGetSystemMetadata() {    
245
    printTestHeader("testGetSystemMetadata");
246

    
247
    try {
248
      Session session = getTestSession();
249
      Identifier guid = new Identifier();
250
      guid.setValue("testGetSystemMetadata." + System.currentTimeMillis());
251
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
252
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
253
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
254
      SystemMetadata newsysmeta = MNodeService.getInstance(request).getSystemMetadata(session, pid);
255
      assertEquals(newsysmeta.getIdentifier().getValue(), sysmeta.getIdentifier().getValue());
256
      
257
    } catch (UnsupportedEncodingException e) {
258
      e.printStackTrace();
259
      fail("Unexpected error: " + e.getMessage());
260

    
261
    } catch (InvalidToken e) {
262
      e.printStackTrace();      
263
      fail("Unexpected error: " + e.getMessage());
264

    
265
    } catch (ServiceFailure e) {
266
      e.printStackTrace();
267
      fail("Unexpected error: " + e.getMessage());
268

    
269
    } catch (NotAuthorized e) {
270
      e.printStackTrace();
271
      fail("Unexpected error: " + e.getMessage());
272

    
273
    } catch (IdentifierNotUnique e) {
274
      e.printStackTrace();
275
      fail("Unexpected error: " + e.getMessage());
276
      
277
    } catch (UnsupportedType e) {
278
      e.printStackTrace();
279
      fail("Unexpected error: " + e.getMessage());
280

    
281
    } catch (InsufficientResources e) {
282
      e.printStackTrace();
283
      fail("Unexpected error: " + e.getMessage());
284

    
285
    } catch (InvalidSystemMetadata e) {
286
      e.printStackTrace();
287
      fail("Unexpected error: " + e.getMessage());
288

    
289
    } catch (NotImplemented e) {
290
      e.printStackTrace();
291
      fail("Unexpected error: " + e.getMessage());
292

    
293
    } catch (InvalidRequest e) {
294
      e.printStackTrace();
295
      fail("Unexpected error: " + e.getMessage());
296

    
297
    } catch (NotFound e) {
298
      e.printStackTrace();
299
      fail("Unexpected error: " + e.getMessage());
300

    
301
    } catch (Exception e) {
302
      e.printStackTrace();
303
      fail("Unexpected error: " + e.getMessage());
304

    
305
    }
306
    
307
  }
308

    
309
  /**
310
   * Test object creation
311
   */
312
  public void testCreate() {
313
    printTestHeader("testCreate");
314
    
315
    try {
316
      Session session = getTestSession();
317
      Identifier guid = new Identifier();
318
      guid.setValue("testCreate." + System.currentTimeMillis());
319
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
320
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
321
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
322
      assertEquals(guid.getValue(), pid.getValue());
323
    } catch (UnsupportedEncodingException e) {
324
      e.printStackTrace();
325
      fail("Unexpected error: " + e.getMessage());
326

    
327
    } catch (InvalidToken e) {
328
      e.printStackTrace();
329
      fail("Unexpected error: " + e.getMessage());
330

    
331
    } catch (ServiceFailure e) {
332
      e.printStackTrace();
333
      fail("Unexpected error: " + e.getMessage());
334

    
335
    } catch (NotAuthorized e) {
336
      e.printStackTrace();
337
      fail("Unexpected error: " + e.getMessage());
338

    
339
    } catch (IdentifierNotUnique e) {
340
      e.printStackTrace();
341
      fail("Unexpected error: " + e.getMessage());
342

    
343
    } catch (UnsupportedType e) {
344
      e.printStackTrace();
345
      fail("Unexpected error: " + e.getMessage());
346

    
347
    } catch (InsufficientResources e) {
348
      e.printStackTrace();
349
      fail("Unexpected error: " + e.getMessage());
350

    
351
    } catch (InvalidSystemMetadata e) {
352
      e.printStackTrace();
353
      fail("Unexpected error: " + e.getMessage());
354

    
355
    } catch (NotImplemented e) {
356
      e.printStackTrace();
357
      fail("Unexpected error: " + e.getMessage());
358

    
359
    } catch (InvalidRequest e) {
360
      e.printStackTrace();
361
      fail("Unexpected error: " + e.getMessage());
362

    
363
    } catch (Exception e) {
364
      e.printStackTrace();
365
      fail("Unexpected error: " + e.getMessage());
366

    
367
    }
368
      
369
  }
370

    
371
  /**
372
   * test object deletion
373
   */
374
  public void testDelete() {
375
    printTestHeader("testDelete");
376

    
377
    try {
378
      Session session = getTestSession();
379
      Identifier guid = new Identifier();
380
      guid.setValue("testDelete." + System.currentTimeMillis());
381
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
382
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
383
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
384
      
385
      // use MN admin to delete
386
      session = getMNSession();
387
      Identifier deletedPid = MNodeService.getInstance(request).delete(session, pid);
388
      assertEquals(pid.getValue(), deletedPid.getValue());
389
      // check that we cannot get the object
390
      session = getTestSession();
391
      InputStream deletedObject = null;
392
      try {
393
    	  deletedObject = MNodeService.getInstance(request).get(session, deletedPid);
394
      } catch (NotFound nf) {
395
    	  // this is expected
396
      }
397
	  assertNull(deletedObject);
398
      
399
    } catch (UnsupportedEncodingException e) {
400
      e.printStackTrace();
401
      
402
    } catch (Exception e) {
403
      e.printStackTrace();
404
      fail("Unexpected error: " + e.getMessage());
405

    
406
    } 
407

    
408
  }
409

    
410
  /**
411
   * Test object updating
412
   */
413
  public void testUpdate() {
414
    printTestHeader("testUpdate");
415
    
416
    try {
417
      Session session = getTestSession();
418
      Identifier guid = new Identifier();
419
      guid.setValue("testUpdate." + System.currentTimeMillis());
420
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
421
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
422
      Identifier newPid = new Identifier();
423
      newPid.setValue("testUpdate." + (System.currentTimeMillis() + 1)); // ensure it is different from original
424
      Identifier pid = 
425
        MNodeService.getInstance(request).create(session, guid, object, sysmeta);
426
      
427
      SystemMetadata newSysMeta = createSystemMetadata(newPid, session.getSubject(), object);
428
            
429
      // do the update
430
      Identifier updatedPid = 
431
        MNodeService.getInstance(request).update(session, pid, object, newPid, newSysMeta);
432
      
433
      // get the updated system metadata
434
      SystemMetadata updatedSysMeta = 
435
        MNodeService.getInstance(request).getSystemMetadata(session, updatedPid);
436

    
437
      assertEquals(updatedPid.getValue(), newPid.getValue());
438
//      assertTrue(updatedSysMeta.getObsolete(0).getValue().equals(pid.getValue()));
439
//      assertTrue(updatedSysMeta.getDerivedFrom(0).getValue().equals(pid.getValue()));        
440
      
441
    } catch (UnsupportedEncodingException e) {
442
      e.printStackTrace();
443
      fail("Unexpected error: " + e.getMessage());
444

    
445
    } catch (InvalidToken e) {
446
      e.printStackTrace();
447
      fail("Unexpected error: " + e.getMessage());
448

    
449
    } catch (ServiceFailure e) {
450
      e.printStackTrace();
451
      fail("Unexpected error: " + e.getMessage());
452

    
453
    } catch (NotAuthorized e) {
454
      e.printStackTrace();
455
      fail("Unexpected error: " + e.getMessage());
456

    
457
    } catch (IdentifierNotUnique e) {
458
      e.printStackTrace();
459
      fail("Unexpected error: " + e.getMessage());
460

    
461
    } catch (UnsupportedType e) {
462
      e.printStackTrace();
463
      fail("Unexpected error: " + e.getMessage());
464

    
465
    } catch (InsufficientResources e) {
466
      e.printStackTrace();
467
      fail("Unexpected error: " + e.getMessage());
468

    
469
    } catch (InvalidSystemMetadata e) {
470
      e.printStackTrace();
471
      fail("Unexpected error: " + e.getMessage());
472

    
473
    } catch (NotImplemented e) {
474
      e.printStackTrace();
475
      fail("Unexpected error: " + e.getMessage());
476

    
477
    } catch (InvalidRequest e) {
478
      e.printStackTrace();
479
      fail("Unexpected error: " + e.getMessage());
480

    
481
    } catch (Exception e) {
482
      e.printStackTrace();
483
      fail("Unexpected error: " + e.getMessage());
484

    
485
    }
486
  }
487

    
488
  /**
489
   * We currently expect this unit test to fail because it should rely on a different member node
490
   * to retrieve the object from. Currently it gets the object from itself and throws 
491
   * and expected error for duplicate entry.
492
   * 
493
   */
494
  public void testReplicate() {
495
      printTestHeader("testReplicate");
496
      try {
497
        Session session = getTestSession();
498
        Identifier guid = new Identifier();
499
        guid.setValue("testReplicate." + System.currentTimeMillis());
500
        InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
501
        SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
502
        // save locally
503
        Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
504
        // get our node reference (attempting to replicate with self)
505
        NodeReference sourceNode = MNodeService.getInstance(request).getCapabilities().getIdentifier();
506
        // attempt to replicate with ourselves -- this should fail!
507
      boolean result = false;
508
      try {
509
        result = MNodeService.getInstance(request).replicate(session, sysmeta, sourceNode);
510
      } catch (Exception inu) {
511
        // we are expecting this to fail since we already have the doc
512
        result = true;
513
      }
514
      assertTrue(result);
515
      } catch (Exception e) {
516
        e.printStackTrace();
517
      fail("Probably not yet implemented: " + e.getMessage());
518
    }
519
  }
520

    
521
  /**
522
   * Test describing an object
523
   */
524
  public void testDescribe() {
525
    printTestHeader("testDescribe");
526

    
527
    try {
528
      Session session = getTestSession();
529
      Identifier guid = new Identifier();
530
      guid.setValue("testGetSystemMetadata." + System.currentTimeMillis());
531
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
532
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
533
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
534
      DescribeResponse describeResponse = MNodeService.getInstance(request).describe(session, pid);
535
      assertEquals(describeResponse.getDataONE_Checksum().getValue(), sysmeta.getChecksum().getValue());
536
      assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), sysmeta.getFormatId().getValue());
537
      
538
    } catch (UnsupportedEncodingException e) {
539
      e.printStackTrace();
540
      fail("Unexpected error: " + e.getMessage());
541

    
542
    } catch (InvalidToken e) {
543
      e.printStackTrace();      
544
      fail("Unexpected error: " + e.getMessage());
545

    
546
    } catch (ServiceFailure e) {
547
      e.printStackTrace();
548
      fail("Unexpected error: " + e.getMessage());
549

    
550
    } catch (NotAuthorized e) {
551
      e.printStackTrace();
552
      fail("Unexpected error: " + e.getMessage());
553

    
554
    } catch (IdentifierNotUnique e) {
555
      e.printStackTrace();
556
      fail("Unexpected error: " + e.getMessage());
557
      
558
    } catch (UnsupportedType e) {
559
      e.printStackTrace();
560
      fail("Unexpected error: " + e.getMessage());
561

    
562
    } catch (InsufficientResources e) {
563
      e.printStackTrace();
564
      fail("Unexpected error: " + e.getMessage());
565

    
566
    } catch (InvalidSystemMetadata e) {
567
      e.printStackTrace();
568
      fail("Unexpected error: " + e.getMessage());
569

    
570
    } catch (NotImplemented e) {
571
      e.printStackTrace();
572
      fail("Unexpected error: " + e.getMessage());
573

    
574
    } catch (InvalidRequest e) {
575
      e.printStackTrace();
576
      fail("Unexpected error: " + e.getMessage());
577

    
578
    } catch (NotFound e) {
579
      e.printStackTrace();
580
      fail("Unexpected error: " + e.getMessage());
581

    
582
    } catch (Exception e) {
583
      e.printStackTrace();
584
      fail("Unexpected error: " + e.getMessage());
585

    
586
    }
587
  }
588

    
589
  /**
590
   * Test getting the checksum of an object
591
   */
592
  public void testGetChecksum() {
593
    printTestHeader("testGetChecksum");
594

    
595
    try {
596
      Session session = getTestSession();
597
      Identifier guid = new Identifier();
598
      guid.setValue("testGetChecksum." + System.currentTimeMillis());
599
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
600
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
601
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
602
      Checksum checksum = MNodeService.getInstance(request).getChecksum(session, pid, "MD5");
603
      assertEquals(checksum.getValue(), sysmeta.getChecksum().getValue());
604
    
605
    } catch (UnsupportedEncodingException e) {
606
      e.printStackTrace();
607
      fail("Unexpected error: " + e.getMessage());
608

    
609
    } catch (InvalidToken e) {
610
      e.printStackTrace();
611
      fail("Unexpected error: " + e.getMessage());
612

    
613
    } catch (ServiceFailure e) {
614
      e.printStackTrace();
615
      fail("Unexpected error: " + e.getMessage());
616

    
617
    } catch (NotAuthorized e) {
618
      e.printStackTrace();
619
      fail("Unexpected error: " + e.getMessage());
620

    
621
    } catch (IdentifierNotUnique e) {
622
      e.printStackTrace();
623
      fail("Unexpected error: " + e.getMessage());
624

    
625
    } catch (UnsupportedType e) {
626
      e.printStackTrace();
627
      fail("Unexpected error: " + e.getMessage());
628

    
629
    } catch (InsufficientResources e) {
630
      e.printStackTrace();
631
      fail("Unexpected error: " + e.getMessage());
632

    
633
    } catch (InvalidSystemMetadata e) {
634
      e.printStackTrace();
635
      fail("Unexpected error: " + e.getMessage());
636

    
637
    } catch (NotImplemented e) {
638
      e.printStackTrace();
639
      fail("Unexpected error: " + e.getMessage());
640

    
641
    } catch (InvalidRequest e) {
642
      e.printStackTrace();
643
      fail("Unexpected error: " + e.getMessage());
644

    
645
    } catch (NotFound e) {
646
      e.printStackTrace();
647
      fail("Unexpected error: " + e.getMessage());
648

    
649
    } catch (Exception e) {
650
      e.printStackTrace();
651
      fail("Unexpected error: " + e.getMessage());
652

    
653
    }
654
    
655
  }
656

    
657
  /**
658
   * Testing listing objects on the Member Node
659
   */
660
  public void testListObjects() {
661
      printTestHeader("testListObjects");
662
  
663
      try {
664
  
665
        Session session = getTestSession();
666
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
667
        Date startTime = sdf.parse("2010-01-01");
668
        Date endTime = new Date();
669
        ObjectFormatIdentifier objectFormatId = null;
670
        boolean replicaStatus = false;
671
        int start = 0;
672
        int count = 1;
673
      
674
        // insert at least one object 
675
        testCreate();
676
        // now check that we have at least one
677
        ObjectList objectList = 
678
          MNodeService.getInstance(request).listObjects(session, startTime, endTime, 
679
              objectFormatId, replicaStatus, start, count);
680
        assertNotNull(objectList);
681
        assertTrue(objectList.getCount() == count);
682
        assertTrue(objectList.getStart() == 0);
683
        assertTrue(objectList.getTotal() > 1);
684
        
685
      } catch (Exception e) {
686
        e.printStackTrace();
687
        fail("Unexpected error: " + e.getMessage());
688
  
689
      }
690
  }
691

    
692
  public void testGetCapabilities() {
693
      printTestHeader("testGetCapabilities");
694
    try {
695
      Node node = MNodeService.getInstance(request).getCapabilities();
696
      ByteArrayOutputStream baos = new ByteArrayOutputStream();
697
      TypeMarshaller.marshalTypeToOutputStream(node, baos);
698
      assertNotNull(node);
699
      // TODO: should probably test other parts of the node information
700
      
701
    } catch (JiBXException e) {
702
        e.printStackTrace();
703
        fail("The node instance couldn't be parsed correctly:" + e.getMessage());
704
        
705
    } catch (IOException e) {
706
        e.printStackTrace();
707
        fail("The node instance couldn't be read correctly:" + e.getMessage());
708
        
709
    } catch (Exception e) {
710
        e.printStackTrace();
711
        fail("Probably not yet implemented: " + e.getMessage());
712
        
713
    }
714
    
715
  }
716

    
717
  public void testGetOperationStatistics() {
718
      printTestHeader("testGetOperationStatistics");
719
    try {
720
      Session session = getCNSession();
721
      SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
722
        Date startTime = sdf.parse("2010-01-01");
723
        Date endTime = new Date();
724
      MonitorList monitorList = 
725
        MNodeService.getInstance(request).getOperationStatistics(
726
            session, 
727
            startTime, 
728
            endTime, 
729
            session.getSubject(), 
730
            Event.CREATE, 
731
            null //formatId
732
            );
733
      
734
      assertNotNull(monitorList);
735
      // TODO: should probably test other parts of the information
736
    } catch (Exception e) {
737
      e.printStackTrace();
738
      fail("Probably not yet implemented: " + e.getMessage());
739
    }
740
  }
741

    
742
  public void testPing() {
743

    
744
    try {
745
      Date mnDate = MNodeService.getInstance(request).ping();
746
      assertTrue(mnDate != null);
747
      
748
    } catch (NotImplemented e) {
749
      e.printStackTrace();
750
      fail("Unexpected error: " + e.getMessage());
751

    
752
    } catch (ServiceFailure e) {
753
      e.printStackTrace();
754
      fail("Unexpected error: " + e.getMessage());
755

    
756
    }  catch (InsufficientResources e) {
757
      e.printStackTrace();
758
      fail("Unexpected error: " + e.getMessage());
759

    
760
    }
761
    
762
  }
763

    
764
  public void testSynchronizationFailed() {
765
    printTestHeader("testSynchronizationFailed");
766
    try {
767
        Session session = getTestSession();
768
        
769
        // create the object
770
        Identifier pid = new Identifier();
771
        pid.setValue("testSynchronizationFailed." + System.currentTimeMillis());
772
        InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
773
        SystemMetadata sysmeta = createSystemMetadata(pid, session.getSubject(), object);
774
        Identifier retPid = MNodeService.getInstance(request).create(session, pid, object, sysmeta);
775
        assertEquals(retPid.getValue(), pid.getValue());
776
        
777
        // pretend the sync failed, act as CN
778
      SynchronizationFailed syncFailed = 
779
        new SynchronizationFailed("0000", "Testing Synch Failure");
780
      syncFailed.setPid(pid.getValue());
781
      session = getCNSession();
782
      MNodeService.getInstance(request).synchronizationFailed(session, syncFailed );
783
    } catch (Exception e) {
784
      e.printStackTrace();
785
        fail("Unexpected error: " + e.getMessage());
786
    }
787

    
788
  }
789

    
790
  public void testSystemMetadataChanged() {
791
      printTestHeader("testSystemMetadataChanged");
792
      try {
793
          Session session = getTestSession();
794
          
795
          // create the object
796
          Identifier pid = new Identifier();
797
          pid.setValue("testSystemMetadataChanged." + System.currentTimeMillis());
798
          InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
799
          SystemMetadata sysmeta = createSystemMetadata(pid, session.getSubject(), object);
800
          Identifier retPid = MNodeService.getInstance(request).create(session, pid, object, sysmeta);
801
          assertEquals(retPid.getValue(), pid.getValue());
802
          
803
          // pretend the system metadata changed on the CN
804
          MNodeService.getInstance(request).systemMetadataChanged(session, 
805
                  retPid, 5000L, Calendar.getInstance().getTime());
806
          
807
      } catch (Exception e) {
808
          if (e instanceof NotAuthorized) {
809
              // only CN subjects can call this
810
              // TODO: use a CN certificate in the tests
811
          } else {
812
              fail("Unexpected error: " + e.getMessage());
813
              
814
          }
815
      }
816

    
817
    }
818

    
819
  public void testGetLogRecords() {
820
    printTestHeader("testLogRecords");
821

    
822
    try {
823
	    Log log = null;
824
	    Session session = getCNSession();
825
	    Date fromDate = new Date();
826
	    Calendar calendar = Calendar.getInstance();
827
	    calendar.setTime(fromDate);
828
	    calendar.roll(Calendar.YEAR, false);
829
	    fromDate = calendar.getTime();
830
	    Date toDate = new Date();
831
	    Event event = Event.CREATE;
832
	    int start = 0;
833
	    int count = 1;
834
    
835
      log = MNodeService.getInstance(request).getLogRecords(session, fromDate, toDate, 
836
        event, null, start, count);
837
      
838
      assertNotNull(log);      
839
      assertTrue(log.getCount() == count);
840
      assertTrue(log.getStart() == start);
841
      assertTrue(log.getTotal() >= 1);
842
        
843
    } catch (Exception e) {
844
      e.printStackTrace();
845
      fail("Unexpected error: " + e.getMessage());
846

    
847
    }
848
  }
849

    
850
  /**
851
   * Testing setting access on a known object
852
   */
853
  public void testSetAccessPolicy() {
854
    printTestHeader("testSetAccess");
855
    
856
    //boolean accessWasSet = false;
857
    //
858
    //try {
859
    //  // create an object to set access on
860
    //  Session session = getTestSession();
861
    //  Identifier guid = new Identifier();
862
    //  guid.setValue("testSetAccess." + System.currentTimeMillis());
863
    //  InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
864
    //  SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
865
    //  Identifier pid = 
866
    //    MNodeService.getInstance(request).create(session, guid, object, sysmeta);
867
    //  // set the access
868
    //  AccessPolicy accessPolicy = new AccessPolicy();
869
    //  AccessRule allow = new AccessRule();
870
    //  allow.addPermission(Permission.WRITE);
871
    //  Subject publicSubject = new Subject();
872
    //  publicSubject.setValue(Constants.SUBJECT_PUBLIC);
873
    //  allow.addSubject(publicSubject);
874
    //  accessPolicy.addAllow(allow);
875
    //  
876
    //  accessWasSet = 
877
    //    MNodeService.getInstance(request).setAccessPolicy(session, pid, accessPolicy);
878
    //  assertTrue(accessWasSet);
879
    //  // test that it is enforced
880
    //  session.setSubject(publicSubject);
881
    //  boolean isAuthorized = MNodeService.getInstance(request).isAuthorized(session, pid, Permission.WRITE);
882
    //  assertTrue(isAuthorized);
883
    //
884
    //} catch (UnsupportedEncodingException e) {
885
    //  e.printStackTrace();
886
    //  
887
    //} catch (InvalidToken e) {
888
    //  e.printStackTrace();
889
    //  fail("Unexpected error: " + e.getMessage());
890
    //  
891
    //} catch (ServiceFailure e) {
892
    //  e.printStackTrace();
893
    //  fail("Unexpected error: " + e.getMessage());
894
    //  
895
    //} catch (NotAuthorized e) {
896
    //  e.printStackTrace();
897
    //  fail("Unexpected error: " + e.getMessage());
898
    //  
899
    //} catch (IdentifierNotUnique e) {
900
    //  e.printStackTrace();
901
    //  fail("Unexpected error: " + e.getMessage());
902
    //  
903
    //} catch (UnsupportedType e) {
904
    //  e.printStackTrace();
905
    //  fail("Unexpected error: " + e.getMessage());
906
    //  
907
    //} catch (InsufficientResources e) {
908
    //  e.printStackTrace();
909
    //  fail("Unexpected error: " + e.getMessage());
910
    //  
911
    //} catch (InvalidSystemMetadata e) {
912
    //  e.printStackTrace();
913
    //  fail("Unexpected error: " + e.getMessage());
914
    //  
915
    //} catch (NotImplemented e) {
916
    //  e.printStackTrace();
917
    //  fail("Unexpected error: " + e.getMessage());
918
    //  
919
    //} catch (InvalidRequest e) {
920
    //  e.printStackTrace();
921
    //  fail("Unexpected error: " + e.getMessage());
922
    //  
923
    //} catch (NotFound e) {
924
    //  e.printStackTrace();
925
    //  fail("Unexpected error: " + e.getMessage());
926
    //  
927
    //} catch (Exception e) {
928
    //  e.printStackTrace();
929
    //  fail("Unexpected error: " + e.getMessage());
930
    //  
931
    //}
932
      
933
  }
934

    
935
  /**
936
   * Test if a subject is authorized to read a known object
937
   */
938
  public void testIsAuthorized() {
939
    printTestHeader("testIsAuthorized");
940
    
941
    try {
942
      Session session = getTestSession();
943
      Identifier guid = new Identifier();
944
      guid.setValue("testIsAuthorized." + System.currentTimeMillis());
945
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
946
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
947
      Identifier pid = 
948
        MNodeService.getInstance(request).create(session, guid, object, sysmeta);
949
      boolean isAuthorized = 
950
        MNodeService.getInstance(request).isAuthorized(session, pid, Permission.READ);
951
      assertEquals(isAuthorized, true);
952
      
953
    } catch (UnsupportedEncodingException e) {
954
      e.printStackTrace();
955
      fail("Unexpected error: " + e.getMessage());
956

    
957
    } catch (InvalidToken e) {
958
      e.printStackTrace();
959
      fail("Unexpected error: " + e.getMessage());
960

    
961
    } catch (ServiceFailure e) {
962
      e.printStackTrace();
963
      fail("Unexpected error: " + e.getMessage());
964

    
965
    } catch (NotAuthorized e) {
966
      e.printStackTrace();
967
      fail("Unexpected error: " + e.getMessage());
968

    
969
    } catch (IdentifierNotUnique e) {
970
      e.printStackTrace();
971
      fail("Unexpected error: " + e.getMessage());
972

    
973
    } catch (UnsupportedType e) {
974
      e.printStackTrace();
975
      fail("Unexpected error: " + e.getMessage());
976

    
977
    } catch (InsufficientResources e) {
978
      e.printStackTrace();
979
      fail("Unexpected error: " + e.getMessage());
980

    
981
    } catch (InvalidSystemMetadata e) {
982
      e.printStackTrace();
983
      fail("Unexpected error: " + e.getMessage());
984

    
985
    } catch (NotImplemented e) {
986
      e.printStackTrace();
987
      fail("Unexpected error: " + e.getMessage());
988

    
989
    } catch (InvalidRequest e) {
990
      e.printStackTrace();
991
      fail("Unexpected error: " + e.getMessage());
992

    
993
    } catch (Exception e) {
994
      e.printStackTrace();
995
      fail("Unexpected error: " + e.getMessage());
996

    
997
    }
998
  }
999

    
1000
  
1001
  public void testIsEquivIdentityAuthorized() {
1002
      printTestHeader("testIsEquivIdentityAuthorized");
1003

    
1004
      try {
1005
          Session session = new Session();
1006
          Subject s = new Subject();
1007
          s.setValue("cn=test,dc=dataone,dc=org");
1008
          session.setSubject(s);
1009
          
1010
          Identifier pid = new Identifier();
1011
          pid.setValue("testIsEquivIdentityAuthorized." + System.currentTimeMillis());
1012
          InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1013
          SystemMetadata sysmeta = createSystemMetadata(pid, session.getSubject(), object);
1014
          
1015
          // reset the access policy to only allow 'self' read (no public)
1016
          AccessPolicy ap = new AccessPolicy();
1017
          AccessRule ar = new AccessRule();
1018
          List<Subject> sList = new ArrayList<Subject>();
1019
          sList.add(session.getSubject());
1020
          ar.setSubjectList(sList);
1021
          List<Permission> permList = new ArrayList<Permission>();
1022
          permList.add(Permission.CHANGE_PERMISSION);
1023
          ar.setPermissionList(permList);
1024
          ap.addAllow(ar);
1025
          sysmeta.setAccessPolicy(ap);
1026
          
1027
          // save it
1028
          Identifier retPid = CNodeService.getInstance(request).registerSystemMetadata(session, pid, sysmeta);
1029
          assertEquals(pid.getValue(), retPid.getValue());
1030
          
1031
          //check it against an equivalent identity not listed in the access policy
1032
          session.getSubject().setValue("cn=newSubject,dc=dataone,dc=org");
1033
          SubjectInfo subjectInfo = new SubjectInfo();
1034
          Person person = new Person();
1035
          person.setSubject(session.getSubject());
1036
          List<String> givenNames = new ArrayList<String>();
1037
          givenNames.add("New");
1038
          person.setGivenNameList(givenNames);
1039
          person.setFamilyName("Subject");
1040
          
1041
          // add equivalent identities
1042
          List<Subject> equivIdentities = new ArrayList<Subject>();
1043
          Subject mappedSubject2 = new Subject();
1044
          mappedSubject2.setValue("cn=test2,dc=dataone,dc=org");
1045
          equivIdentities.add(mappedSubject2);
1046
          
1047
          Subject mappedSubject = new Subject();
1048
          mappedSubject.setValue("cn=test,dc=dataone,dc=org");
1049
          equivIdentities.add(mappedSubject);          
1050
          
1051
          person.setEquivalentIdentityList(equivIdentities);
1052
          
1053
          List<Person> personList = new ArrayList<Person>();
1054
          personList.add(person);
1055
          subjectInfo.setPersonList(personList);
1056
          
1057
          // update the session to include subject info with a mapped identity
1058
          session.setSubjectInfo(subjectInfo);
1059
          boolean result = CNodeService.getInstance(request).isAuthorized(session, pid, Permission.READ);
1060
          assertTrue(result);
1061
        
1062
    } catch (Exception e) {
1063
        e.printStackTrace();
1064
        
1065
    }
1066
    
1067
  }
1068
  
1069
  
1070
  
1071
  
1072
}
(3-3/5)