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

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

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

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

    
240
  }
241

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

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

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

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

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

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

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

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

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

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

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

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

    
306
    }
307
    
308
  }
309

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

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

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

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

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

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

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

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

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

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

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

    
368
    }
369
      
370
  }
371

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

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

    
407
    } 
408

    
409
  }
410

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

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

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

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

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

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

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

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

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

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

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

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

    
486
    }
487
  }
488

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

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

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

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

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

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

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

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

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

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

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

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

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

    
587
    }
588
  }
589

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

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

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

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

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

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

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

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

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

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

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

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

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

    
654
    }
655
    
656
  }
657

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

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

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

    
743
  public void testPing() {
744

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

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

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

    
761
    }
762
    
763
  }
764

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

    
789
  }
790

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

    
818
    }
819

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

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

    
848
    }
849
  }
850

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

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

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

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

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

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

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

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

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

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

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

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

    
998
    }
999
  }
1000

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

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

    
1070
/**
1071
   * Test object creation failure when there is a space in the identifier
1072
   */
1073
  public void testCreateInvalidIdentifier() {
1074
    printTestHeader("testCreateInvalidIdentifier");
1075
    
1076
    try {
1077
      Session session = getTestSession();
1078
      Identifier guid = new Identifier();
1079
      guid.setValue("testCreate withspace." + System.currentTimeMillis());
1080
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1081
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1082
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
1083
      fail("Should not be able to create with whitespace in indentifier");
1084
    } catch (InvalidRequest e) {
1085
    	// expect that this request fails
1086
        assertTrue(true);
1087
    } catch (Exception e) {
1088
      e.printStackTrace();
1089
      fail("Unexpected error: " + e.getMessage());
1090
    }
1091
      
1092
  }
1093
  
1094
  
1095
  
1096
  
1097
}
(3-3/6)