Project

General

Profile

1
/**
2
 *  '$RCSfile$'
3
 *  Copyright: 2010 Regents of the University of California and the
4
 *              National Center for Ecological Analysis and Synthesis
5
 *  Purpose: To test the Access Controls in metacat by JUnit
6
 *
7
 *   '$Author:$'
8
 *     '$Date:$'
9
 * '$Revision:$'
10
 *
11
 * This program is free software; you can redistribute it and/or modify
12
 * it under the terms of the GNU General Public License as published by
13
 * the Free Software Foundation; either version 2 of the License, or
14
 * (at your option) any later version.
15
 *
16
 * This program is distributed in the hope that it will be useful,
17
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19
 * GNU General Public License for more details.
20
 *
21
 * You should have received a copy of the GNU General Public License
22
 * along with this program; if not, write to the Free Software
23
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
24
 */
25

    
26
package edu.ucsb.nceas.metacat.dataone;
27

    
28

    
29
import gov.loc.repository.bagit.Bag;
30
import gov.loc.repository.bagit.BagFactory;
31
import gov.loc.repository.bagit.BagFile;
32
import gov.loc.repository.bagit.Manifest;
33

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

    
50
import junit.framework.Test;
51
import junit.framework.TestSuite;
52

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

    
91
/**
92
 * A JUnit test to exercise the Metacat Member Node service implementation.
93
 * This also tests a few of the D1NodeService superclass methods
94
 * 
95
 * @author cjones
96
 *
97
 */
98
public class MNodeServiceTest extends D1NodeServiceTest {
99

    
100
  /**
101
   * Set up the test fixtures
102
   * 
103
   * @throws Exception
104
   */
105
  @Before
106
  public void setUp() throws Exception {
107
    super.setUp();
108
    // set up the configuration for d1client
109
    Settings.getConfiguration().setProperty("D1Client.cnClassName", MockCNode.class.getName());
110
  }
111

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

    
173
  /**
174
   * Initial blank test
175
   */
176
  public void initialize() {
177
    assertTrue(1 == 1);
178
    
179
  }
180
  
181
  /**
182
   * Test getting a known object
183
   */
184
  public void testGet() {
185
    printTestHeader("testGet");
186

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

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

    
252
  }
253

    
254
  /**
255
   * Test getting the system metadata of an object
256
   */
257
  public void testGetSystemMetadata() {    
258
    printTestHeader("testGetSystemMetadata");
259

    
260
    try {
261
      Session session = getTestSession();
262
      Identifier guid = new Identifier();
263
      guid.setValue("testGetSystemMetadata." + System.currentTimeMillis());
264
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
265
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
266
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
267
      SystemMetadata newsysmeta = MNodeService.getInstance(request).getSystemMetadata(session, pid);
268
      assertEquals(newsysmeta.getIdentifier().getValue(), sysmeta.getIdentifier().getValue());
269
      
270
    } catch (UnsupportedEncodingException e) {
271
      e.printStackTrace();
272
      fail("Unexpected error: " + e.getMessage());
273

    
274
    } catch (InvalidToken e) {
275
      e.printStackTrace();      
276
      fail("Unexpected error: " + e.getMessage());
277

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

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

    
286
    } catch (IdentifierNotUnique e) {
287
      e.printStackTrace();
288
      fail("Unexpected error: " + e.getMessage());
289
      
290
    } catch (UnsupportedType e) {
291
      e.printStackTrace();
292
      fail("Unexpected error: " + e.getMessage());
293

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

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

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

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

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

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

    
318
    }
319
    
320
  }
321

    
322
  /**
323
   * Test object creation
324
   */
325
  public void testCreate() {
326
    printTestHeader("testCreate");
327
    
328
    try {
329
      Session session = getTestSession();
330
      Identifier guid = new Identifier();
331
      guid.setValue("testCreate." + System.currentTimeMillis());
332
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
333
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
334
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
335
      assertEquals(guid.getValue(), pid.getValue());
336
    } catch (UnsupportedEncodingException e) {
337
      e.printStackTrace();
338
      fail("Unexpected error: " + e.getMessage());
339

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

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

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

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

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

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

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

    
368
    } catch (NotImplemented e) {
369
      e.printStackTrace();
370
      fail("Unexpected error: " + e.getMessage());
371

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

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

    
380
    }
381
      
382
  }
383

    
384
  /**
385
   * test object deletion
386
   */
387
  public void testDelete() {
388
    printTestHeader("testDelete");
389

    
390
    try {
391
      Session session = getTestSession();
392
      Identifier guid = new Identifier();
393
      guid.setValue("testDelete." + System.currentTimeMillis());
394
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
395
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
396
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
397
      
398
      // use MN admin to delete
399
      session = getMNSession();
400
      Identifier deletedPid = MNodeService.getInstance(request).delete(session, pid);
401
      assertEquals(pid.getValue(), deletedPid.getValue());
402
      // check that we cannot get the object
403
      session = getTestSession();
404
      InputStream deletedObject = null;
405
      try {
406
    	  deletedObject = MNodeService.getInstance(request).get(session, deletedPid);
407
      } catch (NotFound nf) {
408
    	  // this is expected
409
      }
410
	  assertNull(deletedObject);
411
      
412
    } catch (UnsupportedEncodingException e) {
413
      e.printStackTrace();
414
      
415
    } catch (Exception e) {
416
      e.printStackTrace();
417
      fail("Unexpected error: " + e.getMessage());
418

    
419
    } 
420

    
421
  }
422

    
423
  /**
424
   * Test object updating
425
   */
426
  public void testUpdate() {
427
    printTestHeader("testUpdate");
428
    
429
    try {
430
      Session session = getTestSession();
431
      Identifier guid = new Identifier();
432
      guid.setValue("testUpdate." + System.currentTimeMillis());
433
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
434
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
435
      Identifier newPid = new Identifier();
436
      newPid.setValue("testUpdate." + (System.currentTimeMillis() + 1)); // ensure it is different from original
437
      Identifier pid = 
438
        MNodeService.getInstance(request).create(session, guid, object, sysmeta);
439
      
440
      SystemMetadata newSysMeta = createSystemMetadata(newPid, session.getSubject(), object);
441
            
442
      // do the update
443
      Identifier updatedPid = 
444
        MNodeService.getInstance(request).update(session, pid, object, newPid, newSysMeta);
445
      
446
      // get the updated system metadata
447
      SystemMetadata updatedSysMeta = 
448
        MNodeService.getInstance(request).getSystemMetadata(session, updatedPid);
449

    
450
      assertEquals(updatedPid.getValue(), newPid.getValue());
451
//      assertTrue(updatedSysMeta.getObsolete(0).getValue().equals(pid.getValue()));
452
//      assertTrue(updatedSysMeta.getDerivedFrom(0).getValue().equals(pid.getValue()));        
453
      
454
    } catch (UnsupportedEncodingException e) {
455
      e.printStackTrace();
456
      fail("Unexpected error: " + e.getMessage());
457

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

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

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

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

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

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

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

    
486
    } catch (NotImplemented e) {
487
      e.printStackTrace();
488
      fail("Unexpected error: " + e.getMessage());
489

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

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

    
498
    }
499
  }
500

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

    
534
  /**
535
   * Test describing an object
536
   */
537
  public void testDescribe() {
538
    printTestHeader("testDescribe");
539

    
540
    try {
541
      Session session = getTestSession();
542
      Identifier guid = new Identifier();
543
      guid.setValue("testGetSystemMetadata." + System.currentTimeMillis());
544
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
545
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
546
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
547
      DescribeResponse describeResponse = MNodeService.getInstance(request).describe(session, pid);
548
      assertEquals(describeResponse.getDataONE_Checksum().getValue(), sysmeta.getChecksum().getValue());
549
      assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), sysmeta.getFormatId().getValue());
550
      
551
    } catch (UnsupportedEncodingException e) {
552
      e.printStackTrace();
553
      fail("Unexpected error: " + e.getMessage());
554

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

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

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

    
567
    } catch (IdentifierNotUnique e) {
568
      e.printStackTrace();
569
      fail("Unexpected error: " + e.getMessage());
570
      
571
    } catch (UnsupportedType e) {
572
      e.printStackTrace();
573
      fail("Unexpected error: " + e.getMessage());
574

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

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

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

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

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

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

    
599
    }
600
  }
601

    
602
  /**
603
   * Test getting the checksum of an object
604
   */
605
  public void testGetChecksum() {
606
    printTestHeader("testGetChecksum");
607

    
608
    try {
609
      Session session = getTestSession();
610
      Identifier guid = new Identifier();
611
      guid.setValue("testGetChecksum." + System.currentTimeMillis());
612
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
613
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
614
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
615
      Checksum checksum = MNodeService.getInstance(request).getChecksum(session, pid, "MD5");
616
      assertEquals(checksum.getValue(), sysmeta.getChecksum().getValue());
617
    
618
    } catch (UnsupportedEncodingException e) {
619
      e.printStackTrace();
620
      fail("Unexpected error: " + e.getMessage());
621

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

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

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

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

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

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

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

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

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

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

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

    
666
    }
667
    
668
  }
669

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

    
705
  public void testGetCapabilities() {
706
      printTestHeader("testGetCapabilities");
707
    try {
708
      Node node = MNodeService.getInstance(request).getCapabilities();
709
      ByteArrayOutputStream baos = new ByteArrayOutputStream();
710
      TypeMarshaller.marshalTypeToOutputStream(node, baos);
711
      assertNotNull(node);
712
      // TODO: should probably test other parts of the node information
713
      
714
    } catch (JiBXException e) {
715
        e.printStackTrace();
716
        fail("The node instance couldn't be parsed correctly:" + e.getMessage());
717
        
718
    } catch (IOException e) {
719
        e.printStackTrace();
720
        fail("The node instance couldn't be read correctly:" + e.getMessage());
721
        
722
    } catch (Exception e) {
723
        e.printStackTrace();
724
        fail("Probably not yet implemented: " + e.getMessage());
725
        
726
    }
727
    
728
  }
729

    
730
  public void testPing() {
731

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

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

    
744
    }  catch (InsufficientResources e) {
745
      e.printStackTrace();
746
      fail("Unexpected error: " + e.getMessage());
747

    
748
    }
749
    
750
  }
751

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

    
776
  }
777

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

    
805
    }
806

    
807
  public void testGetLogRecords() {
808
    printTestHeader("testLogRecords");
809

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

    
835
    }
836
  }
837

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

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

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

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

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

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

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

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

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

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

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

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

    
985
    }
986
  }
987
  
988
  /**
989
   * Test if node admin is authorized to read a known object
990
   */
991
  public void testIsAdminAuthorized() {
992
    printTestHeader("testIsAdminAuthorized");
993
    
994
    try {
995
      Session session = getTestSession();
996
      Identifier guid = new Identifier();
997
      guid.setValue("testIsAdminAuthorized." + System.currentTimeMillis());
998
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
999
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1000
      Identifier pid = 
1001
        MNodeService.getInstance(request).create(session, guid, object, sysmeta);
1002
      
1003
      // test as public - read
1004
      boolean isAuthorized = 
1005
        MNodeService.getInstance(request).isAuthorized(null, pid, Permission.READ);
1006
      assertEquals(isAuthorized, true);
1007
      
1008
      // test as public - change perm
1009
      isAuthorized = 
1010
        MNodeService.getInstance(request).isAuthorized(null, pid, Permission.CHANGE_PERMISSION);
1011
      assertEquals(isAuthorized, false);
1012
      
1013
      // test as admin
1014
      isAuthorized = 
1015
    	        MNodeService.getInstance(request).isAuthorized(getMNSession(), pid, Permission.CHANGE_PERMISSION);
1016
    	      assertEquals(isAuthorized, true);
1017
      
1018
    } catch (Exception e) {
1019
      e.printStackTrace();
1020
      fail("Unexpected error: " + e.getMessage());
1021

    
1022
    } 
1023
  }
1024

    
1025
  
1026
  public void testIsEquivIdentityAuthorized() {
1027
      printTestHeader("testIsEquivIdentityAuthorized");
1028

    
1029
      try {
1030
          Session session = new Session();
1031
          Subject s = new Subject();
1032
          s.setValue("cn=test,dc=dataone,dc=org");
1033
          session.setSubject(s);
1034
          
1035
          Identifier pid = new Identifier();
1036
          pid.setValue("testIsEquivIdentityAuthorized." + System.currentTimeMillis());
1037
          InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1038
          SystemMetadata sysmeta = createSystemMetadata(pid, session.getSubject(), object);
1039
          
1040
          // reset the access policy to only allow 'self' read (no public)
1041
          AccessPolicy ap = new AccessPolicy();
1042
          AccessRule ar = new AccessRule();
1043
          List<Subject> sList = new ArrayList<Subject>();
1044
          sList.add(session.getSubject());
1045
          ar.setSubjectList(sList);
1046
          List<Permission> permList = new ArrayList<Permission>();
1047
          permList.add(Permission.CHANGE_PERMISSION);
1048
          ar.setPermissionList(permList);
1049
          ap.addAllow(ar);
1050
          sysmeta.setAccessPolicy(ap);
1051
          
1052
          // save it
1053
          Identifier retPid = CNodeService.getInstance(request).registerSystemMetadata(session, pid, sysmeta);
1054
          assertEquals(pid.getValue(), retPid.getValue());
1055
          
1056
          //check it against an equivalent identity not listed in the access policy
1057
          session.getSubject().setValue("cn=newSubject,dc=dataone,dc=org");
1058
          SubjectInfo subjectInfo = new SubjectInfo();
1059
          Person person = new Person();
1060
          person.setSubject(session.getSubject());
1061
          List<String> givenNames = new ArrayList<String>();
1062
          givenNames.add("New");
1063
          person.setGivenNameList(givenNames);
1064
          person.setFamilyName("Subject");
1065
          
1066
          // add equivalent identities
1067
          List<Subject> equivIdentities = new ArrayList<Subject>();
1068
          Subject mappedSubject2 = new Subject();
1069
          mappedSubject2.setValue("cn=test2,dc=dataone,dc=org");
1070
          equivIdentities.add(mappedSubject2);
1071
          
1072
          Subject mappedSubject = new Subject();
1073
          mappedSubject.setValue("cn=test,dc=dataone,dc=org");
1074
          equivIdentities.add(mappedSubject);          
1075
          
1076
          person.setEquivalentIdentityList(equivIdentities);
1077
          
1078
          List<Person> personList = new ArrayList<Person>();
1079
          personList.add(person);
1080
          subjectInfo.setPersonList(personList);
1081
          
1082
          // update the session to include subject info with a mapped identity
1083
          session.setSubjectInfo(subjectInfo);
1084
          boolean result = CNodeService.getInstance(request).isAuthorized(session, pid, Permission.READ);
1085
          assertTrue(result);
1086
        
1087
    } catch (Exception e) {
1088
        e.printStackTrace();
1089
        
1090
    }
1091
    
1092
  }
1093

    
1094
/**
1095
   * Test object creation failure when there is a space in the identifier
1096
   */
1097
  public void testCreateInvalidIdentifier() {
1098
    printTestHeader("testCreateInvalidIdentifier");
1099
    
1100
    try {
1101
      Session session = getTestSession();
1102
      Identifier guid = new Identifier();
1103
      guid.setValue("testCreate withspace." + System.currentTimeMillis());
1104
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1105
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1106
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
1107
      fail("Should not be able to create with whitespace in indentifier");
1108
    } catch (InvalidRequest e) {
1109
    	// expect that this request fails
1110
        assertTrue(true);
1111
    } catch (Exception e) {
1112
      e.printStackTrace();
1113
      fail("Unexpected error: " + e.getMessage());
1114
    }
1115
      
1116
  }
1117
  
1118
	/**
1119
	 * Test getting a known object
1120
	 */
1121
	public void testGetPackage() {
1122
		printTestHeader("testGetPackage");
1123

    
1124
		try {
1125
			Session session = getTestSession();
1126
			Identifier guid = new Identifier();
1127
			guid.setValue("testGetPackage." + System.currentTimeMillis());
1128
			InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1129
			SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1130
			Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
1131
			InputStream bagStream = MNodeService.getInstance(request).getPackage(session, null, pid);
1132
			File bagFile = File.createTempFile("bagit.", ".zip");
1133
			IOUtils.copy(bagStream, new FileOutputStream(bagFile));
1134
			BagFactory bagFactory = new BagFactory();
1135
			Bag bag = bagFactory.createBag(bagFile);
1136
			InputStream result = bag.getPayload().iterator().next().newInputStream();
1137
			
1138
			// go back to beginning of original stream
1139
			object.reset();
1140
			// check
1141
			assertTrue(object.available() > 0);
1142
			assertTrue(result.available() > 0);
1143
			assertTrue(IOUtils.contentEquals(result, object));
1144
			
1145
			// clean up
1146
			bagFile.delete();
1147

    
1148
		} catch (Exception e) {
1149
			e.printStackTrace();
1150
			fail("Unexpected error: " + e.getMessage());
1151
		}
1152
	}
1153
	
1154
	
1155
	/**
1156
	 * Test getting a known object
1157
	 */
1158
	public void testGetOREPackage() {
1159
		printTestHeader("testGetOREPackage");
1160

    
1161
		try {
1162
			
1163
			// construct the ORE package
1164
			Identifier resourceMapId = new Identifier();
1165
			//resourceMapId.setValue("doi://1234/AA/map.1.1");
1166
			resourceMapId.setValue("testGetOREPackage." + System.currentTimeMillis());
1167
			Identifier metadataId = new Identifier();
1168
			metadataId.setValue("doi://1234/AA/meta.1." + + System.currentTimeMillis());
1169
			List<Identifier> dataIds = new ArrayList<Identifier>();
1170
			Identifier dataId = new Identifier();
1171
			dataId.setValue("doi://1234/AA/data.1." + System.currentTimeMillis());
1172
			Identifier dataId2 = new Identifier();
1173
			dataId2.setValue("doi://1234/AA/data.2." + System.currentTimeMillis());
1174
			dataIds.add(dataId);
1175
			dataIds.add(dataId2);
1176
			Map<Identifier, List<Identifier>> idMap = new HashMap<Identifier, List<Identifier>>();
1177
			idMap.put(metadataId, dataIds);
1178
			ResourceMapFactory rmf = ResourceMapFactory.getInstance();
1179
			ResourceMap resourceMap = rmf.createResourceMap(resourceMapId, idMap);
1180
			assertNotNull(resourceMap);
1181
			String rdfXml = ResourceMapFactory.getInstance().serializeResourceMap(resourceMap);
1182
			assertNotNull(rdfXml);
1183
			
1184
			Session session = getTestSession();
1185
			InputStream object = null;
1186
			SystemMetadata sysmeta = null;
1187
			
1188
			// save the data objects (data just contains their ID)
1189
			InputStream dataObject1 = new ByteArrayInputStream(dataId.getValue().getBytes("UTF-8"));
1190
			sysmeta = createSystemMetadata(dataId, session.getSubject(), dataObject1);
1191
			MNodeService.getInstance(request).create(session, dataId, dataObject1, sysmeta);
1192
			// second data file
1193
			InputStream dataObject2 = new ByteArrayInputStream(dataId2.getValue().getBytes("UTF-8"));
1194
			sysmeta = createSystemMetadata(dataId2, session.getSubject(), dataObject2);
1195
			MNodeService.getInstance(request).create(session, dataId2, dataObject2, sysmeta);
1196
			// metadata file
1197
			InputStream metadataObject = new ByteArrayInputStream(metadataId.getValue().getBytes("UTF-8"));
1198
			sysmeta = createSystemMetadata(metadataId, session.getSubject(), metadataObject);
1199
			MNodeService.getInstance(request).create(session, metadataId, metadataObject, sysmeta);
1200
						
1201
			// save the ORE object
1202
			object = new ByteArrayInputStream(rdfXml.getBytes("UTF-8"));
1203
			sysmeta = createSystemMetadata(resourceMapId, session.getSubject(), object);
1204
			sysmeta.setFormatId(ObjectFormatCache.getInstance().getFormat("http://www.openarchives.org/ore/terms").getFormatId());
1205
			Identifier pid = MNodeService.getInstance(request).create(session, resourceMapId, object, sysmeta);
1206
			
1207
			// get the package we uploaded
1208
			InputStream bagStream = MNodeService.getInstance(request).getPackage(session, null, pid);
1209
			File bagFile = File.createTempFile("bagit.", ".zip");
1210
			IOUtils.copy(bagStream, new FileOutputStream(bagFile));
1211
			BagFactory bagFactory = new BagFactory();
1212
			Bag bag = bagFactory.createBag(bagFile);
1213
			Iterator<Manifest> manifestIter = bag.getTagManifests().iterator();
1214
			while (manifestIter.hasNext()) {
1215
				String filepath = manifestIter.next().getFilepath();
1216
				BagFile entryFile = bag.getBagFile(filepath);
1217
				InputStream result = entryFile.newInputStream();
1218
				// check ORE
1219
				if (filepath.contains(resourceMapId.getValue())) {
1220
					object.reset();
1221
					assertTrue(object.available() > 0);
1222
					assertTrue(result.available() > 0);
1223
					assertTrue(IOUtils.contentEquals(result, object));
1224
				}
1225
				// check metadata
1226
				if (filepath.contains(metadataId.getValue())) {
1227
					metadataObject.reset();
1228
					assertTrue(metadataObject.available() > 0);
1229
					assertTrue(result.available() > 0);
1230
					assertTrue(IOUtils.contentEquals(result, metadataObject));
1231
				}
1232
				if (filepath.contains(dataId.getValue())) {
1233
					dataObject1.reset();
1234
					assertTrue(dataObject1.available() > 0);
1235
					assertTrue(result.available() > 0);
1236
					assertTrue(IOUtils.contentEquals(result, dataObject1));
1237
				}
1238
				if (filepath.contains(dataId2.getValue())) {
1239
					dataObject2.reset();
1240
					assertTrue(dataObject2.available() > 0);
1241
					assertTrue(result.available() > 0);
1242
					assertTrue(IOUtils.contentEquals(result, dataObject2));
1243
				}
1244
				
1245
				
1246
			}
1247
			
1248
			// clean up
1249
			bagFile.delete();
1250
			
1251
			// test the ORE lookup
1252
			List<Identifier> oreIds = MNodeService.getInstance(request).lookupOreFor(metadataId, true);
1253
			assertTrue(oreIds.contains(resourceMapId));
1254

    
1255
		} catch (Exception e) {
1256
			e.printStackTrace();
1257
			fail("Unexpected error: " + e.getMessage());
1258
		}
1259
	}
1260
	
1261
  
1262
}
(3-3/6)