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.CNodeService;
32
import edu.ucsb.nceas.metacat.dataone.MNodeService;
33
import edu.ucsb.nceas.metacat.properties.SkinPropertyService;
34
import edu.ucsb.nceas.metacat.service.ServiceService;
35
import edu.ucsb.nceas.utilities.IOUtil;
36
import gov.loc.repository.bagit.Bag;
37
import gov.loc.repository.bagit.BagFactory;
38
import gov.loc.repository.bagit.BagFile;
39
import gov.loc.repository.bagit.Manifest;
40

    
41
import java.io.ByteArrayInputStream;
42
import java.io.ByteArrayOutputStream;
43
import java.io.File;
44
import java.io.FileOutputStream;
45
import java.io.IOException;
46
import java.io.InputStream;
47
import java.io.UnsupportedEncodingException;
48
import java.math.BigInteger;
49
import java.net.URL;
50
import java.text.SimpleDateFormat;
51
import java.util.ArrayList;
52
import java.util.Calendar;
53
import java.util.Date;
54
import java.util.HashMap;
55
import java.util.Iterator;
56
import java.util.List;
57
import java.util.Map;
58
import java.util.Vector;
59

    
60
import junit.framework.Test;
61
import junit.framework.TestSuite;
62

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

    
105
/**
106
 * A JUnit test to exercise the Metacat Member Node service implementation.
107
 * This also tests a few of the D1NodeService superclass methods
108
 * 
109
 * @author cjones
110
 *
111
 */
112
public class MNodeServiceTest extends D1NodeServiceTest {
113

    
114
    private static String unmatchingEncodingFilePath = "test/incorrect-encoding-declaration.xml";
115
  /**
116
   * Set up the test fixtures
117
   * 
118
   * @throws Exception
119
   */
120
  @Before
121
  public void setUp() throws Exception {
122
    super.setUp();
123
    // set up the configuration for d1client
124
    Settings.getConfiguration().setProperty("D1Client.cnClassName", MockCNode.class.getName());
125
  }
126

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

    
193
  /**
194
   * Initial blank test
195
   */
196
  public void initialize() {
197
    assertTrue(1 == 1);
198
    
199
  }
200
  
201
  /**
202
   * Test getting a known object
203
   */
204
  public void testGet() {
205
    printTestHeader("testGet");
206

    
207
    try {
208
      Session session = getTestSession();
209
      Identifier guid = new Identifier();
210
      guid.setValue("testGet." + System.currentTimeMillis());
211
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
212
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
213
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
214
      InputStream result = MNodeService.getInstance(request).get(session, guid);
215
      // go back to beginning of original stream
216
      object.reset();
217
      // check
218
      assertTrue(object.available() > 0);
219
      assertTrue(result.available() > 0);
220
      assertTrue(IOUtils.contentEquals(result, object));
221
      
222
    } catch (UnsupportedEncodingException e) {
223
      e.printStackTrace();
224
      fail("Unexpected error: " + e.getMessage());
225

    
226
    } catch (InvalidToken e) {
227
      e.printStackTrace();
228
      fail("Unexpected error: " + e.getMessage());
229
      
230
    } catch (ServiceFailure e) {
231
      e.printStackTrace();
232
      fail("Unexpected error: " + e.getMessage());
233
      
234
    } catch (NotAuthorized e) {
235
      e.printStackTrace();
236
      fail("Unexpected error: " + e.getMessage());
237
      
238
    } catch (IdentifierNotUnique e) {
239
      e.printStackTrace();
240
      fail("Unexpected error: " + e.getMessage());
241
      
242
    } catch (UnsupportedType e) {
243
      e.printStackTrace();
244
      fail("Unexpected error: " + e.getMessage());
245
      
246
    } catch (InsufficientResources e) {
247
      e.printStackTrace();
248
      fail("Unexpected error: " + e.getMessage());
249
      
250
    } catch (InvalidSystemMetadata e) {
251
      e.printStackTrace();
252
      fail("Unexpected error: " + e.getMessage());
253
      
254
    } catch (NotImplemented e) {
255
      e.printStackTrace();
256
      fail("Unexpected error: " + e.getMessage());
257
      
258
    } catch (InvalidRequest e) {
259
      e.printStackTrace();
260
      fail("Unexpected error: " + e.getMessage());
261
      
262
    } catch (NotFound e) {
263
      e.printStackTrace();
264
      fail("Unexpected error: " + e.getMessage());
265
      
266
    } catch (Exception e) {
267
      e.printStackTrace();
268
      fail("Unexpected error: " + e.getMessage());
269
      
270
    }
271

    
272
  }
273

    
274
  /**
275
   * Test getting the system metadata of an object
276
   */
277
  public void testGetSystemMetadata() {    
278
    printTestHeader("testGetSystemMetadata");
279

    
280
    try {
281
      Session session = getTestSession();
282
      Identifier guid = new Identifier();
283
      guid.setValue("testGetSystemMetadata." + System.currentTimeMillis());
284
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
285
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
286
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
287
      SystemMetadata newsysmeta = MNodeService.getInstance(request).getSystemMetadata(session, pid);
288
      assertEquals(newsysmeta.getIdentifier().getValue(), sysmeta.getIdentifier().getValue());
289
      assertEquals(newsysmeta.getSeriesId(), null);
290
      
291
    } catch (UnsupportedEncodingException e) {
292
      e.printStackTrace();
293
      fail("Unexpected error: " + e.getMessage());
294

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

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

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

    
307
    } catch (IdentifierNotUnique e) {
308
      e.printStackTrace();
309
      fail("Unexpected error: " + e.getMessage());
310
      
311
    } catch (UnsupportedType e) {
312
      e.printStackTrace();
313
      fail("Unexpected error: " + e.getMessage());
314

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

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

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

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

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

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

    
339
    }
340
    
341
  }
342

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

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

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

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

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

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

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

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

    
413
    } catch (NotImplemented e) {
414
      e.printStackTrace();
415
      fail("Unexpected error: " + e.getMessage());
416

    
417
    } catch (InvalidRequest e) {
418
      e.printStackTrace();
419
      fail("Unexpected error: " + e.getMessage());
420

    
421
    } catch (Exception e) {
422
      e.printStackTrace();
423
      fail("Unexpected error: " + e.getMessage());
424

    
425
    }
426
      
427
  }
428

    
429
  /**
430
   * test object deletion
431
   */
432
  public void testDelete() {
433
    printTestHeader("testDelete");
434

    
435
    try {
436
      Session session = getTestSession();
437
      Identifier guid = new Identifier();
438
      guid.setValue("testDelete." + System.currentTimeMillis());
439
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
440
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
441
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
442
      
443
      // use MN admin to delete
444
      session = getMNSession();
445
      Identifier deletedPid = MNodeService.getInstance(request).delete(session, pid);
446
      assertEquals(pid.getValue(), deletedPid.getValue());
447
      // check that we cannot get the object
448
      session = getTestSession();
449
      InputStream deletedObject = null;
450
      try {
451
    	  deletedObject = MNodeService.getInstance(request).get(session, deletedPid);
452
      } catch (NotFound nf) {
453
    	  // this is expected
454
      }
455
	  assertNull(deletedObject);
456
      
457
    } catch (UnsupportedEncodingException e) {
458
      e.printStackTrace();
459
      
460
    } catch (Exception e) {
461
      e.printStackTrace();
462
      fail("Unexpected error: " + e.getMessage());
463

    
464
    } 
465

    
466
  }
467

    
468
  /**
469
   * Test object updating
470
   */
471
  public void testUpdate() {
472
    printTestHeader("testUpdate");
473
    
474
    try {
475
      Session session = getTestSession();
476
      Identifier guid = new Identifier();
477
      guid.setValue("testUpdate." + System.currentTimeMillis());
478
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
479
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
480
      Identifier newPid = new Identifier();
481
      newPid.setValue("testUpdate." + (System.currentTimeMillis() + 1)); // ensure it is different from original
482
      Identifier pid = 
483
        MNodeService.getInstance(request).create(session, guid, object, sysmeta);
484
      
485
      SystemMetadata newSysMeta = createSystemMetadata(newPid, session.getSubject(), object);
486
      newSysMeta.setArchived(true);
487
      // do the update
488
      Identifier updatedPid = 
489
        MNodeService.getInstance(request).update(session, pid, object, newPid, newSysMeta);
490
      
491
      // get the updated system metadata
492
      SystemMetadata updatedSysMeta = 
493
        MNodeService.getInstance(request).getSystemMetadata(session, updatedPid);
494

    
495
      assertEquals(updatedPid.getValue(), newPid.getValue());
496
      //assertTrue(updatedSysMeta.getObsolete(0).getValue().equals(pid.getValue()));
497
      //assertTrue(updatedSysMeta.getDerivedFrom(0).getValue().equals(pid.getValue())); 
498
      
499
      //try to update an archived object and need to get an exception
500
      Identifier newPid2 = new Identifier();
501
      newPid2.setValue("testUpdate." + (System.currentTimeMillis() + 2)); // ensure it is different from original
502
      SystemMetadata newSysMeta2 = createSystemMetadata(newPid2, session.getSubject(), object);
503
      try {
504
           updatedPid = 
505
                  MNodeService.getInstance(request).update(session, newPid, object, newPid2, newSysMeta2);
506
           fail("update an archived object should get an invalid request exception");
507
      } catch (Exception ee) {
508
          assertTrue( ee instanceof InvalidRequest);
509
      }
510
      
511
      //update the authoritative node on the existing pid (newPid)
512
      NodeReference newMN = new NodeReference();
513
      newMN.setValue("urn:node:river1");
514
      newSysMeta.setAuthoritativeMemberNode(newMN);
515
      newSysMeta.setArchived(false);
516
      MNodeService.getInstance(request).updateSystemMetadata(session, newPid, newSysMeta);
517
      try {
518
          updatedPid = 
519
                 MNodeService.getInstance(request).update(session, newPid, object, newPid2, newSysMeta2);
520
          fail("update an object on non-authoritatvie node should get anexception");
521
     } catch (Exception ee) {
522
         assertTrue( ee instanceof NotAuthorized);
523
     }
524
     //cn can succeed even though it updates an object on the non-authoritative node.
525
     Session cnSession = getCNSession();
526
     updatedPid = 
527
             MNodeService.getInstance(request).update(cnSession, newPid, object, newPid2, newSysMeta2);
528
     assertEquals(updatedPid.getValue(), newPid2.getValue());
529
    } catch (UnsupportedEncodingException e) {
530
      e.printStackTrace();
531
      fail("Unexpected error: " + e.getMessage());
532

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

    
537
    } catch (ServiceFailure e) {
538
      e.printStackTrace();
539
      fail("Unexpected error: " + e.getMessage());
540

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

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

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

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

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

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

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

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

    
573
    }
574
  }
575

    
576
  /**
577
   * We currently expect this unit test to fail because it should rely on a different member node
578
   * to retrieve the object from. Currently it gets the object from itself and throws 
579
   * and expected error for duplicate entry.
580
   * 
581
   */
582
  public void testReplicate() {
583
      printTestHeader("testReplicate");
584
      try {
585
        Session session = getTestSession();
586
        Identifier guid = new Identifier();
587
        guid.setValue("testReplicate." + System.currentTimeMillis());
588
        InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
589
        SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
590
        // save locally
591
        Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
592
        // get our node reference (attempting to replicate with self)
593
        NodeReference sourceNode = MNodeService.getInstance(request).getCapabilities().getIdentifier();
594
        // attempt to replicate with ourselves -- this should fail!
595
      boolean result = false;
596
      try {
597
        result = MNodeService.getInstance(request).replicate(session, sysmeta, sourceNode);
598
      } catch (Exception inu) {
599
        // we are expecting this to fail since we already have the doc
600
        result = true;
601
      }
602
      assertTrue(result);
603
      } catch (Exception e) {
604
        e.printStackTrace();
605
      fail("Probably not yet implemented: " + e.getMessage());
606
    }
607
  }
608

    
609
  /**
610
   * Test describing an object
611
   */
612
  public void testDescribe() {
613
    printTestHeader("testDescribe");
614

    
615
    try {
616
      Session session = getTestSession();
617
      Identifier guid = new Identifier();
618
      guid.setValue("testGetSystemMetadata." + System.currentTimeMillis());
619
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
620
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
621
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
622
      DescribeResponse describeResponse = MNodeService.getInstance(request).describe(session, pid);
623
      assertEquals(describeResponse.getDataONE_Checksum().getValue(), sysmeta.getChecksum().getValue());
624
      assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), sysmeta.getFormatId().getValue());
625
      
626
    } catch (UnsupportedEncodingException e) {
627
      e.printStackTrace();
628
      fail("Unexpected error: " + e.getMessage());
629

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

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

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

    
642
    } catch (IdentifierNotUnique e) {
643
      e.printStackTrace();
644
      fail("Unexpected error: " + e.getMessage());
645
      
646
    } catch (UnsupportedType e) {
647
      e.printStackTrace();
648
      fail("Unexpected error: " + e.getMessage());
649

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

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

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

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

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

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

    
674
    }
675
  }
676

    
677
  /**
678
   * Test getting the checksum of an object
679
   */
680
  public void testGetChecksum() {
681
    printTestHeader("testGetChecksum");
682

    
683
    try {
684
      Session session = getTestSession();
685
      Identifier guid = new Identifier();
686
      guid.setValue("testGetChecksum." + System.currentTimeMillis());
687
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
688
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
689
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
690
      Checksum checksum = MNodeService.getInstance(request).getChecksum(session, pid, "MD5");
691
      assertEquals(checksum.getValue(), sysmeta.getChecksum().getValue());
692
    
693
    } catch (UnsupportedEncodingException e) {
694
      e.printStackTrace();
695
      fail("Unexpected error: " + e.getMessage());
696

    
697
    } catch (InvalidToken e) {
698
      e.printStackTrace();
699
      fail("Unexpected error: " + e.getMessage());
700

    
701
    } catch (ServiceFailure e) {
702
      e.printStackTrace();
703
      fail("Unexpected error: " + e.getMessage());
704

    
705
    } catch (NotAuthorized e) {
706
      e.printStackTrace();
707
      fail("Unexpected error: " + e.getMessage());
708

    
709
    } catch (IdentifierNotUnique e) {
710
      e.printStackTrace();
711
      fail("Unexpected error: " + e.getMessage());
712

    
713
    } catch (UnsupportedType e) {
714
      e.printStackTrace();
715
      fail("Unexpected error: " + e.getMessage());
716

    
717
    } catch (InsufficientResources e) {
718
      e.printStackTrace();
719
      fail("Unexpected error: " + e.getMessage());
720

    
721
    } catch (InvalidSystemMetadata e) {
722
      e.printStackTrace();
723
      fail("Unexpected error: " + e.getMessage());
724

    
725
    } catch (NotImplemented e) {
726
      e.printStackTrace();
727
      fail("Unexpected error: " + e.getMessage());
728

    
729
    } catch (InvalidRequest e) {
730
      e.printStackTrace();
731
      fail("Unexpected error: " + e.getMessage());
732

    
733
    } catch (NotFound e) {
734
      e.printStackTrace();
735
      fail("Unexpected error: " + e.getMessage());
736

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

    
741
    }
742
    
743
  }
744

    
745
  /**
746
   * Testing listing objects on the Member Node
747
   */
748
  public void testListObjects() {
749
      printTestHeader("testListObjects");
750
  
751
      try {
752
  
753
        Session session = getTestSession();
754
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
755
        Date startTime = sdf.parse("2010-01-01");
756
        Date endTime = new Date();
757
        ObjectFormatIdentifier objectFormatId = null;
758
        boolean replicaStatus = false;
759
        int start = 0;
760
        int count = 1;
761
      
762
        // insert at least one object 
763
        testCreate();
764
        // now check that we have at least one
765
        ObjectList objectList = 
766
          MNodeService.getInstance(request).listObjects(session, startTime, endTime, 
767
              objectFormatId, null, replicaStatus, start, count);
768
        assertNotNull(objectList);
769
        assertTrue(objectList.getCount() == count);
770
        assertTrue(objectList.getStart() == 0);
771
        assertTrue(objectList.getTotal() >= 1);
772
        
773
      } catch (Exception e) {
774
        e.printStackTrace();
775
        fail("Unexpected error: " + e.getMessage());
776
  
777
      }
778
  }
779

    
780
  public void testGetCapabilities() {
781
      printTestHeader("testGetCapabilities");
782
    try {
783
      Node node = MNodeService.getInstance(request).getCapabilities();
784
      ByteArrayOutputStream baos = new ByteArrayOutputStream();
785
      TypeMarshaller.marshalTypeToOutputStream(node, baos);
786
      assertNotNull(node);
787
      // TODO: should probably test other parts of the node information
788
      
789
    } catch (JiBXException e) {
790
        e.printStackTrace();
791
        fail("The node instance couldn't be parsed correctly:" + e.getMessage());
792
        
793
    } catch (IOException e) {
794
        e.printStackTrace();
795
        fail("The node instance couldn't be read correctly:" + e.getMessage());
796
        
797
    } catch (Exception e) {
798
        e.printStackTrace();
799
        fail("Probably not yet implemented: " + e.getMessage());
800
        
801
    }
802
    
803
  }
804

    
805
  public void testPing() {
806

    
807
    try {
808
      Date mnDate = MNodeService.getInstance(request).ping();
809
      assertTrue(mnDate != null);
810
      
811
    } catch (NotImplemented e) {
812
      e.printStackTrace();
813
      fail("Unexpected error: " + e.getMessage());
814

    
815
    } catch (ServiceFailure e) {
816
      e.printStackTrace();
817
      fail("Unexpected error: " + e.getMessage());
818

    
819
    }  catch (InsufficientResources e) {
820
      e.printStackTrace();
821
      fail("Unexpected error: " + e.getMessage());
822

    
823
    }
824
    
825
  }
826

    
827
  public void testSynchronizationFailed() {
828
    printTestHeader("testSynchronizationFailed");
829
    try {
830
        Session session = getTestSession();
831
        
832
        // create the object
833
        Identifier pid = new Identifier();
834
        pid.setValue("testSynchronizationFailed." + System.currentTimeMillis());
835
        InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
836
        SystemMetadata sysmeta = createSystemMetadata(pid, session.getSubject(), object);
837
        Identifier retPid = MNodeService.getInstance(request).create(session, pid, object, sysmeta);
838
        assertEquals(retPid.getValue(), pid.getValue());
839
        
840
        // pretend the sync failed, act as CN
841
      SynchronizationFailed syncFailed = 
842
        new SynchronizationFailed("0000", "Testing Synch Failure");
843
      syncFailed.setPid(pid.getValue());
844
      session = getCNSession();
845
      MNodeService.getInstance(request).synchronizationFailed(session, syncFailed );
846
    } catch (Exception e) {
847
      e.printStackTrace();
848
        fail("Unexpected error: " + e.getMessage());
849
    }
850

    
851
  }
852

    
853
  public void testSystemMetadataChanged() {
854
      printTestHeader("testSystemMetadataChanged");
855
      try {
856
          Session session = getTestSession();
857
          
858
          // create the object
859
          Identifier pid = new Identifier();
860
          pid.setValue("testSystemMetadataChanged." + System.currentTimeMillis());
861
          Identifier sid = new Identifier();
862
          sid.setValue("testSystemMetadataChangedSid."+System.currentTimeMillis());
863
          InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
864
          SystemMetadata sysmeta = createSystemMetadata(pid, session.getSubject(), object);
865
          sysmeta.setSeriesId(sid);
866
          Identifier retPid = MNodeService.getInstance(request).create(session, pid, object, sysmeta);
867
          assertEquals(retPid.getValue(), pid.getValue());
868
          
869
          // pretend the system metadata changed on the CN
870
          MNodeService.getInstance(request).systemMetadataChanged(session, 
871
                  retPid, 5000L, Calendar.getInstance().getTime());
872
          MNodeService.getInstance(request).systemMetadataChanged(session, 
873
                  sid, 5000L, Calendar.getInstance().getTime());
874
          edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).systemMetadataChanged(session, 
875
                  retPid, 5000L, Calendar.getInstance().getTime());
876
          edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).systemMetadataChanged(session, 
877
                  sid, 5000L, Calendar.getInstance().getTime());
878
          
879
      } catch (Exception e) {
880
          if (e instanceof NotAuthorized) {
881
              // only CN subjects can call this
882
              // TODO: use a CN certificate in the tests
883
          } else {
884
              fail("Unexpected error: " + e.getMessage());
885
              
886
          }
887
      }
888

    
889
    }
890

    
891
  public void testGetLogRecords() {
892
    printTestHeader("testLogRecords");
893

    
894
    try {
895
	    Log log = null;
896
	    Session session = getCNSession();
897
	    Date fromDate = new Date();
898
	    Calendar calendar = Calendar.getInstance();
899
	    calendar.setTime(fromDate);
900
	    calendar.roll(Calendar.YEAR, false);
901
	    fromDate = calendar.getTime();
902
	    Date toDate = new Date();
903
	    Event event = Event.CREATE;
904
	    int start = 0;
905
	    int count = 1;
906
    
907
      log = MNodeService.getInstance(request).getLogRecords(session, fromDate, toDate, 
908
        event.xmlValue(), null, start, count);
909
      
910
      assertNotNull(log);      
911
      assertTrue(log.getCount() == count);
912
      assertTrue(log.getStart() == start);
913
      assertTrue(log.getTotal() >= 1);
914
        
915
    } catch (Exception e) {
916
      e.printStackTrace();
917
      fail("Unexpected error: " + e.getMessage());
918

    
919
    }
920
  }
921

    
922
  /**
923
   * Testing setting access on a known object
924
   */
925
  public void testSetAccessPolicy() {
926
    printTestHeader("testSetAccess");
927
    
928
    //boolean accessWasSet = false;
929
    //
930
    //try {
931
    //  // create an object to set access on
932
    //  Session session = getTestSession();
933
    //  Identifier guid = new Identifier();
934
    //  guid.setValue("testSetAccess." + System.currentTimeMillis());
935
    //  InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
936
    //  SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
937
    //  Identifier pid = 
938
    //    MNodeService.getInstance(request).create(session, guid, object, sysmeta);
939
    //  // set the access
940
    //  AccessPolicy accessPolicy = new AccessPolicy();
941
    //  AccessRule allow = new AccessRule();
942
    //  allow.addPermission(Permission.WRITE);
943
    //  Subject publicSubject = new Subject();
944
    //  publicSubject.setValue(Constants.SUBJECT_PUBLIC);
945
    //  allow.addSubject(publicSubject);
946
    //  accessPolicy.addAllow(allow);
947
    //  
948
    //  accessWasSet = 
949
    //    MNodeService.getInstance(request).setAccessPolicy(session, pid, accessPolicy);
950
    //  assertTrue(accessWasSet);
951
    //  // test that it is enforced
952
    //  session.setSubject(publicSubject);
953
    //  boolean isAuthorized = MNodeService.getInstance(request).isAuthorized(session, pid, Permission.WRITE);
954
    //  assertTrue(isAuthorized);
955
    //
956
    //} catch (UnsupportedEncodingException e) {
957
    //  e.printStackTrace();
958
    //  
959
    //} catch (InvalidToken e) {
960
    //  e.printStackTrace();
961
    //  fail("Unexpected error: " + e.getMessage());
962
    //  
963
    //} catch (ServiceFailure e) {
964
    //  e.printStackTrace();
965
    //  fail("Unexpected error: " + e.getMessage());
966
    //  
967
    //} catch (NotAuthorized e) {
968
    //  e.printStackTrace();
969
    //  fail("Unexpected error: " + e.getMessage());
970
    //  
971
    //} catch (IdentifierNotUnique e) {
972
    //  e.printStackTrace();
973
    //  fail("Unexpected error: " + e.getMessage());
974
    //  
975
    //} catch (UnsupportedType e) {
976
    //  e.printStackTrace();
977
    //  fail("Unexpected error: " + e.getMessage());
978
    //  
979
    //} catch (InsufficientResources e) {
980
    //  e.printStackTrace();
981
    //  fail("Unexpected error: " + e.getMessage());
982
    //  
983
    //} catch (InvalidSystemMetadata e) {
984
    //  e.printStackTrace();
985
    //  fail("Unexpected error: " + e.getMessage());
986
    //  
987
    //} catch (NotImplemented e) {
988
    //  e.printStackTrace();
989
    //  fail("Unexpected error: " + e.getMessage());
990
    //  
991
    //} catch (InvalidRequest e) {
992
    //  e.printStackTrace();
993
    //  fail("Unexpected error: " + e.getMessage());
994
    //  
995
    //} catch (NotFound e) {
996
    //  e.printStackTrace();
997
    //  fail("Unexpected error: " + e.getMessage());
998
    //  
999
    //} catch (Exception e) {
1000
    //  e.printStackTrace();
1001
    //  fail("Unexpected error: " + e.getMessage());
1002
    //  
1003
    //}
1004
      
1005
  }
1006

    
1007
  /**
1008
   * Test if a subject is authorized to read a known object
1009
   */
1010
  public void testIsAuthorized() {
1011
    printTestHeader("testIsAuthorized");
1012
    
1013
    try {
1014
      Session session = getTestSession();
1015
      Identifier guid = new Identifier();
1016
      guid.setValue("testIsAuthorized." + System.currentTimeMillis());
1017
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1018
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1019
      //non-public readable
1020
      AccessPolicy accessPolicy = new AccessPolicy();
1021
      AccessRule allow = new AccessRule();
1022
      allow.addPermission(Permission.READ);
1023
      Subject subject = new Subject();
1024
      subject.setValue("cn=test2,dc=dataone,dc=org");
1025
      allow.addSubject(subject);
1026
      accessPolicy.addAllow(allow);
1027
      sysmeta.setAccessPolicy(accessPolicy);
1028
      Identifier pid = 
1029
        MNodeService.getInstance(request).create(session, guid, object, sysmeta);
1030
      boolean isAuthorized = 
1031
        MNodeService.getInstance(request).isAuthorized(session, pid, Permission.READ);
1032
      assertEquals(isAuthorized, true);
1033
      isAuthorized = 
1034
              MNodeService.getInstance(request).isAuthorized(session, pid, Permission.WRITE);
1035
      assertEquals(isAuthorized, true);
1036
      try {
1037
          isAuthorized = 
1038
                  MNodeService.getInstance(request).isAuthorized(null, pid, Permission.READ);
1039
          fail("we can reach here");
1040
      } catch(NotAuthorized ee) {
1041
          
1042
      }
1043
      
1044
     
1045
      Session session2= getAnotherSession();
1046
      isAuthorized = 
1047
              MNodeService.getInstance(request).isAuthorized(session2, pid, Permission.READ);
1048
      assertEquals(isAuthorized, true);
1049
     
1050
      try {
1051
          isAuthorized = 
1052
                  MNodeService.getInstance(request).isAuthorized(session2, pid, Permission.WRITE);
1053
          fail("we can reach here");
1054
      } catch(NotAuthorized ee) {
1055
          
1056
      }
1057
      
1058
    
1059
      try {
1060
          isAuthorized = 
1061
                  MNodeService.getInstance(request).isAuthorized(session2, pid, Permission.CHANGE_PERMISSION);
1062
          fail("we can reach here");
1063
      } catch(NotAuthorized ee) {
1064
          
1065
      }
1066
     
1067
      
1068
    } catch (UnsupportedEncodingException e) {
1069
      e.printStackTrace();
1070
      fail("Unexpected error: " + e.getMessage());
1071

    
1072
    } catch (InvalidToken e) {
1073
      e.printStackTrace();
1074
      fail("Unexpected error: " + e.getMessage());
1075

    
1076
    } catch (ServiceFailure e) {
1077
      e.printStackTrace();
1078
      fail("Unexpected error: " + e.getMessage());
1079

    
1080
    } catch (NotAuthorized e) {
1081
      e.printStackTrace();
1082
      fail("Unexpected error: " + e.getMessage());
1083

    
1084
    } catch (IdentifierNotUnique e) {
1085
      e.printStackTrace();
1086
      fail("Unexpected error: " + e.getMessage());
1087

    
1088
    } catch (UnsupportedType e) {
1089
      e.printStackTrace();
1090
      fail("Unexpected error: " + e.getMessage());
1091

    
1092
    } catch (InsufficientResources e) {
1093
      e.printStackTrace();
1094
      fail("Unexpected error: " + e.getMessage());
1095

    
1096
    } catch (InvalidSystemMetadata e) {
1097
      e.printStackTrace();
1098
      fail("Unexpected error: " + e.getMessage());
1099

    
1100
    } catch (NotImplemented e) {
1101
      e.printStackTrace();
1102
      fail("Unexpected error: " + e.getMessage());
1103

    
1104
    } catch (InvalidRequest e) {
1105
      e.printStackTrace();
1106
      fail("Unexpected error: " + e.getMessage());
1107

    
1108
    } catch (Exception e) {
1109
      e.printStackTrace();
1110
      fail("Unexpected error: " + e.getMessage());
1111

    
1112
    }
1113
  }
1114
  
1115
  /**
1116
   * Test if node admin is authorized to read a known object
1117
   */
1118
  public void testIsAdminAuthorized() {
1119
    printTestHeader("testIsAdminAuthorized");
1120
    
1121
    try {
1122
      Session session = getTestSession();
1123
      Identifier guid = new Identifier();
1124
      guid.setValue("testIsAdminAuthorized." + System.currentTimeMillis());
1125
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1126
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1127
      Identifier pid = 
1128
        MNodeService.getInstance(request).create(session, guid, object, sysmeta);
1129
      
1130
      // test as public - read
1131
      boolean isAuthorized = 
1132
        MNodeService.getInstance(request).isAuthorized(null, pid, Permission.READ);
1133
      assertEquals(isAuthorized, true);
1134
      
1135
      // test as public - change perm
1136
      isAuthorized = 
1137
        MNodeService.getInstance(request).isAuthorized(null, pid, Permission.CHANGE_PERMISSION);
1138
      assertEquals(isAuthorized, false);
1139
      
1140
      //test write by another session
1141
      Session session2 = getAnotherSession();
1142
      isAuthorized = 
1143
              MNodeService.getInstance(request).isAuthorized(session2, pid, Permission.WRITE);
1144
            assertEquals(isAuthorized, false);
1145
      
1146
      // test as admin
1147
      isAuthorized = 
1148
    	        MNodeService.getInstance(request).isAuthorized(getMNSession(), pid, Permission.CHANGE_PERMISSION);
1149
    	      assertEquals(isAuthorized, true);
1150
     // test as cn
1151
    	isAuthorized = 
1152
    	                MNodeService.getInstance(request).isAuthorized(getCNSession(), pid, Permission.CHANGE_PERMISSION);
1153
    	              assertEquals(isAuthorized, true);      
1154
      
1155
    } catch (Exception e) {
1156
      e.printStackTrace();
1157
      fail("Unexpected error: " + e.getMessage());
1158

    
1159
    } 
1160
  }
1161

    
1162
  
1163
  public void testIsEquivIdentityAuthorized() {
1164
      printTestHeader("testIsEquivIdentityAuthorized");
1165

    
1166
      try {
1167
          Session session = new Session();
1168
          Subject s = new Subject();
1169
          s.setValue("cn=test,dc=dataone,dc=org");
1170
          session.setSubject(s);
1171
          
1172
          Identifier pid = new Identifier();
1173
          pid.setValue("testIsEquivIdentityAuthorized." + System.currentTimeMillis());
1174
          InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1175
          SystemMetadata sysmeta = createSystemMetadata(pid, session.getSubject(), object);
1176
          
1177
          // reset the access policy to only allow 'self' read (no public)
1178
          AccessPolicy ap = new AccessPolicy();
1179
          AccessRule ar = new AccessRule();
1180
          List<Subject> sList = new ArrayList<Subject>();
1181
          sList.add(session.getSubject());
1182
          ar.setSubjectList(sList);
1183
          List<Permission> permList = new ArrayList<Permission>();
1184
          permList.add(Permission.CHANGE_PERMISSION);
1185
          ar.setPermissionList(permList);
1186
          ap.addAllow(ar);
1187
          sysmeta.setAccessPolicy(ap);
1188
          
1189
          // save it
1190
          Identifier retPid = CNodeService.getInstance(request).registerSystemMetadata(session, pid, sysmeta);
1191
          assertEquals(pid.getValue(), retPid.getValue());
1192
          
1193
          //check it against an equivalent identity not listed in the access policy
1194
          session.getSubject().setValue("cn=newSubject,dc=dataone,dc=org");
1195
          SubjectInfo subjectInfo = new SubjectInfo();
1196
          Person person = new Person();
1197
          person.setSubject(session.getSubject());
1198
          List<String> givenNames = new ArrayList<String>();
1199
          givenNames.add("New");
1200
          person.setGivenNameList(givenNames);
1201
          person.setFamilyName("Subject");
1202
          
1203
          // add equivalent identities
1204
          List<Subject> equivIdentities = new ArrayList<Subject>();
1205
          Subject mappedSubject2 = new Subject();
1206
          mappedSubject2.setValue("cn=test2,dc=dataone,dc=org");
1207
          equivIdentities.add(mappedSubject2);
1208
          
1209
          Subject mappedSubject = new Subject();
1210
          mappedSubject.setValue("cn=test,dc=dataone,dc=org");
1211
          equivIdentities.add(mappedSubject);          
1212
          
1213
          person.setEquivalentIdentityList(equivIdentities);
1214
          
1215
          List<Person> personList = new ArrayList<Person>();
1216
          personList.add(person);
1217
          subjectInfo.setPersonList(personList);
1218
          
1219
          // update the session to include subject info with a mapped identity
1220
          session.setSubjectInfo(subjectInfo);
1221
          boolean result = CNodeService.getInstance(request).isAuthorized(session, pid, Permission.READ);
1222
          assertTrue(result);
1223
        
1224
    } catch (Exception e) {
1225
        e.printStackTrace();
1226
        
1227
    }
1228
    
1229
  }
1230

    
1231
/**
1232
   * Test object creation failure when there is a space in the identifier
1233
   */
1234
  public void testCreateInvalidIdentifier() {
1235
    printTestHeader("testCreateInvalidIdentifier");
1236
    
1237
    try {
1238
      Session session = getTestSession();
1239
      Identifier guid = new Identifier();
1240
      guid.setValue("testCreate withspace." + System.currentTimeMillis());
1241
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1242
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1243
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
1244
      fail("Should not be able to create with whitespace in indentifier");
1245
    } catch (InvalidRequest e) {
1246
    	// expect that this request fails
1247
        assertTrue(true);
1248
    } catch (Exception e) {
1249
      e.printStackTrace();
1250
      fail("Unexpected error: " + e.getMessage());
1251
    }
1252
      
1253
  }
1254
  
1255
	/**
1256
	 * Test getting a known object
1257
	 */
1258
	public void testGetPackage() {
1259
		printTestHeader("testGetPackage");
1260

    
1261
		try {
1262
			Session session = getTestSession();
1263
			Identifier guid = new Identifier();
1264
			guid.setValue("testGetPackage." + System.currentTimeMillis());
1265
			InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1266
			SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1267
			Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
1268
			InputStream bagStream = MNodeService.getInstance(request).getPackage(session, null, pid);
1269
			File bagFile = File.createTempFile("bagit.", ".zip");
1270
			IOUtils.copy(bagStream, new FileOutputStream(bagFile));
1271
			BagFactory bagFactory = new BagFactory();
1272
			Bag bag = bagFactory.createBag(bagFile);
1273
			InputStream result = bag.getPayload().iterator().next().newInputStream();
1274
			
1275
			// go back to beginning of original stream
1276
			object.reset();
1277
			// check
1278
			assertTrue(object.available() > 0);
1279
			assertTrue(result.available() > 0);
1280
			assertTrue(IOUtils.contentEquals(result, object));
1281
			
1282
			// clean up
1283
			bagFile.delete();
1284

    
1285
		} catch (Exception e) {
1286
			e.printStackTrace();
1287
			fail("Unexpected error: " + e.getMessage());
1288
		}
1289
	}
1290
	
1291
	
1292
	/**
1293
	 * Test getting a known object
1294
	 */
1295
	public void testGetOREPackage() {
1296
		printTestHeader("testGetOREPackage");
1297

    
1298
		try {
1299
			
1300
			// construct the ORE package
1301
			Identifier resourceMapId = new Identifier();
1302
			//resourceMapId.setValue("doi://1234/AA/map.1.1");
1303
			resourceMapId.setValue("testGetOREPackage." + System.currentTimeMillis());
1304
			Identifier metadataId = new Identifier();
1305
			metadataId.setValue("doi://1234/AA/meta.1." + + System.currentTimeMillis());
1306
			List<Identifier> dataIds = new ArrayList<Identifier>();
1307
			Identifier dataId = new Identifier();
1308
			dataId.setValue("doi://1234/AA/data.1." + System.currentTimeMillis());
1309
			Identifier dataId2 = new Identifier();
1310
			dataId2.setValue("doi://1234/AA/data.2." + System.currentTimeMillis());
1311
			dataIds.add(dataId);
1312
			dataIds.add(dataId2);
1313
			Map<Identifier, List<Identifier>> idMap = new HashMap<Identifier, List<Identifier>>();
1314
			idMap.put(metadataId, dataIds);
1315
			ResourceMapFactory rmf = ResourceMapFactory.getInstance();
1316
			ResourceMap resourceMap = rmf.createResourceMap(resourceMapId, idMap);
1317
			assertNotNull(resourceMap);
1318
			String rdfXml = ResourceMapFactory.getInstance().serializeResourceMap(resourceMap);
1319
			assertNotNull(rdfXml);
1320
			
1321
			Session session = getTestSession();
1322
			InputStream object = null;
1323
			SystemMetadata sysmeta = null;
1324
			
1325
			// save the data objects (data just contains their ID)
1326
			InputStream dataObject1 = new ByteArrayInputStream(dataId.getValue().getBytes("UTF-8"));
1327
			sysmeta = createSystemMetadata(dataId, session.getSubject(), dataObject1);
1328
			MNodeService.getInstance(request).create(session, dataId, dataObject1, sysmeta);
1329
			// second data file
1330
			InputStream dataObject2 = new ByteArrayInputStream(dataId2.getValue().getBytes("UTF-8"));
1331
			sysmeta = createSystemMetadata(dataId2, session.getSubject(), dataObject2);
1332
			MNodeService.getInstance(request).create(session, dataId2, dataObject2, sysmeta);
1333
			// metadata file
1334
			InputStream metadataObject = new ByteArrayInputStream(metadataId.getValue().getBytes("UTF-8"));
1335
			sysmeta = createSystemMetadata(metadataId, session.getSubject(), metadataObject);
1336
			MNodeService.getInstance(request).create(session, metadataId, metadataObject, sysmeta);
1337
						
1338
			// save the ORE object
1339
			object = new ByteArrayInputStream(rdfXml.getBytes("UTF-8"));
1340
			sysmeta = createSystemMetadata(resourceMapId, session.getSubject(), object);
1341
			sysmeta.setFormatId(ObjectFormatCache.getInstance().getFormat("http://www.openarchives.org/ore/terms").getFormatId());
1342
			Identifier pid = MNodeService.getInstance(request).create(session, resourceMapId, object, sysmeta);
1343
			
1344
			// get the package we uploaded
1345
			InputStream bagStream = MNodeService.getInstance(request).getPackage(session, null, pid);
1346
			File bagFile = File.createTempFile("bagit.", ".zip");
1347
			IOUtils.copy(bagStream, new FileOutputStream(bagFile));
1348
			BagFactory bagFactory = new BagFactory();
1349
			Bag bag = bagFactory.createBag(bagFile);
1350
			Iterator<Manifest> manifestIter = bag.getTagManifests().iterator();
1351
			while (manifestIter.hasNext()) {
1352
				String filepath = manifestIter.next().getFilepath();
1353
				BagFile entryFile = bag.getBagFile(filepath);
1354
				InputStream result = entryFile.newInputStream();
1355
				// check ORE
1356
				if (filepath.contains(resourceMapId.getValue())) {
1357
					object.reset();
1358
					assertTrue(object.available() > 0);
1359
					assertTrue(result.available() > 0);
1360
					assertTrue(IOUtils.contentEquals(result, object));
1361
				}
1362
				// check metadata
1363
				if (filepath.contains(metadataId.getValue())) {
1364
					metadataObject.reset();
1365
					assertTrue(metadataObject.available() > 0);
1366
					assertTrue(result.available() > 0);
1367
					assertTrue(IOUtils.contentEquals(result, metadataObject));
1368
				}
1369
				if (filepath.contains(dataId.getValue())) {
1370
					dataObject1.reset();
1371
					assertTrue(dataObject1.available() > 0);
1372
					assertTrue(result.available() > 0);
1373
					assertTrue(IOUtils.contentEquals(result, dataObject1));
1374
				}
1375
				if (filepath.contains(dataId2.getValue())) {
1376
					dataObject2.reset();
1377
					assertTrue(dataObject2.available() > 0);
1378
					assertTrue(result.available() > 0);
1379
					assertTrue(IOUtils.contentEquals(result, dataObject2));
1380
				}
1381
				
1382
				
1383
			}
1384
			
1385
			// clean up
1386
			bagFile.delete();
1387
			
1388
			// test the ORE lookup
1389
			List<Identifier> oreIds = MNodeService.getInstance(request).lookupOreFor(metadataId, true);
1390
			assertTrue(oreIds.contains(resourceMapId));
1391

    
1392
		} catch (Exception e) {
1393
			e.printStackTrace();
1394
			fail("Unexpected error: " + e.getMessage());
1395
		}
1396
	}
1397
	
1398
	/**
1399
     * Test the extra "delete information" was added to the NotFoundException
1400
     * if the object was delete in the following methods:
1401
     * MN.get
1402
     * MN.getSystemmetadata
1403
     * MN.describe
1404
     * MN.getChecksum
1405
     * MN.getRelica
1406
     */
1407
    public void testReadDeletedObject() {
1408
        printTestHeader("testDelete");
1409

    
1410
        try {
1411
          Session session = getTestSession();
1412
          Identifier guid = new Identifier();
1413
          guid.setValue("testDelete." + System.currentTimeMillis());
1414
          InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1415
          SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1416
          Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
1417
          Thread.sleep(3000);
1418
          // use MN admin to delete
1419
          session = getMNSession();
1420
          Identifier deletedPid = MNodeService.getInstance(request).delete(session, pid);
1421
          System.out.println("after deleting");
1422
          assertEquals(pid.getValue(), deletedPid.getValue());
1423
          // check that we cannot get the object
1424
          session = getTestSession();
1425
          InputStream deletedObject = null;
1426
          try {
1427
              //System.out.println("before read ===============");
1428
              deletedObject = MNodeService.getInstance(request).get(session, deletedPid);
1429
              //System.out.println("after read ===============");
1430
          } catch (NotFound nf) {
1431
              assertTrue(nf.getMessage().contains("deleted"));
1432
          }
1433
          try {
1434
              //System.out.println("before read ===============");
1435
              SystemMetadata sysmeta2 = MNodeService.getInstance(request).getSystemMetadata(session, deletedPid);
1436
              //System.out.println("after read ===============");
1437
          } catch (NotFound nf) {
1438
              //System.out.println("the exception is "+nf.getMessage());
1439
              assertTrue(nf.getMessage().contains("deleted"));
1440
          }
1441
          
1442
          try {
1443
              //System.out.println("before read ===============");
1444
              DescribeResponse describeResponse = MNodeService.getInstance(request).describe(session, pid);
1445
              //System.out.println("after read ===============");
1446
          } catch (NotFound nf) {
1447
              //System.out.println("the exception is "+nf.getMessage());
1448
              assertTrue(nf.getMessage().contains("deleted"));
1449
          }
1450
          
1451
          try {
1452
              //System.out.println("before read ===============");
1453
              Checksum checksum = MNodeService.getInstance(request).getChecksum(session, pid, "MD5");
1454
              //System.out.println("after read ===============");
1455
          } catch (NotFound nf) {
1456
              //System.out.println("the exception 3 is "+nf.getMessage());
1457
              assertTrue(nf.getMessage().contains("deleted"));
1458
          }
1459
          
1460
          try {
1461
              //System.out.println("before read ===============");
1462
              boolean isAuthorized = 
1463
                      MNodeService.getInstance(request).isAuthorized(session, pid, Permission.READ);
1464
              //System.out.println("after read ===============");
1465
          } catch (NotFound nf) {
1466
              System.out.println("the exception 4 is "+nf.getMessage());
1467
              assertTrue(nf.getMessage().contains("deleted"));
1468
          }
1469
          
1470
          assertNull(deletedObject);
1471
          
1472
        } catch (UnsupportedEncodingException e) {
1473
          e.printStackTrace();
1474
          
1475
        } catch (Exception e) {
1476
          e.printStackTrace();
1477
          fail("Unexpected error: " + e.getMessage());
1478

    
1479
        } 
1480
    }
1481
    
1482
    /**
1483
     * Test to create and update a metadata which xml declaration is ASCII, but actually
1484
     * has some special charaters. The saved document should has the same bytes as the origianl.
1485
     */
1486
    public void testCreateAndUpdateXMLWithUnmatchingEncoding() throws Exception {
1487
          String algorithm = "md5";
1488
          Session session = getTestSession();
1489
          Identifier guid = new Identifier();
1490
          guid.setValue("testCreateAndUpdate." + System.currentTimeMillis());
1491
          InputStream object = new ByteArrayInputStream(FileUtils.readFileToByteArray(new File(unmatchingEncodingFilePath)));
1492
          Checksum orgChecksum = ChecksumUtil.checksum(object, algorithm);
1493
          //System.out.println("the original checksum is "+orgChecksum.getValue());
1494
          SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1495
          Identifier pid = 
1496
            MNodeService.getInstance(request).create(session, guid, object, sysmeta);
1497
          InputStream readResult = MNodeService.getInstance(request).get(session, pid);
1498
          byte[] readBytes = IOUtils.toByteArray(readResult);
1499
          Checksum checksum1 = ChecksumUtil.checksum(readBytes, algorithm);
1500
          //System.out.println("the read checksum1 is "+checksum1.getValue());
1501
          assertEquals(orgChecksum.getValue(), checksum1.getValue());
1502
          
1503
          Identifier newPid = new Identifier();
1504
          newPid.setValue("testCreateAndUpdate." + (System.currentTimeMillis() + 1)); // ensure it is different from original
1505
          SystemMetadata newSysMeta = createSystemMetadata(newPid, session.getSubject(), object);
1506
                
1507
          // do the update
1508
          Identifier updatedPid = 
1509
            MNodeService.getInstance(request).update(session, pid, object, newPid, newSysMeta);
1510
          InputStream readResult2 = MNodeService.getInstance(request).get(session, updatedPid);
1511
          byte[] readBytes2 = IOUtils.toByteArray(readResult2);
1512
          Checksum checksum2 = ChecksumUtil.checksum(readBytes2, algorithm);
1513
          assertEquals(orgChecksum.getValue(), checksum2.getValue());
1514
          //System.out.println("the read checksum2 is "+checksum2.getValue());
1515

    
1516
          
1517
    }
1518
  
1519
    /**
1520
     * Test the method - get api  for a speicified SID
1521
     */
1522
    public void testGetSID() {
1523
        String str1 = "object1";
1524
        String str2 = "object2";
1525
        String str3 = "object3";
1526
        Date fromDate = new Date();
1527
        Calendar calendar = Calendar.getInstance();
1528
        calendar.setTime(fromDate);
1529
        calendar.roll(Calendar.YEAR, false);
1530
        fromDate = calendar.getTime();
1531
        try {
1532
            //insert test documents with a series id
1533
            Session session = getTestSession();
1534
            Identifier guid = new Identifier();
1535
            guid.setValue(generateDocumentId());
1536
            InputStream object1 = new ByteArrayInputStream(str1.getBytes("UTF-8"));
1537
            SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object1);
1538
            String sid1= "sid."+System.nanoTime();
1539
            Identifier seriesId = new Identifier();
1540
            seriesId.setValue(sid1);
1541
            System.out.println("the first sid is "+seriesId.getValue());
1542
            sysmeta.setSeriesId(seriesId);
1543
            MNodeService.getInstance(request).create(session, guid, object1, sysmeta);
1544
            System.out.println("the first pid is "+guid.getValue());
1545
            //test the get(pid) for v2
1546
            InputStream result = MNodeService.getInstance(request).get(session, guid);
1547
            // go back to beginning of original stream
1548
            object1.reset();
1549
            // check
1550
            assertTrue(object1.available() > 0);
1551
            assertTrue(result.available() > 0);
1552
            assertTrue(IOUtils.contentEquals(result, object1));
1553
            // test the get(id) for v2
1554
            InputStream result1 = MNodeService.getInstance(request).get(session, seriesId);
1555
            object1.reset();
1556
            // check
1557
            assertTrue(object1.available() > 0);
1558
            assertTrue(result1.available() > 0);
1559
            assertTrue(IOUtils.contentEquals(result1, object1));
1560
            //test the get(pid) for v1
1561
            InputStream result2 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, guid);
1562
            object1.reset();
1563
            // check
1564
            assertTrue(object1.available() > 0);
1565
            assertTrue(result2.available() > 0);
1566
            assertTrue(IOUtils.contentEquals(result2, object1));
1567
            //test the get(sid) for v1
1568
            try {
1569
                InputStream result3 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, seriesId);
1570
                fail("the get(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1571
            } catch (NotFound ee) {
1572
                
1573
            }
1574
            SystemMetadata metadata = MNodeService.getInstance(request).getSystemMetadata(session, seriesId);
1575
            assertTrue(metadata.getIdentifier().getValue().equals(guid.getValue()));
1576
            assertTrue(metadata.getSeriesId().getValue().equals(seriesId.getValue()));
1577
            DescribeResponse describeResponse = MNodeService.getInstance(request).describe(session, seriesId);
1578
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata.getChecksum().getValue());
1579
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata.getFormatId().getValue());
1580
            
1581
            metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid);
1582
            assertTrue(metadata.getIdentifier().getValue().equals(guid.getValue()));
1583
            assertTrue(metadata.getSeriesId().getValue().equals(seriesId.getValue()));
1584
            describeResponse = MNodeService.getInstance(request).describe(session, guid);
1585
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata.getChecksum().getValue());
1586
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata.getFormatId().getValue());
1587
            
1588
            org.dataone.service.types.v1.SystemMetadata sys1=edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).getSystemMetadata(session, guid);
1589
            assertTrue(metadata.getIdentifier().getValue().equals(guid.getValue()));
1590
            
1591
            try {
1592
                org.dataone.service.types.v1.SystemMetadata sys2=edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).getSystemMetadata(session, seriesId);
1593
                fail("the getSystemMetadata(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1594
            } catch(NotFound nf2) {
1595
                
1596
            }
1597
            
1598
            describeResponse = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).describe(session, guid);
1599
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), sys1.getChecksum().getValue());
1600
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), sys1.getFormatId().getValue());
1601
            try {
1602
                describeResponse = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).describe(session, seriesId);
1603
                fail("the describe(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1604
            } catch(NotFound nf2) {
1605
                
1606
            }
1607
            
1608
            Checksum sum = MNodeService.getInstance(request).getChecksum(session, guid, "md5");
1609
            assertTrue(sum.getValue().equals("5b78f9689b9aab1ebc0f3c1df916dd97"));
1610
            
1611
            try {
1612
                sum = MNodeService.getInstance(request).getChecksum(session, seriesId, "md5");
1613
                fail("the getCheckSum shouldn't work for sid");
1614
            } catch(NotFound nf3) {
1615
                
1616
            }
1617
            
1618
            sum = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).getChecksum(session, guid, "md5");
1619
            assertTrue(sum.getValue().equals("5b78f9689b9aab1ebc0f3c1df916dd97"));
1620
            
1621
            try {
1622
                sum = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).getChecksum(session, seriesId, "md5");
1623
                fail("the getCheckSum shouldn't work for sid");
1624
            } catch(NotFound nf3) {
1625
                
1626
            }
1627
            
1628
            boolean isAuthorized = 
1629
                    MNodeService.getInstance(request).isAuthorized(session, guid, Permission.READ);
1630
            assertEquals(isAuthorized, true);
1631
            
1632
            isAuthorized = 
1633
                    MNodeService.getInstance(request).isAuthorized(session, seriesId, Permission.READ);
1634
            assertEquals(isAuthorized, true);
1635
            
1636
            isAuthorized = 
1637
                    edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).isAuthorized(session, guid, Permission.READ);
1638
            assertEquals(isAuthorized, true);
1639
            
1640
            try {
1641
                isAuthorized = 
1642
                        edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).isAuthorized(session, seriesId, Permission.READ);
1643
                fail("we can't reach here since the v1 isAuthorized method doesn't suppport series id");
1644
            } catch (NotFound e) {
1645
                
1646
            }
1647
            
1648
            Session cnsession = getCNSession();
1649
            Date toDate = new Date();
1650
            Event event = Event.READ;
1651
            int start = 0;
1652
            int count = 1;
1653
          Log log = MNodeService.getInstance(request).getLogRecords(cnsession, null, null, 
1654
            event.xmlValue(), seriesId.getValue(), start, count);
1655
          
1656
          assertNotNull(log);      
1657
          assertTrue(log.getCount() == count);
1658
          assertTrue(log.getStart() == start);
1659
          assertTrue(log.getTotal() >= 1);
1660
          assertTrue(log.getLogEntry(0).getIdentifier().equals(guid));
1661

    
1662
            //do a update with the same series id
1663
            Thread.sleep(1000);
1664
            Identifier newPid = new Identifier();
1665
            newPid.setValue(generateDocumentId()+"1");
1666
            System.out.println("the second pid is "+newPid.getValue());
1667
            InputStream object2 = new ByteArrayInputStream(str2.getBytes("UTF-8"));
1668
            SystemMetadata newSysMeta = createSystemMetadata(newPid, session.getSubject(), object2);
1669
            newSysMeta.setObsoletes(guid);
1670
            newSysMeta.setSeriesId(seriesId);
1671
            MNodeService.getInstance(request).update(session, guid, object2, newPid, newSysMeta);
1672
           
1673
            InputStream result4 = MNodeService.getInstance(request).get(session, guid);
1674
            // go back to beginning of original stream
1675
            object1.reset();
1676
            // check
1677
            assertTrue(object1.available() > 0);
1678
            assertTrue(result4.available() > 0);
1679
            assertTrue(IOUtils.contentEquals(result4, object1));
1680
            
1681
            InputStream result5 = MNodeService.getInstance(request).get(session, newPid);
1682
            // go back to beginning of original stream
1683
            object2.reset();
1684
            // check
1685
            assertTrue(object2.available() > 0);
1686
            assertTrue(result5.available() > 0);
1687
            assertTrue(IOUtils.contentEquals(result5, object2));
1688
            
1689

    
1690
            InputStream result6 = MNodeService.getInstance(request).get(session, seriesId);
1691
            object2.reset();
1692
            // check
1693
            assertTrue(object2.available() > 0);
1694
            assertTrue(result6.available() > 0);
1695
            assertTrue(IOUtils.contentEquals(result6, object2));
1696
            //test the get(pid) for v1
1697
            InputStream result7 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, guid);
1698
            object1.reset();
1699
            // check
1700
            assertTrue(object1.available() > 0);
1701
            assertTrue(result7.available() > 0);
1702
            assertTrue(IOUtils.contentEquals(result7, object1));
1703
            
1704
            InputStream result8 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, newPid);
1705
            object2.reset();
1706
            // check
1707
            assertTrue(object2.available() > 0);
1708
            assertTrue(result8.available() > 0);
1709
            assertTrue(IOUtils.contentEquals(result8, object2));
1710
            //test the get(sid) for v1
1711
            try {
1712
                InputStream result3 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, seriesId);
1713
                fail("the get(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1714
            } catch (NotFound ee) {
1715
                
1716
            }
1717
            
1718
            SystemMetadata metadata1 = MNodeService.getInstance(request).getSystemMetadata(session, seriesId);
1719
            assertTrue(metadata1.getIdentifier().getValue().equals(newPid.getValue()));
1720
            assertTrue(metadata1.getSeriesId().getValue().equals(seriesId.getValue()));
1721
            describeResponse = MNodeService.getInstance(request).describe(session, seriesId);
1722
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata1.getChecksum().getValue());
1723
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata1.getFormatId().getValue());
1724
            
1725
            SystemMetadata metadata2 = MNodeService.getInstance(request).getSystemMetadata(session, guid);
1726
            assertTrue(metadata2.getIdentifier().getValue().equals(guid.getValue()));
1727
            assertTrue(metadata2.getSeriesId().getValue().equals(seriesId.getValue()));
1728
            describeResponse = MNodeService.getInstance(request).describe(session, guid);
1729
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata2.getChecksum().getValue());
1730
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata2.getFormatId().getValue());
1731
            
1732
            SystemMetadata metadata3 = MNodeService.getInstance(request).getSystemMetadata(session, newPid);
1733
            assertTrue(metadata3.getIdentifier().getValue().equals(newPid.getValue()));
1734
            assertTrue(metadata3.getSeriesId().getValue().equals(seriesId.getValue()));
1735
            describeResponse = MNodeService.getInstance(request).describe(session, newPid);
1736
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata3.getChecksum().getValue());
1737
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata3.getFormatId().getValue());
1738
            
1739
            //do another update with different series id
1740
            Thread.sleep(1000);
1741
            String sid2 = "sid."+System.nanoTime();
1742
            Identifier seriesId2= new Identifier();
1743
            seriesId2.setValue(sid2);
1744
            System.out.println("the second sid is "+seriesId2.getValue());
1745
            Identifier newPid2 = new Identifier();
1746
            newPid2.setValue(generateDocumentId()+"2");
1747
            System.out.println("the third pid is "+newPid2.getValue());
1748
            InputStream object3 = new ByteArrayInputStream(str3.getBytes("UTF-8"));
1749
            SystemMetadata sysmeta3 = createSystemMetadata(newPid2, session.getSubject(), object3);
1750
            sysmeta3.setObsoletes(newPid);
1751
            sysmeta3.setSeriesId(seriesId2);
1752
            MNodeService.getInstance(request).update(session, newPid, object3, newPid2, sysmeta3);
1753
            
1754
            InputStream result9 = MNodeService.getInstance(request).get(session, guid);
1755
            // go back to beginning of original stream
1756
            object1.reset();
1757
            // check
1758
            assertTrue(object1.available() > 0);
1759
            assertTrue(result9.available() > 0);
1760
            assertTrue(IOUtils.contentEquals(result9, object1));
1761
            
1762
            InputStream result10 = MNodeService.getInstance(request).get(session, newPid);
1763
            // go back to beginning of original stream
1764
            object2.reset();
1765
            // check
1766
            assertTrue(object2.available() > 0);
1767
            assertTrue(result10.available() > 0);
1768
            assertTrue(IOUtils.contentEquals(result10, object2));
1769
            
1770
            
1771
            InputStream result11 = MNodeService.getInstance(request).get(session, newPid2);
1772
            // go back to beginning of original stream
1773
            object3.reset();
1774
            // check
1775
            assertTrue(object3.available() > 0);
1776
            assertTrue(result11.available() > 0);
1777
            assertTrue(IOUtils.contentEquals(result11, object3));
1778
            
1779
            InputStream result12 = MNodeService.getInstance(request).get(session, seriesId2);
1780
            object3.reset();
1781
            // check
1782
            assertTrue(object3.available() > 0);
1783
            assertTrue(result12.available() > 0);
1784
            assertTrue(IOUtils.contentEquals(result12, object3));
1785
            
1786
            InputStream result16 = MNodeService.getInstance(request).get(session, seriesId);
1787
            object2.reset();
1788
            // check
1789
            assertTrue(object2.available() > 0);
1790
            assertTrue(result16.available() > 0);
1791
            assertTrue(IOUtils.contentEquals(result16, object2));
1792
           
1793
            //test the get(pid) for v1
1794
            InputStream result13 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, guid);
1795
            object1.reset();
1796
            // check
1797
            assertTrue(object1.available() > 0);
1798
            assertTrue(result13.available() > 0);
1799
            assertTrue(IOUtils.contentEquals(result13, object1));
1800
            
1801
            InputStream result14 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, newPid);
1802
            object2.reset();
1803
            // check
1804
            assertTrue(object2.available() > 0);
1805
            assertTrue(result14.available() > 0);
1806
            assertTrue(IOUtils.contentEquals(result14, object2));
1807
            
1808
            InputStream result15 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, newPid2);
1809
            object3.reset();
1810
            // check
1811
            assertTrue(object3.available() > 0);
1812
            assertTrue(result15.available() > 0);
1813
            assertTrue(IOUtils.contentEquals(result15, object3));
1814
            
1815
            SystemMetadata metadata4 = MNodeService.getInstance(request).getSystemMetadata(session, seriesId);
1816
            assertTrue(metadata4.getIdentifier().getValue().equals(newPid.getValue()));
1817
            assertTrue(metadata4.getSeriesId().getValue().equals(seriesId.getValue()));
1818
            describeResponse = MNodeService.getInstance(request).describe(session, seriesId);
1819
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata4.getChecksum().getValue());
1820
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata4.getFormatId().getValue());
1821
            
1822
            SystemMetadata metadata5 = MNodeService.getInstance(request).getSystemMetadata(session, seriesId2);
1823
            assertTrue(metadata5.getIdentifier().getValue().equals(newPid2.getValue()));
1824
            assertTrue(metadata5.getSeriesId().getValue().equals(seriesId2.getValue()));
1825
            describeResponse = MNodeService.getInstance(request).describe(session, seriesId2);
1826
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata5.getChecksum().getValue());
1827
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata5.getFormatId().getValue());
1828
            
1829
            SystemMetadata metadata6 = MNodeService.getInstance(request).getSystemMetadata(session, guid);
1830
            assertTrue(metadata6.getIdentifier().getValue().equals(guid.getValue()));
1831
            assertTrue(metadata6.getSeriesId().getValue().equals(seriesId.getValue()));
1832
            describeResponse = MNodeService.getInstance(request).describe(session, guid);
1833
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata6.getChecksum().getValue());
1834
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata6.getFormatId().getValue());
1835
            
1836
            SystemMetadata metadata7 = MNodeService.getInstance(request).getSystemMetadata(session, newPid);
1837
            assertTrue(metadata7.getIdentifier().getValue().equals(newPid.getValue()));
1838
            assertTrue(metadata7.getSeriesId().getValue().equals(seriesId.getValue()));
1839
            describeResponse = MNodeService.getInstance(request).describe(session, newPid);
1840
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata7.getChecksum().getValue());
1841
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata7.getFormatId().getValue());
1842
            
1843
            SystemMetadata metadata8 = MNodeService.getInstance(request).getSystemMetadata(session, newPid2);
1844
            assertTrue(metadata8.getIdentifier().getValue().equals(newPid2.getValue()));
1845
            assertTrue(metadata8.getSeriesId().getValue().equals(seriesId2.getValue()));
1846
            describeResponse = MNodeService.getInstance(request).describe(session, newPid2);
1847
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata8.getChecksum().getValue());
1848
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata8.getFormatId().getValue());
1849
            
1850
            
1851
            
1852
            
1853
            //test the get(sid) for v1
1854
            try {
1855
                InputStream result3 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, seriesId);
1856
                fail("the get(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1857
            } catch (NotFound ee) {
1858
                
1859
            }
1860
            
1861
            //test the get(sid) for v1
1862
            try {
1863
                InputStream result3 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, seriesId2);
1864
                fail("the get(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1865
            } catch (NotFound ee) {
1866
                
1867
            }
1868
            
1869
            //test to get non-existing id for v2
1870
            try {
1871
             // the pid should be null when we try to get a no-exist sid
1872
                Identifier non_exist_sid = new Identifier();
1873
                non_exist_sid.setValue("no-sid-exist-123qwe");
1874
                InputStream result3 = MNodeService.getInstance(request).get(session, non_exist_sid);
1875
                fail("the get(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1876
            } catch (NotFound ee) {
1877
                
1878
            }
1879
            
1880
            try {
1881
                // the pid should be null when we try to get a no-exist sid
1882
                   Identifier non_exist_sid = new Identifier();
1883
                   non_exist_sid.setValue("no-sid-exist-123qwe");
1884
                   SystemMetadata result3 = MNodeService.getInstance(request).getSystemMetadata(session, non_exist_sid);
1885
                   fail("the getSystemMetadata(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1886
            } catch (NotFound ee) {
1887
                   
1888
            }
1889
            
1890
            try {
1891
                // the pid should be null when we try to get a no-exist sid
1892
                   Identifier non_exist_sid = new Identifier();
1893
                   non_exist_sid.setValue("no-sid-exist-123qwe");
1894
                    MNodeService.getInstance(request).describe(session, non_exist_sid);
1895
                   fail("the describe(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1896
               } catch (NotFound ee) {
1897
                   
1898
               }
1899
            
1900
            toDate = new Date();
1901
            event = Event.READ;
1902
            start = 0;
1903
            count = 1;
1904
            log = MNodeService.getInstance(request).getLogRecords(cnsession, null, null, 
1905
            event.xmlValue(), seriesId.getValue(), start, count);
1906
          
1907
            assertNotNull(log);      
1908
            assertTrue(log.getCount() == count);
1909
            assertTrue(log.getStart() == start);
1910
            assertTrue(log.getTotal() >= 1);
1911
            assertTrue(log.getLogEntry(0).getIdentifier().equals(newPid));
1912
            
1913
            //do another update with invalid series ids
1914
            Thread.sleep(1000);
1915
            Identifier newPid3 = new Identifier();
1916
            newPid3.setValue(generateDocumentId()+"3");
1917
            System.out.println("the third pid is "+newPid3.getValue());
1918
            InputStream object4 = new ByteArrayInputStream(str3.getBytes("UTF-8"));
1919
            SystemMetadata sysmeta4 = createSystemMetadata(newPid3, session.getSubject(), object4);
1920
            sysmeta4.setObsoletes(newPid2);
1921
            sysmeta4.setSeriesId(seriesId);
1922
            try {
1923
                MNodeService.getInstance(request).update(session, newPid2, object4, newPid3, sysmeta4);
1924
                fail("we can't reach here since the sid is using an old one ");
1925
            } catch (InvalidSystemMetadata eee) {
1926
                
1927
            } 
1928
            
1929
            sysmeta4.setSeriesId(newPid3);
1930
            try {
1931
                MNodeService.getInstance(request).update(session, newPid2, object4, newPid3, sysmeta4);
1932
                fail("we can't reach here since the sid is using the pid ");
1933
            } catch (InvalidSystemMetadata eee) {
1934
                
1935
            } 
1936
            
1937
            //test archive a series id by v1
1938
            try {
1939
                edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).archive(session, seriesId2);
1940
                fail("we can't reach here since the v1 archive method doesn't support the sid ");
1941
            } catch (NotFound nf2) {
1942
                
1943
            }
1944
            
1945
            // test delete a series id by v1
1946
            Session mnSession = getMNSession();
1947
            try {
1948
                edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).delete(mnSession, seriesId2);
1949
                fail("we can't reach here since the v1 delete method doesn't support the sid ");
1950
            } catch (NotFound nf2) {
1951
                
1952
            }
1953
            
1954
            // test archive a series id by v2
1955
            MNodeService.getInstance(request).archive(session, seriesId2);
1956
            SystemMetadata archived = MNodeService.getInstance(request).getSystemMetadata(session, seriesId2);
1957
            assertTrue(archived.getArchived());
1958
            archived = MNodeService.getInstance(request).getSystemMetadata(session, newPid2);
1959
            assertTrue(archived.getArchived());
1960
            
1961
            // test delete a series id by v2
1962
            MNodeService.getInstance(request).delete(mnSession, seriesId2);
1963
            try {
1964
                MNodeService.getInstance(request).get(session, seriesId2);
1965
                fail("we can't reach here since the series id was deleted ");
1966
            } catch (NotFound nf3) {
1967
                System.out.println("the message is ============="+nf3.getMessage());
1968
                //assertTrue(nf3.getMessage().indexOf("delete") >0);
1969
            }
1970
            
1971
            try {
1972
                MNodeService.getInstance(request).get(session, newPid2);
1973
                fail("we can't reach here since the series id was deleted ");
1974
            } catch (NotFound nf3) {
1975
                //System.out.println("the message is ============="+nf3.getMessage());
1976
                assertTrue(nf3.getMessage().indexOf("delete") >0);
1977
            }
1978
            
1979
            try {
1980
                edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, newPid2);
1981
                fail("we can't reach here since the series id was deleted ");
1982
            } catch (NotFound nf3) {
1983
                System.out.println("the message is ============="+nf3.getMessage());
1984
                assertTrue(nf3.getMessage().indexOf("delete") >0);
1985
            }
1986
            
1987
            //archive seriesId
1988
            MNodeService.getInstance(request).archive(mnSession, seriesId);
1989
            archived = MNodeService.getInstance(request).getSystemMetadata(session, seriesId);
1990
            assertTrue(archived.getArchived());
1991
            archived = MNodeService.getInstance(request).getSystemMetadata(session, newPid);
1992
            assertTrue(archived.getArchived());
1993
            
1994
            
1995
            //delete seriesId
1996
            MNodeService.getInstance(request).delete(mnSession, seriesId);
1997
            try {
1998
                MNodeService.getInstance(request).get(session, newPid);
1999
                fail("we can't reach here since the series id was deleted ");
2000
            } catch (NotFound nf3) {
2001
                //System.out.println("the message is ============="+nf3.getMessage());
2002
                assertTrue(nf3.getMessage().indexOf("delete") >0);
2003
            }
2004
            SystemMetadata meta = MNodeService.getInstance(request).getSystemMetadata(session, seriesId);
2005
            assertTrue(meta.getIdentifier().getValue().equals(guid.getValue()));
2006
            
2007
        } catch (Exception e) {
2008
            fail(e.getMessage());
2009
        }
2010
        
2011
        
2012
        
2013
        
2014
    }
2015
    
2016
    /**
2017
     * Test the listView methods.
2018
     * @throws Excpetion
2019
     */
2020
    public void testListViews() throws Exception {
2021
        Session session = null;
2022
        OptionList list = MNodeService.getInstance(request).listViews(session);
2023
        assertTrue(list.sizeOptionList() >0);
2024
        List<String> names = list.getOptionList();
2025
        for(String name : names) {
2026
            System.out.println("It has the view named "+name);
2027
        }
2028
    }
2029
    
2030
    public void testUpdateSystemMetadata() throws Exception {
2031
        String str1 = "object1";
2032
        String str2 = "object2";
2033
        String str3 = "object3";
2034

    
2035
        //insert test documents with a series id
2036
        Session session = getTestSession();
2037
        Identifier guid = new Identifier();
2038
        guid.setValue(generateDocumentId());
2039
        InputStream object1 = new ByteArrayInputStream(str1.getBytes("UTF-8"));
2040
        SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object1);
2041
        String sid1= "sid."+System.nanoTime();
2042
        Identifier seriesId = new Identifier();
2043
        seriesId.setValue(sid1);
2044
        System.out.println("the first sid is "+seriesId.getValue());
2045
        sysmeta.setSeriesId(seriesId);
2046
        sysmeta.setArchived(false);
2047
        MNodeService.getInstance(request).create(session, guid, object1, sysmeta);
2048
        //Test the generating object succeeded. 
2049
        SystemMetadata metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid);
2050
        assertTrue(metadata.getIdentifier().equals(guid));
2051
        assertTrue(metadata.getArchived().equals(false));
2052
        System.out.println("the checksum from request is "+metadata.getChecksum().getValue());
2053
        assertTrue(metadata.getSize().equals(sysmeta.getSize()));
2054
        
2055
        //update system metadata sucessfully
2056
        metadata.setArchived(true);
2057
        MNodeService.getInstance(request).updateSystemMetadata(session, guid, metadata);
2058
        SystemMetadata metadata2 = MNodeService.getInstance(request).getSystemMetadata(session, seriesId);
2059
        assertTrue(metadata2.getIdentifier().equals(guid));
2060
        assertTrue(metadata2.getSeriesId().equals(seriesId));
2061
        assertTrue(metadata2.getArchived().equals(true));
2062
        assertTrue(metadata2.getChecksum().getValue().equals(metadata.getChecksum().getValue()));
2063
        
2064
        Identifier newId = new Identifier();
2065
        newId.setValue("newValue");
2066
        metadata.setIdentifier(newId);
2067
        try {
2068
            MNodeService.getInstance(request).updateSystemMetadata(session, guid, metadata);
2069
            fail("We shouldn't get there");
2070
        } catch (Exception e) {
2071
            assertTrue(e instanceof InvalidRequest);
2072
        }
2073
        
2074
        newId.setValue("newValue");
2075
        metadata.setSeriesId(newId);
2076
        try {
2077
            MNodeService.getInstance(request).updateSystemMetadata(session, guid, metadata);
2078
            fail("We shouldn't get there");
2079
        } catch (Exception e) {
2080
            assertTrue(e instanceof InvalidRequest);
2081
        }
2082
        
2083
        Date newDate = new Date();
2084
        metadata.setDateUploaded(newDate);
2085
        try {
2086
            MNodeService.getInstance(request).updateSystemMetadata(session, guid, metadata);
2087
            fail("We shouldn't get there");
2088
        } catch (Exception e) {
2089
            assertTrue(e instanceof InvalidRequest);
2090
        }
2091
        
2092
        Checksum checkSum = new Checksum();
2093
        checkSum.setValue("12345");
2094
        metadata.setChecksum(checkSum);
2095
        try {
2096
            MNodeService.getInstance(request).updateSystemMetadata(session, guid, metadata);
2097
            fail("We shouldn't get there");
2098
        } catch (Exception e) {
2099
            assertTrue(e instanceof InvalidRequest);
2100
        }
2101
        
2102
        BigInteger size = new BigInteger("4000");
2103
        metadata.setSize(size);
2104
        try {
2105
            MNodeService.getInstance(request).updateSystemMetadata(session, guid, metadata);
2106
            fail("We shouldn't get there");
2107
        } catch (Exception e) {
2108
            assertTrue(e instanceof InvalidRequest);
2109
        }
2110
}
2111
    
2112
    public void testUpdateObsoletesAndObsoletedBy() throws Exception {
2113
        String str1 = "object1";
2114
        String str2 = "object2";
2115
        String str3 = "object3";
2116

    
2117
        //insert two documents 
2118
        Session session = getTestSession();
2119
        Identifier guid1 = new Identifier();
2120
        guid1.setValue(generateDocumentId());
2121
        InputStream object1 = new ByteArrayInputStream(str1.getBytes("UTF-8"));
2122
        SystemMetadata sysmeta1 = createSystemMetadata(guid1, session.getSubject(), object1);
2123
        MNodeService.getInstance(request).create(session, guid1, object1, sysmeta1);
2124
        //Test the generating object succeeded. 
2125
        SystemMetadata metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid1);
2126
        assertTrue(metadata.getIdentifier().equals(guid1));
2127
        assertTrue(metadata.getSize().equals(sysmeta1.getSize()));
2128
        
2129
        Identifier guid2 = new Identifier();
2130
        guid2.setValue(generateDocumentId());
2131
        InputStream object2 = new ByteArrayInputStream(str1.getBytes("UTF-8"));
2132
        SystemMetadata sysmeta2 = createSystemMetadata(guid2, session.getSubject(), object2);
2133
        MNodeService.getInstance(request).create(session, guid2, object2, sysmeta2);
2134
        //Test the generating object succeeded. 
2135
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid2);
2136
        assertTrue(metadata.getIdentifier().equals(guid2));
2137
        assertTrue(metadata.getSize().equals(sysmeta2.getSize()));
2138
        
2139
        
2140
        
2141
        //update the system metadata without touching the obsoletes and obsoletdBy
2142
        AccessPolicy accessPolicy = new AccessPolicy();
2143
        AccessRule allow = new AccessRule();
2144
        allow.addPermission(Permission.WRITE);
2145
        Subject subject = new Subject();
2146
        subject.setValue("user_foo");
2147
        allow.addSubject(subject);
2148
        accessPolicy.addAllow(allow);
2149
        sysmeta1.setAccessPolicy(accessPolicy);
2150
        MNodeService.getInstance(request).updateSystemMetadata(session, guid1, sysmeta1);
2151
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid1);
2152
        assertTrue(metadata.getIdentifier().equals(guid1));
2153
        assertTrue(metadata.getObsoletedBy() == null);
2154
        assertTrue(metadata.getObsoletes() == null);
2155
        Session newSession = new Session();
2156
        newSession.setSubject(subject);
2157
        boolean isAuthorized = MNodeService.getInstance(request).isAuthorized(newSession, guid1, Permission.WRITE);
2158
        assertTrue(isAuthorized);
2159
        
2160
        sysmeta2.setAccessPolicy(accessPolicy);
2161
        MNodeService.getInstance(request).updateSystemMetadata(session, guid2, sysmeta2);
2162
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid2);
2163
        assertTrue(metadata.getIdentifier().equals(guid2));
2164
        assertTrue(metadata.getObsoletes() == null);
2165
        assertTrue(metadata.getObsoletedBy() == null);
2166
        assertTrue(metadata.getChecksum().getValue().equals(sysmeta2.getChecksum().getValue()));
2167
        isAuthorized = MNodeService.getInstance(request).isAuthorized(newSession, guid2, Permission.WRITE);
2168
        assertTrue(isAuthorized);
2169
        
2170
        
2171
        
2172
        //update obsolets and obsoletedBy sucessfully
2173
        sysmeta1.setObsoletedBy(guid2);
2174
        MNodeService.getInstance(request).updateSystemMetadata(session, guid1, sysmeta1);
2175
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid1);
2176
        assertTrue(metadata.getIdentifier().equals(guid1));
2177
        assertTrue(metadata.getObsoletedBy().equals(guid2));
2178
        assertTrue(metadata.getObsoletes() == null);
2179
        assertTrue(metadata.getChecksum().getValue().equals(sysmeta1.getChecksum().getValue()));
2180
        
2181
        sysmeta2.setObsoletes(guid1);
2182
        MNodeService.getInstance(request).updateSystemMetadata(session, guid2, sysmeta2);
2183
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid2);
2184
        assertTrue(metadata.getIdentifier().equals(guid2));
2185
        assertTrue(metadata.getObsoletes().equals(guid1));
2186
        assertTrue(metadata.getObsoletedBy() == null);
2187
        assertTrue(metadata.getChecksum().getValue().equals(sysmeta2.getChecksum().getValue()));
2188
        
2189
        
2190
        
2191
        
2192
        //update obsolets and obsoletedBy sucessfully
2193
        sysmeta1.setObsoletedBy(guid2);
2194
        MNodeService.getInstance(request).updateSystemMetadata(session, guid1, sysmeta1);
2195
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid1);
2196
        assertTrue(metadata.getIdentifier().equals(guid1));
2197
        assertTrue(metadata.getObsoletedBy().equals(guid2));
2198
        assertTrue(metadata.getObsoletes() == null);
2199
        assertTrue(metadata.getChecksum().getValue().equals(sysmeta1.getChecksum().getValue()));
2200
        
2201
        sysmeta2.setObsoletes(guid1);
2202
        MNodeService.getInstance(request).updateSystemMetadata(session, guid2, sysmeta2);
2203
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid2);
2204
        assertTrue(metadata.getIdentifier().equals(guid2));
2205
        assertTrue(metadata.getObsoletes().equals(guid1));
2206
        assertTrue(metadata.getObsoletedBy() == null);
2207
        assertTrue(metadata.getChecksum().getValue().equals(sysmeta2.getChecksum().getValue()));
2208
        
2209

    
2210
        
2211
        
2212
        
2213
        //resetting the obsoletes and obsoletedBy fails
2214
        Identifier newId = new Identifier();
2215
        newId.setValue("newValue");
2216
        sysmeta1.setObsoletedBy(newId);
2217
        try {
2218
            MNodeService.getInstance(request).updateSystemMetadata(session, guid1, sysmeta1);
2219
            fail("We shouldn't get there");
2220
        } catch (Exception e) {
2221
            e.printStackTrace();
2222
            assertTrue(e instanceof InvalidRequest);
2223
        }
2224
       
2225
        sysmeta2.setObsoletes(newId);
2226
        try {
2227
            MNodeService.getInstance(request).updateSystemMetadata(session, guid2, sysmeta2);
2228
            fail("We shouldn't get there");
2229
        } catch (Exception e) {
2230
            assertTrue(e instanceof InvalidRequest);
2231
        }
2232
    }
2233
    
2234
}
(3-3/7)