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-10-09 15:24:27 -0700 (Fri, 09 Oct 2015) $'
9
 * '$Revision: 9366 $'
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
import java.util.ArrayList;
37

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

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

    
77
import edu.ucsb.nceas.metacat.dataone.CNodeService;
78
import edu.ucsb.nceas.metacat.dataone.MNodeService;
79

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

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

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

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

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

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

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

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

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

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

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

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

    
353
	    try {
354
            Session session = getCNSession();
355
			Identifier guid = new Identifier();
356
			guid.setValue("testSetAccessPolicy." + System.currentTimeMillis());
357
			InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
358
			SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
359
	    long serialVersion = 1L;
360

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

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

    
423
	    try {
424
            Session session = getCNSession();
425
			Identifier guid = new Identifier();
426
			guid.setValue("testReplicationPolicy." + System.currentTimeMillis());
427
			InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
428
			SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
429
	    long serialVersion = 1L;
430

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

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

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

    
615
    } catch (NotImplemented e) {
616
  		fail("Could not get the object format list: " + e.getMessage());
617

    
618
    }
619
    
620
	}
621
	
622
  /**
623
   * Test getting a single object format from the registered list
624
   */
625
  public void testGetFormat() {
626
  	
627
    printTestHeader("testGetFormat");
628

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

    
653
    } catch (NotImplemented nie) {
654
    	fail("The getFormat() method has not been implemented: " + nie.getMessage());
655

    
656
    }
657
  	
658
  }
659
	
660
  /**
661
   * Test getting a non-existent object format, returning NotFound
662
   */
663
  public void testObjectFormatNotFoundException() {
664
  
665
    printTestHeader("testObjectFormatNotFoundException");
666

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

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

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

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