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.InputStream;
31
import java.io.UnsupportedEncodingException;
32
import java.text.SimpleDateFormat;
33
import java.util.Calendar;
34
import java.util.Date;
35

    
36
import junit.framework.Test;
37
import junit.framework.TestSuite;
38

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

    
72
/**
73
 * A JUnit test to exercise the Metacat Member Node service implementation.
74
 * This also tests a few of the D1NodeService superclass methods
75
 * 
76
 * @author cjones
77
 *
78
 */
79
public class MNodeServiceTest extends D1NodeServiceTest {
80

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

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

    
148
  /**
149
   * Initial blank test
150
   */
151
  public void initialize() {
152
    assertTrue(1 == 1);
153
    
154
  }
155
  
156
  /**
157
   * Test getting a known object
158
   */
159
  public void testGet() {
160
    printTestHeader("testGet");
161

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

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

    
227
  }
228

    
229
  /**
230
   * Test getting the system metadata of an object
231
   */
232
  public void testGetSystemMetadata() {    
233
    printTestHeader("testGetSystemMetadata");
234

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

    
249
    } catch (InvalidToken e) {
250
      e.printStackTrace();      
251
      fail("Unexpected error: " + e.getMessage());
252

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

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

    
261
    } catch (IdentifierNotUnique e) {
262
      e.printStackTrace();
263
      fail("Unexpected error: " + e.getMessage());
264
      
265
    } catch (UnsupportedType e) {
266
      e.printStackTrace();
267
      fail("Unexpected error: " + e.getMessage());
268

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

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

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

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

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

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

    
293
    }
294
    
295
  }
296

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

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

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

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

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

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

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

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

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

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

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

    
355
    }
356
      
357
  }
358

    
359
  /**
360
   * test object deletion
361
   */
362
  public void testDelete() {
363
    printTestHeader("testDelete");
364

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

    
382
    } 
383

    
384
  }
385

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

    
413
      assertEquals(updatedPid.getValue(), newPid.getValue());
414
//      assertTrue(updatedSysMeta.getObsolete(0).getValue().equals(pid.getValue()));
415
//      assertTrue(updatedSysMeta.getDerivedFrom(0).getValue().equals(pid.getValue()));        
416
      
417
    } catch (UnsupportedEncodingException e) {
418
      e.printStackTrace();
419
      fail("Unexpected error: " + e.getMessage());
420

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

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

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

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

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

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

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

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

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

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

    
461
    }
462
  }
463

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

    
497
  /**
498
   * Test describing an object
499
   */
500
  public void testDescribe() {
501
    printTestHeader("testDescribe");
502

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

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

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

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

    
530
    } catch (IdentifierNotUnique e) {
531
      e.printStackTrace();
532
      fail("Unexpected error: " + e.getMessage());
533
      
534
    } catch (UnsupportedType e) {
535
      e.printStackTrace();
536
      fail("Unexpected error: " + e.getMessage());
537

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

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

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

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

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

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

    
562
    }
563
  }
564

    
565
  /**
566
   * Test getting the checksum of an object
567
   */
568
  public void testGetChecksum() {
569
    printTestHeader("testGetChecksum");
570

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

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

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

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

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

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

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

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

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

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

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

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

    
629
    }
630
    
631
  }
632

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

    
668
  public void testGetCapabilities() {
669
      printTestHeader("testGetCapabilities");
670
    try {
671
      Node node = MNodeService.getInstance().getCapabilities();
672
      assertNotNull(node);
673
      // TODO: should probably test other parts of the node information
674
    } catch (Exception e) {
675
      e.printStackTrace();
676
      fail("Probably not yet implemented: " + e.getMessage());
677
    }
678
    
679
  }
680

    
681
  public void testGetOperationStatistics() {
682
      printTestHeader("testGetOperationStatistics");
683
    try {
684
      Session session = getTestSession();
685
      SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
686
        Date startTime = sdf.parse("2010-01-01");
687
        Date endTime = new Date();
688
      MonitorList monitorList = 
689
        MNodeService.getInstance().getOperationStatistics(
690
            session, 
691
            startTime, 
692
            endTime, 
693
            session.getSubject(), 
694
            Event.CREATE, 
695
            null //formatId
696
            );
697
      
698
      assertNotNull(monitorList);
699
      // TODO: should probably test other parts of the information
700
    } catch (Exception e) {
701
      e.printStackTrace();
702
      fail("Probably not yet implemented: " + e.getMessage());
703
    }
704
  }
705

    
706
  public void testPing() {
707

    
708
    try {
709
      boolean pingable = MNodeService.getInstance().ping();
710
      assertTrue(pingable);
711
      
712
    } catch (NotImplemented e) {
713
      e.printStackTrace();
714
      fail("Unexpected error: " + e.getMessage());
715

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

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

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

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

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

    
736
    }
737
    
738
  }
739

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

    
763
  }
764

    
765
  public void testGetLogRecords() {
766
    printTestHeader("testLogRecords");
767

    
768
    Log log = null;
769
    Session session = getTestSession();
770
    Date fromDate = new Date();
771
    Calendar calendar = Calendar.getInstance();
772
    calendar.setTime(fromDate);
773
    calendar.roll(Calendar.YEAR, false);
774
    fromDate = calendar.getTime();
775
    Date toDate = new Date();
776
    Event event = Event.CREATE;
777
    int start = 0;
778
    int count = 1;
779
    
780
    try {
781
      log = MNodeService.getInstance().getLogRecords(session, fromDate, toDate, 
782
        event, start, count);
783
      
784
      assertNotNull(log);      
785
      assertTrue(log.getCount() == count);
786
      assertTrue(log.getStart() == start);
787
      assertTrue(log.getTotal() >= 1);
788
        
789
    } catch (InvalidToken e) {
790
      e.printStackTrace();
791
      fail("Unexpected error: " + e.getMessage());
792

    
793
    } catch (ServiceFailure e) {
794
      e.printStackTrace();
795
      fail("Unexpected error: " + e.getMessage());
796
      
797
    } catch (NotAuthorized e) {
798
      e.printStackTrace();
799
      fail("Unexpected error: " + e.getMessage());
800
      
801
    } catch (InvalidRequest e) {
802
      e.printStackTrace();
803
      fail("Unexpected error: " + e.getMessage());
804
      
805
    } catch (NotImplemented e) {
806
      e.printStackTrace();
807
      fail("Unexpected error: " + e.getMessage());
808
      
809
    }
810
  }
811

    
812
  /**
813
   * Testing setting access on a known object
814
   */
815
  public void testSetAccessPolicy() {
816
    printTestHeader("testSetAccess");
817
    
818
    boolean accessWasSet = false;
819
    
820
    try {
821
      // create an object to set access on
822
      Session session = getTestSession();
823
      Identifier guid = new Identifier();
824
      guid.setValue("testSetAccess." + System.currentTimeMillis());
825
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
826
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
827
      Identifier pid = 
828
        MNodeService.getInstance().create(session, guid, object, sysmeta);
829
      // set the access
830
      AccessPolicy accessPolicy = new AccessPolicy();
831
      AccessRule allow = new AccessRule();
832
      allow.addPermission(Permission.WRITE);
833
      Subject publicSubject = new Subject();
834
      publicSubject.setValue(Constants.PUBLIC_SUBJECT);
835
      allow.addSubject(publicSubject);
836
      accessPolicy.addAllow(allow);
837
      
838
      accessWasSet = 
839
        MNodeService.getInstance().setAccessPolicy(session, pid, accessPolicy);
840
      assertTrue(accessWasSet);
841
      // test that it is enforced
842
      session.setSubject(publicSubject);
843
      boolean isAuthorized = MNodeService.getInstance().isAuthorized(session, pid, Permission.WRITE);
844
      assertTrue(isAuthorized);
845

    
846
    } catch (UnsupportedEncodingException e) {
847
      e.printStackTrace();
848
      
849
    } catch (InvalidToken e) {
850
      e.printStackTrace();
851
      fail("Unexpected error: " + e.getMessage());
852
      
853
    } catch (ServiceFailure e) {
854
      e.printStackTrace();
855
      fail("Unexpected error: " + e.getMessage());
856
      
857
    } catch (NotAuthorized e) {
858
      e.printStackTrace();
859
      fail("Unexpected error: " + e.getMessage());
860
      
861
    } catch (IdentifierNotUnique e) {
862
      e.printStackTrace();
863
      fail("Unexpected error: " + e.getMessage());
864
      
865
    } catch (UnsupportedType e) {
866
      e.printStackTrace();
867
      fail("Unexpected error: " + e.getMessage());
868
      
869
    } catch (InsufficientResources e) {
870
      e.printStackTrace();
871
      fail("Unexpected error: " + e.getMessage());
872
      
873
    } catch (InvalidSystemMetadata e) {
874
      e.printStackTrace();
875
      fail("Unexpected error: " + e.getMessage());
876
      
877
    } catch (NotImplemented e) {
878
      e.printStackTrace();
879
      fail("Unexpected error: " + e.getMessage());
880
      
881
    } catch (InvalidRequest e) {
882
      e.printStackTrace();
883
      fail("Unexpected error: " + e.getMessage());
884
      
885
    } catch (NotFound e) {
886
      e.printStackTrace();
887
      fail("Unexpected error: " + e.getMessage());
888
      
889
    } catch (Exception e) {
890
      e.printStackTrace();
891
      fail("Unexpected error: " + e.getMessage());
892
      
893
    }
894
      
895
  }
896

    
897
  /**
898
   * Test if a subject is authorized to read a known object
899
   */
900
  public void testIsAuthorized() {
901
    printTestHeader("testIsAuthorized");
902
    
903
    try {
904
      Session session = getTestSession();
905
      Identifier guid = new Identifier();
906
      guid.setValue("testIsAuthorized." + System.currentTimeMillis());
907
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
908
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
909
      Identifier pid = 
910
        MNodeService.getInstance().create(session, guid, object, sysmeta);
911
      boolean isAuthorized = 
912
        MNodeService.getInstance().isAuthorized(session, pid, Permission.READ);
913
      assertEquals(isAuthorized, true);
914
      
915
    } catch (UnsupportedEncodingException e) {
916
      e.printStackTrace();
917
      fail("Unexpected error: " + e.getMessage());
918

    
919
    } catch (InvalidToken e) {
920
      e.printStackTrace();
921
      fail("Unexpected error: " + e.getMessage());
922

    
923
    } catch (ServiceFailure e) {
924
      e.printStackTrace();
925
      fail("Unexpected error: " + e.getMessage());
926

    
927
    } catch (NotAuthorized e) {
928
      e.printStackTrace();
929
      fail("Unexpected error: " + e.getMessage());
930

    
931
    } catch (IdentifierNotUnique e) {
932
      e.printStackTrace();
933
      fail("Unexpected error: " + e.getMessage());
934

    
935
    } catch (UnsupportedType e) {
936
      e.printStackTrace();
937
      fail("Unexpected error: " + e.getMessage());
938

    
939
    } catch (InsufficientResources e) {
940
      e.printStackTrace();
941
      fail("Unexpected error: " + e.getMessage());
942

    
943
    } catch (InvalidSystemMetadata e) {
944
      e.printStackTrace();
945
      fail("Unexpected error: " + e.getMessage());
946

    
947
    } catch (NotImplemented e) {
948
      e.printStackTrace();
949
      fail("Unexpected error: " + e.getMessage());
950

    
951
    } catch (InvalidRequest e) {
952
      e.printStackTrace();
953
      fail("Unexpected error: " + e.getMessage());
954

    
955
    } catch (Exception e) {
956
      e.printStackTrace();
957
      fail("Unexpected error: " + e.getMessage());
958

    
959
    }
960
  }
961

    
962
  
963
  
964
  
965
}
(3-3/6)