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 8908 tao
30 9034 tao
31
import edu.ucsb.nceas.metacat.dataone.MNodeService;
32 7850 leinfelder
import gov.loc.repository.bagit.Bag;
33
import gov.loc.repository.bagit.BagFactory;
34 7853 leinfelder
import gov.loc.repository.bagit.BagFile;
35
import gov.loc.repository.bagit.Manifest;
36 7850 leinfelder
37 6309 cjones
import java.io.ByteArrayInputStream;
38 6942 cjones
import java.io.ByteArrayOutputStream;
39 7850 leinfelder
import java.io.File;
40
import java.io.FileOutputStream;
41 6942 cjones
import java.io.IOException;
42 6309 cjones
import java.io.InputStream;
43
import java.io.UnsupportedEncodingException;
44 6326 leinfelder
import java.text.SimpleDateFormat;
45 7040 cjones
import java.util.ArrayList;
46 6312 cjones
import java.util.Calendar;
47 6309 cjones
import java.util.Date;
48 7853 leinfelder
import java.util.HashMap;
49
import java.util.Iterator;
50 7040 cjones
import java.util.List;
51 7853 leinfelder
import java.util.Map;
52 6309 cjones
53
import junit.framework.Test;
54
import junit.framework.TestSuite;
55
56 8952 tao
import org.apache.commons.io.FileUtils;
57 6324 leinfelder
import org.apache.commons.io.IOUtils;
58 8810 leinfelder
import org.dataone.client.v2.formats.ObjectFormatCache;
59 6348 leinfelder
import org.dataone.configuration.Settings;
60 7853 leinfelder
import org.dataone.ore.ResourceMapFactory;
61 6942 cjones
import org.dataone.service.util.TypeMarshaller;
62 6309 cjones
import org.dataone.service.exceptions.IdentifierNotUnique;
63
import org.dataone.service.exceptions.InsufficientResources;
64
import org.dataone.service.exceptions.InvalidRequest;
65
import org.dataone.service.exceptions.InvalidSystemMetadata;
66
import org.dataone.service.exceptions.InvalidToken;
67
import org.dataone.service.exceptions.NotAuthorized;
68
import org.dataone.service.exceptions.NotFound;
69
import org.dataone.service.exceptions.NotImplemented;
70
import org.dataone.service.exceptions.ServiceFailure;
71 6333 leinfelder
import org.dataone.service.exceptions.SynchronizationFailed;
72 6309 cjones
import org.dataone.service.exceptions.UnsupportedType;
73 6366 leinfelder
import org.dataone.service.types.v1.AccessPolicy;
74
import org.dataone.service.types.v1.AccessRule;
75
import org.dataone.service.types.v1.Checksum;
76
import org.dataone.service.types.v1.DescribeResponse;
77
import org.dataone.service.types.v1.Event;
78
import org.dataone.service.types.v1.Identifier;
79 8810 leinfelder
import org.dataone.service.types.v2.Log;
80
import org.dataone.service.types.v2.Node;
81 6366 leinfelder
import org.dataone.service.types.v1.NodeReference;
82
import org.dataone.service.types.v1.ObjectFormatIdentifier;
83
import org.dataone.service.types.v1.ObjectList;
84
import org.dataone.service.types.v1.Permission;
85 7040 cjones
import org.dataone.service.types.v1.Person;
86 6366 leinfelder
import org.dataone.service.types.v1.Session;
87
import org.dataone.service.types.v1.Subject;
88 7040 cjones
import org.dataone.service.types.v1.SubjectInfo;
89 8952 tao
import org.dataone.service.types.v1.util.ChecksumUtil;
90 8810 leinfelder
import org.dataone.service.types.v2.SystemMetadata;
91 7853 leinfelder
import org.dspace.foresite.ResourceMap;
92 6942 cjones
import org.jibx.runtime.JiBXException;
93 6309 cjones
import org.junit.After;
94
import org.junit.Before;
95
96
/**
97
 * A JUnit test to exercise the Metacat Member Node service implementation.
98
 * This also tests a few of the D1NodeService superclass methods
99
 *
100
 * @author cjones
101
 *
102
 */
103 6324 leinfelder
public class MNodeServiceTest extends D1NodeServiceTest {
104 6309 cjones
105 8952 tao
    private static String unmatchingEncodingFilePath = "test/incorrect-encoding-declaration.xml";
106 6354 cjones
  /**
107
   * Set up the test fixtures
108
   *
109
   * @throws Exception
110
   */
111
  @Before
112
  public void setUp() throws Exception {
113
    super.setUp();
114
    // set up the configuration for d1client
115
    Settings.getConfiguration().setProperty("D1Client.cnClassName", MockCNode.class.getName());
116
  }
117 6309 cjones
118 6354 cjones
  /**
119
   * Remove the test fixtures
120
   */
121
  @After
122
  public void tearDown() {
123
  }
124
125
  /**
126
   * Build the test suite
127
   * @return
128
   */
129
  public static Test suite() {
130
131
    TestSuite suite = new TestSuite();
132 6309 cjones
    suite.addTest(new MNodeServiceTest("initialize"));
133
    // MNStorage tests
134 7160 leinfelder
    suite.addTest(new MNodeServiceTest("testCreate"));
135 7816 leinfelder
    suite.addTest(new MNodeServiceTest("testCreateInvalidIdentifier"));
136 7160 leinfelder
    suite.addTest(new MNodeServiceTest("testUpdate"));
137 7161 leinfelder
    // this requires MN certificate
138 7163 leinfelder
    suite.addTest(new MNodeServiceTest("testDelete"));
139 7161 leinfelder
140 7160 leinfelder
    // MNRead tests
141
    suite.addTest(new MNodeServiceTest("testGet"));
142
    suite.addTest(new MNodeServiceTest("testGetChecksum"));
143
    suite.addTest(new MNodeServiceTest("testGetSystemMetadata"));
144
    suite.addTest(new MNodeServiceTest("testDescribe"));
145
    suite.addTest(new MNodeServiceTest("testListObjects"));
146 7161 leinfelder
    // this requires CN certificate
147 7164 leinfelder
    suite.addTest(new MNodeServiceTest("testSynchronizationFailed"));
148 7161 leinfelder
149 7160 leinfelder
    // MNCore tests
150
    suite.addTest(new MNodeServiceTest("testPing"));
151
    suite.addTest(new MNodeServiceTest("testGetLogRecords"));
152
    suite.addTest(new MNodeServiceTest("testGetCapabilities"));
153 8833 leinfelder
154 7160 leinfelder
    // MNAuthorization tests
155
    suite.addTest(new MNodeServiceTest("testIsAuthorized"));
156 7040 cjones
    suite.addTest(new MNodeServiceTest("testIsEquivIdentityAuthorized"));
157 7160 leinfelder
    suite.addTest(new MNodeServiceTest("testSetAccessPolicy"));
158
    // MNreplication tests
159
    suite.addTest(new MNodeServiceTest("testReplicate"));
160 7850 leinfelder
    // MN packaging tests
161
    suite.addTest(new MNodeServiceTest("testGetPackage"));
162 7853 leinfelder
    suite.addTest(new MNodeServiceTest("testGetOREPackage"));
163 8906 tao
    suite.addTest(new MNodeServiceTest("testReadDeletedObject"));
164 8952 tao
    suite.addTest(new MNodeServiceTest("testCreateAndUpdateXMLWithUnmatchingEncoding"));
165 9034 tao
    suite.addTest(new MNodeServiceTest("testGetSID"));
166 6354 cjones
    return suite;
167
168
  }
169
170
  /**
171
   * Constructor for the tests
172
   *
173
   * @param name - the name of the test
174
   */
175
  public MNodeServiceTest(String name) {
176
    super(name);
177
178
  }
179 6309 cjones
180 6354 cjones
  /**
181
   * Initial blank test
182
   */
183
  public void initialize() {
184
    assertTrue(1 == 1);
185
186
  }
187
188
  /**
189
   * Test getting a known object
190
   */
191
  public void testGet() {
192 6309 cjones
    printTestHeader("testGet");
193
194 6354 cjones
    try {
195
      Session session = getTestSession();
196
      Identifier guid = new Identifier();
197
      guid.setValue("testGet." + System.currentTimeMillis());
198
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
199
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
200 6542 leinfelder
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
201
      InputStream result = MNodeService.getInstance(request).get(session, guid);
202 6354 cjones
      // go back to beginning of original stream
203
      object.reset();
204
      // check
205
      assertTrue(object.available() > 0);
206
      assertTrue(result.available() > 0);
207
      assertTrue(IOUtils.contentEquals(result, object));
208
209 6309 cjones
    } catch (UnsupportedEncodingException e) {
210 6354 cjones
      e.printStackTrace();
211
      fail("Unexpected error: " + e.getMessage());
212 6309 cjones
213
    } catch (InvalidToken e) {
214 6354 cjones
      e.printStackTrace();
215
      fail("Unexpected error: " + e.getMessage());
216
217 6309 cjones
    } catch (ServiceFailure e) {
218 6354 cjones
      e.printStackTrace();
219
      fail("Unexpected error: " + e.getMessage());
220
221 6309 cjones
    } catch (NotAuthorized e) {
222 6354 cjones
      e.printStackTrace();
223
      fail("Unexpected error: " + e.getMessage());
224
225 6309 cjones
    } catch (IdentifierNotUnique e) {
226 6354 cjones
      e.printStackTrace();
227
      fail("Unexpected error: " + e.getMessage());
228
229 6309 cjones
    } catch (UnsupportedType e) {
230 6354 cjones
      e.printStackTrace();
231
      fail("Unexpected error: " + e.getMessage());
232
233 6309 cjones
    } catch (InsufficientResources e) {
234 6354 cjones
      e.printStackTrace();
235
      fail("Unexpected error: " + e.getMessage());
236
237 6309 cjones
    } catch (InvalidSystemMetadata e) {
238 6354 cjones
      e.printStackTrace();
239
      fail("Unexpected error: " + e.getMessage());
240
241 6309 cjones
    } catch (NotImplemented e) {
242 6354 cjones
      e.printStackTrace();
243
      fail("Unexpected error: " + e.getMessage());
244
245 6309 cjones
    } catch (InvalidRequest e) {
246 6354 cjones
      e.printStackTrace();
247
      fail("Unexpected error: " + e.getMessage());
248
249 6309 cjones
    } catch (NotFound e) {
250 6354 cjones
      e.printStackTrace();
251
      fail("Unexpected error: " + e.getMessage());
252
253 6309 cjones
    } catch (Exception e) {
254 6354 cjones
      e.printStackTrace();
255
      fail("Unexpected error: " + e.getMessage());
256
257 6309 cjones
    }
258
259 6354 cjones
  }
260 6309 cjones
261 6354 cjones
  /**
262
   * Test getting the system metadata of an object
263
   */
264
  public void testGetSystemMetadata() {
265 6309 cjones
    printTestHeader("testGetSystemMetadata");
266
267
    try {
268 6354 cjones
      Session session = getTestSession();
269
      Identifier guid = new Identifier();
270
      guid.setValue("testGetSystemMetadata." + System.currentTimeMillis());
271
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
272
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
273 6542 leinfelder
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
274
      SystemMetadata newsysmeta = MNodeService.getInstance(request).getSystemMetadata(session, pid);
275 6354 cjones
      assertEquals(newsysmeta.getIdentifier().getValue(), sysmeta.getIdentifier().getValue());
276 9039 tao
      assertEquals(newsysmeta.getSeriesId(), null);
277 6354 cjones
278 6309 cjones
    } catch (UnsupportedEncodingException e) {
279 6354 cjones
      e.printStackTrace();
280
      fail("Unexpected error: " + e.getMessage());
281 6309 cjones
282
    } catch (InvalidToken e) {
283 6354 cjones
      e.printStackTrace();
284
      fail("Unexpected error: " + e.getMessage());
285 6309 cjones
286
    } catch (ServiceFailure e) {
287 6354 cjones
      e.printStackTrace();
288
      fail("Unexpected error: " + e.getMessage());
289 6309 cjones
290
    } catch (NotAuthorized e) {
291 6354 cjones
      e.printStackTrace();
292
      fail("Unexpected error: " + e.getMessage());
293 6309 cjones
294
    } catch (IdentifierNotUnique e) {
295 6354 cjones
      e.printStackTrace();
296
      fail("Unexpected error: " + e.getMessage());
297
298 6309 cjones
    } catch (UnsupportedType e) {
299 6354 cjones
      e.printStackTrace();
300
      fail("Unexpected error: " + e.getMessage());
301 6309 cjones
302
    } catch (InsufficientResources e) {
303 6354 cjones
      e.printStackTrace();
304
      fail("Unexpected error: " + e.getMessage());
305 6309 cjones
306
    } catch (InvalidSystemMetadata e) {
307 6354 cjones
      e.printStackTrace();
308
      fail("Unexpected error: " + e.getMessage());
309 6309 cjones
310
    } catch (NotImplemented e) {
311 6354 cjones
      e.printStackTrace();
312
      fail("Unexpected error: " + e.getMessage());
313 6309 cjones
314
    } catch (InvalidRequest e) {
315 6354 cjones
      e.printStackTrace();
316
      fail("Unexpected error: " + e.getMessage());
317 6309 cjones
318
    } catch (NotFound e) {
319 6354 cjones
      e.printStackTrace();
320
      fail("Unexpected error: " + e.getMessage());
321 6309 cjones
322
    } catch (Exception e) {
323 6354 cjones
      e.printStackTrace();
324
      fail("Unexpected error: " + e.getMessage());
325 6309 cjones
326
    }
327
328 6354 cjones
  }
329 6309 cjones
330 6354 cjones
  /**
331
   * Test object creation
332
   */
333
  public void testCreate() {
334 6309 cjones
    printTestHeader("testCreate");
335
336 6354 cjones
    try {
337
      Session session = getTestSession();
338
      Identifier guid = new Identifier();
339
      guid.setValue("testCreate." + System.currentTimeMillis());
340
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
341
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
342 6542 leinfelder
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
343 6354 cjones
      assertEquals(guid.getValue(), pid.getValue());
344 6309 cjones
    } catch (UnsupportedEncodingException e) {
345 6354 cjones
      e.printStackTrace();
346
      fail("Unexpected error: " + e.getMessage());
347 6309 cjones
348
    } catch (InvalidToken e) {
349 6354 cjones
      e.printStackTrace();
350
      fail("Unexpected error: " + e.getMessage());
351 6309 cjones
352
    } catch (ServiceFailure e) {
353 6354 cjones
      e.printStackTrace();
354
      fail("Unexpected error: " + e.getMessage());
355 6309 cjones
356
    } catch (NotAuthorized e) {
357 6354 cjones
      e.printStackTrace();
358
      fail("Unexpected error: " + e.getMessage());
359 6309 cjones
360
    } catch (IdentifierNotUnique e) {
361 6354 cjones
      e.printStackTrace();
362
      fail("Unexpected error: " + e.getMessage());
363 6309 cjones
364
    } catch (UnsupportedType e) {
365 6354 cjones
      e.printStackTrace();
366
      fail("Unexpected error: " + e.getMessage());
367 6309 cjones
368
    } catch (InsufficientResources e) {
369 6354 cjones
      e.printStackTrace();
370
      fail("Unexpected error: " + e.getMessage());
371 6309 cjones
372
    } catch (InvalidSystemMetadata e) {
373 6354 cjones
      e.printStackTrace();
374
      fail("Unexpected error: " + e.getMessage());
375 6309 cjones
376
    } catch (NotImplemented e) {
377 6354 cjones
      e.printStackTrace();
378
      fail("Unexpected error: " + e.getMessage());
379 6309 cjones
380
    } catch (InvalidRequest e) {
381 6354 cjones
      e.printStackTrace();
382
      fail("Unexpected error: " + e.getMessage());
383 6309 cjones
384
    } catch (Exception e) {
385 6354 cjones
      e.printStackTrace();
386
      fail("Unexpected error: " + e.getMessage());
387 6309 cjones
388
    }
389
390
  }
391
392 6354 cjones
  /**
393
   * test object deletion
394
   */
395
  public void testDelete() {
396 6309 cjones
    printTestHeader("testDelete");
397
398 6354 cjones
    try {
399
      Session session = getTestSession();
400
      Identifier guid = new Identifier();
401
      guid.setValue("testDelete." + System.currentTimeMillis());
402
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
403
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
404 6542 leinfelder
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
405 7163 leinfelder
406
      // use MN admin to delete
407
      session = getMNSession();
408 6542 leinfelder
      Identifier deletedPid = MNodeService.getInstance(request).delete(session, pid);
409 6333 leinfelder
      assertEquals(pid.getValue(), deletedPid.getValue());
410 7160 leinfelder
      // check that we cannot get the object
411 7163 leinfelder
      session = getTestSession();
412 7160 leinfelder
      InputStream deletedObject = null;
413
      try {
414 7163 leinfelder
    	  deletedObject = MNodeService.getInstance(request).get(session, deletedPid);
415 7160 leinfelder
      } catch (NotFound nf) {
416
    	  // this is expected
417
      }
418
	  assertNull(deletedObject);
419 6309 cjones
420 6354 cjones
    } catch (UnsupportedEncodingException e) {
421
      e.printStackTrace();
422
423 6324 leinfelder
    } catch (Exception e) {
424 6354 cjones
      e.printStackTrace();
425
      fail("Unexpected error: " + e.getMessage());
426 6309 cjones
427 6324 leinfelder
    }
428 6309 cjones
429 6354 cjones
  }
430 6309 cjones
431 6354 cjones
  /**
432
   * Test object updating
433
   */
434
  public void testUpdate() {
435 6309 cjones
    printTestHeader("testUpdate");
436
437 6354 cjones
    try {
438
      Session session = getTestSession();
439
      Identifier guid = new Identifier();
440
      guid.setValue("testUpdate." + System.currentTimeMillis());
441
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
442
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
443
      Identifier newPid = new Identifier();
444 6596 leinfelder
      newPid.setValue("testUpdate." + (System.currentTimeMillis() + 1)); // ensure it is different from original
445 6354 cjones
      Identifier pid =
446 6542 leinfelder
        MNodeService.getInstance(request).create(session, guid, object, sysmeta);
447 6338 cjones
448 6354 cjones
      SystemMetadata newSysMeta = createSystemMetadata(newPid, session.getSubject(), object);
449
450
      // do the update
451
      Identifier updatedPid =
452 6542 leinfelder
        MNodeService.getInstance(request).update(session, pid, object, newPid, newSysMeta);
453 6338 cjones
454 6354 cjones
      // get the updated system metadata
455 6338 cjones
      SystemMetadata updatedSysMeta =
456 6542 leinfelder
        MNodeService.getInstance(request).getSystemMetadata(session, updatedPid);
457 6338 cjones
458 6354 cjones
      assertEquals(updatedPid.getValue(), newPid.getValue());
459 6366 leinfelder
//      assertTrue(updatedSysMeta.getObsolete(0).getValue().equals(pid.getValue()));
460
//      assertTrue(updatedSysMeta.getDerivedFrom(0).getValue().equals(pid.getValue()));
461 6354 cjones
462 6309 cjones
    } catch (UnsupportedEncodingException e) {
463 6354 cjones
      e.printStackTrace();
464
      fail("Unexpected error: " + e.getMessage());
465 6309 cjones
466
    } catch (InvalidToken e) {
467 6354 cjones
      e.printStackTrace();
468
      fail("Unexpected error: " + e.getMessage());
469 6309 cjones
470
    } catch (ServiceFailure e) {
471 6354 cjones
      e.printStackTrace();
472
      fail("Unexpected error: " + e.getMessage());
473 6309 cjones
474
    } catch (NotAuthorized e) {
475 6354 cjones
      e.printStackTrace();
476
      fail("Unexpected error: " + e.getMessage());
477 6309 cjones
478
    } catch (IdentifierNotUnique e) {
479 6354 cjones
      e.printStackTrace();
480
      fail("Unexpected error: " + e.getMessage());
481 6309 cjones
482
    } catch (UnsupportedType e) {
483 6354 cjones
      e.printStackTrace();
484
      fail("Unexpected error: " + e.getMessage());
485 6309 cjones
486
    } catch (InsufficientResources e) {
487 6354 cjones
      e.printStackTrace();
488
      fail("Unexpected error: " + e.getMessage());
489 6309 cjones
490
    } catch (InvalidSystemMetadata e) {
491 6354 cjones
      e.printStackTrace();
492
      fail("Unexpected error: " + e.getMessage());
493 6309 cjones
494
    } catch (NotImplemented e) {
495 6354 cjones
      e.printStackTrace();
496
      fail("Unexpected error: " + e.getMessage());
497 6309 cjones
498
    } catch (InvalidRequest e) {
499 6354 cjones
      e.printStackTrace();
500
      fail("Unexpected error: " + e.getMessage());
501 6309 cjones
502
    } catch (Exception e) {
503 6354 cjones
      e.printStackTrace();
504
      fail("Unexpected error: " + e.getMessage());
505 6309 cjones
506
    }
507 6354 cjones
  }
508 6309 cjones
509 6354 cjones
  /**
510
   * We currently expect this unit test to fail because it should rely on a different member node
511
   * to retrieve the object from. Currently it gets the object from itself and throws
512
   * and expected error for duplicate entry.
513
   *
514
   */
515
  public void testReplicate() {
516
      printTestHeader("testReplicate");
517
      try {
518
        Session session = getTestSession();
519
        Identifier guid = new Identifier();
520
        guid.setValue("testReplicate." + System.currentTimeMillis());
521
        InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
522
        SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
523
        // save locally
524 6542 leinfelder
        Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
525 6354 cjones
        // get our node reference (attempting to replicate with self)
526 6542 leinfelder
        NodeReference sourceNode = MNodeService.getInstance(request).getCapabilities().getIdentifier();
527 6354 cjones
        // attempt to replicate with ourselves -- this should fail!
528
      boolean result = false;
529
      try {
530 6542 leinfelder
        result = MNodeService.getInstance(request).replicate(session, sysmeta, sourceNode);
531 6354 cjones
      } catch (Exception inu) {
532
        // we are expecting this to fail since we already have the doc
533
        result = true;
534
      }
535
      assertTrue(result);
536
      } catch (Exception e) {
537
        e.printStackTrace();
538
      fail("Probably not yet implemented: " + e.getMessage());
539
    }
540
  }
541 6309 cjones
542 6354 cjones
  /**
543
   * Test describing an object
544
   */
545
  public void testDescribe() {
546 6314 cjones
    printTestHeader("testDescribe");
547 6309 cjones
548
    try {
549 6354 cjones
      Session session = getTestSession();
550
      Identifier guid = new Identifier();
551
      guid.setValue("testGetSystemMetadata." + System.currentTimeMillis());
552
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
553
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
554 6542 leinfelder
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
555
      DescribeResponse describeResponse = MNodeService.getInstance(request).describe(session, pid);
556 6354 cjones
      assertEquals(describeResponse.getDataONE_Checksum().getValue(), sysmeta.getChecksum().getValue());
557 6597 leinfelder
      assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), sysmeta.getFormatId().getValue());
558 6354 cjones
559 6309 cjones
    } catch (UnsupportedEncodingException e) {
560 6354 cjones
      e.printStackTrace();
561
      fail("Unexpected error: " + e.getMessage());
562 6309 cjones
563
    } catch (InvalidToken e) {
564 6354 cjones
      e.printStackTrace();
565
      fail("Unexpected error: " + e.getMessage());
566 6309 cjones
567
    } catch (ServiceFailure e) {
568 6354 cjones
      e.printStackTrace();
569
      fail("Unexpected error: " + e.getMessage());
570 6309 cjones
571
    } catch (NotAuthorized e) {
572 6354 cjones
      e.printStackTrace();
573
      fail("Unexpected error: " + e.getMessage());
574 6309 cjones
575
    } catch (IdentifierNotUnique e) {
576 6354 cjones
      e.printStackTrace();
577
      fail("Unexpected error: " + e.getMessage());
578
579 6309 cjones
    } catch (UnsupportedType e) {
580 6354 cjones
      e.printStackTrace();
581
      fail("Unexpected error: " + e.getMessage());
582 6309 cjones
583
    } catch (InsufficientResources e) {
584 6354 cjones
      e.printStackTrace();
585
      fail("Unexpected error: " + e.getMessage());
586 6309 cjones
587
    } catch (InvalidSystemMetadata e) {
588 6354 cjones
      e.printStackTrace();
589
      fail("Unexpected error: " + e.getMessage());
590 6309 cjones
591
    } catch (NotImplemented e) {
592 6354 cjones
      e.printStackTrace();
593
      fail("Unexpected error: " + e.getMessage());
594 6309 cjones
595
    } catch (InvalidRequest e) {
596 6354 cjones
      e.printStackTrace();
597
      fail("Unexpected error: " + e.getMessage());
598 6309 cjones
599
    } catch (NotFound e) {
600 6354 cjones
      e.printStackTrace();
601
      fail("Unexpected error: " + e.getMessage());
602 6309 cjones
603
    } catch (Exception e) {
604 6354 cjones
      e.printStackTrace();
605
      fail("Unexpected error: " + e.getMessage());
606 6309 cjones
607
    }
608 6354 cjones
  }
609 6309 cjones
610 6354 cjones
  /**
611
   * Test getting the checksum of an object
612
   */
613
  public void testGetChecksum() {
614 6309 cjones
    printTestHeader("testGetChecksum");
615
616 6354 cjones
    try {
617
      Session session = getTestSession();
618
      Identifier guid = new Identifier();
619
      guid.setValue("testGetChecksum." + System.currentTimeMillis());
620
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
621
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
622 6542 leinfelder
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
623
      Checksum checksum = MNodeService.getInstance(request).getChecksum(session, pid, "MD5");
624 6354 cjones
      assertEquals(checksum.getValue(), sysmeta.getChecksum().getValue());
625 6309 cjones
626 6354 cjones
    } catch (UnsupportedEncodingException e) {
627
      e.printStackTrace();
628
      fail("Unexpected error: " + e.getMessage());
629 6309 cjones
630
    } catch (InvalidToken e) {
631 6354 cjones
      e.printStackTrace();
632
      fail("Unexpected error: " + e.getMessage());
633 6309 cjones
634
    } catch (ServiceFailure e) {
635 6354 cjones
      e.printStackTrace();
636
      fail("Unexpected error: " + e.getMessage());
637 6309 cjones
638
    } catch (NotAuthorized e) {
639 6354 cjones
      e.printStackTrace();
640
      fail("Unexpected error: " + e.getMessage());
641 6309 cjones
642
    } catch (IdentifierNotUnique e) {
643 6354 cjones
      e.printStackTrace();
644
      fail("Unexpected error: " + e.getMessage());
645 6309 cjones
646
    } catch (UnsupportedType e) {
647 6354 cjones
      e.printStackTrace();
648
      fail("Unexpected error: " + e.getMessage());
649 6309 cjones
650
    } catch (InsufficientResources e) {
651 6354 cjones
      e.printStackTrace();
652
      fail("Unexpected error: " + e.getMessage());
653 6309 cjones
654
    } catch (InvalidSystemMetadata e) {
655 6354 cjones
      e.printStackTrace();
656
      fail("Unexpected error: " + e.getMessage());
657 6309 cjones
658
    } catch (NotImplemented e) {
659 6354 cjones
      e.printStackTrace();
660
      fail("Unexpected error: " + e.getMessage());
661 6309 cjones
662
    } catch (InvalidRequest e) {
663 6354 cjones
      e.printStackTrace();
664
      fail("Unexpected error: " + e.getMessage());
665 6309 cjones
666
    } catch (NotFound e) {
667 6354 cjones
      e.printStackTrace();
668
      fail("Unexpected error: " + e.getMessage());
669 6309 cjones
670
    } catch (Exception e) {
671 6354 cjones
      e.printStackTrace();
672
      fail("Unexpected error: " + e.getMessage());
673 6309 cjones
674
    }
675 6354 cjones
676
  }
677 6309 cjones
678 6354 cjones
  /**
679
   * Testing listing objects on the Member Node
680
   */
681
  public void testListObjects() {
682
      printTestHeader("testListObjects");
683
684
      try {
685
686
        Session session = getTestSession();
687
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
688
        Date startTime = sdf.parse("2010-01-01");
689
        Date endTime = new Date();
690
        ObjectFormatIdentifier objectFormatId = null;
691
        boolean replicaStatus = false;
692
        int start = 0;
693
        int count = 1;
694
695
        // insert at least one object
696
        testCreate();
697
        // now check that we have at least one
698
        ObjectList objectList =
699 6542 leinfelder
          MNodeService.getInstance(request).listObjects(session, startTime, endTime,
700 8810 leinfelder
              objectFormatId, null, replicaStatus, start, count);
701 6354 cjones
        assertNotNull(objectList);
702
        assertTrue(objectList.getCount() == count);
703
        assertTrue(objectList.getStart() == 0);
704
        assertTrue(objectList.getTotal() > 1);
705
706
      } catch (Exception e) {
707
        e.printStackTrace();
708
        fail("Unexpected error: " + e.getMessage());
709
710
      }
711
  }
712 6309 cjones
713 6354 cjones
  public void testGetCapabilities() {
714
      printTestHeader("testGetCapabilities");
715
    try {
716 6542 leinfelder
      Node node = MNodeService.getInstance(request).getCapabilities();
717 6942 cjones
      ByteArrayOutputStream baos = new ByteArrayOutputStream();
718
      TypeMarshaller.marshalTypeToOutputStream(node, baos);
719 6354 cjones
      assertNotNull(node);
720
      // TODO: should probably test other parts of the node information
721 6942 cjones
722
    } catch (JiBXException e) {
723
        e.printStackTrace();
724
        fail("The node instance couldn't be parsed correctly:" + e.getMessage());
725
726
    } catch (IOException e) {
727
        e.printStackTrace();
728
        fail("The node instance couldn't be read correctly:" + e.getMessage());
729
730 6354 cjones
    } catch (Exception e) {
731 6942 cjones
        e.printStackTrace();
732
        fail("Probably not yet implemented: " + e.getMessage());
733
734 6354 cjones
    }
735
736
  }
737 6309 cjones
738 6354 cjones
  public void testPing() {
739 6309 cjones
740 6354 cjones
    try {
741 6804 leinfelder
      Date mnDate = MNodeService.getInstance(request).ping();
742
      assertTrue(mnDate != null);
743 6354 cjones
744 6309 cjones
    } catch (NotImplemented e) {
745 6354 cjones
      e.printStackTrace();
746
      fail("Unexpected error: " + e.getMessage());
747 6309 cjones
748
    } catch (ServiceFailure e) {
749 6354 cjones
      e.printStackTrace();
750
      fail("Unexpected error: " + e.getMessage());
751 6309 cjones
752 6612 leinfelder
    }  catch (InsufficientResources e) {
753 6354 cjones
      e.printStackTrace();
754
      fail("Unexpected error: " + e.getMessage());
755 6309 cjones
756
    }
757 6354 cjones
758
  }
759 6309 cjones
760 6354 cjones
  public void testSynchronizationFailed() {
761
    printTestHeader("testSynchronizationFailed");
762
    try {
763
        Session session = getTestSession();
764
765
        // create the object
766
        Identifier pid = new Identifier();
767
        pid.setValue("testSynchronizationFailed." + System.currentTimeMillis());
768
        InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
769
        SystemMetadata sysmeta = createSystemMetadata(pid, session.getSubject(), object);
770 6542 leinfelder
        Identifier retPid = MNodeService.getInstance(request).create(session, pid, object, sysmeta);
771 6354 cjones
        assertEquals(retPid.getValue(), pid.getValue());
772
773 7163 leinfelder
        // pretend the sync failed, act as CN
774 6354 cjones
      SynchronizationFailed syncFailed =
775
        new SynchronizationFailed("0000", "Testing Synch Failure");
776 6366 leinfelder
      syncFailed.setPid(pid.getValue());
777 7163 leinfelder
      session = getCNSession();
778 6542 leinfelder
      MNodeService.getInstance(request).synchronizationFailed(session, syncFailed );
779 6354 cjones
    } catch (Exception e) {
780
      e.printStackTrace();
781
        fail("Unexpected error: " + e.getMessage());
782
    }
783 6333 leinfelder
784 6354 cjones
  }
785 6309 cjones
786 6605 cjones
  public void testSystemMetadataChanged() {
787
      printTestHeader("testSystemMetadataChanged");
788
      try {
789
          Session session = getTestSession();
790
791
          // create the object
792
          Identifier pid = new Identifier();
793
          pid.setValue("testSystemMetadataChanged." + System.currentTimeMillis());
794
          InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
795
          SystemMetadata sysmeta = createSystemMetadata(pid, session.getSubject(), object);
796
          Identifier retPid = MNodeService.getInstance(request).create(session, pid, object, sysmeta);
797
          assertEquals(retPid.getValue(), pid.getValue());
798
799
          // pretend the system metadata changed on the CN
800
          MNodeService.getInstance(request).systemMetadataChanged(session,
801
                  retPid, 5000L, Calendar.getInstance().getTime());
802
803
      } catch (Exception e) {
804
          if (e instanceof NotAuthorized) {
805
              // only CN subjects can call this
806
              // TODO: use a CN certificate in the tests
807
          } else {
808
              fail("Unexpected error: " + e.getMessage());
809
810
          }
811
      }
812
813
    }
814
815 6354 cjones
  public void testGetLogRecords() {
816 6312 cjones
    printTestHeader("testLogRecords");
817 6309 cjones
818 6698 leinfelder
    try {
819
	    Log log = null;
820 7261 leinfelder
	    Session session = getCNSession();
821 6698 leinfelder
	    Date fromDate = new Date();
822
	    Calendar calendar = Calendar.getInstance();
823
	    calendar.setTime(fromDate);
824
	    calendar.roll(Calendar.YEAR, false);
825
	    fromDate = calendar.getTime();
826
	    Date toDate = new Date();
827
	    Event event = Event.CREATE;
828
	    int start = 0;
829
	    int count = 1;
830 6309 cjones
831 6542 leinfelder
      log = MNodeService.getInstance(request).getLogRecords(session, fromDate, toDate,
832 8810 leinfelder
        event.xmlValue(), null, start, count);
833 6354 cjones
834
      assertNotNull(log);
835
      assertTrue(log.getCount() == count);
836
      assertTrue(log.getStart() == start);
837
      assertTrue(log.getTotal() >= 1);
838
839 6698 leinfelder
    } catch (Exception e) {
840 6354 cjones
      e.printStackTrace();
841
      fail("Unexpected error: " + e.getMessage());
842 6309 cjones
843
    }
844 6354 cjones
  }
845 6309 cjones
846 6354 cjones
  /**
847
   * Testing setting access on a known object
848
   */
849
  public void testSetAccessPolicy() {
850 6309 cjones
    printTestHeader("testSetAccess");
851
852 6577 cjones
    //boolean accessWasSet = false;
853
    //
854
    //try {
855
    //  // create an object to set access on
856
    //  Session session = getTestSession();
857
    //  Identifier guid = new Identifier();
858
    //  guid.setValue("testSetAccess." + System.currentTimeMillis());
859
    //  InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
860
    //  SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
861
    //  Identifier pid =
862
    //    MNodeService.getInstance(request).create(session, guid, object, sysmeta);
863
    //  // set the access
864
    //  AccessPolicy accessPolicy = new AccessPolicy();
865
    //  AccessRule allow = new AccessRule();
866
    //  allow.addPermission(Permission.WRITE);
867
    //  Subject publicSubject = new Subject();
868
    //  publicSubject.setValue(Constants.SUBJECT_PUBLIC);
869
    //  allow.addSubject(publicSubject);
870
    //  accessPolicy.addAllow(allow);
871
    //
872
    //  accessWasSet =
873
    //    MNodeService.getInstance(request).setAccessPolicy(session, pid, accessPolicy);
874
    //  assertTrue(accessWasSet);
875
    //  // test that it is enforced
876
    //  session.setSubject(publicSubject);
877
    //  boolean isAuthorized = MNodeService.getInstance(request).isAuthorized(session, pid, Permission.WRITE);
878
    //  assertTrue(isAuthorized);
879
    //
880
    //} catch (UnsupportedEncodingException e) {
881
    //  e.printStackTrace();
882
    //
883
    //} catch (InvalidToken e) {
884
    //  e.printStackTrace();
885
    //  fail("Unexpected error: " + e.getMessage());
886
    //
887
    //} catch (ServiceFailure e) {
888
    //  e.printStackTrace();
889
    //  fail("Unexpected error: " + e.getMessage());
890
    //
891
    //} catch (NotAuthorized e) {
892
    //  e.printStackTrace();
893
    //  fail("Unexpected error: " + e.getMessage());
894
    //
895
    //} catch (IdentifierNotUnique e) {
896
    //  e.printStackTrace();
897
    //  fail("Unexpected error: " + e.getMessage());
898
    //
899
    //} catch (UnsupportedType e) {
900
    //  e.printStackTrace();
901
    //  fail("Unexpected error: " + e.getMessage());
902
    //
903
    //} catch (InsufficientResources e) {
904
    //  e.printStackTrace();
905
    //  fail("Unexpected error: " + e.getMessage());
906
    //
907
    //} catch (InvalidSystemMetadata e) {
908
    //  e.printStackTrace();
909
    //  fail("Unexpected error: " + e.getMessage());
910
    //
911
    //} catch (NotImplemented e) {
912
    //  e.printStackTrace();
913
    //  fail("Unexpected error: " + e.getMessage());
914
    //
915
    //} catch (InvalidRequest e) {
916
    //  e.printStackTrace();
917
    //  fail("Unexpected error: " + e.getMessage());
918
    //
919
    //} catch (NotFound e) {
920
    //  e.printStackTrace();
921
    //  fail("Unexpected error: " + e.getMessage());
922
    //
923
    //} catch (Exception e) {
924
    //  e.printStackTrace();
925
    //  fail("Unexpected error: " + e.getMessage());
926
    //
927
    //}
928 6354 cjones
929
  }
930 6309 cjones
931 6354 cjones
  /**
932
   * Test if a subject is authorized to read a known object
933
   */
934
  public void testIsAuthorized() {
935 6309 cjones
    printTestHeader("testIsAuthorized");
936
937 6354 cjones
    try {
938
      Session session = getTestSession();
939
      Identifier guid = new Identifier();
940
      guid.setValue("testIsAuthorized." + System.currentTimeMillis());
941
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
942
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
943
      Identifier pid =
944 6542 leinfelder
        MNodeService.getInstance(request).create(session, guid, object, sysmeta);
945 6354 cjones
      boolean isAuthorized =
946 6542 leinfelder
        MNodeService.getInstance(request).isAuthorized(session, pid, Permission.READ);
947 6354 cjones
      assertEquals(isAuthorized, true);
948
949 6309 cjones
    } catch (UnsupportedEncodingException e) {
950 6354 cjones
      e.printStackTrace();
951
      fail("Unexpected error: " + e.getMessage());
952 6309 cjones
953
    } catch (InvalidToken e) {
954 6354 cjones
      e.printStackTrace();
955
      fail("Unexpected error: " + e.getMessage());
956 6309 cjones
957
    } catch (ServiceFailure e) {
958 6354 cjones
      e.printStackTrace();
959
      fail("Unexpected error: " + e.getMessage());
960 6309 cjones
961
    } catch (NotAuthorized e) {
962 6354 cjones
      e.printStackTrace();
963
      fail("Unexpected error: " + e.getMessage());
964 6309 cjones
965
    } catch (IdentifierNotUnique e) {
966 6354 cjones
      e.printStackTrace();
967
      fail("Unexpected error: " + e.getMessage());
968 6309 cjones
969
    } catch (UnsupportedType e) {
970 6354 cjones
      e.printStackTrace();
971
      fail("Unexpected error: " + e.getMessage());
972 6309 cjones
973
    } catch (InsufficientResources e) {
974 6354 cjones
      e.printStackTrace();
975
      fail("Unexpected error: " + e.getMessage());
976 6309 cjones
977
    } catch (InvalidSystemMetadata e) {
978 6354 cjones
      e.printStackTrace();
979
      fail("Unexpected error: " + e.getMessage());
980 6309 cjones
981
    } catch (NotImplemented e) {
982 6354 cjones
      e.printStackTrace();
983
      fail("Unexpected error: " + e.getMessage());
984 6309 cjones
985
    } catch (InvalidRequest e) {
986 6354 cjones
      e.printStackTrace();
987
      fail("Unexpected error: " + e.getMessage());
988 6309 cjones
989
    } catch (Exception e) {
990 6354 cjones
      e.printStackTrace();
991
      fail("Unexpected error: " + e.getMessage());
992 6309 cjones
993
    }
994 6354 cjones
  }
995 8209 leinfelder
996
  /**
997
   * Test if node admin is authorized to read a known object
998
   */
999
  public void testIsAdminAuthorized() {
1000
    printTestHeader("testIsAdminAuthorized");
1001
1002
    try {
1003
      Session session = getTestSession();
1004
      Identifier guid = new Identifier();
1005
      guid.setValue("testIsAdminAuthorized." + System.currentTimeMillis());
1006
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1007
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1008
      Identifier pid =
1009
        MNodeService.getInstance(request).create(session, guid, object, sysmeta);
1010
1011
      // test as public - read
1012
      boolean isAuthorized =
1013
        MNodeService.getInstance(request).isAuthorized(null, pid, Permission.READ);
1014
      assertEquals(isAuthorized, true);
1015
1016
      // test as public - change perm
1017
      isAuthorized =
1018
        MNodeService.getInstance(request).isAuthorized(null, pid, Permission.CHANGE_PERMISSION);
1019
      assertEquals(isAuthorized, false);
1020
1021
      // test as admin
1022
      isAuthorized =
1023
    	        MNodeService.getInstance(request).isAuthorized(getMNSession(), pid, Permission.CHANGE_PERMISSION);
1024
    	      assertEquals(isAuthorized, true);
1025
1026
    } catch (Exception e) {
1027
      e.printStackTrace();
1028
      fail("Unexpected error: " + e.getMessage());
1029 6309 cjones
1030 8209 leinfelder
    }
1031
  }
1032
1033 6309 cjones
1034 7040 cjones
  public void testIsEquivIdentityAuthorized() {
1035
      printTestHeader("testIsEquivIdentityAuthorized");
1036
1037
      try {
1038
          Session session = new Session();
1039
          Subject s = new Subject();
1040
          s.setValue("cn=test,dc=dataone,dc=org");
1041
          session.setSubject(s);
1042
1043
          Identifier pid = new Identifier();
1044
          pid.setValue("testIsEquivIdentityAuthorized." + System.currentTimeMillis());
1045
          InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1046
          SystemMetadata sysmeta = createSystemMetadata(pid, session.getSubject(), object);
1047
1048
          // reset the access policy to only allow 'self' read (no public)
1049
          AccessPolicy ap = new AccessPolicy();
1050
          AccessRule ar = new AccessRule();
1051
          List<Subject> sList = new ArrayList<Subject>();
1052
          sList.add(session.getSubject());
1053
          ar.setSubjectList(sList);
1054
          List<Permission> permList = new ArrayList<Permission>();
1055
          permList.add(Permission.CHANGE_PERMISSION);
1056
          ar.setPermissionList(permList);
1057
          ap.addAllow(ar);
1058
          sysmeta.setAccessPolicy(ap);
1059
1060
          // save it
1061
          Identifier retPid = CNodeService.getInstance(request).registerSystemMetadata(session, pid, sysmeta);
1062
          assertEquals(pid.getValue(), retPid.getValue());
1063
1064
          //check it against an equivalent identity not listed in the access policy
1065
          session.getSubject().setValue("cn=newSubject,dc=dataone,dc=org");
1066
          SubjectInfo subjectInfo = new SubjectInfo();
1067
          Person person = new Person();
1068
          person.setSubject(session.getSubject());
1069
          List<String> givenNames = new ArrayList<String>();
1070
          givenNames.add("New");
1071
          person.setGivenNameList(givenNames);
1072
          person.setFamilyName("Subject");
1073
1074
          // add equivalent identities
1075
          List<Subject> equivIdentities = new ArrayList<Subject>();
1076
          Subject mappedSubject2 = new Subject();
1077
          mappedSubject2.setValue("cn=test2,dc=dataone,dc=org");
1078
          equivIdentities.add(mappedSubject2);
1079
1080
          Subject mappedSubject = new Subject();
1081
          mappedSubject.setValue("cn=test,dc=dataone,dc=org");
1082
          equivIdentities.add(mappedSubject);
1083
1084
          person.setEquivalentIdentityList(equivIdentities);
1085
1086
          List<Person> personList = new ArrayList<Person>();
1087
          personList.add(person);
1088
          subjectInfo.setPersonList(personList);
1089
1090
          // update the session to include subject info with a mapped identity
1091
          session.setSubjectInfo(subjectInfo);
1092
          boolean result = CNodeService.getInstance(request).isAuthorized(session, pid, Permission.READ);
1093
          assertTrue(result);
1094
1095
    } catch (Exception e) {
1096
        e.printStackTrace();
1097
1098
    }
1099
1100
  }
1101 7816 leinfelder
1102
/**
1103
   * Test object creation failure when there is a space in the identifier
1104
   */
1105
  public void testCreateInvalidIdentifier() {
1106
    printTestHeader("testCreateInvalidIdentifier");
1107
1108
    try {
1109
      Session session = getTestSession();
1110
      Identifier guid = new Identifier();
1111
      guid.setValue("testCreate withspace." + System.currentTimeMillis());
1112
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1113
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1114
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
1115
      fail("Should not be able to create with whitespace in indentifier");
1116
    } catch (InvalidRequest e) {
1117
    	// expect that this request fails
1118
        assertTrue(true);
1119
    } catch (Exception e) {
1120
      e.printStackTrace();
1121
      fail("Unexpected error: " + e.getMessage());
1122
    }
1123
1124
  }
1125 6354 cjones
1126 7850 leinfelder
	/**
1127
	 * Test getting a known object
1128
	 */
1129
	public void testGetPackage() {
1130
		printTestHeader("testGetPackage");
1131
1132
		try {
1133
			Session session = getTestSession();
1134
			Identifier guid = new Identifier();
1135
			guid.setValue("testGetPackage." + System.currentTimeMillis());
1136
			InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1137
			SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1138
			Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
1139 8810 leinfelder
			InputStream bagStream = MNodeService.getInstance(request).getPackage(session, null, pid);
1140 7853 leinfelder
			File bagFile = File.createTempFile("bagit.", ".zip");
1141 7850 leinfelder
			IOUtils.copy(bagStream, new FileOutputStream(bagFile));
1142
			BagFactory bagFactory = new BagFactory();
1143
			Bag bag = bagFactory.createBag(bagFile);
1144
			InputStream result = bag.getPayload().iterator().next().newInputStream();
1145
1146
			// go back to beginning of original stream
1147
			object.reset();
1148
			// check
1149
			assertTrue(object.available() > 0);
1150
			assertTrue(result.available() > 0);
1151
			assertTrue(IOUtils.contentEquals(result, object));
1152
1153
			// clean up
1154
			bagFile.delete();
1155
1156
		} catch (Exception e) {
1157
			e.printStackTrace();
1158
			fail("Unexpected error: " + e.getMessage());
1159
		}
1160
	}
1161 7853 leinfelder
1162
1163
	/**
1164
	 * Test getting a known object
1165
	 */
1166
	public void testGetOREPackage() {
1167
		printTestHeader("testGetOREPackage");
1168
1169
		try {
1170
1171
			// construct the ORE package
1172
			Identifier resourceMapId = new Identifier();
1173
			//resourceMapId.setValue("doi://1234/AA/map.1.1");
1174
			resourceMapId.setValue("testGetOREPackage." + System.currentTimeMillis());
1175
			Identifier metadataId = new Identifier();
1176
			metadataId.setValue("doi://1234/AA/meta.1." + + System.currentTimeMillis());
1177
			List<Identifier> dataIds = new ArrayList<Identifier>();
1178
			Identifier dataId = new Identifier();
1179
			dataId.setValue("doi://1234/AA/data.1." + System.currentTimeMillis());
1180
			Identifier dataId2 = new Identifier();
1181
			dataId2.setValue("doi://1234/AA/data.2." + System.currentTimeMillis());
1182
			dataIds.add(dataId);
1183
			dataIds.add(dataId2);
1184
			Map<Identifier, List<Identifier>> idMap = new HashMap<Identifier, List<Identifier>>();
1185
			idMap.put(metadataId, dataIds);
1186
			ResourceMapFactory rmf = ResourceMapFactory.getInstance();
1187
			ResourceMap resourceMap = rmf.createResourceMap(resourceMapId, idMap);
1188
			assertNotNull(resourceMap);
1189
			String rdfXml = ResourceMapFactory.getInstance().serializeResourceMap(resourceMap);
1190
			assertNotNull(rdfXml);
1191
1192
			Session session = getTestSession();
1193
			InputStream object = null;
1194
			SystemMetadata sysmeta = null;
1195
1196
			// save the data objects (data just contains their ID)
1197
			InputStream dataObject1 = new ByteArrayInputStream(dataId.getValue().getBytes("UTF-8"));
1198
			sysmeta = createSystemMetadata(dataId, session.getSubject(), dataObject1);
1199
			MNodeService.getInstance(request).create(session, dataId, dataObject1, sysmeta);
1200
			// second data file
1201
			InputStream dataObject2 = new ByteArrayInputStream(dataId2.getValue().getBytes("UTF-8"));
1202
			sysmeta = createSystemMetadata(dataId2, session.getSubject(), dataObject2);
1203
			MNodeService.getInstance(request).create(session, dataId2, dataObject2, sysmeta);
1204
			// metadata file
1205
			InputStream metadataObject = new ByteArrayInputStream(metadataId.getValue().getBytes("UTF-8"));
1206
			sysmeta = createSystemMetadata(metadataId, session.getSubject(), metadataObject);
1207
			MNodeService.getInstance(request).create(session, metadataId, metadataObject, sysmeta);
1208
1209
			// save the ORE object
1210
			object = new ByteArrayInputStream(rdfXml.getBytes("UTF-8"));
1211
			sysmeta = createSystemMetadata(resourceMapId, session.getSubject(), object);
1212
			sysmeta.setFormatId(ObjectFormatCache.getInstance().getFormat("http://www.openarchives.org/ore/terms").getFormatId());
1213
			Identifier pid = MNodeService.getInstance(request).create(session, resourceMapId, object, sysmeta);
1214
1215
			// get the package we uploaded
1216 8810 leinfelder
			InputStream bagStream = MNodeService.getInstance(request).getPackage(session, null, pid);
1217 7853 leinfelder
			File bagFile = File.createTempFile("bagit.", ".zip");
1218
			IOUtils.copy(bagStream, new FileOutputStream(bagFile));
1219
			BagFactory bagFactory = new BagFactory();
1220
			Bag bag = bagFactory.createBag(bagFile);
1221
			Iterator<Manifest> manifestIter = bag.getTagManifests().iterator();
1222
			while (manifestIter.hasNext()) {
1223
				String filepath = manifestIter.next().getFilepath();
1224
				BagFile entryFile = bag.getBagFile(filepath);
1225
				InputStream result = entryFile.newInputStream();
1226
				// check ORE
1227
				if (filepath.contains(resourceMapId.getValue())) {
1228
					object.reset();
1229
					assertTrue(object.available() > 0);
1230
					assertTrue(result.available() > 0);
1231
					assertTrue(IOUtils.contentEquals(result, object));
1232
				}
1233
				// check metadata
1234
				if (filepath.contains(metadataId.getValue())) {
1235
					metadataObject.reset();
1236
					assertTrue(metadataObject.available() > 0);
1237
					assertTrue(result.available() > 0);
1238
					assertTrue(IOUtils.contentEquals(result, metadataObject));
1239
				}
1240
				if (filepath.contains(dataId.getValue())) {
1241
					dataObject1.reset();
1242
					assertTrue(dataObject1.available() > 0);
1243
					assertTrue(result.available() > 0);
1244
					assertTrue(IOUtils.contentEquals(result, dataObject1));
1245
				}
1246
				if (filepath.contains(dataId2.getValue())) {
1247
					dataObject2.reset();
1248
					assertTrue(dataObject2.available() > 0);
1249
					assertTrue(result.available() > 0);
1250
					assertTrue(IOUtils.contentEquals(result, dataObject2));
1251
				}
1252
1253
1254
			}
1255
1256
			// clean up
1257
			bagFile.delete();
1258 8745 leinfelder
1259
			// test the ORE lookup
1260
			List<Identifier> oreIds = MNodeService.getInstance(request).lookupOreFor(metadataId, true);
1261
			assertTrue(oreIds.contains(resourceMapId));
1262 7853 leinfelder
1263
		} catch (Exception e) {
1264
			e.printStackTrace();
1265
			fail("Unexpected error: " + e.getMessage());
1266
		}
1267
	}
1268
1269 8906 tao
	/**
1270
     * Test the extra "delete information" was added to the NotFoundException
1271
     * if the object was delete in the following methods:
1272
     * MN.get
1273
     * MN.getSystemmetadata
1274
     * MN.describe
1275
     * MN.getChecksum
1276
     * MN.getRelica
1277
     */
1278
    public void testReadDeletedObject() {
1279
        printTestHeader("testDelete");
1280
1281
        try {
1282
          Session session = getTestSession();
1283
          Identifier guid = new Identifier();
1284
          guid.setValue("testDelete." + System.currentTimeMillis());
1285
          InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1286
          SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1287
          Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
1288
          Thread.sleep(3000);
1289
          // use MN admin to delete
1290
          session = getMNSession();
1291
          Identifier deletedPid = MNodeService.getInstance(request).delete(session, pid);
1292
          System.out.println("after deleting");
1293
          assertEquals(pid.getValue(), deletedPid.getValue());
1294
          // check that we cannot get the object
1295
          session = getTestSession();
1296
          InputStream deletedObject = null;
1297
          try {
1298
              //System.out.println("before read ===============");
1299
              deletedObject = MNodeService.getInstance(request).get(session, deletedPid);
1300
              //System.out.println("after read ===============");
1301
          } catch (NotFound nf) {
1302
              assertTrue(nf.getMessage().contains("deleted"));
1303
          }
1304
          try {
1305
              //System.out.println("before read ===============");
1306
              SystemMetadata sysmeta2 = MNodeService.getInstance(request).getSystemMetadata(session, deletedPid);
1307
              //System.out.println("after read ===============");
1308
          } catch (NotFound nf) {
1309
              //System.out.println("the exception is "+nf.getMessage());
1310
              assertTrue(nf.getMessage().contains("deleted"));
1311
          }
1312
1313
          try {
1314
              //System.out.println("before read ===============");
1315
              DescribeResponse describeResponse = MNodeService.getInstance(request).describe(session, pid);
1316
              //System.out.println("after read ===============");
1317
          } catch (NotFound nf) {
1318
              //System.out.println("the exception is "+nf.getMessage());
1319
              assertTrue(nf.getMessage().contains("deleted"));
1320
          }
1321
1322
          try {
1323
              //System.out.println("before read ===============");
1324
              Checksum checksum = MNodeService.getInstance(request).getChecksum(session, pid, "MD5");
1325
              //System.out.println("after read ===============");
1326
          } catch (NotFound nf) {
1327
              //System.out.println("the exception 3 is "+nf.getMessage());
1328
              assertTrue(nf.getMessage().contains("deleted"));
1329
          }
1330
1331
          try {
1332
              //System.out.println("before read ===============");
1333
              boolean isAuthorized =
1334
                      MNodeService.getInstance(request).isAuthorized(session, pid, Permission.READ);
1335
              //System.out.println("after read ===============");
1336
          } catch (NotFound nf) {
1337
              System.out.println("the exception 4 is "+nf.getMessage());
1338
              assertTrue(nf.getMessage().contains("deleted"));
1339
          }
1340
1341
          assertNull(deletedObject);
1342
1343
        } catch (UnsupportedEncodingException e) {
1344
          e.printStackTrace();
1345
1346
        } catch (Exception e) {
1347
          e.printStackTrace();
1348
          fail("Unexpected error: " + e.getMessage());
1349
1350
        }
1351
    }
1352 8952 tao
1353
    /**
1354
     * Test to create and update a metadata which xml declaration is ASCII, but actually
1355
     * has some special charaters. The saved document should has the same bytes as the origianl.
1356
     */
1357
    public void testCreateAndUpdateXMLWithUnmatchingEncoding() throws Exception {
1358
          String algorithm = "md5";
1359
          Session session = getTestSession();
1360
          Identifier guid = new Identifier();
1361
          guid.setValue("testCreateAndUpdate." + System.currentTimeMillis());
1362
          InputStream object = new ByteArrayInputStream(FileUtils.readFileToByteArray(new File(unmatchingEncodingFilePath)));
1363
          Checksum orgChecksum = ChecksumUtil.checksum(object, algorithm);
1364
          //System.out.println("the original checksum is "+orgChecksum.getValue());
1365
          SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1366
          Identifier pid =
1367
            MNodeService.getInstance(request).create(session, guid, object, sysmeta);
1368
          InputStream readResult = MNodeService.getInstance(request).get(session, pid);
1369
          byte[] readBytes = IOUtils.toByteArray(readResult);
1370
          Checksum checksum1 = ChecksumUtil.checksum(readBytes, algorithm);
1371
          //System.out.println("the read checksum1 is "+checksum1.getValue());
1372
          assertEquals(orgChecksum.getValue(), checksum1.getValue());
1373
1374
          Identifier newPid = new Identifier();
1375
          newPid.setValue("testCreateAndUpdate." + (System.currentTimeMillis() + 1)); // ensure it is different from original
1376
          SystemMetadata newSysMeta = createSystemMetadata(newPid, session.getSubject(), object);
1377
1378
          // do the update
1379
          Identifier updatedPid =
1380
            MNodeService.getInstance(request).update(session, pid, object, newPid, newSysMeta);
1381
          InputStream readResult2 = MNodeService.getInstance(request).get(session, updatedPid);
1382
          byte[] readBytes2 = IOUtils.toByteArray(readResult2);
1383
          Checksum checksum2 = ChecksumUtil.checksum(readBytes2, algorithm);
1384
          assertEquals(orgChecksum.getValue(), checksum2.getValue());
1385
          //System.out.println("the read checksum2 is "+checksum2.getValue());
1386
1387
1388
    }
1389 6354 cjones
1390 9034 tao
    /**
1391
     * Test the method - get api  for a speicified SID
1392
     */
1393
    public void testGetSID() {
1394
        String str1 = "object1";
1395
        String str2 = "object2";
1396
        String str3 = "object3";
1397
        try {
1398
            //insert test documents with a series id
1399
            Session session = getTestSession();
1400
            Identifier guid = new Identifier();
1401
            guid.setValue(generateDocumentId());
1402
            InputStream object1 = new ByteArrayInputStream(str1.getBytes("UTF-8"));
1403
            SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object1);
1404
            String sid1= "sid."+System.nanoTime();
1405
            Identifier seriesId = new Identifier();
1406
            seriesId.setValue(sid1);
1407
            System.out.println("the first sid is "+seriesId.getValue());
1408
            sysmeta.setSeriesId(seriesId);
1409
            MNodeService.getInstance(request).create(session, guid, object1, sysmeta);
1410
            System.out.println("the first pid is "+guid.getValue());
1411
            //test the get(pid) for v2
1412
            InputStream result = MNodeService.getInstance(request).get(session, guid);
1413
            // go back to beginning of original stream
1414
            object1.reset();
1415
            // check
1416
            assertTrue(object1.available() > 0);
1417
            assertTrue(result.available() > 0);
1418
            assertTrue(IOUtils.contentEquals(result, object1));
1419
            // test the get(id) for v2
1420
            InputStream result1 = MNodeService.getInstance(request).get(session, seriesId);
1421
            object1.reset();
1422
            // check
1423
            assertTrue(object1.available() > 0);
1424
            assertTrue(result1.available() > 0);
1425
            assertTrue(IOUtils.contentEquals(result1, object1));
1426
            //test the get(pid) for v1
1427
            InputStream result2 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, guid);
1428
            object1.reset();
1429
            // check
1430
            assertTrue(object1.available() > 0);
1431
            assertTrue(result2.available() > 0);
1432
            assertTrue(IOUtils.contentEquals(result2, object1));
1433
            //test the get(sid) for v1
1434
            try {
1435
                InputStream result3 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, seriesId);
1436
                fail("the get(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1437
            } catch (NotFound ee) {
1438
1439
            }
1440 9039 tao
            SystemMetadata metadata = MNodeService.getInstance(request).getSystemMetadata(session, seriesId);
1441
            assertTrue(metadata.getIdentifier().getValue().equals(guid.getValue()));
1442
            assertTrue(metadata.getSeriesId().getValue().equals(seriesId.getValue()));
1443
            DescribeResponse describeResponse = MNodeService.getInstance(request).describe(session, seriesId);
1444
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata.getChecksum().getValue());
1445
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata.getFormatId().getValue());
1446 9034 tao
1447 9039 tao
            metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid);
1448
            assertTrue(metadata.getIdentifier().getValue().equals(guid.getValue()));
1449
            assertTrue(metadata.getSeriesId().getValue().equals(seriesId.getValue()));
1450
            describeResponse = MNodeService.getInstance(request).describe(session, guid);
1451
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata.getChecksum().getValue());
1452
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata.getFormatId().getValue());
1453
1454
            org.dataone.service.types.v1.SystemMetadata sys1=edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).getSystemMetadata(session, guid);
1455
            assertTrue(metadata.getIdentifier().getValue().equals(guid.getValue()));
1456
1457
            try {
1458
                org.dataone.service.types.v1.SystemMetadata sys2=edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).getSystemMetadata(session, seriesId);
1459
                fail("the getSystemMetadata(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1460
            } catch(NotFound nf2) {
1461
1462
            }
1463
1464
            describeResponse = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).describe(session, guid);
1465
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), sys1.getChecksum().getValue());
1466
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), sys1.getFormatId().getValue());
1467
            try {
1468
                describeResponse = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).describe(session, seriesId);
1469
                fail("the describe(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1470
            } catch(NotFound nf2) {
1471
1472
            }
1473
1474 9034 tao
            //do a update with the same series id
1475 9035 tao
            Thread.sleep(1000);
1476 9034 tao
            Identifier newPid = new Identifier();
1477
            newPid.setValue(generateDocumentId()+"1");
1478
            System.out.println("the second pid is "+newPid.getValue());
1479 9035 tao
            InputStream object2 = new ByteArrayInputStream(str2.getBytes("UTF-8"));
1480
            SystemMetadata newSysMeta = createSystemMetadata(newPid, session.getSubject(), object2);
1481 9034 tao
            newSysMeta.setObsoletes(guid);
1482
            newSysMeta.setSeriesId(seriesId);
1483 9035 tao
            MNodeService.getInstance(request).update(session, guid, object2, newPid, newSysMeta);
1484
1485
            InputStream result4 = MNodeService.getInstance(request).get(session, guid);
1486
            // go back to beginning of original stream
1487
            object1.reset();
1488
            // check
1489
            assertTrue(object1.available() > 0);
1490
            assertTrue(result4.available() > 0);
1491
            assertTrue(IOUtils.contentEquals(result4, object1));
1492 9034 tao
1493 9035 tao
            InputStream result5 = MNodeService.getInstance(request).get(session, newPid);
1494
            // go back to beginning of original stream
1495
            object2.reset();
1496
            // check
1497
            assertTrue(object2.available() > 0);
1498
            assertTrue(result5.available() > 0);
1499
            assertTrue(IOUtils.contentEquals(result5, object2));
1500
1501
1502
            InputStream result6 = MNodeService.getInstance(request).get(session, seriesId);
1503
            object2.reset();
1504
            // check
1505
            assertTrue(object2.available() > 0);
1506
            assertTrue(result6.available() > 0);
1507
            assertTrue(IOUtils.contentEquals(result6, object2));
1508
            //test the get(pid) for v1
1509
            InputStream result7 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, guid);
1510
            object1.reset();
1511
            // check
1512
            assertTrue(object1.available() > 0);
1513
            assertTrue(result7.available() > 0);
1514
            assertTrue(IOUtils.contentEquals(result7, object1));
1515
1516
            InputStream result8 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, newPid);
1517
            object2.reset();
1518
            // check
1519
            assertTrue(object2.available() > 0);
1520
            assertTrue(result8.available() > 0);
1521
            assertTrue(IOUtils.contentEquals(result8, object2));
1522
            //test the get(sid) for v1
1523
            try {
1524
                InputStream result3 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, seriesId);
1525
                fail("the get(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1526
            } catch (NotFound ee) {
1527
1528
            }
1529
1530 9039 tao
            SystemMetadata metadata1 = MNodeService.getInstance(request).getSystemMetadata(session, seriesId);
1531
            assertTrue(metadata1.getIdentifier().getValue().equals(newPid.getValue()));
1532
            assertTrue(metadata1.getSeriesId().getValue().equals(seriesId.getValue()));
1533
            describeResponse = MNodeService.getInstance(request).describe(session, seriesId);
1534
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata1.getChecksum().getValue());
1535
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata1.getFormatId().getValue());
1536
1537
            SystemMetadata metadata2 = MNodeService.getInstance(request).getSystemMetadata(session, guid);
1538
            assertTrue(metadata2.getIdentifier().getValue().equals(guid.getValue()));
1539
            assertTrue(metadata2.getSeriesId().getValue().equals(seriesId.getValue()));
1540
            describeResponse = MNodeService.getInstance(request).describe(session, guid);
1541
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata2.getChecksum().getValue());
1542
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata2.getFormatId().getValue());
1543
1544
            SystemMetadata metadata3 = MNodeService.getInstance(request).getSystemMetadata(session, newPid);
1545
            assertTrue(metadata3.getIdentifier().getValue().equals(newPid.getValue()));
1546
            assertTrue(metadata3.getSeriesId().getValue().equals(seriesId.getValue()));
1547
            describeResponse = MNodeService.getInstance(request).describe(session, newPid);
1548
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata3.getChecksum().getValue());
1549
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata3.getFormatId().getValue());
1550
1551 9034 tao
            //do another update with different series id
1552
            Thread.sleep(1000);
1553
            String sid2 = "sid."+System.nanoTime();
1554
            Identifier seriesId2= new Identifier();
1555
            seriesId2.setValue(sid2);
1556
            System.out.println("the second sid is "+seriesId2.getValue());
1557
            Identifier newPid2 = new Identifier();
1558
            newPid2.setValue(generateDocumentId()+"2");
1559
            System.out.println("the third pid is "+newPid2.getValue());
1560 9035 tao
            InputStream object3 = new ByteArrayInputStream(str3.getBytes("UTF-8"));
1561
            SystemMetadata sysmeta3 = createSystemMetadata(newPid2, session.getSubject(), object3);
1562 9034 tao
            sysmeta3.setObsoletes(newPid);
1563
            sysmeta3.setSeriesId(seriesId2);
1564 9035 tao
            MNodeService.getInstance(request).update(session, newPid, object3, newPid2, sysmeta3);
1565 9034 tao
1566 9035 tao
            InputStream result9 = MNodeService.getInstance(request).get(session, guid);
1567
            // go back to beginning of original stream
1568
            object1.reset();
1569
            // check
1570
            assertTrue(object1.available() > 0);
1571
            assertTrue(result9.available() > 0);
1572
            assertTrue(IOUtils.contentEquals(result9, object1));
1573 9034 tao
1574 9035 tao
            InputStream result10 = MNodeService.getInstance(request).get(session, newPid);
1575
            // go back to beginning of original stream
1576
            object2.reset();
1577
            // check
1578
            assertTrue(object2.available() > 0);
1579
            assertTrue(result10.available() > 0);
1580
            assertTrue(IOUtils.contentEquals(result10, object2));
1581 9034 tao
1582
1583 9035 tao
            InputStream result11 = MNodeService.getInstance(request).get(session, newPid2);
1584
            // go back to beginning of original stream
1585
            object3.reset();
1586
            // check
1587
            assertTrue(object3.available() > 0);
1588
            assertTrue(result11.available() > 0);
1589
            assertTrue(IOUtils.contentEquals(result11, object3));
1590
1591
            InputStream result12 = MNodeService.getInstance(request).get(session, seriesId2);
1592
            object3.reset();
1593
            // check
1594
            assertTrue(object3.available() > 0);
1595
            assertTrue(result12.available() > 0);
1596
            assertTrue(IOUtils.contentEquals(result12, object3));
1597
1598
            InputStream result16 = MNodeService.getInstance(request).get(session, seriesId);
1599
            object2.reset();
1600
            // check
1601
            assertTrue(object2.available() > 0);
1602
            assertTrue(result16.available() > 0);
1603
            assertTrue(IOUtils.contentEquals(result16, object2));
1604
1605
            //test the get(pid) for v1
1606
            InputStream result13 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, guid);
1607
            object1.reset();
1608
            // check
1609
            assertTrue(object1.available() > 0);
1610
            assertTrue(result13.available() > 0);
1611
            assertTrue(IOUtils.contentEquals(result13, object1));
1612
1613
            InputStream result14 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, newPid);
1614
            object2.reset();
1615
            // check
1616
            assertTrue(object2.available() > 0);
1617
            assertTrue(result14.available() > 0);
1618
            assertTrue(IOUtils.contentEquals(result14, object2));
1619
1620
            InputStream result15 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, newPid2);
1621
            object3.reset();
1622
            // check
1623
            assertTrue(object3.available() > 0);
1624
            assertTrue(result15.available() > 0);
1625
            assertTrue(IOUtils.contentEquals(result15, object3));
1626
1627 9039 tao
            SystemMetadata metadata4 = MNodeService.getInstance(request).getSystemMetadata(session, seriesId);
1628
            assertTrue(metadata4.getIdentifier().getValue().equals(newPid.getValue()));
1629
            assertTrue(metadata4.getSeriesId().getValue().equals(seriesId.getValue()));
1630
            describeResponse = MNodeService.getInstance(request).describe(session, seriesId);
1631
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata4.getChecksum().getValue());
1632
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata4.getFormatId().getValue());
1633 9035 tao
1634 9039 tao
            SystemMetadata metadata5 = MNodeService.getInstance(request).getSystemMetadata(session, seriesId2);
1635
            assertTrue(metadata5.getIdentifier().getValue().equals(newPid2.getValue()));
1636
            assertTrue(metadata5.getSeriesId().getValue().equals(seriesId2.getValue()));
1637
            describeResponse = MNodeService.getInstance(request).describe(session, seriesId2);
1638
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata5.getChecksum().getValue());
1639
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata5.getFormatId().getValue());
1640
1641
            SystemMetadata metadata6 = MNodeService.getInstance(request).getSystemMetadata(session, guid);
1642
            assertTrue(metadata6.getIdentifier().getValue().equals(guid.getValue()));
1643
            assertTrue(metadata6.getSeriesId().getValue().equals(seriesId.getValue()));
1644
            describeResponse = MNodeService.getInstance(request).describe(session, guid);
1645
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata6.getChecksum().getValue());
1646
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata6.getFormatId().getValue());
1647
1648
            SystemMetadata metadata7 = MNodeService.getInstance(request).getSystemMetadata(session, newPid);
1649
            assertTrue(metadata7.getIdentifier().getValue().equals(newPid.getValue()));
1650
            assertTrue(metadata7.getSeriesId().getValue().equals(seriesId.getValue()));
1651
            describeResponse = MNodeService.getInstance(request).describe(session, newPid);
1652
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata7.getChecksum().getValue());
1653
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata7.getFormatId().getValue());
1654
1655
            SystemMetadata metadata8 = MNodeService.getInstance(request).getSystemMetadata(session, newPid2);
1656
            assertTrue(metadata8.getIdentifier().getValue().equals(newPid2.getValue()));
1657
            assertTrue(metadata8.getSeriesId().getValue().equals(seriesId2.getValue()));
1658
            describeResponse = MNodeService.getInstance(request).describe(session, newPid2);
1659
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata8.getChecksum().getValue());
1660
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata8.getFormatId().getValue());
1661
1662
1663
1664
1665 9035 tao
            //test the get(sid) for v1
1666
            try {
1667
                InputStream result3 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, seriesId);
1668
                fail("the get(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1669
            } catch (NotFound ee) {
1670
1671
            }
1672
1673
            //test the get(sid) for v1
1674
            try {
1675
                InputStream result3 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, seriesId2);
1676
                fail("the get(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1677
            } catch (NotFound ee) {
1678
1679
            }
1680
1681
            //test to get non-existing id for v2
1682
            try {
1683
             // the pid should be null when we try to get a no-exist sid
1684
                Identifier non_exist_sid = new Identifier();
1685
                non_exist_sid.setValue("no-sid-exist-123qwe");
1686
                InputStream result3 = MNodeService.getInstance(request).get(session, non_exist_sid);
1687
                fail("the get(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1688
            } catch (NotFound ee) {
1689
1690
            }
1691 9039 tao
1692
            try {
1693
                // the pid should be null when we try to get a no-exist sid
1694
                   Identifier non_exist_sid = new Identifier();
1695
                   non_exist_sid.setValue("no-sid-exist-123qwe");
1696
                   SystemMetadata result3 = MNodeService.getInstance(request).getSystemMetadata(session, non_exist_sid);
1697
                   fail("the getSystemMetadata(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1698
            } catch (NotFound ee) {
1699
1700
            }
1701
1702
            try {
1703
                // the pid should be null when we try to get a no-exist sid
1704
                   Identifier non_exist_sid = new Identifier();
1705
                   non_exist_sid.setValue("no-sid-exist-123qwe");
1706
                    MNodeService.getInstance(request).describe(session, non_exist_sid);
1707
                   fail("the describe(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1708
               } catch (NotFound ee) {
1709
1710
               }
1711 9035 tao
1712
1713 9034 tao
        } catch (Exception e) {
1714
            fail(e.getMessage());
1715
        }
1716
1717
    }
1718 6309 cjones
}