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 7850 leinfelder
import gov.loc.repository.bagit.Bag;
30
import gov.loc.repository.bagit.BagFactory;
31 7853 leinfelder
import gov.loc.repository.bagit.BagFile;
32
import gov.loc.repository.bagit.Manifest;
33 7850 leinfelder
34 6309 cjones
import java.io.ByteArrayInputStream;
35 6942 cjones
import java.io.ByteArrayOutputStream;
36 7850 leinfelder
import java.io.File;
37
import java.io.FileOutputStream;
38 6942 cjones
import java.io.IOException;
39 6309 cjones
import java.io.InputStream;
40
import java.io.UnsupportedEncodingException;
41 6326 leinfelder
import java.text.SimpleDateFormat;
42 7040 cjones
import java.util.ArrayList;
43 6312 cjones
import java.util.Calendar;
44 6309 cjones
import java.util.Date;
45 7853 leinfelder
import java.util.HashMap;
46
import java.util.Iterator;
47 7040 cjones
import java.util.List;
48 7853 leinfelder
import java.util.Map;
49 6309 cjones
50
import junit.framework.Test;
51
import junit.framework.TestSuite;
52
53 6324 leinfelder
import org.apache.commons.io.IOUtils;
54 7853 leinfelder
import org.dataone.client.ObjectFormatCache;
55 6348 leinfelder
import org.dataone.configuration.Settings;
56 7853 leinfelder
import org.dataone.ore.ResourceMapFactory;
57 6942 cjones
import org.dataone.service.util.TypeMarshaller;
58 6309 cjones
import org.dataone.service.exceptions.IdentifierNotUnique;
59
import org.dataone.service.exceptions.InsufficientResources;
60
import org.dataone.service.exceptions.InvalidRequest;
61
import org.dataone.service.exceptions.InvalidSystemMetadata;
62
import org.dataone.service.exceptions.InvalidToken;
63
import org.dataone.service.exceptions.NotAuthorized;
64
import org.dataone.service.exceptions.NotFound;
65
import org.dataone.service.exceptions.NotImplemented;
66
import org.dataone.service.exceptions.ServiceFailure;
67 6333 leinfelder
import org.dataone.service.exceptions.SynchronizationFailed;
68 6309 cjones
import org.dataone.service.exceptions.UnsupportedType;
69 6366 leinfelder
import org.dataone.service.types.v1.AccessPolicy;
70
import org.dataone.service.types.v1.AccessRule;
71
import org.dataone.service.types.v1.Checksum;
72
import org.dataone.service.types.v1.DescribeResponse;
73
import org.dataone.service.types.v1.Event;
74
import org.dataone.service.types.v1.Identifier;
75
import org.dataone.service.types.v1.Log;
76
import org.dataone.service.types.v1.MonitorList;
77
import org.dataone.service.types.v1.Node;
78
import org.dataone.service.types.v1.NodeReference;
79
import org.dataone.service.types.v1.ObjectFormatIdentifier;
80
import org.dataone.service.types.v1.ObjectList;
81
import org.dataone.service.types.v1.Permission;
82 7040 cjones
import org.dataone.service.types.v1.Person;
83 6366 leinfelder
import org.dataone.service.types.v1.Session;
84
import org.dataone.service.types.v1.Subject;
85 7040 cjones
import org.dataone.service.types.v1.SubjectInfo;
86 6366 leinfelder
import org.dataone.service.types.v1.SystemMetadata;
87 7853 leinfelder
import org.dspace.foresite.ResourceMap;
88 6942 cjones
import org.jibx.runtime.JiBXException;
89 6309 cjones
import org.junit.After;
90
import org.junit.Before;
91
92
/**
93
 * A JUnit test to exercise the Metacat Member Node service implementation.
94
 * This also tests a few of the D1NodeService superclass methods
95
 *
96
 * @author cjones
97
 *
98
 */
99 6324 leinfelder
public class MNodeServiceTest extends D1NodeServiceTest {
100 6309 cjones
101 6354 cjones
  /**
102
   * Set up the test fixtures
103
   *
104
   * @throws Exception
105
   */
106
  @Before
107
  public void setUp() throws Exception {
108
    super.setUp();
109
    // set up the configuration for d1client
110
    Settings.getConfiguration().setProperty("D1Client.cnClassName", MockCNode.class.getName());
111
  }
112 6309 cjones
113 6354 cjones
  /**
114
   * Remove the test fixtures
115
   */
116
  @After
117
  public void tearDown() {
118
  }
119
120
  /**
121
   * Build the test suite
122
   * @return
123
   */
124
  public static Test suite() {
125
126
    TestSuite suite = new TestSuite();
127 6309 cjones
    suite.addTest(new MNodeServiceTest("initialize"));
128
    // MNStorage tests
129 7160 leinfelder
    suite.addTest(new MNodeServiceTest("testCreate"));
130 7816 leinfelder
    suite.addTest(new MNodeServiceTest("testCreateInvalidIdentifier"));
131 7160 leinfelder
    suite.addTest(new MNodeServiceTest("testUpdate"));
132 7161 leinfelder
    // this requires MN certificate
133 7163 leinfelder
    suite.addTest(new MNodeServiceTest("testDelete"));
134 7161 leinfelder
135 7160 leinfelder
    // MNRead tests
136
    suite.addTest(new MNodeServiceTest("testGet"));
137
    suite.addTest(new MNodeServiceTest("testGetChecksum"));
138
    suite.addTest(new MNodeServiceTest("testGetSystemMetadata"));
139
    suite.addTest(new MNodeServiceTest("testDescribe"));
140
    suite.addTest(new MNodeServiceTest("testListObjects"));
141 7161 leinfelder
    // this requires CN certificate
142 7164 leinfelder
    suite.addTest(new MNodeServiceTest("testSynchronizationFailed"));
143 7161 leinfelder
144 7160 leinfelder
    // MNCore tests
145
    suite.addTest(new MNodeServiceTest("testPing"));
146
    suite.addTest(new MNodeServiceTest("testGetLogRecords"));
147
    suite.addTest(new MNodeServiceTest("testGetOperationStatistics"));
148
    suite.addTest(new MNodeServiceTest("testGetCapabilities"));
149
    // include these when they are part of the MN interface definitions
150
    // suite.addTest(new MNodeServiceTest("testGetObjectStatistics"));
151
    // suite.addTest(new MNodeServiceTest("testGetStatus"));
152
    // MNAuthorization tests
153
    suite.addTest(new MNodeServiceTest("testIsAuthorized"));
154 7040 cjones
    suite.addTest(new MNodeServiceTest("testIsEquivIdentityAuthorized"));
155 7160 leinfelder
    suite.addTest(new MNodeServiceTest("testSetAccessPolicy"));
156
    // MNreplication tests
157
    suite.addTest(new MNodeServiceTest("testReplicate"));
158 7850 leinfelder
    // MN packaging tests
159
    suite.addTest(new MNodeServiceTest("testGetPackage"));
160 7853 leinfelder
    suite.addTest(new MNodeServiceTest("testGetOREPackage"));
161 6309 cjones
162 6354 cjones
163
    return suite;
164
165
  }
166
167
  /**
168
   * Constructor for the tests
169
   *
170
   * @param name - the name of the test
171
   */
172
  public MNodeServiceTest(String name) {
173
    super(name);
174
175
  }
176 6309 cjones
177 6354 cjones
  /**
178
   * Initial blank test
179
   */
180
  public void initialize() {
181
    assertTrue(1 == 1);
182
183
  }
184
185
  /**
186
   * Test getting a known object
187
   */
188
  public void testGet() {
189 6309 cjones
    printTestHeader("testGet");
190
191 6354 cjones
    try {
192
      Session session = getTestSession();
193
      Identifier guid = new Identifier();
194
      guid.setValue("testGet." + System.currentTimeMillis());
195
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
196
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
197 6542 leinfelder
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
198
      InputStream result = MNodeService.getInstance(request).get(session, guid);
199 6354 cjones
      // go back to beginning of original stream
200
      object.reset();
201
      // check
202
      assertTrue(object.available() > 0);
203
      assertTrue(result.available() > 0);
204
      assertTrue(IOUtils.contentEquals(result, object));
205
206 6309 cjones
    } catch (UnsupportedEncodingException e) {
207 6354 cjones
      e.printStackTrace();
208
      fail("Unexpected error: " + e.getMessage());
209 6309 cjones
210
    } catch (InvalidToken e) {
211 6354 cjones
      e.printStackTrace();
212
      fail("Unexpected error: " + e.getMessage());
213
214 6309 cjones
    } catch (ServiceFailure e) {
215 6354 cjones
      e.printStackTrace();
216
      fail("Unexpected error: " + e.getMessage());
217
218 6309 cjones
    } catch (NotAuthorized e) {
219 6354 cjones
      e.printStackTrace();
220
      fail("Unexpected error: " + e.getMessage());
221
222 6309 cjones
    } catch (IdentifierNotUnique e) {
223 6354 cjones
      e.printStackTrace();
224
      fail("Unexpected error: " + e.getMessage());
225
226 6309 cjones
    } catch (UnsupportedType e) {
227 6354 cjones
      e.printStackTrace();
228
      fail("Unexpected error: " + e.getMessage());
229
230 6309 cjones
    } catch (InsufficientResources e) {
231 6354 cjones
      e.printStackTrace();
232
      fail("Unexpected error: " + e.getMessage());
233
234 6309 cjones
    } catch (InvalidSystemMetadata e) {
235 6354 cjones
      e.printStackTrace();
236
      fail("Unexpected error: " + e.getMessage());
237
238 6309 cjones
    } catch (NotImplemented e) {
239 6354 cjones
      e.printStackTrace();
240
      fail("Unexpected error: " + e.getMessage());
241
242 6309 cjones
    } catch (InvalidRequest e) {
243 6354 cjones
      e.printStackTrace();
244
      fail("Unexpected error: " + e.getMessage());
245
246 6309 cjones
    } catch (NotFound e) {
247 6354 cjones
      e.printStackTrace();
248
      fail("Unexpected error: " + e.getMessage());
249
250 6309 cjones
    } catch (Exception e) {
251 6354 cjones
      e.printStackTrace();
252
      fail("Unexpected error: " + e.getMessage());
253
254 6309 cjones
    }
255
256 6354 cjones
  }
257 6309 cjones
258 6354 cjones
  /**
259
   * Test getting the system metadata of an object
260
   */
261
  public void testGetSystemMetadata() {
262 6309 cjones
    printTestHeader("testGetSystemMetadata");
263
264
    try {
265 6354 cjones
      Session session = getTestSession();
266
      Identifier guid = new Identifier();
267
      guid.setValue("testGetSystemMetadata." + System.currentTimeMillis());
268
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
269
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
270 6542 leinfelder
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
271
      SystemMetadata newsysmeta = MNodeService.getInstance(request).getSystemMetadata(session, pid);
272 6354 cjones
      assertEquals(newsysmeta.getIdentifier().getValue(), sysmeta.getIdentifier().getValue());
273
274 6309 cjones
    } catch (UnsupportedEncodingException e) {
275 6354 cjones
      e.printStackTrace();
276
      fail("Unexpected error: " + e.getMessage());
277 6309 cjones
278
    } catch (InvalidToken e) {
279 6354 cjones
      e.printStackTrace();
280
      fail("Unexpected error: " + e.getMessage());
281 6309 cjones
282
    } catch (ServiceFailure e) {
283 6354 cjones
      e.printStackTrace();
284
      fail("Unexpected error: " + e.getMessage());
285 6309 cjones
286
    } catch (NotAuthorized e) {
287 6354 cjones
      e.printStackTrace();
288
      fail("Unexpected error: " + e.getMessage());
289 6309 cjones
290
    } catch (IdentifierNotUnique e) {
291 6354 cjones
      e.printStackTrace();
292
      fail("Unexpected error: " + e.getMessage());
293
294 6309 cjones
    } catch (UnsupportedType e) {
295 6354 cjones
      e.printStackTrace();
296
      fail("Unexpected error: " + e.getMessage());
297 6309 cjones
298
    } catch (InsufficientResources e) {
299 6354 cjones
      e.printStackTrace();
300
      fail("Unexpected error: " + e.getMessage());
301 6309 cjones
302
    } catch (InvalidSystemMetadata e) {
303 6354 cjones
      e.printStackTrace();
304
      fail("Unexpected error: " + e.getMessage());
305 6309 cjones
306
    } catch (NotImplemented e) {
307 6354 cjones
      e.printStackTrace();
308
      fail("Unexpected error: " + e.getMessage());
309 6309 cjones
310
    } catch (InvalidRequest e) {
311 6354 cjones
      e.printStackTrace();
312
      fail("Unexpected error: " + e.getMessage());
313 6309 cjones
314
    } catch (NotFound e) {
315 6354 cjones
      e.printStackTrace();
316
      fail("Unexpected error: " + e.getMessage());
317 6309 cjones
318
    } catch (Exception e) {
319 6354 cjones
      e.printStackTrace();
320
      fail("Unexpected error: " + e.getMessage());
321 6309 cjones
322
    }
323
324 6354 cjones
  }
325 6309 cjones
326 6354 cjones
  /**
327
   * Test object creation
328
   */
329
  public void testCreate() {
330 6309 cjones
    printTestHeader("testCreate");
331
332 6354 cjones
    try {
333
      Session session = getTestSession();
334
      Identifier guid = new Identifier();
335
      guid.setValue("testCreate." + System.currentTimeMillis());
336
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
337
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
338 6542 leinfelder
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
339 6354 cjones
      assertEquals(guid.getValue(), pid.getValue());
340 6309 cjones
    } catch (UnsupportedEncodingException e) {
341 6354 cjones
      e.printStackTrace();
342
      fail("Unexpected error: " + e.getMessage());
343 6309 cjones
344
    } catch (InvalidToken e) {
345 6354 cjones
      e.printStackTrace();
346
      fail("Unexpected error: " + e.getMessage());
347 6309 cjones
348
    } catch (ServiceFailure e) {
349 6354 cjones
      e.printStackTrace();
350
      fail("Unexpected error: " + e.getMessage());
351 6309 cjones
352
    } catch (NotAuthorized e) {
353 6354 cjones
      e.printStackTrace();
354
      fail("Unexpected error: " + e.getMessage());
355 6309 cjones
356
    } catch (IdentifierNotUnique e) {
357 6354 cjones
      e.printStackTrace();
358
      fail("Unexpected error: " + e.getMessage());
359 6309 cjones
360
    } catch (UnsupportedType e) {
361 6354 cjones
      e.printStackTrace();
362
      fail("Unexpected error: " + e.getMessage());
363 6309 cjones
364
    } catch (InsufficientResources e) {
365 6354 cjones
      e.printStackTrace();
366
      fail("Unexpected error: " + e.getMessage());
367 6309 cjones
368
    } catch (InvalidSystemMetadata e) {
369 6354 cjones
      e.printStackTrace();
370
      fail("Unexpected error: " + e.getMessage());
371 6309 cjones
372
    } catch (NotImplemented e) {
373 6354 cjones
      e.printStackTrace();
374
      fail("Unexpected error: " + e.getMessage());
375 6309 cjones
376
    } catch (InvalidRequest e) {
377 6354 cjones
      e.printStackTrace();
378
      fail("Unexpected error: " + e.getMessage());
379 6309 cjones
380
    } catch (Exception e) {
381 6354 cjones
      e.printStackTrace();
382
      fail("Unexpected error: " + e.getMessage());
383 6309 cjones
384
    }
385
386
  }
387
388 6354 cjones
  /**
389
   * test object deletion
390
   */
391
  public void testDelete() {
392 6309 cjones
    printTestHeader("testDelete");
393
394 6354 cjones
    try {
395
      Session session = getTestSession();
396
      Identifier guid = new Identifier();
397
      guid.setValue("testDelete." + System.currentTimeMillis());
398
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
399
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
400 6542 leinfelder
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
401 7163 leinfelder
402
      // use MN admin to delete
403
      session = getMNSession();
404 6542 leinfelder
      Identifier deletedPid = MNodeService.getInstance(request).delete(session, pid);
405 6333 leinfelder
      assertEquals(pid.getValue(), deletedPid.getValue());
406 7160 leinfelder
      // check that we cannot get the object
407 7163 leinfelder
      session = getTestSession();
408 7160 leinfelder
      InputStream deletedObject = null;
409
      try {
410 7163 leinfelder
    	  deletedObject = MNodeService.getInstance(request).get(session, deletedPid);
411 7160 leinfelder
      } catch (NotFound nf) {
412
    	  // this is expected
413
      }
414
	  assertNull(deletedObject);
415 6309 cjones
416 6354 cjones
    } catch (UnsupportedEncodingException e) {
417
      e.printStackTrace();
418
419 6324 leinfelder
    } catch (Exception e) {
420 6354 cjones
      e.printStackTrace();
421
      fail("Unexpected error: " + e.getMessage());
422 6309 cjones
423 6324 leinfelder
    }
424 6309 cjones
425 6354 cjones
  }
426 6309 cjones
427 6354 cjones
  /**
428
   * Test object updating
429
   */
430
  public void testUpdate() {
431 6309 cjones
    printTestHeader("testUpdate");
432
433 6354 cjones
    try {
434
      Session session = getTestSession();
435
      Identifier guid = new Identifier();
436
      guid.setValue("testUpdate." + System.currentTimeMillis());
437
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
438
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
439
      Identifier newPid = new Identifier();
440 6596 leinfelder
      newPid.setValue("testUpdate." + (System.currentTimeMillis() + 1)); // ensure it is different from original
441 6354 cjones
      Identifier pid =
442 6542 leinfelder
        MNodeService.getInstance(request).create(session, guid, object, sysmeta);
443 6338 cjones
444 6354 cjones
      SystemMetadata newSysMeta = createSystemMetadata(newPid, session.getSubject(), object);
445
446
      // do the update
447
      Identifier updatedPid =
448 6542 leinfelder
        MNodeService.getInstance(request).update(session, pid, object, newPid, newSysMeta);
449 6338 cjones
450 6354 cjones
      // get the updated system metadata
451 6338 cjones
      SystemMetadata updatedSysMeta =
452 6542 leinfelder
        MNodeService.getInstance(request).getSystemMetadata(session, updatedPid);
453 6338 cjones
454 6354 cjones
      assertEquals(updatedPid.getValue(), newPid.getValue());
455 6366 leinfelder
//      assertTrue(updatedSysMeta.getObsolete(0).getValue().equals(pid.getValue()));
456
//      assertTrue(updatedSysMeta.getDerivedFrom(0).getValue().equals(pid.getValue()));
457 6354 cjones
458 6309 cjones
    } catch (UnsupportedEncodingException e) {
459 6354 cjones
      e.printStackTrace();
460
      fail("Unexpected error: " + e.getMessage());
461 6309 cjones
462
    } catch (InvalidToken e) {
463 6354 cjones
      e.printStackTrace();
464
      fail("Unexpected error: " + e.getMessage());
465 6309 cjones
466
    } catch (ServiceFailure e) {
467 6354 cjones
      e.printStackTrace();
468
      fail("Unexpected error: " + e.getMessage());
469 6309 cjones
470
    } catch (NotAuthorized e) {
471 6354 cjones
      e.printStackTrace();
472
      fail("Unexpected error: " + e.getMessage());
473 6309 cjones
474
    } catch (IdentifierNotUnique e) {
475 6354 cjones
      e.printStackTrace();
476
      fail("Unexpected error: " + e.getMessage());
477 6309 cjones
478
    } catch (UnsupportedType e) {
479 6354 cjones
      e.printStackTrace();
480
      fail("Unexpected error: " + e.getMessage());
481 6309 cjones
482
    } catch (InsufficientResources e) {
483 6354 cjones
      e.printStackTrace();
484
      fail("Unexpected error: " + e.getMessage());
485 6309 cjones
486
    } catch (InvalidSystemMetadata e) {
487 6354 cjones
      e.printStackTrace();
488
      fail("Unexpected error: " + e.getMessage());
489 6309 cjones
490
    } catch (NotImplemented e) {
491 6354 cjones
      e.printStackTrace();
492
      fail("Unexpected error: " + e.getMessage());
493 6309 cjones
494
    } catch (InvalidRequest e) {
495 6354 cjones
      e.printStackTrace();
496
      fail("Unexpected error: " + e.getMessage());
497 6309 cjones
498
    } catch (Exception e) {
499 6354 cjones
      e.printStackTrace();
500
      fail("Unexpected error: " + e.getMessage());
501 6309 cjones
502
    }
503 6354 cjones
  }
504 6309 cjones
505 6354 cjones
  /**
506
   * We currently expect this unit test to fail because it should rely on a different member node
507
   * to retrieve the object from. Currently it gets the object from itself and throws
508
   * and expected error for duplicate entry.
509
   *
510
   */
511
  public void testReplicate() {
512
      printTestHeader("testReplicate");
513
      try {
514
        Session session = getTestSession();
515
        Identifier guid = new Identifier();
516
        guid.setValue("testReplicate." + System.currentTimeMillis());
517
        InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
518
        SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
519
        // save locally
520 6542 leinfelder
        Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
521 6354 cjones
        // get our node reference (attempting to replicate with self)
522 6542 leinfelder
        NodeReference sourceNode = MNodeService.getInstance(request).getCapabilities().getIdentifier();
523 6354 cjones
        // attempt to replicate with ourselves -- this should fail!
524
      boolean result = false;
525
      try {
526 6542 leinfelder
        result = MNodeService.getInstance(request).replicate(session, sysmeta, sourceNode);
527 6354 cjones
      } catch (Exception inu) {
528
        // we are expecting this to fail since we already have the doc
529
        result = true;
530
      }
531
      assertTrue(result);
532
      } catch (Exception e) {
533
        e.printStackTrace();
534
      fail("Probably not yet implemented: " + e.getMessage());
535
    }
536
  }
537 6309 cjones
538 6354 cjones
  /**
539
   * Test describing an object
540
   */
541
  public void testDescribe() {
542 6314 cjones
    printTestHeader("testDescribe");
543 6309 cjones
544
    try {
545 6354 cjones
      Session session = getTestSession();
546
      Identifier guid = new Identifier();
547
      guid.setValue("testGetSystemMetadata." + System.currentTimeMillis());
548
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
549
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
550 6542 leinfelder
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
551
      DescribeResponse describeResponse = MNodeService.getInstance(request).describe(session, pid);
552 6354 cjones
      assertEquals(describeResponse.getDataONE_Checksum().getValue(), sysmeta.getChecksum().getValue());
553 6597 leinfelder
      assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), sysmeta.getFormatId().getValue());
554 6354 cjones
555 6309 cjones
    } catch (UnsupportedEncodingException e) {
556 6354 cjones
      e.printStackTrace();
557
      fail("Unexpected error: " + e.getMessage());
558 6309 cjones
559
    } catch (InvalidToken e) {
560 6354 cjones
      e.printStackTrace();
561
      fail("Unexpected error: " + e.getMessage());
562 6309 cjones
563
    } catch (ServiceFailure e) {
564 6354 cjones
      e.printStackTrace();
565
      fail("Unexpected error: " + e.getMessage());
566 6309 cjones
567
    } catch (NotAuthorized e) {
568 6354 cjones
      e.printStackTrace();
569
      fail("Unexpected error: " + e.getMessage());
570 6309 cjones
571
    } catch (IdentifierNotUnique e) {
572 6354 cjones
      e.printStackTrace();
573
      fail("Unexpected error: " + e.getMessage());
574
575 6309 cjones
    } catch (UnsupportedType e) {
576 6354 cjones
      e.printStackTrace();
577
      fail("Unexpected error: " + e.getMessage());
578 6309 cjones
579
    } catch (InsufficientResources e) {
580 6354 cjones
      e.printStackTrace();
581
      fail("Unexpected error: " + e.getMessage());
582 6309 cjones
583
    } catch (InvalidSystemMetadata e) {
584 6354 cjones
      e.printStackTrace();
585
      fail("Unexpected error: " + e.getMessage());
586 6309 cjones
587
    } catch (NotImplemented e) {
588 6354 cjones
      e.printStackTrace();
589
      fail("Unexpected error: " + e.getMessage());
590 6309 cjones
591
    } catch (InvalidRequest e) {
592 6354 cjones
      e.printStackTrace();
593
      fail("Unexpected error: " + e.getMessage());
594 6309 cjones
595
    } catch (NotFound e) {
596 6354 cjones
      e.printStackTrace();
597
      fail("Unexpected error: " + e.getMessage());
598 6309 cjones
599
    } catch (Exception e) {
600 6354 cjones
      e.printStackTrace();
601
      fail("Unexpected error: " + e.getMessage());
602 6309 cjones
603
    }
604 6354 cjones
  }
605 6309 cjones
606 6354 cjones
  /**
607
   * Test getting the checksum of an object
608
   */
609
  public void testGetChecksum() {
610 6309 cjones
    printTestHeader("testGetChecksum");
611
612 6354 cjones
    try {
613
      Session session = getTestSession();
614
      Identifier guid = new Identifier();
615
      guid.setValue("testGetChecksum." + System.currentTimeMillis());
616
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
617
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
618 6542 leinfelder
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
619
      Checksum checksum = MNodeService.getInstance(request).getChecksum(session, pid, "MD5");
620 6354 cjones
      assertEquals(checksum.getValue(), sysmeta.getChecksum().getValue());
621 6309 cjones
622 6354 cjones
    } catch (UnsupportedEncodingException e) {
623
      e.printStackTrace();
624
      fail("Unexpected error: " + e.getMessage());
625 6309 cjones
626
    } catch (InvalidToken e) {
627 6354 cjones
      e.printStackTrace();
628
      fail("Unexpected error: " + e.getMessage());
629 6309 cjones
630
    } catch (ServiceFailure e) {
631 6354 cjones
      e.printStackTrace();
632
      fail("Unexpected error: " + e.getMessage());
633 6309 cjones
634
    } catch (NotAuthorized e) {
635 6354 cjones
      e.printStackTrace();
636
      fail("Unexpected error: " + e.getMessage());
637 6309 cjones
638
    } catch (IdentifierNotUnique e) {
639 6354 cjones
      e.printStackTrace();
640
      fail("Unexpected error: " + e.getMessage());
641 6309 cjones
642
    } catch (UnsupportedType e) {
643 6354 cjones
      e.printStackTrace();
644
      fail("Unexpected error: " + e.getMessage());
645 6309 cjones
646
    } catch (InsufficientResources e) {
647 6354 cjones
      e.printStackTrace();
648
      fail("Unexpected error: " + e.getMessage());
649 6309 cjones
650
    } catch (InvalidSystemMetadata e) {
651 6354 cjones
      e.printStackTrace();
652
      fail("Unexpected error: " + e.getMessage());
653 6309 cjones
654
    } catch (NotImplemented e) {
655 6354 cjones
      e.printStackTrace();
656
      fail("Unexpected error: " + e.getMessage());
657 6309 cjones
658
    } catch (InvalidRequest e) {
659 6354 cjones
      e.printStackTrace();
660
      fail("Unexpected error: " + e.getMessage());
661 6309 cjones
662
    } catch (NotFound e) {
663 6354 cjones
      e.printStackTrace();
664
      fail("Unexpected error: " + e.getMessage());
665 6309 cjones
666
    } catch (Exception e) {
667 6354 cjones
      e.printStackTrace();
668
      fail("Unexpected error: " + e.getMessage());
669 6309 cjones
670
    }
671 6354 cjones
672
  }
673 6309 cjones
674 6354 cjones
  /**
675
   * Testing listing objects on the Member Node
676
   */
677
  public void testListObjects() {
678
      printTestHeader("testListObjects");
679
680
      try {
681
682
        Session session = getTestSession();
683
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
684
        Date startTime = sdf.parse("2010-01-01");
685
        Date endTime = new Date();
686
        ObjectFormatIdentifier objectFormatId = null;
687
        boolean replicaStatus = false;
688
        int start = 0;
689
        int count = 1;
690
691
        // insert at least one object
692
        testCreate();
693
        // now check that we have at least one
694
        ObjectList objectList =
695 6542 leinfelder
          MNodeService.getInstance(request).listObjects(session, startTime, endTime,
696 6354 cjones
              objectFormatId, replicaStatus, start, count);
697
        assertNotNull(objectList);
698
        assertTrue(objectList.getCount() == count);
699
        assertTrue(objectList.getStart() == 0);
700
        assertTrue(objectList.getTotal() > 1);
701
702
      } catch (Exception e) {
703
        e.printStackTrace();
704
        fail("Unexpected error: " + e.getMessage());
705
706
      }
707
  }
708 6309 cjones
709 6354 cjones
  public void testGetCapabilities() {
710
      printTestHeader("testGetCapabilities");
711
    try {
712 6542 leinfelder
      Node node = MNodeService.getInstance(request).getCapabilities();
713 6942 cjones
      ByteArrayOutputStream baos = new ByteArrayOutputStream();
714
      TypeMarshaller.marshalTypeToOutputStream(node, baos);
715 6354 cjones
      assertNotNull(node);
716
      // TODO: should probably test other parts of the node information
717 6942 cjones
718
    } catch (JiBXException e) {
719
        e.printStackTrace();
720
        fail("The node instance couldn't be parsed correctly:" + e.getMessage());
721
722
    } catch (IOException e) {
723
        e.printStackTrace();
724
        fail("The node instance couldn't be read correctly:" + e.getMessage());
725
726 6354 cjones
    } catch (Exception e) {
727 6942 cjones
        e.printStackTrace();
728
        fail("Probably not yet implemented: " + e.getMessage());
729
730 6354 cjones
    }
731
732
  }
733 6309 cjones
734 6354 cjones
  public void testGetOperationStatistics() {
735
      printTestHeader("testGetOperationStatistics");
736
    try {
737 7261 leinfelder
      Session session = getCNSession();
738 6354 cjones
      SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
739
        Date startTime = sdf.parse("2010-01-01");
740
        Date endTime = new Date();
741
      MonitorList monitorList =
742 6542 leinfelder
        MNodeService.getInstance(request).getOperationStatistics(
743 6354 cjones
            session,
744
            startTime,
745
            endTime,
746
            session.getSubject(),
747
            Event.CREATE,
748
            null //formatId
749
            );
750
751
      assertNotNull(monitorList);
752
      // TODO: should probably test other parts of the information
753
    } catch (Exception e) {
754
      e.printStackTrace();
755
      fail("Probably not yet implemented: " + e.getMessage());
756
    }
757
  }
758 6309 cjones
759 6354 cjones
  public void testPing() {
760 6309 cjones
761 6354 cjones
    try {
762 6804 leinfelder
      Date mnDate = MNodeService.getInstance(request).ping();
763
      assertTrue(mnDate != null);
764 6354 cjones
765 6309 cjones
    } catch (NotImplemented e) {
766 6354 cjones
      e.printStackTrace();
767
      fail("Unexpected error: " + e.getMessage());
768 6309 cjones
769
    } catch (ServiceFailure e) {
770 6354 cjones
      e.printStackTrace();
771
      fail("Unexpected error: " + e.getMessage());
772 6309 cjones
773 6612 leinfelder
    }  catch (InsufficientResources e) {
774 6354 cjones
      e.printStackTrace();
775
      fail("Unexpected error: " + e.getMessage());
776 6309 cjones
777
    }
778 6354 cjones
779
  }
780 6309 cjones
781 6354 cjones
  public void testSynchronizationFailed() {
782
    printTestHeader("testSynchronizationFailed");
783
    try {
784
        Session session = getTestSession();
785
786
        // create the object
787
        Identifier pid = new Identifier();
788
        pid.setValue("testSynchronizationFailed." + System.currentTimeMillis());
789
        InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
790
        SystemMetadata sysmeta = createSystemMetadata(pid, session.getSubject(), object);
791 6542 leinfelder
        Identifier retPid = MNodeService.getInstance(request).create(session, pid, object, sysmeta);
792 6354 cjones
        assertEquals(retPid.getValue(), pid.getValue());
793
794 7163 leinfelder
        // pretend the sync failed, act as CN
795 6354 cjones
      SynchronizationFailed syncFailed =
796
        new SynchronizationFailed("0000", "Testing Synch Failure");
797 6366 leinfelder
      syncFailed.setPid(pid.getValue());
798 7163 leinfelder
      session = getCNSession();
799 6542 leinfelder
      MNodeService.getInstance(request).synchronizationFailed(session, syncFailed );
800 6354 cjones
    } catch (Exception e) {
801
      e.printStackTrace();
802
        fail("Unexpected error: " + e.getMessage());
803
    }
804 6333 leinfelder
805 6354 cjones
  }
806 6309 cjones
807 6605 cjones
  public void testSystemMetadataChanged() {
808
      printTestHeader("testSystemMetadataChanged");
809
      try {
810
          Session session = getTestSession();
811
812
          // create the object
813
          Identifier pid = new Identifier();
814
          pid.setValue("testSystemMetadataChanged." + System.currentTimeMillis());
815
          InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
816
          SystemMetadata sysmeta = createSystemMetadata(pid, session.getSubject(), object);
817
          Identifier retPid = MNodeService.getInstance(request).create(session, pid, object, sysmeta);
818
          assertEquals(retPid.getValue(), pid.getValue());
819
820
          // pretend the system metadata changed on the CN
821
          MNodeService.getInstance(request).systemMetadataChanged(session,
822
                  retPid, 5000L, Calendar.getInstance().getTime());
823
824
      } catch (Exception e) {
825
          if (e instanceof NotAuthorized) {
826
              // only CN subjects can call this
827
              // TODO: use a CN certificate in the tests
828
          } else {
829
              fail("Unexpected error: " + e.getMessage());
830
831
          }
832
      }
833
834
    }
835
836 6354 cjones
  public void testGetLogRecords() {
837 6312 cjones
    printTestHeader("testLogRecords");
838 6309 cjones
839 6698 leinfelder
    try {
840
	    Log log = null;
841 7261 leinfelder
	    Session session = getCNSession();
842 6698 leinfelder
	    Date fromDate = new Date();
843
	    Calendar calendar = Calendar.getInstance();
844
	    calendar.setTime(fromDate);
845
	    calendar.roll(Calendar.YEAR, false);
846
	    fromDate = calendar.getTime();
847
	    Date toDate = new Date();
848
	    Event event = Event.CREATE;
849
	    int start = 0;
850
	    int count = 1;
851 6309 cjones
852 6542 leinfelder
      log = MNodeService.getInstance(request).getLogRecords(session, fromDate, toDate,
853 7101 leinfelder
        event, null, start, count);
854 6354 cjones
855
      assertNotNull(log);
856
      assertTrue(log.getCount() == count);
857
      assertTrue(log.getStart() == start);
858
      assertTrue(log.getTotal() >= 1);
859
860 6698 leinfelder
    } catch (Exception e) {
861 6354 cjones
      e.printStackTrace();
862
      fail("Unexpected error: " + e.getMessage());
863 6309 cjones
864
    }
865 6354 cjones
  }
866 6309 cjones
867 6354 cjones
  /**
868
   * Testing setting access on a known object
869
   */
870
  public void testSetAccessPolicy() {
871 6309 cjones
    printTestHeader("testSetAccess");
872
873 6577 cjones
    //boolean accessWasSet = false;
874
    //
875
    //try {
876
    //  // create an object to set access on
877
    //  Session session = getTestSession();
878
    //  Identifier guid = new Identifier();
879
    //  guid.setValue("testSetAccess." + System.currentTimeMillis());
880
    //  InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
881
    //  SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
882
    //  Identifier pid =
883
    //    MNodeService.getInstance(request).create(session, guid, object, sysmeta);
884
    //  // set the access
885
    //  AccessPolicy accessPolicy = new AccessPolicy();
886
    //  AccessRule allow = new AccessRule();
887
    //  allow.addPermission(Permission.WRITE);
888
    //  Subject publicSubject = new Subject();
889
    //  publicSubject.setValue(Constants.SUBJECT_PUBLIC);
890
    //  allow.addSubject(publicSubject);
891
    //  accessPolicy.addAllow(allow);
892
    //
893
    //  accessWasSet =
894
    //    MNodeService.getInstance(request).setAccessPolicy(session, pid, accessPolicy);
895
    //  assertTrue(accessWasSet);
896
    //  // test that it is enforced
897
    //  session.setSubject(publicSubject);
898
    //  boolean isAuthorized = MNodeService.getInstance(request).isAuthorized(session, pid, Permission.WRITE);
899
    //  assertTrue(isAuthorized);
900
    //
901
    //} catch (UnsupportedEncodingException e) {
902
    //  e.printStackTrace();
903
    //
904
    //} catch (InvalidToken e) {
905
    //  e.printStackTrace();
906
    //  fail("Unexpected error: " + e.getMessage());
907
    //
908
    //} catch (ServiceFailure e) {
909
    //  e.printStackTrace();
910
    //  fail("Unexpected error: " + e.getMessage());
911
    //
912
    //} catch (NotAuthorized e) {
913
    //  e.printStackTrace();
914
    //  fail("Unexpected error: " + e.getMessage());
915
    //
916
    //} catch (IdentifierNotUnique e) {
917
    //  e.printStackTrace();
918
    //  fail("Unexpected error: " + e.getMessage());
919
    //
920
    //} catch (UnsupportedType e) {
921
    //  e.printStackTrace();
922
    //  fail("Unexpected error: " + e.getMessage());
923
    //
924
    //} catch (InsufficientResources e) {
925
    //  e.printStackTrace();
926
    //  fail("Unexpected error: " + e.getMessage());
927
    //
928
    //} catch (InvalidSystemMetadata e) {
929
    //  e.printStackTrace();
930
    //  fail("Unexpected error: " + e.getMessage());
931
    //
932
    //} catch (NotImplemented e) {
933
    //  e.printStackTrace();
934
    //  fail("Unexpected error: " + e.getMessage());
935
    //
936
    //} catch (InvalidRequest e) {
937
    //  e.printStackTrace();
938
    //  fail("Unexpected error: " + e.getMessage());
939
    //
940
    //} catch (NotFound e) {
941
    //  e.printStackTrace();
942
    //  fail("Unexpected error: " + e.getMessage());
943
    //
944
    //} catch (Exception e) {
945
    //  e.printStackTrace();
946
    //  fail("Unexpected error: " + e.getMessage());
947
    //
948
    //}
949 6354 cjones
950
  }
951 6309 cjones
952 6354 cjones
  /**
953
   * Test if a subject is authorized to read a known object
954
   */
955
  public void testIsAuthorized() {
956 6309 cjones
    printTestHeader("testIsAuthorized");
957
958 6354 cjones
    try {
959
      Session session = getTestSession();
960
      Identifier guid = new Identifier();
961
      guid.setValue("testIsAuthorized." + System.currentTimeMillis());
962
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
963
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
964
      Identifier pid =
965 6542 leinfelder
        MNodeService.getInstance(request).create(session, guid, object, sysmeta);
966 6354 cjones
      boolean isAuthorized =
967 6542 leinfelder
        MNodeService.getInstance(request).isAuthorized(session, pid, Permission.READ);
968 6354 cjones
      assertEquals(isAuthorized, true);
969
970 6309 cjones
    } catch (UnsupportedEncodingException e) {
971 6354 cjones
      e.printStackTrace();
972
      fail("Unexpected error: " + e.getMessage());
973 6309 cjones
974
    } catch (InvalidToken e) {
975 6354 cjones
      e.printStackTrace();
976
      fail("Unexpected error: " + e.getMessage());
977 6309 cjones
978
    } catch (ServiceFailure e) {
979 6354 cjones
      e.printStackTrace();
980
      fail("Unexpected error: " + e.getMessage());
981 6309 cjones
982
    } catch (NotAuthorized e) {
983 6354 cjones
      e.printStackTrace();
984
      fail("Unexpected error: " + e.getMessage());
985 6309 cjones
986
    } catch (IdentifierNotUnique e) {
987 6354 cjones
      e.printStackTrace();
988
      fail("Unexpected error: " + e.getMessage());
989 6309 cjones
990
    } catch (UnsupportedType e) {
991 6354 cjones
      e.printStackTrace();
992
      fail("Unexpected error: " + e.getMessage());
993 6309 cjones
994
    } catch (InsufficientResources e) {
995 6354 cjones
      e.printStackTrace();
996
      fail("Unexpected error: " + e.getMessage());
997 6309 cjones
998
    } catch (InvalidSystemMetadata e) {
999 6354 cjones
      e.printStackTrace();
1000
      fail("Unexpected error: " + e.getMessage());
1001 6309 cjones
1002
    } catch (NotImplemented e) {
1003 6354 cjones
      e.printStackTrace();
1004
      fail("Unexpected error: " + e.getMessage());
1005 6309 cjones
1006
    } catch (InvalidRequest e) {
1007 6354 cjones
      e.printStackTrace();
1008
      fail("Unexpected error: " + e.getMessage());
1009 6309 cjones
1010
    } catch (Exception e) {
1011 6354 cjones
      e.printStackTrace();
1012
      fail("Unexpected error: " + e.getMessage());
1013 6309 cjones
1014
    }
1015 6354 cjones
  }
1016 8209 leinfelder
1017
  /**
1018
   * Test if node admin is authorized to read a known object
1019
   */
1020
  public void testIsAdminAuthorized() {
1021
    printTestHeader("testIsAdminAuthorized");
1022
1023
    try {
1024
      Session session = getTestSession();
1025
      Identifier guid = new Identifier();
1026
      guid.setValue("testIsAdminAuthorized." + System.currentTimeMillis());
1027
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1028
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1029
      Identifier pid =
1030
        MNodeService.getInstance(request).create(session, guid, object, sysmeta);
1031
1032
      // test as public - read
1033
      boolean isAuthorized =
1034
        MNodeService.getInstance(request).isAuthorized(null, pid, Permission.READ);
1035
      assertEquals(isAuthorized, true);
1036
1037
      // test as public - change perm
1038
      isAuthorized =
1039
        MNodeService.getInstance(request).isAuthorized(null, pid, Permission.CHANGE_PERMISSION);
1040
      assertEquals(isAuthorized, false);
1041
1042
      // test as admin
1043
      isAuthorized =
1044
    	        MNodeService.getInstance(request).isAuthorized(getMNSession(), pid, Permission.CHANGE_PERMISSION);
1045
    	      assertEquals(isAuthorized, true);
1046
1047
    } catch (Exception e) {
1048
      e.printStackTrace();
1049
      fail("Unexpected error: " + e.getMessage());
1050 6309 cjones
1051 8209 leinfelder
    }
1052
  }
1053
1054 6309 cjones
1055 7040 cjones
  public void testIsEquivIdentityAuthorized() {
1056
      printTestHeader("testIsEquivIdentityAuthorized");
1057
1058
      try {
1059
          Session session = new Session();
1060
          Subject s = new Subject();
1061
          s.setValue("cn=test,dc=dataone,dc=org");
1062
          session.setSubject(s);
1063
1064
          Identifier pid = new Identifier();
1065
          pid.setValue("testIsEquivIdentityAuthorized." + System.currentTimeMillis());
1066
          InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1067
          SystemMetadata sysmeta = createSystemMetadata(pid, session.getSubject(), object);
1068
1069
          // reset the access policy to only allow 'self' read (no public)
1070
          AccessPolicy ap = new AccessPolicy();
1071
          AccessRule ar = new AccessRule();
1072
          List<Subject> sList = new ArrayList<Subject>();
1073
          sList.add(session.getSubject());
1074
          ar.setSubjectList(sList);
1075
          List<Permission> permList = new ArrayList<Permission>();
1076
          permList.add(Permission.CHANGE_PERMISSION);
1077
          ar.setPermissionList(permList);
1078
          ap.addAllow(ar);
1079
          sysmeta.setAccessPolicy(ap);
1080
1081
          // save it
1082
          Identifier retPid = CNodeService.getInstance(request).registerSystemMetadata(session, pid, sysmeta);
1083
          assertEquals(pid.getValue(), retPid.getValue());
1084
1085
          //check it against an equivalent identity not listed in the access policy
1086
          session.getSubject().setValue("cn=newSubject,dc=dataone,dc=org");
1087
          SubjectInfo subjectInfo = new SubjectInfo();
1088
          Person person = new Person();
1089
          person.setSubject(session.getSubject());
1090
          List<String> givenNames = new ArrayList<String>();
1091
          givenNames.add("New");
1092
          person.setGivenNameList(givenNames);
1093
          person.setFamilyName("Subject");
1094
1095
          // add equivalent identities
1096
          List<Subject> equivIdentities = new ArrayList<Subject>();
1097
          Subject mappedSubject2 = new Subject();
1098
          mappedSubject2.setValue("cn=test2,dc=dataone,dc=org");
1099
          equivIdentities.add(mappedSubject2);
1100
1101
          Subject mappedSubject = new Subject();
1102
          mappedSubject.setValue("cn=test,dc=dataone,dc=org");
1103
          equivIdentities.add(mappedSubject);
1104
1105
          person.setEquivalentIdentityList(equivIdentities);
1106
1107
          List<Person> personList = new ArrayList<Person>();
1108
          personList.add(person);
1109
          subjectInfo.setPersonList(personList);
1110
1111
          // update the session to include subject info with a mapped identity
1112
          session.setSubjectInfo(subjectInfo);
1113
          boolean result = CNodeService.getInstance(request).isAuthorized(session, pid, Permission.READ);
1114
          assertTrue(result);
1115
1116
    } catch (Exception e) {
1117
        e.printStackTrace();
1118
1119
    }
1120
1121
  }
1122 7816 leinfelder
1123
/**
1124
   * Test object creation failure when there is a space in the identifier
1125
   */
1126
  public void testCreateInvalidIdentifier() {
1127
    printTestHeader("testCreateInvalidIdentifier");
1128
1129
    try {
1130
      Session session = getTestSession();
1131
      Identifier guid = new Identifier();
1132
      guid.setValue("testCreate withspace." + System.currentTimeMillis());
1133
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1134
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1135
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
1136
      fail("Should not be able to create with whitespace in indentifier");
1137
    } catch (InvalidRequest e) {
1138
    	// expect that this request fails
1139
        assertTrue(true);
1140
    } catch (Exception e) {
1141
      e.printStackTrace();
1142
      fail("Unexpected error: " + e.getMessage());
1143
    }
1144
1145
  }
1146 6354 cjones
1147 7850 leinfelder
	/**
1148
	 * Test getting a known object
1149
	 */
1150
	public void testGetPackage() {
1151
		printTestHeader("testGetPackage");
1152
1153
		try {
1154
			Session session = getTestSession();
1155
			Identifier guid = new Identifier();
1156
			guid.setValue("testGetPackage." + System.currentTimeMillis());
1157
			InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1158
			SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1159
			Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
1160
			InputStream bagStream = MNodeService.getInstance(request).getPackage(session, pid);
1161 7853 leinfelder
			File bagFile = File.createTempFile("bagit.", ".zip");
1162 7850 leinfelder
			IOUtils.copy(bagStream, new FileOutputStream(bagFile));
1163
			BagFactory bagFactory = new BagFactory();
1164
			Bag bag = bagFactory.createBag(bagFile);
1165
			InputStream result = bag.getPayload().iterator().next().newInputStream();
1166
1167
			// go back to beginning of original stream
1168
			object.reset();
1169
			// check
1170
			assertTrue(object.available() > 0);
1171
			assertTrue(result.available() > 0);
1172
			assertTrue(IOUtils.contentEquals(result, object));
1173
1174
			// clean up
1175
			bagFile.delete();
1176
1177
		} catch (Exception e) {
1178
			e.printStackTrace();
1179
			fail("Unexpected error: " + e.getMessage());
1180
		}
1181
	}
1182 7853 leinfelder
1183
1184
	/**
1185
	 * Test getting a known object
1186
	 */
1187
	public void testGetOREPackage() {
1188
		printTestHeader("testGetOREPackage");
1189
1190
		try {
1191
1192
			// construct the ORE package
1193
			Identifier resourceMapId = new Identifier();
1194
			//resourceMapId.setValue("doi://1234/AA/map.1.1");
1195
			resourceMapId.setValue("testGetOREPackage." + System.currentTimeMillis());
1196
			Identifier metadataId = new Identifier();
1197
			metadataId.setValue("doi://1234/AA/meta.1." + + System.currentTimeMillis());
1198
			List<Identifier> dataIds = new ArrayList<Identifier>();
1199
			Identifier dataId = new Identifier();
1200
			dataId.setValue("doi://1234/AA/data.1." + System.currentTimeMillis());
1201
			Identifier dataId2 = new Identifier();
1202
			dataId2.setValue("doi://1234/AA/data.2." + System.currentTimeMillis());
1203
			dataIds.add(dataId);
1204
			dataIds.add(dataId2);
1205
			Map<Identifier, List<Identifier>> idMap = new HashMap<Identifier, List<Identifier>>();
1206
			idMap.put(metadataId, dataIds);
1207
			ResourceMapFactory rmf = ResourceMapFactory.getInstance();
1208
			ResourceMap resourceMap = rmf.createResourceMap(resourceMapId, idMap);
1209
			assertNotNull(resourceMap);
1210
			String rdfXml = ResourceMapFactory.getInstance().serializeResourceMap(resourceMap);
1211
			assertNotNull(rdfXml);
1212
1213
			Session session = getTestSession();
1214
			InputStream object = null;
1215
			SystemMetadata sysmeta = null;
1216
1217
			// save the data objects (data just contains their ID)
1218
			InputStream dataObject1 = new ByteArrayInputStream(dataId.getValue().getBytes("UTF-8"));
1219
			sysmeta = createSystemMetadata(dataId, session.getSubject(), dataObject1);
1220
			MNodeService.getInstance(request).create(session, dataId, dataObject1, sysmeta);
1221
			// second data file
1222
			InputStream dataObject2 = new ByteArrayInputStream(dataId2.getValue().getBytes("UTF-8"));
1223
			sysmeta = createSystemMetadata(dataId2, session.getSubject(), dataObject2);
1224
			MNodeService.getInstance(request).create(session, dataId2, dataObject2, sysmeta);
1225
			// metadata file
1226
			InputStream metadataObject = new ByteArrayInputStream(metadataId.getValue().getBytes("UTF-8"));
1227
			sysmeta = createSystemMetadata(metadataId, session.getSubject(), metadataObject);
1228
			MNodeService.getInstance(request).create(session, metadataId, metadataObject, sysmeta);
1229
1230
			// save the ORE object
1231
			object = new ByteArrayInputStream(rdfXml.getBytes("UTF-8"));
1232
			sysmeta = createSystemMetadata(resourceMapId, session.getSubject(), object);
1233
			sysmeta.setFormatId(ObjectFormatCache.getInstance().getFormat("http://www.openarchives.org/ore/terms").getFormatId());
1234
			Identifier pid = MNodeService.getInstance(request).create(session, resourceMapId, object, sysmeta);
1235
1236
			// get the package we uploaded
1237
			InputStream bagStream = MNodeService.getInstance(request).getPackage(session, pid);
1238
			File bagFile = File.createTempFile("bagit.", ".zip");
1239
			IOUtils.copy(bagStream, new FileOutputStream(bagFile));
1240
			BagFactory bagFactory = new BagFactory();
1241
			Bag bag = bagFactory.createBag(bagFile);
1242
			Iterator<Manifest> manifestIter = bag.getTagManifests().iterator();
1243
			while (manifestIter.hasNext()) {
1244
				String filepath = manifestIter.next().getFilepath();
1245
				BagFile entryFile = bag.getBagFile(filepath);
1246
				InputStream result = entryFile.newInputStream();
1247
				// check ORE
1248
				if (filepath.contains(resourceMapId.getValue())) {
1249
					object.reset();
1250
					assertTrue(object.available() > 0);
1251
					assertTrue(result.available() > 0);
1252
					assertTrue(IOUtils.contentEquals(result, object));
1253
				}
1254
				// check metadata
1255
				if (filepath.contains(metadataId.getValue())) {
1256
					metadataObject.reset();
1257
					assertTrue(metadataObject.available() > 0);
1258
					assertTrue(result.available() > 0);
1259
					assertTrue(IOUtils.contentEquals(result, metadataObject));
1260
				}
1261
				if (filepath.contains(dataId.getValue())) {
1262
					dataObject1.reset();
1263
					assertTrue(dataObject1.available() > 0);
1264
					assertTrue(result.available() > 0);
1265
					assertTrue(IOUtils.contentEquals(result, dataObject1));
1266
				}
1267
				if (filepath.contains(dataId2.getValue())) {
1268
					dataObject2.reset();
1269
					assertTrue(dataObject2.available() > 0);
1270
					assertTrue(result.available() > 0);
1271
					assertTrue(IOUtils.contentEquals(result, dataObject2));
1272
				}
1273
1274
1275
			}
1276
1277
			// clean up
1278
			bagFile.delete();
1279
1280
		} catch (Exception e) {
1281
			e.printStackTrace();
1282
			fail("Unexpected error: " + e.getMessage());
1283
		}
1284
	}
1285
1286 6354 cjones
1287 6309 cjones
}