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
//    suite.addTest(new MNodeServiceTest("testDelete"));
119
//    // MNRead tests
120
//    suite.addTest(new MNodeServiceTest("testGet"));
121
//    suite.addTest(new MNodeServiceTest("testGetChecksum"));
122
//    suite.addTest(new MNodeServiceTest("testGetSystemMetadata"));
123
//    suite.addTest(new MNodeServiceTest("testDescribe"));
124
//    suite.addTest(new MNodeServiceTest("testListObjects"));
125
//    suite.addTest(new MNodeServiceTest("testSynchronizationFailed"));
126
//    // MNCore tests
127
//    suite.addTest(new MNodeServiceTest("testPing"));
128
//    suite.addTest(new MNodeServiceTest("testGetLogRecords"));
129
//    suite.addTest(new MNodeServiceTest("testGetOperationStatistics"));
130
//    suite.addTest(new MNodeServiceTest("testGetCapabilities"));
131
//    // include these when they are part of the MN interface definitions
132
//    // suite.addTest(new MNodeServiceTest("testGetObjectStatistics"));
133
//    // suite.addTest(new MNodeServiceTest("testGetStatus"));
134
//    // MNAuthorization tests
135
//    suite.addTest(new MNodeServiceTest("testIsAuthorized"));
136
    suite.addTest(new MNodeServiceTest("testIsEquivIdentityAuthorized"));
137
//    suite.addTest(new MNodeServiceTest("testSetAccessPolicy"));
138
//    // MNreplication tests
139
//    suite.addTest(new MNodeServiceTest("testReplicate"));
140
    
141
    
142
    return suite;
143
    
144
  }
145
  
146
  /**
147
   * Constructor for the tests
148
   * 
149
   * @param name - the name of the test
150
   */
151
  public MNodeServiceTest(String name) {
152
    super(name);
153
    
154
  }
155

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

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

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

    
235
  }
236

    
237
  /**
238
   * Test getting the system metadata of an object
239
   */
240
  public void testGetSystemMetadata() {    
241
    printTestHeader("testGetSystemMetadata");
242

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

    
257
    } catch (InvalidToken e) {
258
      e.printStackTrace();      
259
      fail("Unexpected error: " + e.getMessage());
260

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

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

    
269
    } catch (IdentifierNotUnique e) {
270
      e.printStackTrace();
271
      fail("Unexpected error: " + e.getMessage());
272
      
273
    } catch (UnsupportedType e) {
274
      e.printStackTrace();
275
      fail("Unexpected error: " + e.getMessage());
276

    
277
    } catch (InsufficientResources e) {
278
      e.printStackTrace();
279
      fail("Unexpected error: " + e.getMessage());
280

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

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

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

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

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

    
301
    }
302
    
303
  }
304

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

    
323
    } catch (InvalidToken e) {
324
      e.printStackTrace();
325
      fail("Unexpected error: " + e.getMessage());
326

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

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

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

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

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

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

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

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

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

    
363
    }
364
      
365
  }
366

    
367
  /**
368
   * test object deletion
369
   */
370
  public void testDelete() {
371
    printTestHeader("testDelete");
372

    
373
    try {
374
      Session session = getTestSession();
375
      Identifier guid = new Identifier();
376
      guid.setValue("testDelete." + System.currentTimeMillis());
377
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
378
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
379
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
380
      Identifier deletedPid = MNodeService.getInstance(request).delete(session, pid);
381
      assertEquals(pid.getValue(), deletedPid.getValue());
382
      
383
    } catch (UnsupportedEncodingException e) {
384
      e.printStackTrace();
385
      
386
    } catch (Exception e) {
387
      e.printStackTrace();
388
      fail("Unexpected error: " + e.getMessage());
389

    
390
    } 
391

    
392
  }
393

    
394
  /**
395
   * Test object updating
396
   */
397
  public void testUpdate() {
398
    printTestHeader("testUpdate");
399
    
400
    try {
401
      Session session = getTestSession();
402
      Identifier guid = new Identifier();
403
      guid.setValue("testUpdate." + System.currentTimeMillis());
404
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
405
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
406
      Identifier newPid = new Identifier();
407
      newPid.setValue("testUpdate." + (System.currentTimeMillis() + 1)); // ensure it is different from original
408
      Identifier pid = 
409
        MNodeService.getInstance(request).create(session, guid, object, sysmeta);
410
      
411
      SystemMetadata newSysMeta = createSystemMetadata(newPid, session.getSubject(), object);
412
            
413
      // do the update
414
      Identifier updatedPid = 
415
        MNodeService.getInstance(request).update(session, pid, object, newPid, newSysMeta);
416
      
417
      // get the updated system metadata
418
      SystemMetadata updatedSysMeta = 
419
        MNodeService.getInstance(request).getSystemMetadata(session, updatedPid);
420

    
421
      assertEquals(updatedPid.getValue(), newPid.getValue());
422
//      assertTrue(updatedSysMeta.getObsolete(0).getValue().equals(pid.getValue()));
423
//      assertTrue(updatedSysMeta.getDerivedFrom(0).getValue().equals(pid.getValue()));        
424
      
425
    } catch (UnsupportedEncodingException e) {
426
      e.printStackTrace();
427
      fail("Unexpected error: " + e.getMessage());
428

    
429
    } catch (InvalidToken e) {
430
      e.printStackTrace();
431
      fail("Unexpected error: " + e.getMessage());
432

    
433
    } catch (ServiceFailure e) {
434
      e.printStackTrace();
435
      fail("Unexpected error: " + e.getMessage());
436

    
437
    } catch (NotAuthorized e) {
438
      e.printStackTrace();
439
      fail("Unexpected error: " + e.getMessage());
440

    
441
    } catch (IdentifierNotUnique e) {
442
      e.printStackTrace();
443
      fail("Unexpected error: " + e.getMessage());
444

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

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

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

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

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

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

    
469
    }
470
  }
471

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

    
505
  /**
506
   * Test describing an object
507
   */
508
  public void testDescribe() {
509
    printTestHeader("testDescribe");
510

    
511
    try {
512
      Session session = getTestSession();
513
      Identifier guid = new Identifier();
514
      guid.setValue("testGetSystemMetadata." + System.currentTimeMillis());
515
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
516
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
517
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
518
      DescribeResponse describeResponse = MNodeService.getInstance(request).describe(session, pid);
519
      assertEquals(describeResponse.getDataONE_Checksum().getValue(), sysmeta.getChecksum().getValue());
520
      assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), sysmeta.getFormatId().getValue());
521
      
522
    } catch (UnsupportedEncodingException e) {
523
      e.printStackTrace();
524
      fail("Unexpected error: " + e.getMessage());
525

    
526
    } catch (InvalidToken e) {
527
      e.printStackTrace();      
528
      fail("Unexpected error: " + e.getMessage());
529

    
530
    } catch (ServiceFailure e) {
531
      e.printStackTrace();
532
      fail("Unexpected error: " + e.getMessage());
533

    
534
    } catch (NotAuthorized e) {
535
      e.printStackTrace();
536
      fail("Unexpected error: " + e.getMessage());
537

    
538
    } catch (IdentifierNotUnique e) {
539
      e.printStackTrace();
540
      fail("Unexpected error: " + e.getMessage());
541
      
542
    } catch (UnsupportedType e) {
543
      e.printStackTrace();
544
      fail("Unexpected error: " + e.getMessage());
545

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

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

    
554
    } catch (NotImplemented e) {
555
      e.printStackTrace();
556
      fail("Unexpected error: " + e.getMessage());
557

    
558
    } catch (InvalidRequest e) {
559
      e.printStackTrace();
560
      fail("Unexpected error: " + e.getMessage());
561

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

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

    
570
    }
571
  }
572

    
573
  /**
574
   * Test getting the checksum of an object
575
   */
576
  public void testGetChecksum() {
577
    printTestHeader("testGetChecksum");
578

    
579
    try {
580
      Session session = getTestSession();
581
      Identifier guid = new Identifier();
582
      guid.setValue("testGetChecksum." + System.currentTimeMillis());
583
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
584
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
585
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
586
      Checksum checksum = MNodeService.getInstance(request).getChecksum(session, pid, "MD5");
587
      assertEquals(checksum.getValue(), sysmeta.getChecksum().getValue());
588
    
589
    } catch (UnsupportedEncodingException e) {
590
      e.printStackTrace();
591
      fail("Unexpected error: " + e.getMessage());
592

    
593
    } catch (InvalidToken e) {
594
      e.printStackTrace();
595
      fail("Unexpected error: " + e.getMessage());
596

    
597
    } catch (ServiceFailure e) {
598
      e.printStackTrace();
599
      fail("Unexpected error: " + e.getMessage());
600

    
601
    } catch (NotAuthorized e) {
602
      e.printStackTrace();
603
      fail("Unexpected error: " + e.getMessage());
604

    
605
    } catch (IdentifierNotUnique e) {
606
      e.printStackTrace();
607
      fail("Unexpected error: " + e.getMessage());
608

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

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

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

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

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

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

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

    
637
    }
638
    
639
  }
640

    
641
  /**
642
   * Testing listing objects on the Member Node
643
   */
644
  public void testListObjects() {
645
      printTestHeader("testListObjects");
646
  
647
      try {
648
  
649
        Session session = getTestSession();
650
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
651
        Date startTime = sdf.parse("2010-01-01");
652
        Date endTime = new Date();
653
        ObjectFormatIdentifier objectFormatId = null;
654
        boolean replicaStatus = false;
655
        int start = 0;
656
        int count = 1;
657
      
658
        // insert at least one object 
659
        testCreate();
660
        // now check that we have at least one
661
        ObjectList objectList = 
662
          MNodeService.getInstance(request).listObjects(session, startTime, endTime, 
663
              objectFormatId, replicaStatus, start, count);
664
        assertNotNull(objectList);
665
        assertTrue(objectList.getCount() == count);
666
        assertTrue(objectList.getStart() == 0);
667
        assertTrue(objectList.getTotal() > 1);
668
        
669
      } catch (Exception e) {
670
        e.printStackTrace();
671
        fail("Unexpected error: " + e.getMessage());
672
  
673
      }
674
  }
675

    
676
  public void testGetCapabilities() {
677
      printTestHeader("testGetCapabilities");
678
    try {
679
      Node node = MNodeService.getInstance(request).getCapabilities();
680
      ByteArrayOutputStream baos = new ByteArrayOutputStream();
681
      TypeMarshaller.marshalTypeToOutputStream(node, baos);
682
      assertNotNull(node);
683
      // TODO: should probably test other parts of the node information
684
      
685
    } catch (JiBXException e) {
686
        e.printStackTrace();
687
        fail("The node instance couldn't be parsed correctly:" + e.getMessage());
688
        
689
    } catch (IOException e) {
690
        e.printStackTrace();
691
        fail("The node instance couldn't be read correctly:" + e.getMessage());
692
        
693
    } catch (Exception e) {
694
        e.printStackTrace();
695
        fail("Probably not yet implemented: " + e.getMessage());
696
        
697
    }
698
    
699
  }
700

    
701
  public void testGetOperationStatistics() {
702
      printTestHeader("testGetOperationStatistics");
703
    try {
704
      Session session = getTestSession();
705
      SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
706
        Date startTime = sdf.parse("2010-01-01");
707
        Date endTime = new Date();
708
      MonitorList monitorList = 
709
        MNodeService.getInstance(request).getOperationStatistics(
710
            session, 
711
            startTime, 
712
            endTime, 
713
            session.getSubject(), 
714
            Event.CREATE, 
715
            null //formatId
716
            );
717
      
718
      assertNotNull(monitorList);
719
      // TODO: should probably test other parts of the information
720
    } catch (Exception e) {
721
      e.printStackTrace();
722
      fail("Probably not yet implemented: " + e.getMessage());
723
    }
724
  }
725

    
726
  public void testPing() {
727

    
728
    try {
729
      Date mnDate = MNodeService.getInstance(request).ping();
730
      assertTrue(mnDate != null);
731
      
732
    } catch (NotImplemented e) {
733
      e.printStackTrace();
734
      fail("Unexpected error: " + e.getMessage());
735

    
736
    } catch (ServiceFailure e) {
737
      e.printStackTrace();
738
      fail("Unexpected error: " + e.getMessage());
739

    
740
    }  catch (InsufficientResources e) {
741
      e.printStackTrace();
742
      fail("Unexpected error: " + e.getMessage());
743

    
744
    }
745
    
746
  }
747

    
748
  public void testSynchronizationFailed() {
749
    printTestHeader("testSynchronizationFailed");
750
    try {
751
        Session session = getTestSession();
752
        
753
        // create the object
754
        Identifier pid = new Identifier();
755
        pid.setValue("testSynchronizationFailed." + System.currentTimeMillis());
756
        InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
757
        SystemMetadata sysmeta = createSystemMetadata(pid, session.getSubject(), object);
758
        Identifier retPid = MNodeService.getInstance(request).create(session, pid, object, sysmeta);
759
        assertEquals(retPid.getValue(), pid.getValue());
760
        
761
        // pretend the sync failed
762
      SynchronizationFailed syncFailed = 
763
        new SynchronizationFailed("0000", "Testing Synch Failure");
764
      syncFailed.setPid(pid.getValue());
765
      MNodeService.getInstance(request).synchronizationFailed(session, syncFailed );
766
    } catch (Exception e) {
767
      e.printStackTrace();
768
        fail("Unexpected error: " + e.getMessage());
769
    }
770

    
771
  }
772

    
773
  public void testSystemMetadataChanged() {
774
      printTestHeader("testSystemMetadataChanged");
775
      try {
776
          Session session = getTestSession();
777
          
778
          // create the object
779
          Identifier pid = new Identifier();
780
          pid.setValue("testSystemMetadataChanged." + System.currentTimeMillis());
781
          InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
782
          SystemMetadata sysmeta = createSystemMetadata(pid, session.getSubject(), object);
783
          Identifier retPid = MNodeService.getInstance(request).create(session, pid, object, sysmeta);
784
          assertEquals(retPid.getValue(), pid.getValue());
785
          
786
          // pretend the system metadata changed on the CN
787
          MNodeService.getInstance(request).systemMetadataChanged(session, 
788
                  retPid, 5000L, Calendar.getInstance().getTime());
789
          
790
      } catch (Exception e) {
791
          if (e instanceof NotAuthorized) {
792
              // only CN subjects can call this
793
              // TODO: use a CN certificate in the tests
794
          } else {
795
              fail("Unexpected error: " + e.getMessage());
796
              
797
          }
798
      }
799

    
800
    }
801

    
802
  public void testGetLogRecords() {
803
    printTestHeader("testLogRecords");
804

    
805
    try {
806
	    Log log = null;
807
	    Session session = getTestSession();
808
	    Date fromDate = new Date();
809
	    Calendar calendar = Calendar.getInstance();
810
	    calendar.setTime(fromDate);
811
	    calendar.roll(Calendar.YEAR, false);
812
	    fromDate = calendar.getTime();
813
	    Date toDate = new Date();
814
	    Event event = Event.CREATE;
815
	    int start = 0;
816
	    int count = 1;
817
    
818
      log = MNodeService.getInstance(request).getLogRecords(session, fromDate, toDate, 
819
        event, null, start, count);
820
      
821
      assertNotNull(log);      
822
      assertTrue(log.getCount() == count);
823
      assertTrue(log.getStart() == start);
824
      assertTrue(log.getTotal() >= 1);
825
        
826
    } catch (Exception e) {
827
      e.printStackTrace();
828
      fail("Unexpected error: " + e.getMessage());
829

    
830
    }
831
  }
832

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

    
918
  /**
919
   * Test if a subject is authorized to read a known object
920
   */
921
  public void testIsAuthorized() {
922
    printTestHeader("testIsAuthorized");
923
    
924
    try {
925
      Session session = getTestSession();
926
      Identifier guid = new Identifier();
927
      guid.setValue("testIsAuthorized." + System.currentTimeMillis());
928
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
929
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
930
      Identifier pid = 
931
        MNodeService.getInstance(request).create(session, guid, object, sysmeta);
932
      boolean isAuthorized = 
933
        MNodeService.getInstance(request).isAuthorized(session, pid, Permission.READ);
934
      assertEquals(isAuthorized, true);
935
      
936
    } catch (UnsupportedEncodingException e) {
937
      e.printStackTrace();
938
      fail("Unexpected error: " + e.getMessage());
939

    
940
    } catch (InvalidToken e) {
941
      e.printStackTrace();
942
      fail("Unexpected error: " + e.getMessage());
943

    
944
    } catch (ServiceFailure e) {
945
      e.printStackTrace();
946
      fail("Unexpected error: " + e.getMessage());
947

    
948
    } catch (NotAuthorized e) {
949
      e.printStackTrace();
950
      fail("Unexpected error: " + e.getMessage());
951

    
952
    } catch (IdentifierNotUnique e) {
953
      e.printStackTrace();
954
      fail("Unexpected error: " + e.getMessage());
955

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

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

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

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

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

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

    
980
    }
981
  }
982

    
983
  
984
  public void testIsEquivIdentityAuthorized() {
985
      printTestHeader("testIsEquivIdentityAuthorized");
986

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