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