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 9049 tao
345
      Thread.sleep(1000);
346
      try {
347
          Identifier guid2 = new Identifier();
348
          guid2.setValue("testCreate." + System.currentTimeMillis());
349
          SystemMetadata sysmeta2 = createSystemMetadata(guid2, session.getSubject(), object);
350
          sysmeta2.setSeriesId(guid);
351
          MNodeService.getInstance(request).create(session, guid2, object, sysmeta2);
352
          fail("It should fail since the system metadata using an existing id as the sid");
353
      } catch (InvalidSystemMetadata ee) {
354
355
      }
356
357
      Thread.sleep(1000);
358
      try {
359
          Identifier guid3 = new Identifier();
360
          guid3.setValue("testCreate." + System.currentTimeMillis());
361
          SystemMetadata sysmeta3 = createSystemMetadata(guid3, session.getSubject(), object);
362
          sysmeta3.setSeriesId(guid3);
363
          MNodeService.getInstance(request).create(session, guid3, object, sysmeta3);
364
          fail("It should fail since the system metadata using the pid as the sid");
365
      } catch (InvalidSystemMetadata ee) {
366
367
      }
368 6309 cjones
    } catch (UnsupportedEncodingException e) {
369 6354 cjones
      e.printStackTrace();
370
      fail("Unexpected error: " + e.getMessage());
371 6309 cjones
372
    } catch (InvalidToken e) {
373 6354 cjones
      e.printStackTrace();
374
      fail("Unexpected error: " + e.getMessage());
375 6309 cjones
376
    } catch (ServiceFailure e) {
377 6354 cjones
      e.printStackTrace();
378
      fail("Unexpected error: " + e.getMessage());
379 6309 cjones
380
    } catch (NotAuthorized e) {
381 6354 cjones
      e.printStackTrace();
382
      fail("Unexpected error: " + e.getMessage());
383 6309 cjones
384
    } catch (IdentifierNotUnique e) {
385 6354 cjones
      e.printStackTrace();
386
      fail("Unexpected error: " + e.getMessage());
387 6309 cjones
388
    } catch (UnsupportedType e) {
389 6354 cjones
      e.printStackTrace();
390
      fail("Unexpected error: " + e.getMessage());
391 6309 cjones
392
    } catch (InsufficientResources e) {
393 6354 cjones
      e.printStackTrace();
394
      fail("Unexpected error: " + e.getMessage());
395 6309 cjones
396
    } catch (InvalidSystemMetadata e) {
397 6354 cjones
      e.printStackTrace();
398
      fail("Unexpected error: " + e.getMessage());
399 6309 cjones
400
    } catch (NotImplemented e) {
401 6354 cjones
      e.printStackTrace();
402
      fail("Unexpected error: " + e.getMessage());
403 6309 cjones
404
    } catch (InvalidRequest e) {
405 6354 cjones
      e.printStackTrace();
406
      fail("Unexpected error: " + e.getMessage());
407 6309 cjones
408
    } catch (Exception e) {
409 6354 cjones
      e.printStackTrace();
410
      fail("Unexpected error: " + e.getMessage());
411 6309 cjones
412
    }
413
414
  }
415
416 6354 cjones
  /**
417
   * test object deletion
418
   */
419
  public void testDelete() {
420 6309 cjones
    printTestHeader("testDelete");
421
422 6354 cjones
    try {
423
      Session session = getTestSession();
424
      Identifier guid = new Identifier();
425
      guid.setValue("testDelete." + System.currentTimeMillis());
426
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
427
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
428 6542 leinfelder
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
429 7163 leinfelder
430
      // use MN admin to delete
431
      session = getMNSession();
432 6542 leinfelder
      Identifier deletedPid = MNodeService.getInstance(request).delete(session, pid);
433 6333 leinfelder
      assertEquals(pid.getValue(), deletedPid.getValue());
434 7160 leinfelder
      // check that we cannot get the object
435 7163 leinfelder
      session = getTestSession();
436 7160 leinfelder
      InputStream deletedObject = null;
437
      try {
438 7163 leinfelder
    	  deletedObject = MNodeService.getInstance(request).get(session, deletedPid);
439 7160 leinfelder
      } catch (NotFound nf) {
440
    	  // this is expected
441
      }
442
	  assertNull(deletedObject);
443 6309 cjones
444 6354 cjones
    } catch (UnsupportedEncodingException e) {
445
      e.printStackTrace();
446
447 6324 leinfelder
    } catch (Exception e) {
448 6354 cjones
      e.printStackTrace();
449
      fail("Unexpected error: " + e.getMessage());
450 6309 cjones
451 6324 leinfelder
    }
452 6309 cjones
453 6354 cjones
  }
454 6309 cjones
455 6354 cjones
  /**
456
   * Test object updating
457
   */
458
  public void testUpdate() {
459 6309 cjones
    printTestHeader("testUpdate");
460
461 6354 cjones
    try {
462
      Session session = getTestSession();
463
      Identifier guid = new Identifier();
464
      guid.setValue("testUpdate." + System.currentTimeMillis());
465
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
466
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
467
      Identifier newPid = new Identifier();
468 6596 leinfelder
      newPid.setValue("testUpdate." + (System.currentTimeMillis() + 1)); // ensure it is different from original
469 6354 cjones
      Identifier pid =
470 6542 leinfelder
        MNodeService.getInstance(request).create(session, guid, object, sysmeta);
471 6338 cjones
472 6354 cjones
      SystemMetadata newSysMeta = createSystemMetadata(newPid, session.getSubject(), object);
473
474
      // do the update
475
      Identifier updatedPid =
476 6542 leinfelder
        MNodeService.getInstance(request).update(session, pid, object, newPid, newSysMeta);
477 6338 cjones
478 6354 cjones
      // get the updated system metadata
479 6338 cjones
      SystemMetadata updatedSysMeta =
480 6542 leinfelder
        MNodeService.getInstance(request).getSystemMetadata(session, updatedPid);
481 6338 cjones
482 6354 cjones
      assertEquals(updatedPid.getValue(), newPid.getValue());
483 6366 leinfelder
//      assertTrue(updatedSysMeta.getObsolete(0).getValue().equals(pid.getValue()));
484
//      assertTrue(updatedSysMeta.getDerivedFrom(0).getValue().equals(pid.getValue()));
485 6354 cjones
486 6309 cjones
    } catch (UnsupportedEncodingException e) {
487 6354 cjones
      e.printStackTrace();
488
      fail("Unexpected error: " + e.getMessage());
489 6309 cjones
490
    } catch (InvalidToken e) {
491 6354 cjones
      e.printStackTrace();
492
      fail("Unexpected error: " + e.getMessage());
493 6309 cjones
494
    } catch (ServiceFailure e) {
495 6354 cjones
      e.printStackTrace();
496
      fail("Unexpected error: " + e.getMessage());
497 6309 cjones
498
    } catch (NotAuthorized e) {
499 6354 cjones
      e.printStackTrace();
500
      fail("Unexpected error: " + e.getMessage());
501 6309 cjones
502
    } catch (IdentifierNotUnique e) {
503 6354 cjones
      e.printStackTrace();
504
      fail("Unexpected error: " + e.getMessage());
505 6309 cjones
506
    } catch (UnsupportedType e) {
507 6354 cjones
      e.printStackTrace();
508
      fail("Unexpected error: " + e.getMessage());
509 6309 cjones
510
    } catch (InsufficientResources e) {
511 6354 cjones
      e.printStackTrace();
512
      fail("Unexpected error: " + e.getMessage());
513 6309 cjones
514
    } catch (InvalidSystemMetadata e) {
515 6354 cjones
      e.printStackTrace();
516
      fail("Unexpected error: " + e.getMessage());
517 6309 cjones
518
    } catch (NotImplemented e) {
519 6354 cjones
      e.printStackTrace();
520
      fail("Unexpected error: " + e.getMessage());
521 6309 cjones
522
    } catch (InvalidRequest e) {
523 6354 cjones
      e.printStackTrace();
524
      fail("Unexpected error: " + e.getMessage());
525 6309 cjones
526
    } catch (Exception e) {
527 6354 cjones
      e.printStackTrace();
528
      fail("Unexpected error: " + e.getMessage());
529 6309 cjones
530
    }
531 6354 cjones
  }
532 6309 cjones
533 6354 cjones
  /**
534
   * We currently expect this unit test to fail because it should rely on a different member node
535
   * to retrieve the object from. Currently it gets the object from itself and throws
536
   * and expected error for duplicate entry.
537
   *
538
   */
539
  public void testReplicate() {
540
      printTestHeader("testReplicate");
541
      try {
542
        Session session = getTestSession();
543
        Identifier guid = new Identifier();
544
        guid.setValue("testReplicate." + System.currentTimeMillis());
545
        InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
546
        SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
547
        // save locally
548 6542 leinfelder
        Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
549 6354 cjones
        // get our node reference (attempting to replicate with self)
550 6542 leinfelder
        NodeReference sourceNode = MNodeService.getInstance(request).getCapabilities().getIdentifier();
551 6354 cjones
        // attempt to replicate with ourselves -- this should fail!
552
      boolean result = false;
553
      try {
554 6542 leinfelder
        result = MNodeService.getInstance(request).replicate(session, sysmeta, sourceNode);
555 6354 cjones
      } catch (Exception inu) {
556
        // we are expecting this to fail since we already have the doc
557
        result = true;
558
      }
559
      assertTrue(result);
560
      } catch (Exception e) {
561
        e.printStackTrace();
562
      fail("Probably not yet implemented: " + e.getMessage());
563
    }
564
  }
565 6309 cjones
566 6354 cjones
  /**
567
   * Test describing an object
568
   */
569
  public void testDescribe() {
570 6314 cjones
    printTestHeader("testDescribe");
571 6309 cjones
572
    try {
573 6354 cjones
      Session session = getTestSession();
574
      Identifier guid = new Identifier();
575
      guid.setValue("testGetSystemMetadata." + System.currentTimeMillis());
576
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
577
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
578 6542 leinfelder
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
579
      DescribeResponse describeResponse = MNodeService.getInstance(request).describe(session, pid);
580 6354 cjones
      assertEquals(describeResponse.getDataONE_Checksum().getValue(), sysmeta.getChecksum().getValue());
581 6597 leinfelder
      assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), sysmeta.getFormatId().getValue());
582 6354 cjones
583 6309 cjones
    } catch (UnsupportedEncodingException e) {
584 6354 cjones
      e.printStackTrace();
585
      fail("Unexpected error: " + e.getMessage());
586 6309 cjones
587
    } catch (InvalidToken e) {
588 6354 cjones
      e.printStackTrace();
589
      fail("Unexpected error: " + e.getMessage());
590 6309 cjones
591
    } catch (ServiceFailure e) {
592 6354 cjones
      e.printStackTrace();
593
      fail("Unexpected error: " + e.getMessage());
594 6309 cjones
595
    } catch (NotAuthorized e) {
596 6354 cjones
      e.printStackTrace();
597
      fail("Unexpected error: " + e.getMessage());
598 6309 cjones
599
    } catch (IdentifierNotUnique e) {
600 6354 cjones
      e.printStackTrace();
601
      fail("Unexpected error: " + e.getMessage());
602
603 6309 cjones
    } catch (UnsupportedType e) {
604 6354 cjones
      e.printStackTrace();
605
      fail("Unexpected error: " + e.getMessage());
606 6309 cjones
607
    } catch (InsufficientResources e) {
608 6354 cjones
      e.printStackTrace();
609
      fail("Unexpected error: " + e.getMessage());
610 6309 cjones
611
    } catch (InvalidSystemMetadata e) {
612 6354 cjones
      e.printStackTrace();
613
      fail("Unexpected error: " + e.getMessage());
614 6309 cjones
615
    } catch (NotImplemented e) {
616 6354 cjones
      e.printStackTrace();
617
      fail("Unexpected error: " + e.getMessage());
618 6309 cjones
619
    } catch (InvalidRequest e) {
620 6354 cjones
      e.printStackTrace();
621
      fail("Unexpected error: " + e.getMessage());
622 6309 cjones
623
    } catch (NotFound e) {
624 6354 cjones
      e.printStackTrace();
625
      fail("Unexpected error: " + e.getMessage());
626 6309 cjones
627
    } catch (Exception e) {
628 6354 cjones
      e.printStackTrace();
629
      fail("Unexpected error: " + e.getMessage());
630 6309 cjones
631
    }
632 6354 cjones
  }
633 6309 cjones
634 6354 cjones
  /**
635
   * Test getting the checksum of an object
636
   */
637
  public void testGetChecksum() {
638 6309 cjones
    printTestHeader("testGetChecksum");
639
640 6354 cjones
    try {
641
      Session session = getTestSession();
642
      Identifier guid = new Identifier();
643
      guid.setValue("testGetChecksum." + System.currentTimeMillis());
644
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
645
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
646 6542 leinfelder
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
647
      Checksum checksum = MNodeService.getInstance(request).getChecksum(session, pid, "MD5");
648 6354 cjones
      assertEquals(checksum.getValue(), sysmeta.getChecksum().getValue());
649 6309 cjones
650 6354 cjones
    } catch (UnsupportedEncodingException e) {
651
      e.printStackTrace();
652
      fail("Unexpected error: " + e.getMessage());
653 6309 cjones
654
    } catch (InvalidToken e) {
655 6354 cjones
      e.printStackTrace();
656
      fail("Unexpected error: " + e.getMessage());
657 6309 cjones
658
    } catch (ServiceFailure e) {
659 6354 cjones
      e.printStackTrace();
660
      fail("Unexpected error: " + e.getMessage());
661 6309 cjones
662
    } catch (NotAuthorized e) {
663 6354 cjones
      e.printStackTrace();
664
      fail("Unexpected error: " + e.getMessage());
665 6309 cjones
666
    } catch (IdentifierNotUnique e) {
667 6354 cjones
      e.printStackTrace();
668
      fail("Unexpected error: " + e.getMessage());
669 6309 cjones
670
    } catch (UnsupportedType e) {
671 6354 cjones
      e.printStackTrace();
672
      fail("Unexpected error: " + e.getMessage());
673 6309 cjones
674
    } catch (InsufficientResources e) {
675 6354 cjones
      e.printStackTrace();
676
      fail("Unexpected error: " + e.getMessage());
677 6309 cjones
678
    } catch (InvalidSystemMetadata e) {
679 6354 cjones
      e.printStackTrace();
680
      fail("Unexpected error: " + e.getMessage());
681 6309 cjones
682
    } catch (NotImplemented e) {
683 6354 cjones
      e.printStackTrace();
684
      fail("Unexpected error: " + e.getMessage());
685 6309 cjones
686
    } catch (InvalidRequest e) {
687 6354 cjones
      e.printStackTrace();
688
      fail("Unexpected error: " + e.getMessage());
689 6309 cjones
690
    } catch (NotFound e) {
691 6354 cjones
      e.printStackTrace();
692
      fail("Unexpected error: " + e.getMessage());
693 6309 cjones
694
    } catch (Exception e) {
695 6354 cjones
      e.printStackTrace();
696
      fail("Unexpected error: " + e.getMessage());
697 6309 cjones
698
    }
699 6354 cjones
700
  }
701 6309 cjones
702 6354 cjones
  /**
703
   * Testing listing objects on the Member Node
704
   */
705
  public void testListObjects() {
706
      printTestHeader("testListObjects");
707
708
      try {
709
710
        Session session = getTestSession();
711
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
712
        Date startTime = sdf.parse("2010-01-01");
713
        Date endTime = new Date();
714
        ObjectFormatIdentifier objectFormatId = null;
715
        boolean replicaStatus = false;
716
        int start = 0;
717
        int count = 1;
718
719
        // insert at least one object
720
        testCreate();
721
        // now check that we have at least one
722
        ObjectList objectList =
723 6542 leinfelder
          MNodeService.getInstance(request).listObjects(session, startTime, endTime,
724 8810 leinfelder
              objectFormatId, null, replicaStatus, start, count);
725 6354 cjones
        assertNotNull(objectList);
726
        assertTrue(objectList.getCount() == count);
727
        assertTrue(objectList.getStart() == 0);
728
        assertTrue(objectList.getTotal() > 1);
729
730
      } catch (Exception e) {
731
        e.printStackTrace();
732
        fail("Unexpected error: " + e.getMessage());
733
734
      }
735
  }
736 6309 cjones
737 6354 cjones
  public void testGetCapabilities() {
738
      printTestHeader("testGetCapabilities");
739
    try {
740 6542 leinfelder
      Node node = MNodeService.getInstance(request).getCapabilities();
741 6942 cjones
      ByteArrayOutputStream baos = new ByteArrayOutputStream();
742
      TypeMarshaller.marshalTypeToOutputStream(node, baos);
743 6354 cjones
      assertNotNull(node);
744
      // TODO: should probably test other parts of the node information
745 6942 cjones
746
    } catch (JiBXException e) {
747
        e.printStackTrace();
748
        fail("The node instance couldn't be parsed correctly:" + e.getMessage());
749
750
    } catch (IOException e) {
751
        e.printStackTrace();
752
        fail("The node instance couldn't be read correctly:" + e.getMessage());
753
754 6354 cjones
    } catch (Exception e) {
755 6942 cjones
        e.printStackTrace();
756
        fail("Probably not yet implemented: " + e.getMessage());
757
758 6354 cjones
    }
759
760
  }
761 6309 cjones
762 6354 cjones
  public void testPing() {
763 6309 cjones
764 6354 cjones
    try {
765 6804 leinfelder
      Date mnDate = MNodeService.getInstance(request).ping();
766
      assertTrue(mnDate != null);
767 6354 cjones
768 6309 cjones
    } catch (NotImplemented e) {
769 6354 cjones
      e.printStackTrace();
770
      fail("Unexpected error: " + e.getMessage());
771 6309 cjones
772
    } catch (ServiceFailure e) {
773 6354 cjones
      e.printStackTrace();
774
      fail("Unexpected error: " + e.getMessage());
775 6309 cjones
776 6612 leinfelder
    }  catch (InsufficientResources e) {
777 6354 cjones
      e.printStackTrace();
778
      fail("Unexpected error: " + e.getMessage());
779 6309 cjones
780
    }
781 6354 cjones
782
  }
783 6309 cjones
784 6354 cjones
  public void testSynchronizationFailed() {
785
    printTestHeader("testSynchronizationFailed");
786
    try {
787
        Session session = getTestSession();
788
789
        // create the object
790
        Identifier pid = new Identifier();
791
        pid.setValue("testSynchronizationFailed." + System.currentTimeMillis());
792
        InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
793
        SystemMetadata sysmeta = createSystemMetadata(pid, session.getSubject(), object);
794 6542 leinfelder
        Identifier retPid = MNodeService.getInstance(request).create(session, pid, object, sysmeta);
795 6354 cjones
        assertEquals(retPid.getValue(), pid.getValue());
796
797 7163 leinfelder
        // pretend the sync failed, act as CN
798 6354 cjones
      SynchronizationFailed syncFailed =
799
        new SynchronizationFailed("0000", "Testing Synch Failure");
800 6366 leinfelder
      syncFailed.setPid(pid.getValue());
801 7163 leinfelder
      session = getCNSession();
802 6542 leinfelder
      MNodeService.getInstance(request).synchronizationFailed(session, syncFailed );
803 6354 cjones
    } catch (Exception e) {
804
      e.printStackTrace();
805
        fail("Unexpected error: " + e.getMessage());
806
    }
807 6333 leinfelder
808 6354 cjones
  }
809 6309 cjones
810 6605 cjones
  public void testSystemMetadataChanged() {
811
      printTestHeader("testSystemMetadataChanged");
812
      try {
813
          Session session = getTestSession();
814
815
          // create the object
816
          Identifier pid = new Identifier();
817
          pid.setValue("testSystemMetadataChanged." + System.currentTimeMillis());
818 9052 tao
          Identifier sid = new Identifier();
819
          sid.setValue("testSystemMetadataChangedSid."+System.currentTimeMillis());
820 6605 cjones
          InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
821
          SystemMetadata sysmeta = createSystemMetadata(pid, session.getSubject(), object);
822 9052 tao
          sysmeta.setSeriesId(sid);
823 6605 cjones
          Identifier retPid = MNodeService.getInstance(request).create(session, pid, object, sysmeta);
824
          assertEquals(retPid.getValue(), pid.getValue());
825
826
          // pretend the system metadata changed on the CN
827
          MNodeService.getInstance(request).systemMetadataChanged(session,
828
                  retPid, 5000L, Calendar.getInstance().getTime());
829 9052 tao
          MNodeService.getInstance(request).systemMetadataChanged(session,
830
                  sid, 5000L, Calendar.getInstance().getTime());
831
          edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).systemMetadataChanged(session,
832
                  retPid, 5000L, Calendar.getInstance().getTime());
833
          edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).systemMetadataChanged(session,
834
                  sid, 5000L, Calendar.getInstance().getTime());
835 6605 cjones
836
      } catch (Exception e) {
837
          if (e instanceof NotAuthorized) {
838
              // only CN subjects can call this
839
              // TODO: use a CN certificate in the tests
840
          } else {
841
              fail("Unexpected error: " + e.getMessage());
842
843
          }
844
      }
845
846
    }
847
848 6354 cjones
  public void testGetLogRecords() {
849 6312 cjones
    printTestHeader("testLogRecords");
850 6309 cjones
851 6698 leinfelder
    try {
852
	    Log log = null;
853 7261 leinfelder
	    Session session = getCNSession();
854 6698 leinfelder
	    Date fromDate = new Date();
855
	    Calendar calendar = Calendar.getInstance();
856
	    calendar.setTime(fromDate);
857
	    calendar.roll(Calendar.YEAR, false);
858
	    fromDate = calendar.getTime();
859
	    Date toDate = new Date();
860
	    Event event = Event.CREATE;
861
	    int start = 0;
862
	    int count = 1;
863 6309 cjones
864 6542 leinfelder
      log = MNodeService.getInstance(request).getLogRecords(session, fromDate, toDate,
865 8810 leinfelder
        event.xmlValue(), null, start, count);
866 6354 cjones
867
      assertNotNull(log);
868
      assertTrue(log.getCount() == count);
869
      assertTrue(log.getStart() == start);
870
      assertTrue(log.getTotal() >= 1);
871
872 6698 leinfelder
    } catch (Exception e) {
873 6354 cjones
      e.printStackTrace();
874
      fail("Unexpected error: " + e.getMessage());
875 6309 cjones
876
    }
877 6354 cjones
  }
878 6309 cjones
879 6354 cjones
  /**
880
   * Testing setting access on a known object
881
   */
882
  public void testSetAccessPolicy() {
883 6309 cjones
    printTestHeader("testSetAccess");
884
885 6577 cjones
    //boolean accessWasSet = false;
886
    //
887
    //try {
888
    //  // create an object to set access on
889
    //  Session session = getTestSession();
890
    //  Identifier guid = new Identifier();
891
    //  guid.setValue("testSetAccess." + System.currentTimeMillis());
892
    //  InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
893
    //  SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
894
    //  Identifier pid =
895
    //    MNodeService.getInstance(request).create(session, guid, object, sysmeta);
896
    //  // set the access
897
    //  AccessPolicy accessPolicy = new AccessPolicy();
898
    //  AccessRule allow = new AccessRule();
899
    //  allow.addPermission(Permission.WRITE);
900
    //  Subject publicSubject = new Subject();
901
    //  publicSubject.setValue(Constants.SUBJECT_PUBLIC);
902
    //  allow.addSubject(publicSubject);
903
    //  accessPolicy.addAllow(allow);
904
    //
905
    //  accessWasSet =
906
    //    MNodeService.getInstance(request).setAccessPolicy(session, pid, accessPolicy);
907
    //  assertTrue(accessWasSet);
908
    //  // test that it is enforced
909
    //  session.setSubject(publicSubject);
910
    //  boolean isAuthorized = MNodeService.getInstance(request).isAuthorized(session, pid, Permission.WRITE);
911
    //  assertTrue(isAuthorized);
912
    //
913
    //} catch (UnsupportedEncodingException e) {
914
    //  e.printStackTrace();
915
    //
916
    //} catch (InvalidToken e) {
917
    //  e.printStackTrace();
918
    //  fail("Unexpected error: " + e.getMessage());
919
    //
920
    //} catch (ServiceFailure e) {
921
    //  e.printStackTrace();
922
    //  fail("Unexpected error: " + e.getMessage());
923
    //
924
    //} catch (NotAuthorized e) {
925
    //  e.printStackTrace();
926
    //  fail("Unexpected error: " + e.getMessage());
927
    //
928
    //} catch (IdentifierNotUnique e) {
929
    //  e.printStackTrace();
930
    //  fail("Unexpected error: " + e.getMessage());
931
    //
932
    //} catch (UnsupportedType e) {
933
    //  e.printStackTrace();
934
    //  fail("Unexpected error: " + e.getMessage());
935
    //
936
    //} catch (InsufficientResources e) {
937
    //  e.printStackTrace();
938
    //  fail("Unexpected error: " + e.getMessage());
939
    //
940
    //} catch (InvalidSystemMetadata e) {
941
    //  e.printStackTrace();
942
    //  fail("Unexpected error: " + e.getMessage());
943
    //
944
    //} catch (NotImplemented e) {
945
    //  e.printStackTrace();
946
    //  fail("Unexpected error: " + e.getMessage());
947
    //
948
    //} catch (InvalidRequest e) {
949
    //  e.printStackTrace();
950
    //  fail("Unexpected error: " + e.getMessage());
951
    //
952
    //} catch (NotFound e) {
953
    //  e.printStackTrace();
954
    //  fail("Unexpected error: " + e.getMessage());
955
    //
956
    //} catch (Exception e) {
957
    //  e.printStackTrace();
958
    //  fail("Unexpected error: " + e.getMessage());
959
    //
960
    //}
961 6354 cjones
962
  }
963 6309 cjones
964 6354 cjones
  /**
965
   * Test if a subject is authorized to read a known object
966
   */
967
  public void testIsAuthorized() {
968 6309 cjones
    printTestHeader("testIsAuthorized");
969
970 6354 cjones
    try {
971
      Session session = getTestSession();
972
      Identifier guid = new Identifier();
973
      guid.setValue("testIsAuthorized." + System.currentTimeMillis());
974
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
975
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
976
      Identifier pid =
977 6542 leinfelder
        MNodeService.getInstance(request).create(session, guid, object, sysmeta);
978 6354 cjones
      boolean isAuthorized =
979 6542 leinfelder
        MNodeService.getInstance(request).isAuthorized(session, pid, Permission.READ);
980 6354 cjones
      assertEquals(isAuthorized, true);
981
982 6309 cjones
    } catch (UnsupportedEncodingException e) {
983 6354 cjones
      e.printStackTrace();
984
      fail("Unexpected error: " + e.getMessage());
985 6309 cjones
986
    } catch (InvalidToken e) {
987 6354 cjones
      e.printStackTrace();
988
      fail("Unexpected error: " + e.getMessage());
989 6309 cjones
990
    } catch (ServiceFailure e) {
991 6354 cjones
      e.printStackTrace();
992
      fail("Unexpected error: " + e.getMessage());
993 6309 cjones
994
    } catch (NotAuthorized e) {
995 6354 cjones
      e.printStackTrace();
996
      fail("Unexpected error: " + e.getMessage());
997 6309 cjones
998
    } catch (IdentifierNotUnique e) {
999 6354 cjones
      e.printStackTrace();
1000
      fail("Unexpected error: " + e.getMessage());
1001 6309 cjones
1002
    } catch (UnsupportedType e) {
1003 6354 cjones
      e.printStackTrace();
1004
      fail("Unexpected error: " + e.getMessage());
1005 6309 cjones
1006
    } catch (InsufficientResources e) {
1007 6354 cjones
      e.printStackTrace();
1008
      fail("Unexpected error: " + e.getMessage());
1009 6309 cjones
1010
    } catch (InvalidSystemMetadata e) {
1011 6354 cjones
      e.printStackTrace();
1012
      fail("Unexpected error: " + e.getMessage());
1013 6309 cjones
1014
    } catch (NotImplemented e) {
1015 6354 cjones
      e.printStackTrace();
1016
      fail("Unexpected error: " + e.getMessage());
1017 6309 cjones
1018
    } catch (InvalidRequest e) {
1019 6354 cjones
      e.printStackTrace();
1020
      fail("Unexpected error: " + e.getMessage());
1021 6309 cjones
1022
    } catch (Exception e) {
1023 6354 cjones
      e.printStackTrace();
1024
      fail("Unexpected error: " + e.getMessage());
1025 6309 cjones
1026
    }
1027 6354 cjones
  }
1028 8209 leinfelder
1029
  /**
1030
   * Test if node admin is authorized to read a known object
1031
   */
1032
  public void testIsAdminAuthorized() {
1033
    printTestHeader("testIsAdminAuthorized");
1034
1035
    try {
1036
      Session session = getTestSession();
1037
      Identifier guid = new Identifier();
1038
      guid.setValue("testIsAdminAuthorized." + System.currentTimeMillis());
1039
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1040
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1041
      Identifier pid =
1042
        MNodeService.getInstance(request).create(session, guid, object, sysmeta);
1043
1044
      // test as public - read
1045
      boolean isAuthorized =
1046
        MNodeService.getInstance(request).isAuthorized(null, pid, Permission.READ);
1047
      assertEquals(isAuthorized, true);
1048
1049
      // test as public - change perm
1050
      isAuthorized =
1051
        MNodeService.getInstance(request).isAuthorized(null, pid, Permission.CHANGE_PERMISSION);
1052
      assertEquals(isAuthorized, false);
1053
1054
      // test as admin
1055
      isAuthorized =
1056
    	        MNodeService.getInstance(request).isAuthorized(getMNSession(), pid, Permission.CHANGE_PERMISSION);
1057
    	      assertEquals(isAuthorized, true);
1058
1059
    } catch (Exception e) {
1060
      e.printStackTrace();
1061
      fail("Unexpected error: " + e.getMessage());
1062 6309 cjones
1063 8209 leinfelder
    }
1064
  }
1065
1066 6309 cjones
1067 7040 cjones
  public void testIsEquivIdentityAuthorized() {
1068
      printTestHeader("testIsEquivIdentityAuthorized");
1069
1070
      try {
1071
          Session session = new Session();
1072
          Subject s = new Subject();
1073
          s.setValue("cn=test,dc=dataone,dc=org");
1074
          session.setSubject(s);
1075
1076
          Identifier pid = new Identifier();
1077
          pid.setValue("testIsEquivIdentityAuthorized." + System.currentTimeMillis());
1078
          InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1079
          SystemMetadata sysmeta = createSystemMetadata(pid, session.getSubject(), object);
1080
1081
          // reset the access policy to only allow 'self' read (no public)
1082
          AccessPolicy ap = new AccessPolicy();
1083
          AccessRule ar = new AccessRule();
1084
          List<Subject> sList = new ArrayList<Subject>();
1085
          sList.add(session.getSubject());
1086
          ar.setSubjectList(sList);
1087
          List<Permission> permList = new ArrayList<Permission>();
1088
          permList.add(Permission.CHANGE_PERMISSION);
1089
          ar.setPermissionList(permList);
1090
          ap.addAllow(ar);
1091
          sysmeta.setAccessPolicy(ap);
1092
1093
          // save it
1094
          Identifier retPid = CNodeService.getInstance(request).registerSystemMetadata(session, pid, sysmeta);
1095
          assertEquals(pid.getValue(), retPid.getValue());
1096
1097
          //check it against an equivalent identity not listed in the access policy
1098
          session.getSubject().setValue("cn=newSubject,dc=dataone,dc=org");
1099
          SubjectInfo subjectInfo = new SubjectInfo();
1100
          Person person = new Person();
1101
          person.setSubject(session.getSubject());
1102
          List<String> givenNames = new ArrayList<String>();
1103
          givenNames.add("New");
1104
          person.setGivenNameList(givenNames);
1105
          person.setFamilyName("Subject");
1106
1107
          // add equivalent identities
1108
          List<Subject> equivIdentities = new ArrayList<Subject>();
1109
          Subject mappedSubject2 = new Subject();
1110
          mappedSubject2.setValue("cn=test2,dc=dataone,dc=org");
1111
          equivIdentities.add(mappedSubject2);
1112
1113
          Subject mappedSubject = new Subject();
1114
          mappedSubject.setValue("cn=test,dc=dataone,dc=org");
1115
          equivIdentities.add(mappedSubject);
1116
1117
          person.setEquivalentIdentityList(equivIdentities);
1118
1119
          List<Person> personList = new ArrayList<Person>();
1120
          personList.add(person);
1121
          subjectInfo.setPersonList(personList);
1122
1123
          // update the session to include subject info with a mapped identity
1124
          session.setSubjectInfo(subjectInfo);
1125
          boolean result = CNodeService.getInstance(request).isAuthorized(session, pid, Permission.READ);
1126
          assertTrue(result);
1127
1128
    } catch (Exception e) {
1129
        e.printStackTrace();
1130
1131
    }
1132
1133
  }
1134 7816 leinfelder
1135
/**
1136
   * Test object creation failure when there is a space in the identifier
1137
   */
1138
  public void testCreateInvalidIdentifier() {
1139
    printTestHeader("testCreateInvalidIdentifier");
1140
1141
    try {
1142
      Session session = getTestSession();
1143
      Identifier guid = new Identifier();
1144
      guid.setValue("testCreate withspace." + System.currentTimeMillis());
1145
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1146
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1147
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
1148
      fail("Should not be able to create with whitespace in indentifier");
1149
    } catch (InvalidRequest e) {
1150
    	// expect that this request fails
1151
        assertTrue(true);
1152
    } catch (Exception e) {
1153
      e.printStackTrace();
1154
      fail("Unexpected error: " + e.getMessage());
1155
    }
1156
1157
  }
1158 6354 cjones
1159 7850 leinfelder
	/**
1160
	 * Test getting a known object
1161
	 */
1162
	public void testGetPackage() {
1163
		printTestHeader("testGetPackage");
1164
1165
		try {
1166
			Session session = getTestSession();
1167
			Identifier guid = new Identifier();
1168
			guid.setValue("testGetPackage." + System.currentTimeMillis());
1169
			InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1170
			SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1171
			Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
1172 8810 leinfelder
			InputStream bagStream = MNodeService.getInstance(request).getPackage(session, null, pid);
1173 7853 leinfelder
			File bagFile = File.createTempFile("bagit.", ".zip");
1174 7850 leinfelder
			IOUtils.copy(bagStream, new FileOutputStream(bagFile));
1175
			BagFactory bagFactory = new BagFactory();
1176
			Bag bag = bagFactory.createBag(bagFile);
1177
			InputStream result = bag.getPayload().iterator().next().newInputStream();
1178
1179
			// go back to beginning of original stream
1180
			object.reset();
1181
			// check
1182
			assertTrue(object.available() > 0);
1183
			assertTrue(result.available() > 0);
1184
			assertTrue(IOUtils.contentEquals(result, object));
1185
1186
			// clean up
1187
			bagFile.delete();
1188
1189
		} catch (Exception e) {
1190
			e.printStackTrace();
1191
			fail("Unexpected error: " + e.getMessage());
1192
		}
1193
	}
1194 7853 leinfelder
1195
1196
	/**
1197
	 * Test getting a known object
1198
	 */
1199
	public void testGetOREPackage() {
1200
		printTestHeader("testGetOREPackage");
1201
1202
		try {
1203
1204
			// construct the ORE package
1205
			Identifier resourceMapId = new Identifier();
1206
			//resourceMapId.setValue("doi://1234/AA/map.1.1");
1207
			resourceMapId.setValue("testGetOREPackage." + System.currentTimeMillis());
1208
			Identifier metadataId = new Identifier();
1209
			metadataId.setValue("doi://1234/AA/meta.1." + + System.currentTimeMillis());
1210
			List<Identifier> dataIds = new ArrayList<Identifier>();
1211
			Identifier dataId = new Identifier();
1212
			dataId.setValue("doi://1234/AA/data.1." + System.currentTimeMillis());
1213
			Identifier dataId2 = new Identifier();
1214
			dataId2.setValue("doi://1234/AA/data.2." + System.currentTimeMillis());
1215
			dataIds.add(dataId);
1216
			dataIds.add(dataId2);
1217
			Map<Identifier, List<Identifier>> idMap = new HashMap<Identifier, List<Identifier>>();
1218
			idMap.put(metadataId, dataIds);
1219
			ResourceMapFactory rmf = ResourceMapFactory.getInstance();
1220
			ResourceMap resourceMap = rmf.createResourceMap(resourceMapId, idMap);
1221
			assertNotNull(resourceMap);
1222
			String rdfXml = ResourceMapFactory.getInstance().serializeResourceMap(resourceMap);
1223
			assertNotNull(rdfXml);
1224
1225
			Session session = getTestSession();
1226
			InputStream object = null;
1227
			SystemMetadata sysmeta = null;
1228
1229
			// save the data objects (data just contains their ID)
1230
			InputStream dataObject1 = new ByteArrayInputStream(dataId.getValue().getBytes("UTF-8"));
1231
			sysmeta = createSystemMetadata(dataId, session.getSubject(), dataObject1);
1232
			MNodeService.getInstance(request).create(session, dataId, dataObject1, sysmeta);
1233
			// second data file
1234
			InputStream dataObject2 = new ByteArrayInputStream(dataId2.getValue().getBytes("UTF-8"));
1235
			sysmeta = createSystemMetadata(dataId2, session.getSubject(), dataObject2);
1236
			MNodeService.getInstance(request).create(session, dataId2, dataObject2, sysmeta);
1237
			// metadata file
1238
			InputStream metadataObject = new ByteArrayInputStream(metadataId.getValue().getBytes("UTF-8"));
1239
			sysmeta = createSystemMetadata(metadataId, session.getSubject(), metadataObject);
1240
			MNodeService.getInstance(request).create(session, metadataId, metadataObject, sysmeta);
1241
1242
			// save the ORE object
1243
			object = new ByteArrayInputStream(rdfXml.getBytes("UTF-8"));
1244
			sysmeta = createSystemMetadata(resourceMapId, session.getSubject(), object);
1245
			sysmeta.setFormatId(ObjectFormatCache.getInstance().getFormat("http://www.openarchives.org/ore/terms").getFormatId());
1246
			Identifier pid = MNodeService.getInstance(request).create(session, resourceMapId, object, sysmeta);
1247
1248
			// get the package we uploaded
1249 8810 leinfelder
			InputStream bagStream = MNodeService.getInstance(request).getPackage(session, null, pid);
1250 7853 leinfelder
			File bagFile = File.createTempFile("bagit.", ".zip");
1251
			IOUtils.copy(bagStream, new FileOutputStream(bagFile));
1252
			BagFactory bagFactory = new BagFactory();
1253
			Bag bag = bagFactory.createBag(bagFile);
1254
			Iterator<Manifest> manifestIter = bag.getTagManifests().iterator();
1255
			while (manifestIter.hasNext()) {
1256
				String filepath = manifestIter.next().getFilepath();
1257
				BagFile entryFile = bag.getBagFile(filepath);
1258
				InputStream result = entryFile.newInputStream();
1259
				// check ORE
1260
				if (filepath.contains(resourceMapId.getValue())) {
1261
					object.reset();
1262
					assertTrue(object.available() > 0);
1263
					assertTrue(result.available() > 0);
1264
					assertTrue(IOUtils.contentEquals(result, object));
1265
				}
1266
				// check metadata
1267
				if (filepath.contains(metadataId.getValue())) {
1268
					metadataObject.reset();
1269
					assertTrue(metadataObject.available() > 0);
1270
					assertTrue(result.available() > 0);
1271
					assertTrue(IOUtils.contentEquals(result, metadataObject));
1272
				}
1273
				if (filepath.contains(dataId.getValue())) {
1274
					dataObject1.reset();
1275
					assertTrue(dataObject1.available() > 0);
1276
					assertTrue(result.available() > 0);
1277
					assertTrue(IOUtils.contentEquals(result, dataObject1));
1278
				}
1279
				if (filepath.contains(dataId2.getValue())) {
1280
					dataObject2.reset();
1281
					assertTrue(dataObject2.available() > 0);
1282
					assertTrue(result.available() > 0);
1283
					assertTrue(IOUtils.contentEquals(result, dataObject2));
1284
				}
1285
1286
1287
			}
1288
1289
			// clean up
1290
			bagFile.delete();
1291 8745 leinfelder
1292
			// test the ORE lookup
1293
			List<Identifier> oreIds = MNodeService.getInstance(request).lookupOreFor(metadataId, true);
1294
			assertTrue(oreIds.contains(resourceMapId));
1295 7853 leinfelder
1296
		} catch (Exception e) {
1297
			e.printStackTrace();
1298
			fail("Unexpected error: " + e.getMessage());
1299
		}
1300
	}
1301
1302 8906 tao
	/**
1303
     * Test the extra "delete information" was added to the NotFoundException
1304
     * if the object was delete in the following methods:
1305
     * MN.get
1306
     * MN.getSystemmetadata
1307
     * MN.describe
1308
     * MN.getChecksum
1309
     * MN.getRelica
1310
     */
1311
    public void testReadDeletedObject() {
1312
        printTestHeader("testDelete");
1313
1314
        try {
1315
          Session session = getTestSession();
1316
          Identifier guid = new Identifier();
1317
          guid.setValue("testDelete." + System.currentTimeMillis());
1318
          InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1319
          SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1320
          Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
1321
          Thread.sleep(3000);
1322
          // use MN admin to delete
1323
          session = getMNSession();
1324
          Identifier deletedPid = MNodeService.getInstance(request).delete(session, pid);
1325
          System.out.println("after deleting");
1326
          assertEquals(pid.getValue(), deletedPid.getValue());
1327
          // check that we cannot get the object
1328
          session = getTestSession();
1329
          InputStream deletedObject = null;
1330
          try {
1331
              //System.out.println("before read ===============");
1332
              deletedObject = MNodeService.getInstance(request).get(session, deletedPid);
1333
              //System.out.println("after read ===============");
1334
          } catch (NotFound nf) {
1335
              assertTrue(nf.getMessage().contains("deleted"));
1336
          }
1337
          try {
1338
              //System.out.println("before read ===============");
1339
              SystemMetadata sysmeta2 = MNodeService.getInstance(request).getSystemMetadata(session, deletedPid);
1340
              //System.out.println("after read ===============");
1341
          } catch (NotFound nf) {
1342
              //System.out.println("the exception is "+nf.getMessage());
1343
              assertTrue(nf.getMessage().contains("deleted"));
1344
          }
1345
1346
          try {
1347
              //System.out.println("before read ===============");
1348
              DescribeResponse describeResponse = MNodeService.getInstance(request).describe(session, pid);
1349
              //System.out.println("after read ===============");
1350
          } catch (NotFound nf) {
1351
              //System.out.println("the exception is "+nf.getMessage());
1352
              assertTrue(nf.getMessage().contains("deleted"));
1353
          }
1354
1355
          try {
1356
              //System.out.println("before read ===============");
1357
              Checksum checksum = MNodeService.getInstance(request).getChecksum(session, pid, "MD5");
1358
              //System.out.println("after read ===============");
1359
          } catch (NotFound nf) {
1360
              //System.out.println("the exception 3 is "+nf.getMessage());
1361
              assertTrue(nf.getMessage().contains("deleted"));
1362
          }
1363
1364
          try {
1365
              //System.out.println("before read ===============");
1366
              boolean isAuthorized =
1367
                      MNodeService.getInstance(request).isAuthorized(session, pid, Permission.READ);
1368
              //System.out.println("after read ===============");
1369
          } catch (NotFound nf) {
1370
              System.out.println("the exception 4 is "+nf.getMessage());
1371
              assertTrue(nf.getMessage().contains("deleted"));
1372
          }
1373
1374
          assertNull(deletedObject);
1375
1376
        } catch (UnsupportedEncodingException e) {
1377
          e.printStackTrace();
1378
1379
        } catch (Exception e) {
1380
          e.printStackTrace();
1381
          fail("Unexpected error: " + e.getMessage());
1382
1383
        }
1384
    }
1385 8952 tao
1386
    /**
1387
     * Test to create and update a metadata which xml declaration is ASCII, but actually
1388
     * has some special charaters. The saved document should has the same bytes as the origianl.
1389
     */
1390
    public void testCreateAndUpdateXMLWithUnmatchingEncoding() throws Exception {
1391
          String algorithm = "md5";
1392
          Session session = getTestSession();
1393
          Identifier guid = new Identifier();
1394
          guid.setValue("testCreateAndUpdate." + System.currentTimeMillis());
1395
          InputStream object = new ByteArrayInputStream(FileUtils.readFileToByteArray(new File(unmatchingEncodingFilePath)));
1396
          Checksum orgChecksum = ChecksumUtil.checksum(object, algorithm);
1397
          //System.out.println("the original checksum is "+orgChecksum.getValue());
1398
          SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1399
          Identifier pid =
1400
            MNodeService.getInstance(request).create(session, guid, object, sysmeta);
1401
          InputStream readResult = MNodeService.getInstance(request).get(session, pid);
1402
          byte[] readBytes = IOUtils.toByteArray(readResult);
1403
          Checksum checksum1 = ChecksumUtil.checksum(readBytes, algorithm);
1404
          //System.out.println("the read checksum1 is "+checksum1.getValue());
1405
          assertEquals(orgChecksum.getValue(), checksum1.getValue());
1406
1407
          Identifier newPid = new Identifier();
1408
          newPid.setValue("testCreateAndUpdate." + (System.currentTimeMillis() + 1)); // ensure it is different from original
1409
          SystemMetadata newSysMeta = createSystemMetadata(newPid, session.getSubject(), object);
1410
1411
          // do the update
1412
          Identifier updatedPid =
1413
            MNodeService.getInstance(request).update(session, pid, object, newPid, newSysMeta);
1414
          InputStream readResult2 = MNodeService.getInstance(request).get(session, updatedPid);
1415
          byte[] readBytes2 = IOUtils.toByteArray(readResult2);
1416
          Checksum checksum2 = ChecksumUtil.checksum(readBytes2, algorithm);
1417
          assertEquals(orgChecksum.getValue(), checksum2.getValue());
1418
          //System.out.println("the read checksum2 is "+checksum2.getValue());
1419
1420
1421
    }
1422 6354 cjones
1423 9034 tao
    /**
1424
     * Test the method - get api  for a speicified SID
1425
     */
1426
    public void testGetSID() {
1427
        String str1 = "object1";
1428
        String str2 = "object2";
1429
        String str3 = "object3";
1430
        try {
1431
            //insert test documents with a series id
1432
            Session session = getTestSession();
1433
            Identifier guid = new Identifier();
1434
            guid.setValue(generateDocumentId());
1435
            InputStream object1 = new ByteArrayInputStream(str1.getBytes("UTF-8"));
1436
            SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object1);
1437
            String sid1= "sid."+System.nanoTime();
1438
            Identifier seriesId = new Identifier();
1439
            seriesId.setValue(sid1);
1440
            System.out.println("the first sid is "+seriesId.getValue());
1441
            sysmeta.setSeriesId(seriesId);
1442
            MNodeService.getInstance(request).create(session, guid, object1, sysmeta);
1443
            System.out.println("the first pid is "+guid.getValue());
1444
            //test the get(pid) for v2
1445
            InputStream result = MNodeService.getInstance(request).get(session, guid);
1446
            // go back to beginning of original stream
1447
            object1.reset();
1448
            // check
1449
            assertTrue(object1.available() > 0);
1450
            assertTrue(result.available() > 0);
1451
            assertTrue(IOUtils.contentEquals(result, object1));
1452
            // test the get(id) for v2
1453
            InputStream result1 = MNodeService.getInstance(request).get(session, seriesId);
1454
            object1.reset();
1455
            // check
1456
            assertTrue(object1.available() > 0);
1457
            assertTrue(result1.available() > 0);
1458
            assertTrue(IOUtils.contentEquals(result1, object1));
1459
            //test the get(pid) for v1
1460
            InputStream result2 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, guid);
1461
            object1.reset();
1462
            // check
1463
            assertTrue(object1.available() > 0);
1464
            assertTrue(result2.available() > 0);
1465
            assertTrue(IOUtils.contentEquals(result2, object1));
1466
            //test the get(sid) for v1
1467
            try {
1468
                InputStream result3 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, seriesId);
1469
                fail("the get(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1470
            } catch (NotFound ee) {
1471
1472
            }
1473 9039 tao
            SystemMetadata metadata = MNodeService.getInstance(request).getSystemMetadata(session, seriesId);
1474
            assertTrue(metadata.getIdentifier().getValue().equals(guid.getValue()));
1475
            assertTrue(metadata.getSeriesId().getValue().equals(seriesId.getValue()));
1476
            DescribeResponse describeResponse = MNodeService.getInstance(request).describe(session, seriesId);
1477
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata.getChecksum().getValue());
1478
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata.getFormatId().getValue());
1479 9034 tao
1480 9039 tao
            metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid);
1481
            assertTrue(metadata.getIdentifier().getValue().equals(guid.getValue()));
1482
            assertTrue(metadata.getSeriesId().getValue().equals(seriesId.getValue()));
1483
            describeResponse = MNodeService.getInstance(request).describe(session, guid);
1484
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata.getChecksum().getValue());
1485
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata.getFormatId().getValue());
1486
1487
            org.dataone.service.types.v1.SystemMetadata sys1=edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).getSystemMetadata(session, guid);
1488
            assertTrue(metadata.getIdentifier().getValue().equals(guid.getValue()));
1489
1490
            try {
1491
                org.dataone.service.types.v1.SystemMetadata sys2=edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).getSystemMetadata(session, seriesId);
1492
                fail("the getSystemMetadata(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1493
            } catch(NotFound nf2) {
1494
1495
            }
1496
1497
            describeResponse = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).describe(session, guid);
1498
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), sys1.getChecksum().getValue());
1499
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), sys1.getFormatId().getValue());
1500
            try {
1501
                describeResponse = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).describe(session, seriesId);
1502
                fail("the describe(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1503
            } catch(NotFound nf2) {
1504
1505
            }
1506
1507 9042 tao
            Checksum sum = MNodeService.getInstance(request).getChecksum(session, guid, "md5");
1508
            assertTrue(sum.getValue().equals("5b78f9689b9aab1ebc0f3c1df916dd97"));
1509
1510
            try {
1511
                sum = MNodeService.getInstance(request).getChecksum(session, seriesId, "md5");
1512
                fail("the getCheckSum shouldn't work for sid");
1513
            } catch(NotFound nf3) {
1514
1515
            }
1516
1517
            sum = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).getChecksum(session, guid, "md5");
1518
            assertTrue(sum.getValue().equals("5b78f9689b9aab1ebc0f3c1df916dd97"));
1519
1520
            try {
1521
                sum = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).getChecksum(session, seriesId, "md5");
1522
                fail("the getCheckSum shouldn't work for sid");
1523
            } catch(NotFound nf3) {
1524
1525
            }
1526
1527 9052 tao
            boolean isAuthorized =
1528
                    MNodeService.getInstance(request).isAuthorized(session, guid, Permission.READ);
1529
            assertEquals(isAuthorized, true);
1530 9042 tao
1531 9052 tao
            isAuthorized =
1532
                    MNodeService.getInstance(request).isAuthorized(session, seriesId, Permission.READ);
1533
            assertEquals(isAuthorized, true);
1534 9042 tao
1535 9052 tao
            isAuthorized =
1536
                    edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).isAuthorized(session, guid, Permission.READ);
1537
            assertEquals(isAuthorized, true);
1538
1539
            try {
1540
                isAuthorized =
1541
                        edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).isAuthorized(session, seriesId, Permission.READ);
1542
                fail("we can't reach here since the v1 isAuthorized method doesn't suppport series id");
1543
            } catch (NotFound e) {
1544
1545
            }
1546
1547 9034 tao
            //do a update with the same series id
1548 9035 tao
            Thread.sleep(1000);
1549 9034 tao
            Identifier newPid = new Identifier();
1550
            newPid.setValue(generateDocumentId()+"1");
1551
            System.out.println("the second pid is "+newPid.getValue());
1552 9035 tao
            InputStream object2 = new ByteArrayInputStream(str2.getBytes("UTF-8"));
1553
            SystemMetadata newSysMeta = createSystemMetadata(newPid, session.getSubject(), object2);
1554 9034 tao
            newSysMeta.setObsoletes(guid);
1555
            newSysMeta.setSeriesId(seriesId);
1556 9035 tao
            MNodeService.getInstance(request).update(session, guid, object2, newPid, newSysMeta);
1557
1558
            InputStream result4 = MNodeService.getInstance(request).get(session, guid);
1559
            // go back to beginning of original stream
1560
            object1.reset();
1561
            // check
1562
            assertTrue(object1.available() > 0);
1563
            assertTrue(result4.available() > 0);
1564
            assertTrue(IOUtils.contentEquals(result4, object1));
1565 9034 tao
1566 9035 tao
            InputStream result5 = MNodeService.getInstance(request).get(session, newPid);
1567
            // go back to beginning of original stream
1568
            object2.reset();
1569
            // check
1570
            assertTrue(object2.available() > 0);
1571
            assertTrue(result5.available() > 0);
1572
            assertTrue(IOUtils.contentEquals(result5, object2));
1573
1574
1575
            InputStream result6 = MNodeService.getInstance(request).get(session, seriesId);
1576
            object2.reset();
1577
            // check
1578
            assertTrue(object2.available() > 0);
1579
            assertTrue(result6.available() > 0);
1580
            assertTrue(IOUtils.contentEquals(result6, object2));
1581
            //test the get(pid) for v1
1582
            InputStream result7 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, guid);
1583
            object1.reset();
1584
            // check
1585
            assertTrue(object1.available() > 0);
1586
            assertTrue(result7.available() > 0);
1587
            assertTrue(IOUtils.contentEquals(result7, object1));
1588
1589
            InputStream result8 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, newPid);
1590
            object2.reset();
1591
            // check
1592
            assertTrue(object2.available() > 0);
1593
            assertTrue(result8.available() > 0);
1594
            assertTrue(IOUtils.contentEquals(result8, object2));
1595
            //test the get(sid) for v1
1596
            try {
1597
                InputStream result3 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, seriesId);
1598
                fail("the get(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1599
            } catch (NotFound ee) {
1600
1601
            }
1602
1603 9039 tao
            SystemMetadata metadata1 = MNodeService.getInstance(request).getSystemMetadata(session, seriesId);
1604
            assertTrue(metadata1.getIdentifier().getValue().equals(newPid.getValue()));
1605
            assertTrue(metadata1.getSeriesId().getValue().equals(seriesId.getValue()));
1606
            describeResponse = MNodeService.getInstance(request).describe(session, seriesId);
1607
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata1.getChecksum().getValue());
1608
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata1.getFormatId().getValue());
1609
1610
            SystemMetadata metadata2 = MNodeService.getInstance(request).getSystemMetadata(session, guid);
1611
            assertTrue(metadata2.getIdentifier().getValue().equals(guid.getValue()));
1612
            assertTrue(metadata2.getSeriesId().getValue().equals(seriesId.getValue()));
1613
            describeResponse = MNodeService.getInstance(request).describe(session, guid);
1614
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata2.getChecksum().getValue());
1615
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata2.getFormatId().getValue());
1616
1617
            SystemMetadata metadata3 = MNodeService.getInstance(request).getSystemMetadata(session, newPid);
1618
            assertTrue(metadata3.getIdentifier().getValue().equals(newPid.getValue()));
1619
            assertTrue(metadata3.getSeriesId().getValue().equals(seriesId.getValue()));
1620
            describeResponse = MNodeService.getInstance(request).describe(session, newPid);
1621
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata3.getChecksum().getValue());
1622
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata3.getFormatId().getValue());
1623
1624 9034 tao
            //do another update with different series id
1625
            Thread.sleep(1000);
1626
            String sid2 = "sid."+System.nanoTime();
1627
            Identifier seriesId2= new Identifier();
1628
            seriesId2.setValue(sid2);
1629
            System.out.println("the second sid is "+seriesId2.getValue());
1630
            Identifier newPid2 = new Identifier();
1631
            newPid2.setValue(generateDocumentId()+"2");
1632
            System.out.println("the third pid is "+newPid2.getValue());
1633 9035 tao
            InputStream object3 = new ByteArrayInputStream(str3.getBytes("UTF-8"));
1634
            SystemMetadata sysmeta3 = createSystemMetadata(newPid2, session.getSubject(), object3);
1635 9034 tao
            sysmeta3.setObsoletes(newPid);
1636
            sysmeta3.setSeriesId(seriesId2);
1637 9035 tao
            MNodeService.getInstance(request).update(session, newPid, object3, newPid2, sysmeta3);
1638 9034 tao
1639 9035 tao
            InputStream result9 = MNodeService.getInstance(request).get(session, guid);
1640
            // go back to beginning of original stream
1641
            object1.reset();
1642
            // check
1643
            assertTrue(object1.available() > 0);
1644
            assertTrue(result9.available() > 0);
1645
            assertTrue(IOUtils.contentEquals(result9, object1));
1646 9034 tao
1647 9035 tao
            InputStream result10 = MNodeService.getInstance(request).get(session, newPid);
1648
            // go back to beginning of original stream
1649
            object2.reset();
1650
            // check
1651
            assertTrue(object2.available() > 0);
1652
            assertTrue(result10.available() > 0);
1653
            assertTrue(IOUtils.contentEquals(result10, object2));
1654 9034 tao
1655
1656 9035 tao
            InputStream result11 = MNodeService.getInstance(request).get(session, newPid2);
1657
            // go back to beginning of original stream
1658
            object3.reset();
1659
            // check
1660
            assertTrue(object3.available() > 0);
1661
            assertTrue(result11.available() > 0);
1662
            assertTrue(IOUtils.contentEquals(result11, object3));
1663
1664
            InputStream result12 = MNodeService.getInstance(request).get(session, seriesId2);
1665
            object3.reset();
1666
            // check
1667
            assertTrue(object3.available() > 0);
1668
            assertTrue(result12.available() > 0);
1669
            assertTrue(IOUtils.contentEquals(result12, object3));
1670
1671
            InputStream result16 = MNodeService.getInstance(request).get(session, seriesId);
1672
            object2.reset();
1673
            // check
1674
            assertTrue(object2.available() > 0);
1675
            assertTrue(result16.available() > 0);
1676
            assertTrue(IOUtils.contentEquals(result16, object2));
1677
1678
            //test the get(pid) for v1
1679
            InputStream result13 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, guid);
1680
            object1.reset();
1681
            // check
1682
            assertTrue(object1.available() > 0);
1683
            assertTrue(result13.available() > 0);
1684
            assertTrue(IOUtils.contentEquals(result13, object1));
1685
1686
            InputStream result14 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, newPid);
1687
            object2.reset();
1688
            // check
1689
            assertTrue(object2.available() > 0);
1690
            assertTrue(result14.available() > 0);
1691
            assertTrue(IOUtils.contentEquals(result14, object2));
1692
1693
            InputStream result15 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, newPid2);
1694
            object3.reset();
1695
            // check
1696
            assertTrue(object3.available() > 0);
1697
            assertTrue(result15.available() > 0);
1698
            assertTrue(IOUtils.contentEquals(result15, object3));
1699
1700 9039 tao
            SystemMetadata metadata4 = MNodeService.getInstance(request).getSystemMetadata(session, seriesId);
1701
            assertTrue(metadata4.getIdentifier().getValue().equals(newPid.getValue()));
1702
            assertTrue(metadata4.getSeriesId().getValue().equals(seriesId.getValue()));
1703
            describeResponse = MNodeService.getInstance(request).describe(session, seriesId);
1704
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata4.getChecksum().getValue());
1705
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata4.getFormatId().getValue());
1706 9035 tao
1707 9039 tao
            SystemMetadata metadata5 = MNodeService.getInstance(request).getSystemMetadata(session, seriesId2);
1708
            assertTrue(metadata5.getIdentifier().getValue().equals(newPid2.getValue()));
1709
            assertTrue(metadata5.getSeriesId().getValue().equals(seriesId2.getValue()));
1710
            describeResponse = MNodeService.getInstance(request).describe(session, seriesId2);
1711
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata5.getChecksum().getValue());
1712
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata5.getFormatId().getValue());
1713
1714
            SystemMetadata metadata6 = MNodeService.getInstance(request).getSystemMetadata(session, guid);
1715
            assertTrue(metadata6.getIdentifier().getValue().equals(guid.getValue()));
1716
            assertTrue(metadata6.getSeriesId().getValue().equals(seriesId.getValue()));
1717
            describeResponse = MNodeService.getInstance(request).describe(session, guid);
1718
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata6.getChecksum().getValue());
1719
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata6.getFormatId().getValue());
1720
1721
            SystemMetadata metadata7 = MNodeService.getInstance(request).getSystemMetadata(session, newPid);
1722
            assertTrue(metadata7.getIdentifier().getValue().equals(newPid.getValue()));
1723
            assertTrue(metadata7.getSeriesId().getValue().equals(seriesId.getValue()));
1724
            describeResponse = MNodeService.getInstance(request).describe(session, newPid);
1725
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata7.getChecksum().getValue());
1726
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata7.getFormatId().getValue());
1727
1728
            SystemMetadata metadata8 = MNodeService.getInstance(request).getSystemMetadata(session, newPid2);
1729
            assertTrue(metadata8.getIdentifier().getValue().equals(newPid2.getValue()));
1730
            assertTrue(metadata8.getSeriesId().getValue().equals(seriesId2.getValue()));
1731
            describeResponse = MNodeService.getInstance(request).describe(session, newPid2);
1732
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata8.getChecksum().getValue());
1733
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata8.getFormatId().getValue());
1734
1735
1736
1737
1738 9035 tao
            //test the get(sid) for v1
1739
            try {
1740
                InputStream result3 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, seriesId);
1741
                fail("the get(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1742
            } catch (NotFound ee) {
1743
1744
            }
1745
1746
            //test the get(sid) for v1
1747
            try {
1748
                InputStream result3 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, seriesId2);
1749
                fail("the get(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1750
            } catch (NotFound ee) {
1751
1752
            }
1753
1754
            //test to get non-existing id for v2
1755
            try {
1756
             // the pid should be null when we try to get a no-exist sid
1757
                Identifier non_exist_sid = new Identifier();
1758
                non_exist_sid.setValue("no-sid-exist-123qwe");
1759
                InputStream result3 = MNodeService.getInstance(request).get(session, non_exist_sid);
1760
                fail("the get(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1761
            } catch (NotFound ee) {
1762
1763
            }
1764 9039 tao
1765
            try {
1766
                // the pid should be null when we try to get a no-exist sid
1767
                   Identifier non_exist_sid = new Identifier();
1768
                   non_exist_sid.setValue("no-sid-exist-123qwe");
1769
                   SystemMetadata result3 = MNodeService.getInstance(request).getSystemMetadata(session, non_exist_sid);
1770
                   fail("the getSystemMetadata(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1771
            } catch (NotFound ee) {
1772
1773
            }
1774
1775
            try {
1776
                // the pid should be null when we try to get a no-exist sid
1777
                   Identifier non_exist_sid = new Identifier();
1778
                   non_exist_sid.setValue("no-sid-exist-123qwe");
1779
                    MNodeService.getInstance(request).describe(session, non_exist_sid);
1780
                   fail("the describe(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1781
               } catch (NotFound ee) {
1782
1783
               }
1784 9035 tao
1785 9049 tao
1786
            //do another update with invalid series ids
1787
            Thread.sleep(1000);
1788
            Identifier newPid3 = new Identifier();
1789
            newPid3.setValue(generateDocumentId()+"3");
1790
            System.out.println("the third pid is "+newPid3.getValue());
1791
            InputStream object4 = new ByteArrayInputStream(str3.getBytes("UTF-8"));
1792
            SystemMetadata sysmeta4 = createSystemMetadata(newPid3, session.getSubject(), object4);
1793
            sysmeta4.setObsoletes(newPid2);
1794
            sysmeta4.setSeriesId(seriesId);
1795
            try {
1796
                MNodeService.getInstance(request).update(session, newPid2, object4, newPid3, sysmeta4);
1797
                fail("we can't reach here since the sid is using an old one ");
1798
            } catch (InvalidSystemMetadata eee) {
1799
1800
            }
1801
1802
            sysmeta4.setSeriesId(newPid3);
1803
            try {
1804
                MNodeService.getInstance(request).update(session, newPid2, object4, newPid3, sysmeta4);
1805
                fail("we can't reach here since the sid is using the pid ");
1806
            } catch (InvalidSystemMetadata eee) {
1807
1808
            }
1809
1810 9052 tao
            //test archive a series id by v1
1811
            try {
1812
                edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).archive(session, seriesId2);
1813
                fail("we can't reach here since the v1 archive method doesn't support the sid ");
1814
            } catch (NotFound nf2) {
1815
1816
            }
1817
1818
            // test delete a series id by v1
1819
            Session mnSession = getMNSession();
1820
            try {
1821
                edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).delete(mnSession, seriesId2);
1822
                fail("we can't reach here since the v1 delete method doesn't support the sid ");
1823
            } catch (NotFound nf2) {
1824
1825
            }
1826
1827
            // test archive a series id by v2
1828
            MNodeService.getInstance(request).archive(session, seriesId2);
1829
            SystemMetadata archived = MNodeService.getInstance(request).getSystemMetadata(session, seriesId2);
1830
            assertTrue(archived.getArchived());
1831
            archived = MNodeService.getInstance(request).getSystemMetadata(session, newPid2);
1832
            assertTrue(archived.getArchived());
1833
1834
            // test delete a series id by v2
1835
            MNodeService.getInstance(request).delete(mnSession, seriesId2);
1836
            try {
1837
                MNodeService.getInstance(request).get(session, seriesId2);
1838
                fail("we can't reach here since the series id was deleted ");
1839
            } catch (NotFound nf3) {
1840
                System.out.println("the message is ============="+nf3.getMessage());
1841
                //assertTrue(nf3.getMessage().indexOf("delete") >0);
1842
            }
1843
1844
            try {
1845
                MNodeService.getInstance(request).get(session, newPid2);
1846
                fail("we can't reach here since the series id was deleted ");
1847
            } catch (NotFound nf3) {
1848
                //System.out.println("the message is ============="+nf3.getMessage());
1849
                assertTrue(nf3.getMessage().indexOf("delete") >0);
1850
            }
1851
1852
            try {
1853
                edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, newPid2);
1854
                fail("we can't reach here since the series id was deleted ");
1855
            } catch (NotFound nf3) {
1856
                System.out.println("the message is ============="+nf3.getMessage());
1857
                assertTrue(nf3.getMessage().indexOf("delete") >0);
1858
            }
1859
1860
            //archive seriesId
1861
            MNodeService.getInstance(request).archive(mnSession, seriesId);
1862
            archived = MNodeService.getInstance(request).getSystemMetadata(session, seriesId);
1863
            assertTrue(archived.getArchived());
1864
            archived = MNodeService.getInstance(request).getSystemMetadata(session, newPid);
1865
            assertTrue(archived.getArchived());
1866
1867
1868
            //delete seriesId
1869
            MNodeService.getInstance(request).delete(mnSession, seriesId);
1870
            try {
1871
                MNodeService.getInstance(request).get(session, newPid);
1872
                fail("we can't reach here since the series id was deleted ");
1873
            } catch (NotFound nf3) {
1874
                //System.out.println("the message is ============="+nf3.getMessage());
1875
                assertTrue(nf3.getMessage().indexOf("delete") >0);
1876
            }
1877
            SystemMetadata meta = MNodeService.getInstance(request).getSystemMetadata(session, seriesId);
1878
            assertTrue(meta.getIdentifier().getValue().equals(guid.getValue()));
1879
1880 9034 tao
        } catch (Exception e) {
1881
            fail(e.getMessage());
1882
        }
1883
1884 9049 tao
1885
1886
1887 9034 tao
    }
1888 6309 cjones
}