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 (InsufficientResources e) {
722
      e.printStackTrace();
723
      fail("Unexpected error: " + e.getMessage());
724

    
725
    }
726
    
727
  }
728

    
729
  public void testSynchronizationFailed() {
730
    printTestHeader("testSynchronizationFailed");
731
    try {
732
        Session session = getTestSession();
733
        
734
        // create the object
735
        Identifier pid = new Identifier();
736
        pid.setValue("testSynchronizationFailed." + System.currentTimeMillis());
737
        InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
738
        SystemMetadata sysmeta = createSystemMetadata(pid, session.getSubject(), object);
739
        Identifier retPid = MNodeService.getInstance(request).create(session, pid, object, sysmeta);
740
        assertEquals(retPid.getValue(), pid.getValue());
741
        
742
        // pretend the sync failed
743
      SynchronizationFailed syncFailed = 
744
        new SynchronizationFailed("0000", "Testing Synch Failure");
745
      syncFailed.setPid(pid.getValue());
746
      MNodeService.getInstance(request).synchronizationFailed(session, syncFailed );
747
    } catch (Exception e) {
748
      e.printStackTrace();
749
        fail("Unexpected error: " + e.getMessage());
750
    }
751

    
752
  }
753

    
754
  public void testSystemMetadataChanged() {
755
      printTestHeader("testSystemMetadataChanged");
756
      try {
757
          Session session = getTestSession();
758
          
759
          // create the object
760
          Identifier pid = new Identifier();
761
          pid.setValue("testSystemMetadataChanged." + System.currentTimeMillis());
762
          InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
763
          SystemMetadata sysmeta = createSystemMetadata(pid, session.getSubject(), object);
764
          Identifier retPid = MNodeService.getInstance(request).create(session, pid, object, sysmeta);
765
          assertEquals(retPid.getValue(), pid.getValue());
766
          
767
          // pretend the system metadata changed on the CN
768
          MNodeService.getInstance(request).systemMetadataChanged(session, 
769
                  retPid, 5000L, Calendar.getInstance().getTime());
770
          
771
      } catch (Exception e) {
772
          if (e instanceof NotAuthorized) {
773
              // only CN subjects can call this
774
              // TODO: use a CN certificate in the tests
775
          } else {
776
              fail("Unexpected error: " + e.getMessage());
777
              
778
          }
779
      }
780

    
781
    }
782

    
783
  public void testGetLogRecords() {
784
    printTestHeader("testLogRecords");
785

    
786
    try {
787
	    Log log = null;
788
	    Session session = getTestSession();
789
	    Date fromDate = new Date();
790
	    Calendar calendar = Calendar.getInstance();
791
	    calendar.setTime(fromDate);
792
	    calendar.roll(Calendar.YEAR, false);
793
	    fromDate = calendar.getTime();
794
	    Date toDate = new Date();
795
	    Event event = Event.CREATE;
796
	    int start = 0;
797
	    int count = 1;
798
    
799
      log = MNodeService.getInstance(request).getLogRecords(session, fromDate, toDate, 
800
        event, start, count);
801
      
802
      assertNotNull(log);      
803
      assertTrue(log.getCount() == count);
804
      assertTrue(log.getStart() == start);
805
      assertTrue(log.getTotal() >= 1);
806
        
807
    } catch (Exception e) {
808
      e.printStackTrace();
809
      fail("Unexpected error: " + e.getMessage());
810

    
811
    }
812
  }
813

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

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

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

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

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

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

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

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

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

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

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

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

    
961
    }
962
  }
963

    
964
  
965
  
966
  
967
}
(3-3/4)