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 9167 tao
import edu.ucsb.nceas.metacat.dataone.CNodeService;
32 9034 tao
import edu.ucsb.nceas.metacat.dataone.MNodeService;
33 9147 tao
import edu.ucsb.nceas.metacat.properties.SkinPropertyService;
34
import edu.ucsb.nceas.metacat.service.ServiceService;
35
import edu.ucsb.nceas.utilities.IOUtil;
36 7850 leinfelder
import gov.loc.repository.bagit.Bag;
37
import gov.loc.repository.bagit.BagFactory;
38 7853 leinfelder
import gov.loc.repository.bagit.BagFile;
39
import gov.loc.repository.bagit.Manifest;
40 7850 leinfelder
41 6309 cjones
import java.io.ByteArrayInputStream;
42 6942 cjones
import java.io.ByteArrayOutputStream;
43 7850 leinfelder
import java.io.File;
44
import java.io.FileOutputStream;
45 6942 cjones
import java.io.IOException;
46 6309 cjones
import java.io.InputStream;
47
import java.io.UnsupportedEncodingException;
48 9167 tao
import java.math.BigInteger;
49 9147 tao
import java.net.URL;
50 6326 leinfelder
import java.text.SimpleDateFormat;
51 7040 cjones
import java.util.ArrayList;
52 6312 cjones
import java.util.Calendar;
53 6309 cjones
import java.util.Date;
54 7853 leinfelder
import java.util.HashMap;
55
import java.util.Iterator;
56 7040 cjones
import java.util.List;
57 7853 leinfelder
import java.util.Map;
58 9147 tao
import java.util.Vector;
59 6309 cjones
60
import junit.framework.Test;
61
import junit.framework.TestSuite;
62
63 8952 tao
import org.apache.commons.io.FileUtils;
64 6324 leinfelder
import org.apache.commons.io.IOUtils;
65 8810 leinfelder
import org.dataone.client.v2.formats.ObjectFormatCache;
66 6348 leinfelder
import org.dataone.configuration.Settings;
67 7853 leinfelder
import org.dataone.ore.ResourceMapFactory;
68 9191 tao
import org.dataone.service.util.Constants;
69 6942 cjones
import org.dataone.service.util.TypeMarshaller;
70 6309 cjones
import org.dataone.service.exceptions.IdentifierNotUnique;
71
import org.dataone.service.exceptions.InsufficientResources;
72
import org.dataone.service.exceptions.InvalidRequest;
73
import org.dataone.service.exceptions.InvalidSystemMetadata;
74
import org.dataone.service.exceptions.InvalidToken;
75
import org.dataone.service.exceptions.NotAuthorized;
76
import org.dataone.service.exceptions.NotFound;
77
import org.dataone.service.exceptions.NotImplemented;
78
import org.dataone.service.exceptions.ServiceFailure;
79 6333 leinfelder
import org.dataone.service.exceptions.SynchronizationFailed;
80 6309 cjones
import org.dataone.service.exceptions.UnsupportedType;
81 6366 leinfelder
import org.dataone.service.types.v1.AccessPolicy;
82
import org.dataone.service.types.v1.AccessRule;
83
import org.dataone.service.types.v1.Checksum;
84
import org.dataone.service.types.v1.DescribeResponse;
85
import org.dataone.service.types.v1.Event;
86 9289 tao
import org.dataone.service.types.v1.ObjectFormatIdentifier;
87 6366 leinfelder
import org.dataone.service.types.v1.Identifier;
88 8810 leinfelder
import org.dataone.service.types.v2.Log;
89
import org.dataone.service.types.v2.Node;
90 9147 tao
import org.dataone.service.types.v2.OptionList;
91 6366 leinfelder
import org.dataone.service.types.v1.NodeReference;
92
import org.dataone.service.types.v1.ObjectFormatIdentifier;
93
import org.dataone.service.types.v1.ObjectList;
94
import org.dataone.service.types.v1.Permission;
95 7040 cjones
import org.dataone.service.types.v1.Person;
96 6366 leinfelder
import org.dataone.service.types.v1.Session;
97
import org.dataone.service.types.v1.Subject;
98 7040 cjones
import org.dataone.service.types.v1.SubjectInfo;
99 8952 tao
import org.dataone.service.types.v1.util.ChecksumUtil;
100 8810 leinfelder
import org.dataone.service.types.v2.SystemMetadata;
101 7853 leinfelder
import org.dspace.foresite.ResourceMap;
102 6942 cjones
import org.jibx.runtime.JiBXException;
103 6309 cjones
import org.junit.After;
104
import org.junit.Before;
105
106
/**
107
 * A JUnit test to exercise the Metacat Member Node service implementation.
108
 * This also tests a few of the D1NodeService superclass methods
109
 *
110
 * @author cjones
111
 *
112
 */
113 6324 leinfelder
public class MNodeServiceTest extends D1NodeServiceTest {
114 6309 cjones
115 8952 tao
    private static String unmatchingEncodingFilePath = "test/incorrect-encoding-declaration.xml";
116 6354 cjones
  /**
117
   * Set up the test fixtures
118
   *
119
   * @throws Exception
120
   */
121
  @Before
122
  public void setUp() throws Exception {
123
    super.setUp();
124
    // set up the configuration for d1client
125
    Settings.getConfiguration().setProperty("D1Client.cnClassName", MockCNode.class.getName());
126
  }
127 6309 cjones
128 6354 cjones
  /**
129
   * Remove the test fixtures
130
   */
131
  @After
132
  public void tearDown() {
133
  }
134
135
  /**
136
   * Build the test suite
137
   * @return
138
   */
139
  public static Test suite() {
140
141
    TestSuite suite = new TestSuite();
142 9279 tao
    suite.addTest(new MNodeServiceTest("initialize"));
143 6309 cjones
    // MNStorage tests
144 7160 leinfelder
    suite.addTest(new MNodeServiceTest("testCreate"));
145 7816 leinfelder
    suite.addTest(new MNodeServiceTest("testCreateInvalidIdentifier"));
146 7160 leinfelder
    suite.addTest(new MNodeServiceTest("testUpdate"));
147 7161 leinfelder
    // this requires MN certificate
148 7163 leinfelder
    suite.addTest(new MNodeServiceTest("testDelete"));
149 7161 leinfelder
150 7160 leinfelder
    // MNRead tests
151
    suite.addTest(new MNodeServiceTest("testGet"));
152
    suite.addTest(new MNodeServiceTest("testGetChecksum"));
153
    suite.addTest(new MNodeServiceTest("testGetSystemMetadata"));
154
    suite.addTest(new MNodeServiceTest("testDescribe"));
155
    suite.addTest(new MNodeServiceTest("testListObjects"));
156 7161 leinfelder
    // this requires CN certificate
157 7164 leinfelder
    suite.addTest(new MNodeServiceTest("testSynchronizationFailed"));
158 7161 leinfelder
159 7160 leinfelder
    // MNCore tests
160
    suite.addTest(new MNodeServiceTest("testPing"));
161
    suite.addTest(new MNodeServiceTest("testGetLogRecords"));
162
    suite.addTest(new MNodeServiceTest("testGetCapabilities"));
163 8833 leinfelder
164 7160 leinfelder
    // MNAuthorization tests
165
    suite.addTest(new MNodeServiceTest("testIsAuthorized"));
166 7040 cjones
    suite.addTest(new MNodeServiceTest("testIsEquivIdentityAuthorized"));
167 7160 leinfelder
    suite.addTest(new MNodeServiceTest("testSetAccessPolicy"));
168
    // MNreplication tests
169
    suite.addTest(new MNodeServiceTest("testReplicate"));
170 7850 leinfelder
    // MN packaging tests
171
    suite.addTest(new MNodeServiceTest("testGetPackage"));
172 7853 leinfelder
    suite.addTest(new MNodeServiceTest("testGetOREPackage"));
173 8906 tao
    suite.addTest(new MNodeServiceTest("testReadDeletedObject"));
174 8952 tao
    suite.addTest(new MNodeServiceTest("testCreateAndUpdateXMLWithUnmatchingEncoding"));
175 9034 tao
    suite.addTest(new MNodeServiceTest("testGetSID"));
176 9147 tao
    suite.addTest(new MNodeServiceTest("testListViews"));
177 9279 tao
    suite.addTest(new MNodeServiceTest("testUpdateSystemMetadata"));
178 9276 tao
    suite.addTest(new MNodeServiceTest("testUpdateObsoletesAndObsoletedBy"));
179 9351 tao
    suite.addTest(new MNodeServiceTest("testArchive"));
180 9377 tao
    suite.addTest(new MNodeServiceTest("testUpdateSciMetadata"));
181 9147 tao
182 9377 tao
183 6354 cjones
    return suite;
184
185
  }
186
187
  /**
188
   * Constructor for the tests
189
   *
190
   * @param name - the name of the test
191
   */
192
  public MNodeServiceTest(String name) {
193
    super(name);
194
195
  }
196 6309 cjones
197 6354 cjones
  /**
198
   * Initial blank test
199
   */
200
  public void initialize() {
201
    assertTrue(1 == 1);
202
203
  }
204
205
  /**
206
   * Test getting a known object
207
   */
208
  public void testGet() {
209 6309 cjones
    printTestHeader("testGet");
210
211 6354 cjones
    try {
212
      Session session = getTestSession();
213
      Identifier guid = new Identifier();
214
      guid.setValue("testGet." + System.currentTimeMillis());
215
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
216
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
217 6542 leinfelder
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
218
      InputStream result = MNodeService.getInstance(request).get(session, guid);
219 6354 cjones
      // go back to beginning of original stream
220
      object.reset();
221
      // check
222
      assertTrue(object.available() > 0);
223
      assertTrue(result.available() > 0);
224
      assertTrue(IOUtils.contentEquals(result, object));
225
226 6309 cjones
    } catch (UnsupportedEncodingException e) {
227 6354 cjones
      e.printStackTrace();
228
      fail("Unexpected error: " + e.getMessage());
229 6309 cjones
230
    } catch (InvalidToken e) {
231 6354 cjones
      e.printStackTrace();
232
      fail("Unexpected error: " + e.getMessage());
233
234 6309 cjones
    } catch (ServiceFailure e) {
235 6354 cjones
      e.printStackTrace();
236
      fail("Unexpected error: " + e.getMessage());
237
238 6309 cjones
    } catch (NotAuthorized e) {
239 6354 cjones
      e.printStackTrace();
240
      fail("Unexpected error: " + e.getMessage());
241
242 6309 cjones
    } catch (IdentifierNotUnique e) {
243 6354 cjones
      e.printStackTrace();
244
      fail("Unexpected error: " + e.getMessage());
245
246 6309 cjones
    } catch (UnsupportedType e) {
247 6354 cjones
      e.printStackTrace();
248
      fail("Unexpected error: " + e.getMessage());
249
250 6309 cjones
    } catch (InsufficientResources e) {
251 6354 cjones
      e.printStackTrace();
252
      fail("Unexpected error: " + e.getMessage());
253
254 6309 cjones
    } catch (InvalidSystemMetadata e) {
255 6354 cjones
      e.printStackTrace();
256
      fail("Unexpected error: " + e.getMessage());
257
258 6309 cjones
    } catch (NotImplemented e) {
259 6354 cjones
      e.printStackTrace();
260
      fail("Unexpected error: " + e.getMessage());
261
262 6309 cjones
    } catch (InvalidRequest e) {
263 6354 cjones
      e.printStackTrace();
264
      fail("Unexpected error: " + e.getMessage());
265
266 6309 cjones
    } catch (NotFound e) {
267 6354 cjones
      e.printStackTrace();
268
      fail("Unexpected error: " + e.getMessage());
269
270 6309 cjones
    } catch (Exception e) {
271 6354 cjones
      e.printStackTrace();
272
      fail("Unexpected error: " + e.getMessage());
273
274 6309 cjones
    }
275
276 6354 cjones
  }
277 6309 cjones
278 6354 cjones
  /**
279
   * Test getting the system metadata of an object
280
   */
281
  public void testGetSystemMetadata() {
282 6309 cjones
    printTestHeader("testGetSystemMetadata");
283
284
    try {
285 6354 cjones
      Session session = getTestSession();
286
      Identifier guid = new Identifier();
287
      guid.setValue("testGetSystemMetadata." + System.currentTimeMillis());
288
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
289
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
290 6542 leinfelder
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
291
      SystemMetadata newsysmeta = MNodeService.getInstance(request).getSystemMetadata(session, pid);
292 6354 cjones
      assertEquals(newsysmeta.getIdentifier().getValue(), sysmeta.getIdentifier().getValue());
293 9039 tao
      assertEquals(newsysmeta.getSeriesId(), null);
294 6354 cjones
295 6309 cjones
    } catch (UnsupportedEncodingException e) {
296 6354 cjones
      e.printStackTrace();
297
      fail("Unexpected error: " + e.getMessage());
298 6309 cjones
299
    } catch (InvalidToken e) {
300 6354 cjones
      e.printStackTrace();
301
      fail("Unexpected error: " + e.getMessage());
302 6309 cjones
303
    } catch (ServiceFailure e) {
304 6354 cjones
      e.printStackTrace();
305
      fail("Unexpected error: " + e.getMessage());
306 6309 cjones
307
    } catch (NotAuthorized e) {
308 6354 cjones
      e.printStackTrace();
309
      fail("Unexpected error: " + e.getMessage());
310 6309 cjones
311
    } catch (IdentifierNotUnique e) {
312 6354 cjones
      e.printStackTrace();
313
      fail("Unexpected error: " + e.getMessage());
314
315 6309 cjones
    } catch (UnsupportedType e) {
316 6354 cjones
      e.printStackTrace();
317
      fail("Unexpected error: " + e.getMessage());
318 6309 cjones
319
    } catch (InsufficientResources e) {
320 6354 cjones
      e.printStackTrace();
321
      fail("Unexpected error: " + e.getMessage());
322 6309 cjones
323
    } catch (InvalidSystemMetadata e) {
324 6354 cjones
      e.printStackTrace();
325
      fail("Unexpected error: " + e.getMessage());
326 6309 cjones
327
    } catch (NotImplemented e) {
328 6354 cjones
      e.printStackTrace();
329
      fail("Unexpected error: " + e.getMessage());
330 6309 cjones
331
    } catch (InvalidRequest e) {
332 6354 cjones
      e.printStackTrace();
333
      fail("Unexpected error: " + e.getMessage());
334 6309 cjones
335
    } catch (NotFound e) {
336 6354 cjones
      e.printStackTrace();
337
      fail("Unexpected error: " + e.getMessage());
338 6309 cjones
339
    } catch (Exception e) {
340 6354 cjones
      e.printStackTrace();
341
      fail("Unexpected error: " + e.getMessage());
342 6309 cjones
343
    }
344
345 6354 cjones
  }
346 6309 cjones
347 6354 cjones
  /**
348
   * Test object creation
349
   */
350
  public void testCreate() {
351 6309 cjones
    printTestHeader("testCreate");
352
353 6354 cjones
    try {
354
      Session session = getTestSession();
355
      Identifier guid = new Identifier();
356
      guid.setValue("testCreate." + System.currentTimeMillis());
357
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
358
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
359 6542 leinfelder
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
360 6354 cjones
      assertEquals(guid.getValue(), pid.getValue());
361 9049 tao
362
      Thread.sleep(1000);
363
      try {
364
          Identifier guid2 = new Identifier();
365
          guid2.setValue("testCreate." + System.currentTimeMillis());
366
          SystemMetadata sysmeta2 = createSystemMetadata(guid2, session.getSubject(), object);
367
          sysmeta2.setSeriesId(guid);
368
          MNodeService.getInstance(request).create(session, guid2, object, sysmeta2);
369
          fail("It should fail since the system metadata using an existing id as the sid");
370
      } catch (InvalidSystemMetadata ee) {
371
372
      }
373
374
      Thread.sleep(1000);
375
      try {
376
          Identifier guid3 = new Identifier();
377
          guid3.setValue("testCreate." + System.currentTimeMillis());
378
          SystemMetadata sysmeta3 = createSystemMetadata(guid3, session.getSubject(), object);
379
          sysmeta3.setSeriesId(guid3);
380
          MNodeService.getInstance(request).create(session, guid3, object, sysmeta3);
381
          fail("It should fail since the system metadata using the pid as the sid");
382
      } catch (InvalidSystemMetadata ee) {
383
384
      }
385 6309 cjones
    } catch (UnsupportedEncodingException e) {
386 6354 cjones
      e.printStackTrace();
387
      fail("Unexpected error: " + e.getMessage());
388 6309 cjones
389
    } catch (InvalidToken e) {
390 6354 cjones
      e.printStackTrace();
391
      fail("Unexpected error: " + e.getMessage());
392 6309 cjones
393
    } catch (ServiceFailure e) {
394 6354 cjones
      e.printStackTrace();
395
      fail("Unexpected error: " + e.getMessage());
396 6309 cjones
397
    } catch (NotAuthorized e) {
398 6354 cjones
      e.printStackTrace();
399
      fail("Unexpected error: " + e.getMessage());
400 6309 cjones
401
    } catch (IdentifierNotUnique e) {
402 6354 cjones
      e.printStackTrace();
403
      fail("Unexpected error: " + e.getMessage());
404 6309 cjones
405
    } catch (UnsupportedType e) {
406 6354 cjones
      e.printStackTrace();
407
      fail("Unexpected error: " + e.getMessage());
408 6309 cjones
409
    } catch (InsufficientResources e) {
410 6354 cjones
      e.printStackTrace();
411
      fail("Unexpected error: " + e.getMessage());
412 6309 cjones
413
    } catch (InvalidSystemMetadata e) {
414 6354 cjones
      e.printStackTrace();
415
      fail("Unexpected error: " + e.getMessage());
416 6309 cjones
417
    } catch (NotImplemented e) {
418 6354 cjones
      e.printStackTrace();
419
      fail("Unexpected error: " + e.getMessage());
420 6309 cjones
421
    } catch (InvalidRequest e) {
422 6354 cjones
      e.printStackTrace();
423
      fail("Unexpected error: " + e.getMessage());
424 6309 cjones
425
    } catch (Exception e) {
426 6354 cjones
      e.printStackTrace();
427
      fail("Unexpected error: " + e.getMessage());
428 6309 cjones
429
    }
430
431
  }
432
433 6354 cjones
  /**
434
   * test object deletion
435
   */
436
  public void testDelete() {
437 6309 cjones
    printTestHeader("testDelete");
438
439 6354 cjones
    try {
440
      Session session = getTestSession();
441
      Identifier guid = new Identifier();
442
      guid.setValue("testDelete." + System.currentTimeMillis());
443
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
444
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
445 6542 leinfelder
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
446 7163 leinfelder
447
      // use MN admin to delete
448
      session = getMNSession();
449 6542 leinfelder
      Identifier deletedPid = MNodeService.getInstance(request).delete(session, pid);
450 6333 leinfelder
      assertEquals(pid.getValue(), deletedPid.getValue());
451 7160 leinfelder
      // check that we cannot get the object
452 7163 leinfelder
      session = getTestSession();
453 7160 leinfelder
      InputStream deletedObject = null;
454
      try {
455 7163 leinfelder
    	  deletedObject = MNodeService.getInstance(request).get(session, deletedPid);
456 7160 leinfelder
      } catch (NotFound nf) {
457
    	  // this is expected
458
      }
459
	  assertNull(deletedObject);
460 6309 cjones
461 6354 cjones
    } catch (UnsupportedEncodingException e) {
462
      e.printStackTrace();
463
464 6324 leinfelder
    } catch (Exception e) {
465 6354 cjones
      e.printStackTrace();
466
      fail("Unexpected error: " + e.getMessage());
467 6309 cjones
468 6324 leinfelder
    }
469 6309 cjones
470 6354 cjones
  }
471 9351 tao
472
  public void testArchive() throws Exception {
473
          Session session = getTestSession();
474
          Identifier guid = new Identifier();
475
          guid.setValue("testUpdate." + System.currentTimeMillis());
476
          InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
477
          SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
478
          Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
479
          MNodeService.getInstance(request).archive(session, guid);
480
          SystemMetadata result = MNodeService.getInstance(request).getSystemMetadata(session, guid);
481
          assertTrue(result.getArchived());
482 9377 tao
          System.out.println("the identifier is ==================="+pid.getValue());
483 9351 tao
  }
484 6309 cjones
485 6354 cjones
  /**
486
   * Test object updating
487
   */
488
  public void testUpdate() {
489 6309 cjones
    printTestHeader("testUpdate");
490
491 6354 cjones
    try {
492
      Session session = getTestSession();
493
      Identifier guid = new Identifier();
494
      guid.setValue("testUpdate." + System.currentTimeMillis());
495
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
496
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
497
      Identifier newPid = new Identifier();
498 6596 leinfelder
      newPid.setValue("testUpdate." + (System.currentTimeMillis() + 1)); // ensure it is different from original
499 6354 cjones
      Identifier pid =
500 6542 leinfelder
        MNodeService.getInstance(request).create(session, guid, object, sysmeta);
501 6338 cjones
502 6354 cjones
      SystemMetadata newSysMeta = createSystemMetadata(newPid, session.getSubject(), object);
503 9201 tao
      newSysMeta.setArchived(true);
504 9282 tao
      System.out.println("the pid is =======!!!!!!!!!!!! "+pid.getValue());
505 6354 cjones
      // do the update
506
      Identifier updatedPid =
507 6542 leinfelder
        MNodeService.getInstance(request).update(session, pid, object, newPid, newSysMeta);
508 6338 cjones
509 6354 cjones
      // get the updated system metadata
510 6338 cjones
      SystemMetadata updatedSysMeta =
511 6542 leinfelder
        MNodeService.getInstance(request).getSystemMetadata(session, updatedPid);
512 6338 cjones
513 6354 cjones
      assertEquals(updatedPid.getValue(), newPid.getValue());
514 9201 tao
      //assertTrue(updatedSysMeta.getObsolete(0).getValue().equals(pid.getValue()));
515
      //assertTrue(updatedSysMeta.getDerivedFrom(0).getValue().equals(pid.getValue()));
516 6354 cjones
517 9201 tao
      //try to update an archived object and need to get an exception
518
      Identifier newPid2 = new Identifier();
519
      newPid2.setValue("testUpdate." + (System.currentTimeMillis() + 2)); // ensure it is different from original
520
      SystemMetadata newSysMeta2 = createSystemMetadata(newPid2, session.getSubject(), object);
521
      try {
522
           updatedPid =
523
                  MNodeService.getInstance(request).update(session, newPid, object, newPid2, newSysMeta2);
524
           fail("update an archived object should get an invalid request exception");
525
      } catch (Exception ee) {
526
          assertTrue( ee instanceof InvalidRequest);
527
      }
528 9264 tao
529
      //update the authoritative node on the existing pid (newPid)
530 9282 tao
      SystemMetadata meta = MNodeService.getInstance(request).getSystemMetadata(session, newPid);
531
      BigInteger version = meta.getSerialVersion();
532 9285 tao
      version = version.add(BigInteger.ONE);
533 9282 tao
      newSysMeta.setSerialVersion(version);
534 9264 tao
      NodeReference newMN = new NodeReference();
535
      newMN.setValue("urn:node:river1");
536
      newSysMeta.setAuthoritativeMemberNode(newMN);
537
      newSysMeta.setArchived(false);
538
      MNodeService.getInstance(request).updateSystemMetadata(session, newPid, newSysMeta);
539
      try {
540
          updatedPid =
541
                 MNodeService.getInstance(request).update(session, newPid, object, newPid2, newSysMeta2);
542
          fail("update an object on non-authoritatvie node should get anexception");
543
     } catch (Exception ee) {
544
         assertTrue( ee instanceof NotAuthorized);
545
     }
546
     //cn can succeed even though it updates an object on the non-authoritative node.
547
     Session cnSession = getCNSession();
548
     updatedPid =
549
             MNodeService.getInstance(request).update(cnSession, newPid, object, newPid2, newSysMeta2);
550
     assertEquals(updatedPid.getValue(), newPid2.getValue());
551 6309 cjones
    } catch (UnsupportedEncodingException e) {
552 6354 cjones
      e.printStackTrace();
553
      fail("Unexpected error: " + e.getMessage());
554 6309 cjones
555
    } catch (InvalidToken e) {
556 6354 cjones
      e.printStackTrace();
557
      fail("Unexpected error: " + e.getMessage());
558 6309 cjones
559
    } catch (ServiceFailure e) {
560 6354 cjones
      e.printStackTrace();
561
      fail("Unexpected error: " + e.getMessage());
562 6309 cjones
563
    } catch (NotAuthorized e) {
564 6354 cjones
      e.printStackTrace();
565
      fail("Unexpected error: " + e.getMessage());
566 6309 cjones
567
    } catch (IdentifierNotUnique e) {
568 6354 cjones
      e.printStackTrace();
569
      fail("Unexpected error: " + e.getMessage());
570 6309 cjones
571
    } catch (UnsupportedType e) {
572 6354 cjones
      e.printStackTrace();
573
      fail("Unexpected error: " + e.getMessage());
574 6309 cjones
575
    } catch (InsufficientResources e) {
576 6354 cjones
      e.printStackTrace();
577
      fail("Unexpected error: " + e.getMessage());
578 6309 cjones
579
    } catch (InvalidSystemMetadata e) {
580 6354 cjones
      e.printStackTrace();
581
      fail("Unexpected error: " + e.getMessage());
582 6309 cjones
583
    } catch (NotImplemented e) {
584 6354 cjones
      e.printStackTrace();
585
      fail("Unexpected error: " + e.getMessage());
586 6309 cjones
587
    } catch (InvalidRequest e) {
588 6354 cjones
      e.printStackTrace();
589
      fail("Unexpected error: " + e.getMessage());
590 6309 cjones
591
    } catch (Exception e) {
592 6354 cjones
      e.printStackTrace();
593
      fail("Unexpected error: " + e.getMessage());
594 6309 cjones
595
    }
596 6354 cjones
  }
597 9377 tao
598
599
  /**
600
   * Test object updating
601
   */
602
  public void testUpdateSciMetadata() {
603
    printTestHeader("testUpdate");
604
605
    try {
606
      String st1="<eml:eml xmlns:eml=\"eml://ecoinformatics.org/eml-2.1.1\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" packageId=\"tao.13397.1\" system=\"knb\" xsi:schemaLocation=\"eml://ecoinformatics.org/eml-2.1.1 eml.xsd\">"
607
                  +"<access authSystem=\"knb\" order=\"allowFirst\">"
608
                  +"<allow><principal>public</principal><permission>read</permission></allow></access>"
609
                  +"<dataset><title>test</title><creator id=\"1445543475577\"><individualName><surName>test</surName></individualName></creator>"
610
                  +"<contact id=\"1445543479900\"><individualName><surName>test</surName></individualName></contact></dataset></eml:eml>";
611
      Session session = getTestSession();
612
      Identifier guid = new Identifier();
613
      guid.setValue("testUpdate." + System.currentTimeMillis());
614
      InputStream object = new ByteArrayInputStream(st1.getBytes("UTF-8"));
615
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
616
      sysmeta.setFormatId(ObjectFormatCache.getInstance().getFormat("eml://ecoinformatics.org/eml-2.1.1").getFormatId());
617
      MNodeService.getInstance(request).create(session, guid, object, sysmeta);
618
619
      String st2="<eml:eml xmlns:eml=\"eml://ecoinformatics.org/eml-2.1.1\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" packageId=\"tao.13397.1\" system=\"knb\" xsi:schemaLocation=\"eml://ecoinformatics.org/eml-2.1.1 eml.xsd\">"
620
              +"<access authSystem=\"knb\" order=\"allowFirst\">"
621
              +"<allow><principal>public</principal><permission>read</permission></allow></access>"
622
              +"<dataset><title>test2</title><creator id=\"1445543475577\"><individualName><surName>test</surName></individualName></creator>"
623
              +"<contact id=\"1445543479900\"><individualName><surName>test</surName></individualName></contact></dataset></eml:eml>";
624
      Identifier newPid = new Identifier();
625
      newPid.setValue("testUpdate." + (System.currentTimeMillis() + 1)); // ensure it is different from original
626
      System.out.println("=================the pid is "+newPid.getValue());
627
      object = new ByteArrayInputStream(st2.getBytes("UTF-8"));
628
      SystemMetadata sysmeta2 = createSystemMetadata(newPid, session.getSubject(), object);
629
      sysmeta2.setFormatId(ObjectFormatCache.getInstance().getFormat("eml://ecoinformatics.org/eml-2.1.1").getFormatId());
630
      //sysmeta2.setObsoletes(guid);
631
      Checksum sum1= sysmeta2.getChecksum();
632
      System.out.println("the checksum before sending is "+sum1.getValue());
633
      object = new ByteArrayInputStream(st2.getBytes("UTF-8"));
634
      MNodeService.getInstance(request).update(session, guid, object, newPid, sysmeta2);
635
      SystemMetadata meta = MNodeService.getInstance(request).getSystemMetadata(session, newPid);
636
      System.out.println("the checksum getting from the server is "+meta.getChecksum().getValue());
637
      assertTrue(meta.getChecksum().getValue().equals(sum1.getValue()));
638
    } catch (UnsupportedEncodingException e) {
639
      e.printStackTrace();
640
      fail("Unexpected error: " + e.getMessage());
641 6309 cjones
642 9377 tao
    } catch (InvalidToken e) {
643
      e.printStackTrace();
644
      fail("Unexpected error: " + e.getMessage());
645
646
    } catch (ServiceFailure e) {
647
      e.printStackTrace();
648
      fail("Unexpected error: " + e.getMessage());
649
650
    } catch (NotAuthorized e) {
651
      e.printStackTrace();
652
      fail("Unexpected error: " + e.getMessage());
653
654
    } catch (IdentifierNotUnique e) {
655
      e.printStackTrace();
656
      fail("Unexpected error: " + e.getMessage());
657
658
    } catch (UnsupportedType e) {
659
      e.printStackTrace();
660
      fail("Unexpected error: " + e.getMessage());
661
662
    } catch (InsufficientResources e) {
663
      e.printStackTrace();
664
      fail("Unexpected error: " + e.getMessage());
665
666
    } catch (InvalidSystemMetadata e) {
667
      e.printStackTrace();
668
      fail("Unexpected error: " + e.getMessage());
669
670
    } catch (NotImplemented e) {
671
      e.printStackTrace();
672
      fail("Unexpected error: " + e.getMessage());
673
674
    } catch (InvalidRequest e) {
675
      e.printStackTrace();
676
      fail("Unexpected error: " + e.getMessage());
677
678
    } catch (Exception e) {
679
      e.printStackTrace();
680
      fail("Unexpected error: " + e.getMessage());
681
682
    }
683
  }
684
685 6354 cjones
  /**
686
   * We currently expect this unit test to fail because it should rely on a different member node
687
   * to retrieve the object from. Currently it gets the object from itself and throws
688
   * and expected error for duplicate entry.
689
   *
690
   */
691
  public void testReplicate() {
692
      printTestHeader("testReplicate");
693
      try {
694
        Session session = getTestSession();
695
        Identifier guid = new Identifier();
696
        guid.setValue("testReplicate." + System.currentTimeMillis());
697
        InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
698
        SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
699
        // save locally
700 6542 leinfelder
        Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
701 6354 cjones
        // get our node reference (attempting to replicate with self)
702 6542 leinfelder
        NodeReference sourceNode = MNodeService.getInstance(request).getCapabilities().getIdentifier();
703 6354 cjones
        // attempt to replicate with ourselves -- this should fail!
704
      boolean result = false;
705
      try {
706 6542 leinfelder
        result = MNodeService.getInstance(request).replicate(session, sysmeta, sourceNode);
707 6354 cjones
      } catch (Exception inu) {
708
        // we are expecting this to fail since we already have the doc
709
        result = true;
710
      }
711
      assertTrue(result);
712
      } catch (Exception e) {
713
        e.printStackTrace();
714
      fail("Probably not yet implemented: " + e.getMessage());
715
    }
716
  }
717 6309 cjones
718 6354 cjones
  /**
719
   * Test describing an object
720
   */
721
  public void testDescribe() {
722 6314 cjones
    printTestHeader("testDescribe");
723 6309 cjones
724
    try {
725 6354 cjones
      Session session = getTestSession();
726
      Identifier guid = new Identifier();
727
      guid.setValue("testGetSystemMetadata." + System.currentTimeMillis());
728
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
729
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
730 6542 leinfelder
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
731
      DescribeResponse describeResponse = MNodeService.getInstance(request).describe(session, pid);
732 6354 cjones
      assertEquals(describeResponse.getDataONE_Checksum().getValue(), sysmeta.getChecksum().getValue());
733 6597 leinfelder
      assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), sysmeta.getFormatId().getValue());
734 6354 cjones
735 6309 cjones
    } catch (UnsupportedEncodingException e) {
736 6354 cjones
      e.printStackTrace();
737
      fail("Unexpected error: " + e.getMessage());
738 6309 cjones
739
    } catch (InvalidToken e) {
740 6354 cjones
      e.printStackTrace();
741
      fail("Unexpected error: " + e.getMessage());
742 6309 cjones
743
    } catch (ServiceFailure e) {
744 6354 cjones
      e.printStackTrace();
745
      fail("Unexpected error: " + e.getMessage());
746 6309 cjones
747
    } catch (NotAuthorized e) {
748 6354 cjones
      e.printStackTrace();
749
      fail("Unexpected error: " + e.getMessage());
750 6309 cjones
751
    } catch (IdentifierNotUnique e) {
752 6354 cjones
      e.printStackTrace();
753
      fail("Unexpected error: " + e.getMessage());
754
755 6309 cjones
    } catch (UnsupportedType e) {
756 6354 cjones
      e.printStackTrace();
757
      fail("Unexpected error: " + e.getMessage());
758 6309 cjones
759
    } catch (InsufficientResources e) {
760 6354 cjones
      e.printStackTrace();
761
      fail("Unexpected error: " + e.getMessage());
762 6309 cjones
763
    } catch (InvalidSystemMetadata e) {
764 6354 cjones
      e.printStackTrace();
765
      fail("Unexpected error: " + e.getMessage());
766 6309 cjones
767
    } catch (NotImplemented e) {
768 6354 cjones
      e.printStackTrace();
769
      fail("Unexpected error: " + e.getMessage());
770 6309 cjones
771
    } catch (InvalidRequest e) {
772 6354 cjones
      e.printStackTrace();
773
      fail("Unexpected error: " + e.getMessage());
774 6309 cjones
775
    } catch (NotFound e) {
776 6354 cjones
      e.printStackTrace();
777
      fail("Unexpected error: " + e.getMessage());
778 6309 cjones
779
    } catch (Exception e) {
780 6354 cjones
      e.printStackTrace();
781
      fail("Unexpected error: " + e.getMessage());
782 6309 cjones
783
    }
784 6354 cjones
  }
785 6309 cjones
786 6354 cjones
  /**
787
   * Test getting the checksum of an object
788
   */
789
  public void testGetChecksum() {
790 6309 cjones
    printTestHeader("testGetChecksum");
791
792 6354 cjones
    try {
793
      Session session = getTestSession();
794
      Identifier guid = new Identifier();
795
      guid.setValue("testGetChecksum." + System.currentTimeMillis());
796
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
797
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
798 6542 leinfelder
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
799
      Checksum checksum = MNodeService.getInstance(request).getChecksum(session, pid, "MD5");
800 6354 cjones
      assertEquals(checksum.getValue(), sysmeta.getChecksum().getValue());
801 6309 cjones
802 6354 cjones
    } catch (UnsupportedEncodingException e) {
803
      e.printStackTrace();
804
      fail("Unexpected error: " + e.getMessage());
805 6309 cjones
806
    } catch (InvalidToken e) {
807 6354 cjones
      e.printStackTrace();
808
      fail("Unexpected error: " + e.getMessage());
809 6309 cjones
810
    } catch (ServiceFailure e) {
811 6354 cjones
      e.printStackTrace();
812
      fail("Unexpected error: " + e.getMessage());
813 6309 cjones
814
    } catch (NotAuthorized e) {
815 6354 cjones
      e.printStackTrace();
816
      fail("Unexpected error: " + e.getMessage());
817 6309 cjones
818
    } catch (IdentifierNotUnique e) {
819 6354 cjones
      e.printStackTrace();
820
      fail("Unexpected error: " + e.getMessage());
821 6309 cjones
822
    } catch (UnsupportedType e) {
823 6354 cjones
      e.printStackTrace();
824
      fail("Unexpected error: " + e.getMessage());
825 6309 cjones
826
    } catch (InsufficientResources e) {
827 6354 cjones
      e.printStackTrace();
828
      fail("Unexpected error: " + e.getMessage());
829 6309 cjones
830
    } catch (InvalidSystemMetadata e) {
831 6354 cjones
      e.printStackTrace();
832
      fail("Unexpected error: " + e.getMessage());
833 6309 cjones
834
    } catch (NotImplemented e) {
835 6354 cjones
      e.printStackTrace();
836
      fail("Unexpected error: " + e.getMessage());
837 6309 cjones
838
    } catch (InvalidRequest e) {
839 6354 cjones
      e.printStackTrace();
840
      fail("Unexpected error: " + e.getMessage());
841 6309 cjones
842
    } catch (NotFound e) {
843 6354 cjones
      e.printStackTrace();
844
      fail("Unexpected error: " + e.getMessage());
845 6309 cjones
846
    } catch (Exception e) {
847 6354 cjones
      e.printStackTrace();
848
      fail("Unexpected error: " + e.getMessage());
849 6309 cjones
850
    }
851 6354 cjones
852
  }
853 6309 cjones
854 6354 cjones
  /**
855
   * Testing listing objects on the Member Node
856
   */
857
  public void testListObjects() {
858
      printTestHeader("testListObjects");
859
860
      try {
861
862
        Session session = getTestSession();
863
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
864
        Date startTime = sdf.parse("2010-01-01");
865
        Date endTime = new Date();
866
        ObjectFormatIdentifier objectFormatId = null;
867
        boolean replicaStatus = false;
868
        int start = 0;
869
        int count = 1;
870
871
        // insert at least one object
872
        testCreate();
873
        // now check that we have at least one
874
        ObjectList objectList =
875 6542 leinfelder
          MNodeService.getInstance(request).listObjects(session, startTime, endTime,
876 8810 leinfelder
              objectFormatId, null, replicaStatus, start, count);
877 6354 cjones
        assertNotNull(objectList);
878
        assertTrue(objectList.getCount() == count);
879
        assertTrue(objectList.getStart() == 0);
880 9158 tao
        assertTrue(objectList.getTotal() >= 1);
881 6354 cjones
882
      } catch (Exception e) {
883
        e.printStackTrace();
884
        fail("Unexpected error: " + e.getMessage());
885
886
      }
887
  }
888 6309 cjones
889 6354 cjones
  public void testGetCapabilities() {
890
      printTestHeader("testGetCapabilities");
891
    try {
892 6542 leinfelder
      Node node = MNodeService.getInstance(request).getCapabilities();
893 6942 cjones
      ByteArrayOutputStream baos = new ByteArrayOutputStream();
894
      TypeMarshaller.marshalTypeToOutputStream(node, baos);
895 6354 cjones
      assertNotNull(node);
896
      // TODO: should probably test other parts of the node information
897 6942 cjones
898
    } catch (JiBXException e) {
899
        e.printStackTrace();
900
        fail("The node instance couldn't be parsed correctly:" + e.getMessage());
901
902
    } catch (IOException e) {
903
        e.printStackTrace();
904
        fail("The node instance couldn't be read correctly:" + e.getMessage());
905
906 6354 cjones
    } catch (Exception e) {
907 6942 cjones
        e.printStackTrace();
908
        fail("Probably not yet implemented: " + e.getMessage());
909
910 6354 cjones
    }
911
912
  }
913 6309 cjones
914 6354 cjones
  public void testPing() {
915 6309 cjones
916 6354 cjones
    try {
917 6804 leinfelder
      Date mnDate = MNodeService.getInstance(request).ping();
918
      assertTrue(mnDate != null);
919 6354 cjones
920 6309 cjones
    } catch (NotImplemented e) {
921 6354 cjones
      e.printStackTrace();
922
      fail("Unexpected error: " + e.getMessage());
923 6309 cjones
924
    } catch (ServiceFailure e) {
925 6354 cjones
      e.printStackTrace();
926
      fail("Unexpected error: " + e.getMessage());
927 6309 cjones
928 6612 leinfelder
    }  catch (InsufficientResources e) {
929 6354 cjones
      e.printStackTrace();
930
      fail("Unexpected error: " + e.getMessage());
931 6309 cjones
932
    }
933 6354 cjones
934
  }
935 6309 cjones
936 6354 cjones
  public void testSynchronizationFailed() {
937
    printTestHeader("testSynchronizationFailed");
938
    try {
939
        Session session = getTestSession();
940
941
        // create the object
942
        Identifier pid = new Identifier();
943
        pid.setValue("testSynchronizationFailed." + System.currentTimeMillis());
944
        InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
945
        SystemMetadata sysmeta = createSystemMetadata(pid, session.getSubject(), object);
946 6542 leinfelder
        Identifier retPid = MNodeService.getInstance(request).create(session, pid, object, sysmeta);
947 6354 cjones
        assertEquals(retPid.getValue(), pid.getValue());
948
949 7163 leinfelder
        // pretend the sync failed, act as CN
950 6354 cjones
      SynchronizationFailed syncFailed =
951
        new SynchronizationFailed("0000", "Testing Synch Failure");
952 6366 leinfelder
      syncFailed.setPid(pid.getValue());
953 7163 leinfelder
      session = getCNSession();
954 6542 leinfelder
      MNodeService.getInstance(request).synchronizationFailed(session, syncFailed );
955 6354 cjones
    } catch (Exception e) {
956
      e.printStackTrace();
957
        fail("Unexpected error: " + e.getMessage());
958
    }
959 6333 leinfelder
960 6354 cjones
  }
961 6309 cjones
962 6605 cjones
  public void testSystemMetadataChanged() {
963
      printTestHeader("testSystemMetadataChanged");
964
      try {
965
          Session session = getTestSession();
966
967
          // create the object
968
          Identifier pid = new Identifier();
969
          pid.setValue("testSystemMetadataChanged." + System.currentTimeMillis());
970 9052 tao
          Identifier sid = new Identifier();
971
          sid.setValue("testSystemMetadataChangedSid."+System.currentTimeMillis());
972 6605 cjones
          InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
973
          SystemMetadata sysmeta = createSystemMetadata(pid, session.getSubject(), object);
974 9052 tao
          sysmeta.setSeriesId(sid);
975 6605 cjones
          Identifier retPid = MNodeService.getInstance(request).create(session, pid, object, sysmeta);
976
          assertEquals(retPid.getValue(), pid.getValue());
977
978
          // pretend the system metadata changed on the CN
979
          MNodeService.getInstance(request).systemMetadataChanged(session,
980
                  retPid, 5000L, Calendar.getInstance().getTime());
981 9052 tao
          MNodeService.getInstance(request).systemMetadataChanged(session,
982
                  sid, 5000L, Calendar.getInstance().getTime());
983
          edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).systemMetadataChanged(session,
984
                  retPid, 5000L, Calendar.getInstance().getTime());
985
          edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).systemMetadataChanged(session,
986
                  sid, 5000L, Calendar.getInstance().getTime());
987 6605 cjones
988
      } catch (Exception e) {
989
          if (e instanceof NotAuthorized) {
990
              // only CN subjects can call this
991
              // TODO: use a CN certificate in the tests
992
          } else {
993
              fail("Unexpected error: " + e.getMessage());
994
995
          }
996
      }
997
998
    }
999
1000 6354 cjones
  public void testGetLogRecords() {
1001 6312 cjones
    printTestHeader("testLogRecords");
1002 6309 cjones
1003 6698 leinfelder
    try {
1004
	    Log log = null;
1005 7261 leinfelder
	    Session session = getCNSession();
1006 6698 leinfelder
	    Date fromDate = new Date();
1007
	    Calendar calendar = Calendar.getInstance();
1008
	    calendar.setTime(fromDate);
1009
	    calendar.roll(Calendar.YEAR, false);
1010
	    fromDate = calendar.getTime();
1011
	    Date toDate = new Date();
1012
	    Event event = Event.CREATE;
1013
	    int start = 0;
1014
	    int count = 1;
1015 6309 cjones
1016 6542 leinfelder
      log = MNodeService.getInstance(request).getLogRecords(session, fromDate, toDate,
1017 8810 leinfelder
        event.xmlValue(), null, start, count);
1018 6354 cjones
1019
      assertNotNull(log);
1020
      assertTrue(log.getCount() == count);
1021
      assertTrue(log.getStart() == start);
1022
      assertTrue(log.getTotal() >= 1);
1023
1024 6698 leinfelder
    } catch (Exception e) {
1025 6354 cjones
      e.printStackTrace();
1026
      fail("Unexpected error: " + e.getMessage());
1027 6309 cjones
1028
    }
1029 6354 cjones
  }
1030 6309 cjones
1031 6354 cjones
  /**
1032
   * Testing setting access on a known object
1033
   */
1034
  public void testSetAccessPolicy() {
1035 6309 cjones
    printTestHeader("testSetAccess");
1036
1037 6577 cjones
    //boolean accessWasSet = false;
1038
    //
1039
    //try {
1040
    //  // create an object to set access on
1041
    //  Session session = getTestSession();
1042
    //  Identifier guid = new Identifier();
1043
    //  guid.setValue("testSetAccess." + System.currentTimeMillis());
1044
    //  InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1045
    //  SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1046
    //  Identifier pid =
1047
    //    MNodeService.getInstance(request).create(session, guid, object, sysmeta);
1048
    //  // set the access
1049
    //  AccessPolicy accessPolicy = new AccessPolicy();
1050
    //  AccessRule allow = new AccessRule();
1051
    //  allow.addPermission(Permission.WRITE);
1052
    //  Subject publicSubject = new Subject();
1053
    //  publicSubject.setValue(Constants.SUBJECT_PUBLIC);
1054
    //  allow.addSubject(publicSubject);
1055
    //  accessPolicy.addAllow(allow);
1056
    //
1057
    //  accessWasSet =
1058
    //    MNodeService.getInstance(request).setAccessPolicy(session, pid, accessPolicy);
1059
    //  assertTrue(accessWasSet);
1060
    //  // test that it is enforced
1061
    //  session.setSubject(publicSubject);
1062
    //  boolean isAuthorized = MNodeService.getInstance(request).isAuthorized(session, pid, Permission.WRITE);
1063
    //  assertTrue(isAuthorized);
1064
    //
1065
    //} catch (UnsupportedEncodingException e) {
1066
    //  e.printStackTrace();
1067
    //
1068
    //} catch (InvalidToken e) {
1069
    //  e.printStackTrace();
1070
    //  fail("Unexpected error: " + e.getMessage());
1071
    //
1072
    //} catch (ServiceFailure e) {
1073
    //  e.printStackTrace();
1074
    //  fail("Unexpected error: " + e.getMessage());
1075
    //
1076
    //} catch (NotAuthorized e) {
1077
    //  e.printStackTrace();
1078
    //  fail("Unexpected error: " + e.getMessage());
1079
    //
1080
    //} catch (IdentifierNotUnique e) {
1081
    //  e.printStackTrace();
1082
    //  fail("Unexpected error: " + e.getMessage());
1083
    //
1084
    //} catch (UnsupportedType e) {
1085
    //  e.printStackTrace();
1086
    //  fail("Unexpected error: " + e.getMessage());
1087
    //
1088
    //} catch (InsufficientResources e) {
1089
    //  e.printStackTrace();
1090
    //  fail("Unexpected error: " + e.getMessage());
1091
    //
1092
    //} catch (InvalidSystemMetadata e) {
1093
    //  e.printStackTrace();
1094
    //  fail("Unexpected error: " + e.getMessage());
1095
    //
1096
    //} catch (NotImplemented e) {
1097
    //  e.printStackTrace();
1098
    //  fail("Unexpected error: " + e.getMessage());
1099
    //
1100
    //} catch (InvalidRequest e) {
1101
    //  e.printStackTrace();
1102
    //  fail("Unexpected error: " + e.getMessage());
1103
    //
1104
    //} catch (NotFound e) {
1105
    //  e.printStackTrace();
1106
    //  fail("Unexpected error: " + e.getMessage());
1107
    //
1108
    //} catch (Exception e) {
1109
    //  e.printStackTrace();
1110
    //  fail("Unexpected error: " + e.getMessage());
1111
    //
1112
    //}
1113 6354 cjones
1114
  }
1115 6309 cjones
1116 6354 cjones
  /**
1117
   * Test if a subject is authorized to read a known object
1118
   */
1119
  public void testIsAuthorized() {
1120 6309 cjones
    printTestHeader("testIsAuthorized");
1121
1122 6354 cjones
    try {
1123
      Session session = getTestSession();
1124
      Identifier guid = new Identifier();
1125
      guid.setValue("testIsAuthorized." + System.currentTimeMillis());
1126
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1127
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1128 9191 tao
      //non-public readable
1129
      AccessPolicy accessPolicy = new AccessPolicy();
1130
      AccessRule allow = new AccessRule();
1131
      allow.addPermission(Permission.READ);
1132
      Subject subject = new Subject();
1133
      subject.setValue("cn=test2,dc=dataone,dc=org");
1134
      allow.addSubject(subject);
1135
      accessPolicy.addAllow(allow);
1136
      sysmeta.setAccessPolicy(accessPolicy);
1137 6354 cjones
      Identifier pid =
1138 6542 leinfelder
        MNodeService.getInstance(request).create(session, guid, object, sysmeta);
1139 6354 cjones
      boolean isAuthorized =
1140 6542 leinfelder
        MNodeService.getInstance(request).isAuthorized(session, pid, Permission.READ);
1141 6354 cjones
      assertEquals(isAuthorized, true);
1142 9191 tao
      isAuthorized =
1143
              MNodeService.getInstance(request).isAuthorized(session, pid, Permission.WRITE);
1144
      assertEquals(isAuthorized, true);
1145
      try {
1146
          isAuthorized =
1147
                  MNodeService.getInstance(request).isAuthorized(null, pid, Permission.READ);
1148
          fail("we can reach here");
1149
      } catch(NotAuthorized ee) {
1150
1151
      }
1152 6354 cjones
1153 9191 tao
1154
      Session session2= getAnotherSession();
1155
      isAuthorized =
1156
              MNodeService.getInstance(request).isAuthorized(session2, pid, Permission.READ);
1157
      assertEquals(isAuthorized, true);
1158
1159
      try {
1160
          isAuthorized =
1161
                  MNodeService.getInstance(request).isAuthorized(session2, pid, Permission.WRITE);
1162
          fail("we can reach here");
1163
      } catch(NotAuthorized ee) {
1164
1165
      }
1166
1167
1168
      try {
1169
          isAuthorized =
1170
                  MNodeService.getInstance(request).isAuthorized(session2, pid, Permission.CHANGE_PERMISSION);
1171
          fail("we can reach here");
1172
      } catch(NotAuthorized ee) {
1173
1174
      }
1175
1176
1177 6309 cjones
    } catch (UnsupportedEncodingException e) {
1178 6354 cjones
      e.printStackTrace();
1179
      fail("Unexpected error: " + e.getMessage());
1180 6309 cjones
1181
    } catch (InvalidToken e) {
1182 6354 cjones
      e.printStackTrace();
1183
      fail("Unexpected error: " + e.getMessage());
1184 6309 cjones
1185
    } catch (ServiceFailure e) {
1186 6354 cjones
      e.printStackTrace();
1187
      fail("Unexpected error: " + e.getMessage());
1188 6309 cjones
1189
    } catch (NotAuthorized e) {
1190 6354 cjones
      e.printStackTrace();
1191
      fail("Unexpected error: " + e.getMessage());
1192 6309 cjones
1193
    } catch (IdentifierNotUnique e) {
1194 6354 cjones
      e.printStackTrace();
1195
      fail("Unexpected error: " + e.getMessage());
1196 6309 cjones
1197
    } catch (UnsupportedType e) {
1198 6354 cjones
      e.printStackTrace();
1199
      fail("Unexpected error: " + e.getMessage());
1200 6309 cjones
1201
    } catch (InsufficientResources e) {
1202 6354 cjones
      e.printStackTrace();
1203
      fail("Unexpected error: " + e.getMessage());
1204 6309 cjones
1205
    } catch (InvalidSystemMetadata e) {
1206 6354 cjones
      e.printStackTrace();
1207
      fail("Unexpected error: " + e.getMessage());
1208 6309 cjones
1209
    } catch (NotImplemented e) {
1210 6354 cjones
      e.printStackTrace();
1211
      fail("Unexpected error: " + e.getMessage());
1212 6309 cjones
1213
    } catch (InvalidRequest e) {
1214 6354 cjones
      e.printStackTrace();
1215
      fail("Unexpected error: " + e.getMessage());
1216 6309 cjones
1217
    } catch (Exception e) {
1218 6354 cjones
      e.printStackTrace();
1219
      fail("Unexpected error: " + e.getMessage());
1220 6309 cjones
1221
    }
1222 6354 cjones
  }
1223 8209 leinfelder
1224
  /**
1225
   * Test if node admin is authorized to read a known object
1226
   */
1227
  public void testIsAdminAuthorized() {
1228
    printTestHeader("testIsAdminAuthorized");
1229
1230
    try {
1231
      Session session = getTestSession();
1232
      Identifier guid = new Identifier();
1233
      guid.setValue("testIsAdminAuthorized." + System.currentTimeMillis());
1234
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1235
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1236
      Identifier pid =
1237
        MNodeService.getInstance(request).create(session, guid, object, sysmeta);
1238
1239
      // test as public - read
1240
      boolean isAuthorized =
1241
        MNodeService.getInstance(request).isAuthorized(null, pid, Permission.READ);
1242
      assertEquals(isAuthorized, true);
1243
1244
      // test as public - change perm
1245
      isAuthorized =
1246
        MNodeService.getInstance(request).isAuthorized(null, pid, Permission.CHANGE_PERMISSION);
1247
      assertEquals(isAuthorized, false);
1248
1249 9191 tao
      //test write by another session
1250
      Session session2 = getAnotherSession();
1251
      isAuthorized =
1252
              MNodeService.getInstance(request).isAuthorized(session2, pid, Permission.WRITE);
1253
            assertEquals(isAuthorized, false);
1254
1255 8209 leinfelder
      // test as admin
1256
      isAuthorized =
1257
    	        MNodeService.getInstance(request).isAuthorized(getMNSession(), pid, Permission.CHANGE_PERMISSION);
1258
    	      assertEquals(isAuthorized, true);
1259 9191 tao
     // test as cn
1260
    	isAuthorized =
1261
    	                MNodeService.getInstance(request).isAuthorized(getCNSession(), pid, Permission.CHANGE_PERMISSION);
1262
    	              assertEquals(isAuthorized, true);
1263 8209 leinfelder
1264
    } catch (Exception e) {
1265
      e.printStackTrace();
1266
      fail("Unexpected error: " + e.getMessage());
1267 6309 cjones
1268 8209 leinfelder
    }
1269
  }
1270
1271 6309 cjones
1272 7040 cjones
  public void testIsEquivIdentityAuthorized() {
1273
      printTestHeader("testIsEquivIdentityAuthorized");
1274
1275
      try {
1276
          Session session = new Session();
1277
          Subject s = new Subject();
1278
          s.setValue("cn=test,dc=dataone,dc=org");
1279
          session.setSubject(s);
1280
1281
          Identifier pid = new Identifier();
1282
          pid.setValue("testIsEquivIdentityAuthorized." + System.currentTimeMillis());
1283
          InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1284
          SystemMetadata sysmeta = createSystemMetadata(pid, session.getSubject(), object);
1285
1286
          // reset the access policy to only allow 'self' read (no public)
1287
          AccessPolicy ap = new AccessPolicy();
1288
          AccessRule ar = new AccessRule();
1289
          List<Subject> sList = new ArrayList<Subject>();
1290
          sList.add(session.getSubject());
1291
          ar.setSubjectList(sList);
1292
          List<Permission> permList = new ArrayList<Permission>();
1293
          permList.add(Permission.CHANGE_PERMISSION);
1294
          ar.setPermissionList(permList);
1295
          ap.addAllow(ar);
1296
          sysmeta.setAccessPolicy(ap);
1297
1298
          // save it
1299
          Identifier retPid = CNodeService.getInstance(request).registerSystemMetadata(session, pid, sysmeta);
1300
          assertEquals(pid.getValue(), retPid.getValue());
1301
1302
          //check it against an equivalent identity not listed in the access policy
1303
          session.getSubject().setValue("cn=newSubject,dc=dataone,dc=org");
1304
          SubjectInfo subjectInfo = new SubjectInfo();
1305
          Person person = new Person();
1306
          person.setSubject(session.getSubject());
1307
          List<String> givenNames = new ArrayList<String>();
1308
          givenNames.add("New");
1309
          person.setGivenNameList(givenNames);
1310
          person.setFamilyName("Subject");
1311
1312
          // add equivalent identities
1313
          List<Subject> equivIdentities = new ArrayList<Subject>();
1314
          Subject mappedSubject2 = new Subject();
1315
          mappedSubject2.setValue("cn=test2,dc=dataone,dc=org");
1316
          equivIdentities.add(mappedSubject2);
1317
1318
          Subject mappedSubject = new Subject();
1319
          mappedSubject.setValue("cn=test,dc=dataone,dc=org");
1320
          equivIdentities.add(mappedSubject);
1321
1322
          person.setEquivalentIdentityList(equivIdentities);
1323
1324
          List<Person> personList = new ArrayList<Person>();
1325
          personList.add(person);
1326
          subjectInfo.setPersonList(personList);
1327
1328
          // update the session to include subject info with a mapped identity
1329
          session.setSubjectInfo(subjectInfo);
1330
          boolean result = CNodeService.getInstance(request).isAuthorized(session, pid, Permission.READ);
1331
          assertTrue(result);
1332
1333
    } catch (Exception e) {
1334
        e.printStackTrace();
1335
1336
    }
1337
1338
  }
1339 7816 leinfelder
1340
/**
1341
   * Test object creation failure when there is a space in the identifier
1342
   */
1343
  public void testCreateInvalidIdentifier() {
1344
    printTestHeader("testCreateInvalidIdentifier");
1345
1346
    try {
1347
      Session session = getTestSession();
1348
      Identifier guid = new Identifier();
1349
      guid.setValue("testCreate withspace." + System.currentTimeMillis());
1350
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1351
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1352
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
1353
      fail("Should not be able to create with whitespace in indentifier");
1354
    } catch (InvalidRequest e) {
1355
    	// expect that this request fails
1356
        assertTrue(true);
1357
    } catch (Exception e) {
1358
      e.printStackTrace();
1359
      fail("Unexpected error: " + e.getMessage());
1360
    }
1361
1362
  }
1363 6354 cjones
1364 7850 leinfelder
	/**
1365
	 * Test getting a known object
1366
	 */
1367
	public void testGetPackage() {
1368
		printTestHeader("testGetPackage");
1369
1370
		try {
1371
			Session session = getTestSession();
1372
			Identifier guid = new Identifier();
1373
			guid.setValue("testGetPackage." + System.currentTimeMillis());
1374
			InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1375
			SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1376
			Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
1377 9289 tao
			ObjectFormatIdentifier format = new ObjectFormatIdentifier();
1378 9306 tao
			format.setValue("application/bagit-097");
1379 9289 tao
			InputStream bagStream = MNodeService.getInstance(request).getPackage(session, format, pid);
1380 7853 leinfelder
			File bagFile = File.createTempFile("bagit.", ".zip");
1381 7850 leinfelder
			IOUtils.copy(bagStream, new FileOutputStream(bagFile));
1382
			BagFactory bagFactory = new BagFactory();
1383
			Bag bag = bagFactory.createBag(bagFile);
1384
			InputStream result = bag.getPayload().iterator().next().newInputStream();
1385
1386
			// go back to beginning of original stream
1387
			object.reset();
1388
			// check
1389
			assertTrue(object.available() > 0);
1390
			assertTrue(result.available() > 0);
1391
			assertTrue(IOUtils.contentEquals(result, object));
1392
1393
			// clean up
1394
			bagFile.delete();
1395
1396
		} catch (Exception e) {
1397
			e.printStackTrace();
1398
			fail("Unexpected error: " + e.getMessage());
1399
		}
1400
	}
1401 7853 leinfelder
1402
1403
	/**
1404
	 * Test getting a known object
1405
	 */
1406
	public void testGetOREPackage() {
1407
		printTestHeader("testGetOREPackage");
1408
1409
		try {
1410
1411
			// construct the ORE package
1412
			Identifier resourceMapId = new Identifier();
1413
			//resourceMapId.setValue("doi://1234/AA/map.1.1");
1414
			resourceMapId.setValue("testGetOREPackage." + System.currentTimeMillis());
1415
			Identifier metadataId = new Identifier();
1416
			metadataId.setValue("doi://1234/AA/meta.1." + + System.currentTimeMillis());
1417
			List<Identifier> dataIds = new ArrayList<Identifier>();
1418
			Identifier dataId = new Identifier();
1419
			dataId.setValue("doi://1234/AA/data.1." + System.currentTimeMillis());
1420
			Identifier dataId2 = new Identifier();
1421
			dataId2.setValue("doi://1234/AA/data.2." + System.currentTimeMillis());
1422
			dataIds.add(dataId);
1423
			dataIds.add(dataId2);
1424
			Map<Identifier, List<Identifier>> idMap = new HashMap<Identifier, List<Identifier>>();
1425
			idMap.put(metadataId, dataIds);
1426
			ResourceMapFactory rmf = ResourceMapFactory.getInstance();
1427
			ResourceMap resourceMap = rmf.createResourceMap(resourceMapId, idMap);
1428
			assertNotNull(resourceMap);
1429
			String rdfXml = ResourceMapFactory.getInstance().serializeResourceMap(resourceMap);
1430
			assertNotNull(rdfXml);
1431
1432
			Session session = getTestSession();
1433
			InputStream object = null;
1434
			SystemMetadata sysmeta = null;
1435
1436
			// save the data objects (data just contains their ID)
1437
			InputStream dataObject1 = new ByteArrayInputStream(dataId.getValue().getBytes("UTF-8"));
1438
			sysmeta = createSystemMetadata(dataId, session.getSubject(), dataObject1);
1439
			MNodeService.getInstance(request).create(session, dataId, dataObject1, sysmeta);
1440
			// second data file
1441
			InputStream dataObject2 = new ByteArrayInputStream(dataId2.getValue().getBytes("UTF-8"));
1442
			sysmeta = createSystemMetadata(dataId2, session.getSubject(), dataObject2);
1443
			MNodeService.getInstance(request).create(session, dataId2, dataObject2, sysmeta);
1444
			// metadata file
1445
			InputStream metadataObject = new ByteArrayInputStream(metadataId.getValue().getBytes("UTF-8"));
1446
			sysmeta = createSystemMetadata(metadataId, session.getSubject(), metadataObject);
1447
			MNodeService.getInstance(request).create(session, metadataId, metadataObject, sysmeta);
1448
1449
			// save the ORE object
1450
			object = new ByteArrayInputStream(rdfXml.getBytes("UTF-8"));
1451
			sysmeta = createSystemMetadata(resourceMapId, session.getSubject(), object);
1452
			sysmeta.setFormatId(ObjectFormatCache.getInstance().getFormat("http://www.openarchives.org/ore/terms").getFormatId());
1453
			Identifier pid = MNodeService.getInstance(request).create(session, resourceMapId, object, sysmeta);
1454
1455
			// get the package we uploaded
1456 9289 tao
			ObjectFormatIdentifier format = new ObjectFormatIdentifier();
1457 9306 tao
            format.setValue("application/bagit-097");
1458 9289 tao
			InputStream bagStream = MNodeService.getInstance(request).getPackage(session, format, pid);
1459 7853 leinfelder
			File bagFile = File.createTempFile("bagit.", ".zip");
1460
			IOUtils.copy(bagStream, new FileOutputStream(bagFile));
1461
			BagFactory bagFactory = new BagFactory();
1462
			Bag bag = bagFactory.createBag(bagFile);
1463
			Iterator<Manifest> manifestIter = bag.getTagManifests().iterator();
1464
			while (manifestIter.hasNext()) {
1465
				String filepath = manifestIter.next().getFilepath();
1466
				BagFile entryFile = bag.getBagFile(filepath);
1467
				InputStream result = entryFile.newInputStream();
1468
				// check ORE
1469
				if (filepath.contains(resourceMapId.getValue())) {
1470
					object.reset();
1471
					assertTrue(object.available() > 0);
1472
					assertTrue(result.available() > 0);
1473
					assertTrue(IOUtils.contentEquals(result, object));
1474
				}
1475
				// check metadata
1476
				if (filepath.contains(metadataId.getValue())) {
1477
					metadataObject.reset();
1478
					assertTrue(metadataObject.available() > 0);
1479
					assertTrue(result.available() > 0);
1480
					assertTrue(IOUtils.contentEquals(result, metadataObject));
1481
				}
1482
				if (filepath.contains(dataId.getValue())) {
1483
					dataObject1.reset();
1484
					assertTrue(dataObject1.available() > 0);
1485
					assertTrue(result.available() > 0);
1486
					assertTrue(IOUtils.contentEquals(result, dataObject1));
1487
				}
1488
				if (filepath.contains(dataId2.getValue())) {
1489
					dataObject2.reset();
1490
					assertTrue(dataObject2.available() > 0);
1491
					assertTrue(result.available() > 0);
1492
					assertTrue(IOUtils.contentEquals(result, dataObject2));
1493
				}
1494
1495
1496
			}
1497
1498
			// clean up
1499
			bagFile.delete();
1500 8745 leinfelder
1501
			// test the ORE lookup
1502
			List<Identifier> oreIds = MNodeService.getInstance(request).lookupOreFor(metadataId, true);
1503
			assertTrue(oreIds.contains(resourceMapId));
1504 7853 leinfelder
1505
		} catch (Exception e) {
1506
			e.printStackTrace();
1507
			fail("Unexpected error: " + e.getMessage());
1508
		}
1509
	}
1510
1511 8906 tao
	/**
1512
     * Test the extra "delete information" was added to the NotFoundException
1513
     * if the object was delete in the following methods:
1514
     * MN.get
1515
     * MN.getSystemmetadata
1516
     * MN.describe
1517
     * MN.getChecksum
1518
     * MN.getRelica
1519
     */
1520
    public void testReadDeletedObject() {
1521
        printTestHeader("testDelete");
1522
1523
        try {
1524
          Session session = getTestSession();
1525
          Identifier guid = new Identifier();
1526
          guid.setValue("testDelete." + System.currentTimeMillis());
1527
          InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1528
          SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1529
          Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
1530
          Thread.sleep(3000);
1531
          // use MN admin to delete
1532
          session = getMNSession();
1533
          Identifier deletedPid = MNodeService.getInstance(request).delete(session, pid);
1534
          System.out.println("after deleting");
1535
          assertEquals(pid.getValue(), deletedPid.getValue());
1536
          // check that we cannot get the object
1537
          session = getTestSession();
1538
          InputStream deletedObject = null;
1539
          try {
1540
              //System.out.println("before read ===============");
1541
              deletedObject = MNodeService.getInstance(request).get(session, deletedPid);
1542
              //System.out.println("after read ===============");
1543
          } catch (NotFound nf) {
1544
              assertTrue(nf.getMessage().contains("deleted"));
1545
          }
1546
          try {
1547
              //System.out.println("before read ===============");
1548
              SystemMetadata sysmeta2 = MNodeService.getInstance(request).getSystemMetadata(session, deletedPid);
1549
              //System.out.println("after read ===============");
1550
          } catch (NotFound nf) {
1551
              //System.out.println("the exception is "+nf.getMessage());
1552
              assertTrue(nf.getMessage().contains("deleted"));
1553
          }
1554
1555
          try {
1556
              //System.out.println("before read ===============");
1557
              DescribeResponse describeResponse = MNodeService.getInstance(request).describe(session, pid);
1558
              //System.out.println("after read ===============");
1559
          } catch (NotFound nf) {
1560
              //System.out.println("the exception is "+nf.getMessage());
1561
              assertTrue(nf.getMessage().contains("deleted"));
1562
          }
1563
1564
          try {
1565
              //System.out.println("before read ===============");
1566
              Checksum checksum = MNodeService.getInstance(request).getChecksum(session, pid, "MD5");
1567
              //System.out.println("after read ===============");
1568
          } catch (NotFound nf) {
1569
              //System.out.println("the exception 3 is "+nf.getMessage());
1570
              assertTrue(nf.getMessage().contains("deleted"));
1571
          }
1572
1573
          try {
1574
              //System.out.println("before read ===============");
1575
              boolean isAuthorized =
1576
                      MNodeService.getInstance(request).isAuthorized(session, pid, Permission.READ);
1577
              //System.out.println("after read ===============");
1578
          } catch (NotFound nf) {
1579
              System.out.println("the exception 4 is "+nf.getMessage());
1580
              assertTrue(nf.getMessage().contains("deleted"));
1581
          }
1582
1583
          assertNull(deletedObject);
1584
1585
        } catch (UnsupportedEncodingException e) {
1586
          e.printStackTrace();
1587
1588
        } catch (Exception e) {
1589
          e.printStackTrace();
1590
          fail("Unexpected error: " + e.getMessage());
1591
1592
        }
1593
    }
1594 8952 tao
1595
    /**
1596
     * Test to create and update a metadata which xml declaration is ASCII, but actually
1597
     * has some special charaters. The saved document should has the same bytes as the origianl.
1598
     */
1599
    public void testCreateAndUpdateXMLWithUnmatchingEncoding() throws Exception {
1600
          String algorithm = "md5";
1601
          Session session = getTestSession();
1602
          Identifier guid = new Identifier();
1603
          guid.setValue("testCreateAndUpdate." + System.currentTimeMillis());
1604
          InputStream object = new ByteArrayInputStream(FileUtils.readFileToByteArray(new File(unmatchingEncodingFilePath)));
1605
          Checksum orgChecksum = ChecksumUtil.checksum(object, algorithm);
1606
          //System.out.println("the original checksum is "+orgChecksum.getValue());
1607
          SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1608
          Identifier pid =
1609
            MNodeService.getInstance(request).create(session, guid, object, sysmeta);
1610
          InputStream readResult = MNodeService.getInstance(request).get(session, pid);
1611
          byte[] readBytes = IOUtils.toByteArray(readResult);
1612
          Checksum checksum1 = ChecksumUtil.checksum(readBytes, algorithm);
1613
          //System.out.println("the read checksum1 is "+checksum1.getValue());
1614
          assertEquals(orgChecksum.getValue(), checksum1.getValue());
1615
1616
          Identifier newPid = new Identifier();
1617
          newPid.setValue("testCreateAndUpdate." + (System.currentTimeMillis() + 1)); // ensure it is different from original
1618
          SystemMetadata newSysMeta = createSystemMetadata(newPid, session.getSubject(), object);
1619
1620
          // do the update
1621
          Identifier updatedPid =
1622
            MNodeService.getInstance(request).update(session, pid, object, newPid, newSysMeta);
1623
          InputStream readResult2 = MNodeService.getInstance(request).get(session, updatedPid);
1624
          byte[] readBytes2 = IOUtils.toByteArray(readResult2);
1625
          Checksum checksum2 = ChecksumUtil.checksum(readBytes2, algorithm);
1626
          assertEquals(orgChecksum.getValue(), checksum2.getValue());
1627
          //System.out.println("the read checksum2 is "+checksum2.getValue());
1628
1629
1630
    }
1631 6354 cjones
1632 9034 tao
    /**
1633
     * Test the method - get api  for a speicified SID
1634
     */
1635
    public void testGetSID() {
1636
        String str1 = "object1";
1637
        String str2 = "object2";
1638
        String str3 = "object3";
1639 9158 tao
        Date fromDate = new Date();
1640
        Calendar calendar = Calendar.getInstance();
1641
        calendar.setTime(fromDate);
1642
        calendar.roll(Calendar.YEAR, false);
1643
        fromDate = calendar.getTime();
1644 9034 tao
        try {
1645
            //insert test documents with a series id
1646
            Session session = getTestSession();
1647
            Identifier guid = new Identifier();
1648
            guid.setValue(generateDocumentId());
1649
            InputStream object1 = new ByteArrayInputStream(str1.getBytes("UTF-8"));
1650
            SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object1);
1651
            String sid1= "sid."+System.nanoTime();
1652
            Identifier seriesId = new Identifier();
1653
            seriesId.setValue(sid1);
1654
            System.out.println("the first sid is "+seriesId.getValue());
1655
            sysmeta.setSeriesId(seriesId);
1656
            MNodeService.getInstance(request).create(session, guid, object1, sysmeta);
1657
            System.out.println("the first pid is "+guid.getValue());
1658
            //test the get(pid) for v2
1659
            InputStream result = MNodeService.getInstance(request).get(session, guid);
1660
            // go back to beginning of original stream
1661
            object1.reset();
1662
            // check
1663
            assertTrue(object1.available() > 0);
1664
            assertTrue(result.available() > 0);
1665
            assertTrue(IOUtils.contentEquals(result, object1));
1666
            // test the get(id) for v2
1667
            InputStream result1 = MNodeService.getInstance(request).get(session, seriesId);
1668
            object1.reset();
1669
            // check
1670
            assertTrue(object1.available() > 0);
1671
            assertTrue(result1.available() > 0);
1672
            assertTrue(IOUtils.contentEquals(result1, object1));
1673
            //test the get(pid) for v1
1674
            InputStream result2 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, guid);
1675
            object1.reset();
1676
            // check
1677
            assertTrue(object1.available() > 0);
1678
            assertTrue(result2.available() > 0);
1679
            assertTrue(IOUtils.contentEquals(result2, object1));
1680
            //test the get(sid) for v1
1681
            try {
1682
                InputStream result3 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, seriesId);
1683
                fail("the get(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1684
            } catch (NotFound ee) {
1685
1686
            }
1687 9039 tao
            SystemMetadata metadata = MNodeService.getInstance(request).getSystemMetadata(session, seriesId);
1688
            assertTrue(metadata.getIdentifier().getValue().equals(guid.getValue()));
1689
            assertTrue(metadata.getSeriesId().getValue().equals(seriesId.getValue()));
1690
            DescribeResponse describeResponse = MNodeService.getInstance(request).describe(session, seriesId);
1691
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata.getChecksum().getValue());
1692
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata.getFormatId().getValue());
1693 9034 tao
1694 9039 tao
            metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid);
1695
            assertTrue(metadata.getIdentifier().getValue().equals(guid.getValue()));
1696
            assertTrue(metadata.getSeriesId().getValue().equals(seriesId.getValue()));
1697
            describeResponse = MNodeService.getInstance(request).describe(session, guid);
1698
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata.getChecksum().getValue());
1699
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata.getFormatId().getValue());
1700
1701
            org.dataone.service.types.v1.SystemMetadata sys1=edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).getSystemMetadata(session, guid);
1702
            assertTrue(metadata.getIdentifier().getValue().equals(guid.getValue()));
1703
1704
            try {
1705
                org.dataone.service.types.v1.SystemMetadata sys2=edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).getSystemMetadata(session, seriesId);
1706
                fail("the getSystemMetadata(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1707
            } catch(NotFound nf2) {
1708
1709
            }
1710
1711
            describeResponse = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).describe(session, guid);
1712
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), sys1.getChecksum().getValue());
1713
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), sys1.getFormatId().getValue());
1714
            try {
1715
                describeResponse = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).describe(session, seriesId);
1716
                fail("the describe(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1717
            } catch(NotFound nf2) {
1718
1719
            }
1720
1721 9042 tao
            Checksum sum = MNodeService.getInstance(request).getChecksum(session, guid, "md5");
1722
            assertTrue(sum.getValue().equals("5b78f9689b9aab1ebc0f3c1df916dd97"));
1723
1724
            try {
1725
                sum = MNodeService.getInstance(request).getChecksum(session, seriesId, "md5");
1726
                fail("the getCheckSum shouldn't work for sid");
1727
            } catch(NotFound nf3) {
1728
1729
            }
1730
1731
            sum = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).getChecksum(session, guid, "md5");
1732
            assertTrue(sum.getValue().equals("5b78f9689b9aab1ebc0f3c1df916dd97"));
1733
1734
            try {
1735
                sum = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).getChecksum(session, seriesId, "md5");
1736
                fail("the getCheckSum shouldn't work for sid");
1737
            } catch(NotFound nf3) {
1738
1739
            }
1740
1741 9052 tao
            boolean isAuthorized =
1742
                    MNodeService.getInstance(request).isAuthorized(session, guid, Permission.READ);
1743
            assertEquals(isAuthorized, true);
1744 9042 tao
1745 9052 tao
            isAuthorized =
1746
                    MNodeService.getInstance(request).isAuthorized(session, seriesId, Permission.READ);
1747
            assertEquals(isAuthorized, true);
1748 9042 tao
1749 9052 tao
            isAuthorized =
1750
                    edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).isAuthorized(session, guid, Permission.READ);
1751
            assertEquals(isAuthorized, true);
1752
1753
            try {
1754
                isAuthorized =
1755
                        edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).isAuthorized(session, seriesId, Permission.READ);
1756
                fail("we can't reach here since the v1 isAuthorized method doesn't suppport series id");
1757
            } catch (NotFound e) {
1758
1759
            }
1760 9158 tao
1761
            Session cnsession = getCNSession();
1762
            Date toDate = new Date();
1763
            Event event = Event.READ;
1764
            int start = 0;
1765
            int count = 1;
1766
          Log log = MNodeService.getInstance(request).getLogRecords(cnsession, null, null,
1767
            event.xmlValue(), seriesId.getValue(), start, count);
1768
1769
          assertNotNull(log);
1770
          assertTrue(log.getCount() == count);
1771
          assertTrue(log.getStart() == start);
1772
          assertTrue(log.getTotal() >= 1);
1773
          assertTrue(log.getLogEntry(0).getIdentifier().equals(guid));
1774 9052 tao
1775 9034 tao
            //do a update with the same series id
1776 9035 tao
            Thread.sleep(1000);
1777 9034 tao
            Identifier newPid = new Identifier();
1778
            newPid.setValue(generateDocumentId()+"1");
1779
            System.out.println("the second pid is "+newPid.getValue());
1780 9035 tao
            InputStream object2 = new ByteArrayInputStream(str2.getBytes("UTF-8"));
1781
            SystemMetadata newSysMeta = createSystemMetadata(newPid, session.getSubject(), object2);
1782 9034 tao
            newSysMeta.setObsoletes(guid);
1783
            newSysMeta.setSeriesId(seriesId);
1784 9035 tao
            MNodeService.getInstance(request).update(session, guid, object2, newPid, newSysMeta);
1785
1786
            InputStream result4 = MNodeService.getInstance(request).get(session, guid);
1787
            // go back to beginning of original stream
1788
            object1.reset();
1789
            // check
1790
            assertTrue(object1.available() > 0);
1791
            assertTrue(result4.available() > 0);
1792
            assertTrue(IOUtils.contentEquals(result4, object1));
1793 9034 tao
1794 9035 tao
            InputStream result5 = MNodeService.getInstance(request).get(session, newPid);
1795
            // go back to beginning of original stream
1796
            object2.reset();
1797
            // check
1798
            assertTrue(object2.available() > 0);
1799
            assertTrue(result5.available() > 0);
1800
            assertTrue(IOUtils.contentEquals(result5, object2));
1801
1802
1803
            InputStream result6 = MNodeService.getInstance(request).get(session, seriesId);
1804
            object2.reset();
1805
            // check
1806
            assertTrue(object2.available() > 0);
1807
            assertTrue(result6.available() > 0);
1808
            assertTrue(IOUtils.contentEquals(result6, object2));
1809
            //test the get(pid) for v1
1810
            InputStream result7 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, guid);
1811
            object1.reset();
1812
            // check
1813
            assertTrue(object1.available() > 0);
1814
            assertTrue(result7.available() > 0);
1815
            assertTrue(IOUtils.contentEquals(result7, object1));
1816
1817
            InputStream result8 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, newPid);
1818
            object2.reset();
1819
            // check
1820
            assertTrue(object2.available() > 0);
1821
            assertTrue(result8.available() > 0);
1822
            assertTrue(IOUtils.contentEquals(result8, object2));
1823
            //test the get(sid) for v1
1824
            try {
1825
                InputStream result3 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, seriesId);
1826
                fail("the get(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1827
            } catch (NotFound ee) {
1828
1829
            }
1830
1831 9039 tao
            SystemMetadata metadata1 = MNodeService.getInstance(request).getSystemMetadata(session, seriesId);
1832
            assertTrue(metadata1.getIdentifier().getValue().equals(newPid.getValue()));
1833
            assertTrue(metadata1.getSeriesId().getValue().equals(seriesId.getValue()));
1834
            describeResponse = MNodeService.getInstance(request).describe(session, seriesId);
1835
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata1.getChecksum().getValue());
1836
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata1.getFormatId().getValue());
1837
1838
            SystemMetadata metadata2 = MNodeService.getInstance(request).getSystemMetadata(session, guid);
1839
            assertTrue(metadata2.getIdentifier().getValue().equals(guid.getValue()));
1840
            assertTrue(metadata2.getSeriesId().getValue().equals(seriesId.getValue()));
1841
            describeResponse = MNodeService.getInstance(request).describe(session, guid);
1842
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata2.getChecksum().getValue());
1843
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata2.getFormatId().getValue());
1844
1845
            SystemMetadata metadata3 = MNodeService.getInstance(request).getSystemMetadata(session, newPid);
1846
            assertTrue(metadata3.getIdentifier().getValue().equals(newPid.getValue()));
1847
            assertTrue(metadata3.getSeriesId().getValue().equals(seriesId.getValue()));
1848
            describeResponse = MNodeService.getInstance(request).describe(session, newPid);
1849
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata3.getChecksum().getValue());
1850
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata3.getFormatId().getValue());
1851
1852 9034 tao
            //do another update with different series id
1853
            Thread.sleep(1000);
1854
            String sid2 = "sid."+System.nanoTime();
1855
            Identifier seriesId2= new Identifier();
1856
            seriesId2.setValue(sid2);
1857
            System.out.println("the second sid is "+seriesId2.getValue());
1858
            Identifier newPid2 = new Identifier();
1859
            newPid2.setValue(generateDocumentId()+"2");
1860
            System.out.println("the third pid is "+newPid2.getValue());
1861 9035 tao
            InputStream object3 = new ByteArrayInputStream(str3.getBytes("UTF-8"));
1862
            SystemMetadata sysmeta3 = createSystemMetadata(newPid2, session.getSubject(), object3);
1863 9034 tao
            sysmeta3.setObsoletes(newPid);
1864
            sysmeta3.setSeriesId(seriesId2);
1865 9035 tao
            MNodeService.getInstance(request).update(session, newPid, object3, newPid2, sysmeta3);
1866 9034 tao
1867 9035 tao
            InputStream result9 = MNodeService.getInstance(request).get(session, guid);
1868
            // go back to beginning of original stream
1869
            object1.reset();
1870
            // check
1871
            assertTrue(object1.available() > 0);
1872
            assertTrue(result9.available() > 0);
1873
            assertTrue(IOUtils.contentEquals(result9, object1));
1874 9034 tao
1875 9035 tao
            InputStream result10 = MNodeService.getInstance(request).get(session, newPid);
1876
            // go back to beginning of original stream
1877
            object2.reset();
1878
            // check
1879
            assertTrue(object2.available() > 0);
1880
            assertTrue(result10.available() > 0);
1881
            assertTrue(IOUtils.contentEquals(result10, object2));
1882 9034 tao
1883
1884 9035 tao
            InputStream result11 = MNodeService.getInstance(request).get(session, newPid2);
1885
            // go back to beginning of original stream
1886
            object3.reset();
1887
            // check
1888
            assertTrue(object3.available() > 0);
1889
            assertTrue(result11.available() > 0);
1890
            assertTrue(IOUtils.contentEquals(result11, object3));
1891
1892
            InputStream result12 = MNodeService.getInstance(request).get(session, seriesId2);
1893
            object3.reset();
1894
            // check
1895
            assertTrue(object3.available() > 0);
1896
            assertTrue(result12.available() > 0);
1897
            assertTrue(IOUtils.contentEquals(result12, object3));
1898
1899
            InputStream result16 = MNodeService.getInstance(request).get(session, seriesId);
1900
            object2.reset();
1901
            // check
1902
            assertTrue(object2.available() > 0);
1903
            assertTrue(result16.available() > 0);
1904
            assertTrue(IOUtils.contentEquals(result16, object2));
1905
1906
            //test the get(pid) for v1
1907
            InputStream result13 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, guid);
1908
            object1.reset();
1909
            // check
1910
            assertTrue(object1.available() > 0);
1911
            assertTrue(result13.available() > 0);
1912
            assertTrue(IOUtils.contentEquals(result13, object1));
1913
1914
            InputStream result14 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, newPid);
1915
            object2.reset();
1916
            // check
1917
            assertTrue(object2.available() > 0);
1918
            assertTrue(result14.available() > 0);
1919
            assertTrue(IOUtils.contentEquals(result14, object2));
1920
1921
            InputStream result15 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, newPid2);
1922
            object3.reset();
1923
            // check
1924
            assertTrue(object3.available() > 0);
1925
            assertTrue(result15.available() > 0);
1926
            assertTrue(IOUtils.contentEquals(result15, object3));
1927
1928 9039 tao
            SystemMetadata metadata4 = MNodeService.getInstance(request).getSystemMetadata(session, seriesId);
1929
            assertTrue(metadata4.getIdentifier().getValue().equals(newPid.getValue()));
1930
            assertTrue(metadata4.getSeriesId().getValue().equals(seriesId.getValue()));
1931
            describeResponse = MNodeService.getInstance(request).describe(session, seriesId);
1932
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata4.getChecksum().getValue());
1933
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata4.getFormatId().getValue());
1934 9035 tao
1935 9039 tao
            SystemMetadata metadata5 = MNodeService.getInstance(request).getSystemMetadata(session, seriesId2);
1936
            assertTrue(metadata5.getIdentifier().getValue().equals(newPid2.getValue()));
1937
            assertTrue(metadata5.getSeriesId().getValue().equals(seriesId2.getValue()));
1938
            describeResponse = MNodeService.getInstance(request).describe(session, seriesId2);
1939
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata5.getChecksum().getValue());
1940
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata5.getFormatId().getValue());
1941
1942
            SystemMetadata metadata6 = MNodeService.getInstance(request).getSystemMetadata(session, guid);
1943
            assertTrue(metadata6.getIdentifier().getValue().equals(guid.getValue()));
1944
            assertTrue(metadata6.getSeriesId().getValue().equals(seriesId.getValue()));
1945
            describeResponse = MNodeService.getInstance(request).describe(session, guid);
1946
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata6.getChecksum().getValue());
1947
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata6.getFormatId().getValue());
1948
1949
            SystemMetadata metadata7 = MNodeService.getInstance(request).getSystemMetadata(session, newPid);
1950
            assertTrue(metadata7.getIdentifier().getValue().equals(newPid.getValue()));
1951
            assertTrue(metadata7.getSeriesId().getValue().equals(seriesId.getValue()));
1952
            describeResponse = MNodeService.getInstance(request).describe(session, newPid);
1953
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata7.getChecksum().getValue());
1954
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata7.getFormatId().getValue());
1955
1956
            SystemMetadata metadata8 = MNodeService.getInstance(request).getSystemMetadata(session, newPid2);
1957
            assertTrue(metadata8.getIdentifier().getValue().equals(newPid2.getValue()));
1958
            assertTrue(metadata8.getSeriesId().getValue().equals(seriesId2.getValue()));
1959
            describeResponse = MNodeService.getInstance(request).describe(session, newPid2);
1960
            assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata8.getChecksum().getValue());
1961
            assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata8.getFormatId().getValue());
1962
1963
1964
1965
1966 9035 tao
            //test the get(sid) for v1
1967
            try {
1968
                InputStream result3 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, seriesId);
1969
                fail("the get(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1970
            } catch (NotFound ee) {
1971
1972
            }
1973
1974
            //test the get(sid) for v1
1975
            try {
1976
                InputStream result3 = edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, seriesId2);
1977
                fail("the get(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1978
            } catch (NotFound ee) {
1979
1980
            }
1981
1982
            //test to get non-existing id for v2
1983
            try {
1984
             // the pid should be null when we try to get a no-exist sid
1985
                Identifier non_exist_sid = new Identifier();
1986
                non_exist_sid.setValue("no-sid-exist-123qwe");
1987
                InputStream result3 = MNodeService.getInstance(request).get(session, non_exist_sid);
1988
                fail("the get(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1989
            } catch (NotFound ee) {
1990
1991
            }
1992 9039 tao
1993
            try {
1994
                // the pid should be null when we try to get a no-exist sid
1995
                   Identifier non_exist_sid = new Identifier();
1996
                   non_exist_sid.setValue("no-sid-exist-123qwe");
1997
                   SystemMetadata result3 = MNodeService.getInstance(request).getSystemMetadata(session, non_exist_sid);
1998
                   fail("the getSystemMetadata(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1999
            } catch (NotFound ee) {
2000
2001
            }
2002
2003
            try {
2004
                // the pid should be null when we try to get a no-exist sid
2005
                   Identifier non_exist_sid = new Identifier();
2006
                   non_exist_sid.setValue("no-sid-exist-123qwe");
2007
                    MNodeService.getInstance(request).describe(session, non_exist_sid);
2008
                   fail("the describe(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
2009
               } catch (NotFound ee) {
2010
2011
               }
2012 9035 tao
2013 9158 tao
            toDate = new Date();
2014
            event = Event.READ;
2015
            start = 0;
2016
            count = 1;
2017
            log = MNodeService.getInstance(request).getLogRecords(cnsession, null, null,
2018
            event.xmlValue(), seriesId.getValue(), start, count);
2019
2020
            assertNotNull(log);
2021
            assertTrue(log.getCount() == count);
2022
            assertTrue(log.getStart() == start);
2023
            assertTrue(log.getTotal() >= 1);
2024
            assertTrue(log.getLogEntry(0).getIdentifier().equals(newPid));
2025 9049 tao
2026
            //do another update with invalid series ids
2027
            Thread.sleep(1000);
2028
            Identifier newPid3 = new Identifier();
2029
            newPid3.setValue(generateDocumentId()+"3");
2030
            System.out.println("the third pid is "+newPid3.getValue());
2031
            InputStream object4 = new ByteArrayInputStream(str3.getBytes("UTF-8"));
2032
            SystemMetadata sysmeta4 = createSystemMetadata(newPid3, session.getSubject(), object4);
2033
            sysmeta4.setObsoletes(newPid2);
2034
            sysmeta4.setSeriesId(seriesId);
2035
            try {
2036
                MNodeService.getInstance(request).update(session, newPid2, object4, newPid3, sysmeta4);
2037
                fail("we can't reach here since the sid is using an old one ");
2038
            } catch (InvalidSystemMetadata eee) {
2039
2040
            }
2041
2042
            sysmeta4.setSeriesId(newPid3);
2043
            try {
2044
                MNodeService.getInstance(request).update(session, newPid2, object4, newPid3, sysmeta4);
2045
                fail("we can't reach here since the sid is using the pid ");
2046
            } catch (InvalidSystemMetadata eee) {
2047
2048
            }
2049
2050 9052 tao
            //test archive a series id by v1
2051
            try {
2052
                edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).archive(session, seriesId2);
2053
                fail("we can't reach here since the v1 archive method doesn't support the sid ");
2054
            } catch (NotFound nf2) {
2055
2056
            }
2057
2058
            // test delete a series id by v1
2059
            Session mnSession = getMNSession();
2060
            try {
2061
                edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).delete(mnSession, seriesId2);
2062
                fail("we can't reach here since the v1 delete method doesn't support the sid ");
2063
            } catch (NotFound nf2) {
2064
2065
            }
2066
2067
            // test archive a series id by v2
2068
            MNodeService.getInstance(request).archive(session, seriesId2);
2069
            SystemMetadata archived = MNodeService.getInstance(request).getSystemMetadata(session, seriesId2);
2070
            assertTrue(archived.getArchived());
2071
            archived = MNodeService.getInstance(request).getSystemMetadata(session, newPid2);
2072
            assertTrue(archived.getArchived());
2073
2074
            // test delete a series id by v2
2075
            MNodeService.getInstance(request).delete(mnSession, seriesId2);
2076
            try {
2077
                MNodeService.getInstance(request).get(session, seriesId2);
2078
                fail("we can't reach here since the series id was deleted ");
2079
            } catch (NotFound nf3) {
2080
                System.out.println("the message is ============="+nf3.getMessage());
2081
                //assertTrue(nf3.getMessage().indexOf("delete") >0);
2082
            }
2083
2084
            try {
2085
                MNodeService.getInstance(request).get(session, newPid2);
2086
                fail("we can't reach here since the series id was deleted ");
2087
            } catch (NotFound nf3) {
2088
                //System.out.println("the message is ============="+nf3.getMessage());
2089
                assertTrue(nf3.getMessage().indexOf("delete") >0);
2090
            }
2091
2092
            try {
2093
                edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).get(session, newPid2);
2094
                fail("we can't reach here since the series id was deleted ");
2095
            } catch (NotFound nf3) {
2096
                System.out.println("the message is ============="+nf3.getMessage());
2097
                assertTrue(nf3.getMessage().indexOf("delete") >0);
2098
            }
2099
2100
            //archive seriesId
2101
            MNodeService.getInstance(request).archive(mnSession, seriesId);
2102
            archived = MNodeService.getInstance(request).getSystemMetadata(session, seriesId);
2103
            assertTrue(archived.getArchived());
2104
            archived = MNodeService.getInstance(request).getSystemMetadata(session, newPid);
2105
            assertTrue(archived.getArchived());
2106
2107
2108
            //delete seriesId
2109
            MNodeService.getInstance(request).delete(mnSession, seriesId);
2110
            try {
2111
                MNodeService.getInstance(request).get(session, newPid);
2112
                fail("we can't reach here since the series id was deleted ");
2113
            } catch (NotFound nf3) {
2114
                //System.out.println("the message is ============="+nf3.getMessage());
2115
                assertTrue(nf3.getMessage().indexOf("delete") >0);
2116
            }
2117
            SystemMetadata meta = MNodeService.getInstance(request).getSystemMetadata(session, seriesId);
2118
            assertTrue(meta.getIdentifier().getValue().equals(guid.getValue()));
2119
2120 9034 tao
        } catch (Exception e) {
2121
            fail(e.getMessage());
2122
        }
2123
2124 9049 tao
2125
2126
2127 9034 tao
    }
2128 9147 tao
2129
    /**
2130
     * Test the listView methods.
2131
     * @throws Excpetion
2132
     */
2133
    public void testListViews() throws Exception {
2134
        Session session = null;
2135
        OptionList list = MNodeService.getInstance(request).listViews(session);
2136
        assertTrue(list.sizeOptionList() >0);
2137
        List<String> names = list.getOptionList();
2138
        for(String name : names) {
2139
            System.out.println("It has the view named "+name);
2140
        }
2141
    }
2142
2143 9167 tao
    public void testUpdateSystemMetadata() throws Exception {
2144
        String str1 = "object1";
2145
        String str2 = "object2";
2146
        String str3 = "object3";
2147 9336 tao
2148
        Date date = new Date();
2149
        Thread.sleep(2000);
2150 9167 tao
        //insert test documents with a series id
2151
        Session session = getTestSession();
2152
        Identifier guid = new Identifier();
2153
        guid.setValue(generateDocumentId());
2154
        InputStream object1 = new ByteArrayInputStream(str1.getBytes("UTF-8"));
2155
        SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object1);
2156
        String sid1= "sid."+System.nanoTime();
2157
        Identifier seriesId = new Identifier();
2158
        seriesId.setValue(sid1);
2159
        System.out.println("the first sid is "+seriesId.getValue());
2160
        sysmeta.setSeriesId(seriesId);
2161
        sysmeta.setArchived(false);
2162
        MNodeService.getInstance(request).create(session, guid, object1, sysmeta);
2163
        //Test the generating object succeeded.
2164
        SystemMetadata metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid);
2165
        assertTrue(metadata.getIdentifier().equals(guid));
2166
        assertTrue(metadata.getArchived().equals(false));
2167
        System.out.println("the checksum from request is "+metadata.getChecksum().getValue());
2168
        assertTrue(metadata.getSize().equals(sysmeta.getSize()));
2169 9281 tao
        System.out.println("the identifier is "+guid.getValue());
2170 9167 tao
2171 9336 tao
        Date current = sysmeta.getDateSysMetadataModified();
2172
        //updating system metadata failed since the date doesn't match
2173
        sysmeta.setArchived(true);
2174
        sysmeta.setDateSysMetadataModified(date);
2175
        try {
2176
            MNodeService.getInstance(request).updateSystemMetadata(session, guid, sysmeta);
2177
            fail("We shouldn't get there");
2178
        } catch (Exception e) {
2179
            assertTrue(e instanceof InvalidRequest);
2180
        }
2181 9167 tao
        //update system metadata sucessfully
2182 9336 tao
        sysmeta.setDateSysMetadataModified(current);
2183 9281 tao
        BigInteger serialVersion = metadata.getSerialVersion();
2184 9336 tao
        //System.out.println("the current version is "+serialVersion.toString());
2185
        //serialVersion = serialVersion.add(BigInteger.ONE);
2186
        //System.out.println("the new version is "+serialVersion.toString());
2187
        //sysmeta.setSerialVersion(serialVersion);
2188 9377 tao
        System.out.println("the identifier is ----------------------- "+guid.getValue());
2189 9281 tao
        MNodeService.getInstance(request).updateSystemMetadata(session, guid, sysmeta);
2190 9167 tao
        SystemMetadata metadata2 = MNodeService.getInstance(request).getSystemMetadata(session, seriesId);
2191
        assertTrue(metadata2.getIdentifier().equals(guid));
2192
        assertTrue(metadata2.getSeriesId().equals(seriesId));
2193
        assertTrue(metadata2.getArchived().equals(true));
2194
        assertTrue(metadata2.getChecksum().getValue().equals(metadata.getChecksum().getValue()));
2195 9336 tao
        assertTrue(metadata2.getDateSysMetadataModified().getTime() > current.getTime());
2196 9167 tao
2197
        Identifier newId = new Identifier();
2198
        newId.setValue("newValue");
2199 9281 tao
        sysmeta.setIdentifier(newId);
2200
        serialVersion = metadata.getSerialVersion();
2201
        serialVersion = serialVersion.add(BigInteger.ONE);
2202
        sysmeta.setSerialVersion(serialVersion);
2203 9167 tao
        try {
2204 9281 tao
            MNodeService.getInstance(request).updateSystemMetadata(session, guid, sysmeta);
2205 9167 tao
            fail("We shouldn't get there");
2206
        } catch (Exception e) {
2207
            assertTrue(e instanceof InvalidRequest);
2208
        }
2209
2210
        newId.setValue("newValue");
2211 9281 tao
        sysmeta.setSeriesId(newId);
2212 9167 tao
        try {
2213 9281 tao
            MNodeService.getInstance(request).updateSystemMetadata(session, guid, sysmeta);
2214 9167 tao
            fail("We shouldn't get there");
2215
        } catch (Exception e) {
2216
            assertTrue(e instanceof InvalidRequest);
2217
        }
2218
2219
        Date newDate = new Date();
2220 9281 tao
        sysmeta.setDateUploaded(newDate);
2221 9167 tao
        try {
2222 9281 tao
            MNodeService.getInstance(request).updateSystemMetadata(session, guid, sysmeta);
2223 9167 tao
            fail("We shouldn't get there");
2224
        } catch (Exception e) {
2225
            assertTrue(e instanceof InvalidRequest);
2226
        }
2227
2228
        Checksum checkSum = new Checksum();
2229
        checkSum.setValue("12345");
2230 9281 tao
        sysmeta.setChecksum(checkSum);
2231 9167 tao
        try {
2232 9281 tao
            MNodeService.getInstance(request).updateSystemMetadata(session, guid, sysmeta);
2233 9167 tao
            fail("We shouldn't get there");
2234
        } catch (Exception e) {
2235
            assertTrue(e instanceof InvalidRequest);
2236
        }
2237
2238
        BigInteger size = new BigInteger("4000");
2239 9281 tao
        sysmeta.setSize(size);
2240 9167 tao
        try {
2241 9281 tao
            MNodeService.getInstance(request).updateSystemMetadata(session, guid, sysmeta);
2242 9167 tao
            fail("We shouldn't get there");
2243
        } catch (Exception e) {
2244
            assertTrue(e instanceof InvalidRequest);
2245
        }
2246 9336 tao
    }
2247 9167 tao
2248 9276 tao
    public void testUpdateObsoletesAndObsoletedBy() throws Exception {
2249
        String str1 = "object1";
2250
        String str2 = "object2";
2251
        String str3 = "object3";
2252
2253
        //insert two documents
2254
        Session session = getTestSession();
2255
        Identifier guid1 = new Identifier();
2256
        guid1.setValue(generateDocumentId());
2257
        InputStream object1 = new ByteArrayInputStream(str1.getBytes("UTF-8"));
2258
        SystemMetadata sysmeta1 = createSystemMetadata(guid1, session.getSubject(), object1);
2259
        MNodeService.getInstance(request).create(session, guid1, object1, sysmeta1);
2260
        //Test the generating object succeeded.
2261
        SystemMetadata metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid1);
2262
        assertTrue(metadata.getIdentifier().equals(guid1));
2263
        assertTrue(metadata.getSize().equals(sysmeta1.getSize()));
2264
2265
        Identifier guid2 = new Identifier();
2266
        guid2.setValue(generateDocumentId());
2267
        InputStream object2 = new ByteArrayInputStream(str1.getBytes("UTF-8"));
2268
        SystemMetadata sysmeta2 = createSystemMetadata(guid2, session.getSubject(), object2);
2269
        MNodeService.getInstance(request).create(session, guid2, object2, sysmeta2);
2270
        //Test the generating object succeeded.
2271
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid2);
2272
        assertTrue(metadata.getIdentifier().equals(guid2));
2273
        assertTrue(metadata.getSize().equals(sysmeta2.getSize()));
2274
2275
2276
2277
        //update the system metadata without touching the obsoletes and obsoletdBy
2278
        AccessPolicy accessPolicy = new AccessPolicy();
2279
        AccessRule allow = new AccessRule();
2280
        allow.addPermission(Permission.WRITE);
2281
        Subject subject = new Subject();
2282
        subject.setValue("user_foo");
2283
        allow.addSubject(subject);
2284
        accessPolicy.addAllow(allow);
2285
        sysmeta1.setAccessPolicy(accessPolicy);
2286 9281 tao
        BigInteger serialVersion = metadata.getSerialVersion();
2287
        serialVersion = serialVersion.add(BigInteger.ONE);
2288
        sysmeta1.setSerialVersion(serialVersion);
2289 9276 tao
        MNodeService.getInstance(request).updateSystemMetadata(session, guid1, sysmeta1);
2290
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid1);
2291
        assertTrue(metadata.getIdentifier().equals(guid1));
2292
        assertTrue(metadata.getObsoletedBy() == null);
2293
        assertTrue(metadata.getObsoletes() == null);
2294
        Session newSession = new Session();
2295
        newSession.setSubject(subject);
2296
        boolean isAuthorized = MNodeService.getInstance(request).isAuthorized(newSession, guid1, Permission.WRITE);
2297
        assertTrue(isAuthorized);
2298
2299
        sysmeta2.setAccessPolicy(accessPolicy);
2300 9281 tao
        serialVersion = metadata.getSerialVersion();
2301
        serialVersion = serialVersion.add(BigInteger.ONE);
2302
        sysmeta2.setSerialVersion(serialVersion);
2303 9276 tao
        MNodeService.getInstance(request).updateSystemMetadata(session, guid2, sysmeta2);
2304
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid2);
2305
        assertTrue(metadata.getIdentifier().equals(guid2));
2306
        assertTrue(metadata.getObsoletes() == null);
2307
        assertTrue(metadata.getObsoletedBy() == null);
2308
        assertTrue(metadata.getChecksum().getValue().equals(sysmeta2.getChecksum().getValue()));
2309
        isAuthorized = MNodeService.getInstance(request).isAuthorized(newSession, guid2, Permission.WRITE);
2310
        assertTrue(isAuthorized);
2311
2312
2313
2314 9278 tao
        //update obsolets and obsoletedBy sucessfully - set p2 obsoletes p1
2315 9276 tao
        sysmeta1.setObsoletedBy(guid2);
2316 9281 tao
        serialVersion = metadata.getSerialVersion();
2317
        serialVersion = serialVersion.add(BigInteger.ONE);
2318
        sysmeta1.setSerialVersion(serialVersion);
2319 9276 tao
        MNodeService.getInstance(request).updateSystemMetadata(session, guid1, sysmeta1);
2320
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid1);
2321
        assertTrue(metadata.getIdentifier().equals(guid1));
2322
        assertTrue(metadata.getObsoletedBy().equals(guid2));
2323
        assertTrue(metadata.getObsoletes() == null);
2324
        assertTrue(metadata.getChecksum().getValue().equals(sysmeta1.getChecksum().getValue()));
2325
2326
        sysmeta2.setObsoletes(guid1);
2327 9281 tao
        serialVersion = metadata.getSerialVersion();
2328
        serialVersion = serialVersion.add(BigInteger.ONE);
2329
        sysmeta2.setSerialVersion(serialVersion);
2330 9276 tao
        MNodeService.getInstance(request).updateSystemMetadata(session, guid2, sysmeta2);
2331
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid2);
2332
        assertTrue(metadata.getIdentifier().equals(guid2));
2333
        assertTrue(metadata.getObsoletes().equals(guid1));
2334
        assertTrue(metadata.getObsoletedBy() == null);
2335
        assertTrue(metadata.getChecksum().getValue().equals(sysmeta2.getChecksum().getValue()));
2336
2337
2338
2339
2340 9278 tao
        //update obsolets and obsoletedBy sucessfully - set p1 obsoletedBy p2
2341 9276 tao
        sysmeta1.setObsoletedBy(guid2);
2342 9281 tao
        serialVersion = metadata.getSerialVersion();
2343
        serialVersion = serialVersion.add(BigInteger.ONE);
2344
        sysmeta1.setSerialVersion(serialVersion);
2345 9276 tao
        MNodeService.getInstance(request).updateSystemMetadata(session, guid1, sysmeta1);
2346
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid1);
2347
        assertTrue(metadata.getIdentifier().equals(guid1));
2348
        assertTrue(metadata.getObsoletedBy().equals(guid2));
2349
        assertTrue(metadata.getObsoletes() == null);
2350
        assertTrue(metadata.getChecksum().getValue().equals(sysmeta1.getChecksum().getValue()));
2351
2352
        sysmeta2.setObsoletes(guid1);
2353 9281 tao
        serialVersion = metadata.getSerialVersion();
2354
        serialVersion = serialVersion.add(BigInteger.ONE);
2355
        sysmeta2.setSerialVersion(serialVersion);
2356 9276 tao
        MNodeService.getInstance(request).updateSystemMetadata(session, guid2, sysmeta2);
2357
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid2);
2358
        assertTrue(metadata.getIdentifier().equals(guid2));
2359
        assertTrue(metadata.getObsoletes().equals(guid1));
2360
        assertTrue(metadata.getObsoletedBy() == null);
2361
        assertTrue(metadata.getChecksum().getValue().equals(sysmeta2.getChecksum().getValue()));
2362
2363
2364
2365
2366
2367
        //resetting the obsoletes and obsoletedBy fails
2368
        Identifier newId = new Identifier();
2369
        newId.setValue("newValue");
2370
        sysmeta1.setObsoletedBy(newId);
2371 9281 tao
        serialVersion = metadata.getSerialVersion();
2372
        serialVersion = serialVersion.add(BigInteger.ONE);
2373
        sysmeta1.setSerialVersion(serialVersion);
2374 9276 tao
        try {
2375
            MNodeService.getInstance(request).updateSystemMetadata(session, guid1, sysmeta1);
2376
            fail("We shouldn't get there");
2377
        } catch (Exception e) {
2378
            e.printStackTrace();
2379
            assertTrue(e instanceof InvalidRequest);
2380
        }
2381
2382
        sysmeta2.setObsoletes(newId);
2383 9281 tao
        serialVersion = metadata.getSerialVersion();
2384
        serialVersion = serialVersion.add(BigInteger.ONE);
2385
        sysmeta2.setSerialVersion(serialVersion);
2386 9276 tao
        try {
2387
            MNodeService.getInstance(request).updateSystemMetadata(session, guid2, sysmeta2);
2388
            fail("We shouldn't get there");
2389
        } catch (Exception e) {
2390 9278 tao
            e.printStackTrace();
2391 9276 tao
            assertTrue(e instanceof InvalidRequest);
2392
        }
2393 9278 tao
2394
2395
2396
2397
        //insert another object
2398
        Identifier guid5 = new Identifier();
2399
        guid5.setValue(generateDocumentId());
2400
        object1 = new ByteArrayInputStream(str1.getBytes("UTF-8"));
2401
        SystemMetadata sysmeta5 = createSystemMetadata(guid5, session.getSubject(), object1);
2402
        MNodeService.getInstance(request).create(session, guid5, object1, sysmeta5);
2403
        //Test the generating object succeeded.
2404
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid5);
2405
        assertTrue(metadata.getIdentifier().equals(guid5));
2406
        assertTrue(metadata.getSize().equals(sysmeta5.getSize()));
2407
2408
2409
2410
        //Setting p5 obosletes p1 fails since p2 already obsoletes p1
2411
        sysmeta5.setObsoletes(guid1);
2412 9281 tao
        serialVersion = metadata.getSerialVersion();
2413
        serialVersion = serialVersion.add(BigInteger.ONE);
2414
        sysmeta5.setSerialVersion(serialVersion);
2415 9278 tao
        try {
2416
            MNodeService.getInstance(request).updateSystemMetadata(session, guid5, sysmeta5);
2417
            fail("We shouldn't get there");
2418
        } catch (Exception e) {
2419
            e.printStackTrace();
2420
2421
        }
2422
2423
2424
2425
        //Setting p5 obosletedBy p2 fails since p1 already is obsoletedBy p2
2426
        sysmeta5.setObsoletes(null);
2427
        sysmeta5.setObsoletedBy(guid2);
2428
        try {
2429
            MNodeService.getInstance(request).updateSystemMetadata(session, guid5, sysmeta5);
2430
            fail("We shouldn't get there");
2431
        } catch (Exception e) {
2432
            e.printStackTrace();
2433
2434
        }
2435
2436
2437
2438
        //Setting p5 obsoletes p2 succeeds since the obosoletes of p5 is null and noone obsoletes p2.
2439
        sysmeta5.setObsoletedBy(null);
2440
        sysmeta5.setObsoletes(guid2);
2441
        MNodeService.getInstance(request).updateSystemMetadata(session, guid5, sysmeta5);
2442
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid5);
2443
        assertTrue(metadata.getIdentifier().equals(guid5));
2444
        assertTrue(metadata.getObsoletes().equals(guid2));
2445
        assertTrue(metadata.getObsoletedBy() == null);
2446
        assertTrue(metadata.getChecksum().getValue().equals(sysmeta5.getChecksum().getValue()));
2447
2448
2449
2450
        //Setting p2 obsoletedBy p5 succeeds since the obosoletedBy of p2 is null and p5 doesn't obsolete anything
2451
        sysmeta2.setObsoletes(guid1);
2452
        sysmeta2.setObsoletedBy(guid5);
2453 9281 tao
        serialVersion = sysmeta2.getSerialVersion();
2454
        serialVersion = serialVersion.add(BigInteger.ONE);
2455
        sysmeta2.setSerialVersion(serialVersion);
2456 9278 tao
        MNodeService.getInstance(request).updateSystemMetadata(session, guid2, sysmeta2);
2457
        metadata = MNodeService.getInstance(request).getSystemMetadata(session, guid2);
2458
        assertTrue(metadata.getIdentifier().equals(guid2));
2459
        assertTrue(metadata.getObsoletes().equals(guid1));
2460
        assertTrue(metadata.getObsoletedBy().equals(guid5));
2461
        assertTrue(metadata.getChecksum().getValue().equals(sysmeta2.getChecksum().getValue()));
2462 9276 tao
    }
2463
2464 9167 tao
}