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

    
30

    
31
import edu.ucsb.nceas.metacat.dataone.MNodeService;
32
import gov.loc.repository.bagit.Bag;
33
import gov.loc.repository.bagit.BagFactory;
34
import gov.loc.repository.bagit.BagFile;
35
import gov.loc.repository.bagit.Manifest;
36

    
37
import java.io.ByteArrayInputStream;
38
import java.io.ByteArrayOutputStream;
39
import java.io.File;
40
import java.io.FileOutputStream;
41
import java.io.IOException;
42
import java.io.InputStream;
43
import java.io.UnsupportedEncodingException;
44
import java.text.SimpleDateFormat;
45
import java.util.ArrayList;
46
import java.util.Calendar;
47
import java.util.Date;
48
import java.util.HashMap;
49
import java.util.Iterator;
50
import java.util.List;
51
import java.util.Map;
52

    
53
import junit.framework.Test;
54
import junit.framework.TestSuite;
55

    
56
import org.apache.commons.io.FileUtils;
57
import org.apache.commons.io.IOUtils;
58
import org.dataone.client.v2.formats.ObjectFormatCache;
59
import org.dataone.configuration.Settings;
60
import org.dataone.ore.ResourceMapFactory;
61
import org.dataone.service.util.TypeMarshaller;
62
import org.dataone.service.exceptions.IdentifierNotUnique;
63
import org.dataone.service.exceptions.InsufficientResources;
64
import org.dataone.service.exceptions.InvalidRequest;
65
import org.dataone.service.exceptions.InvalidSystemMetadata;
66
import org.dataone.service.exceptions.InvalidToken;
67
import org.dataone.service.exceptions.NotAuthorized;
68
import org.dataone.service.exceptions.NotFound;
69
import org.dataone.service.exceptions.NotImplemented;
70
import org.dataone.service.exceptions.ServiceFailure;
71
import org.dataone.service.exceptions.SynchronizationFailed;
72
import org.dataone.service.exceptions.UnsupportedType;
73
import org.dataone.service.types.v1.AccessPolicy;
74
import org.dataone.service.types.v1.AccessRule;
75
import org.dataone.service.types.v1.Checksum;
76
import org.dataone.service.types.v1.DescribeResponse;
77
import org.dataone.service.types.v1.Event;
78
import org.dataone.service.types.v1.Identifier;
79
import org.dataone.service.types.v2.Log;
80
import org.dataone.service.types.v2.Node;
81
import org.dataone.service.types.v1.NodeReference;
82
import org.dataone.service.types.v1.ObjectFormatIdentifier;
83
import org.dataone.service.types.v1.ObjectList;
84
import org.dataone.service.types.v1.Permission;
85
import org.dataone.service.types.v1.Person;
86
import org.dataone.service.types.v1.Session;
87
import org.dataone.service.types.v1.Subject;
88
import org.dataone.service.types.v1.SubjectInfo;
89
import org.dataone.service.types.v1.util.ChecksumUtil;
90
import org.dataone.service.types.v2.SystemMetadata;
91
import org.dspace.foresite.ResourceMap;
92
import org.jibx.runtime.JiBXException;
93
import org.junit.After;
94
import org.junit.Before;
95

    
96
/**
97
 * A JUnit test to exercise the Metacat Member Node service implementation.
98
 * This also tests a few of the D1NodeService superclass methods
99
 * 
100
 * @author cjones
101
 *
102
 */
103
public class MNodeServiceTest extends D1NodeServiceTest {
104

    
105
    private static String unmatchingEncodingFilePath = "test/incorrect-encoding-declaration.xml";
106
  /**
107
   * Set up the test fixtures
108
   * 
109
   * @throws Exception
110
   */
111
  @Before
112
  public void setUp() throws Exception {
113
    super.setUp();
114
    // set up the configuration for d1client
115
    Settings.getConfiguration().setProperty("D1Client.cnClassName", MockCNode.class.getName());
116
  }
117

    
118
  /**
119
   * Remove the test fixtures
120
   */
121
  @After
122
  public void tearDown() {
123
  }
124
  
125
  /**
126
   * Build the test suite
127
   * @return
128
   */
129
  public static Test suite() {
130
    
131
    TestSuite suite = new TestSuite();
132
    suite.addTest(new MNodeServiceTest("initialize"));
133
    // MNStorage tests
134
    suite.addTest(new MNodeServiceTest("testCreate"));
135
    suite.addTest(new MNodeServiceTest("testCreateInvalidIdentifier"));
136
    suite.addTest(new MNodeServiceTest("testUpdate"));
137
    // this requires MN certificate
138
    suite.addTest(new MNodeServiceTest("testDelete"));
139
    
140
    // MNRead tests
141
    suite.addTest(new MNodeServiceTest("testGet"));
142
    suite.addTest(new MNodeServiceTest("testGetChecksum"));
143
    suite.addTest(new MNodeServiceTest("testGetSystemMetadata"));
144
    suite.addTest(new MNodeServiceTest("testDescribe"));
145
    suite.addTest(new MNodeServiceTest("testListObjects"));
146
    // this requires CN certificate
147
    suite.addTest(new MNodeServiceTest("testSynchronizationFailed"));
148
    
149
    // MNCore tests
150
    suite.addTest(new MNodeServiceTest("testPing"));
151
    suite.addTest(new MNodeServiceTest("testGetLogRecords"));
152
    suite.addTest(new MNodeServiceTest("testGetCapabilities"));
153
    
154
    // MNAuthorization tests
155
    suite.addTest(new MNodeServiceTest("testIsAuthorized"));
156
    suite.addTest(new MNodeServiceTest("testIsEquivIdentityAuthorized"));
157
    suite.addTest(new MNodeServiceTest("testSetAccessPolicy"));
158
    // MNreplication tests
159
    suite.addTest(new MNodeServiceTest("testReplicate"));
160
    // MN packaging tests
161
    suite.addTest(new MNodeServiceTest("testGetPackage"));
162
    suite.addTest(new MNodeServiceTest("testGetOREPackage"));
163
    suite.addTest(new MNodeServiceTest("testReadDeletedObject"));
164
    suite.addTest(new MNodeServiceTest("testCreateAndUpdateXMLWithUnmatchingEncoding"));
165
    suite.addTest(new MNodeServiceTest("testGetSID"));
166
    return suite;
167
    
168
  }
169
  
170
  /**
171
   * Constructor for the tests
172
   * 
173
   * @param name - the name of the test
174
   */
175
  public MNodeServiceTest(String name) {
176
    super(name);
177
    
178
  }
179

    
180
  /**
181
   * Initial blank test
182
   */
183
  public void initialize() {
184
    assertTrue(1 == 1);
185
    
186
  }
187
  
188
  /**
189
   * Test getting a known object
190
   */
191
  public void testGet() {
192
    printTestHeader("testGet");
193

    
194
    try {
195
      Session session = getTestSession();
196
      Identifier guid = new Identifier();
197
      guid.setValue("testGet." + System.currentTimeMillis());
198
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
199
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
200
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
201
      InputStream result = MNodeService.getInstance(request).get(session, guid);
202
      // go back to beginning of original stream
203
      object.reset();
204
      // check
205
      assertTrue(object.available() > 0);
206
      assertTrue(result.available() > 0);
207
      assertTrue(IOUtils.contentEquals(result, object));
208
      
209
    } catch (UnsupportedEncodingException e) {
210
      e.printStackTrace();
211
      fail("Unexpected error: " + e.getMessage());
212

    
213
    } catch (InvalidToken e) {
214
      e.printStackTrace();
215
      fail("Unexpected error: " + e.getMessage());
216
      
217
    } catch (ServiceFailure e) {
218
      e.printStackTrace();
219
      fail("Unexpected error: " + e.getMessage());
220
      
221
    } catch (NotAuthorized e) {
222
      e.printStackTrace();
223
      fail("Unexpected error: " + e.getMessage());
224
      
225
    } catch (IdentifierNotUnique e) {
226
      e.printStackTrace();
227
      fail("Unexpected error: " + e.getMessage());
228
      
229
    } catch (UnsupportedType e) {
230
      e.printStackTrace();
231
      fail("Unexpected error: " + e.getMessage());
232
      
233
    } catch (InsufficientResources e) {
234
      e.printStackTrace();
235
      fail("Unexpected error: " + e.getMessage());
236
      
237
    } catch (InvalidSystemMetadata e) {
238
      e.printStackTrace();
239
      fail("Unexpected error: " + e.getMessage());
240
      
241
    } catch (NotImplemented e) {
242
      e.printStackTrace();
243
      fail("Unexpected error: " + e.getMessage());
244
      
245
    } catch (InvalidRequest e) {
246
      e.printStackTrace();
247
      fail("Unexpected error: " + e.getMessage());
248
      
249
    } catch (NotFound e) {
250
      e.printStackTrace();
251
      fail("Unexpected error: " + e.getMessage());
252
      
253
    } catch (Exception e) {
254
      e.printStackTrace();
255
      fail("Unexpected error: " + e.getMessage());
256
      
257
    }
258

    
259
  }
260

    
261
  /**
262
   * Test getting the system metadata of an object
263
   */
264
  public void testGetSystemMetadata() {    
265
    printTestHeader("testGetSystemMetadata");
266

    
267
    try {
268
      Session session = getTestSession();
269
      Identifier guid = new Identifier();
270
      guid.setValue("testGetSystemMetadata." + System.currentTimeMillis());
271
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
272
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
273
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
274
      SystemMetadata newsysmeta = MNodeService.getInstance(request).getSystemMetadata(session, pid);
275
      assertEquals(newsysmeta.getIdentifier().getValue(), sysmeta.getIdentifier().getValue());
276
      assertEquals(newsysmeta.getSeriesId(), null);
277
      
278
    } catch (UnsupportedEncodingException e) {
279
      e.printStackTrace();
280
      fail("Unexpected error: " + e.getMessage());
281

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

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

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

    
294
    } catch (IdentifierNotUnique e) {
295
      e.printStackTrace();
296
      fail("Unexpected error: " + e.getMessage());
297
      
298
    } catch (UnsupportedType e) {
299
      e.printStackTrace();
300
      fail("Unexpected error: " + e.getMessage());
301

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

    
306
    } catch (InvalidSystemMetadata e) {
307
      e.printStackTrace();
308
      fail("Unexpected error: " + e.getMessage());
309

    
310
    } catch (NotImplemented e) {
311
      e.printStackTrace();
312
      fail("Unexpected error: " + e.getMessage());
313

    
314
    } catch (InvalidRequest e) {
315
      e.printStackTrace();
316
      fail("Unexpected error: " + e.getMessage());
317

    
318
    } catch (NotFound e) {
319
      e.printStackTrace();
320
      fail("Unexpected error: " + e.getMessage());
321

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

    
326
    }
327
    
328
  }
329

    
330
  /**
331
   * Test object creation
332
   */
333
  public void testCreate() {
334
    printTestHeader("testCreate");
335
    
336
    try {
337
      Session session = getTestSession();
338
      Identifier guid = new Identifier();
339
      guid.setValue("testCreate." + System.currentTimeMillis());
340
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
341
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
342
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
343
      assertEquals(guid.getValue(), pid.getValue());
344
      
345
      Thread.sleep(1000);
346
      try {
347
          Identifier guid2 = new Identifier();
348
          guid2.setValue("testCreate." + System.currentTimeMillis());
349
          SystemMetadata sysmeta2 = createSystemMetadata(guid2, session.getSubject(), object);
350
          sysmeta2.setSeriesId(guid);
351
          MNodeService.getInstance(request).create(session, guid2, object, sysmeta2);
352
          fail("It should fail since the system metadata using an existing id as the sid");
353
      } catch (InvalidSystemMetadata ee) {
354
          
355
      }
356
      
357
      Thread.sleep(1000);
358
      try {
359
          Identifier guid3 = new Identifier();
360
          guid3.setValue("testCreate." + System.currentTimeMillis());
361
          SystemMetadata sysmeta3 = createSystemMetadata(guid3, session.getSubject(), object);
362
          sysmeta3.setSeriesId(guid3);
363
          MNodeService.getInstance(request).create(session, guid3, object, sysmeta3);
364
          fail("It should fail since the system metadata using the pid as the sid");
365
      } catch (InvalidSystemMetadata ee) {
366
          
367
      }
368
    } catch (UnsupportedEncodingException e) {
369
      e.printStackTrace();
370
      fail("Unexpected error: " + e.getMessage());
371

    
372
    } catch (InvalidToken e) {
373
      e.printStackTrace();
374
      fail("Unexpected error: " + e.getMessage());
375

    
376
    } catch (ServiceFailure e) {
377
      e.printStackTrace();
378
      fail("Unexpected error: " + e.getMessage());
379

    
380
    } catch (NotAuthorized e) {
381
      e.printStackTrace();
382
      fail("Unexpected error: " + e.getMessage());
383

    
384
    } catch (IdentifierNotUnique e) {
385
      e.printStackTrace();
386
      fail("Unexpected error: " + e.getMessage());
387

    
388
    } catch (UnsupportedType e) {
389
      e.printStackTrace();
390
      fail("Unexpected error: " + e.getMessage());
391

    
392
    } catch (InsufficientResources e) {
393
      e.printStackTrace();
394
      fail("Unexpected error: " + e.getMessage());
395

    
396
    } catch (InvalidSystemMetadata e) {
397
      e.printStackTrace();
398
      fail("Unexpected error: " + e.getMessage());
399

    
400
    } catch (NotImplemented e) {
401
      e.printStackTrace();
402
      fail("Unexpected error: " + e.getMessage());
403

    
404
    } catch (InvalidRequest e) {
405
      e.printStackTrace();
406
      fail("Unexpected error: " + e.getMessage());
407

    
408
    } catch (Exception e) {
409
      e.printStackTrace();
410
      fail("Unexpected error: " + e.getMessage());
411

    
412
    }
413
      
414
  }
415

    
416
  /**
417
   * test object deletion
418
   */
419
  public void testDelete() {
420
    printTestHeader("testDelete");
421

    
422
    try {
423
      Session session = getTestSession();
424
      Identifier guid = new Identifier();
425
      guid.setValue("testDelete." + System.currentTimeMillis());
426
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
427
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
428
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
429
      
430
      // use MN admin to delete
431
      session = getMNSession();
432
      Identifier deletedPid = MNodeService.getInstance(request).delete(session, pid);
433
      assertEquals(pid.getValue(), deletedPid.getValue());
434
      // check that we cannot get the object
435
      session = getTestSession();
436
      InputStream deletedObject = null;
437
      try {
438
    	  deletedObject = MNodeService.getInstance(request).get(session, deletedPid);
439
      } catch (NotFound nf) {
440
    	  // this is expected
441
      }
442
	  assertNull(deletedObject);
443
      
444
    } catch (UnsupportedEncodingException e) {
445
      e.printStackTrace();
446
      
447
    } catch (Exception e) {
448
      e.printStackTrace();
449
      fail("Unexpected error: " + e.getMessage());
450

    
451
    } 
452

    
453
  }
454

    
455
  /**
456
   * Test object updating
457
   */
458
  public void testUpdate() {
459
    printTestHeader("testUpdate");
460
    
461
    try {
462
      Session session = getTestSession();
463
      Identifier guid = new Identifier();
464
      guid.setValue("testUpdate." + System.currentTimeMillis());
465
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
466
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
467
      Identifier newPid = new Identifier();
468
      newPid.setValue("testUpdate." + (System.currentTimeMillis() + 1)); // ensure it is different from original
469
      Identifier pid = 
470
        MNodeService.getInstance(request).create(session, guid, object, sysmeta);
471
      
472
      SystemMetadata newSysMeta = createSystemMetadata(newPid, session.getSubject(), object);
473
            
474
      // do the update
475
      Identifier updatedPid = 
476
        MNodeService.getInstance(request).update(session, pid, object, newPid, newSysMeta);
477
      
478
      // get the updated system metadata
479
      SystemMetadata updatedSysMeta = 
480
        MNodeService.getInstance(request).getSystemMetadata(session, updatedPid);
481

    
482
      assertEquals(updatedPid.getValue(), newPid.getValue());
483
//      assertTrue(updatedSysMeta.getObsolete(0).getValue().equals(pid.getValue()));
484
//      assertTrue(updatedSysMeta.getDerivedFrom(0).getValue().equals(pid.getValue()));        
485
      
486
    } catch (UnsupportedEncodingException e) {
487
      e.printStackTrace();
488
      fail("Unexpected error: " + e.getMessage());
489

    
490
    } catch (InvalidToken e) {
491
      e.printStackTrace();
492
      fail("Unexpected error: " + e.getMessage());
493

    
494
    } catch (ServiceFailure e) {
495
      e.printStackTrace();
496
      fail("Unexpected error: " + e.getMessage());
497

    
498
    } catch (NotAuthorized e) {
499
      e.printStackTrace();
500
      fail("Unexpected error: " + e.getMessage());
501

    
502
    } catch (IdentifierNotUnique e) {
503
      e.printStackTrace();
504
      fail("Unexpected error: " + e.getMessage());
505

    
506
    } catch (UnsupportedType e) {
507
      e.printStackTrace();
508
      fail("Unexpected error: " + e.getMessage());
509

    
510
    } catch (InsufficientResources e) {
511
      e.printStackTrace();
512
      fail("Unexpected error: " + e.getMessage());
513

    
514
    } catch (InvalidSystemMetadata e) {
515
      e.printStackTrace();
516
      fail("Unexpected error: " + e.getMessage());
517

    
518
    } catch (NotImplemented e) {
519
      e.printStackTrace();
520
      fail("Unexpected error: " + e.getMessage());
521

    
522
    } catch (InvalidRequest e) {
523
      e.printStackTrace();
524
      fail("Unexpected error: " + e.getMessage());
525

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

    
530
    }
531
  }
532

    
533
  /**
534
   * We currently expect this unit test to fail because it should rely on a different member node
535
   * to retrieve the object from. Currently it gets the object from itself and throws 
536
   * and expected error for duplicate entry.
537
   * 
538
   */
539
  public void testReplicate() {
540
      printTestHeader("testReplicate");
541
      try {
542
        Session session = getTestSession();
543
        Identifier guid = new Identifier();
544
        guid.setValue("testReplicate." + System.currentTimeMillis());
545
        InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
546
        SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
547
        // save locally
548
        Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
549
        // get our node reference (attempting to replicate with self)
550
        NodeReference sourceNode = MNodeService.getInstance(request).getCapabilities().getIdentifier();
551
        // attempt to replicate with ourselves -- this should fail!
552
      boolean result = false;
553
      try {
554
        result = MNodeService.getInstance(request).replicate(session, sysmeta, sourceNode);
555
      } catch (Exception inu) {
556
        // we are expecting this to fail since we already have the doc
557
        result = true;
558
      }
559
      assertTrue(result);
560
      } catch (Exception e) {
561
        e.printStackTrace();
562
      fail("Probably not yet implemented: " + e.getMessage());
563
    }
564
  }
565

    
566
  /**
567
   * Test describing an object
568
   */
569
  public void testDescribe() {
570
    printTestHeader("testDescribe");
571

    
572
    try {
573
      Session session = getTestSession();
574
      Identifier guid = new Identifier();
575
      guid.setValue("testGetSystemMetadata." + System.currentTimeMillis());
576
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
577
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
578
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
579
      DescribeResponse describeResponse = MNodeService.getInstance(request).describe(session, pid);
580
      assertEquals(describeResponse.getDataONE_Checksum().getValue(), sysmeta.getChecksum().getValue());
581
      assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), sysmeta.getFormatId().getValue());
582
      
583
    } catch (UnsupportedEncodingException e) {
584
      e.printStackTrace();
585
      fail("Unexpected error: " + e.getMessage());
586

    
587
    } catch (InvalidToken e) {
588
      e.printStackTrace();      
589
      fail("Unexpected error: " + e.getMessage());
590

    
591
    } catch (ServiceFailure e) {
592
      e.printStackTrace();
593
      fail("Unexpected error: " + e.getMessage());
594

    
595
    } catch (NotAuthorized e) {
596
      e.printStackTrace();
597
      fail("Unexpected error: " + e.getMessage());
598

    
599
    } catch (IdentifierNotUnique e) {
600
      e.printStackTrace();
601
      fail("Unexpected error: " + e.getMessage());
602
      
603
    } catch (UnsupportedType e) {
604
      e.printStackTrace();
605
      fail("Unexpected error: " + e.getMessage());
606

    
607
    } catch (InsufficientResources e) {
608
      e.printStackTrace();
609
      fail("Unexpected error: " + e.getMessage());
610

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

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

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

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

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

    
631
    }
632
  }
633

    
634
  /**
635
   * Test getting the checksum of an object
636
   */
637
  public void testGetChecksum() {
638
    printTestHeader("testGetChecksum");
639

    
640
    try {
641
      Session session = getTestSession();
642
      Identifier guid = new Identifier();
643
      guid.setValue("testGetChecksum." + System.currentTimeMillis());
644
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
645
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
646
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
647
      Checksum checksum = MNodeService.getInstance(request).getChecksum(session, pid, "MD5");
648
      assertEquals(checksum.getValue(), sysmeta.getChecksum().getValue());
649
    
650
    } catch (UnsupportedEncodingException e) {
651
      e.printStackTrace();
652
      fail("Unexpected error: " + e.getMessage());
653

    
654
    } catch (InvalidToken e) {
655
      e.printStackTrace();
656
      fail("Unexpected error: " + e.getMessage());
657

    
658
    } catch (ServiceFailure e) {
659
      e.printStackTrace();
660
      fail("Unexpected error: " + e.getMessage());
661

    
662
    } catch (NotAuthorized e) {
663
      e.printStackTrace();
664
      fail("Unexpected error: " + e.getMessage());
665

    
666
    } catch (IdentifierNotUnique e) {
667
      e.printStackTrace();
668
      fail("Unexpected error: " + e.getMessage());
669

    
670
    } catch (UnsupportedType e) {
671
      e.printStackTrace();
672
      fail("Unexpected error: " + e.getMessage());
673

    
674
    } catch (InsufficientResources e) {
675
      e.printStackTrace();
676
      fail("Unexpected error: " + e.getMessage());
677

    
678
    } catch (InvalidSystemMetadata e) {
679
      e.printStackTrace();
680
      fail("Unexpected error: " + e.getMessage());
681

    
682
    } catch (NotImplemented e) {
683
      e.printStackTrace();
684
      fail("Unexpected error: " + e.getMessage());
685

    
686
    } catch (InvalidRequest e) {
687
      e.printStackTrace();
688
      fail("Unexpected error: " + e.getMessage());
689

    
690
    } catch (NotFound e) {
691
      e.printStackTrace();
692
      fail("Unexpected error: " + e.getMessage());
693

    
694
    } catch (Exception e) {
695
      e.printStackTrace();
696
      fail("Unexpected error: " + e.getMessage());
697

    
698
    }
699
    
700
  }
701

    
702
  /**
703
   * Testing listing objects on the Member Node
704
   */
705
  public void testListObjects() {
706
      printTestHeader("testListObjects");
707
  
708
      try {
709
  
710
        Session session = getTestSession();
711
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
712
        Date startTime = sdf.parse("2010-01-01");
713
        Date endTime = new Date();
714
        ObjectFormatIdentifier objectFormatId = null;
715
        boolean replicaStatus = false;
716
        int start = 0;
717
        int count = 1;
718
      
719
        // insert at least one object 
720
        testCreate();
721
        // now check that we have at least one
722
        ObjectList objectList = 
723
          MNodeService.getInstance(request).listObjects(session, startTime, endTime, 
724
              objectFormatId, null, replicaStatus, start, count);
725
        assertNotNull(objectList);
726
        assertTrue(objectList.getCount() == count);
727
        assertTrue(objectList.getStart() == 0);
728
        assertTrue(objectList.getTotal() > 1);
729
        
730
      } catch (Exception e) {
731
        e.printStackTrace();
732
        fail("Unexpected error: " + e.getMessage());
733
  
734
      }
735
  }
736

    
737
  public void testGetCapabilities() {
738
      printTestHeader("testGetCapabilities");
739
    try {
740
      Node node = MNodeService.getInstance(request).getCapabilities();
741
      ByteArrayOutputStream baos = new ByteArrayOutputStream();
742
      TypeMarshaller.marshalTypeToOutputStream(node, baos);
743
      assertNotNull(node);
744
      // TODO: should probably test other parts of the node information
745
      
746
    } catch (JiBXException e) {
747
        e.printStackTrace();
748
        fail("The node instance couldn't be parsed correctly:" + e.getMessage());
749
        
750
    } catch (IOException e) {
751
        e.printStackTrace();
752
        fail("The node instance couldn't be read correctly:" + e.getMessage());
753
        
754
    } catch (Exception e) {
755
        e.printStackTrace();
756
        fail("Probably not yet implemented: " + e.getMessage());
757
        
758
    }
759
    
760
  }
761

    
762
  public void testPing() {
763

    
764
    try {
765
      Date mnDate = MNodeService.getInstance(request).ping();
766
      assertTrue(mnDate != null);
767
      
768
    } catch (NotImplemented e) {
769
      e.printStackTrace();
770
      fail("Unexpected error: " + e.getMessage());
771

    
772
    } catch (ServiceFailure e) {
773
      e.printStackTrace();
774
      fail("Unexpected error: " + e.getMessage());
775

    
776
    }  catch (InsufficientResources e) {
777
      e.printStackTrace();
778
      fail("Unexpected error: " + e.getMessage());
779

    
780
    }
781
    
782
  }
783

    
784
  public void testSynchronizationFailed() {
785
    printTestHeader("testSynchronizationFailed");
786
    try {
787
        Session session = getTestSession();
788
        
789
        // create the object
790
        Identifier pid = new Identifier();
791
        pid.setValue("testSynchronizationFailed." + System.currentTimeMillis());
792
        InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
793
        SystemMetadata sysmeta = createSystemMetadata(pid, session.getSubject(), object);
794
        Identifier retPid = MNodeService.getInstance(request).create(session, pid, object, sysmeta);
795
        assertEquals(retPid.getValue(), pid.getValue());
796
        
797
        // pretend the sync failed, act as CN
798
      SynchronizationFailed syncFailed = 
799
        new SynchronizationFailed("0000", "Testing Synch Failure");
800
      syncFailed.setPid(pid.getValue());
801
      session = getCNSession();
802
      MNodeService.getInstance(request).synchronizationFailed(session, syncFailed );
803
    } catch (Exception e) {
804
      e.printStackTrace();
805
        fail("Unexpected error: " + e.getMessage());
806
    }
807

    
808
  }
809

    
810
  public void testSystemMetadataChanged() {
811
      printTestHeader("testSystemMetadataChanged");
812
      try {
813
          Session session = getTestSession();
814
          
815
          // create the object
816
          Identifier pid = new Identifier();
817
          pid.setValue("testSystemMetadataChanged." + System.currentTimeMillis());
818
          InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
819
          SystemMetadata sysmeta = createSystemMetadata(pid, session.getSubject(), object);
820
          Identifier retPid = MNodeService.getInstance(request).create(session, pid, object, sysmeta);
821
          assertEquals(retPid.getValue(), pid.getValue());
822
          
823
          // pretend the system metadata changed on the CN
824
          MNodeService.getInstance(request).systemMetadataChanged(session, 
825
                  retPid, 5000L, Calendar.getInstance().getTime());
826
          
827
      } catch (Exception e) {
828
          if (e instanceof NotAuthorized) {
829
              // only CN subjects can call this
830
              // TODO: use a CN certificate in the tests
831
          } else {
832
              fail("Unexpected error: " + e.getMessage());
833
              
834
          }
835
      }
836

    
837
    }
838

    
839
  public void testGetLogRecords() {
840
    printTestHeader("testLogRecords");
841

    
842
    try {
843
	    Log log = null;
844
	    Session session = getCNSession();
845
	    Date fromDate = new Date();
846
	    Calendar calendar = Calendar.getInstance();
847
	    calendar.setTime(fromDate);
848
	    calendar.roll(Calendar.YEAR, false);
849
	    fromDate = calendar.getTime();
850
	    Date toDate = new Date();
851
	    Event event = Event.CREATE;
852
	    int start = 0;
853
	    int count = 1;
854
    
855
      log = MNodeService.getInstance(request).getLogRecords(session, fromDate, toDate, 
856
        event.xmlValue(), null, start, count);
857
      
858
      assertNotNull(log);      
859
      assertTrue(log.getCount() == count);
860
      assertTrue(log.getStart() == start);
861
      assertTrue(log.getTotal() >= 1);
862
        
863
    } catch (Exception e) {
864
      e.printStackTrace();
865
      fail("Unexpected error: " + e.getMessage());
866

    
867
    }
868
  }
869

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

    
955
  /**
956
   * Test if a subject is authorized to read a known object
957
   */
958
  public void testIsAuthorized() {
959
    printTestHeader("testIsAuthorized");
960
    
961
    try {
962
      Session session = getTestSession();
963
      Identifier guid = new Identifier();
964
      guid.setValue("testIsAuthorized." + System.currentTimeMillis());
965
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
966
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
967
      Identifier pid = 
968
        MNodeService.getInstance(request).create(session, guid, object, sysmeta);
969
      boolean isAuthorized = 
970
        MNodeService.getInstance(request).isAuthorized(session, pid, Permission.READ);
971
      assertEquals(isAuthorized, true);
972
      
973
    } catch (UnsupportedEncodingException e) {
974
      e.printStackTrace();
975
      fail("Unexpected error: " + e.getMessage());
976

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

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

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

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

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

    
997
    } catch (InsufficientResources e) {
998
      e.printStackTrace();
999
      fail("Unexpected error: " + e.getMessage());
1000

    
1001
    } catch (InvalidSystemMetadata e) {
1002
      e.printStackTrace();
1003
      fail("Unexpected error: " + e.getMessage());
1004

    
1005
    } catch (NotImplemented e) {
1006
      e.printStackTrace();
1007
      fail("Unexpected error: " + e.getMessage());
1008

    
1009
    } catch (InvalidRequest e) {
1010
      e.printStackTrace();
1011
      fail("Unexpected error: " + e.getMessage());
1012

    
1013
    } catch (Exception e) {
1014
      e.printStackTrace();
1015
      fail("Unexpected error: " + e.getMessage());
1016

    
1017
    }
1018
  }
1019
  
1020
  /**
1021
   * Test if node admin is authorized to read a known object
1022
   */
1023
  public void testIsAdminAuthorized() {
1024
    printTestHeader("testIsAdminAuthorized");
1025
    
1026
    try {
1027
      Session session = getTestSession();
1028
      Identifier guid = new Identifier();
1029
      guid.setValue("testIsAdminAuthorized." + System.currentTimeMillis());
1030
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1031
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1032
      Identifier pid = 
1033
        MNodeService.getInstance(request).create(session, guid, object, sysmeta);
1034
      
1035
      // test as public - read
1036
      boolean isAuthorized = 
1037
        MNodeService.getInstance(request).isAuthorized(null, pid, Permission.READ);
1038
      assertEquals(isAuthorized, true);
1039
      
1040
      // test as public - change perm
1041
      isAuthorized = 
1042
        MNodeService.getInstance(request).isAuthorized(null, pid, Permission.CHANGE_PERMISSION);
1043
      assertEquals(isAuthorized, false);
1044
      
1045
      // test as admin
1046
      isAuthorized = 
1047
    	        MNodeService.getInstance(request).isAuthorized(getMNSession(), pid, Permission.CHANGE_PERMISSION);
1048
    	      assertEquals(isAuthorized, true);
1049
      
1050
    } catch (Exception e) {
1051
      e.printStackTrace();
1052
      fail("Unexpected error: " + e.getMessage());
1053

    
1054
    } 
1055
  }
1056

    
1057
  
1058
  public void testIsEquivIdentityAuthorized() {
1059
      printTestHeader("testIsEquivIdentityAuthorized");
1060

    
1061
      try {
1062
          Session session = new Session();
1063
          Subject s = new Subject();
1064
          s.setValue("cn=test,dc=dataone,dc=org");
1065
          session.setSubject(s);
1066
          
1067
          Identifier pid = new Identifier();
1068
          pid.setValue("testIsEquivIdentityAuthorized." + System.currentTimeMillis());
1069
          InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1070
          SystemMetadata sysmeta = createSystemMetadata(pid, session.getSubject(), object);
1071
          
1072
          // reset the access policy to only allow 'self' read (no public)
1073
          AccessPolicy ap = new AccessPolicy();
1074
          AccessRule ar = new AccessRule();
1075
          List<Subject> sList = new ArrayList<Subject>();
1076
          sList.add(session.getSubject());
1077
          ar.setSubjectList(sList);
1078
          List<Permission> permList = new ArrayList<Permission>();
1079
          permList.add(Permission.CHANGE_PERMISSION);
1080
          ar.setPermissionList(permList);
1081
          ap.addAllow(ar);
1082
          sysmeta.setAccessPolicy(ap);
1083
          
1084
          // save it
1085
          Identifier retPid = CNodeService.getInstance(request).registerSystemMetadata(session, pid, sysmeta);
1086
          assertEquals(pid.getValue(), retPid.getValue());
1087
          
1088
          //check it against an equivalent identity not listed in the access policy
1089
          session.getSubject().setValue("cn=newSubject,dc=dataone,dc=org");
1090
          SubjectInfo subjectInfo = new SubjectInfo();
1091
          Person person = new Person();
1092
          person.setSubject(session.getSubject());
1093
          List<String> givenNames = new ArrayList<String>();
1094
          givenNames.add("New");
1095
          person.setGivenNameList(givenNames);
1096
          person.setFamilyName("Subject");
1097
          
1098
          // add equivalent identities
1099
          List<Subject> equivIdentities = new ArrayList<Subject>();
1100
          Subject mappedSubject2 = new Subject();
1101
          mappedSubject2.setValue("cn=test2,dc=dataone,dc=org");
1102
          equivIdentities.add(mappedSubject2);
1103
          
1104
          Subject mappedSubject = new Subject();
1105
          mappedSubject.setValue("cn=test,dc=dataone,dc=org");
1106
          equivIdentities.add(mappedSubject);          
1107
          
1108
          person.setEquivalentIdentityList(equivIdentities);
1109
          
1110
          List<Person> personList = new ArrayList<Person>();
1111
          personList.add(person);
1112
          subjectInfo.setPersonList(personList);
1113
          
1114
          // update the session to include subject info with a mapped identity
1115
          session.setSubjectInfo(subjectInfo);
1116
          boolean result = CNodeService.getInstance(request).isAuthorized(session, pid, Permission.READ);
1117
          assertTrue(result);
1118
        
1119
    } catch (Exception e) {
1120
        e.printStackTrace();
1121
        
1122
    }
1123
    
1124
  }
1125

    
1126
/**
1127
   * Test object creation failure when there is a space in the identifier
1128
   */
1129
  public void testCreateInvalidIdentifier() {
1130
    printTestHeader("testCreateInvalidIdentifier");
1131
    
1132
    try {
1133
      Session session = getTestSession();
1134
      Identifier guid = new Identifier();
1135
      guid.setValue("testCreate withspace." + System.currentTimeMillis());
1136
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1137
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1138
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
1139
      fail("Should not be able to create with whitespace in indentifier");
1140
    } catch (InvalidRequest e) {
1141
    	// expect that this request fails
1142
        assertTrue(true);
1143
    } catch (Exception e) {
1144
      e.printStackTrace();
1145
      fail("Unexpected error: " + e.getMessage());
1146
    }
1147
      
1148
  }
1149
  
1150
	/**
1151
	 * Test getting a known object
1152
	 */
1153
	public void testGetPackage() {
1154
		printTestHeader("testGetPackage");
1155

    
1156
		try {
1157
			Session session = getTestSession();
1158
			Identifier guid = new Identifier();
1159
			guid.setValue("testGetPackage." + System.currentTimeMillis());
1160
			InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1161
			SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1162
			Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
1163
			InputStream bagStream = MNodeService.getInstance(request).getPackage(session, null, pid);
1164
			File bagFile = File.createTempFile("bagit.", ".zip");
1165
			IOUtils.copy(bagStream, new FileOutputStream(bagFile));
1166
			BagFactory bagFactory = new BagFactory();
1167
			Bag bag = bagFactory.createBag(bagFile);
1168
			InputStream result = bag.getPayload().iterator().next().newInputStream();
1169
			
1170
			// go back to beginning of original stream
1171
			object.reset();
1172
			// check
1173
			assertTrue(object.available() > 0);
1174
			assertTrue(result.available() > 0);
1175
			assertTrue(IOUtils.contentEquals(result, object));
1176
			
1177
			// clean up
1178
			bagFile.delete();
1179

    
1180
		} catch (Exception e) {
1181
			e.printStackTrace();
1182
			fail("Unexpected error: " + e.getMessage());
1183
		}
1184
	}
1185
	
1186
	
1187
	/**
1188
	 * Test getting a known object
1189
	 */
1190
	public void testGetOREPackage() {
1191
		printTestHeader("testGetOREPackage");
1192

    
1193
		try {
1194
			
1195
			// construct the ORE package
1196
			Identifier resourceMapId = new Identifier();
1197
			//resourceMapId.setValue("doi://1234/AA/map.1.1");
1198
			resourceMapId.setValue("testGetOREPackage." + System.currentTimeMillis());
1199
			Identifier metadataId = new Identifier();
1200
			metadataId.setValue("doi://1234/AA/meta.1." + + System.currentTimeMillis());
1201
			List<Identifier> dataIds = new ArrayList<Identifier>();
1202
			Identifier dataId = new Identifier();
1203
			dataId.setValue("doi://1234/AA/data.1." + System.currentTimeMillis());
1204
			Identifier dataId2 = new Identifier();
1205
			dataId2.setValue("doi://1234/AA/data.2." + System.currentTimeMillis());
1206
			dataIds.add(dataId);
1207
			dataIds.add(dataId2);
1208
			Map<Identifier, List<Identifier>> idMap = new HashMap<Identifier, List<Identifier>>();
1209
			idMap.put(metadataId, dataIds);
1210
			ResourceMapFactory rmf = ResourceMapFactory.getInstance();
1211
			ResourceMap resourceMap = rmf.createResourceMap(resourceMapId, idMap);
1212
			assertNotNull(resourceMap);
1213
			String rdfXml = ResourceMapFactory.getInstance().serializeResourceMap(resourceMap);
1214
			assertNotNull(rdfXml);
1215
			
1216
			Session session = getTestSession();
1217
			InputStream object = null;
1218
			SystemMetadata sysmeta = null;
1219
			
1220
			// save the data objects (data just contains their ID)
1221
			InputStream dataObject1 = new ByteArrayInputStream(dataId.getValue().getBytes("UTF-8"));
1222
			sysmeta = createSystemMetadata(dataId, session.getSubject(), dataObject1);
1223
			MNodeService.getInstance(request).create(session, dataId, dataObject1, sysmeta);
1224
			// second data file
1225
			InputStream dataObject2 = new ByteArrayInputStream(dataId2.getValue().getBytes("UTF-8"));
1226
			sysmeta = createSystemMetadata(dataId2, session.getSubject(), dataObject2);
1227
			MNodeService.getInstance(request).create(session, dataId2, dataObject2, sysmeta);
1228
			// metadata file
1229
			InputStream metadataObject = new ByteArrayInputStream(metadataId.getValue().getBytes("UTF-8"));
1230
			sysmeta = createSystemMetadata(metadataId, session.getSubject(), metadataObject);
1231
			MNodeService.getInstance(request).create(session, metadataId, metadataObject, sysmeta);
1232
						
1233
			// save the ORE object
1234
			object = new ByteArrayInputStream(rdfXml.getBytes("UTF-8"));
1235
			sysmeta = createSystemMetadata(resourceMapId, session.getSubject(), object);
1236
			sysmeta.setFormatId(ObjectFormatCache.getInstance().getFormat("http://www.openarchives.org/ore/terms").getFormatId());
1237
			Identifier pid = MNodeService.getInstance(request).create(session, resourceMapId, object, sysmeta);
1238
			
1239
			// get the package we uploaded
1240
			InputStream bagStream = MNodeService.getInstance(request).getPackage(session, null, pid);
1241
			File bagFile = File.createTempFile("bagit.", ".zip");
1242
			IOUtils.copy(bagStream, new FileOutputStream(bagFile));
1243
			BagFactory bagFactory = new BagFactory();
1244
			Bag bag = bagFactory.createBag(bagFile);
1245
			Iterator<Manifest> manifestIter = bag.getTagManifests().iterator();
1246
			while (manifestIter.hasNext()) {
1247
				String filepath = manifestIter.next().getFilepath();
1248
				BagFile entryFile = bag.getBagFile(filepath);
1249
				InputStream result = entryFile.newInputStream();
1250
				// check ORE
1251
				if (filepath.contains(resourceMapId.getValue())) {
1252
					object.reset();
1253
					assertTrue(object.available() > 0);
1254
					assertTrue(result.available() > 0);
1255
					assertTrue(IOUtils.contentEquals(result, object));
1256
				}
1257
				// check metadata
1258
				if (filepath.contains(metadataId.getValue())) {
1259
					metadataObject.reset();
1260
					assertTrue(metadataObject.available() > 0);
1261
					assertTrue(result.available() > 0);
1262
					assertTrue(IOUtils.contentEquals(result, metadataObject));
1263
				}
1264
				if (filepath.contains(dataId.getValue())) {
1265
					dataObject1.reset();
1266
					assertTrue(dataObject1.available() > 0);
1267
					assertTrue(result.available() > 0);
1268
					assertTrue(IOUtils.contentEquals(result, dataObject1));
1269
				}
1270
				if (filepath.contains(dataId2.getValue())) {
1271
					dataObject2.reset();
1272
					assertTrue(dataObject2.available() > 0);
1273
					assertTrue(result.available() > 0);
1274
					assertTrue(IOUtils.contentEquals(result, dataObject2));
1275
				}
1276
				
1277
				
1278
			}
1279
			
1280
			// clean up
1281
			bagFile.delete();
1282
			
1283
			// test the ORE lookup
1284
			List<Identifier> oreIds = MNodeService.getInstance(request).lookupOreFor(metadataId, true);
1285
			assertTrue(oreIds.contains(resourceMapId));
1286

    
1287
		} catch (Exception e) {
1288
			e.printStackTrace();
1289
			fail("Unexpected error: " + e.getMessage());
1290
		}
1291
	}
1292
	
1293
	/**
1294
     * Test the extra "delete information" was added to the NotFoundException
1295
     * if the object was delete in the following methods:
1296
     * MN.get
1297
     * MN.getSystemmetadata
1298
     * MN.describe
1299
     * MN.getChecksum
1300
     * MN.getRelica
1301
     */
1302
    public void testReadDeletedObject() {
1303
        printTestHeader("testDelete");
1304

    
1305
        try {
1306
          Session session = getTestSession();
1307
          Identifier guid = new Identifier();
1308
          guid.setValue("testDelete." + System.currentTimeMillis());
1309
          InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1310
          SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1311
          Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
1312
          Thread.sleep(3000);
1313
          // use MN admin to delete
1314
          session = getMNSession();
1315
          Identifier deletedPid = MNodeService.getInstance(request).delete(session, pid);
1316
          System.out.println("after deleting");
1317
          assertEquals(pid.getValue(), deletedPid.getValue());
1318
          // check that we cannot get the object
1319
          session = getTestSession();
1320
          InputStream deletedObject = null;
1321
          try {
1322
              //System.out.println("before read ===============");
1323
              deletedObject = MNodeService.getInstance(request).get(session, deletedPid);
1324
              //System.out.println("after read ===============");
1325
          } catch (NotFound nf) {
1326
              assertTrue(nf.getMessage().contains("deleted"));
1327
          }
1328
          try {
1329
              //System.out.println("before read ===============");
1330
              SystemMetadata sysmeta2 = MNodeService.getInstance(request).getSystemMetadata(session, deletedPid);
1331
              //System.out.println("after read ===============");
1332
          } catch (NotFound nf) {
1333
              //System.out.println("the exception is "+nf.getMessage());
1334
              assertTrue(nf.getMessage().contains("deleted"));
1335
          }
1336
          
1337
          try {
1338
              //System.out.println("before read ===============");
1339
              DescribeResponse describeResponse = MNodeService.getInstance(request).describe(session, pid);
1340
              //System.out.println("after read ===============");
1341
          } catch (NotFound nf) {
1342
              //System.out.println("the exception is "+nf.getMessage());
1343
              assertTrue(nf.getMessage().contains("deleted"));
1344
          }
1345
          
1346
          try {
1347
              //System.out.println("before read ===============");
1348
              Checksum checksum = MNodeService.getInstance(request).getChecksum(session, pid, "MD5");
1349
              //System.out.println("after read ===============");
1350
          } catch (NotFound nf) {
1351
              //System.out.println("the exception 3 is "+nf.getMessage());
1352
              assertTrue(nf.getMessage().contains("deleted"));
1353
          }
1354
          
1355
          try {
1356
              //System.out.println("before read ===============");
1357
              boolean isAuthorized = 
1358
                      MNodeService.getInstance(request).isAuthorized(session, pid, Permission.READ);
1359
              //System.out.println("after read ===============");
1360
          } catch (NotFound nf) {
1361
              System.out.println("the exception 4 is "+nf.getMessage());
1362
              assertTrue(nf.getMessage().contains("deleted"));
1363
          }
1364
          
1365
          assertNull(deletedObject);
1366
          
1367
        } catch (UnsupportedEncodingException e) {
1368
          e.printStackTrace();
1369
          
1370
        } catch (Exception e) {
1371
          e.printStackTrace();
1372
          fail("Unexpected error: " + e.getMessage());
1373

    
1374
        } 
1375
    }
1376
    
1377
    /**
1378
     * Test to create and update a metadata which xml declaration is ASCII, but actually
1379
     * has some special charaters. The saved document should has the same bytes as the origianl.
1380
     */
1381
    public void testCreateAndUpdateXMLWithUnmatchingEncoding() throws Exception {
1382
          String algorithm = "md5";
1383
          Session session = getTestSession();
1384
          Identifier guid = new Identifier();
1385
          guid.setValue("testCreateAndUpdate." + System.currentTimeMillis());
1386
          InputStream object = new ByteArrayInputStream(FileUtils.readFileToByteArray(new File(unmatchingEncodingFilePath)));
1387
          Checksum orgChecksum = ChecksumUtil.checksum(object, algorithm);
1388
          //System.out.println("the original checksum is "+orgChecksum.getValue());
1389
          SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1390
          Identifier pid = 
1391
            MNodeService.getInstance(request).create(session, guid, object, sysmeta);
1392
          InputStream readResult = MNodeService.getInstance(request).get(session, pid);
1393
          byte[] readBytes = IOUtils.toByteArray(readResult);
1394
          Checksum checksum1 = ChecksumUtil.checksum(readBytes, algorithm);
1395
          //System.out.println("the read checksum1 is "+checksum1.getValue());
1396
          assertEquals(orgChecksum.getValue(), checksum1.getValue());
1397
          
1398
          Identifier newPid = new Identifier();
1399
          newPid.setValue("testCreateAndUpdate." + (System.currentTimeMillis() + 1)); // ensure it is different from original
1400
          SystemMetadata newSysMeta = createSystemMetadata(newPid, session.getSubject(), object);
1401
                
1402
          // do the update
1403
          Identifier updatedPid = 
1404
            MNodeService.getInstance(request).update(session, pid, object, newPid, newSysMeta);
1405
          InputStream readResult2 = MNodeService.getInstance(request).get(session, updatedPid);
1406
          byte[] readBytes2 = IOUtils.toByteArray(readResult2);
1407
          Checksum checksum2 = ChecksumUtil.checksum(readBytes2, algorithm);
1408
          assertEquals(orgChecksum.getValue(), checksum2.getValue());
1409
          //System.out.println("the read checksum2 is "+checksum2.getValue());
1410

    
1411
          
1412
    }
1413
  
1414
    /**
1415
     * Test the method - get api  for a speicified SID
1416
     */
1417
    public void testGetSID() {
1418
        String str1 = "object1";
1419
        String str2 = "object2";
1420
        String str3 = "object3";
1421
        try {
1422
            //insert test documents with a series id
1423
            Session session = getTestSession();
1424
            Identifier guid = new Identifier();
1425
            guid.setValue(generateDocumentId());
1426
            InputStream object1 = new ByteArrayInputStream(str1.getBytes("UTF-8"));
1427
            SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object1);
1428
            String sid1= "sid."+System.nanoTime();
1429
            Identifier seriesId = new Identifier();
1430
            seriesId.setValue(sid1);
1431
            System.out.println("the first sid is "+seriesId.getValue());
1432
            sysmeta.setSeriesId(seriesId);
1433
            MNodeService.getInstance(request).create(session, guid, object1, sysmeta);
1434
            System.out.println("the first pid is "+guid.getValue());
1435
            //test the get(pid) for v2
1436
            InputStream result = MNodeService.getInstance(request).get(session, guid);
1437
            // go back to beginning of original stream
1438
            object1.reset();
1439
            // check
1440
            assertTrue(object1.available() > 0);
1441
            assertTrue(result.available() > 0);
1442
            assertTrue(IOUtils.contentEquals(result, object1));
1443
            // test the get(id) for v2
1444
            InputStream result1 = MNodeService.getInstance(request).get(session, seriesId);
1445
            object1.reset();
1446
            // check
1447
            assertTrue(object1.available() > 0);
1448
            assertTrue(result1.available() > 0);
1449
            assertTrue(IOUtils.contentEquals(result1, object1));
1450
            //test the get(pid) for v1
1451
            InputStream result2 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, guid);
1452
            object1.reset();
1453
            // check
1454
            assertTrue(object1.available() > 0);
1455
            assertTrue(result2.available() > 0);
1456
            assertTrue(IOUtils.contentEquals(result2, object1));
1457
            //test the get(sid) for v1
1458
            try {
1459
                InputStream result3 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, seriesId);
1460
                fail("the get(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1461
            } catch (NotFound ee) {
1462
                
1463
            }
1464
            SystemMetadata metadata = MNodeService.getInstance(request).getSystemMetadata(session, seriesId);
1465
            assertTrue(metadata.getIdentifier().getValue().equals(guid.getValue()));
1466
            assertTrue(metadata.getSeriesId().getValue().equals(seriesId.getValue()));
1467
            DescribeResponse describeResponse = MNodeService.getInstance(request).describe(session, seriesId);
1468
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata.getChecksum().getValue());
1469
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata.getFormatId().getValue());
1470
            
1471
            metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid);
1472
            assertTrue(metadata.getIdentifier().getValue().equals(guid.getValue()));
1473
            assertTrue(metadata.getSeriesId().getValue().equals(seriesId.getValue()));
1474
            describeResponse = MNodeService.getInstance(request).describe(session, guid);
1475
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata.getChecksum().getValue());
1476
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata.getFormatId().getValue());
1477
            
1478
            org.dataone.service.types.v1.SystemMetadata sys1=edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).getSystemMetadata(session, guid);
1479
            assertTrue(metadata.getIdentifier().getValue().equals(guid.getValue()));
1480
            
1481
            try {
1482
                org.dataone.service.types.v1.SystemMetadata sys2=edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).getSystemMetadata(session, seriesId);
1483
                fail("the getSystemMetadata(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1484
            } catch(NotFound nf2) {
1485
                
1486
            }
1487
            
1488
            describeResponse = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).describe(session, guid);
1489
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), sys1.getChecksum().getValue());
1490
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), sys1.getFormatId().getValue());
1491
            try {
1492
                describeResponse = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).describe(session, seriesId);
1493
                fail("the describe(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1494
            } catch(NotFound nf2) {
1495
                
1496
            }
1497
            
1498
            Checksum sum = MNodeService.getInstance(request).getChecksum(session, guid, "md5");
1499
            assertTrue(sum.getValue().equals("5b78f9689b9aab1ebc0f3c1df916dd97"));
1500
            
1501
            try {
1502
                sum = MNodeService.getInstance(request).getChecksum(session, seriesId, "md5");
1503
                fail("the getCheckSum shouldn't work for sid");
1504
            } catch(NotFound nf3) {
1505
                
1506
            }
1507
            
1508
            sum = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).getChecksum(session, guid, "md5");
1509
            assertTrue(sum.getValue().equals("5b78f9689b9aab1ebc0f3c1df916dd97"));
1510
            
1511
            try {
1512
                sum = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).getChecksum(session, seriesId, "md5");
1513
                fail("the getCheckSum shouldn't work for sid");
1514
            } catch(NotFound nf3) {
1515
                
1516
            }
1517
            
1518
            
1519
            
1520
            //do a update with the same series id
1521
            Thread.sleep(1000);
1522
            Identifier newPid = new Identifier();
1523
            newPid.setValue(generateDocumentId()+"1");
1524
            System.out.println("the second pid is "+newPid.getValue());
1525
            InputStream object2 = new ByteArrayInputStream(str2.getBytes("UTF-8"));
1526
            SystemMetadata newSysMeta = createSystemMetadata(newPid, session.getSubject(), object2);
1527
            newSysMeta.setObsoletes(guid);
1528
            newSysMeta.setSeriesId(seriesId);
1529
            MNodeService.getInstance(request).update(session, guid, object2, newPid, newSysMeta);
1530
           
1531
            InputStream result4 = MNodeService.getInstance(request).get(session, guid);
1532
            // go back to beginning of original stream
1533
            object1.reset();
1534
            // check
1535
            assertTrue(object1.available() > 0);
1536
            assertTrue(result4.available() > 0);
1537
            assertTrue(IOUtils.contentEquals(result4, object1));
1538
            
1539
            InputStream result5 = MNodeService.getInstance(request).get(session, newPid);
1540
            // go back to beginning of original stream
1541
            object2.reset();
1542
            // check
1543
            assertTrue(object2.available() > 0);
1544
            assertTrue(result5.available() > 0);
1545
            assertTrue(IOUtils.contentEquals(result5, object2));
1546
            
1547

    
1548
            InputStream result6 = MNodeService.getInstance(request).get(session, seriesId);
1549
            object2.reset();
1550
            // check
1551
            assertTrue(object2.available() > 0);
1552
            assertTrue(result6.available() > 0);
1553
            assertTrue(IOUtils.contentEquals(result6, object2));
1554
            //test the get(pid) for v1
1555
            InputStream result7 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, guid);
1556
            object1.reset();
1557
            // check
1558
            assertTrue(object1.available() > 0);
1559
            assertTrue(result7.available() > 0);
1560
            assertTrue(IOUtils.contentEquals(result7, object1));
1561
            
1562
            InputStream result8 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, newPid);
1563
            object2.reset();
1564
            // check
1565
            assertTrue(object2.available() > 0);
1566
            assertTrue(result8.available() > 0);
1567
            assertTrue(IOUtils.contentEquals(result8, object2));
1568
            //test the get(sid) for v1
1569
            try {
1570
                InputStream result3 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, seriesId);
1571
                fail("the get(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1572
            } catch (NotFound ee) {
1573
                
1574
            }
1575
            
1576
            SystemMetadata metadata1 = MNodeService.getInstance(request).getSystemMetadata(session, seriesId);
1577
            assertTrue(metadata1.getIdentifier().getValue().equals(newPid.getValue()));
1578
            assertTrue(metadata1.getSeriesId().getValue().equals(seriesId.getValue()));
1579
            describeResponse = MNodeService.getInstance(request).describe(session, seriesId);
1580
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata1.getChecksum().getValue());
1581
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata1.getFormatId().getValue());
1582
            
1583
            SystemMetadata metadata2 = MNodeService.getInstance(request).getSystemMetadata(session, guid);
1584
            assertTrue(metadata2.getIdentifier().getValue().equals(guid.getValue()));
1585
            assertTrue(metadata2.getSeriesId().getValue().equals(seriesId.getValue()));
1586
            describeResponse = MNodeService.getInstance(request).describe(session, guid);
1587
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata2.getChecksum().getValue());
1588
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata2.getFormatId().getValue());
1589
            
1590
            SystemMetadata metadata3 = MNodeService.getInstance(request).getSystemMetadata(session, newPid);
1591
            assertTrue(metadata3.getIdentifier().getValue().equals(newPid.getValue()));
1592
            assertTrue(metadata3.getSeriesId().getValue().equals(seriesId.getValue()));
1593
            describeResponse = MNodeService.getInstance(request).describe(session, newPid);
1594
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata3.getChecksum().getValue());
1595
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata3.getFormatId().getValue());
1596
            
1597
            //do another update with different series id
1598
            Thread.sleep(1000);
1599
            String sid2 = "sid."+System.nanoTime();
1600
            Identifier seriesId2= new Identifier();
1601
            seriesId2.setValue(sid2);
1602
            System.out.println("the second sid is "+seriesId2.getValue());
1603
            Identifier newPid2 = new Identifier();
1604
            newPid2.setValue(generateDocumentId()+"2");
1605
            System.out.println("the third pid is "+newPid2.getValue());
1606
            InputStream object3 = new ByteArrayInputStream(str3.getBytes("UTF-8"));
1607
            SystemMetadata sysmeta3 = createSystemMetadata(newPid2, session.getSubject(), object3);
1608
            sysmeta3.setObsoletes(newPid);
1609
            sysmeta3.setSeriesId(seriesId2);
1610
            MNodeService.getInstance(request).update(session, newPid, object3, newPid2, sysmeta3);
1611
            
1612
            InputStream result9 = MNodeService.getInstance(request).get(session, guid);
1613
            // go back to beginning of original stream
1614
            object1.reset();
1615
            // check
1616
            assertTrue(object1.available() > 0);
1617
            assertTrue(result9.available() > 0);
1618
            assertTrue(IOUtils.contentEquals(result9, object1));
1619
            
1620
            InputStream result10 = MNodeService.getInstance(request).get(session, newPid);
1621
            // go back to beginning of original stream
1622
            object2.reset();
1623
            // check
1624
            assertTrue(object2.available() > 0);
1625
            assertTrue(result10.available() > 0);
1626
            assertTrue(IOUtils.contentEquals(result10, object2));
1627
            
1628
            
1629
            InputStream result11 = MNodeService.getInstance(request).get(session, newPid2);
1630
            // go back to beginning of original stream
1631
            object3.reset();
1632
            // check
1633
            assertTrue(object3.available() > 0);
1634
            assertTrue(result11.available() > 0);
1635
            assertTrue(IOUtils.contentEquals(result11, object3));
1636
            
1637
            InputStream result12 = MNodeService.getInstance(request).get(session, seriesId2);
1638
            object3.reset();
1639
            // check
1640
            assertTrue(object3.available() > 0);
1641
            assertTrue(result12.available() > 0);
1642
            assertTrue(IOUtils.contentEquals(result12, object3));
1643
            
1644
            InputStream result16 = MNodeService.getInstance(request).get(session, seriesId);
1645
            object2.reset();
1646
            // check
1647
            assertTrue(object2.available() > 0);
1648
            assertTrue(result16.available() > 0);
1649
            assertTrue(IOUtils.contentEquals(result16, object2));
1650
           
1651
            //test the get(pid) for v1
1652
            InputStream result13 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, guid);
1653
            object1.reset();
1654
            // check
1655
            assertTrue(object1.available() > 0);
1656
            assertTrue(result13.available() > 0);
1657
            assertTrue(IOUtils.contentEquals(result13, object1));
1658
            
1659
            InputStream result14 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, newPid);
1660
            object2.reset();
1661
            // check
1662
            assertTrue(object2.available() > 0);
1663
            assertTrue(result14.available() > 0);
1664
            assertTrue(IOUtils.contentEquals(result14, object2));
1665
            
1666
            InputStream result15 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, newPid2);
1667
            object3.reset();
1668
            // check
1669
            assertTrue(object3.available() > 0);
1670
            assertTrue(result15.available() > 0);
1671
            assertTrue(IOUtils.contentEquals(result15, object3));
1672
            
1673
            SystemMetadata metadata4 = MNodeService.getInstance(request).getSystemMetadata(session, seriesId);
1674
            assertTrue(metadata4.getIdentifier().getValue().equals(newPid.getValue()));
1675
            assertTrue(metadata4.getSeriesId().getValue().equals(seriesId.getValue()));
1676
            describeResponse = MNodeService.getInstance(request).describe(session, seriesId);
1677
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata4.getChecksum().getValue());
1678
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata4.getFormatId().getValue());
1679
            
1680
            SystemMetadata metadata5 = MNodeService.getInstance(request).getSystemMetadata(session, seriesId2);
1681
            assertTrue(metadata5.getIdentifier().getValue().equals(newPid2.getValue()));
1682
            assertTrue(metadata5.getSeriesId().getValue().equals(seriesId2.getValue()));
1683
            describeResponse = MNodeService.getInstance(request).describe(session, seriesId2);
1684
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata5.getChecksum().getValue());
1685
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata5.getFormatId().getValue());
1686
            
1687
            SystemMetadata metadata6 = MNodeService.getInstance(request).getSystemMetadata(session, guid);
1688
            assertTrue(metadata6.getIdentifier().getValue().equals(guid.getValue()));
1689
            assertTrue(metadata6.getSeriesId().getValue().equals(seriesId.getValue()));
1690
            describeResponse = MNodeService.getInstance(request).describe(session, guid);
1691
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata6.getChecksum().getValue());
1692
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata6.getFormatId().getValue());
1693
            
1694
            SystemMetadata metadata7 = MNodeService.getInstance(request).getSystemMetadata(session, newPid);
1695
            assertTrue(metadata7.getIdentifier().getValue().equals(newPid.getValue()));
1696
            assertTrue(metadata7.getSeriesId().getValue().equals(seriesId.getValue()));
1697
            describeResponse = MNodeService.getInstance(request).describe(session, newPid);
1698
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata7.getChecksum().getValue());
1699
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata7.getFormatId().getValue());
1700
            
1701
            SystemMetadata metadata8 = MNodeService.getInstance(request).getSystemMetadata(session, newPid2);
1702
            assertTrue(metadata8.getIdentifier().getValue().equals(newPid2.getValue()));
1703
            assertTrue(metadata8.getSeriesId().getValue().equals(seriesId2.getValue()));
1704
            describeResponse = MNodeService.getInstance(request).describe(session, newPid2);
1705
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata8.getChecksum().getValue());
1706
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata8.getFormatId().getValue());
1707
            
1708
            
1709
            
1710
            
1711
            //test the get(sid) for v1
1712
            try {
1713
                InputStream result3 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, seriesId);
1714
                fail("the get(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1715
            } catch (NotFound ee) {
1716
                
1717
            }
1718
            
1719
            //test the get(sid) for v1
1720
            try {
1721
                InputStream result3 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, seriesId2);
1722
                fail("the get(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1723
            } catch (NotFound ee) {
1724
                
1725
            }
1726
            
1727
            //test to get non-existing id for v2
1728
            try {
1729
             // the pid should be null when we try to get a no-exist sid
1730
                Identifier non_exist_sid = new Identifier();
1731
                non_exist_sid.setValue("no-sid-exist-123qwe");
1732
                InputStream result3 = MNodeService.getInstance(request).get(session, non_exist_sid);
1733
                fail("the get(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1734
            } catch (NotFound ee) {
1735
                
1736
            }
1737
            
1738
            try {
1739
                // the pid should be null when we try to get a no-exist sid
1740
                   Identifier non_exist_sid = new Identifier();
1741
                   non_exist_sid.setValue("no-sid-exist-123qwe");
1742
                   SystemMetadata result3 = MNodeService.getInstance(request).getSystemMetadata(session, non_exist_sid);
1743
                   fail("the getSystemMetadata(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1744
            } catch (NotFound ee) {
1745
                   
1746
            }
1747
            
1748
            try {
1749
                // the pid should be null when we try to get a no-exist sid
1750
                   Identifier non_exist_sid = new Identifier();
1751
                   non_exist_sid.setValue("no-sid-exist-123qwe");
1752
                    MNodeService.getInstance(request).describe(session, non_exist_sid);
1753
                   fail("the describe(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1754
               } catch (NotFound ee) {
1755
                   
1756
               }
1757
            
1758
            
1759
            //do another update with invalid series ids
1760
            Thread.sleep(1000);
1761
            Identifier newPid3 = new Identifier();
1762
            newPid3.setValue(generateDocumentId()+"3");
1763
            System.out.println("the third pid is "+newPid3.getValue());
1764
            InputStream object4 = new ByteArrayInputStream(str3.getBytes("UTF-8"));
1765
            SystemMetadata sysmeta4 = createSystemMetadata(newPid3, session.getSubject(), object4);
1766
            sysmeta4.setObsoletes(newPid2);
1767
            sysmeta4.setSeriesId(seriesId);
1768
            try {
1769
                MNodeService.getInstance(request).update(session, newPid2, object4, newPid3, sysmeta4);
1770
                fail("we can't reach here since the sid is using an old one ");
1771
            } catch (InvalidSystemMetadata eee) {
1772
                
1773
            } 
1774
            
1775
            sysmeta4.setSeriesId(newPid3);
1776
            try {
1777
                MNodeService.getInstance(request).update(session, newPid2, object4, newPid3, sysmeta4);
1778
                fail("we can't reach here since the sid is using the pid ");
1779
            } catch (InvalidSystemMetadata eee) {
1780
                
1781
            } 
1782
            
1783
        } catch (Exception e) {
1784
            fail(e.getMessage());
1785
        }
1786
        
1787
        
1788
        
1789
        
1790
    }
1791
}
(4-4/7)