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
import static org.junit.Assert.assertTrue;
29

    
30
import java.io.ByteArrayInputStream;
31
import java.io.InputStream;
32
import java.io.UnsupportedEncodingException;
33
import java.text.SimpleDateFormat;
34
import java.util.Calendar;
35
import java.util.Date;
36
import java.util.List;
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.Constants;
44
import org.dataone.service.exceptions.IdentifierNotUnique;
45
import org.dataone.service.exceptions.InsufficientResources;
46
import org.dataone.service.exceptions.InvalidRequest;
47
import org.dataone.service.exceptions.InvalidSystemMetadata;
48
import org.dataone.service.exceptions.InvalidToken;
49
import org.dataone.service.exceptions.NotAuthorized;
50
import org.dataone.service.exceptions.NotFound;
51
import org.dataone.service.exceptions.NotImplemented;
52
import org.dataone.service.exceptions.ServiceFailure;
53
import org.dataone.service.exceptions.SynchronizationFailed;
54
import org.dataone.service.exceptions.UnsupportedType;
55
import org.dataone.service.types.v1.AccessPolicy;
56
import org.dataone.service.types.v1.AccessRule;
57
import org.dataone.service.types.v1.Checksum;
58
import org.dataone.service.types.v1.DescribeResponse;
59
import org.dataone.service.types.v1.Event;
60
import org.dataone.service.types.v1.Identifier;
61
import org.dataone.service.types.v1.Log;
62
import org.dataone.service.types.v1.MonitorList;
63
import org.dataone.service.types.v1.Node;
64
import org.dataone.service.types.v1.NodeReference;
65
import org.dataone.service.types.v1.ObjectFormat;
66
import org.dataone.service.types.v1.ObjectFormatIdentifier;
67
import org.dataone.service.types.v1.ObjectList;
68
import org.dataone.service.types.v1.Permission;
69
import org.dataone.service.types.v1.Session;
70
import org.dataone.service.types.v1.Subject;
71
import org.dataone.service.types.v1.SystemMetadata;
72
import org.junit.After;
73
import org.junit.Before;
74

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

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

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

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

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

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

    
230
  }
231

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

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

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

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

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

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

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

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

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

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

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

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

    
296
    }
297
    
298
  }
299

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

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

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

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

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

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

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

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

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

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

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

    
358
    }
359
      
360
  }
361

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

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

    
385
    } 
386

    
387
  }
388

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

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

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

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

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

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

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

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

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

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

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

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

    
464
    }
465
  }
466

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

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

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

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

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

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

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

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

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

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

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

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

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

    
565
    }
566
  }
567

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

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

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

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

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

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

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

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

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

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

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

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

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

    
632
    }
633
    
634
  }
635

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

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

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

    
709
  public void testPing() {
710

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

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

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

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

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

    
735
    } catch (UnsupportedType e) {
736
      e.printStackTrace();
737
      fail("Unexpected error: " + e.getMessage());
738

    
739
    }
740
    
741
  }
742

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

    
766
  }
767

    
768
  public void testGetLogRecords() {
769
    printTestHeader("testLogRecords");
770

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
962
    }
963
  }
964

    
965
  
966
  
967
  
968
}
(3-3/6)