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.util.DateTimeMarshaller;
43
import org.dataone.service.exceptions.IdentifierNotUnique;
44
import org.dataone.service.exceptions.InsufficientResources;
45
import org.dataone.service.exceptions.InvalidRequest;
46
import org.dataone.service.exceptions.InvalidSystemMetadata;
47
import org.dataone.service.exceptions.InvalidToken;
48
import org.dataone.service.exceptions.NotAuthorized;
49
import org.dataone.service.exceptions.NotFound;
50
import org.dataone.service.exceptions.NotImplemented;
51
import org.dataone.service.exceptions.ServiceFailure;
52
import org.dataone.service.exceptions.SynchronizationFailed;
53
import org.dataone.service.exceptions.UnsupportedType;
54
import org.dataone.service.types.v1.AccessPolicy;
55
import org.dataone.service.types.v1.AccessRule;
56
import org.dataone.service.types.v1.Checksum;
57
import org.dataone.service.types.v1.DescribeResponse;
58
import org.dataone.service.types.v1.Event;
59
import org.dataone.service.types.v1.Identifier;
60
import org.dataone.service.types.v1.Log;
61
import org.dataone.service.types.v1.MonitorList;
62
import org.dataone.service.types.v1.Node;
63
import org.dataone.service.types.v1.NodeReference;
64
import org.dataone.service.types.v1.ObjectFormatIdentifier;
65
import org.dataone.service.types.v1.ObjectList;
66
import org.dataone.service.types.v1.Permission;
67
import org.dataone.service.types.v1.Session;
68
import org.dataone.service.types.v1.Subject;
69
import org.dataone.service.types.v1.SystemMetadata;
70
import org.junit.After;
71
import org.junit.Before;
72

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

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

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

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

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

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

    
228
  }
229

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

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

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

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

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

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

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

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

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

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

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

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

    
294
    }
295
    
296
  }
297

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

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

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

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

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

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

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

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

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

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

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

    
356
    }
357
      
358
  }
359

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

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

    
383
    } 
384

    
385
  }
386

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

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

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

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

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

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

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

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

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

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

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

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

    
462
    }
463
  }
464

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

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

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

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

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

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

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

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

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

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

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

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

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

    
563
    }
564
  }
565

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

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

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

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

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

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

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

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

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

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

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

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

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

    
630
    }
631
    
632
  }
633

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

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

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

    
707
  public void testPing() {
708

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

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

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

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

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

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

    
737
    }
738
    
739
  }
740

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

    
764
  }
765

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

    
793
    }
794

    
795
  public void testGetLogRecords() {
796
    printTestHeader("testLogRecords");
797

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

    
823
    } catch (ServiceFailure e) {
824
      e.printStackTrace();
825
      fail("Unexpected error: " + e.getMessage());
826
      
827
    } catch (NotAuthorized e) {
828
      e.printStackTrace();
829
      fail("Unexpected error: " + e.getMessage());
830
      
831
    } catch (InvalidRequest e) {
832
      e.printStackTrace();
833
      fail("Unexpected error: " + e.getMessage());
834
      
835
    } catch (NotImplemented e) {
836
      e.printStackTrace();
837
      fail("Unexpected error: " + e.getMessage());
838
      
839
    }
840
  }
841

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

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

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

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

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

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

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

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

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

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

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

    
985
    } catch (Exception e) {
986
      e.printStackTrace();
987
      fail("Unexpected error: " + e.getMessage());
988

    
989
    }
990
  }
991

    
992
  
993
  
994
  
995
}
(3-3/4)