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-30 17:33:52 -0700 (Thu, 30 Jul 2015) $'
9
 * '$Revision: 9273 $'
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.CNode;
42
import org.dataone.client.v2.itk.D1Client;
43
import org.dataone.service.exceptions.BaseException;
44
import org.dataone.service.exceptions.InvalidRequest;
45
import org.dataone.service.exceptions.InvalidSystemMetadata;
46
import org.dataone.service.exceptions.NotAuthorized;
47
import org.dataone.service.exceptions.NotFound;
48
import org.dataone.service.exceptions.NotImplemented;
49
import org.dataone.service.exceptions.ServiceFailure;
50
import org.dataone.service.types.v1.AccessPolicy;
51
import org.dataone.service.types.v1.AccessRule;
52
import org.dataone.service.types.v1.Checksum;
53
import org.dataone.service.types.v1.DescribeResponse;
54
import org.dataone.service.types.v1.Event;
55
import org.dataone.service.types.v1.Identifier;
56
import org.dataone.service.types.v1.NodeReference;
57
import org.dataone.service.types.v1.NodeType;
58
import org.dataone.service.types.v1.ObjectFormatIdentifier;
59
import org.dataone.service.types.v1.ObjectList;
60
import org.dataone.service.types.v1.Permission;
61
import org.dataone.service.types.v1.Replica;
62
import org.dataone.service.types.v1.ReplicationPolicy;
63
import org.dataone.service.types.v1.ReplicationStatus;
64
import org.dataone.service.types.v1.Session;
65
import org.dataone.service.types.v1.Subject;
66
import org.dataone.service.types.v2.Log;
67
import org.dataone.service.types.v2.Node;
68
import org.dataone.service.types.v2.NodeList;
69
import org.dataone.service.types.v2.ObjectFormat;
70
import org.dataone.service.types.v2.ObjectFormatList;
71
import org.dataone.service.types.v2.OptionList;
72
import org.dataone.service.types.v2.SystemMetadata;
73
import org.dataone.service.util.Constants;
74

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
530
	/**
531
	 * test to list the object formats registered in metacat
532
	 */
533
	public void testListFormats() {
534
		
535
    printTestHeader("testListFormats");
536
    
537
    // make sure we are set up
538
    setUpFormats();
539
    
540
    // there should be at least 59 formats in the list
541
  	int formatsCount = 59;
542
  	ObjectFormatList objectFormatList;
543
  	
544
  	try {
545
	    objectFormatList = CNodeService.getInstance(request).listFormats();
546
	  	assertTrue(objectFormatList.getTotal() >= formatsCount);
547
  	
548
  	} catch (ServiceFailure e) {
549
  		fail("Could not get the object format list: " + e.getMessage());
550

    
551
    } catch (NotImplemented e) {
552
  		fail("Could not get the object format list: " + e.getMessage());
553

    
554
    }
555
    
556
	}
557
	
558
  /**
559
   * Test getting a single object format from the registered list
560
   */
561
  public void testGetFormat() {
562
  	
563
    printTestHeader("testGetFormat");
564

    
565
    // make sure we are set up
566
    setUpFormats();
567
    
568
    String knownFormat = "text/plain";
569
    ObjectFormatIdentifier fmtid = new ObjectFormatIdentifier();
570
    fmtid.setValue(knownFormat);
571
  	
572
    try {
573
	    
574
			String result = 
575
				CNodeService.getInstance(request).getFormat(fmtid).getFormatId().getValue();
576
	  	System.out.println("Expected result: " + knownFormat);
577
	  	System.out.println("Found    result: " + result);
578
	  	assertTrue(result.equals(knownFormat));
579
  
580
    } catch (NullPointerException npe) {	  
581
	    fail("The returned format was null: " + npe.getMessage());
582
    
583
    } catch (NotFound nfe) {     
584
    	fail("The format " + knownFormat + " was not found: " + nfe.getMessage());
585
    	
586
    } catch (ServiceFailure sfe) {
587
    	fail("The format " + knownFormat + " was not found: " + sfe.getMessage());
588

    
589
    } catch (NotImplemented nie) {
590
    	fail("The getFormat() method has not been implemented: " + nie.getMessage());
591

    
592
    }
593
  	
594
  }
595
	
596
  /**
597
   * Test getting a non-existent object format, returning NotFound
598
   */
599
  public void testObjectFormatNotFoundException() {
600
  
601
    printTestHeader("testObjectFormatNotFoundException");
602

    
603
    ObjectFormatIdentifier fmtid = new ObjectFormatIdentifier();
604
  	String badFormat = "text/bad-format";
605
  	fmtid.setValue(badFormat);
606
  	
607
  	try {
608
  		
609
	    ObjectFormat objectFormat = 
610
	    	CNodeService.getInstance(request).getFormat(fmtid);
611
      
612
  	} catch (Exception e) {
613
	    
614
  		assertTrue(e instanceof NotFound);
615
  	}
616
  	
617
  }
618
  
619
  public void readDeletedObject() {
620
      printTestHeader("testCreate");
621

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

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

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