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: 2016-10-04 17:21:33 -0700 (Tue, 04 Oct 2016) $'
9
 * '$Revision: 10004 $'
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.IOException;
31
import java.io.InputStream;
32
import java.math.BigInteger;
33
import java.text.SimpleDateFormat;
34
import java.util.Calendar;
35
import java.util.Date;
36
import java.util.List;
37
import java.util.ArrayList;
38

    
39
import junit.framework.Test;
40
import junit.framework.TestSuite;
41

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

    
81
import edu.ucsb.nceas.metacat.dataone.CNodeService;
82
import edu.ucsb.nceas.metacat.dataone.D1NodeService;
83
import edu.ucsb.nceas.metacat.dataone.MNodeService;
84

    
85
/**
86
 * A JUnit test for testing the dataone CNCore implementation
87
 */
88
public class CNodeServiceTest extends D1NodeServiceTest {   
89
    
90
    /**
91
    * constructor for the test
92
    */
93
    public CNodeServiceTest(String name)
94
    {
95
        super(name);
96
    }
97

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

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

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

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

    
211
	    try {
212
            Session session = getCNSession();
213
			Identifier guid = new Identifier();
214
			guid.setValue("testCreate." + System.currentTimeMillis());
215
			InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
216
			SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
217
			Identifier pid = CNodeService.getInstance(request).create(session, guid, object, sysmeta);
218
			assertEquals(guid, pid);
219
        } catch(Exception e) {
220
        	e.printStackTrace();
221
            fail("Unexpected error: " + e.getMessage());
222
        }
223
	}
224
	
225
	public void testGet() {
226
	    printTestHeader("testGet");
227

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

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

    
271
	    try {
272
	    	CNodeService.getInstance(request).listNodes();
273
        } catch(NotImplemented e) {
274
        	// expecting not implemented
275
            assertTrue(true);
276
        } catch(Exception e) {
277
            fail("Unexpected error: " + e.getMessage());
278
        }
279
	}
280
	
281
	public void testReserveIdentifier() {
282
	    printTestHeader("testReserveIdentifier");
283

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

    
304
	    try {
305
            Session session = getCNSession();
306
			
307
			// search for objects, but expect a NotImplemented exception
308
			try {
309
				ObjectList objectList = CNodeService.getInstance(request).search(session, null, null);
310
			} catch (NotImplemented ne) {
311
				assertTrue(true);
312
				return;
313
			}
314
			fail("Metacat should not implement CN.search");
315
			
316
        } catch(Exception e) {
317
            fail("Unexpected error: " + e.getMessage());
318
        }
319
	}
320
	
321
	public void testSetOwner() {
322
	    printTestHeader("testSetOwner");
323

    
324
	    try {
325
            Session session = getCNSession();
326
			Identifier guid = new Identifier();
327
			guid.setValue("testSetOwner." + System.currentTimeMillis());
328
			InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
329
			SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
330
			long serialVersion = 1L;
331
			// save it
332
			Identifier retGuid = CNodeService.getInstance(request).registerSystemMetadata(session, guid, sysmeta);
333
			assertEquals(guid.getValue(), retGuid.getValue());
334
			Subject rightsHolder = new Subject();
335
			rightsHolder.setValue("newUser");
336
			// set it
337
			Identifier retPid = CNodeService.getInstance(request).setRightsHolder(session, guid, rightsHolder, serialVersion);
338
			assertEquals(guid, retPid);
339
			// get it
340
			sysmeta = CNodeService.getInstance(request).getSystemMetadata(session, guid);
341
			assertNotNull(sysmeta);
342
			// check it
343
			assertTrue(rightsHolder.equals(sysmeta.getRightsHolder()));
344
			
345
        } catch(Exception e) {
346
            e.printStackTrace();
347
            if(e instanceof ServiceFailure) {
348
                assertTrue(e.getMessage().contains("Couldn't determine the authoritative member node"));
349
            } else {
350
                fail("Unexpected error: " + e.getMessage());
351
            }
352
        }
353
	}
354
	
355
	public void testSetAccessPolicy() {
356
	    printTestHeader("testSetAccessPolicy");
357

    
358
	    try {
359
            Session session = getCNSession();
360
			Identifier guid = new Identifier();
361
			guid.setValue("testSetAccessPolicy." + System.currentTimeMillis());
362
			InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
363
			SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
364
	    long serialVersion = 1L;
365

    
366
			// save it
367
			Identifier retGuid = CNodeService.getInstance(request).registerSystemMetadata(session, guid, sysmeta);
368
			assertEquals(guid.getValue(), retGuid.getValue());
369
			AccessPolicy accessPolicy = new AccessPolicy();
370
			AccessRule accessRule = new AccessRule();
371
			accessRule.addPermission(Permission.WRITE);
372
			Subject publicSubject = new Subject();
373
			publicSubject.setValue(Constants.SUBJECT_PUBLIC);
374
			accessRule.addSubject(publicSubject);
375
			accessPolicy.addAllow(accessRule);
376
			// set it
377
			boolean result = CNodeService.getInstance(request).setAccessPolicy(session, guid, accessPolicy, serialVersion );
378
			assertTrue(result);
379
			// check it
380
			result = CNodeService.getInstance(request).isAuthorized(session, guid, Permission.WRITE);
381
			assertTrue(result);
382
        } catch(Exception e) {
383
            e.printStackTrace();
384
            if(e instanceof ServiceFailure) {
385
                assertTrue(e.getMessage().contains("Couldn't determine the authoritative member node"));
386
            } else {
387
                fail("Unexpected error: " + e.getMessage());
388
            }
389
        }
390
	}
391
	
392
	public void testIsAuthorized() {
393
	    printTestHeader("testIsAuthorized");
394

    
395
	    try {
396
            Session session = getCNSession();
397
			Identifier guid = new Identifier();
398
			guid.setValue("testIsAuthorized." + System.currentTimeMillis());
399
			InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
400
			SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
401
			// save it
402
			Identifier retGuid = CNodeService.getInstance(request).registerSystemMetadata(session, guid, sysmeta);
403
			assertEquals(guid.getValue(), retGuid.getValue());
404
			// check it
405
			Subject publicSubject = new Subject();
406
			publicSubject.setValue(Constants.SUBJECT_PUBLIC);
407
			session.setSubject(publicSubject);
408
			// public read
409
			boolean result = CNodeService.getInstance(request).isAuthorized(session, guid, Permission.READ);
410
			assertTrue(result);
411
			// not public write
412
			try {
413
				result = false;
414
				result = CNodeService.getInstance(request).isAuthorized(session, guid, Permission.WRITE);
415
				fail("Public WRITE should be denied");
416
			} catch (NotAuthorized nae) {
417
				result = true;
418
			}
419
			assertTrue(result);
420
        } catch(Exception e) {
421
            fail("Unexpected error: " + e.getMessage());
422
        }
423
	}
424
	
425
	public void testReplicationPolicy() {
426
	    printTestHeader("testReplicationPolicy");
427

    
428
	    try {
429
            Session session = getCNSession();
430
			Identifier guid = new Identifier();
431
			guid.setValue("testReplicationPolicy." + System.currentTimeMillis());
432
			InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
433
			SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
434
	    long serialVersion = 1L;
435

    
436
			// save it
437
			Identifier retGuid = CNodeService.getInstance(request).registerSystemMetadata(session, guid, sysmeta);
438
			assertEquals(guid.getValue(), retGuid.getValue());
439
			
440
			ReplicationPolicy policy = new ReplicationPolicy();
441
			NodeReference node = new NodeReference();
442
			node.setValue("testNode");
443
			policy.addPreferredMemberNode(node );
444
			// set it
445
			boolean result = CNodeService.getInstance(request).setReplicationPolicy(session, guid, policy, serialVersion);
446
			assertTrue(result);
447
			// get it
448
			sysmeta = CNodeService.getInstance(request).getSystemMetadata(session, guid);
449
			assertNotNull(sysmeta);
450
			// check it
451
			assertEquals(policy.getPreferredMemberNode(0).getValue(), sysmeta.getReplicationPolicy().getPreferredMemberNode(0).getValue());
452
			
453
        } catch(Exception e) {
454
            e.printStackTrace();
455
            if(e instanceof ServiceFailure) {
456
                assertTrue(e.getMessage().contains("Couldn't determine the authoritative member node"));
457
            } else {
458
                fail("Unexpected error: " + e.getMessage());
459
            }
460
            
461
        }
462
	}
463
	
464
	public void testReplicationStatus() {
465
	    printTestHeader("testReplicationStatus");
466

    
467
	    try {
468
            Session session = getCNSession();
469
			Identifier guid = new Identifier();
470
			guid.setValue("testReplicationStatus." + System.currentTimeMillis());
471
			InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
472
			SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
473
			Replica replica = new Replica();
474
			NodeReference replicaMemberNode = new NodeReference();
475
			replicaMemberNode.setValue("testNode");
476
			replica.setReplicationStatus(ReplicationStatus.REQUESTED);
477
			replica.setReplicaMemberNode(replicaMemberNode);
478
			replica.setReplicaVerified(Calendar.getInstance().getTime());
479
			sysmeta.addReplica(replica );
480
			// save it
481
			Identifier retGuid = CNodeService.getInstance(request).registerSystemMetadata(session, guid, sysmeta);
482
			assertEquals(guid.getValue(), retGuid.getValue());
483
			// set it
484
			ReplicationStatus status = ReplicationStatus.QUEUED;
485
			BaseException failure = new NotAuthorized("000", "Mock exception for " + this.getClass().getName());
486
			//Test the failure of setReplicationStatus by a non-cn subject
487
			Session testSession = getTestSession();
488
			try {
489
			    CNodeService.getInstance(request).setReplicationStatus(testSession, guid, replicaMemberNode, status, failure);
490
			    fail("It can't reach here since the non-cn subject can't call setReplicationStatus");
491
			} catch (NotAuthorized ee) {
492
			    
493
			}
494
			//Test the success of setReplicationStatus by a cn subject
495
			boolean result = CNodeService.getInstance(request).setReplicationStatus(session, guid, replicaMemberNode, status, failure);
496
			assertTrue(result);
497
			// get it
498
			sysmeta = CNodeService.getInstance(request).getSystemMetadata(session, guid);
499
			BigInteger version = sysmeta.getSerialVersion();
500
			System.out.println("the version of system metadata is "+version.intValue());
501
			assertNotNull(sysmeta);
502
			// check it
503
			assertEquals(status, sysmeta.getReplica(0).getReplicationStatus());
504
			
505
			//set it failed.
506
			status = ReplicationStatus.FAILED;
507
            result = CNodeService.getInstance(request).setReplicationStatus(session, guid, replicaMemberNode, status, failure);
508
            assertTrue(result);
509
            // get it
510
            sysmeta = CNodeService.getInstance(request).getSystemMetadata(session, guid);
511
            BigInteger version1 = sysmeta.getSerialVersion();
512
            System.out.println("the version of system metadata is "+version1.intValue());
513
            assertTrue(version1.compareTo(version) == 1);
514
            assertNotNull(sysmeta);
515
            // check it
516
            assertEquals(status, sysmeta.getReplica(0).getReplicationStatus());
517
			
518
            //set it failed again
519
            status = ReplicationStatus.FAILED;
520
            result = CNodeService.getInstance(request).setReplicationStatus(session, guid, replicaMemberNode, status, failure);
521
            assertTrue(result);
522
            // get it
523
            sysmeta = CNodeService.getInstance(request).getSystemMetadata(session, guid);
524
            BigInteger version2 = sysmeta.getSerialVersion();
525
            System.out.println("the version of system metadata is "+version2.intValue());
526
            assertTrue(version2.compareTo(version1) ==0);
527
            assertNotNull(sysmeta);
528
            // check it
529
            assertEquals(status, sysmeta.getReplica(0).getReplicationStatus());
530
			
531
			//requeque it
532
			status = ReplicationStatus.QUEUED;
533
			result = CNodeService.getInstance(request).setReplicationStatus(session, guid, replicaMemberNode, status, failure);
534
            assertTrue(result);
535
            // get it
536
            sysmeta = CNodeService.getInstance(request).getSystemMetadata(session, guid);
537
            BigInteger version3 = sysmeta.getSerialVersion();
538
            System.out.println("the version of system metadata is "+version3.intValue());
539
            assertTrue(version3.compareTo(version2) ==1);
540
            assertNotNull(sysmeta);
541
            // check it
542
            assertEquals(status, sysmeta.getReplica(0).getReplicationStatus());
543
			
544
            
545
			//Test the success of setReplicationStatus by a register mn subject
546
			Session mnSession = getMNSessionFromCN();
547
			status = ReplicationStatus.COMPLETED;
548
			result = CNodeService.getInstance(request).setReplicationStatus(mnSession, guid, replicaMemberNode, status, failure);
549
			sysmeta = CNodeService.getInstance(request).getSystemMetadata(session, guid);
550
			BigInteger version4 = sysmeta.getSerialVersion();
551
			            System.out.println("the version of system metadata is "+version4.intValue());
552
			            assertTrue(version4.compareTo(version3) ==1);
553
            assertNotNull(sysmeta);
554
            // check it
555
            assertEquals(status, sysmeta.getReplica(0).getReplicationStatus());
556
			
557
        } catch(Exception e) {
558
            fail("Unexpected error: " + e.getMessage());
559
        }
560
	}
561
	
562
	/**
563
	 * Run an initial test that always passes to check that the test harness is
564
	 * working.
565
	 */
566
	public void initialize() 
567
	{
568
	    printTestHeader("initialize");
569
		assertTrue(1 == 1);
570
	}
571
	
572
	/**
573
	 * We want to act as the CN itself
574
	 * @throws ServiceFailure 
575
	 * @throws Exception 
576
	 */
577
	/*@Override
578
	public Session getTestSession() throws Exception {
579
		Session session = super.getTestSession();
580
		
581
		// use the first CN we find in the nodelist
582
        NodeList nodeList = D1Client.getCN().listNodes();
583
        for (Node node : nodeList.getNodeList()) {
584
            if ( node.getType().equals(NodeType.CN) ) {
585
                
586
                List<Subject> subjects = node.getSubjectList();
587
                for (Subject subject : subjects) {
588
                   session.setSubject(subject);
589
                   // we are done here
590
                   return session;
591
                }
592
            }
593
        }
594
        // in case we didn't find it
595
        return session;
596
	}*/
597
	
598

    
599
	/**
600
	 * test to list the object formats registered in metacat
601
	 */
602
	public void testListFormats() {
603
		
604
    printTestHeader("testListFormats");
605
    
606
    // make sure we are set up
607
    setUpFormats();
608
    
609
    // there should be at least 59 formats in the list
610
  	int formatsCount = 59;
611
  	ObjectFormatList objectFormatList;
612
  	
613
  	try {
614
	    objectFormatList = CNodeService.getInstance(request).listFormats();
615
	  	assertTrue(objectFormatList.getTotal() >= formatsCount);
616
  	
617
  	} catch (ServiceFailure e) {
618
  		fail("Could not get the object format list: " + e.getMessage());
619

    
620
    } catch (NotImplemented e) {
621
  		fail("Could not get the object format list: " + e.getMessage());
622

    
623
    }
624
    
625
	}
626
	
627
  /**
628
   * Test getting a single object format from the registered list
629
   */
630
  public void testGetFormat() {
631
  	
632
    printTestHeader("testGetFormat");
633

    
634
    // make sure we are set up
635
    setUpFormats();
636
    
637
    String knownFormat = "text/plain";
638
    ObjectFormatIdentifier fmtid = new ObjectFormatIdentifier();
639
    fmtid.setValue(knownFormat);
640
  	
641
    try {
642
	    
643
			String result = 
644
				CNodeService.getInstance(request).getFormat(fmtid).getFormatId().getValue();
645
	  	System.out.println("Expected result: " + knownFormat);
646
	  	System.out.println("Found    result: " + result);
647
	  	assertTrue(result.equals(knownFormat));
648
  
649
    } catch (NullPointerException npe) {	  
650
	    fail("The returned format was null: " + npe.getMessage());
651
    
652
    } catch (NotFound nfe) {     
653
    	fail("The format " + knownFormat + " was not found: " + nfe.getMessage());
654
    	
655
    } catch (ServiceFailure sfe) {
656
    	fail("The format " + knownFormat + " was not found: " + sfe.getMessage());
657

    
658
    } catch (NotImplemented nie) {
659
    	fail("The getFormat() method has not been implemented: " + nie.getMessage());
660

    
661
    }
662
  	
663
  }
664
	
665
  /**
666
   * Test getting a non-existent object format, returning NotFound
667
   */
668
  public void testObjectFormatNotFoundException() {
669
  
670
    printTestHeader("testObjectFormatNotFoundException");
671

    
672
    ObjectFormatIdentifier fmtid = new ObjectFormatIdentifier();
673
  	String badFormat = "text/bad-format";
674
  	fmtid.setValue(badFormat);
675
  	
676
  	try {
677
  		
678
	    ObjectFormat objectFormat = 
679
	    	CNodeService.getInstance(request).getFormat(fmtid);
680
      
681
  	} catch (Exception e) {
682
	    
683
  		assertTrue(e instanceof NotFound);
684
  	}
685
  	
686
  }
687
  
688
  public void readDeletedObject() {
689
      printTestHeader("testCreate");
690

    
691
      try {
692
          Session session = getCNSession();
693
          Identifier guid = new Identifier();
694
          guid.setValue("testCreate." + System.currentTimeMillis());
695
          InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
696
          SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
697
          Identifier pid = CNodeService.getInstance(request).create(session, guid, object, sysmeta);
698
          assertEquals(guid, pid);
699
          
700
          Thread.sleep(3000);
701
          // use MN admin to delete
702
          session = getMNSession();
703
          Identifier deletedPid = CNodeService.getInstance(request).delete(session, pid);
704
          System.out.println("after deleting");
705
          assertEquals(pid.getValue(), deletedPid.getValue());
706
          // check that we cannot get the object
707
          session = getTestSession();
708
          InputStream deletedObject = null;
709
          try {
710
              //System.out.println("before read ===============");
711
              deletedObject = CNodeService.getInstance(request).get(session, deletedPid);
712
              //System.out.println("after read ===============");
713
          } catch (NotFound nf) {
714
              //System.out.println("the exception is1 "+nf.getMessage());
715
              //nf.printStackTrace();
716
              assertTrue(nf.getMessage().contains("deleted"));
717
          }
718
          try {
719
              //System.out.println("before read ===============");
720
              SystemMetadata sysmeta2 = CNodeService.getInstance(request).getSystemMetadata(session, deletedPid);
721
              //System.out.println("after read ===============");
722
          } catch (NotFound nf) {
723
              //System.out.println("the exception is "+nf.getMessage());
724
              //nf.printStackTrace();
725
              assertTrue(nf.getMessage().contains("deleted"));
726
          }
727
          
728
          try {
729
              //System.out.println("before read ===============");
730
              DescribeResponse describeResponse = CNodeService.getInstance(request).describe(session, pid);
731
              //System.out.println("after read ===============");
732
          } catch (NotFound nf) {
733
              //System.out.println("the exception is "+nf.getMessage());
734
              //nf.printStackTrace();
735
              assertTrue(nf.getMessage().contains("deleted"));
736
          }
737
          
738
          try {
739
              //System.out.println("before read ===============");
740
              Checksum checksum = CNodeService.getInstance(request).getChecksum(session, pid);
741
              //System.out.println("after read ===============");
742
          } catch (NotFound nf) {
743
              //System.out.println("the exception 3 is "+nf.getMessage());
744
              //nf.printStackTrace();
745
              assertTrue(nf.getMessage().contains("deleted"));
746
          }
747
          
748
          try {
749
              //System.out.println("before read ===============");
750
              boolean isAuthorized = 
751
                      CNodeService.getInstance(request).isAuthorized(session, pid, Permission.READ);
752
              //System.out.println("after read ===============");
753
          } catch (NotFound nf) {
754
              //System.out.println("the exception 4 is "+nf.getMessage());
755
              //nf.printStackTrace();
756
              assertTrue(nf.getMessage().contains("deleted"));
757
          }
758
          
759
         
760
          
761
          assertNull(deletedObject);
762
      } catch(Exception e) {
763
          e.printStackTrace();
764
          fail("Unexpected error: " + e.getMessage());
765
      }
766
  }
767
  
768
  /**
769
   * Test the method - get api  for a speicified SID
770
   */
771
  public void testGetSID() {
772
      String str1 = "object1";
773
      String str2 = "object2";
774
      String str3 = "object3";
775
      try {
776
          //insert test documents with a series id
777
          Session session = getCNSession();
778
          Identifier guid = new Identifier();
779
          guid.setValue(generateDocumentId());
780
          InputStream object1 = new ByteArrayInputStream(str1.getBytes("UTF-8"));
781
          SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object1);
782
          String sid1= "sid."+System.nanoTime();
783
          Identifier seriesId = new Identifier();
784
          seriesId.setValue(sid1);
785
          System.out.println("the first sid is "+seriesId.getValue());
786
          sysmeta.setSeriesId(seriesId);
787
          CNodeService.getInstance(request).create(session, guid, object1, sysmeta);
788
          System.out.println("the first pid is "+guid.getValue());
789
          //test the get(pid) for v2
790
          InputStream result = CNodeService.getInstance(request).get(session, guid);
791
          // go back to beginning of original stream
792
          object1.reset();
793
          // check
794
          assertTrue(object1.available() > 0);
795
          assertTrue(result.available() > 0);
796
          assertTrue(IOUtils.contentEquals(result, object1));
797
          // test the get(id) for v2
798
          InputStream result1 = CNodeService.getInstance(request).get(session, seriesId);
799
          object1.reset();
800
          // check
801
          assertTrue(object1.available() > 0);
802
          assertTrue(result1.available() > 0);
803
          assertTrue(IOUtils.contentEquals(result1, object1));
804
          //test the get(pid) for v1
805
          InputStream result2 = edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).get(session, guid);
806
          object1.reset();
807
          // check
808
          assertTrue(object1.available() > 0);
809
          assertTrue(result2.available() > 0);
810
          assertTrue(IOUtils.contentEquals(result2, object1));
811
          //test the get(sid) for v1
812
          try {
813
              InputStream result3 = edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).get(session, seriesId);
814
              fail("the get(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
815
          } catch (NotFound ee) {
816
              
817
          }
818
          SystemMetadata metadata = CNodeService.getInstance(request).getSystemMetadata(session, seriesId);
819
          assertTrue(metadata.getIdentifier().getValue().equals(guid.getValue()));
820
          assertTrue(metadata.getSeriesId().getValue().equals(seriesId.getValue()));
821
          DescribeResponse describeResponse = CNodeService.getInstance(request).describe(session, seriesId);
822
          assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata.getChecksum().getValue());
823
          assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata.getFormatId().getValue());
824
          
825
          metadata = CNodeService.getInstance(request).getSystemMetadata(session, guid);
826
          assertTrue(metadata.getIdentifier().getValue().equals(guid.getValue()));
827
          assertTrue(metadata.getSeriesId().getValue().equals(seriesId.getValue()));
828
          describeResponse = CNodeService.getInstance(request).describe(session, guid);
829
          assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata.getChecksum().getValue());
830
          assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata.getFormatId().getValue());
831
          
832
          org.dataone.service.types.v1.SystemMetadata sys1=edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).getSystemMetadata(session, guid);
833
          assertTrue(metadata.getIdentifier().getValue().equals(guid.getValue()));
834
          
835
          try {
836
              org.dataone.service.types.v1.SystemMetadata sys2=edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).getSystemMetadata(session, seriesId);
837
              fail("the getSystemMetadata(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
838
          } catch(NotFound nf2) {
839
              
840
          }
841
          
842
          describeResponse = edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).describe(session, guid);
843
          assertEquals(describeResponse.getDataONE_Checksum().getValue(), sys1.getChecksum().getValue());
844
          assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), sys1.getFormatId().getValue());
845
          try {
846
              describeResponse = edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).describe(session, seriesId);
847
              fail("the describe(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
848
          } catch(NotFound nf2) {
849
              
850
          }
851
          
852
          Checksum sum = CNodeService.getInstance(request).getChecksum(session, guid);
853
          assertTrue(sum.getValue().equals("5b78f9689b9aab1ebc0f3c1df916dd97"));
854
          
855
          try {
856
              sum = CNodeService.getInstance(request).getChecksum(session, seriesId);
857
              fail("the getCheckSum shouldn't work for sid");
858
          } catch(NotFound nf3) {
859
              
860
          }
861
          
862
          sum = edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).getChecksum(session, guid);
863
          assertTrue(sum.getValue().equals("5b78f9689b9aab1ebc0f3c1df916dd97"));
864
          
865
          try {
866
              sum = edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).getChecksum(session, seriesId);
867
              fail("the getCheckSum shouldn't work for sid");
868
          } catch(NotFound nf3) {
869
              
870
          }
871
          
872
          boolean isAuthorized = 
873
                  CNodeService.getInstance(request).isAuthorized(session, guid, Permission.READ);
874
          assertEquals(isAuthorized, true);
875
          
876
          isAuthorized = 
877
                  CNodeService.getInstance(request).isAuthorized(session, seriesId, Permission.READ);
878
          assertEquals(isAuthorized, true);
879
          
880
          isAuthorized = 
881
                  edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).isAuthorized(session, guid, Permission.READ);
882
          assertEquals(isAuthorized, true);
883
          
884
          try {
885
              isAuthorized = 
886
                      edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).isAuthorized(session, seriesId, Permission.READ);
887
              fail("we can't reach here since the v1 isAuthorized method doesn't suppport series id");
888
          } catch (NotFound e) {
889
              
890
          }
891

    
892
          //do a update with the same series id
893
          Thread.sleep(1000);
894
          Identifier newPid = new Identifier();
895
          newPid.setValue(generateDocumentId()+"1");
896
          System.out.println("the second pid is "+newPid.getValue());
897
          InputStream object2 = new ByteArrayInputStream(str2.getBytes("UTF-8"));
898
          SystemMetadata newSysMeta = createSystemMetadata(newPid, session.getSubject(), object2);
899
          newSysMeta.setObsoletes(guid);
900
          newSysMeta.setSeriesId(seriesId);
901
          //CNodeService.getInstance(request).update(session, guid, object2, newPid, newSysMeta);
902
          CNodeService.getInstance(request).create(session, newPid, object2, newSysMeta);
903
          //update the system metadata of previous version.
904
          sysmeta.setObsoletedBy(newPid);
905
          SystemMetadata read = CNodeService.getInstance(request).getSystemMetadata(session, guid);
906
          BigInteger version = read.getSerialVersion();
907
          version = version.add(BigInteger.ONE);
908
          sysmeta.setSerialVersion(version);
909
          CNodeService.getInstance(request).updateSystemMetadata(session, guid, sysmeta);
910
          InputStream result4 = CNodeService.getInstance(request).get(session, guid);
911
          // go back to beginning of original stream
912
          object1.reset();
913
          // check
914
          assertTrue(object1.available() > 0);
915
          assertTrue(result4.available() > 0);
916
          assertTrue(IOUtils.contentEquals(result4, object1));
917
          
918
          InputStream result5 = CNodeService.getInstance(request).get(session, newPid);
919
          // go back to beginning of original stream
920
          object2.reset();
921
          // check
922
          assertTrue(object2.available() > 0);
923
          assertTrue(result5.available() > 0);
924
          assertTrue(IOUtils.contentEquals(result5, object2));
925
          
926

    
927
          InputStream result6 = CNodeService.getInstance(request).get(session, seriesId);
928
          object2.reset();
929
          // check
930
          assertTrue(object2.available() > 0);
931
          assertTrue(result6.available() > 0);
932
          assertTrue(IOUtils.contentEquals(result6, object2));
933
          //test the get(pid) for v1
934
          InputStream result7 = edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).get(session, guid);
935
          //System.out.println("+++++++++++++++++++++"+IOUtils.toString(result7));
936
          object1.reset();
937
          // check
938
          assertTrue(object1.available() > 0);
939
          assertTrue(result7.available() > 0);
940
          assertTrue(IOUtils.contentEquals(result7, object1));
941
          
942
          InputStream result8 = edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).get(session, newPid);
943
          object2.reset();
944
          // check
945
          assertTrue(object2.available() > 0);
946
          assertTrue(result8.available() > 0);
947
          assertTrue(IOUtils.contentEquals(result8, object2));
948
          //test the get(sid) for v1
949
          try {
950
              InputStream result3 = edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).get(session, seriesId);
951
              fail("the get(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
952
          } catch (NotFound ee) {
953
              
954
          }
955
          
956
          SystemMetadata metadata1 = CNodeService.getInstance(request).getSystemMetadata(session, seriesId);
957
          assertTrue(metadata1.getIdentifier().getValue().equals(newPid.getValue()));
958
          assertTrue(metadata1.getSeriesId().getValue().equals(seriesId.getValue()));
959
          describeResponse = CNodeService.getInstance(request).describe(session, seriesId);
960
          assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata1.getChecksum().getValue());
961
          assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata1.getFormatId().getValue());
962
          
963
          SystemMetadata metadata2 = CNodeService.getInstance(request).getSystemMetadata(session, guid);
964
          assertTrue(metadata2.getIdentifier().getValue().equals(guid.getValue()));
965
          assertTrue(metadata2.getSeriesId().getValue().equals(seriesId.getValue()));
966
          describeResponse = CNodeService.getInstance(request).describe(session, guid);
967
          assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata2.getChecksum().getValue());
968
          assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata2.getFormatId().getValue());
969
          
970
          SystemMetadata metadata3 = CNodeService.getInstance(request).getSystemMetadata(session, newPid);
971
          assertTrue(metadata3.getIdentifier().getValue().equals(newPid.getValue()));
972
          assertTrue(metadata3.getSeriesId().getValue().equals(seriesId.getValue()));
973
          describeResponse = CNodeService.getInstance(request).describe(session, newPid);
974
          assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata3.getChecksum().getValue());
975
          assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata3.getFormatId().getValue());
976
          
977
          //do another update with different series id
978
          Thread.sleep(1000);
979
          String sid2 = "sid."+System.nanoTime();
980
          Identifier seriesId2= new Identifier();
981
          seriesId2.setValue(sid2);
982
          System.out.println("the second sid is "+seriesId2.getValue());
983
          Identifier newPid2 = new Identifier();
984
          newPid2.setValue(generateDocumentId()+"2");
985
          System.out.println("the third pid is "+newPid2.getValue());
986
          InputStream object3 = new ByteArrayInputStream(str3.getBytes("UTF-8"));
987
          SystemMetadata sysmeta3 = createSystemMetadata(newPid2, session.getSubject(), object3);
988
          sysmeta3.setObsoletes(newPid);
989
          sysmeta3.setSeriesId(seriesId2);
990
          //CNodeService.getInstance(request).update(session, newPid, object3, newPid2, sysmeta3);
991
          CNodeService.getInstance(request).create(session, newPid2, object3, sysmeta3);
992
          //update the system metadata of the previous version 
993
          newSysMeta.setObsoletedBy(newPid2);
994
          SystemMetadata read2 = CNodeService.getInstance(request).getSystemMetadata(session, newPid);
995
          BigInteger version2= read2.getSerialVersion();
996
          version2 = version2.add(BigInteger.ONE);
997
          newSysMeta.setSerialVersion(version2);
998
          CNodeService.getInstance(request).updateSystemMetadata(session, newPid, newSysMeta);
999
          
1000
          InputStream result9 = CNodeService.getInstance(request).get(session, guid);
1001
          // go back to beginning of original stream
1002
          object1.reset();
1003
          // check
1004
          assertTrue(object1.available() > 0);
1005
          assertTrue(result9.available() > 0);
1006
          assertTrue(IOUtils.contentEquals(result9, object1));
1007
          
1008
          InputStream result10 = CNodeService.getInstance(request).get(session, newPid);
1009
          // go back to beginning of original stream
1010
          object2.reset();
1011
          // check
1012
          assertTrue(object2.available() > 0);
1013
          assertTrue(result10.available() > 0);
1014
          assertTrue(IOUtils.contentEquals(result10, object2));
1015
          
1016
          
1017
          InputStream result11 = CNodeService.getInstance(request).get(session, newPid2);
1018
          // go back to beginning of original stream
1019
          object3.reset();
1020
          // check
1021
          assertTrue(object3.available() > 0);
1022
          assertTrue(result11.available() > 0);
1023
          assertTrue(IOUtils.contentEquals(result11, object3));
1024
          
1025
          InputStream result12 = CNodeService.getInstance(request).get(session, seriesId2);
1026
          object3.reset();
1027
          // check
1028
          assertTrue(object3.available() > 0);
1029
          assertTrue(result12.available() > 0);
1030
          assertTrue(IOUtils.contentEquals(result12, object3));
1031
          
1032
          InputStream result16 = CNodeService.getInstance(request).get(session, seriesId);
1033
          object2.reset();
1034
          // check
1035
          assertTrue(object2.available() > 0);
1036
          assertTrue(result16.available() > 0);
1037
          assertTrue(IOUtils.contentEquals(result16, object2));
1038
         
1039
          //test the get(pid) for v1
1040
          InputStream result13 = edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).get(session, guid);
1041
          object1.reset();
1042
          // check
1043
          assertTrue(object1.available() > 0);
1044
          assertTrue(result13.available() > 0);
1045
          assertTrue(IOUtils.contentEquals(result13, object1));
1046
          
1047
          InputStream result14 = edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).get(session, newPid);
1048
          object2.reset();
1049
          // check
1050
          assertTrue(object2.available() > 0);
1051
          assertTrue(result14.available() > 0);
1052
          assertTrue(IOUtils.contentEquals(result14, object2));
1053
          
1054
          InputStream result15 = edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).get(session, newPid2);
1055
          object3.reset();
1056
          // check
1057
          assertTrue(object3.available() > 0);
1058
          assertTrue(result15.available() > 0);
1059
          assertTrue(IOUtils.contentEquals(result15, object3));
1060
          
1061
          SystemMetadata metadata4 = CNodeService.getInstance(request).getSystemMetadata(session, seriesId);
1062
          assertTrue(metadata4.getIdentifier().getValue().equals(newPid.getValue()));
1063
          assertTrue(metadata4.getSeriesId().getValue().equals(seriesId.getValue()));
1064
          describeResponse = CNodeService.getInstance(request).describe(session, seriesId);
1065
          assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata4.getChecksum().getValue());
1066
          assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata4.getFormatId().getValue());
1067
          
1068
          SystemMetadata metadata5 = CNodeService.getInstance(request).getSystemMetadata(session, seriesId2);
1069
          assertTrue(metadata5.getIdentifier().getValue().equals(newPid2.getValue()));
1070
          assertTrue(metadata5.getSeriesId().getValue().equals(seriesId2.getValue()));
1071
          describeResponse = CNodeService.getInstance(request).describe(session, seriesId2);
1072
          assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata5.getChecksum().getValue());
1073
          assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata5.getFormatId().getValue());
1074
          
1075
          SystemMetadata metadata6 = CNodeService.getInstance(request).getSystemMetadata(session, guid);
1076
          assertTrue(metadata6.getIdentifier().getValue().equals(guid.getValue()));
1077
          assertTrue(metadata6.getSeriesId().getValue().equals(seriesId.getValue()));
1078
          describeResponse = CNodeService.getInstance(request).describe(session, guid);
1079
          assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata6.getChecksum().getValue());
1080
          assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata6.getFormatId().getValue());
1081
          
1082
          SystemMetadata metadata7 = CNodeService.getInstance(request).getSystemMetadata(session, newPid);
1083
          assertTrue(metadata7.getIdentifier().getValue().equals(newPid.getValue()));
1084
          assertTrue(metadata7.getSeriesId().getValue().equals(seriesId.getValue()));
1085
          describeResponse = CNodeService.getInstance(request).describe(session, newPid);
1086
          assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata7.getChecksum().getValue());
1087
          assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata7.getFormatId().getValue());
1088
          
1089
          SystemMetadata metadata8 = CNodeService.getInstance(request).getSystemMetadata(session, newPid2);
1090
          assertTrue(metadata8.getIdentifier().getValue().equals(newPid2.getValue()));
1091
          assertTrue(metadata8.getSeriesId().getValue().equals(seriesId2.getValue()));
1092
          describeResponse = CNodeService.getInstance(request).describe(session, newPid2);
1093
          assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata8.getChecksum().getValue());
1094
          assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata8.getFormatId().getValue());
1095
          
1096
          
1097
          
1098
          System.out.println("here===========================");
1099
          //test the get(sid) for v1
1100
          try {
1101
              InputStream result3 = edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).get(session, seriesId);
1102
              fail("the get(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1103
          } catch (NotFound ee) {
1104
              
1105
          }
1106
          
1107
          //test the get(sid) for v1
1108
          try {
1109
              InputStream result3 = edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).get(session, seriesId2);
1110
              fail("the get(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1111
          } catch (NotFound ee) {
1112
              
1113
          }
1114
          
1115
          //test to get non-existing id for v2
1116
          try {
1117
           // the pid should be null when we try to get a no-exist sid
1118
              Identifier non_exist_sid = new Identifier();
1119
              non_exist_sid.setValue("no-sid-exist-123qwe");
1120
              InputStream result3 = CNodeService.getInstance(request).get(session, non_exist_sid);
1121
              fail("the get(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1122
          } catch (NotFound ee) {
1123
              
1124
          }
1125
          
1126
          try {
1127
              // the pid should be null when we try to get a no-exist sid
1128
                 Identifier non_exist_sid = new Identifier();
1129
                 non_exist_sid.setValue("no-sid-exist-123qwe");
1130
                 SystemMetadata result3 = CNodeService.getInstance(request).getSystemMetadata(session, non_exist_sid);
1131
                 fail("the getSystemMetadata(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1132
          } catch (NotFound ee) {
1133
                 
1134
          }
1135
          
1136
          try {
1137
              // the pid should be null when we try to get a no-exist sid
1138
                 Identifier non_exist_sid = new Identifier();
1139
                 non_exist_sid.setValue("no-sid-exist-123qwe");
1140
                  CNodeService.getInstance(request).describe(session, non_exist_sid);
1141
                 fail("the describe(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1142
             } catch (NotFound ee) {
1143
                 
1144
             }
1145
          
1146
          
1147
          //do another update with invalid series ids
1148
          Thread.sleep(1000);
1149
          Identifier newPid3 = new Identifier();
1150
          newPid3.setValue(generateDocumentId()+"3");
1151
          System.out.println("the third pid is "+newPid3.getValue());
1152
          InputStream object4 = new ByteArrayInputStream(str3.getBytes("UTF-8"));
1153
          SystemMetadata sysmeta4 = createSystemMetadata(newPid3, session.getSubject(), object4);
1154
          sysmeta4.setObsoletes(newPid2);
1155
          sysmeta4.setSeriesId(seriesId);
1156
          /*try {
1157
              CNodeService.getInstance(request).create(session, newPid3, object4, sysmeta4);
1158
              fail("we can't reach here since the sid is using an old one ");
1159
          } catch (InvalidSystemMetadata eee) {
1160
              
1161
          } */
1162
          
1163
          /*sysmeta4.setSeriesId(newPid3);
1164
          try {
1165
              CNodeService.getInstance(request).create(session, newPid3, object4, sysmeta4);
1166
              fail("we can't reach here since the sid is using the pid ");
1167
          } catch (InvalidSystemMetadata eee) {
1168
              
1169
          }*/
1170
          
1171
          //test archive a series id by v1
1172
          try {
1173
              edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).archive(session, seriesId2);
1174
              fail("we can't reach here since the v1 archive method doesn't support the sid ");
1175
          } catch (NotFound nf2) {
1176
              
1177
          }
1178
          
1179
          // test delete a series id by v1
1180
          Session mnSession = getMNSession();
1181
          try {
1182
              edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).delete(mnSession, seriesId2);
1183
              fail("we can't reach here since the v1 delete method doesn't support the sid ");
1184
          } catch (NotFound nf2) {
1185
              
1186
          }
1187
          
1188
          // test archive a series id by v2
1189
          MNodeService.getInstance(request).archive(session, seriesId2);
1190
          SystemMetadata archived = CNodeService.getInstance(request).getSystemMetadata(session, seriesId2);
1191
          assertTrue(archived.getArchived());
1192
          archived = CNodeService.getInstance(request).getSystemMetadata(session, newPid2);
1193
          assertTrue(archived.getArchived());
1194
          
1195
          // test delete a series id by v2
1196
          CNodeService.getInstance(request).delete(mnSession, seriesId2);
1197
          try {
1198
              CNodeService.getInstance(request).get(session, seriesId2);
1199
              fail("we can't reach here since the series id was deleted ");
1200
          } catch (NotFound nf3) {
1201
              System.out.println("the message is ============="+nf3.getMessage());
1202
              //assertTrue(nf3.getMessage().indexOf("delete") >0);
1203
          }
1204
          
1205
          try {
1206
              CNodeService.getInstance(request).get(session, newPid2);
1207
              fail("we can't reach here since the series id was deleted ");
1208
          } catch (NotFound nf3) {
1209
              //System.out.println("the message is ============="+nf3.getMessage());
1210
              assertTrue(nf3.getMessage().indexOf("delete") >0);
1211
          }
1212
          
1213
          try {
1214
              edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).get(session, newPid2);
1215
              fail("we can't reach here since the series id was deleted ");
1216
          } catch (NotFound nf3) {
1217
              System.out.println("the message is ============="+nf3.getMessage());
1218
              assertTrue(nf3.getMessage().indexOf("delete") >0);
1219
          }
1220
          
1221
          //archive seriesId
1222
          MNodeService.getInstance(request).archive(mnSession, seriesId);
1223
          archived = CNodeService.getInstance(request).getSystemMetadata(session, seriesId);
1224
          assertTrue(archived.getArchived());
1225
          archived = CNodeService.getInstance(request).getSystemMetadata(session, newPid);
1226
          assertTrue(archived.getArchived());
1227
          
1228
          
1229
          //delete seriesId
1230
          CNodeService.getInstance(request).delete(mnSession, seriesId);
1231
          try {
1232
              CNodeService.getInstance(request).get(session, newPid);
1233
              fail("we can't reach here since the series id was deleted ");
1234
          } catch (NotFound nf3) {
1235
              //System.out.println("the message is ============="+nf3.getMessage());
1236
              assertTrue(nf3.getMessage().indexOf("delete") >0);
1237
          }
1238
          SystemMetadata meta = CNodeService.getInstance(request).getSystemMetadata(session, seriesId);
1239
          assertTrue(meta.getIdentifier().getValue().equals(guid.getValue()));
1240
          
1241
      } catch (Exception e) {
1242
          e.printStackTrace();
1243
          fail(e.getMessage());
1244
      }
1245
  }
1246
 
1247
  /**
1248
   * Test the listView methods.
1249
   * @throws Excpetion
1250
   */
1251
  public void testListViews() throws Exception {
1252
      OptionList list = CNodeService.getInstance(request).listViews();
1253
      assertTrue(list.sizeOptionList() >0);
1254
      List<String> names = list.getOptionList();
1255
      for(String name : names) {
1256
          System.out.println("It has the view named "+name);
1257
      }
1258
  }
1259
  
1260
  public void testUpdateSystemMetadata() throws Exception {
1261
          String str1 = "object1";
1262
          String str2 = "object2";
1263
          String str3 = "object3";
1264
  
1265
          Date date = new Date();
1266
          //insert test documents with a series id
1267
          Session session = getCNSession();
1268
          Identifier guid = new Identifier();
1269
          guid.setValue(generateDocumentId());
1270
          System.out.println("?????????????update the id without archive is "+guid.getValue());
1271
          InputStream object1 = new ByteArrayInputStream(str1.getBytes("UTF-8"));
1272
          SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object1);
1273
          String sid1= "sid."+System.nanoTime();
1274
          Identifier seriesId = new Identifier();
1275
          seriesId.setValue(sid1);
1276
          System.out.println("the first sid is "+seriesId.getValue());
1277
          sysmeta.setSeriesId(seriesId);
1278
          sysmeta.setArchived(false);
1279
          CNodeService.getInstance(request).create(session, guid, object1, sysmeta);
1280
          //Test the generating object succeeded. 
1281
          SystemMetadata metadata = CNodeService.getInstance(request).getSystemMetadata(session, guid);
1282
          assertTrue(metadata.getIdentifier().equals(guid));
1283
          assertTrue(metadata.getArchived().equals(false));
1284
          System.out.println("the checksum from request is "+metadata.getChecksum().getValue());
1285
          assertTrue(metadata.getSize().equals(sysmeta.getSize()));
1286
          
1287
          //test to fail to update system metadata by a non-cn subject
1288
          Session testSession = getTestSession();
1289
          SystemMetadata sysmeta1 = CNodeService.getInstance(request).getSystemMetadata(session, guid);
1290
          BigInteger version = sysmeta.getSerialVersion();
1291
          version = version.add(BigInteger.ONE);
1292
          sysmeta1.setSerialVersion(version);
1293
          AccessPolicy accessPolicy = new AccessPolicy();
1294
          AccessRule accessRule = new AccessRule();
1295
          accessRule.addPermission(Permission.WRITE);
1296
          Subject publicSubject = new Subject();
1297
          publicSubject.setValue("hello");
1298
          accessRule.addSubject(publicSubject);
1299
          accessPolicy.addAllow(accessRule);
1300
          AccessRule allow = new AccessRule();
1301
          allow.addPermission(Permission.READ);
1302
          Subject publicSubject2 = new Subject();
1303
          publicSubject2.setValue(Constants.SUBJECT_PUBLIC);
1304
          allow.addSubject(publicSubject2);
1305
          accessPolicy.addAllow(allow);
1306
          sysmeta1.setAccessPolicy(accessPolicy);
1307
          try {
1308
              CNodeService.getInstance(request).updateSystemMetadata(testSession, guid, sysmeta1);
1309
              fail("It shouldn't get there since the test session can't update system metadata");
1310
          } catch (NotAuthorized e) {
1311
              
1312
          }
1313
         
1314
          
1315
          //update system metadata sucessfully
1316
          SystemMetadata sysmeta1c = new SystemMetadata();
1317
          BeanUtils.copyProperties(sysmeta1c, sysmeta1);
1318
          sysmeta1c.setDateSysMetadataModified(date);
1319
          CNodeService.getInstance(request).updateSystemMetadata(session, guid, sysmeta1c);
1320
          SystemMetadata metadata2 = CNodeService.getInstance(request).getSystemMetadata(session, seriesId);
1321
          assertTrue(metadata2.getIdentifier().equals(guid));
1322
          assertTrue(metadata2.getSeriesId().equals(seriesId));
1323
          //assertTrue(metadata2.getArchived().equals(true));
1324
          assertTrue(metadata2.getAccessPolicy().getAllowList().size() == 2);
1325
          assertTrue(metadata2.getChecksum().getValue().equals(metadata.getChecksum().getValue()));
1326
          assertTrue(metadata2.getDateSysMetadataModified().getTime() == date.getTime());
1327
          
1328
          SystemMetadata sysmeta2 = CNodeService.getInstance(request).getSystemMetadata(session, seriesId);
1329
          version = sysmeta2.getSerialVersion();
1330
          version = version.add(BigInteger.ONE);
1331
          sysmeta2.setSerialVersion(version);
1332
          Identifier newId = new Identifier();
1333
          newId.setValue("newValue");
1334
          sysmeta2.setIdentifier(newId);
1335
          try {
1336
              CNodeService.getInstance(request).updateSystemMetadata(session, guid, sysmeta2);
1337
              fail("We shouldn't get there");
1338
          } catch (Exception e) {
1339
              assertTrue(e instanceof InvalidRequest);
1340
          }
1341
          
1342
          newId.setValue("newValue");
1343
          sysmeta2.setSeriesId(newId);
1344
          try {
1345
              CNodeService.getInstance(request).updateSystemMetadata(session, guid, sysmeta2);
1346
              fail("We shouldn't get there");
1347
          } catch (Exception e) {
1348
              assertTrue(e instanceof InvalidRequest);
1349
          }
1350
          
1351
          Date newDate = new Date();
1352
          sysmeta2.setDateUploaded(newDate);
1353
          try {
1354
              CNodeService.getInstance(request).updateSystemMetadata(session, guid, sysmeta2);
1355
              fail("We shouldn't get there");
1356
          } catch (Exception e) {
1357
              assertTrue(e instanceof InvalidRequest);
1358
          }
1359
          
1360
          Checksum checkSum = new Checksum();
1361
          checkSum.setValue("12345");
1362
          sysmeta2.setChecksum(checkSum);
1363
          try {
1364
              CNodeService.getInstance(request).updateSystemMetadata(session, guid, sysmeta2);
1365
              fail("We shouldn't get there");
1366
          } catch (Exception e) {
1367
              assertTrue(e instanceof InvalidRequest);
1368
          }
1369
          
1370
          BigInteger size = new BigInteger("4000");
1371
          sysmeta2.setSize(size);
1372
          try {
1373
              CNodeService.getInstance(request).updateSystemMetadata(session, guid, sysmeta2);
1374
              fail("We shouldn't get there");
1375
          } catch (Exception e) {
1376
              assertTrue(e instanceof InvalidRequest);
1377
          }
1378
          
1379
          // test cn.updateSystemMetadata will ignore the serial version and replica list
1380
          Identifier id = new Identifier();
1381
          id.setValue(generateDocumentId());
1382
          System.out.println("?????????????update the id with archive is "+id.getValue());
1383
          object1 = new ByteArrayInputStream(str1.getBytes("UTF-8"));
1384
          SystemMetadata sysmeta10 = createSystemMetadata(id, session.getSubject(), object1);
1385
          List<Replica> replicas = new ArrayList<Replica>();
1386
          Replica replica1= new Replica();
1387
          NodeReference node1 = new NodeReference();
1388
          node1.setValue("node1");
1389
          replica1.setReplicaMemberNode(node1);
1390
          replica1.setReplicationStatus(ReplicationStatus.FAILED);
1391
          replica1.setReplicaVerified(date);
1392
          replicas.add(replica1);
1393
          Replica replica2= new Replica();
1394
          NodeReference node2 = new NodeReference();
1395
          node2.setValue("node2");
1396
          replica2.setReplicaMemberNode(node2);
1397
          replica2.setReplicationStatus(ReplicationStatus.FAILED);
1398
          replica2.setReplicaVerified(date);
1399
          replicas.add(replica2);
1400
          sysmeta10.setReplicaList(replicas);
1401
          sysmeta10.setArchived(false);
1402
          CNodeService.getInstance(request).create(session, id, object1, sysmeta10);
1403
          SystemMetadata result = CNodeService.getInstance(request).getSystemMetadata(session, id);
1404
          assertTrue(result.getIdentifier().equals(id));
1405
          System.out.println("the serial version is "+result.getSerialVersion().intValue());
1406
          assertTrue(result.getSerialVersion().intValue() == 1);
1407
          List<Replica> list1 = result.getReplicaList();
1408
          assertTrue(list1.size()==2);
1409
          assertTrue(result.getReplica(0).getReplicaMemberNode().getValue().equals("node1"));
1410
          assertTrue(result.getReplica(0).getReplicationStatus().equals(ReplicationStatus.FAILED));
1411
          assertTrue(result.getReplica(0).getReplicaVerified().getTime() == date.getTime());
1412
          assertTrue(result.getReplica(1).getReplicaMemberNode().getValue().equals("node2"));
1413
          assertTrue(result.getReplica(1).getReplicationStatus().equals(ReplicationStatus.FAILED));
1414
          assertTrue(result.getReplica(1).getReplicaVerified().getTime() == date.getTime());
1415
          assertTrue(result.getArchived() ==false);
1416
          
1417
          Date date2 = new Date();
1418
          SystemMetadata sysmeta11 = new SystemMetadata();
1419
          BeanUtils.copyProperties(sysmeta11, result);
1420
          List<Replica> replicaList = new ArrayList<Replica>();
1421
          Replica replica3= new Replica();
1422
          NodeReference node3 = new NodeReference();
1423
          node3.setValue("node3");
1424
          replica3.setReplicaMemberNode(node3);
1425
          replica3.setReplicationStatus(ReplicationStatus.COMPLETED);
1426
          replica3.setReplicaVerified(date2);
1427
          replicaList.add(replica3);
1428
          sysmeta11.setReplicaList(replicaList);
1429
          sysmeta11.setSerialVersion(BigInteger.TEN);
1430
          sysmeta11.setArchived(true);
1431
          
1432
          //make sure the sysmmeta11 has the new replca list and serial version
1433
          assertTrue(sysmeta11.getSerialVersion().equals(BigInteger.TEN));
1434
          assertTrue(sysmeta11.getReplicaList().size()==1);
1435
          assertTrue(sysmeta11.getReplica(0).getReplicaMemberNode().getValue().equals("node3"));
1436
          assertTrue(sysmeta11.getReplica(0).getReplicationStatus().equals(ReplicationStatus.COMPLETED));
1437
          assertTrue(sysmeta11.getReplica(0).getReplicaVerified().getTime() == date2.getTime());
1438
         
1439
          // update the system metadata with the new serial version and new replica list
1440
          // the new serial version and replica list should be ignored.
1441
          CNodeService.getInstance(request).updateSystemMetadata(session, id, sysmeta11);
1442
          SystemMetadata result2 = CNodeService.getInstance(request).getSystemMetadata(session, id);
1443
          assertTrue(result2.getIdentifier().equals(id));
1444
          assertTrue(result2.getSerialVersion().intValue() == 1);
1445
          List<Replica> list2 = result.getReplicaList();
1446
          assertTrue(list2.size()==2);
1447
          assertTrue(result2.getReplica(0).getReplicaMemberNode().getValue().equals("node1"));
1448
          assertTrue(result2.getReplica(0).getReplicationStatus().equals(ReplicationStatus.FAILED));
1449
          assertTrue(result2.getReplica(0).getReplicaVerified().getTime() == date.getTime());
1450
          assertTrue(result2.getReplica(1).getReplicaMemberNode().getValue().equals("node2"));
1451
          assertTrue(result2.getReplica(1).getReplicationStatus().equals(ReplicationStatus.FAILED));
1452
          assertTrue(result2.getReplica(1).getReplicaVerified().getTime() == date.getTime());
1453
          assertTrue(result2.getArchived() ==true);
1454
  }
1455
  
1456
  public void testArchive() throws Exception {
1457
      Session session = getCNSession();
1458
      Identifier guid = new Identifier();
1459
      guid.setValue("testArchive." + System.currentTimeMillis());
1460
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1461
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1462
      Identifier pid = CNodeService.getInstance(request).create(session, guid, object, sysmeta);
1463
      try {
1464
          CNodeService.getInstance(request).archive(session, guid);
1465
      } catch (Exception e) {
1466
         e.printStackTrace();
1467
         if(e instanceof ServiceFailure) {
1468
          assertTrue(e.getMessage().contains("Couldn't determine the authoritative member node"));
1469
        } else {
1470
          fail("Unexpected error: " + e.getMessage());
1471
        }
1472
     }
1473
  }
1474
  
1475
  
1476
  
1477
  public Session getMNSessionFromCN() throws NotImplemented, ServiceFailure {
1478
      Session session = new Session();
1479
      Subject subject = null;
1480
      CNode cn = D1Client.getCN();
1481
      System.out.println("the cn is "+cn.getNodeBaseServiceUrl());
1482
      List<Node> nodes = cn.listNodes().getNodeList();
1483
      System.out.println("the size of the list is "+nodes.size());
1484
      // find the first CN in the node list
1485
      for (Node node : nodes) {
1486
          if (node.getType().equals(NodeType.MN)) {
1487
              subject = node.getSubject(0);
1488
              break;
1489
          }
1490
      }
1491
      session.setSubject(subject);
1492
      return session;
1493
  }
1494
  
1495
}
(1-1/8)