Project

General

Profile

1 6122 leinfelder
/**
2
 *  '$RCSfile$'
3
 *  Copyright: 2010 Regents of the University of California and the
4
 *              National Center for Ecological Analysis and Synthesis
5
 *  Purpose: To test the Access Controls in metacat by JUnit
6
 *
7
 *   '$Author$'
8
 *     '$Date$'
9
 * '$Revision$'
10
 *
11
 * This program is free software; you can redistribute it and/or modify
12
 * it under the terms of the GNU General Public License as published by
13
 * the Free Software Foundation; either version 2 of the License, or
14
 * (at your option) any later version.
15
 *
16
 * This program is distributed in the hope that it will be useful,
17
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19
 * GNU General Public License for more details.
20
 *
21
 * You should have received a copy of the GNU General Public License
22
 * along with this program; if not, write to the Free Software
23
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
24
 */
25
26
package edu.ucsb.nceas.metacat.dataone;
27
28 8905 tao
29 6295 leinfelder
import java.io.ByteArrayInputStream;
30 10002 tao
import java.io.IOException;
31 6295 leinfelder
import java.io.InputStream;
32 9167 tao
import java.math.BigInteger;
33 6319 leinfelder
import java.text.SimpleDateFormat;
34 6879 cjones
import java.util.Calendar;
35 6122 leinfelder
import java.util.Date;
36 6697 leinfelder
import java.util.List;
37 9338 tao
import java.util.ArrayList;
38 6122 leinfelder
39
import junit.framework.Test;
40
import junit.framework.TestSuite;
41
42 9302 tao
import org.apache.commons.beanutils.BeanUtils;
43 6315 leinfelder
import org.apache.commons.io.IOUtils;
44 10002 tao
import org.dataone.client.D1Node;
45
import org.dataone.client.NodeLocator;
46
import org.dataone.client.exception.ClientSideException;
47 9273 tao
import org.dataone.client.v2.CNode;
48 8810 leinfelder
import org.dataone.client.v2.itk.D1Client;
49 6797 leinfelder
import org.dataone.service.exceptions.BaseException;
50 9167 tao
import org.dataone.service.exceptions.InvalidRequest;
51 9112 tao
import org.dataone.service.exceptions.InvalidSystemMetadata;
52 6320 leinfelder
import org.dataone.service.exceptions.NotAuthorized;
53 6141 cjones
import org.dataone.service.exceptions.NotFound;
54
import org.dataone.service.exceptions.NotImplemented;
55
import org.dataone.service.exceptions.ServiceFailure;
56 6366 leinfelder
import org.dataone.service.types.v1.AccessPolicy;
57
import org.dataone.service.types.v1.AccessRule;
58
import org.dataone.service.types.v1.Checksum;
59 8905 tao
import org.dataone.service.types.v1.DescribeResponse;
60 6366 leinfelder
import org.dataone.service.types.v1.Event;
61
import org.dataone.service.types.v1.Identifier;
62
import org.dataone.service.types.v1.NodeReference;
63 6697 leinfelder
import org.dataone.service.types.v1.NodeType;
64 6366 leinfelder
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 8834 leinfelder
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 9147 tao
import org.dataone.service.types.v2.OptionList;
78 8810 leinfelder
import org.dataone.service.types.v2.SystemMetadata;
79 6697 leinfelder
import org.dataone.service.util.Constants;
80 6122 leinfelder
81 9112 tao
import edu.ucsb.nceas.metacat.dataone.CNodeService;
82 10002 tao
import edu.ucsb.nceas.metacat.dataone.D1NodeService;
83 9147 tao
import edu.ucsb.nceas.metacat.dataone.MNodeService;
84 9112 tao
85 6122 leinfelder
/**
86
 * A JUnit test for testing the dataone CNCore implementation
87
 */
88 6324 leinfelder
public class CNodeServiceTest extends D1NodeServiceTest {
89 6122 leinfelder
90
    /**
91
    * constructor for the test
92
    */
93 6287 leinfelder
    public CNodeServiceTest(String name)
94 6122 leinfelder
    {
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 6287 leinfelder
		suite.addTest(new CNodeServiceTest("initialize"));
105 6122 leinfelder
106 9344 tao
		suite.addTest(new CNodeServiceTest("testChecksum"));
107 6295 leinfelder
		suite.addTest(new CNodeServiceTest("testCreate"));
108 6315 leinfelder
		suite.addTest(new CNodeServiceTest("testGet"));
109 6295 leinfelder
		suite.addTest(new CNodeServiceTest("testGetFormat"));
110 6322 leinfelder
		suite.addTest(new CNodeServiceTest("testGetLogRecords"));
111 6317 leinfelder
		suite.addTest(new CNodeServiceTest("testGetSystemMetadata"));
112 6320 leinfelder
		suite.addTest(new CNodeServiceTest("testIsAuthorized"));
113 6287 leinfelder
		suite.addTest(new CNodeServiceTest("testListFormats"));
114 6295 leinfelder
		suite.addTest(new CNodeServiceTest("testListNodes"));
115
		suite.addTest(new CNodeServiceTest("testObjectFormatNotFoundException"));
116 6287 leinfelder
		suite.addTest(new CNodeServiceTest("testRegisterSystemMetadata"));
117 6295 leinfelder
		suite.addTest(new CNodeServiceTest("testReplicationPolicy"));
118
		suite.addTest(new CNodeServiceTest("testReplicationStatus"));
119
		suite.addTest(new CNodeServiceTest("testReserveIdentifier"));
120
		suite.addTest(new CNodeServiceTest("testSearch"));
121 6320 leinfelder
		suite.addTest(new CNodeServiceTest("testSetAccessPolicy"));
122 6295 leinfelder
		suite.addTest(new CNodeServiceTest("testSetOwner"));
123 8905 tao
		suite.addTest(new CNodeServiceTest("readDeletedObject"));
124 9112 tao
		suite.addTest(new CNodeServiceTest("testGetSID"));
125 9344 tao
		suite.addTest(new CNodeServiceTest("testListViews"));
126 9167 tao
		suite.addTest(new CNodeServiceTest("testUpdateSystemMetadata"));
127 9351 tao
		suite.addTest(new CNodeServiceTest("testArchive"));
128 10002 tao
129 6122 leinfelder
		return suite;
130
	}
131
132 6295 leinfelder
133
	/**
134 6122 leinfelder
	 * test for registering standalone system metadata
135
	 */
136 6413 leinfelder
	public Identifier testRegisterSystemMetadata() {
137 6122 leinfelder
	    printTestHeader("testRegisterSystemMetadata");
138
139
	    try {
140 9267 tao
	        Session testSession = getTestSession();
141 9266 tao
            Session session = getCNSession();
142 6122 leinfelder
			Identifier guid = new Identifier();
143
			guid.setValue("testRegisterSystemMetadata." + System.currentTimeMillis());
144 6504 leinfelder
			InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
145
			SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
146 9267 tao
			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 6542 leinfelder
			Identifier retGuid = CNodeService.getInstance(request).registerSystemMetadata(session, guid, sysmeta);
153 6397 leinfelder
			assertEquals(guid.getValue(), retGuid.getValue());
154 6413 leinfelder
			return retGuid;
155 6295 leinfelder
        } catch(Exception e) {
156
            fail("Unexpected error: " + e.getMessage());
157 6122 leinfelder
        }
158 6413 leinfelder
        return null;
159 6295 leinfelder
	}
160
161 6317 leinfelder
	/**
162
	 * test for getting system metadata
163
	 */
164
	public void testGetSystemMetadata() {
165
	    printTestHeader("testGetSystemMetadata");
166
167
	    try {
168 9266 tao
            Session session = getCNSession();
169 6317 leinfelder
			Identifier guid = new Identifier();
170
			guid.setValue("testGetSystemMetadata." + System.currentTimeMillis());
171 6504 leinfelder
			InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
172
			SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
173 6542 leinfelder
			Identifier retGuid = CNodeService.getInstance(request).registerSystemMetadata(session, guid, sysmeta);
174 6397 leinfelder
			assertEquals(guid.getValue(), retGuid.getValue());
175 6317 leinfelder
			// get it
176 6542 leinfelder
			SystemMetadata retSysmeta = CNodeService.getInstance(request).getSystemMetadata(session, guid);
177 6317 leinfelder
			// check it
178
			assertEquals(sysmeta.getIdentifier().getValue(), retSysmeta.getIdentifier().getValue());
179
        } catch(Exception e) {
180
            fail("Unexpected error: " + e.getMessage());
181
        }
182
	}
183
184 6319 leinfelder
	public void testGetLogRecords() {
185
	    printTestHeader("testGetLogRecords");
186
	    try {
187
188 9266 tao
		    Session session = getCNSession();
189 6319 leinfelder
		    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 6322 leinfelder
		    int count = 1;
195 6319 leinfelder
196 6542 leinfelder
		    Log log = CNodeService.getInstance(request).getLogRecords(session, fromDate, toDate,
197 8810 leinfelder
		    	event.xmlValue(), null, start, count);
198 6319 leinfelder
		    assertNotNull(log);
199 6322 leinfelder
		    assertTrue(log.getCount() == count);
200
		    assertTrue(log.getStart() == start);
201
		    assertTrue(log.getTotal() > 0);
202 6319 leinfelder
	    } catch (Exception e) {
203
		    e.printStackTrace();
204
		    fail("Unexpected error: " + e.getMessage());
205
	    }
206
	}
207
208 6295 leinfelder
	public void testCreate() {
209
	    printTestHeader("testCreate");
210
211
	    try {
212 9266 tao
            Session session = getCNSession();
213 6295 leinfelder
			Identifier guid = new Identifier();
214
			guid.setValue("testCreate." + System.currentTimeMillis());
215
			InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
216 6324 leinfelder
			SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
217 6542 leinfelder
			Identifier pid = CNodeService.getInstance(request).create(session, guid, object, sysmeta);
218 6295 leinfelder
			assertEquals(guid, pid);
219
        } catch(Exception e) {
220
        	e.printStackTrace();
221
            fail("Unexpected error: " + e.getMessage());
222 6122 leinfelder
        }
223
	}
224
225 6315 leinfelder
	public void testGet() {
226
	    printTestHeader("testGet");
227
228
	    try {
229 9266 tao
            Session session = getCNSession();
230 6315 leinfelder
			Identifier guid = new Identifier();
231
			guid.setValue("testGet." + System.currentTimeMillis());
232
			InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
233 6324 leinfelder
			SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
234 6542 leinfelder
			Identifier pid = CNodeService.getInstance(request).create(session, guid, object, sysmeta);
235 6397 leinfelder
			assertEquals(guid.getValue(), pid.getValue());
236 9112 tao
			System.out.println("the pid is+++++++++++++++++++++++++"+guid.getValue());
237 6315 leinfelder
			// get it
238 6542 leinfelder
			InputStream retObject = CNodeService.getInstance(request).get(session, pid);
239 6315 leinfelder
			// check it
240 6357 leinfelder
			object.reset();
241 6315 leinfelder
			assertTrue(IOUtils.contentEquals(object, retObject));
242
        } catch(Exception e) {
243
        	e.printStackTrace();
244
            fail("Unexpected error: " + e.getMessage());
245
        }
246
	}
247
248 6295 leinfelder
	public void testChecksum() {
249
	    printTestHeader("testChecksum");
250
251
	    try {
252 9266 tao
            Session session = getCNSession();
253 6295 leinfelder
			Identifier guid = new Identifier();
254
			guid.setValue("testChecksum." + System.currentTimeMillis());
255 6504 leinfelder
			InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
256
			SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
257 6295 leinfelder
			// save it
258 6542 leinfelder
			Identifier retGuid = CNodeService.getInstance(request).registerSystemMetadata(session, guid, sysmeta);
259 6397 leinfelder
			assertEquals(guid.getValue(), retGuid.getValue());
260 6295 leinfelder
			// check it
261 6542 leinfelder
			Checksum checksum = CNodeService.getInstance(request).getChecksum(session, guid);
262 6295 leinfelder
			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 6542 leinfelder
	    	CNodeService.getInstance(request).listNodes();
273 6295 leinfelder
        } 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 9266 tao
            Session session = getCNSession();
286 6295 leinfelder
			Identifier guid = new Identifier();
287
			guid.setValue("testReserveIdentifier." + System.currentTimeMillis());
288
			// reserve it
289 6622 leinfelder
			Identifier resultPid = CNodeService.getInstance(request).reserveIdentifier(session, guid);
290
			assertNotNull(resultPid);
291
			assertEquals(guid.getValue(), resultPid.getValue());
292 6357 leinfelder
	    } catch(NotImplemented ni) {
293
        	// this is not implemented in Metacat
294
            assertTrue(true);
295 6295 leinfelder
        } 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 9266 tao
            Session session = getCNSession();
306 6295 leinfelder
307 7464 leinfelder
			// 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 7466 leinfelder
				return;
313 6295 leinfelder
			}
314 7464 leinfelder
			fail("Metacat should not implement CN.search");
315
316 6295 leinfelder
        } catch(Exception e) {
317
            fail("Unexpected error: " + e.getMessage());
318
        }
319
	}
320
321
	public void testSetOwner() {
322
	    printTestHeader("testSetOwner");
323
324
	    try {
325 10044 tao
            //v2 mn should fail
326 9266 tao
            Session session = getCNSession();
327 10044 tao
            Identifier guid = new Identifier();
328
            guid.setValue("testSetOwner." + System.currentTimeMillis());
329
            InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
330
            SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
331
            NodeReference nr = new NodeReference();
332
            nr.setValue(MockCNode.V1MNNODEID);
333
            sysmeta.setOriginMemberNode(nr);
334
            sysmeta.setAuthoritativeMemberNode(nr);
335
            long serialVersion = 1L;
336
            // save it
337
            Identifier retGuid = CNodeService.getInstance(request).registerSystemMetadata(session, guid, sysmeta);
338
            assertEquals(guid.getValue(), retGuid.getValue());
339
            Subject rightsHolder = new Subject();
340
            rightsHolder.setValue("newUser");
341
            // set it
342
            Identifier retPid = CNodeService.getInstance(request).setRightsHolder(session, guid, rightsHolder, serialVersion);
343
            assertEquals(guid, retPid);
344
            // get it
345
            sysmeta = CNodeService.getInstance(request).getSystemMetadata(session, guid);
346
            assertNotNull(sysmeta);
347
            // check it
348
            assertTrue(rightsHolder.equals(sysmeta.getRightsHolder()));
349
350
        } catch(Exception e) {
351
            e.printStackTrace();
352
            fail("Unexpected error: " + e.getMessage());
353
        }
354
	    try {
355
	        //v2 mn should fail
356
            Session session = getCNSession();
357 6295 leinfelder
			Identifier guid = new Identifier();
358
			guid.setValue("testSetOwner." + System.currentTimeMillis());
359 6504 leinfelder
			InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
360
			SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
361 10044 tao
			NodeReference nr = new NodeReference();
362
            nr.setValue(MockCNode.V2MNNODEID);
363
            sysmeta.setOriginMemberNode(nr);
364
            sysmeta.setAuthoritativeMemberNode(nr);
365 6594 cjones
			long serialVersion = 1L;
366 6295 leinfelder
			// save it
367 6542 leinfelder
			Identifier retGuid = CNodeService.getInstance(request).registerSystemMetadata(session, guid, sysmeta);
368 6397 leinfelder
			assertEquals(guid.getValue(), retGuid.getValue());
369 6295 leinfelder
			Subject rightsHolder = new Subject();
370
			rightsHolder.setValue("newUser");
371
			// set it
372 6804 leinfelder
			Identifier retPid = CNodeService.getInstance(request).setRightsHolder(session, guid, rightsHolder, serialVersion);
373 6295 leinfelder
			assertEquals(guid, retPid);
374
			// get it
375 6542 leinfelder
			sysmeta = CNodeService.getInstance(request).getSystemMetadata(session, guid);
376 6295 leinfelder
			assertNotNull(sysmeta);
377
			// check it
378 6688 leinfelder
			assertTrue(rightsHolder.equals(sysmeta.getRightsHolder()));
379 6295 leinfelder
380
        } catch(Exception e) {
381 9366 tao
            e.printStackTrace();
382 10044 tao
            if(e instanceof NotAuthorized) {
383
                assertTrue(e.getMessage().contains("The Coordinating Node is not authorized to make systemMetadata changes"));
384 9358 tao
            } else {
385
                fail("Unexpected error: " + e.getMessage());
386
            }
387 6295 leinfelder
        }
388
	}
389
390 6320 leinfelder
	public void testSetAccessPolicy() {
391
	    printTestHeader("testSetAccessPolicy");
392 10044 tao
393
394
	    try {
395
            // trys to set access policy on an object whose authortiative memeber node is MNRead v2. It should fail.
396
            Session session = getCNSession();
397
            Identifier guid = new Identifier();
398
            guid.setValue("testSetAccessPolicy." + System.currentTimeMillis());
399
            InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
400
            SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
401
            NodeReference nr = new NodeReference();
402
            nr.setValue(MockCNode.V1MNNODEID);
403
            sysmeta.setOriginMemberNode(nr);
404
            sysmeta.setAuthoritativeMemberNode(nr);
405
406
            long serialVersion = 1L;
407 6320 leinfelder
408 10044 tao
            // save it
409
            Identifier retGuid = CNodeService.getInstance(request).registerSystemMetadata(session, guid, sysmeta);
410
            assertEquals(guid.getValue(), retGuid.getValue());
411
            AccessPolicy accessPolicy = new AccessPolicy();
412
            AccessRule accessRule = new AccessRule();
413
            accessRule.addPermission(Permission.WRITE);
414
            Subject publicSubject = new Subject();
415
            publicSubject.setValue(Constants.SUBJECT_PUBLIC);
416
            accessRule.addSubject(publicSubject);
417
            accessPolicy.addAllow(accessRule);
418
            // set it
419
            boolean result = CNodeService.getInstance(request).setAccessPolicy(session, guid, accessPolicy, serialVersion );
420
            assertTrue(result);
421
            // check it
422
            result = CNodeService.getInstance(request).isAuthorized(session, guid, Permission.WRITE);
423
            assertTrue(result);
424
        } catch(Exception e) {
425
426
            fail("Unexpected error: " + e.getMessage());
427
428
        }
429
430 6320 leinfelder
	    try {
431 10044 tao
	        // trys to set access policy on an object whose authortiative memeber node is MNRead v2. It should fail.
432 9266 tao
            Session session = getCNSession();
433 6320 leinfelder
			Identifier guid = new Identifier();
434
			guid.setValue("testSetAccessPolicy." + System.currentTimeMillis());
435 6504 leinfelder
			InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
436
			SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
437 10044 tao
			NodeReference nr = new NodeReference();
438
	        nr.setValue(MockCNode.V2MNNODEID);
439
	        sysmeta.setOriginMemberNode(nr);
440
			sysmeta.setAuthoritativeMemberNode(nr);
441
442
	        long serialVersion = 1L;
443 6594 cjones
444 6320 leinfelder
			// save it
445 6542 leinfelder
			Identifier retGuid = CNodeService.getInstance(request).registerSystemMetadata(session, guid, sysmeta);
446 6397 leinfelder
			assertEquals(guid.getValue(), retGuid.getValue());
447 6320 leinfelder
			AccessPolicy accessPolicy = new AccessPolicy();
448
			AccessRule accessRule = new AccessRule();
449
			accessRule.addPermission(Permission.WRITE);
450
			Subject publicSubject = new Subject();
451 6532 leinfelder
			publicSubject.setValue(Constants.SUBJECT_PUBLIC);
452 6320 leinfelder
			accessRule.addSubject(publicSubject);
453
			accessPolicy.addAllow(accessRule);
454
			// set it
455 6594 cjones
			boolean result = CNodeService.getInstance(request).setAccessPolicy(session, guid, accessPolicy, serialVersion );
456 6320 leinfelder
			assertTrue(result);
457
			// check it
458 6542 leinfelder
			result = CNodeService.getInstance(request).isAuthorized(session, guid, Permission.WRITE);
459 6320 leinfelder
			assertTrue(result);
460
        } catch(Exception e) {
461 9366 tao
            e.printStackTrace();
462 10044 tao
            if(e instanceof NotAuthorized) {
463
                assertTrue(e.getMessage().contains("The Coordinating Node is not authorized to make systemMetadata changes"));
464 9348 tao
            } else {
465
                fail("Unexpected error: " + e.getMessage());
466
            }
467 6320 leinfelder
        }
468
	}
469
470
	public void testIsAuthorized() {
471
	    printTestHeader("testIsAuthorized");
472
473
	    try {
474 9266 tao
            Session session = getCNSession();
475 6320 leinfelder
			Identifier guid = new Identifier();
476
			guid.setValue("testIsAuthorized." + System.currentTimeMillis());
477 6504 leinfelder
			InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
478
			SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
479 6320 leinfelder
			// save it
480 6542 leinfelder
			Identifier retGuid = CNodeService.getInstance(request).registerSystemMetadata(session, guid, sysmeta);
481 6397 leinfelder
			assertEquals(guid.getValue(), retGuid.getValue());
482 6320 leinfelder
			// check it
483
			Subject publicSubject = new Subject();
484 6532 leinfelder
			publicSubject.setValue(Constants.SUBJECT_PUBLIC);
485 6320 leinfelder
			session.setSubject(publicSubject);
486
			// public read
487 6542 leinfelder
			boolean result = CNodeService.getInstance(request).isAuthorized(session, guid, Permission.READ);
488 6320 leinfelder
			assertTrue(result);
489
			// not public write
490
			try {
491
				result = false;
492 6542 leinfelder
				result = CNodeService.getInstance(request).isAuthorized(session, guid, Permission.WRITE);
493 6320 leinfelder
				fail("Public WRITE should be denied");
494
			} catch (NotAuthorized nae) {
495
				result = true;
496
			}
497
			assertTrue(result);
498
        } catch(Exception e) {
499
            fail("Unexpected error: " + e.getMessage());
500
        }
501
	}
502
503 6295 leinfelder
	public void testReplicationPolicy() {
504
	    printTestHeader("testReplicationPolicy");
505
506
	    try {
507 10044 tao
            //v2 mn should fail
508 9266 tao
            Session session = getCNSession();
509 10044 tao
            Identifier guid = new Identifier();
510
            guid.setValue("testReplicationPolicy." + System.currentTimeMillis());
511
            InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
512
            SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
513
            NodeReference nr = new NodeReference();
514
            nr.setValue(MockCNode.V1MNNODEID);
515
            sysmeta.setOriginMemberNode(nr);
516
            sysmeta.setAuthoritativeMemberNode(nr);
517
            long serialVersion = 1L;
518
519
            // save it
520
            Identifier retGuid = CNodeService.getInstance(request).registerSystemMetadata(session, guid, sysmeta);
521
            assertEquals(guid.getValue(), retGuid.getValue());
522
523
            ReplicationPolicy policy = new ReplicationPolicy();
524
            NodeReference node = new NodeReference();
525
            node.setValue("testNode");
526
            policy.addPreferredMemberNode(node );
527
            // set it
528
            boolean result = CNodeService.getInstance(request).setReplicationPolicy(session, guid, policy, serialVersion);
529
            assertTrue(result);
530
            // get it
531
            sysmeta = CNodeService.getInstance(request).getSystemMetadata(session, guid);
532
            assertNotNull(sysmeta);
533
            // check it
534
            assertEquals(policy.getPreferredMemberNode(0).getValue(), sysmeta.getReplicationPolicy().getPreferredMemberNode(0).getValue());
535
536
        } catch(Exception e) {
537
538
                fail("Unexpected error: " + e.getMessage());
539
540
541
        }
542
	    try {
543
	        //v2 mn should fail
544
            Session session = getCNSession();
545 6295 leinfelder
			Identifier guid = new Identifier();
546
			guid.setValue("testReplicationPolicy." + System.currentTimeMillis());
547 6504 leinfelder
			InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
548
			SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
549 10044 tao
			NodeReference nr = new NodeReference();
550
            nr.setValue(MockCNode.V2MNNODEID);
551
            sysmeta.setOriginMemberNode(nr);
552
            sysmeta.setAuthoritativeMemberNode(nr);
553
	        long serialVersion = 1L;
554 6594 cjones
555 6295 leinfelder
			// save it
556 6542 leinfelder
			Identifier retGuid = CNodeService.getInstance(request).registerSystemMetadata(session, guid, sysmeta);
557 6397 leinfelder
			assertEquals(guid.getValue(), retGuid.getValue());
558 6295 leinfelder
559
			ReplicationPolicy policy = new ReplicationPolicy();
560
			NodeReference node = new NodeReference();
561
			node.setValue("testNode");
562
			policy.addPreferredMemberNode(node );
563
			// set it
564 6594 cjones
			boolean result = CNodeService.getInstance(request).setReplicationPolicy(session, guid, policy, serialVersion);
565 6295 leinfelder
			assertTrue(result);
566
			// get it
567 6542 leinfelder
			sysmeta = CNodeService.getInstance(request).getSystemMetadata(session, guid);
568 6295 leinfelder
			assertNotNull(sysmeta);
569
			// check it
570
			assertEquals(policy.getPreferredMemberNode(0).getValue(), sysmeta.getReplicationPolicy().getPreferredMemberNode(0).getValue());
571
572
        } catch(Exception e) {
573 9366 tao
            e.printStackTrace();
574 10044 tao
            if(e instanceof NotAuthorized) {
575
                assertTrue(e.getMessage().contains("The Coordinating Node is not authorized to make systemMetadata changes"));
576 9346 tao
            } else {
577
                fail("Unexpected error: " + e.getMessage());
578
            }
579
580 6295 leinfelder
        }
581
	}
582
583
	public void testReplicationStatus() {
584
	    printTestHeader("testReplicationStatus");
585
586
	    try {
587 9266 tao
            Session session = getCNSession();
588 6295 leinfelder
			Identifier guid = new Identifier();
589
			guid.setValue("testReplicationStatus." + System.currentTimeMillis());
590 6504 leinfelder
			InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
591
			SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
592 6295 leinfelder
			Replica replica = new Replica();
593
			NodeReference replicaMemberNode = new NodeReference();
594
			replicaMemberNode.setValue("testNode");
595
			replica.setReplicationStatus(ReplicationStatus.REQUESTED);
596
			replica.setReplicaMemberNode(replicaMemberNode);
597 6879 cjones
			replica.setReplicaVerified(Calendar.getInstance().getTime());
598 6295 leinfelder
			sysmeta.addReplica(replica );
599
			// save it
600 6542 leinfelder
			Identifier retGuid = CNodeService.getInstance(request).registerSystemMetadata(session, guid, sysmeta);
601 6397 leinfelder
			assertEquals(guid.getValue(), retGuid.getValue());
602 6295 leinfelder
			// set it
603 9273 tao
			ReplicationStatus status = ReplicationStatus.QUEUED;
604 6797 leinfelder
			BaseException failure = new NotAuthorized("000", "Mock exception for " + this.getClass().getName());
605 9267 tao
			//Test the failure of setReplicationStatus by a non-cn subject
606
			Session testSession = getTestSession();
607
			try {
608
			    CNodeService.getInstance(request).setReplicationStatus(testSession, guid, replicaMemberNode, status, failure);
609
			    fail("It can't reach here since the non-cn subject can't call setReplicationStatus");
610
			} catch (NotAuthorized ee) {
611
612
			}
613
			//Test the success of setReplicationStatus by a cn subject
614 6797 leinfelder
			boolean result = CNodeService.getInstance(request).setReplicationStatus(session, guid, replicaMemberNode, status, failure);
615 6295 leinfelder
			assertTrue(result);
616
			// get it
617 6542 leinfelder
			sysmeta = CNodeService.getInstance(request).getSystemMetadata(session, guid);
618 9316 tao
			BigInteger version = sysmeta.getSerialVersion();
619
			System.out.println("the version of system metadata is "+version.intValue());
620 6295 leinfelder
			assertNotNull(sysmeta);
621
			// check it
622
			assertEquals(status, sysmeta.getReplica(0).getReplicationStatus());
623
624 9316 tao
			//set it failed.
625
			status = ReplicationStatus.FAILED;
626
            result = CNodeService.getInstance(request).setReplicationStatus(session, guid, replicaMemberNode, status, failure);
627
            assertTrue(result);
628
            // get it
629
            sysmeta = CNodeService.getInstance(request).getSystemMetadata(session, guid);
630
            BigInteger version1 = sysmeta.getSerialVersion();
631
            System.out.println("the version of system metadata is "+version1.intValue());
632
            assertTrue(version1.compareTo(version) == 1);
633
            assertNotNull(sysmeta);
634
            // check it
635
            assertEquals(status, sysmeta.getReplica(0).getReplicationStatus());
636
637
            //set it failed again
638
            status = ReplicationStatus.FAILED;
639
            result = CNodeService.getInstance(request).setReplicationStatus(session, guid, replicaMemberNode, status, failure);
640
            assertTrue(result);
641
            // get it
642
            sysmeta = CNodeService.getInstance(request).getSystemMetadata(session, guid);
643
            BigInteger version2 = sysmeta.getSerialVersion();
644
            System.out.println("the version of system metadata is "+version2.intValue());
645
            assertTrue(version2.compareTo(version1) ==0);
646
            assertNotNull(sysmeta);
647
            // check it
648
            assertEquals(status, sysmeta.getReplica(0).getReplicationStatus());
649
650
			//requeque it
651
			status = ReplicationStatus.QUEUED;
652
			result = CNodeService.getInstance(request).setReplicationStatus(session, guid, replicaMemberNode, status, failure);
653
            assertTrue(result);
654
            // get it
655
            sysmeta = CNodeService.getInstance(request).getSystemMetadata(session, guid);
656
            BigInteger version3 = sysmeta.getSerialVersion();
657
            System.out.println("the version of system metadata is "+version3.intValue());
658
            assertTrue(version3.compareTo(version2) ==1);
659
            assertNotNull(sysmeta);
660
            // check it
661
            assertEquals(status, sysmeta.getReplica(0).getReplicationStatus());
662
663
664 9273 tao
			//Test the success of setReplicationStatus by a register mn subject
665
			Session mnSession = getMNSessionFromCN();
666
			status = ReplicationStatus.COMPLETED;
667
			result = CNodeService.getInstance(request).setReplicationStatus(mnSession, guid, replicaMemberNode, status, failure);
668
			sysmeta = CNodeService.getInstance(request).getSystemMetadata(session, guid);
669 9316 tao
			BigInteger version4 = sysmeta.getSerialVersion();
670
			            System.out.println("the version of system metadata is "+version4.intValue());
671
			            assertTrue(version4.compareTo(version3) ==1);
672 9273 tao
            assertNotNull(sysmeta);
673
            // check it
674
            assertEquals(status, sysmeta.getReplica(0).getReplicationStatus());
675
676 6295 leinfelder
        } catch(Exception e) {
677
            fail("Unexpected error: " + e.getMessage());
678
        }
679
	}
680
681 6122 leinfelder
	/**
682
	 * Run an initial test that always passes to check that the test harness is
683
	 * working.
684
	 */
685
	public void initialize()
686
	{
687
	    printTestHeader("initialize");
688
		assertTrue(1 == 1);
689
	}
690 6307 leinfelder
691 6697 leinfelder
	/**
692
	 * We want to act as the CN itself
693
	 * @throws ServiceFailure
694
	 * @throws Exception
695
	 */
696 9266 tao
	/*@Override
697 6697 leinfelder
	public Session getTestSession() throws Exception {
698
		Session session = super.getTestSession();
699
700
		// use the first CN we find in the nodelist
701
        NodeList nodeList = D1Client.getCN().listNodes();
702
        for (Node node : nodeList.getNodeList()) {
703
            if ( node.getType().equals(NodeType.CN) ) {
704
705
                List<Subject> subjects = node.getSubjectList();
706
                for (Subject subject : subjects) {
707
                   session.setSubject(subject);
708
                   // we are done here
709
                   return session;
710
                }
711
            }
712
        }
713
        // in case we didn't find it
714
        return session;
715 9266 tao
	}*/
716 6697 leinfelder
717 6141 cjones
718
	/**
719
	 * test to list the object formats registered in metacat
720
	 */
721
	public void testListFormats() {
722
723
    printTestHeader("testListFormats");
724
725 6307 leinfelder
    // make sure we are set up
726
    setUpFormats();
727
728 6141 cjones
    // there should be at least 59 formats in the list
729
  	int formatsCount = 59;
730
  	ObjectFormatList objectFormatList;
731
732
  	try {
733 6542 leinfelder
	    objectFormatList = CNodeService.getInstance(request).listFormats();
734 6141 cjones
	  	assertTrue(objectFormatList.getTotal() >= formatsCount);
735
736
  	} catch (ServiceFailure e) {
737
  		fail("Could not get the object format list: " + e.getMessage());
738
739
    } catch (NotImplemented e) {
740
  		fail("Could not get the object format list: " + e.getMessage());
741
742
    }
743
744
	}
745 6122 leinfelder
746 6141 cjones
  /**
747
   * Test getting a single object format from the registered list
748
   */
749
  public void testGetFormat() {
750
751
    printTestHeader("testGetFormat");
752
753 6307 leinfelder
    // make sure we are set up
754
    setUpFormats();
755
756 6141 cjones
    String knownFormat = "text/plain";
757
    ObjectFormatIdentifier fmtid = new ObjectFormatIdentifier();
758
    fmtid.setValue(knownFormat);
759
760
    try {
761
762
			String result =
763 6561 leinfelder
				CNodeService.getInstance(request).getFormat(fmtid).getFormatId().getValue();
764 6141 cjones
	  	System.out.println("Expected result: " + knownFormat);
765
	  	System.out.println("Found    result: " + result);
766
	  	assertTrue(result.equals(knownFormat));
767
768
    } catch (NullPointerException npe) {
769
	    fail("The returned format was null: " + npe.getMessage());
770
771
    } catch (NotFound nfe) {
772
    	fail("The format " + knownFormat + " was not found: " + nfe.getMessage());
773
774
    } catch (ServiceFailure sfe) {
775
    	fail("The format " + knownFormat + " was not found: " + sfe.getMessage());
776
777
    } catch (NotImplemented nie) {
778
    	fail("The getFormat() method has not been implemented: " + nie.getMessage());
779
780
    }
781
782
  }
783
784
  /**
785
   * Test getting a non-existent object format, returning NotFound
786
   */
787
  public void testObjectFormatNotFoundException() {
788
789
    printTestHeader("testObjectFormatNotFoundException");
790
791
    ObjectFormatIdentifier fmtid = new ObjectFormatIdentifier();
792
  	String badFormat = "text/bad-format";
793
  	fmtid.setValue(badFormat);
794
795
  	try {
796
797
	    ObjectFormat objectFormat =
798 6542 leinfelder
	    	CNodeService.getInstance(request).getFormat(fmtid);
799 6141 cjones
800
  	} catch (Exception e) {
801
802
  		assertTrue(e instanceof NotFound);
803
  	}
804
805
  }
806 8905 tao
807
  public void readDeletedObject() {
808
      printTestHeader("testCreate");
809
810
      try {
811 9266 tao
          Session session = getCNSession();
812 8905 tao
          Identifier guid = new Identifier();
813
          guid.setValue("testCreate." + System.currentTimeMillis());
814
          InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
815
          SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
816
          Identifier pid = CNodeService.getInstance(request).create(session, guid, object, sysmeta);
817
          assertEquals(guid, pid);
818
819
          Thread.sleep(3000);
820
          // use MN admin to delete
821
          session = getMNSession();
822
          Identifier deletedPid = CNodeService.getInstance(request).delete(session, pid);
823
          System.out.println("after deleting");
824
          assertEquals(pid.getValue(), deletedPid.getValue());
825
          // check that we cannot get the object
826
          session = getTestSession();
827
          InputStream deletedObject = null;
828
          try {
829
              //System.out.println("before read ===============");
830
              deletedObject = CNodeService.getInstance(request).get(session, deletedPid);
831
              //System.out.println("after read ===============");
832
          } catch (NotFound nf) {
833
              //System.out.println("the exception is1 "+nf.getMessage());
834
              //nf.printStackTrace();
835
              assertTrue(nf.getMessage().contains("deleted"));
836
          }
837
          try {
838
              //System.out.println("before read ===============");
839
              SystemMetadata sysmeta2 = CNodeService.getInstance(request).getSystemMetadata(session, deletedPid);
840
              //System.out.println("after read ===============");
841
          } catch (NotFound nf) {
842
              //System.out.println("the exception is "+nf.getMessage());
843
              //nf.printStackTrace();
844
              assertTrue(nf.getMessage().contains("deleted"));
845
          }
846
847
          try {
848
              //System.out.println("before read ===============");
849
              DescribeResponse describeResponse = CNodeService.getInstance(request).describe(session, pid);
850
              //System.out.println("after read ===============");
851
          } catch (NotFound nf) {
852
              //System.out.println("the exception is "+nf.getMessage());
853
              //nf.printStackTrace();
854
              assertTrue(nf.getMessage().contains("deleted"));
855
          }
856
857
          try {
858
              //System.out.println("before read ===============");
859
              Checksum checksum = CNodeService.getInstance(request).getChecksum(session, pid);
860
              //System.out.println("after read ===============");
861
          } catch (NotFound nf) {
862
              //System.out.println("the exception 3 is "+nf.getMessage());
863
              //nf.printStackTrace();
864
              assertTrue(nf.getMessage().contains("deleted"));
865
          }
866
867
          try {
868
              //System.out.println("before read ===============");
869
              boolean isAuthorized =
870
                      CNodeService.getInstance(request).isAuthorized(session, pid, Permission.READ);
871
              //System.out.println("after read ===============");
872
          } catch (NotFound nf) {
873
              //System.out.println("the exception 4 is "+nf.getMessage());
874
              //nf.printStackTrace();
875
              assertTrue(nf.getMessage().contains("deleted"));
876
          }
877
878
879
880
          assertNull(deletedObject);
881
      } catch(Exception e) {
882
          e.printStackTrace();
883
          fail("Unexpected error: " + e.getMessage());
884
      }
885
  }
886 9112 tao
887
  /**
888
   * Test the method - get api  for a speicified SID
889
   */
890
  public void testGetSID() {
891
      String str1 = "object1";
892
      String str2 = "object2";
893
      String str3 = "object3";
894
      try {
895
          //insert test documents with a series id
896 9266 tao
          Session session = getCNSession();
897 9112 tao
          Identifier guid = new Identifier();
898
          guid.setValue(generateDocumentId());
899
          InputStream object1 = new ByteArrayInputStream(str1.getBytes("UTF-8"));
900
          SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object1);
901
          String sid1= "sid."+System.nanoTime();
902
          Identifier seriesId = new Identifier();
903
          seriesId.setValue(sid1);
904
          System.out.println("the first sid is "+seriesId.getValue());
905
          sysmeta.setSeriesId(seriesId);
906
          CNodeService.getInstance(request).create(session, guid, object1, sysmeta);
907
          System.out.println("the first pid is "+guid.getValue());
908
          //test the get(pid) for v2
909
          InputStream result = CNodeService.getInstance(request).get(session, guid);
910
          // go back to beginning of original stream
911
          object1.reset();
912
          // check
913
          assertTrue(object1.available() > 0);
914
          assertTrue(result.available() > 0);
915
          assertTrue(IOUtils.contentEquals(result, object1));
916
          // test the get(id) for v2
917
          InputStream result1 = CNodeService.getInstance(request).get(session, seriesId);
918
          object1.reset();
919
          // check
920
          assertTrue(object1.available() > 0);
921
          assertTrue(result1.available() > 0);
922
          assertTrue(IOUtils.contentEquals(result1, object1));
923
          //test the get(pid) for v1
924
          InputStream result2 = edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).get(session, guid);
925
          object1.reset();
926
          // check
927
          assertTrue(object1.available() > 0);
928
          assertTrue(result2.available() > 0);
929
          assertTrue(IOUtils.contentEquals(result2, object1));
930
          //test the get(sid) for v1
931
          try {
932
              InputStream result3 = edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).get(session, seriesId);
933
              fail("the get(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
934
          } catch (NotFound ee) {
935
936
          }
937
          SystemMetadata metadata = CNodeService.getInstance(request).getSystemMetadata(session, seriesId);
938
          assertTrue(metadata.getIdentifier().getValue().equals(guid.getValue()));
939
          assertTrue(metadata.getSeriesId().getValue().equals(seriesId.getValue()));
940
          DescribeResponse describeResponse = CNodeService.getInstance(request).describe(session, seriesId);
941
          assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata.getChecksum().getValue());
942
          assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata.getFormatId().getValue());
943
944
          metadata = CNodeService.getInstance(request).getSystemMetadata(session, guid);
945
          assertTrue(metadata.getIdentifier().getValue().equals(guid.getValue()));
946
          assertTrue(metadata.getSeriesId().getValue().equals(seriesId.getValue()));
947
          describeResponse = CNodeService.getInstance(request).describe(session, guid);
948
          assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata.getChecksum().getValue());
949
          assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata.getFormatId().getValue());
950
951
          org.dataone.service.types.v1.SystemMetadata sys1=edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).getSystemMetadata(session, guid);
952
          assertTrue(metadata.getIdentifier().getValue().equals(guid.getValue()));
953
954
          try {
955
              org.dataone.service.types.v1.SystemMetadata sys2=edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).getSystemMetadata(session, seriesId);
956
              fail("the getSystemMetadata(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
957
          } catch(NotFound nf2) {
958
959
          }
960
961
          describeResponse = edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).describe(session, guid);
962
          assertEquals(describeResponse.getDataONE_Checksum().getValue(), sys1.getChecksum().getValue());
963
          assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), sys1.getFormatId().getValue());
964
          try {
965
              describeResponse = edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).describe(session, seriesId);
966
              fail("the describe(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
967
          } catch(NotFound nf2) {
968
969
          }
970
971
          Checksum sum = CNodeService.getInstance(request).getChecksum(session, guid);
972
          assertTrue(sum.getValue().equals("5b78f9689b9aab1ebc0f3c1df916dd97"));
973
974
          try {
975
              sum = CNodeService.getInstance(request).getChecksum(session, seriesId);
976
              fail("the getCheckSum shouldn't work for sid");
977
          } catch(NotFound nf3) {
978
979
          }
980
981
          sum = edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).getChecksum(session, guid);
982
          assertTrue(sum.getValue().equals("5b78f9689b9aab1ebc0f3c1df916dd97"));
983
984
          try {
985
              sum = edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).getChecksum(session, seriesId);
986
              fail("the getCheckSum shouldn't work for sid");
987
          } catch(NotFound nf3) {
988
989
          }
990
991
          boolean isAuthorized =
992
                  CNodeService.getInstance(request).isAuthorized(session, guid, Permission.READ);
993
          assertEquals(isAuthorized, true);
994
995
          isAuthorized =
996
                  CNodeService.getInstance(request).isAuthorized(session, seriesId, Permission.READ);
997
          assertEquals(isAuthorized, true);
998
999
          isAuthorized =
1000
                  edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).isAuthorized(session, guid, Permission.READ);
1001
          assertEquals(isAuthorized, true);
1002
1003
          try {
1004
              isAuthorized =
1005
                      edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).isAuthorized(session, seriesId, Permission.READ);
1006
              fail("we can't reach here since the v1 isAuthorized method doesn't suppport series id");
1007
          } catch (NotFound e) {
1008
1009
          }
1010
1011
          //do a update with the same series id
1012
          Thread.sleep(1000);
1013
          Identifier newPid = new Identifier();
1014
          newPid.setValue(generateDocumentId()+"1");
1015
          System.out.println("the second pid is "+newPid.getValue());
1016
          InputStream object2 = new ByteArrayInputStream(str2.getBytes("UTF-8"));
1017
          SystemMetadata newSysMeta = createSystemMetadata(newPid, session.getSubject(), object2);
1018
          newSysMeta.setObsoletes(guid);
1019
          newSysMeta.setSeriesId(seriesId);
1020
          //CNodeService.getInstance(request).update(session, guid, object2, newPid, newSysMeta);
1021
          CNodeService.getInstance(request).create(session, newPid, object2, newSysMeta);
1022
          //update the system metadata of previous version.
1023
          sysmeta.setObsoletedBy(newPid);
1024 9286 tao
          SystemMetadata read = CNodeService.getInstance(request).getSystemMetadata(session, guid);
1025
          BigInteger version = read.getSerialVersion();
1026
          version = version.add(BigInteger.ONE);
1027
          sysmeta.setSerialVersion(version);
1028 9112 tao
          CNodeService.getInstance(request).updateSystemMetadata(session, guid, sysmeta);
1029
          InputStream result4 = CNodeService.getInstance(request).get(session, guid);
1030
          // go back to beginning of original stream
1031
          object1.reset();
1032
          // check
1033
          assertTrue(object1.available() > 0);
1034
          assertTrue(result4.available() > 0);
1035
          assertTrue(IOUtils.contentEquals(result4, object1));
1036
1037
          InputStream result5 = CNodeService.getInstance(request).get(session, newPid);
1038
          // go back to beginning of original stream
1039
          object2.reset();
1040
          // check
1041
          assertTrue(object2.available() > 0);
1042
          assertTrue(result5.available() > 0);
1043
          assertTrue(IOUtils.contentEquals(result5, object2));
1044
1045
1046
          InputStream result6 = CNodeService.getInstance(request).get(session, seriesId);
1047
          object2.reset();
1048
          // check
1049
          assertTrue(object2.available() > 0);
1050
          assertTrue(result6.available() > 0);
1051
          assertTrue(IOUtils.contentEquals(result6, object2));
1052
          //test the get(pid) for v1
1053
          InputStream result7 = edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).get(session, guid);
1054
          //System.out.println("+++++++++++++++++++++"+IOUtils.toString(result7));
1055
          object1.reset();
1056
          // check
1057
          assertTrue(object1.available() > 0);
1058
          assertTrue(result7.available() > 0);
1059
          assertTrue(IOUtils.contentEquals(result7, object1));
1060
1061
          InputStream result8 = edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).get(session, newPid);
1062
          object2.reset();
1063
          // check
1064
          assertTrue(object2.available() > 0);
1065
          assertTrue(result8.available() > 0);
1066
          assertTrue(IOUtils.contentEquals(result8, object2));
1067
          //test the get(sid) for v1
1068
          try {
1069
              InputStream result3 = edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).get(session, seriesId);
1070
              fail("the get(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1071
          } catch (NotFound ee) {
1072
1073
          }
1074
1075
          SystemMetadata metadata1 = CNodeService.getInstance(request).getSystemMetadata(session, seriesId);
1076
          assertTrue(metadata1.getIdentifier().getValue().equals(newPid.getValue()));
1077
          assertTrue(metadata1.getSeriesId().getValue().equals(seriesId.getValue()));
1078
          describeResponse = CNodeService.getInstance(request).describe(session, seriesId);
1079
          assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata1.getChecksum().getValue());
1080
          assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata1.getFormatId().getValue());
1081
1082
          SystemMetadata metadata2 = CNodeService.getInstance(request).getSystemMetadata(session, guid);
1083
          assertTrue(metadata2.getIdentifier().getValue().equals(guid.getValue()));
1084
          assertTrue(metadata2.getSeriesId().getValue().equals(seriesId.getValue()));
1085
          describeResponse = CNodeService.getInstance(request).describe(session, guid);
1086
          assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata2.getChecksum().getValue());
1087
          assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata2.getFormatId().getValue());
1088
1089
          SystemMetadata metadata3 = CNodeService.getInstance(request).getSystemMetadata(session, newPid);
1090
          assertTrue(metadata3.getIdentifier().getValue().equals(newPid.getValue()));
1091
          assertTrue(metadata3.getSeriesId().getValue().equals(seriesId.getValue()));
1092
          describeResponse = CNodeService.getInstance(request).describe(session, newPid);
1093
          assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata3.getChecksum().getValue());
1094
          assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata3.getFormatId().getValue());
1095
1096
          //do another update with different series id
1097
          Thread.sleep(1000);
1098
          String sid2 = "sid."+System.nanoTime();
1099
          Identifier seriesId2= new Identifier();
1100
          seriesId2.setValue(sid2);
1101
          System.out.println("the second sid is "+seriesId2.getValue());
1102
          Identifier newPid2 = new Identifier();
1103
          newPid2.setValue(generateDocumentId()+"2");
1104
          System.out.println("the third pid is "+newPid2.getValue());
1105
          InputStream object3 = new ByteArrayInputStream(str3.getBytes("UTF-8"));
1106
          SystemMetadata sysmeta3 = createSystemMetadata(newPid2, session.getSubject(), object3);
1107
          sysmeta3.setObsoletes(newPid);
1108
          sysmeta3.setSeriesId(seriesId2);
1109
          //CNodeService.getInstance(request).update(session, newPid, object3, newPid2, sysmeta3);
1110
          CNodeService.getInstance(request).create(session, newPid2, object3, sysmeta3);
1111
          //update the system metadata of the previous version
1112
          newSysMeta.setObsoletedBy(newPid2);
1113 9286 tao
          SystemMetadata read2 = CNodeService.getInstance(request).getSystemMetadata(session, newPid);
1114
          BigInteger version2= read2.getSerialVersion();
1115
          version2 = version2.add(BigInteger.ONE);
1116
          newSysMeta.setSerialVersion(version2);
1117 9112 tao
          CNodeService.getInstance(request).updateSystemMetadata(session, newPid, newSysMeta);
1118
1119
          InputStream result9 = CNodeService.getInstance(request).get(session, guid);
1120
          // go back to beginning of original stream
1121
          object1.reset();
1122
          // check
1123
          assertTrue(object1.available() > 0);
1124
          assertTrue(result9.available() > 0);
1125
          assertTrue(IOUtils.contentEquals(result9, object1));
1126
1127
          InputStream result10 = CNodeService.getInstance(request).get(session, newPid);
1128
          // go back to beginning of original stream
1129
          object2.reset();
1130
          // check
1131
          assertTrue(object2.available() > 0);
1132
          assertTrue(result10.available() > 0);
1133
          assertTrue(IOUtils.contentEquals(result10, object2));
1134
1135
1136
          InputStream result11 = CNodeService.getInstance(request).get(session, newPid2);
1137
          // go back to beginning of original stream
1138
          object3.reset();
1139
          // check
1140
          assertTrue(object3.available() > 0);
1141
          assertTrue(result11.available() > 0);
1142
          assertTrue(IOUtils.contentEquals(result11, object3));
1143
1144
          InputStream result12 = CNodeService.getInstance(request).get(session, seriesId2);
1145
          object3.reset();
1146
          // check
1147
          assertTrue(object3.available() > 0);
1148
          assertTrue(result12.available() > 0);
1149
          assertTrue(IOUtils.contentEquals(result12, object3));
1150
1151
          InputStream result16 = CNodeService.getInstance(request).get(session, seriesId);
1152
          object2.reset();
1153
          // check
1154
          assertTrue(object2.available() > 0);
1155
          assertTrue(result16.available() > 0);
1156
          assertTrue(IOUtils.contentEquals(result16, object2));
1157
1158
          //test the get(pid) for v1
1159
          InputStream result13 = edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).get(session, guid);
1160
          object1.reset();
1161
          // check
1162
          assertTrue(object1.available() > 0);
1163
          assertTrue(result13.available() > 0);
1164
          assertTrue(IOUtils.contentEquals(result13, object1));
1165
1166
          InputStream result14 = edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).get(session, newPid);
1167
          object2.reset();
1168
          // check
1169
          assertTrue(object2.available() > 0);
1170
          assertTrue(result14.available() > 0);
1171
          assertTrue(IOUtils.contentEquals(result14, object2));
1172
1173
          InputStream result15 = edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).get(session, newPid2);
1174
          object3.reset();
1175
          // check
1176
          assertTrue(object3.available() > 0);
1177
          assertTrue(result15.available() > 0);
1178
          assertTrue(IOUtils.contentEquals(result15, object3));
1179
1180
          SystemMetadata metadata4 = CNodeService.getInstance(request).getSystemMetadata(session, seriesId);
1181
          assertTrue(metadata4.getIdentifier().getValue().equals(newPid.getValue()));
1182
          assertTrue(metadata4.getSeriesId().getValue().equals(seriesId.getValue()));
1183
          describeResponse = CNodeService.getInstance(request).describe(session, seriesId);
1184
          assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata4.getChecksum().getValue());
1185
          assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata4.getFormatId().getValue());
1186
1187
          SystemMetadata metadata5 = CNodeService.getInstance(request).getSystemMetadata(session, seriesId2);
1188
          assertTrue(metadata5.getIdentifier().getValue().equals(newPid2.getValue()));
1189
          assertTrue(metadata5.getSeriesId().getValue().equals(seriesId2.getValue()));
1190
          describeResponse = CNodeService.getInstance(request).describe(session, seriesId2);
1191
          assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata5.getChecksum().getValue());
1192
          assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata5.getFormatId().getValue());
1193
1194
          SystemMetadata metadata6 = CNodeService.getInstance(request).getSystemMetadata(session, guid);
1195
          assertTrue(metadata6.getIdentifier().getValue().equals(guid.getValue()));
1196
          assertTrue(metadata6.getSeriesId().getValue().equals(seriesId.getValue()));
1197
          describeResponse = CNodeService.getInstance(request).describe(session, guid);
1198
          assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata6.getChecksum().getValue());
1199
          assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata6.getFormatId().getValue());
1200
1201
          SystemMetadata metadata7 = CNodeService.getInstance(request).getSystemMetadata(session, newPid);
1202
          assertTrue(metadata7.getIdentifier().getValue().equals(newPid.getValue()));
1203
          assertTrue(metadata7.getSeriesId().getValue().equals(seriesId.getValue()));
1204
          describeResponse = CNodeService.getInstance(request).describe(session, newPid);
1205
          assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata7.getChecksum().getValue());
1206
          assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata7.getFormatId().getValue());
1207
1208
          SystemMetadata metadata8 = CNodeService.getInstance(request).getSystemMetadata(session, newPid2);
1209
          assertTrue(metadata8.getIdentifier().getValue().equals(newPid2.getValue()));
1210
          assertTrue(metadata8.getSeriesId().getValue().equals(seriesId2.getValue()));
1211
          describeResponse = CNodeService.getInstance(request).describe(session, newPid2);
1212
          assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata8.getChecksum().getValue());
1213
          assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata8.getFormatId().getValue());
1214
1215
1216
1217
          System.out.println("here===========================");
1218
          //test the get(sid) for v1
1219
          try {
1220
              InputStream result3 = edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).get(session, seriesId);
1221
              fail("the get(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1222
          } catch (NotFound ee) {
1223
1224
          }
1225
1226
          //test the get(sid) for v1
1227
          try {
1228
              InputStream result3 = edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).get(session, seriesId2);
1229
              fail("the get(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1230
          } catch (NotFound ee) {
1231
1232
          }
1233
1234
          //test to get non-existing id for v2
1235
          try {
1236
           // the pid should be null when we try to get a no-exist sid
1237
              Identifier non_exist_sid = new Identifier();
1238
              non_exist_sid.setValue("no-sid-exist-123qwe");
1239
              InputStream result3 = CNodeService.getInstance(request).get(session, non_exist_sid);
1240
              fail("the get(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1241
          } catch (NotFound ee) {
1242
1243
          }
1244
1245
          try {
1246
              // the pid should be null when we try to get a no-exist sid
1247
                 Identifier non_exist_sid = new Identifier();
1248
                 non_exist_sid.setValue("no-sid-exist-123qwe");
1249
                 SystemMetadata result3 = CNodeService.getInstance(request).getSystemMetadata(session, non_exist_sid);
1250
                 fail("the getSystemMetadata(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1251
          } catch (NotFound ee) {
1252
1253
          }
1254
1255
          try {
1256
              // the pid should be null when we try to get a no-exist sid
1257
                 Identifier non_exist_sid = new Identifier();
1258
                 non_exist_sid.setValue("no-sid-exist-123qwe");
1259
                  CNodeService.getInstance(request).describe(session, non_exist_sid);
1260
                 fail("the describe(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1261
             } catch (NotFound ee) {
1262
1263
             }
1264
1265
1266
          //do another update with invalid series ids
1267
          Thread.sleep(1000);
1268
          Identifier newPid3 = new Identifier();
1269
          newPid3.setValue(generateDocumentId()+"3");
1270
          System.out.println("the third pid is "+newPid3.getValue());
1271
          InputStream object4 = new ByteArrayInputStream(str3.getBytes("UTF-8"));
1272
          SystemMetadata sysmeta4 = createSystemMetadata(newPid3, session.getSubject(), object4);
1273
          sysmeta4.setObsoletes(newPid2);
1274
          sysmeta4.setSeriesId(seriesId);
1275 9171 tao
          /*try {
1276 9112 tao
              CNodeService.getInstance(request).create(session, newPid3, object4, sysmeta4);
1277
              fail("we can't reach here since the sid is using an old one ");
1278
          } catch (InvalidSystemMetadata eee) {
1279
1280 9171 tao
          } */
1281 9112 tao
1282 9171 tao
          /*sysmeta4.setSeriesId(newPid3);
1283 9112 tao
          try {
1284
              CNodeService.getInstance(request).create(session, newPid3, object4, sysmeta4);
1285
              fail("we can't reach here since the sid is using the pid ");
1286
          } catch (InvalidSystemMetadata eee) {
1287
1288 9171 tao
          }*/
1289 9112 tao
1290
          //test archive a series id by v1
1291
          try {
1292 9358 tao
              edu.ucsb.nceas.metacat.dataone.v1.MNodeService.getInstance(request).archive(session, seriesId2);
1293 9112 tao
              fail("we can't reach here since the v1 archive method doesn't support the sid ");
1294
          } catch (NotFound nf2) {
1295
1296
          }
1297
1298
          // test delete a series id by v1
1299
          Session mnSession = getMNSession();
1300
          try {
1301
              edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).delete(mnSession, seriesId2);
1302
              fail("we can't reach here since the v1 delete method doesn't support the sid ");
1303
          } catch (NotFound nf2) {
1304
1305
          }
1306
1307
          // test archive a series id by v2
1308 9358 tao
          MNodeService.getInstance(request).archive(session, seriesId2);
1309 9112 tao
          SystemMetadata archived = CNodeService.getInstance(request).getSystemMetadata(session, seriesId2);
1310
          assertTrue(archived.getArchived());
1311
          archived = CNodeService.getInstance(request).getSystemMetadata(session, newPid2);
1312
          assertTrue(archived.getArchived());
1313
1314
          // test delete a series id by v2
1315
          CNodeService.getInstance(request).delete(mnSession, seriesId2);
1316
          try {
1317
              CNodeService.getInstance(request).get(session, seriesId2);
1318
              fail("we can't reach here since the series id was deleted ");
1319
          } catch (NotFound nf3) {
1320
              System.out.println("the message is ============="+nf3.getMessage());
1321
              //assertTrue(nf3.getMessage().indexOf("delete") >0);
1322
          }
1323
1324
          try {
1325
              CNodeService.getInstance(request).get(session, newPid2);
1326
              fail("we can't reach here since the series id was deleted ");
1327
          } catch (NotFound nf3) {
1328
              //System.out.println("the message is ============="+nf3.getMessage());
1329
              assertTrue(nf3.getMessage().indexOf("delete") >0);
1330
          }
1331
1332
          try {
1333
              edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).get(session, newPid2);
1334
              fail("we can't reach here since the series id was deleted ");
1335
          } catch (NotFound nf3) {
1336
              System.out.println("the message is ============="+nf3.getMessage());
1337
              assertTrue(nf3.getMessage().indexOf("delete") >0);
1338
          }
1339
1340
          //archive seriesId
1341 9358 tao
          MNodeService.getInstance(request).archive(mnSession, seriesId);
1342 9112 tao
          archived = CNodeService.getInstance(request).getSystemMetadata(session, seriesId);
1343
          assertTrue(archived.getArchived());
1344
          archived = CNodeService.getInstance(request).getSystemMetadata(session, newPid);
1345
          assertTrue(archived.getArchived());
1346
1347
1348
          //delete seriesId
1349
          CNodeService.getInstance(request).delete(mnSession, seriesId);
1350
          try {
1351
              CNodeService.getInstance(request).get(session, newPid);
1352
              fail("we can't reach here since the series id was deleted ");
1353
          } catch (NotFound nf3) {
1354
              //System.out.println("the message is ============="+nf3.getMessage());
1355
              assertTrue(nf3.getMessage().indexOf("delete") >0);
1356
          }
1357
          SystemMetadata meta = CNodeService.getInstance(request).getSystemMetadata(session, seriesId);
1358
          assertTrue(meta.getIdentifier().getValue().equals(guid.getValue()));
1359
1360
      } catch (Exception e) {
1361
          e.printStackTrace();
1362
          fail(e.getMessage());
1363
      }
1364
  }
1365 6122 leinfelder
1366 9147 tao
  /**
1367
   * Test the listView methods.
1368
   * @throws Excpetion
1369
   */
1370
  public void testListViews() throws Exception {
1371
      OptionList list = CNodeService.getInstance(request).listViews();
1372
      assertTrue(list.sizeOptionList() >0);
1373
      List<String> names = list.getOptionList();
1374
      for(String name : names) {
1375
          System.out.println("It has the view named "+name);
1376
      }
1377
  }
1378 9167 tao
1379
  public void testUpdateSystemMetadata() throws Exception {
1380
          String str1 = "object1";
1381
          String str2 = "object2";
1382
          String str3 = "object3";
1383
1384 9336 tao
          Date date = new Date();
1385 9167 tao
          //insert test documents with a series id
1386 9266 tao
          Session session = getCNSession();
1387 9167 tao
          Identifier guid = new Identifier();
1388
          guid.setValue(generateDocumentId());
1389 9355 tao
          System.out.println("?????????????update the id without archive is "+guid.getValue());
1390 9167 tao
          InputStream object1 = new ByteArrayInputStream(str1.getBytes("UTF-8"));
1391
          SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object1);
1392
          String sid1= "sid."+System.nanoTime();
1393
          Identifier seriesId = new Identifier();
1394
          seriesId.setValue(sid1);
1395
          System.out.println("the first sid is "+seriesId.getValue());
1396
          sysmeta.setSeriesId(seriesId);
1397
          sysmeta.setArchived(false);
1398
          CNodeService.getInstance(request).create(session, guid, object1, sysmeta);
1399
          //Test the generating object succeeded.
1400
          SystemMetadata metadata = CNodeService.getInstance(request).getSystemMetadata(session, guid);
1401
          assertTrue(metadata.getIdentifier().equals(guid));
1402
          assertTrue(metadata.getArchived().equals(false));
1403
          System.out.println("the checksum from request is "+metadata.getChecksum().getValue());
1404
          assertTrue(metadata.getSize().equals(sysmeta.getSize()));
1405
1406 9267 tao
          //test to fail to update system metadata by a non-cn subject
1407
          Session testSession = getTestSession();
1408 9286 tao
          SystemMetadata sysmeta1 = CNodeService.getInstance(request).getSystemMetadata(session, guid);
1409
          BigInteger version = sysmeta.getSerialVersion();
1410
          version = version.add(BigInteger.ONE);
1411
          sysmeta1.setSerialVersion(version);
1412 9355 tao
          AccessPolicy accessPolicy = new AccessPolicy();
1413
          AccessRule accessRule = new AccessRule();
1414
          accessRule.addPermission(Permission.WRITE);
1415
          Subject publicSubject = new Subject();
1416
          publicSubject.setValue("hello");
1417
          accessRule.addSubject(publicSubject);
1418
          accessPolicy.addAllow(accessRule);
1419
          AccessRule allow = new AccessRule();
1420
          allow.addPermission(Permission.READ);
1421
          Subject publicSubject2 = new Subject();
1422
          publicSubject2.setValue(Constants.SUBJECT_PUBLIC);
1423
          allow.addSubject(publicSubject2);
1424
          accessPolicy.addAllow(allow);
1425
          sysmeta1.setAccessPolicy(accessPolicy);
1426 9267 tao
          try {
1427 9286 tao
              CNodeService.getInstance(request).updateSystemMetadata(testSession, guid, sysmeta1);
1428 9267 tao
              fail("It shouldn't get there since the test session can't update system metadata");
1429
          } catch (NotAuthorized e) {
1430
1431
          }
1432
1433
1434 9167 tao
          //update system metadata sucessfully
1435 9302 tao
          SystemMetadata sysmeta1c = new SystemMetadata();
1436
          BeanUtils.copyProperties(sysmeta1c, sysmeta1);
1437 9336 tao
          sysmeta1c.setDateSysMetadataModified(date);
1438 9302 tao
          CNodeService.getInstance(request).updateSystemMetadata(session, guid, sysmeta1c);
1439 9167 tao
          SystemMetadata metadata2 = CNodeService.getInstance(request).getSystemMetadata(session, seriesId);
1440
          assertTrue(metadata2.getIdentifier().equals(guid));
1441
          assertTrue(metadata2.getSeriesId().equals(seriesId));
1442 9355 tao
          //assertTrue(metadata2.getArchived().equals(true));
1443
          assertTrue(metadata2.getAccessPolicy().getAllowList().size() == 2);
1444 9167 tao
          assertTrue(metadata2.getChecksum().getValue().equals(metadata.getChecksum().getValue()));
1445 9336 tao
          assertTrue(metadata2.getDateSysMetadataModified().getTime() == date.getTime());
1446 9167 tao
1447 9286 tao
          SystemMetadata sysmeta2 = CNodeService.getInstance(request).getSystemMetadata(session, seriesId);
1448
          version = sysmeta2.getSerialVersion();
1449
          version = version.add(BigInteger.ONE);
1450
          sysmeta2.setSerialVersion(version);
1451 9167 tao
          Identifier newId = new Identifier();
1452
          newId.setValue("newValue");
1453 9286 tao
          sysmeta2.setIdentifier(newId);
1454 9167 tao
          try {
1455 9286 tao
              CNodeService.getInstance(request).updateSystemMetadata(session, guid, sysmeta2);
1456 9167 tao
              fail("We shouldn't get there");
1457
          } catch (Exception e) {
1458
              assertTrue(e instanceof InvalidRequest);
1459
          }
1460
1461
          newId.setValue("newValue");
1462 9286 tao
          sysmeta2.setSeriesId(newId);
1463 9167 tao
          try {
1464 9286 tao
              CNodeService.getInstance(request).updateSystemMetadata(session, guid, sysmeta2);
1465 9167 tao
              fail("We shouldn't get there");
1466
          } catch (Exception e) {
1467
              assertTrue(e instanceof InvalidRequest);
1468
          }
1469
1470
          Date newDate = new Date();
1471 9286 tao
          sysmeta2.setDateUploaded(newDate);
1472 9167 tao
          try {
1473 9286 tao
              CNodeService.getInstance(request).updateSystemMetadata(session, guid, sysmeta2);
1474 9167 tao
              fail("We shouldn't get there");
1475
          } catch (Exception e) {
1476
              assertTrue(e instanceof InvalidRequest);
1477
          }
1478
1479
          Checksum checkSum = new Checksum();
1480
          checkSum.setValue("12345");
1481 9286 tao
          sysmeta2.setChecksum(checkSum);
1482 9167 tao
          try {
1483 9286 tao
              CNodeService.getInstance(request).updateSystemMetadata(session, guid, sysmeta2);
1484 9167 tao
              fail("We shouldn't get there");
1485
          } catch (Exception e) {
1486
              assertTrue(e instanceof InvalidRequest);
1487
          }
1488
1489
          BigInteger size = new BigInteger("4000");
1490 9286 tao
          sysmeta2.setSize(size);
1491 9167 tao
          try {
1492 9286 tao
              CNodeService.getInstance(request).updateSystemMetadata(session, guid, sysmeta2);
1493 9167 tao
              fail("We shouldn't get there");
1494
          } catch (Exception e) {
1495
              assertTrue(e instanceof InvalidRequest);
1496
          }
1497 9338 tao
1498
          // test cn.updateSystemMetadata will ignore the serial version and replica list
1499
          Identifier id = new Identifier();
1500
          id.setValue(generateDocumentId());
1501 9355 tao
          System.out.println("?????????????update the id with archive is "+id.getValue());
1502 9338 tao
          object1 = new ByteArrayInputStream(str1.getBytes("UTF-8"));
1503
          SystemMetadata sysmeta10 = createSystemMetadata(id, session.getSubject(), object1);
1504
          List<Replica> replicas = new ArrayList<Replica>();
1505
          Replica replica1= new Replica();
1506
          NodeReference node1 = new NodeReference();
1507
          node1.setValue("node1");
1508
          replica1.setReplicaMemberNode(node1);
1509
          replica1.setReplicationStatus(ReplicationStatus.FAILED);
1510
          replica1.setReplicaVerified(date);
1511
          replicas.add(replica1);
1512
          Replica replica2= new Replica();
1513
          NodeReference node2 = new NodeReference();
1514
          node2.setValue("node2");
1515
          replica2.setReplicaMemberNode(node2);
1516
          replica2.setReplicationStatus(ReplicationStatus.FAILED);
1517
          replica2.setReplicaVerified(date);
1518
          replicas.add(replica2);
1519
          sysmeta10.setReplicaList(replicas);
1520
          sysmeta10.setArchived(false);
1521
          CNodeService.getInstance(request).create(session, id, object1, sysmeta10);
1522
          SystemMetadata result = CNodeService.getInstance(request).getSystemMetadata(session, id);
1523
          assertTrue(result.getIdentifier().equals(id));
1524
          System.out.println("the serial version is "+result.getSerialVersion().intValue());
1525
          assertTrue(result.getSerialVersion().intValue() == 1);
1526
          List<Replica> list1 = result.getReplicaList();
1527
          assertTrue(list1.size()==2);
1528
          assertTrue(result.getReplica(0).getReplicaMemberNode().getValue().equals("node1"));
1529
          assertTrue(result.getReplica(0).getReplicationStatus().equals(ReplicationStatus.FAILED));
1530
          assertTrue(result.getReplica(0).getReplicaVerified().getTime() == date.getTime());
1531
          assertTrue(result.getReplica(1).getReplicaMemberNode().getValue().equals("node2"));
1532
          assertTrue(result.getReplica(1).getReplicationStatus().equals(ReplicationStatus.FAILED));
1533
          assertTrue(result.getReplica(1).getReplicaVerified().getTime() == date.getTime());
1534
          assertTrue(result.getArchived() ==false);
1535
1536
          Date date2 = new Date();
1537
          SystemMetadata sysmeta11 = new SystemMetadata();
1538
          BeanUtils.copyProperties(sysmeta11, result);
1539
          List<Replica> replicaList = new ArrayList<Replica>();
1540
          Replica replica3= new Replica();
1541
          NodeReference node3 = new NodeReference();
1542
          node3.setValue("node3");
1543
          replica3.setReplicaMemberNode(node3);
1544
          replica3.setReplicationStatus(ReplicationStatus.COMPLETED);
1545
          replica3.setReplicaVerified(date2);
1546
          replicaList.add(replica3);
1547
          sysmeta11.setReplicaList(replicaList);
1548
          sysmeta11.setSerialVersion(BigInteger.TEN);
1549
          sysmeta11.setArchived(true);
1550
1551
          //make sure the sysmmeta11 has the new replca list and serial version
1552
          assertTrue(sysmeta11.getSerialVersion().equals(BigInteger.TEN));
1553
          assertTrue(sysmeta11.getReplicaList().size()==1);
1554
          assertTrue(sysmeta11.getReplica(0).getReplicaMemberNode().getValue().equals("node3"));
1555
          assertTrue(sysmeta11.getReplica(0).getReplicationStatus().equals(ReplicationStatus.COMPLETED));
1556
          assertTrue(sysmeta11.getReplica(0).getReplicaVerified().getTime() == date2.getTime());
1557
1558
          // update the system metadata with the new serial version and new replica list
1559
          // the new serial version and replica list should be ignored.
1560
          CNodeService.getInstance(request).updateSystemMetadata(session, id, sysmeta11);
1561
          SystemMetadata result2 = CNodeService.getInstance(request).getSystemMetadata(session, id);
1562
          assertTrue(result2.getIdentifier().equals(id));
1563
          assertTrue(result2.getSerialVersion().intValue() == 1);
1564
          List<Replica> list2 = result.getReplicaList();
1565
          assertTrue(list2.size()==2);
1566
          assertTrue(result2.getReplica(0).getReplicaMemberNode().getValue().equals("node1"));
1567
          assertTrue(result2.getReplica(0).getReplicationStatus().equals(ReplicationStatus.FAILED));
1568
          assertTrue(result2.getReplica(0).getReplicaVerified().getTime() == date.getTime());
1569
          assertTrue(result2.getReplica(1).getReplicaMemberNode().getValue().equals("node2"));
1570
          assertTrue(result2.getReplica(1).getReplicationStatus().equals(ReplicationStatus.FAILED));
1571
          assertTrue(result2.getReplica(1).getReplicaVerified().getTime() == date.getTime());
1572
          assertTrue(result2.getArchived() ==true);
1573 9167 tao
  }
1574 9273 tao
1575 9351 tao
  public void testArchive() throws Exception {
1576 9358 tao
      try {
1577 10044 tao
          Session session = getCNSession();
1578
          Identifier guid = new Identifier();
1579
          guid.setValue("testArchive." + System.currentTimeMillis());
1580
          InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1581
          SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1582
          NodeReference nr = new NodeReference();
1583
          nr.setValue(MockCNode.V1MNNODEID);
1584
          sysmeta.setOriginMemberNode(nr);
1585
          sysmeta.setAuthoritativeMemberNode(nr);
1586
          Identifier pid = CNodeService.getInstance(request).create(session, guid, object, sysmeta);
1587 9358 tao
          CNodeService.getInstance(request).archive(session, guid);
1588
      } catch (Exception e) {
1589 9366 tao
         e.printStackTrace();
1590 10044 tao
         fail("Unexpected error: " + e.getMessage());
1591 9358 tao
     }
1592 10044 tao
1593
      try {
1594 10181 tao
1595
          Session session = getTestSession();
1596
          Identifier guid = new Identifier();
1597
          guid.setValue("testArchive." + System.currentTimeMillis());
1598
          InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1599
          SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1600
          NodeReference nr = new NodeReference();
1601
          nr.setValue(MockCNode.V1MNNODEID);
1602
          sysmeta.setOriginMemberNode(nr);
1603
          sysmeta.setAuthoritativeMemberNode(nr);
1604
          Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
1605
          //another session without any permission shouldn't archive the object
1606
          try {
1607
              Session session2 = getAnotherSession();
1608
              CNodeService.getInstance(request).archive(session2, guid);
1609
              fail("Another session shouldn't archive the object");
1610
          } catch (NotAuthorized ee){
1611
1612
          }
1613
          //rights holder should archive objects whose authoritative mn is a v1 node
1614
          CNodeService.getInstance(request).archive(session, guid);
1615
      } catch (Exception e) {
1616
         e.printStackTrace();
1617
         fail("Unexpected error: " + e.getMessage());
1618
     }
1619
1620
      try {
1621
          //a session has the change permission should archive objects whose authoritative mn is a v1 node
1622
          String user1 = "test12";
1623
          String user2 = "test34";
1624
          Session session = getTestSession();
1625
          Identifier guid = new Identifier();
1626
          guid.setValue("testArchive." + System.currentTimeMillis());
1627
          InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1628
          SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1629
          NodeReference nr = new NodeReference();
1630
          nr.setValue(MockCNode.V1MNNODEID);
1631
          sysmeta.setOriginMemberNode(nr);
1632
          sysmeta.setAuthoritativeMemberNode(nr);
1633
          Subject sub1 = new Subject();
1634
          sub1.setValue(user1);
1635
          AccessRule rule1 = new AccessRule();
1636
          rule1.addSubject(sub1);
1637
          rule1.addPermission(Permission.CHANGE_PERMISSION);
1638
          Subject sub2 = new Subject();
1639
          sub2.setValue(user2);
1640
          AccessRule rule2 = new AccessRule();
1641
          rule2.addSubject(sub2);
1642
          rule2.addPermission(Permission.READ);
1643
          AccessPolicy policy = new AccessPolicy();
1644
          policy.addAllow(rule1);
1645
          policy.addAllow(rule2);
1646
          sysmeta.setAccessPolicy(policy);
1647
          Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
1648
          //read permission can't archive the object
1649
          try {
1650
              Session session2 = new Session();
1651
              session2.setSubject(sub2);
1652
              CNodeService.getInstance(request).archive(session2, guid);
1653
              fail("READ permision session shouldn't archive the object");
1654
          } catch (NotAuthorized ee){
1655
              ee.printStackTrace();
1656
          }
1657
          Session session3 = new Session();
1658
          session3.setSubject(sub1);
1659
          CNodeService.getInstance(request).archive(session, guid);
1660
      } catch (Exception e) {
1661
         e.printStackTrace();
1662
         fail("Unexpected error: " + e.getMessage());
1663
     }
1664
1665
      try {
1666 10044 tao
          //v2 mn should faile
1667
          Session session = getCNSession();
1668
          Identifier guid = new Identifier();
1669
          guid.setValue("testArchive." + System.currentTimeMillis());
1670
          InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1671
          SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1672
          NodeReference nr = new NodeReference();
1673
          nr.setValue(MockCNode.V2MNNODEID);
1674
          sysmeta.setOriginMemberNode(nr);
1675
          sysmeta.setAuthoritativeMemberNode(nr);
1676
          Identifier pid = CNodeService.getInstance(request).create(session, guid, object, sysmeta);
1677
          CNodeService.getInstance(request).archive(session, guid);
1678
      } catch (Exception e) {
1679
         e.printStackTrace();
1680
         if(e instanceof NotAuthorized) {
1681
             assertTrue(e.getMessage().contains("The Coordinating Node is not authorized to make systemMetadata changes"));
1682
         } else {
1683
             fail("Unexpected error: " + e.getMessage());
1684
         }
1685
     }
1686 9351 tao
  }
1687
1688 10002 tao
1689 10004 tao
1690 9273 tao
  public Session getMNSessionFromCN() throws NotImplemented, ServiceFailure {
1691
      Session session = new Session();
1692
      Subject subject = null;
1693
      CNode cn = D1Client.getCN();
1694
      System.out.println("the cn is "+cn.getNodeBaseServiceUrl());
1695
      List<Node> nodes = cn.listNodes().getNodeList();
1696
      System.out.println("the size of the list is "+nodes.size());
1697
      // find the first CN in the node list
1698
      for (Node node : nodes) {
1699
          if (node.getType().equals(NodeType.MN)) {
1700
              subject = node.getSubject(0);
1701
              break;
1702
          }
1703
      }
1704
      session.setSubject(subject);
1705
      return session;
1706
  }
1707
1708 6122 leinfelder
}