Project

General

Profile

1 6309 cjones
/**
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 6338 cjones
29 6309 cjones
import java.io.ByteArrayInputStream;
30 6942 cjones
import java.io.ByteArrayOutputStream;
31
import java.io.IOException;
32 6309 cjones
import java.io.InputStream;
33
import java.io.UnsupportedEncodingException;
34 6326 leinfelder
import java.text.SimpleDateFormat;
35 6312 cjones
import java.util.Calendar;
36 6309 cjones
import java.util.Date;
37
38
import junit.framework.Test;
39
import junit.framework.TestSuite;
40
41 6324 leinfelder
import org.apache.commons.io.IOUtils;
42 6348 leinfelder
import org.dataone.configuration.Settings;
43 6372 leinfelder
import org.dataone.service.util.Constants;
44 6605 cjones
import org.dataone.service.util.DateTimeMarshaller;
45 6942 cjones
import org.dataone.service.util.TypeMarshaller;
46 6309 cjones
import org.dataone.service.exceptions.IdentifierNotUnique;
47
import org.dataone.service.exceptions.InsufficientResources;
48
import org.dataone.service.exceptions.InvalidRequest;
49
import org.dataone.service.exceptions.InvalidSystemMetadata;
50
import org.dataone.service.exceptions.InvalidToken;
51
import org.dataone.service.exceptions.NotAuthorized;
52
import org.dataone.service.exceptions.NotFound;
53
import org.dataone.service.exceptions.NotImplemented;
54
import org.dataone.service.exceptions.ServiceFailure;
55 6333 leinfelder
import org.dataone.service.exceptions.SynchronizationFailed;
56 6309 cjones
import org.dataone.service.exceptions.UnsupportedType;
57 6366 leinfelder
import org.dataone.service.types.v1.AccessPolicy;
58
import org.dataone.service.types.v1.AccessRule;
59
import org.dataone.service.types.v1.Checksum;
60
import org.dataone.service.types.v1.DescribeResponse;
61
import org.dataone.service.types.v1.Event;
62
import org.dataone.service.types.v1.Identifier;
63
import org.dataone.service.types.v1.Log;
64
import org.dataone.service.types.v1.MonitorList;
65
import org.dataone.service.types.v1.Node;
66
import org.dataone.service.types.v1.NodeReference;
67
import org.dataone.service.types.v1.ObjectFormatIdentifier;
68
import org.dataone.service.types.v1.ObjectList;
69
import org.dataone.service.types.v1.Permission;
70
import org.dataone.service.types.v1.Session;
71
import org.dataone.service.types.v1.Subject;
72
import org.dataone.service.types.v1.SystemMetadata;
73 6942 cjones
import org.jibx.runtime.JiBXException;
74 6309 cjones
import org.junit.After;
75
import org.junit.Before;
76
77
/**
78
 * A JUnit test to exercise the Metacat Member Node service implementation.
79
 * This also tests a few of the D1NodeService superclass methods
80
 *
81
 * @author cjones
82
 *
83
 */
84 6324 leinfelder
public class MNodeServiceTest extends D1NodeServiceTest {
85 6309 cjones
86 6354 cjones
  /**
87
   * Set up the test fixtures
88
   *
89
   * @throws Exception
90
   */
91
  @Before
92
  public void setUp() throws Exception {
93
    super.setUp();
94
    // set up the configuration for d1client
95
    Settings.getConfiguration().setProperty("D1Client.cnClassName", MockCNode.class.getName());
96
  }
97 6309 cjones
98 6354 cjones
  /**
99
   * Remove the test fixtures
100
   */
101
  @After
102
  public void tearDown() {
103
  }
104
105
  /**
106
   * Build the test suite
107
   * @return
108
   */
109
  public static Test suite() {
110
111
    TestSuite suite = new TestSuite();
112 6309 cjones
    suite.addTest(new MNodeServiceTest("initialize"));
113
    // MNStorage tests
114
    suite.addTest(new MNodeServiceTest("testCreate"));
115 6314 cjones
    suite.addTest(new MNodeServiceTest("testUpdate"));
116
    suite.addTest(new MNodeServiceTest("testDelete"));
117 6309 cjones
    // MNRead tests
118 6314 cjones
    suite.addTest(new MNodeServiceTest("testGet"));
119
    suite.addTest(new MNodeServiceTest("testGetChecksum"));
120
    suite.addTest(new MNodeServiceTest("testGetSystemMetadata"));
121
    suite.addTest(new MNodeServiceTest("testDescribe"));
122 6326 leinfelder
    suite.addTest(new MNodeServiceTest("testListObjects"));
123 6333 leinfelder
    suite.addTest(new MNodeServiceTest("testSynchronizationFailed"));
124 6309 cjones
    // MNCore tests
125
    suite.addTest(new MNodeServiceTest("testPing"));
126
    suite.addTest(new MNodeServiceTest("testGetLogRecords"));
127 6327 leinfelder
    suite.addTest(new MNodeServiceTest("testGetOperationStatistics"));
128
    suite.addTest(new MNodeServiceTest("testGetCapabilities"));
129 6329 leinfelder
    // include these when they are part of the MN interface definitions
130 6327 leinfelder
    // suite.addTest(new MNodeServiceTest("testGetObjectStatistics"));
131
    // suite.addTest(new MNodeServiceTest("testGetStatus"));
132 6309 cjones
    // MNAuthorization tests
133 6325 leinfelder
    suite.addTest(new MNodeServiceTest("testIsAuthorized"));
134
    suite.addTest(new MNodeServiceTest("testSetAccessPolicy"));
135 6309 cjones
    // MNreplication tests
136 6329 leinfelder
    suite.addTest(new MNodeServiceTest("testReplicate"));
137 6309 cjones
138 6354 cjones
139
    return suite;
140
141
  }
142
143
  /**
144
   * Constructor for the tests
145
   *
146
   * @param name - the name of the test
147
   */
148
  public MNodeServiceTest(String name) {
149
    super(name);
150
151
  }
152 6309 cjones
153 6354 cjones
  /**
154
   * Initial blank test
155
   */
156
  public void initialize() {
157
    assertTrue(1 == 1);
158
159
  }
160
161
  /**
162
   * Test getting a known object
163
   */
164
  public void testGet() {
165 6309 cjones
    printTestHeader("testGet");
166
167 6354 cjones
    try {
168
      Session session = getTestSession();
169
      Identifier guid = new Identifier();
170
      guid.setValue("testGet." + System.currentTimeMillis());
171
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
172
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
173 6542 leinfelder
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
174
      InputStream result = MNodeService.getInstance(request).get(session, guid);
175 6354 cjones
      // go back to beginning of original stream
176
      object.reset();
177
      // check
178
      assertTrue(object.available() > 0);
179
      assertTrue(result.available() > 0);
180
      assertTrue(IOUtils.contentEquals(result, object));
181
182 6309 cjones
    } catch (UnsupportedEncodingException e) {
183 6354 cjones
      e.printStackTrace();
184
      fail("Unexpected error: " + e.getMessage());
185 6309 cjones
186
    } catch (InvalidToken e) {
187 6354 cjones
      e.printStackTrace();
188
      fail("Unexpected error: " + e.getMessage());
189
190 6309 cjones
    } catch (ServiceFailure e) {
191 6354 cjones
      e.printStackTrace();
192
      fail("Unexpected error: " + e.getMessage());
193
194 6309 cjones
    } catch (NotAuthorized e) {
195 6354 cjones
      e.printStackTrace();
196
      fail("Unexpected error: " + e.getMessage());
197
198 6309 cjones
    } catch (IdentifierNotUnique e) {
199 6354 cjones
      e.printStackTrace();
200
      fail("Unexpected error: " + e.getMessage());
201
202 6309 cjones
    } catch (UnsupportedType e) {
203 6354 cjones
      e.printStackTrace();
204
      fail("Unexpected error: " + e.getMessage());
205
206 6309 cjones
    } catch (InsufficientResources e) {
207 6354 cjones
      e.printStackTrace();
208
      fail("Unexpected error: " + e.getMessage());
209
210 6309 cjones
    } catch (InvalidSystemMetadata e) {
211 6354 cjones
      e.printStackTrace();
212
      fail("Unexpected error: " + e.getMessage());
213
214 6309 cjones
    } catch (NotImplemented e) {
215 6354 cjones
      e.printStackTrace();
216
      fail("Unexpected error: " + e.getMessage());
217
218 6309 cjones
    } catch (InvalidRequest e) {
219 6354 cjones
      e.printStackTrace();
220
      fail("Unexpected error: " + e.getMessage());
221
222 6309 cjones
    } catch (NotFound e) {
223 6354 cjones
      e.printStackTrace();
224
      fail("Unexpected error: " + e.getMessage());
225
226 6309 cjones
    } catch (Exception e) {
227 6354 cjones
      e.printStackTrace();
228
      fail("Unexpected error: " + e.getMessage());
229
230 6309 cjones
    }
231
232 6354 cjones
  }
233 6309 cjones
234 6354 cjones
  /**
235
   * Test getting the system metadata of an object
236
   */
237
  public void testGetSystemMetadata() {
238 6309 cjones
    printTestHeader("testGetSystemMetadata");
239
240
    try {
241 6354 cjones
      Session session = getTestSession();
242
      Identifier guid = new Identifier();
243
      guid.setValue("testGetSystemMetadata." + System.currentTimeMillis());
244
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
245
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
246 6542 leinfelder
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
247
      SystemMetadata newsysmeta = MNodeService.getInstance(request).getSystemMetadata(session, pid);
248 6354 cjones
      assertEquals(newsysmeta.getIdentifier().getValue(), sysmeta.getIdentifier().getValue());
249
250 6309 cjones
    } catch (UnsupportedEncodingException e) {
251 6354 cjones
      e.printStackTrace();
252
      fail("Unexpected error: " + e.getMessage());
253 6309 cjones
254
    } catch (InvalidToken e) {
255 6354 cjones
      e.printStackTrace();
256
      fail("Unexpected error: " + e.getMessage());
257 6309 cjones
258
    } catch (ServiceFailure e) {
259 6354 cjones
      e.printStackTrace();
260
      fail("Unexpected error: " + e.getMessage());
261 6309 cjones
262
    } catch (NotAuthorized e) {
263 6354 cjones
      e.printStackTrace();
264
      fail("Unexpected error: " + e.getMessage());
265 6309 cjones
266
    } catch (IdentifierNotUnique e) {
267 6354 cjones
      e.printStackTrace();
268
      fail("Unexpected error: " + e.getMessage());
269
270 6309 cjones
    } catch (UnsupportedType e) {
271 6354 cjones
      e.printStackTrace();
272
      fail("Unexpected error: " + e.getMessage());
273 6309 cjones
274
    } catch (InsufficientResources e) {
275 6354 cjones
      e.printStackTrace();
276
      fail("Unexpected error: " + e.getMessage());
277 6309 cjones
278
    } catch (InvalidSystemMetadata e) {
279 6354 cjones
      e.printStackTrace();
280
      fail("Unexpected error: " + e.getMessage());
281 6309 cjones
282
    } catch (NotImplemented e) {
283 6354 cjones
      e.printStackTrace();
284
      fail("Unexpected error: " + e.getMessage());
285 6309 cjones
286
    } catch (InvalidRequest e) {
287 6354 cjones
      e.printStackTrace();
288
      fail("Unexpected error: " + e.getMessage());
289 6309 cjones
290
    } catch (NotFound e) {
291 6354 cjones
      e.printStackTrace();
292
      fail("Unexpected error: " + e.getMessage());
293 6309 cjones
294
    } catch (Exception e) {
295 6354 cjones
      e.printStackTrace();
296
      fail("Unexpected error: " + e.getMessage());
297 6309 cjones
298
    }
299
300 6354 cjones
  }
301 6309 cjones
302 6354 cjones
  /**
303
   * Test object creation
304
   */
305
  public void testCreate() {
306 6309 cjones
    printTestHeader("testCreate");
307
308 6354 cjones
    try {
309
      Session session = getTestSession();
310
      Identifier guid = new Identifier();
311
      guid.setValue("testCreate." + System.currentTimeMillis());
312
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
313
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
314 6542 leinfelder
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
315 6354 cjones
      assertEquals(guid.getValue(), pid.getValue());
316 6309 cjones
    } catch (UnsupportedEncodingException e) {
317 6354 cjones
      e.printStackTrace();
318
      fail("Unexpected error: " + e.getMessage());
319 6309 cjones
320
    } catch (InvalidToken e) {
321 6354 cjones
      e.printStackTrace();
322
      fail("Unexpected error: " + e.getMessage());
323 6309 cjones
324
    } catch (ServiceFailure e) {
325 6354 cjones
      e.printStackTrace();
326
      fail("Unexpected error: " + e.getMessage());
327 6309 cjones
328
    } catch (NotAuthorized e) {
329 6354 cjones
      e.printStackTrace();
330
      fail("Unexpected error: " + e.getMessage());
331 6309 cjones
332
    } catch (IdentifierNotUnique e) {
333 6354 cjones
      e.printStackTrace();
334
      fail("Unexpected error: " + e.getMessage());
335 6309 cjones
336
    } catch (UnsupportedType e) {
337 6354 cjones
      e.printStackTrace();
338
      fail("Unexpected error: " + e.getMessage());
339 6309 cjones
340
    } catch (InsufficientResources e) {
341 6354 cjones
      e.printStackTrace();
342
      fail("Unexpected error: " + e.getMessage());
343 6309 cjones
344
    } catch (InvalidSystemMetadata e) {
345 6354 cjones
      e.printStackTrace();
346
      fail("Unexpected error: " + e.getMessage());
347 6309 cjones
348
    } catch (NotImplemented e) {
349 6354 cjones
      e.printStackTrace();
350
      fail("Unexpected error: " + e.getMessage());
351 6309 cjones
352
    } catch (InvalidRequest e) {
353 6354 cjones
      e.printStackTrace();
354
      fail("Unexpected error: " + e.getMessage());
355 6309 cjones
356
    } catch (Exception e) {
357 6354 cjones
      e.printStackTrace();
358
      fail("Unexpected error: " + e.getMessage());
359 6309 cjones
360
    }
361
362
  }
363
364 6354 cjones
  /**
365
   * test object deletion
366
   */
367
  public void testDelete() {
368 6309 cjones
    printTestHeader("testDelete");
369
370 6354 cjones
    try {
371
      Session session = getTestSession();
372
      Identifier guid = new Identifier();
373
      guid.setValue("testDelete." + System.currentTimeMillis());
374
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
375
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
376 6542 leinfelder
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
377
      Identifier deletedPid = MNodeService.getInstance(request).delete(session, pid);
378 6333 leinfelder
      assertEquals(pid.getValue(), deletedPid.getValue());
379 6309 cjones
380 6354 cjones
    } catch (UnsupportedEncodingException e) {
381
      e.printStackTrace();
382
383 6324 leinfelder
    } catch (Exception e) {
384 6354 cjones
      e.printStackTrace();
385
      fail("Unexpected error: " + e.getMessage());
386 6309 cjones
387 6324 leinfelder
    }
388 6309 cjones
389 6354 cjones
  }
390 6309 cjones
391 6354 cjones
  /**
392
   * Test object updating
393
   */
394
  public void testUpdate() {
395 6309 cjones
    printTestHeader("testUpdate");
396
397 6354 cjones
    try {
398
      Session session = getTestSession();
399
      Identifier guid = new Identifier();
400
      guid.setValue("testUpdate." + System.currentTimeMillis());
401
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
402
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
403
      Identifier newPid = new Identifier();
404 6596 leinfelder
      newPid.setValue("testUpdate." + (System.currentTimeMillis() + 1)); // ensure it is different from original
405 6354 cjones
      Identifier pid =
406 6542 leinfelder
        MNodeService.getInstance(request).create(session, guid, object, sysmeta);
407 6338 cjones
408 6354 cjones
      SystemMetadata newSysMeta = createSystemMetadata(newPid, session.getSubject(), object);
409
410
      // do the update
411
      Identifier updatedPid =
412 6542 leinfelder
        MNodeService.getInstance(request).update(session, pid, object, newPid, newSysMeta);
413 6338 cjones
414 6354 cjones
      // get the updated system metadata
415 6338 cjones
      SystemMetadata updatedSysMeta =
416 6542 leinfelder
        MNodeService.getInstance(request).getSystemMetadata(session, updatedPid);
417 6338 cjones
418 6354 cjones
      assertEquals(updatedPid.getValue(), newPid.getValue());
419 6366 leinfelder
//      assertTrue(updatedSysMeta.getObsolete(0).getValue().equals(pid.getValue()));
420
//      assertTrue(updatedSysMeta.getDerivedFrom(0).getValue().equals(pid.getValue()));
421 6354 cjones
422 6309 cjones
    } catch (UnsupportedEncodingException e) {
423 6354 cjones
      e.printStackTrace();
424
      fail("Unexpected error: " + e.getMessage());
425 6309 cjones
426
    } catch (InvalidToken e) {
427 6354 cjones
      e.printStackTrace();
428
      fail("Unexpected error: " + e.getMessage());
429 6309 cjones
430
    } catch (ServiceFailure e) {
431 6354 cjones
      e.printStackTrace();
432
      fail("Unexpected error: " + e.getMessage());
433 6309 cjones
434
    } catch (NotAuthorized e) {
435 6354 cjones
      e.printStackTrace();
436
      fail("Unexpected error: " + e.getMessage());
437 6309 cjones
438
    } catch (IdentifierNotUnique e) {
439 6354 cjones
      e.printStackTrace();
440
      fail("Unexpected error: " + e.getMessage());
441 6309 cjones
442
    } catch (UnsupportedType e) {
443 6354 cjones
      e.printStackTrace();
444
      fail("Unexpected error: " + e.getMessage());
445 6309 cjones
446
    } catch (InsufficientResources e) {
447 6354 cjones
      e.printStackTrace();
448
      fail("Unexpected error: " + e.getMessage());
449 6309 cjones
450
    } catch (InvalidSystemMetadata e) {
451 6354 cjones
      e.printStackTrace();
452
      fail("Unexpected error: " + e.getMessage());
453 6309 cjones
454
    } catch (NotImplemented e) {
455 6354 cjones
      e.printStackTrace();
456
      fail("Unexpected error: " + e.getMessage());
457 6309 cjones
458
    } catch (InvalidRequest e) {
459 6354 cjones
      e.printStackTrace();
460
      fail("Unexpected error: " + e.getMessage());
461 6309 cjones
462
    } catch (Exception e) {
463 6354 cjones
      e.printStackTrace();
464
      fail("Unexpected error: " + e.getMessage());
465 6309 cjones
466
    }
467 6354 cjones
  }
468 6309 cjones
469 6354 cjones
  /**
470
   * We currently expect this unit test to fail because it should rely on a different member node
471
   * to retrieve the object from. Currently it gets the object from itself and throws
472
   * and expected error for duplicate entry.
473
   *
474
   */
475
  public void testReplicate() {
476
      printTestHeader("testReplicate");
477
      try {
478
        Session session = getTestSession();
479
        Identifier guid = new Identifier();
480
        guid.setValue("testReplicate." + System.currentTimeMillis());
481
        InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
482
        SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
483
        // save locally
484 6542 leinfelder
        Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
485 6354 cjones
        // get our node reference (attempting to replicate with self)
486 6542 leinfelder
        NodeReference sourceNode = MNodeService.getInstance(request).getCapabilities().getIdentifier();
487 6354 cjones
        // attempt to replicate with ourselves -- this should fail!
488
      boolean result = false;
489
      try {
490 6542 leinfelder
        result = MNodeService.getInstance(request).replicate(session, sysmeta, sourceNode);
491 6354 cjones
      } catch (Exception inu) {
492
        // we are expecting this to fail since we already have the doc
493
        result = true;
494
      }
495
      assertTrue(result);
496
      } catch (Exception e) {
497
        e.printStackTrace();
498
      fail("Probably not yet implemented: " + e.getMessage());
499
    }
500
  }
501 6309 cjones
502 6354 cjones
  /**
503
   * Test describing an object
504
   */
505
  public void testDescribe() {
506 6314 cjones
    printTestHeader("testDescribe");
507 6309 cjones
508
    try {
509 6354 cjones
      Session session = getTestSession();
510
      Identifier guid = new Identifier();
511
      guid.setValue("testGetSystemMetadata." + System.currentTimeMillis());
512
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
513
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
514 6542 leinfelder
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
515
      DescribeResponse describeResponse = MNodeService.getInstance(request).describe(session, pid);
516 6354 cjones
      assertEquals(describeResponse.getDataONE_Checksum().getValue(), sysmeta.getChecksum().getValue());
517 6597 leinfelder
      assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), sysmeta.getFormatId().getValue());
518 6354 cjones
519 6309 cjones
    } catch (UnsupportedEncodingException e) {
520 6354 cjones
      e.printStackTrace();
521
      fail("Unexpected error: " + e.getMessage());
522 6309 cjones
523
    } catch (InvalidToken e) {
524 6354 cjones
      e.printStackTrace();
525
      fail("Unexpected error: " + e.getMessage());
526 6309 cjones
527
    } catch (ServiceFailure e) {
528 6354 cjones
      e.printStackTrace();
529
      fail("Unexpected error: " + e.getMessage());
530 6309 cjones
531
    } catch (NotAuthorized e) {
532 6354 cjones
      e.printStackTrace();
533
      fail("Unexpected error: " + e.getMessage());
534 6309 cjones
535
    } catch (IdentifierNotUnique e) {
536 6354 cjones
      e.printStackTrace();
537
      fail("Unexpected error: " + e.getMessage());
538
539 6309 cjones
    } catch (UnsupportedType e) {
540 6354 cjones
      e.printStackTrace();
541
      fail("Unexpected error: " + e.getMessage());
542 6309 cjones
543
    } catch (InsufficientResources e) {
544 6354 cjones
      e.printStackTrace();
545
      fail("Unexpected error: " + e.getMessage());
546 6309 cjones
547
    } catch (InvalidSystemMetadata e) {
548 6354 cjones
      e.printStackTrace();
549
      fail("Unexpected error: " + e.getMessage());
550 6309 cjones
551
    } catch (NotImplemented e) {
552 6354 cjones
      e.printStackTrace();
553
      fail("Unexpected error: " + e.getMessage());
554 6309 cjones
555
    } catch (InvalidRequest e) {
556 6354 cjones
      e.printStackTrace();
557
      fail("Unexpected error: " + e.getMessage());
558 6309 cjones
559
    } catch (NotFound e) {
560 6354 cjones
      e.printStackTrace();
561
      fail("Unexpected error: " + e.getMessage());
562 6309 cjones
563
    } catch (Exception e) {
564 6354 cjones
      e.printStackTrace();
565
      fail("Unexpected error: " + e.getMessage());
566 6309 cjones
567
    }
568 6354 cjones
  }
569 6309 cjones
570 6354 cjones
  /**
571
   * Test getting the checksum of an object
572
   */
573
  public void testGetChecksum() {
574 6309 cjones
    printTestHeader("testGetChecksum");
575
576 6354 cjones
    try {
577
      Session session = getTestSession();
578
      Identifier guid = new Identifier();
579
      guid.setValue("testGetChecksum." + System.currentTimeMillis());
580
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
581
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
582 6542 leinfelder
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
583
      Checksum checksum = MNodeService.getInstance(request).getChecksum(session, pid, "MD5");
584 6354 cjones
      assertEquals(checksum.getValue(), sysmeta.getChecksum().getValue());
585 6309 cjones
586 6354 cjones
    } catch (UnsupportedEncodingException e) {
587
      e.printStackTrace();
588
      fail("Unexpected error: " + e.getMessage());
589 6309 cjones
590
    } catch (InvalidToken e) {
591 6354 cjones
      e.printStackTrace();
592
      fail("Unexpected error: " + e.getMessage());
593 6309 cjones
594
    } catch (ServiceFailure e) {
595 6354 cjones
      e.printStackTrace();
596
      fail("Unexpected error: " + e.getMessage());
597 6309 cjones
598
    } catch (NotAuthorized e) {
599 6354 cjones
      e.printStackTrace();
600
      fail("Unexpected error: " + e.getMessage());
601 6309 cjones
602
    } catch (IdentifierNotUnique e) {
603 6354 cjones
      e.printStackTrace();
604
      fail("Unexpected error: " + e.getMessage());
605 6309 cjones
606
    } catch (UnsupportedType e) {
607 6354 cjones
      e.printStackTrace();
608
      fail("Unexpected error: " + e.getMessage());
609 6309 cjones
610
    } catch (InsufficientResources e) {
611 6354 cjones
      e.printStackTrace();
612
      fail("Unexpected error: " + e.getMessage());
613 6309 cjones
614
    } catch (InvalidSystemMetadata e) {
615 6354 cjones
      e.printStackTrace();
616
      fail("Unexpected error: " + e.getMessage());
617 6309 cjones
618
    } catch (NotImplemented e) {
619 6354 cjones
      e.printStackTrace();
620
      fail("Unexpected error: " + e.getMessage());
621 6309 cjones
622
    } catch (InvalidRequest e) {
623 6354 cjones
      e.printStackTrace();
624
      fail("Unexpected error: " + e.getMessage());
625 6309 cjones
626
    } catch (NotFound e) {
627 6354 cjones
      e.printStackTrace();
628
      fail("Unexpected error: " + e.getMessage());
629 6309 cjones
630
    } catch (Exception e) {
631 6354 cjones
      e.printStackTrace();
632
      fail("Unexpected error: " + e.getMessage());
633 6309 cjones
634
    }
635 6354 cjones
636
  }
637 6309 cjones
638 6354 cjones
  /**
639
   * Testing listing objects on the Member Node
640
   */
641
  public void testListObjects() {
642
      printTestHeader("testListObjects");
643
644
      try {
645
646
        Session session = getTestSession();
647
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
648
        Date startTime = sdf.parse("2010-01-01");
649
        Date endTime = new Date();
650
        ObjectFormatIdentifier objectFormatId = null;
651
        boolean replicaStatus = false;
652
        int start = 0;
653
        int count = 1;
654
655
        // insert at least one object
656
        testCreate();
657
        // now check that we have at least one
658
        ObjectList objectList =
659 6542 leinfelder
          MNodeService.getInstance(request).listObjects(session, startTime, endTime,
660 6354 cjones
              objectFormatId, replicaStatus, start, count);
661
        assertNotNull(objectList);
662
        assertTrue(objectList.getCount() == count);
663
        assertTrue(objectList.getStart() == 0);
664
        assertTrue(objectList.getTotal() > 1);
665
666
      } catch (Exception e) {
667
        e.printStackTrace();
668
        fail("Unexpected error: " + e.getMessage());
669
670
      }
671
  }
672 6309 cjones
673 6354 cjones
  public void testGetCapabilities() {
674
      printTestHeader("testGetCapabilities");
675
    try {
676 6542 leinfelder
      Node node = MNodeService.getInstance(request).getCapabilities();
677 6942 cjones
      ByteArrayOutputStream baos = new ByteArrayOutputStream();
678
      TypeMarshaller.marshalTypeToOutputStream(node, baos);
679 6354 cjones
      assertNotNull(node);
680
      // TODO: should probably test other parts of the node information
681 6942 cjones
682
    } catch (JiBXException e) {
683
        e.printStackTrace();
684
        fail("The node instance couldn't be parsed correctly:" + e.getMessage());
685
686
    } catch (IOException e) {
687
        e.printStackTrace();
688
        fail("The node instance couldn't be read correctly:" + e.getMessage());
689
690 6354 cjones
    } catch (Exception e) {
691 6942 cjones
        e.printStackTrace();
692
        fail("Probably not yet implemented: " + e.getMessage());
693
694 6354 cjones
    }
695
696
  }
697 6309 cjones
698 6354 cjones
  public void testGetOperationStatistics() {
699
      printTestHeader("testGetOperationStatistics");
700
    try {
701
      Session session = getTestSession();
702
      SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
703
        Date startTime = sdf.parse("2010-01-01");
704
        Date endTime = new Date();
705
      MonitorList monitorList =
706 6542 leinfelder
        MNodeService.getInstance(request).getOperationStatistics(
707 6354 cjones
            session,
708
            startTime,
709
            endTime,
710
            session.getSubject(),
711
            Event.CREATE,
712
            null //formatId
713
            );
714
715
      assertNotNull(monitorList);
716
      // TODO: should probably test other parts of the information
717
    } catch (Exception e) {
718
      e.printStackTrace();
719
      fail("Probably not yet implemented: " + e.getMessage());
720
    }
721
  }
722 6309 cjones
723 6354 cjones
  public void testPing() {
724 6309 cjones
725 6354 cjones
    try {
726 6804 leinfelder
      Date mnDate = MNodeService.getInstance(request).ping();
727
      assertTrue(mnDate != null);
728 6354 cjones
729 6309 cjones
    } catch (NotImplemented e) {
730 6354 cjones
      e.printStackTrace();
731
      fail("Unexpected error: " + e.getMessage());
732 6309 cjones
733
    } catch (ServiceFailure e) {
734 6354 cjones
      e.printStackTrace();
735
      fail("Unexpected error: " + e.getMessage());
736 6309 cjones
737 6612 leinfelder
    }  catch (InsufficientResources e) {
738 6354 cjones
      e.printStackTrace();
739
      fail("Unexpected error: " + e.getMessage());
740 6309 cjones
741
    }
742 6354 cjones
743
  }
744 6309 cjones
745 6354 cjones
  public void testSynchronizationFailed() {
746
    printTestHeader("testSynchronizationFailed");
747
    try {
748
        Session session = getTestSession();
749
750
        // create the object
751
        Identifier pid = new Identifier();
752
        pid.setValue("testSynchronizationFailed." + System.currentTimeMillis());
753
        InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
754
        SystemMetadata sysmeta = createSystemMetadata(pid, session.getSubject(), object);
755 6542 leinfelder
        Identifier retPid = MNodeService.getInstance(request).create(session, pid, object, sysmeta);
756 6354 cjones
        assertEquals(retPid.getValue(), pid.getValue());
757
758
        // pretend the sync failed
759
      SynchronizationFailed syncFailed =
760
        new SynchronizationFailed("0000", "Testing Synch Failure");
761 6366 leinfelder
      syncFailed.setPid(pid.getValue());
762 6542 leinfelder
      MNodeService.getInstance(request).synchronizationFailed(session, syncFailed );
763 6354 cjones
    } catch (Exception e) {
764
      e.printStackTrace();
765
        fail("Unexpected error: " + e.getMessage());
766
    }
767 6333 leinfelder
768 6354 cjones
  }
769 6309 cjones
770 6605 cjones
  public void testSystemMetadataChanged() {
771
      printTestHeader("testSystemMetadataChanged");
772
      try {
773
          Session session = getTestSession();
774
775
          // create the object
776
          Identifier pid = new Identifier();
777
          pid.setValue("testSystemMetadataChanged." + System.currentTimeMillis());
778
          InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
779
          SystemMetadata sysmeta = createSystemMetadata(pid, session.getSubject(), object);
780
          Identifier retPid = MNodeService.getInstance(request).create(session, pid, object, sysmeta);
781
          assertEquals(retPid.getValue(), pid.getValue());
782
783
          // pretend the system metadata changed on the CN
784
          MNodeService.getInstance(request).systemMetadataChanged(session,
785
                  retPid, 5000L, Calendar.getInstance().getTime());
786
787
      } catch (Exception e) {
788
          if (e instanceof NotAuthorized) {
789
              // only CN subjects can call this
790
              // TODO: use a CN certificate in the tests
791
          } else {
792
              fail("Unexpected error: " + e.getMessage());
793
794
          }
795
      }
796
797
    }
798
799 6354 cjones
  public void testGetLogRecords() {
800 6312 cjones
    printTestHeader("testLogRecords");
801 6309 cjones
802 6698 leinfelder
    try {
803
	    Log log = null;
804
	    Session session = getTestSession();
805
	    Date fromDate = new Date();
806
	    Calendar calendar = Calendar.getInstance();
807
	    calendar.setTime(fromDate);
808
	    calendar.roll(Calendar.YEAR, false);
809
	    fromDate = calendar.getTime();
810
	    Date toDate = new Date();
811
	    Event event = Event.CREATE;
812
	    int start = 0;
813
	    int count = 1;
814 6309 cjones
815 6542 leinfelder
      log = MNodeService.getInstance(request).getLogRecords(session, fromDate, toDate,
816 6354 cjones
        event, start, count);
817
818
      assertNotNull(log);
819
      assertTrue(log.getCount() == count);
820
      assertTrue(log.getStart() == start);
821
      assertTrue(log.getTotal() >= 1);
822
823 6698 leinfelder
    } catch (Exception e) {
824 6354 cjones
      e.printStackTrace();
825
      fail("Unexpected error: " + e.getMessage());
826 6309 cjones
827
    }
828 6354 cjones
  }
829 6309 cjones
830 6354 cjones
  /**
831
   * Testing setting access on a known object
832
   */
833
  public void testSetAccessPolicy() {
834 6309 cjones
    printTestHeader("testSetAccess");
835
836 6577 cjones
    //boolean accessWasSet = false;
837
    //
838
    //try {
839
    //  // create an object to set access on
840
    //  Session session = getTestSession();
841
    //  Identifier guid = new Identifier();
842
    //  guid.setValue("testSetAccess." + System.currentTimeMillis());
843
    //  InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
844
    //  SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
845
    //  Identifier pid =
846
    //    MNodeService.getInstance(request).create(session, guid, object, sysmeta);
847
    //  // set the access
848
    //  AccessPolicy accessPolicy = new AccessPolicy();
849
    //  AccessRule allow = new AccessRule();
850
    //  allow.addPermission(Permission.WRITE);
851
    //  Subject publicSubject = new Subject();
852
    //  publicSubject.setValue(Constants.SUBJECT_PUBLIC);
853
    //  allow.addSubject(publicSubject);
854
    //  accessPolicy.addAllow(allow);
855
    //
856
    //  accessWasSet =
857
    //    MNodeService.getInstance(request).setAccessPolicy(session, pid, accessPolicy);
858
    //  assertTrue(accessWasSet);
859
    //  // test that it is enforced
860
    //  session.setSubject(publicSubject);
861
    //  boolean isAuthorized = MNodeService.getInstance(request).isAuthorized(session, pid, Permission.WRITE);
862
    //  assertTrue(isAuthorized);
863
    //
864
    //} catch (UnsupportedEncodingException e) {
865
    //  e.printStackTrace();
866
    //
867
    //} catch (InvalidToken e) {
868
    //  e.printStackTrace();
869
    //  fail("Unexpected error: " + e.getMessage());
870
    //
871
    //} catch (ServiceFailure e) {
872
    //  e.printStackTrace();
873
    //  fail("Unexpected error: " + e.getMessage());
874
    //
875
    //} catch (NotAuthorized e) {
876
    //  e.printStackTrace();
877
    //  fail("Unexpected error: " + e.getMessage());
878
    //
879
    //} catch (IdentifierNotUnique e) {
880
    //  e.printStackTrace();
881
    //  fail("Unexpected error: " + e.getMessage());
882
    //
883
    //} catch (UnsupportedType e) {
884
    //  e.printStackTrace();
885
    //  fail("Unexpected error: " + e.getMessage());
886
    //
887
    //} catch (InsufficientResources e) {
888
    //  e.printStackTrace();
889
    //  fail("Unexpected error: " + e.getMessage());
890
    //
891
    //} catch (InvalidSystemMetadata e) {
892
    //  e.printStackTrace();
893
    //  fail("Unexpected error: " + e.getMessage());
894
    //
895
    //} catch (NotImplemented e) {
896
    //  e.printStackTrace();
897
    //  fail("Unexpected error: " + e.getMessage());
898
    //
899
    //} catch (InvalidRequest e) {
900
    //  e.printStackTrace();
901
    //  fail("Unexpected error: " + e.getMessage());
902
    //
903
    //} catch (NotFound e) {
904
    //  e.printStackTrace();
905
    //  fail("Unexpected error: " + e.getMessage());
906
    //
907
    //} catch (Exception e) {
908
    //  e.printStackTrace();
909
    //  fail("Unexpected error: " + e.getMessage());
910
    //
911
    //}
912 6354 cjones
913
  }
914 6309 cjones
915 6354 cjones
  /**
916
   * Test if a subject is authorized to read a known object
917
   */
918
  public void testIsAuthorized() {
919 6309 cjones
    printTestHeader("testIsAuthorized");
920
921 6354 cjones
    try {
922
      Session session = getTestSession();
923
      Identifier guid = new Identifier();
924
      guid.setValue("testIsAuthorized." + System.currentTimeMillis());
925
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
926
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
927
      Identifier pid =
928 6542 leinfelder
        MNodeService.getInstance(request).create(session, guid, object, sysmeta);
929 6354 cjones
      boolean isAuthorized =
930 6542 leinfelder
        MNodeService.getInstance(request).isAuthorized(session, pid, Permission.READ);
931 6354 cjones
      assertEquals(isAuthorized, true);
932
933 6309 cjones
    } catch (UnsupportedEncodingException e) {
934 6354 cjones
      e.printStackTrace();
935
      fail("Unexpected error: " + e.getMessage());
936 6309 cjones
937
    } catch (InvalidToken e) {
938 6354 cjones
      e.printStackTrace();
939
      fail("Unexpected error: " + e.getMessage());
940 6309 cjones
941
    } catch (ServiceFailure e) {
942 6354 cjones
      e.printStackTrace();
943
      fail("Unexpected error: " + e.getMessage());
944 6309 cjones
945
    } catch (NotAuthorized e) {
946 6354 cjones
      e.printStackTrace();
947
      fail("Unexpected error: " + e.getMessage());
948 6309 cjones
949
    } catch (IdentifierNotUnique e) {
950 6354 cjones
      e.printStackTrace();
951
      fail("Unexpected error: " + e.getMessage());
952 6309 cjones
953
    } catch (UnsupportedType e) {
954 6354 cjones
      e.printStackTrace();
955
      fail("Unexpected error: " + e.getMessage());
956 6309 cjones
957
    } catch (InsufficientResources e) {
958 6354 cjones
      e.printStackTrace();
959
      fail("Unexpected error: " + e.getMessage());
960 6309 cjones
961
    } catch (InvalidSystemMetadata e) {
962 6354 cjones
      e.printStackTrace();
963
      fail("Unexpected error: " + e.getMessage());
964 6309 cjones
965
    } catch (NotImplemented e) {
966 6354 cjones
      e.printStackTrace();
967
      fail("Unexpected error: " + e.getMessage());
968 6309 cjones
969
    } catch (InvalidRequest e) {
970 6354 cjones
      e.printStackTrace();
971
      fail("Unexpected error: " + e.getMessage());
972 6309 cjones
973
    } catch (Exception e) {
974 6354 cjones
      e.printStackTrace();
975
      fail("Unexpected error: " + e.getMessage());
976 6309 cjones
977
    }
978 6354 cjones
  }
979 6309 cjones
980
981 6354 cjones
982
983 6309 cjones
}