Project

General

Profile

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

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

    
28

    
29
import java.io.ByteArrayInputStream;
30
import java.io.ByteArrayOutputStream;
31
import java.io.IOException;
32
import java.io.InputStream;
33
import java.io.UnsupportedEncodingException;
34
import java.text.SimpleDateFormat;
35
import java.util.Calendar;
36
import java.util.Date;
37

    
38
import junit.framework.Test;
39
import junit.framework.TestSuite;
40

    
41
import org.apache.commons.io.IOUtils;
42
import org.dataone.configuration.Settings;
43
import org.dataone.service.util.Constants;
44
import org.dataone.service.util.DateTimeMarshaller;
45
import org.dataone.service.util.TypeMarshaller;
46
import org.dataone.service.exceptions.IdentifierNotUnique;
47
import org.dataone.service.exceptions.InsufficientResources;
48
import org.dataone.service.exceptions.InvalidRequest;
49
import org.dataone.service.exceptions.InvalidSystemMetadata;
50
import org.dataone.service.exceptions.InvalidToken;
51
import org.dataone.service.exceptions.NotAuthorized;
52
import org.dataone.service.exceptions.NotFound;
53
import org.dataone.service.exceptions.NotImplemented;
54
import org.dataone.service.exceptions.ServiceFailure;
55
import org.dataone.service.exceptions.SynchronizationFailed;
56
import org.dataone.service.exceptions.UnsupportedType;
57
import org.dataone.service.types.v1.AccessPolicy;
58
import org.dataone.service.types.v1.AccessRule;
59
import org.dataone.service.types.v1.Checksum;
60
import org.dataone.service.types.v1.DescribeResponse;
61
import org.dataone.service.types.v1.Event;
62
import org.dataone.service.types.v1.Identifier;
63
import org.dataone.service.types.v1.Log;
64
import org.dataone.service.types.v1.MonitorList;
65
import org.dataone.service.types.v1.Node;
66
import org.dataone.service.types.v1.NodeReference;
67
import org.dataone.service.types.v1.ObjectFormatIdentifier;
68
import org.dataone.service.types.v1.ObjectList;
69
import org.dataone.service.types.v1.Permission;
70
import org.dataone.service.types.v1.Session;
71
import org.dataone.service.types.v1.Subject;
72
import org.dataone.service.types.v1.SystemMetadata;
73
import org.jibx.runtime.JiBXException;
74
import org.junit.After;
75
import org.junit.Before;
76

    
77
/**
78
 * A JUnit test to exercise the Metacat Member Node service implementation.
79
 * This also tests a few of the D1NodeService superclass methods
80
 * 
81
 * @author cjones
82
 *
83
 */
84
public class MNodeServiceTest extends D1NodeServiceTest {
85

    
86
  /**
87
   * Set up the test fixtures
88
   * 
89
   * @throws Exception
90
   */
91
  @Before
92
  public void setUp() throws Exception {
93
    super.setUp();
94
    // set up the configuration for d1client
95
    Settings.getConfiguration().setProperty("D1Client.cnClassName", MockCNode.class.getName());
96
  }
97

    
98
  /**
99
   * Remove the test fixtures
100
   */
101
  @After
102
  public void tearDown() {
103
  }
104
  
105
  /**
106
   * Build the test suite
107
   * @return
108
   */
109
  public static Test suite() {
110
    
111
    TestSuite suite = new TestSuite();
112
    suite.addTest(new MNodeServiceTest("initialize"));
113
    // MNStorage tests
114
    suite.addTest(new MNodeServiceTest("testCreate"));
115
    suite.addTest(new MNodeServiceTest("testUpdate"));
116
    suite.addTest(new MNodeServiceTest("testDelete"));
117
    // MNRead tests
118
    suite.addTest(new MNodeServiceTest("testGet"));
119
    suite.addTest(new MNodeServiceTest("testGetChecksum"));
120
    suite.addTest(new MNodeServiceTest("testGetSystemMetadata"));
121
    suite.addTest(new MNodeServiceTest("testDescribe"));
122
    suite.addTest(new MNodeServiceTest("testListObjects"));
123
    suite.addTest(new MNodeServiceTest("testSynchronizationFailed"));
124
    // MNCore tests
125
    suite.addTest(new MNodeServiceTest("testPing"));
126
    suite.addTest(new MNodeServiceTest("testGetLogRecords"));
127
    suite.addTest(new MNodeServiceTest("testGetOperationStatistics"));
128
    suite.addTest(new MNodeServiceTest("testGetCapabilities"));
129
    // include these when they are part of the MN interface definitions
130
    // suite.addTest(new MNodeServiceTest("testGetObjectStatistics"));
131
    // suite.addTest(new MNodeServiceTest("testGetStatus"));
132
    // MNAuthorization tests
133
    suite.addTest(new MNodeServiceTest("testIsAuthorized"));
134
    suite.addTest(new MNodeServiceTest("testSetAccessPolicy"));
135
    // MNreplication tests
136
    suite.addTest(new MNodeServiceTest("testReplicate"));
137
    
138
    
139
    return suite;
140
    
141
  }
142
  
143
  /**
144
   * Constructor for the tests
145
   * 
146
   * @param name - the name of the test
147
   */
148
  public MNodeServiceTest(String name) {
149
    super(name);
150
    
151
  }
152

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

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

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

    
232
  }
233

    
234
  /**
235
   * Test getting the system metadata of an object
236
   */
237
  public void testGetSystemMetadata() {    
238
    printTestHeader("testGetSystemMetadata");
239

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

    
254
    } catch (InvalidToken e) {
255
      e.printStackTrace();      
256
      fail("Unexpected error: " + e.getMessage());
257

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

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

    
266
    } catch (IdentifierNotUnique e) {
267
      e.printStackTrace();
268
      fail("Unexpected error: " + e.getMessage());
269
      
270
    } catch (UnsupportedType e) {
271
      e.printStackTrace();
272
      fail("Unexpected error: " + e.getMessage());
273

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

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

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

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

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

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

    
298
    }
299
    
300
  }
301

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

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

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

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

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

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

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

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

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

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

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

    
360
    }
361
      
362
  }
363

    
364
  /**
365
   * test object deletion
366
   */
367
  public void testDelete() {
368
    printTestHeader("testDelete");
369

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

    
387
    } 
388

    
389
  }
390

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

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

    
426
    } catch (InvalidToken e) {
427
      e.printStackTrace();
428
      fail("Unexpected error: " + e.getMessage());
429

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

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

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

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

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

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

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

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

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

    
466
    }
467
  }
468

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

    
502
  /**
503
   * Test describing an object
504
   */
505
  public void testDescribe() {
506
    printTestHeader("testDescribe");
507

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

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

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

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

    
535
    } catch (IdentifierNotUnique e) {
536
      e.printStackTrace();
537
      fail("Unexpected error: " + e.getMessage());
538
      
539
    } catch (UnsupportedType e) {
540
      e.printStackTrace();
541
      fail("Unexpected error: " + e.getMessage());
542

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

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

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

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

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

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

    
567
    }
568
  }
569

    
570
  /**
571
   * Test getting the checksum of an object
572
   */
573
  public void testGetChecksum() {
574
    printTestHeader("testGetChecksum");
575

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

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

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

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

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

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

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

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

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

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

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

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

    
634
    }
635
    
636
  }
637

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

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

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

    
723
  public void testPing() {
724

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

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

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

    
741
    }
742
    
743
  }
744

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

    
768
  }
769

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

    
797
    }
798

    
799
  public void testGetLogRecords() {
800
    printTestHeader("testLogRecords");
801

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

    
827
    }
828
  }
829

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

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

    
937
    } catch (InvalidToken e) {
938
      e.printStackTrace();
939
      fail("Unexpected error: " + e.getMessage());
940

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

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

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

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

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

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

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

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

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

    
977
    }
978
  }
979

    
980
  
981
  
982
  
983
}
(3-3/4)