Project

General

Profile

1
/**
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: tao $'
8
 *     '$Date: 2015-07-28 16:22:51 -0700 (Tue, 28 Jul 2015) $'
9
 * '$Revision: 9267 $'
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

    
29
import java.io.ByteArrayInputStream;
30
import java.io.InputStream;
31
import java.math.BigInteger;
32
import java.text.SimpleDateFormat;
33
import java.util.Calendar;
34
import java.util.Date;
35
import java.util.List;
36

    
37
import junit.framework.Test;
38
import junit.framework.TestSuite;
39

    
40
import org.apache.commons.io.IOUtils;
41
import org.dataone.client.v2.itk.D1Client;
42
import org.dataone.service.exceptions.BaseException;
43
import org.dataone.service.exceptions.InvalidRequest;
44
import org.dataone.service.exceptions.InvalidSystemMetadata;
45
import org.dataone.service.exceptions.NotAuthorized;
46
import org.dataone.service.exceptions.NotFound;
47
import org.dataone.service.exceptions.NotImplemented;
48
import org.dataone.service.exceptions.ServiceFailure;
49
import org.dataone.service.types.v1.AccessPolicy;
50
import org.dataone.service.types.v1.AccessRule;
51
import org.dataone.service.types.v1.Checksum;
52
import org.dataone.service.types.v1.DescribeResponse;
53
import org.dataone.service.types.v1.Event;
54
import org.dataone.service.types.v1.Identifier;
55
import org.dataone.service.types.v1.NodeReference;
56
import org.dataone.service.types.v1.NodeType;
57
import org.dataone.service.types.v1.ObjectFormatIdentifier;
58
import org.dataone.service.types.v1.ObjectList;
59
import org.dataone.service.types.v1.Permission;
60
import org.dataone.service.types.v1.Replica;
61
import org.dataone.service.types.v1.ReplicationPolicy;
62
import org.dataone.service.types.v1.ReplicationStatus;
63
import org.dataone.service.types.v1.Session;
64
import org.dataone.service.types.v1.Subject;
65
import org.dataone.service.types.v2.Log;
66
import org.dataone.service.types.v2.Node;
67
import org.dataone.service.types.v2.NodeList;
68
import org.dataone.service.types.v2.ObjectFormat;
69
import org.dataone.service.types.v2.ObjectFormatList;
70
import org.dataone.service.types.v2.OptionList;
71
import org.dataone.service.types.v2.SystemMetadata;
72
import org.dataone.service.util.Constants;
73

    
74
import edu.ucsb.nceas.metacat.dataone.CNodeService;
75
import edu.ucsb.nceas.metacat.dataone.MNodeService;
76

    
77
/**
78
 * A JUnit test for testing the dataone CNCore implementation
79
 */
80
public class CNodeServiceTest extends D1NodeServiceTest {   
81
    
82
    /**
83
    * constructor for the test
84
    */
85
    public CNodeServiceTest(String name)
86
    {
87
        super(name);
88
    }
89

    
90
	/**
91
	 * Create a suite of tests to be run together
92
	 */
93
	public static Test suite() 
94
	{
95
		TestSuite suite = new TestSuite();
96
		suite.addTest(new CNodeServiceTest("initialize"));
97
		
98
		suite.addTest(new CNodeServiceTest("testChecksum"));
99
		suite.addTest(new CNodeServiceTest("testCreate"));
100
		suite.addTest(new CNodeServiceTest("testGet"));
101
		suite.addTest(new CNodeServiceTest("testGetFormat"));
102
		suite.addTest(new CNodeServiceTest("testGetLogRecords"));
103
		suite.addTest(new CNodeServiceTest("testGetSystemMetadata"));
104
		suite.addTest(new CNodeServiceTest("testIsAuthorized"));
105
		suite.addTest(new CNodeServiceTest("testListFormats"));
106
		suite.addTest(new CNodeServiceTest("testListNodes"));
107
		suite.addTest(new CNodeServiceTest("testObjectFormatNotFoundException"));
108
		suite.addTest(new CNodeServiceTest("testRegisterSystemMetadata"));
109
		suite.addTest(new CNodeServiceTest("testReplicationPolicy"));
110
		suite.addTest(new CNodeServiceTest("testReplicationStatus"));
111
		suite.addTest(new CNodeServiceTest("testReserveIdentifier"));
112
		suite.addTest(new CNodeServiceTest("testSearch"));
113
		suite.addTest(new CNodeServiceTest("testSetAccessPolicy"));
114
		suite.addTest(new CNodeServiceTest("testSetOwner"));
115
		suite.addTest(new CNodeServiceTest("readDeletedObject"));
116
		suite.addTest(new CNodeServiceTest("testGetSID"));
117
		suite.addTest(new CNodeServiceTest("testListViews"));
118
		suite.addTest(new CNodeServiceTest("testUpdateSystemMetadata"));
119
	
120
		return suite;
121
	}
122
	
123
	
124
	/**
125
	 * test for registering standalone system metadata
126
	 */
127
	public Identifier testRegisterSystemMetadata() {
128
	    printTestHeader("testRegisterSystemMetadata");
129

    
130
	    try {
131
	        Session testSession = getTestSession();
132
            Session session = getCNSession();
133
			Identifier guid = new Identifier();
134
			guid.setValue("testRegisterSystemMetadata." + System.currentTimeMillis());
135
			InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
136
			SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
137
			try {
138
			    CNodeService.getInstance(request).registerSystemMetadata(testSession, guid, sysmeta);
139
			    fail("We shouldn't get there since the test session can't regsiter system metadata");
140
			} catch (NotAuthorized ee) {
141
			    
142
			}
143
			Identifier retGuid = CNodeService.getInstance(request).registerSystemMetadata(session, guid, sysmeta);
144
			assertEquals(guid.getValue(), retGuid.getValue());
145
			return retGuid;
146
        } catch(Exception e) {
147
            fail("Unexpected error: " + e.getMessage());
148
        }
149
        return null;
150
	}
151
	
152
	/**
153
	 * test for getting system metadata
154
	 */
155
	public void testGetSystemMetadata() {
156
	    printTestHeader("testGetSystemMetadata");
157

    
158
	    try {
159
            Session session = getCNSession();
160
			Identifier guid = new Identifier();
161
			guid.setValue("testGetSystemMetadata." + System.currentTimeMillis());
162
			InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
163
			SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
164
			Identifier retGuid = CNodeService.getInstance(request).registerSystemMetadata(session, guid, sysmeta);
165
			assertEquals(guid.getValue(), retGuid.getValue());
166
			// get it
167
			SystemMetadata retSysmeta = CNodeService.getInstance(request).getSystemMetadata(session, guid);
168
			// check it
169
			assertEquals(sysmeta.getIdentifier().getValue(), retSysmeta.getIdentifier().getValue());
170
        } catch(Exception e) {
171
            fail("Unexpected error: " + e.getMessage());
172
        }
173
	}
174
	
175
	public void testGetLogRecords() {
176
	    printTestHeader("testGetLogRecords");
177
	    try {
178

    
179
		    Session session = getCNSession();
180
		    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
181
		    Date fromDate = sdf.parse("2010-01-01");
182
		    Date toDate = new Date();
183
		    Event event = Event.CREATE;
184
		    int start = 0;
185
		    int count = 1;
186
	    
187
		    Log log = CNodeService.getInstance(request).getLogRecords(session, fromDate, toDate, 
188
		    	event.xmlValue(), null, start, count);
189
		    assertNotNull(log);
190
		    assertTrue(log.getCount() == count);
191
		    assertTrue(log.getStart() == start);
192
		    assertTrue(log.getTotal() > 0);
193
	    } catch (Exception e) {
194
		    e.printStackTrace();
195
		    fail("Unexpected error: " + e.getMessage());
196
	    } 
197
	}
198
	
199
	public void testCreate() {
200
	    printTestHeader("testCreate");
201

    
202
	    try {
203
            Session session = getCNSession();
204
			Identifier guid = new Identifier();
205
			guid.setValue("testCreate." + System.currentTimeMillis());
206
			InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
207
			SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
208
			Identifier pid = CNodeService.getInstance(request).create(session, guid, object, sysmeta);
209
			assertEquals(guid, pid);
210
        } catch(Exception e) {
211
        	e.printStackTrace();
212
            fail("Unexpected error: " + e.getMessage());
213
        }
214
	}
215
	
216
	public void testGet() {
217
	    printTestHeader("testGet");
218

    
219
	    try {
220
            Session session = getCNSession();
221
			Identifier guid = new Identifier();
222
			guid.setValue("testGet." + System.currentTimeMillis());
223
			InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
224
			SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
225
			Identifier pid = CNodeService.getInstance(request).create(session, guid, object, sysmeta);
226
			assertEquals(guid.getValue(), pid.getValue());
227
			System.out.println("the pid is+++++++++++++++++++++++++"+guid.getValue());
228
			// get it
229
			InputStream retObject = CNodeService.getInstance(request).get(session, pid);
230
			// check it
231
			object.reset();
232
			assertTrue(IOUtils.contentEquals(object, retObject));
233
        } catch(Exception e) {
234
        	e.printStackTrace();
235
            fail("Unexpected error: " + e.getMessage());
236
        }
237
	}
238
	
239
	public void testChecksum() {
240
	    printTestHeader("testChecksum");
241

    
242
	    try {
243
            Session session = getCNSession();
244
			Identifier guid = new Identifier();
245
			guid.setValue("testChecksum." + System.currentTimeMillis());
246
			InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
247
			SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
248
			// save it
249
			Identifier retGuid = CNodeService.getInstance(request).registerSystemMetadata(session, guid, sysmeta);
250
			assertEquals(guid.getValue(), retGuid.getValue());
251
			// check it
252
			Checksum checksum = CNodeService.getInstance(request).getChecksum(session, guid);
253
			assertEquals(sysmeta.getChecksum().getValue(), checksum.getValue());
254
        } catch(Exception e) {
255
            fail("Unexpected error: " + e.getMessage());
256
        }
257
	}
258
	
259
	public void testListNodes() {
260
	    printTestHeader("testListNodes");
261

    
262
	    try {
263
	    	CNodeService.getInstance(request).listNodes();
264
        } catch(NotImplemented e) {
265
        	// expecting not implemented
266
            assertTrue(true);
267
        } catch(Exception e) {
268
            fail("Unexpected error: " + e.getMessage());
269
        }
270
	}
271
	
272
	public void testReserveIdentifier() {
273
	    printTestHeader("testReserveIdentifier");
274

    
275
	    try {
276
            Session session = getCNSession();
277
			Identifier guid = new Identifier();
278
			guid.setValue("testReserveIdentifier." + System.currentTimeMillis());
279
			// reserve it
280
			Identifier resultPid = CNodeService.getInstance(request).reserveIdentifier(session, guid);
281
			assertNotNull(resultPid);
282
			assertEquals(guid.getValue(), resultPid.getValue());
283
	    } catch(NotImplemented ni) {
284
        	// this is not implemented in Metacat
285
            assertTrue(true);	
286
        } catch(Exception e) {
287
        	e.printStackTrace();
288
            fail("Unexpected error: " + e.getMessage());
289
        }
290
	}
291
	
292
	public void testSearch() {
293
	    printTestHeader("testSearch");
294

    
295
	    try {
296
            Session session = getCNSession();
297
			
298
			// search for objects, but expect a NotImplemented exception
299
			try {
300
				ObjectList objectList = CNodeService.getInstance(request).search(session, null, null);
301
			} catch (NotImplemented ne) {
302
				assertTrue(true);
303
				return;
304
			}
305
			fail("Metacat should not implement CN.search");
306
			
307
        } catch(Exception e) {
308
            fail("Unexpected error: " + e.getMessage());
309
        }
310
	}
311
	
312
	public void testSetOwner() {
313
	    printTestHeader("testSetOwner");
314

    
315
	    try {
316
            Session session = getCNSession();
317
			Identifier guid = new Identifier();
318
			guid.setValue("testSetOwner." + System.currentTimeMillis());
319
			InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
320
			SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
321
			long serialVersion = 1L;
322
			// save it
323
			Identifier retGuid = CNodeService.getInstance(request).registerSystemMetadata(session, guid, sysmeta);
324
			assertEquals(guid.getValue(), retGuid.getValue());
325
			Subject rightsHolder = new Subject();
326
			rightsHolder.setValue("newUser");
327
			// set it
328
			Identifier retPid = CNodeService.getInstance(request).setRightsHolder(session, guid, rightsHolder, serialVersion);
329
			assertEquals(guid, retPid);
330
			// get it
331
			sysmeta = CNodeService.getInstance(request).getSystemMetadata(session, guid);
332
			assertNotNull(sysmeta);
333
			// check it
334
			assertTrue(rightsHolder.equals(sysmeta.getRightsHolder()));
335
			
336
        } catch(Exception e) {
337
            fail("Unexpected error: " + e.getMessage());
338
        }
339
	}
340
	
341
	public void testSetAccessPolicy() {
342
	    printTestHeader("testSetAccessPolicy");
343

    
344
	    try {
345
            Session session = getCNSession();
346
			Identifier guid = new Identifier();
347
			guid.setValue("testSetAccessPolicy." + System.currentTimeMillis());
348
			InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
349
			SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
350
	    long serialVersion = 1L;
351

    
352
			// save it
353
			Identifier retGuid = CNodeService.getInstance(request).registerSystemMetadata(session, guid, sysmeta);
354
			assertEquals(guid.getValue(), retGuid.getValue());
355
			AccessPolicy accessPolicy = new AccessPolicy();
356
			AccessRule accessRule = new AccessRule();
357
			accessRule.addPermission(Permission.WRITE);
358
			Subject publicSubject = new Subject();
359
			publicSubject.setValue(Constants.SUBJECT_PUBLIC);
360
			accessRule.addSubject(publicSubject);
361
			accessPolicy.addAllow(accessRule);
362
			// set it
363
			boolean result = CNodeService.getInstance(request).setAccessPolicy(session, guid, accessPolicy, serialVersion );
364
			assertTrue(result);
365
			// check it
366
			result = CNodeService.getInstance(request).isAuthorized(session, guid, Permission.WRITE);
367
			assertTrue(result);
368
        } catch(Exception e) {
369
            fail("Unexpected error: " + e.getMessage());
370
        }
371
	}
372
	
373
	public void testIsAuthorized() {
374
	    printTestHeader("testIsAuthorized");
375

    
376
	    try {
377
            Session session = getCNSession();
378
			Identifier guid = new Identifier();
379
			guid.setValue("testIsAuthorized." + System.currentTimeMillis());
380
			InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
381
			SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
382
			// save it
383
			Identifier retGuid = CNodeService.getInstance(request).registerSystemMetadata(session, guid, sysmeta);
384
			assertEquals(guid.getValue(), retGuid.getValue());
385
			// check it
386
			Subject publicSubject = new Subject();
387
			publicSubject.setValue(Constants.SUBJECT_PUBLIC);
388
			session.setSubject(publicSubject);
389
			// public read
390
			boolean result = CNodeService.getInstance(request).isAuthorized(session, guid, Permission.READ);
391
			assertTrue(result);
392
			// not public write
393
			try {
394
				result = false;
395
				result = CNodeService.getInstance(request).isAuthorized(session, guid, Permission.WRITE);
396
				fail("Public WRITE should be denied");
397
			} catch (NotAuthorized nae) {
398
				result = true;
399
			}
400
			assertTrue(result);
401
        } catch(Exception e) {
402
            fail("Unexpected error: " + e.getMessage());
403
        }
404
	}
405
	
406
	public void testReplicationPolicy() {
407
	    printTestHeader("testReplicationPolicy");
408

    
409
	    try {
410
            Session session = getCNSession();
411
			Identifier guid = new Identifier();
412
			guid.setValue("testReplicationPolicy." + System.currentTimeMillis());
413
			InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
414
			SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
415
	    long serialVersion = 1L;
416

    
417
			// save it
418
			Identifier retGuid = CNodeService.getInstance(request).registerSystemMetadata(session, guid, sysmeta);
419
			assertEquals(guid.getValue(), retGuid.getValue());
420
			
421
			ReplicationPolicy policy = new ReplicationPolicy();
422
			NodeReference node = new NodeReference();
423
			node.setValue("testNode");
424
			policy.addPreferredMemberNode(node );
425
			// set it
426
			boolean result = CNodeService.getInstance(request).setReplicationPolicy(session, guid, policy, serialVersion);
427
			assertTrue(result);
428
			// get it
429
			sysmeta = CNodeService.getInstance(request).getSystemMetadata(session, guid);
430
			assertNotNull(sysmeta);
431
			// check it
432
			assertEquals(policy.getPreferredMemberNode(0).getValue(), sysmeta.getReplicationPolicy().getPreferredMemberNode(0).getValue());
433
			
434
        } catch(Exception e) {
435
            fail("Unexpected error: " + e.getMessage());
436
        }
437
	}
438
	
439
	public void testReplicationStatus() {
440
	    printTestHeader("testReplicationStatus");
441

    
442
	    try {
443
            Session session = getCNSession();
444
			Identifier guid = new Identifier();
445
			guid.setValue("testReplicationStatus." + System.currentTimeMillis());
446
			InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
447
			SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
448
			Replica replica = new Replica();
449
			NodeReference replicaMemberNode = new NodeReference();
450
			replicaMemberNode.setValue("testNode");
451
			replica.setReplicationStatus(ReplicationStatus.REQUESTED);
452
			replica.setReplicaMemberNode(replicaMemberNode);
453
			replica.setReplicaVerified(Calendar.getInstance().getTime());
454
			sysmeta.addReplica(replica );
455
			// save it
456
			Identifier retGuid = CNodeService.getInstance(request).registerSystemMetadata(session, guid, sysmeta);
457
			assertEquals(guid.getValue(), retGuid.getValue());
458
			// set it
459
			ReplicationStatus status = ReplicationStatus.COMPLETED;
460
			BaseException failure = new NotAuthorized("000", "Mock exception for " + this.getClass().getName());
461
			//Test the failure of setReplicationStatus by a non-cn subject
462
			Session testSession = getTestSession();
463
			try {
464
			    CNodeService.getInstance(request).setReplicationStatus(testSession, guid, replicaMemberNode, status, failure);
465
			    fail("It can't reach here since the non-cn subject can't call setReplicationStatus");
466
			} catch (NotAuthorized ee) {
467
			    
468
			}
469
			//Test the success of setReplicationStatus by a cn subject
470
			boolean result = CNodeService.getInstance(request).setReplicationStatus(session, guid, replicaMemberNode, status, failure);
471
			assertTrue(result);
472
			// get it
473
			sysmeta = CNodeService.getInstance(request).getSystemMetadata(session, guid);
474
			assertNotNull(sysmeta);
475
			// check it
476
			assertEquals(status, sysmeta.getReplica(0).getReplicationStatus());
477
			
478
        } catch(Exception e) {
479
            fail("Unexpected error: " + e.getMessage());
480
        }
481
	}
482
	
483
	/**
484
	 * Run an initial test that always passes to check that the test harness is
485
	 * working.
486
	 */
487
	public void initialize() 
488
	{
489
	    printTestHeader("initialize");
490
		assertTrue(1 == 1);
491
	}
492
	
493
	/**
494
	 * We want to act as the CN itself
495
	 * @throws ServiceFailure 
496
	 * @throws Exception 
497
	 */
498
	/*@Override
499
	public Session getTestSession() throws Exception {
500
		Session session = super.getTestSession();
501
		
502
		// use the first CN we find in the nodelist
503
        NodeList nodeList = D1Client.getCN().listNodes();
504
        for (Node node : nodeList.getNodeList()) {
505
            if ( node.getType().equals(NodeType.CN) ) {
506
                
507
                List<Subject> subjects = node.getSubjectList();
508
                for (Subject subject : subjects) {
509
                   session.setSubject(subject);
510
                   // we are done here
511
                   return session;
512
                }
513
            }
514
        }
515
        // in case we didn't find it
516
        return session;
517
	}*/
518
	
519

    
520
	/**
521
	 * test to list the object formats registered in metacat
522
	 */
523
	public void testListFormats() {
524
		
525
    printTestHeader("testListFormats");
526
    
527
    // make sure we are set up
528
    setUpFormats();
529
    
530
    // there should be at least 59 formats in the list
531
  	int formatsCount = 59;
532
  	ObjectFormatList objectFormatList;
533
  	
534
  	try {
535
	    objectFormatList = CNodeService.getInstance(request).listFormats();
536
	  	assertTrue(objectFormatList.getTotal() >= formatsCount);
537
  	
538
  	} catch (ServiceFailure e) {
539
  		fail("Could not get the object format list: " + e.getMessage());
540

    
541
    } catch (NotImplemented e) {
542
  		fail("Could not get the object format list: " + e.getMessage());
543

    
544
    }
545
    
546
	}
547
	
548
  /**
549
   * Test getting a single object format from the registered list
550
   */
551
  public void testGetFormat() {
552
  	
553
    printTestHeader("testGetFormat");
554

    
555
    // make sure we are set up
556
    setUpFormats();
557
    
558
    String knownFormat = "text/plain";
559
    ObjectFormatIdentifier fmtid = new ObjectFormatIdentifier();
560
    fmtid.setValue(knownFormat);
561
  	
562
    try {
563
	    
564
			String result = 
565
				CNodeService.getInstance(request).getFormat(fmtid).getFormatId().getValue();
566
	  	System.out.println("Expected result: " + knownFormat);
567
	  	System.out.println("Found    result: " + result);
568
	  	assertTrue(result.equals(knownFormat));
569
  
570
    } catch (NullPointerException npe) {	  
571
	    fail("The returned format was null: " + npe.getMessage());
572
    
573
    } catch (NotFound nfe) {     
574
    	fail("The format " + knownFormat + " was not found: " + nfe.getMessage());
575
    	
576
    } catch (ServiceFailure sfe) {
577
    	fail("The format " + knownFormat + " was not found: " + sfe.getMessage());
578

    
579
    } catch (NotImplemented nie) {
580
    	fail("The getFormat() method has not been implemented: " + nie.getMessage());
581

    
582
    }
583
  	
584
  }
585
	
586
  /**
587
   * Test getting a non-existent object format, returning NotFound
588
   */
589
  public void testObjectFormatNotFoundException() {
590
  
591
    printTestHeader("testObjectFormatNotFoundException");
592

    
593
    ObjectFormatIdentifier fmtid = new ObjectFormatIdentifier();
594
  	String badFormat = "text/bad-format";
595
  	fmtid.setValue(badFormat);
596
  	
597
  	try {
598
  		
599
	    ObjectFormat objectFormat = 
600
	    	CNodeService.getInstance(request).getFormat(fmtid);
601
      
602
  	} catch (Exception e) {
603
	    
604
  		assertTrue(e instanceof NotFound);
605
  	}
606
  	
607
  }
608
  
609
  public void readDeletedObject() {
610
      printTestHeader("testCreate");
611

    
612
      try {
613
          Session session = getCNSession();
614
          Identifier guid = new Identifier();
615
          guid.setValue("testCreate." + System.currentTimeMillis());
616
          InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
617
          SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
618
          Identifier pid = CNodeService.getInstance(request).create(session, guid, object, sysmeta);
619
          assertEquals(guid, pid);
620
          
621
          Thread.sleep(3000);
622
          // use MN admin to delete
623
          session = getMNSession();
624
          Identifier deletedPid = CNodeService.getInstance(request).delete(session, pid);
625
          System.out.println("after deleting");
626
          assertEquals(pid.getValue(), deletedPid.getValue());
627
          // check that we cannot get the object
628
          session = getTestSession();
629
          InputStream deletedObject = null;
630
          try {
631
              //System.out.println("before read ===============");
632
              deletedObject = CNodeService.getInstance(request).get(session, deletedPid);
633
              //System.out.println("after read ===============");
634
          } catch (NotFound nf) {
635
              //System.out.println("the exception is1 "+nf.getMessage());
636
              //nf.printStackTrace();
637
              assertTrue(nf.getMessage().contains("deleted"));
638
          }
639
          try {
640
              //System.out.println("before read ===============");
641
              SystemMetadata sysmeta2 = CNodeService.getInstance(request).getSystemMetadata(session, deletedPid);
642
              //System.out.println("after read ===============");
643
          } catch (NotFound nf) {
644
              //System.out.println("the exception is "+nf.getMessage());
645
              //nf.printStackTrace();
646
              assertTrue(nf.getMessage().contains("deleted"));
647
          }
648
          
649
          try {
650
              //System.out.println("before read ===============");
651
              DescribeResponse describeResponse = CNodeService.getInstance(request).describe(session, pid);
652
              //System.out.println("after read ===============");
653
          } catch (NotFound nf) {
654
              //System.out.println("the exception is "+nf.getMessage());
655
              //nf.printStackTrace();
656
              assertTrue(nf.getMessage().contains("deleted"));
657
          }
658
          
659
          try {
660
              //System.out.println("before read ===============");
661
              Checksum checksum = CNodeService.getInstance(request).getChecksum(session, pid);
662
              //System.out.println("after read ===============");
663
          } catch (NotFound nf) {
664
              //System.out.println("the exception 3 is "+nf.getMessage());
665
              //nf.printStackTrace();
666
              assertTrue(nf.getMessage().contains("deleted"));
667
          }
668
          
669
          try {
670
              //System.out.println("before read ===============");
671
              boolean isAuthorized = 
672
                      CNodeService.getInstance(request).isAuthorized(session, pid, Permission.READ);
673
              //System.out.println("after read ===============");
674
          } catch (NotFound nf) {
675
              //System.out.println("the exception 4 is "+nf.getMessage());
676
              //nf.printStackTrace();
677
              assertTrue(nf.getMessage().contains("deleted"));
678
          }
679
          
680
         
681
          
682
          assertNull(deletedObject);
683
      } catch(Exception e) {
684
          e.printStackTrace();
685
          fail("Unexpected error: " + e.getMessage());
686
      }
687
  }
688
  
689
  /**
690
   * Test the method - get api  for a speicified SID
691
   */
692
  public void testGetSID() {
693
      String str1 = "object1";
694
      String str2 = "object2";
695
      String str3 = "object3";
696
      try {
697
          //insert test documents with a series id
698
          Session session = getCNSession();
699
          Identifier guid = new Identifier();
700
          guid.setValue(generateDocumentId());
701
          InputStream object1 = new ByteArrayInputStream(str1.getBytes("UTF-8"));
702
          SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object1);
703
          String sid1= "sid."+System.nanoTime();
704
          Identifier seriesId = new Identifier();
705
          seriesId.setValue(sid1);
706
          System.out.println("the first sid is "+seriesId.getValue());
707
          sysmeta.setSeriesId(seriesId);
708
          CNodeService.getInstance(request).create(session, guid, object1, sysmeta);
709
          System.out.println("the first pid is "+guid.getValue());
710
          //test the get(pid) for v2
711
          InputStream result = CNodeService.getInstance(request).get(session, guid);
712
          // go back to beginning of original stream
713
          object1.reset();
714
          // check
715
          assertTrue(object1.available() > 0);
716
          assertTrue(result.available() > 0);
717
          assertTrue(IOUtils.contentEquals(result, object1));
718
          // test the get(id) for v2
719
          InputStream result1 = CNodeService.getInstance(request).get(session, seriesId);
720
          object1.reset();
721
          // check
722
          assertTrue(object1.available() > 0);
723
          assertTrue(result1.available() > 0);
724
          assertTrue(IOUtils.contentEquals(result1, object1));
725
          //test the get(pid) for v1
726
          InputStream result2 = edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).get(session, guid);
727
          object1.reset();
728
          // check
729
          assertTrue(object1.available() > 0);
730
          assertTrue(result2.available() > 0);
731
          assertTrue(IOUtils.contentEquals(result2, object1));
732
          //test the get(sid) for v1
733
          try {
734
              InputStream result3 = edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).get(session, seriesId);
735
              fail("the get(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
736
          } catch (NotFound ee) {
737
              
738
          }
739
          SystemMetadata metadata = CNodeService.getInstance(request).getSystemMetadata(session, seriesId);
740
          assertTrue(metadata.getIdentifier().getValue().equals(guid.getValue()));
741
          assertTrue(metadata.getSeriesId().getValue().equals(seriesId.getValue()));
742
          DescribeResponse describeResponse = CNodeService.getInstance(request).describe(session, seriesId);
743
          assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata.getChecksum().getValue());
744
          assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata.getFormatId().getValue());
745
          
746
          metadata = CNodeService.getInstance(request).getSystemMetadata(session, guid);
747
          assertTrue(metadata.getIdentifier().getValue().equals(guid.getValue()));
748
          assertTrue(metadata.getSeriesId().getValue().equals(seriesId.getValue()));
749
          describeResponse = CNodeService.getInstance(request).describe(session, guid);
750
          assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata.getChecksum().getValue());
751
          assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata.getFormatId().getValue());
752
          
753
          org.dataone.service.types.v1.SystemMetadata sys1=edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).getSystemMetadata(session, guid);
754
          assertTrue(metadata.getIdentifier().getValue().equals(guid.getValue()));
755
          
756
          try {
757
              org.dataone.service.types.v1.SystemMetadata sys2=edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).getSystemMetadata(session, seriesId);
758
              fail("the getSystemMetadata(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
759
          } catch(NotFound nf2) {
760
              
761
          }
762
          
763
          describeResponse = edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).describe(session, guid);
764
          assertEquals(describeResponse.getDataONE_Checksum().getValue(), sys1.getChecksum().getValue());
765
          assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), sys1.getFormatId().getValue());
766
          try {
767
              describeResponse = edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).describe(session, seriesId);
768
              fail("the describe(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
769
          } catch(NotFound nf2) {
770
              
771
          }
772
          
773
          Checksum sum = CNodeService.getInstance(request).getChecksum(session, guid);
774
          assertTrue(sum.getValue().equals("5b78f9689b9aab1ebc0f3c1df916dd97"));
775
          
776
          try {
777
              sum = CNodeService.getInstance(request).getChecksum(session, seriesId);
778
              fail("the getCheckSum shouldn't work for sid");
779
          } catch(NotFound nf3) {
780
              
781
          }
782
          
783
          sum = edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).getChecksum(session, guid);
784
          assertTrue(sum.getValue().equals("5b78f9689b9aab1ebc0f3c1df916dd97"));
785
          
786
          try {
787
              sum = edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).getChecksum(session, seriesId);
788
              fail("the getCheckSum shouldn't work for sid");
789
          } catch(NotFound nf3) {
790
              
791
          }
792
          
793
          boolean isAuthorized = 
794
                  CNodeService.getInstance(request).isAuthorized(session, guid, Permission.READ);
795
          assertEquals(isAuthorized, true);
796
          
797
          isAuthorized = 
798
                  CNodeService.getInstance(request).isAuthorized(session, seriesId, Permission.READ);
799
          assertEquals(isAuthorized, true);
800
          
801
          isAuthorized = 
802
                  edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).isAuthorized(session, guid, Permission.READ);
803
          assertEquals(isAuthorized, true);
804
          
805
          try {
806
              isAuthorized = 
807
                      edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).isAuthorized(session, seriesId, Permission.READ);
808
              fail("we can't reach here since the v1 isAuthorized method doesn't suppport series id");
809
          } catch (NotFound e) {
810
              
811
          }
812

    
813
          //do a update with the same series id
814
          Thread.sleep(1000);
815
          Identifier newPid = new Identifier();
816
          newPid.setValue(generateDocumentId()+"1");
817
          System.out.println("the second pid is "+newPid.getValue());
818
          InputStream object2 = new ByteArrayInputStream(str2.getBytes("UTF-8"));
819
          SystemMetadata newSysMeta = createSystemMetadata(newPid, session.getSubject(), object2);
820
          newSysMeta.setObsoletes(guid);
821
          newSysMeta.setSeriesId(seriesId);
822
          //CNodeService.getInstance(request).update(session, guid, object2, newPid, newSysMeta);
823
          CNodeService.getInstance(request).create(session, newPid, object2, newSysMeta);
824
          //update the system metadata of previous version.
825
          sysmeta.setObsoletedBy(newPid);
826
          CNodeService.getInstance(request).updateSystemMetadata(session, guid, sysmeta);
827
          InputStream result4 = CNodeService.getInstance(request).get(session, guid);
828
          // go back to beginning of original stream
829
          object1.reset();
830
          // check
831
          assertTrue(object1.available() > 0);
832
          assertTrue(result4.available() > 0);
833
          assertTrue(IOUtils.contentEquals(result4, object1));
834
          
835
          InputStream result5 = CNodeService.getInstance(request).get(session, newPid);
836
          // go back to beginning of original stream
837
          object2.reset();
838
          // check
839
          assertTrue(object2.available() > 0);
840
          assertTrue(result5.available() > 0);
841
          assertTrue(IOUtils.contentEquals(result5, object2));
842
          
843

    
844
          InputStream result6 = CNodeService.getInstance(request).get(session, seriesId);
845
          object2.reset();
846
          // check
847
          assertTrue(object2.available() > 0);
848
          assertTrue(result6.available() > 0);
849
          assertTrue(IOUtils.contentEquals(result6, object2));
850
          //test the get(pid) for v1
851
          InputStream result7 = edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).get(session, guid);
852
          //System.out.println("+++++++++++++++++++++"+IOUtils.toString(result7));
853
          object1.reset();
854
          // check
855
          assertTrue(object1.available() > 0);
856
          assertTrue(result7.available() > 0);
857
          assertTrue(IOUtils.contentEquals(result7, object1));
858
          
859
          InputStream result8 = edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).get(session, newPid);
860
          object2.reset();
861
          // check
862
          assertTrue(object2.available() > 0);
863
          assertTrue(result8.available() > 0);
864
          assertTrue(IOUtils.contentEquals(result8, object2));
865
          //test the get(sid) for v1
866
          try {
867
              InputStream result3 = edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).get(session, seriesId);
868
              fail("the get(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
869
          } catch (NotFound ee) {
870
              
871
          }
872
          
873
          SystemMetadata metadata1 = CNodeService.getInstance(request).getSystemMetadata(session, seriesId);
874
          assertTrue(metadata1.getIdentifier().getValue().equals(newPid.getValue()));
875
          assertTrue(metadata1.getSeriesId().getValue().equals(seriesId.getValue()));
876
          describeResponse = CNodeService.getInstance(request).describe(session, seriesId);
877
          assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata1.getChecksum().getValue());
878
          assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata1.getFormatId().getValue());
879
          
880
          SystemMetadata metadata2 = CNodeService.getInstance(request).getSystemMetadata(session, guid);
881
          assertTrue(metadata2.getIdentifier().getValue().equals(guid.getValue()));
882
          assertTrue(metadata2.getSeriesId().getValue().equals(seriesId.getValue()));
883
          describeResponse = CNodeService.getInstance(request).describe(session, guid);
884
          assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata2.getChecksum().getValue());
885
          assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata2.getFormatId().getValue());
886
          
887
          SystemMetadata metadata3 = CNodeService.getInstance(request).getSystemMetadata(session, newPid);
888
          assertTrue(metadata3.getIdentifier().getValue().equals(newPid.getValue()));
889
          assertTrue(metadata3.getSeriesId().getValue().equals(seriesId.getValue()));
890
          describeResponse = CNodeService.getInstance(request).describe(session, newPid);
891
          assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata3.getChecksum().getValue());
892
          assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata3.getFormatId().getValue());
893
          
894
          //do another update with different series id
895
          Thread.sleep(1000);
896
          String sid2 = "sid."+System.nanoTime();
897
          Identifier seriesId2= new Identifier();
898
          seriesId2.setValue(sid2);
899
          System.out.println("the second sid is "+seriesId2.getValue());
900
          Identifier newPid2 = new Identifier();
901
          newPid2.setValue(generateDocumentId()+"2");
902
          System.out.println("the third pid is "+newPid2.getValue());
903
          InputStream object3 = new ByteArrayInputStream(str3.getBytes("UTF-8"));
904
          SystemMetadata sysmeta3 = createSystemMetadata(newPid2, session.getSubject(), object3);
905
          sysmeta3.setObsoletes(newPid);
906
          sysmeta3.setSeriesId(seriesId2);
907
          //CNodeService.getInstance(request).update(session, newPid, object3, newPid2, sysmeta3);
908
          CNodeService.getInstance(request).create(session, newPid2, object3, sysmeta3);
909
          //update the system metadata of the previous version 
910
          newSysMeta.setObsoletedBy(newPid2);
911
          CNodeService.getInstance(request).updateSystemMetadata(session, newPid, newSysMeta);
912
          
913
          InputStream result9 = CNodeService.getInstance(request).get(session, guid);
914
          // go back to beginning of original stream
915
          object1.reset();
916
          // check
917
          assertTrue(object1.available() > 0);
918
          assertTrue(result9.available() > 0);
919
          assertTrue(IOUtils.contentEquals(result9, object1));
920
          
921
          InputStream result10 = CNodeService.getInstance(request).get(session, newPid);
922
          // go back to beginning of original stream
923
          object2.reset();
924
          // check
925
          assertTrue(object2.available() > 0);
926
          assertTrue(result10.available() > 0);
927
          assertTrue(IOUtils.contentEquals(result10, object2));
928
          
929
          
930
          InputStream result11 = CNodeService.getInstance(request).get(session, newPid2);
931
          // go back to beginning of original stream
932
          object3.reset();
933
          // check
934
          assertTrue(object3.available() > 0);
935
          assertTrue(result11.available() > 0);
936
          assertTrue(IOUtils.contentEquals(result11, object3));
937
          
938
          InputStream result12 = CNodeService.getInstance(request).get(session, seriesId2);
939
          object3.reset();
940
          // check
941
          assertTrue(object3.available() > 0);
942
          assertTrue(result12.available() > 0);
943
          assertTrue(IOUtils.contentEquals(result12, object3));
944
          
945
          InputStream result16 = CNodeService.getInstance(request).get(session, seriesId);
946
          object2.reset();
947
          // check
948
          assertTrue(object2.available() > 0);
949
          assertTrue(result16.available() > 0);
950
          assertTrue(IOUtils.contentEquals(result16, object2));
951
         
952
          //test the get(pid) for v1
953
          InputStream result13 = edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).get(session, guid);
954
          object1.reset();
955
          // check
956
          assertTrue(object1.available() > 0);
957
          assertTrue(result13.available() > 0);
958
          assertTrue(IOUtils.contentEquals(result13, object1));
959
          
960
          InputStream result14 = edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).get(session, newPid);
961
          object2.reset();
962
          // check
963
          assertTrue(object2.available() > 0);
964
          assertTrue(result14.available() > 0);
965
          assertTrue(IOUtils.contentEquals(result14, object2));
966
          
967
          InputStream result15 = edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).get(session, newPid2);
968
          object3.reset();
969
          // check
970
          assertTrue(object3.available() > 0);
971
          assertTrue(result15.available() > 0);
972
          assertTrue(IOUtils.contentEquals(result15, object3));
973
          
974
          SystemMetadata metadata4 = CNodeService.getInstance(request).getSystemMetadata(session, seriesId);
975
          assertTrue(metadata4.getIdentifier().getValue().equals(newPid.getValue()));
976
          assertTrue(metadata4.getSeriesId().getValue().equals(seriesId.getValue()));
977
          describeResponse = CNodeService.getInstance(request).describe(session, seriesId);
978
          assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata4.getChecksum().getValue());
979
          assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata4.getFormatId().getValue());
980
          
981
          SystemMetadata metadata5 = CNodeService.getInstance(request).getSystemMetadata(session, seriesId2);
982
          assertTrue(metadata5.getIdentifier().getValue().equals(newPid2.getValue()));
983
          assertTrue(metadata5.getSeriesId().getValue().equals(seriesId2.getValue()));
984
          describeResponse = CNodeService.getInstance(request).describe(session, seriesId2);
985
          assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata5.getChecksum().getValue());
986
          assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata5.getFormatId().getValue());
987
          
988
          SystemMetadata metadata6 = CNodeService.getInstance(request).getSystemMetadata(session, guid);
989
          assertTrue(metadata6.getIdentifier().getValue().equals(guid.getValue()));
990
          assertTrue(metadata6.getSeriesId().getValue().equals(seriesId.getValue()));
991
          describeResponse = CNodeService.getInstance(request).describe(session, guid);
992
          assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata6.getChecksum().getValue());
993
          assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata6.getFormatId().getValue());
994
          
995
          SystemMetadata metadata7 = CNodeService.getInstance(request).getSystemMetadata(session, newPid);
996
          assertTrue(metadata7.getIdentifier().getValue().equals(newPid.getValue()));
997
          assertTrue(metadata7.getSeriesId().getValue().equals(seriesId.getValue()));
998
          describeResponse = CNodeService.getInstance(request).describe(session, newPid);
999
          assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata7.getChecksum().getValue());
1000
          assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata7.getFormatId().getValue());
1001
          
1002
          SystemMetadata metadata8 = CNodeService.getInstance(request).getSystemMetadata(session, newPid2);
1003
          assertTrue(metadata8.getIdentifier().getValue().equals(newPid2.getValue()));
1004
          assertTrue(metadata8.getSeriesId().getValue().equals(seriesId2.getValue()));
1005
          describeResponse = CNodeService.getInstance(request).describe(session, newPid2);
1006
          assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata8.getChecksum().getValue());
1007
          assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata8.getFormatId().getValue());
1008
          
1009
          
1010
          
1011
          System.out.println("here===========================");
1012
          //test the get(sid) for v1
1013
          try {
1014
              InputStream result3 = edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).get(session, seriesId);
1015
              fail("the get(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1016
          } catch (NotFound ee) {
1017
              
1018
          }
1019
          
1020
          //test the get(sid) for v1
1021
          try {
1022
              InputStream result3 = edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).get(session, seriesId2);
1023
              fail("the get(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1024
          } catch (NotFound ee) {
1025
              
1026
          }
1027
          
1028
          //test to get non-existing id for v2
1029
          try {
1030
           // the pid should be null when we try to get a no-exist sid
1031
              Identifier non_exist_sid = new Identifier();
1032
              non_exist_sid.setValue("no-sid-exist-123qwe");
1033
              InputStream result3 = CNodeService.getInstance(request).get(session, non_exist_sid);
1034
              fail("the get(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1035
          } catch (NotFound ee) {
1036
              
1037
          }
1038
          
1039
          try {
1040
              // the pid should be null when we try to get a no-exist sid
1041
                 Identifier non_exist_sid = new Identifier();
1042
                 non_exist_sid.setValue("no-sid-exist-123qwe");
1043
                 SystemMetadata result3 = CNodeService.getInstance(request).getSystemMetadata(session, non_exist_sid);
1044
                 fail("the getSystemMetadata(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1045
          } catch (NotFound ee) {
1046
                 
1047
          }
1048
          
1049
          try {
1050
              // the pid should be null when we try to get a no-exist sid
1051
                 Identifier non_exist_sid = new Identifier();
1052
                 non_exist_sid.setValue("no-sid-exist-123qwe");
1053
                  CNodeService.getInstance(request).describe(session, non_exist_sid);
1054
                 fail("the describe(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1055
             } catch (NotFound ee) {
1056
                 
1057
             }
1058
          
1059
          
1060
          //do another update with invalid series ids
1061
          Thread.sleep(1000);
1062
          Identifier newPid3 = new Identifier();
1063
          newPid3.setValue(generateDocumentId()+"3");
1064
          System.out.println("the third pid is "+newPid3.getValue());
1065
          InputStream object4 = new ByteArrayInputStream(str3.getBytes("UTF-8"));
1066
          SystemMetadata sysmeta4 = createSystemMetadata(newPid3, session.getSubject(), object4);
1067
          sysmeta4.setObsoletes(newPid2);
1068
          sysmeta4.setSeriesId(seriesId);
1069
          /*try {
1070
              CNodeService.getInstance(request).create(session, newPid3, object4, sysmeta4);
1071
              fail("we can't reach here since the sid is using an old one ");
1072
          } catch (InvalidSystemMetadata eee) {
1073
              
1074
          } */
1075
          
1076
          /*sysmeta4.setSeriesId(newPid3);
1077
          try {
1078
              CNodeService.getInstance(request).create(session, newPid3, object4, sysmeta4);
1079
              fail("we can't reach here since the sid is using the pid ");
1080
          } catch (InvalidSystemMetadata eee) {
1081
              
1082
          }*/
1083
          
1084
          //test archive a series id by v1
1085
          try {
1086
              edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).archive(session, seriesId2);
1087
              fail("we can't reach here since the v1 archive method doesn't support the sid ");
1088
          } catch (NotFound nf2) {
1089
              
1090
          }
1091
          
1092
          // test delete a series id by v1
1093
          Session mnSession = getMNSession();
1094
          try {
1095
              edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).delete(mnSession, seriesId2);
1096
              fail("we can't reach here since the v1 delete method doesn't support the sid ");
1097
          } catch (NotFound nf2) {
1098
              
1099
          }
1100
          
1101
          // test archive a series id by v2
1102
          CNodeService.getInstance(request).archive(session, seriesId2);
1103
          SystemMetadata archived = CNodeService.getInstance(request).getSystemMetadata(session, seriesId2);
1104
          assertTrue(archived.getArchived());
1105
          archived = CNodeService.getInstance(request).getSystemMetadata(session, newPid2);
1106
          assertTrue(archived.getArchived());
1107
          
1108
          // test delete a series id by v2
1109
          CNodeService.getInstance(request).delete(mnSession, seriesId2);
1110
          try {
1111
              CNodeService.getInstance(request).get(session, seriesId2);
1112
              fail("we can't reach here since the series id was deleted ");
1113
          } catch (NotFound nf3) {
1114
              System.out.println("the message is ============="+nf3.getMessage());
1115
              //assertTrue(nf3.getMessage().indexOf("delete") >0);
1116
          }
1117
          
1118
          try {
1119
              CNodeService.getInstance(request).get(session, newPid2);
1120
              fail("we can't reach here since the series id was deleted ");
1121
          } catch (NotFound nf3) {
1122
              //System.out.println("the message is ============="+nf3.getMessage());
1123
              assertTrue(nf3.getMessage().indexOf("delete") >0);
1124
          }
1125
          
1126
          try {
1127
              edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).get(session, newPid2);
1128
              fail("we can't reach here since the series id was deleted ");
1129
          } catch (NotFound nf3) {
1130
              System.out.println("the message is ============="+nf3.getMessage());
1131
              assertTrue(nf3.getMessage().indexOf("delete") >0);
1132
          }
1133
          
1134
          //archive seriesId
1135
          CNodeService.getInstance(request).archive(mnSession, seriesId);
1136
          archived = CNodeService.getInstance(request).getSystemMetadata(session, seriesId);
1137
          assertTrue(archived.getArchived());
1138
          archived = CNodeService.getInstance(request).getSystemMetadata(session, newPid);
1139
          assertTrue(archived.getArchived());
1140
          
1141
          
1142
          //delete seriesId
1143
          CNodeService.getInstance(request).delete(mnSession, seriesId);
1144
          try {
1145
              CNodeService.getInstance(request).get(session, newPid);
1146
              fail("we can't reach here since the series id was deleted ");
1147
          } catch (NotFound nf3) {
1148
              //System.out.println("the message is ============="+nf3.getMessage());
1149
              assertTrue(nf3.getMessage().indexOf("delete") >0);
1150
          }
1151
          SystemMetadata meta = CNodeService.getInstance(request).getSystemMetadata(session, seriesId);
1152
          assertTrue(meta.getIdentifier().getValue().equals(guid.getValue()));
1153
          
1154
      } catch (Exception e) {
1155
          e.printStackTrace();
1156
          fail(e.getMessage());
1157
      }
1158
  }
1159
 
1160
  /**
1161
   * Test the listView methods.
1162
   * @throws Excpetion
1163
   */
1164
  public void testListViews() throws Exception {
1165
      OptionList list = CNodeService.getInstance(request).listViews();
1166
      assertTrue(list.sizeOptionList() >0);
1167
      List<String> names = list.getOptionList();
1168
      for(String name : names) {
1169
          System.out.println("It has the view named "+name);
1170
      }
1171
  }
1172
  
1173
  public void testUpdateSystemMetadata() throws Exception {
1174
          String str1 = "object1";
1175
          String str2 = "object2";
1176
          String str3 = "object3";
1177
  
1178
          //insert test documents with a series id
1179
          Session session = getCNSession();
1180
          Identifier guid = new Identifier();
1181
          guid.setValue(generateDocumentId());
1182
          InputStream object1 = new ByteArrayInputStream(str1.getBytes("UTF-8"));
1183
          SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object1);
1184
          String sid1= "sid."+System.nanoTime();
1185
          Identifier seriesId = new Identifier();
1186
          seriesId.setValue(sid1);
1187
          System.out.println("the first sid is "+seriesId.getValue());
1188
          sysmeta.setSeriesId(seriesId);
1189
          sysmeta.setArchived(false);
1190
          CNodeService.getInstance(request).create(session, guid, object1, sysmeta);
1191
          //Test the generating object succeeded. 
1192
          SystemMetadata metadata = CNodeService.getInstance(request).getSystemMetadata(session, guid);
1193
          assertTrue(metadata.getIdentifier().equals(guid));
1194
          assertTrue(metadata.getArchived().equals(false));
1195
          System.out.println("the checksum from request is "+metadata.getChecksum().getValue());
1196
          assertTrue(metadata.getSize().equals(sysmeta.getSize()));
1197
          
1198
          //test to fail to update system metadata by a non-cn subject
1199
          Session testSession = getTestSession();
1200
          metadata.setArchived(true);
1201
          try {
1202
              CNodeService.getInstance(request).updateSystemMetadata(testSession, guid, metadata);
1203
              fail("It shouldn't get there since the test session can't update system metadata");
1204
          } catch (NotAuthorized e) {
1205
              
1206
          }
1207
         
1208
          
1209
          //update system metadata sucessfully
1210
          metadata.setArchived(true);
1211
          CNodeService.getInstance(request).updateSystemMetadata(session, guid, metadata);
1212
          SystemMetadata metadata2 = CNodeService.getInstance(request).getSystemMetadata(session, seriesId);
1213
          assertTrue(metadata2.getIdentifier().equals(guid));
1214
          assertTrue(metadata2.getSeriesId().equals(seriesId));
1215
          assertTrue(metadata2.getArchived().equals(true));
1216
          assertTrue(metadata2.getChecksum().getValue().equals(metadata.getChecksum().getValue()));
1217
          
1218
          Identifier newId = new Identifier();
1219
          newId.setValue("newValue");
1220
          metadata.setIdentifier(newId);
1221
          try {
1222
              CNodeService.getInstance(request).updateSystemMetadata(session, guid, metadata);
1223
              fail("We shouldn't get there");
1224
          } catch (Exception e) {
1225
              assertTrue(e instanceof InvalidRequest);
1226
          }
1227
          
1228
          newId.setValue("newValue");
1229
          metadata.setSeriesId(newId);
1230
          try {
1231
              CNodeService.getInstance(request).updateSystemMetadata(session, guid, metadata);
1232
              fail("We shouldn't get there");
1233
          } catch (Exception e) {
1234
              assertTrue(e instanceof InvalidRequest);
1235
          }
1236
          
1237
          Date newDate = new Date();
1238
          metadata.setDateUploaded(newDate);
1239
          try {
1240
              CNodeService.getInstance(request).updateSystemMetadata(session, guid, metadata);
1241
              fail("We shouldn't get there");
1242
          } catch (Exception e) {
1243
              assertTrue(e instanceof InvalidRequest);
1244
          }
1245
          
1246
          Checksum checkSum = new Checksum();
1247
          checkSum.setValue("12345");
1248
          metadata.setChecksum(checkSum);
1249
          try {
1250
              CNodeService.getInstance(request).updateSystemMetadata(session, guid, metadata);
1251
              fail("We shouldn't get there");
1252
          } catch (Exception e) {
1253
              assertTrue(e instanceof InvalidRequest);
1254
          }
1255
          
1256
          BigInteger size = new BigInteger("4000");
1257
          metadata.setSize(size);
1258
          try {
1259
              CNodeService.getInstance(request).updateSystemMetadata(session, guid, metadata);
1260
              fail("We shouldn't get there");
1261
          } catch (Exception e) {
1262
              assertTrue(e instanceof InvalidRequest);
1263
          }
1264
  }
1265
}
(1-1/7)