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