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
import java.io.InputStream;
31 9167 tao
import java.math.BigInteger;
32 6319 leinfelder
import java.text.SimpleDateFormat;
33 6879 cjones
import java.util.Calendar;
34 6122 leinfelder
import java.util.Date;
35 6697 leinfelder
import java.util.List;
36 6122 leinfelder
37
import junit.framework.Test;
38
import junit.framework.TestSuite;
39
40 6315 leinfelder
import org.apache.commons.io.IOUtils;
41 9273 tao
import org.dataone.client.v2.CNode;
42 8810 leinfelder
import org.dataone.client.v2.itk.D1Client;
43 6797 leinfelder
import org.dataone.service.exceptions.BaseException;
44 9167 tao
import org.dataone.service.exceptions.InvalidRequest;
45 9112 tao
import org.dataone.service.exceptions.InvalidSystemMetadata;
46 6320 leinfelder
import org.dataone.service.exceptions.NotAuthorized;
47 6141 cjones
import org.dataone.service.exceptions.NotFound;
48
import org.dataone.service.exceptions.NotImplemented;
49
import org.dataone.service.exceptions.ServiceFailure;
50 6366 leinfelder
import org.dataone.service.types.v1.AccessPolicy;
51
import org.dataone.service.types.v1.AccessRule;
52
import org.dataone.service.types.v1.Checksum;
53 8905 tao
import org.dataone.service.types.v1.DescribeResponse;
54 6366 leinfelder
import org.dataone.service.types.v1.Event;
55
import org.dataone.service.types.v1.Identifier;
56
import org.dataone.service.types.v1.NodeReference;
57 6697 leinfelder
import org.dataone.service.types.v1.NodeType;
58 6366 leinfelder
import org.dataone.service.types.v1.ObjectFormatIdentifier;
59
import org.dataone.service.types.v1.ObjectList;
60
import org.dataone.service.types.v1.Permission;
61
import org.dataone.service.types.v1.Replica;
62
import org.dataone.service.types.v1.ReplicationPolicy;
63
import org.dataone.service.types.v1.ReplicationStatus;
64
import org.dataone.service.types.v1.Session;
65
import org.dataone.service.types.v1.Subject;
66 8834 leinfelder
import org.dataone.service.types.v2.Log;
67
import org.dataone.service.types.v2.Node;
68
import org.dataone.service.types.v2.NodeList;
69
import org.dataone.service.types.v2.ObjectFormat;
70
import org.dataone.service.types.v2.ObjectFormatList;
71 9147 tao
import org.dataone.service.types.v2.OptionList;
72 8810 leinfelder
import org.dataone.service.types.v2.SystemMetadata;
73 6697 leinfelder
import org.dataone.service.util.Constants;
74 6122 leinfelder
75 9112 tao
import edu.ucsb.nceas.metacat.dataone.CNodeService;
76 9147 tao
import edu.ucsb.nceas.metacat.dataone.MNodeService;
77 9112 tao
78 6122 leinfelder
/**
79
 * A JUnit test for testing the dataone CNCore implementation
80
 */
81 6324 leinfelder
public class CNodeServiceTest extends D1NodeServiceTest {
82 6122 leinfelder
83
    /**
84
    * constructor for the test
85
    */
86 6287 leinfelder
    public CNodeServiceTest(String name)
87 6122 leinfelder
    {
88
        super(name);
89
    }
90
91
	/**
92
	 * Create a suite of tests to be run together
93
	 */
94
	public static Test suite()
95
	{
96
		TestSuite suite = new TestSuite();
97 6287 leinfelder
		suite.addTest(new CNodeServiceTest("initialize"));
98 6122 leinfelder
99 6295 leinfelder
		suite.addTest(new CNodeServiceTest("testChecksum"));
100
		suite.addTest(new CNodeServiceTest("testCreate"));
101 6315 leinfelder
		suite.addTest(new CNodeServiceTest("testGet"));
102 6295 leinfelder
		suite.addTest(new CNodeServiceTest("testGetFormat"));
103 6322 leinfelder
		suite.addTest(new CNodeServiceTest("testGetLogRecords"));
104 6317 leinfelder
		suite.addTest(new CNodeServiceTest("testGetSystemMetadata"));
105 6320 leinfelder
		suite.addTest(new CNodeServiceTest("testIsAuthorized"));
106 6287 leinfelder
		suite.addTest(new CNodeServiceTest("testListFormats"));
107 6295 leinfelder
		suite.addTest(new CNodeServiceTest("testListNodes"));
108
		suite.addTest(new CNodeServiceTest("testObjectFormatNotFoundException"));
109 6287 leinfelder
		suite.addTest(new CNodeServiceTest("testRegisterSystemMetadata"));
110 6295 leinfelder
		suite.addTest(new CNodeServiceTest("testReplicationPolicy"));
111
		suite.addTest(new CNodeServiceTest("testReplicationStatus"));
112
		suite.addTest(new CNodeServiceTest("testReserveIdentifier"));
113
		suite.addTest(new CNodeServiceTest("testSearch"));
114 6320 leinfelder
		suite.addTest(new CNodeServiceTest("testSetAccessPolicy"));
115 6295 leinfelder
		suite.addTest(new CNodeServiceTest("testSetOwner"));
116 8905 tao
		suite.addTest(new CNodeServiceTest("readDeletedObject"));
117 9112 tao
		suite.addTest(new CNodeServiceTest("testGetSID"));
118 9147 tao
		suite.addTest(new CNodeServiceTest("testListViews"));
119 9167 tao
		suite.addTest(new CNodeServiceTest("testUpdateSystemMetadata"));
120 6122 leinfelder
121
		return suite;
122
	}
123
124 6295 leinfelder
125
	/**
126 6122 leinfelder
	 * test for registering standalone system metadata
127
	 */
128 6413 leinfelder
	public Identifier testRegisterSystemMetadata() {
129 6122 leinfelder
	    printTestHeader("testRegisterSystemMetadata");
130
131
	    try {
132 9267 tao
	        Session testSession = getTestSession();
133 9266 tao
            Session session = getCNSession();
134 6122 leinfelder
			Identifier guid = new Identifier();
135
			guid.setValue("testRegisterSystemMetadata." + System.currentTimeMillis());
136 6504 leinfelder
			InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
137
			SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
138 9267 tao
			try {
139
			    CNodeService.getInstance(request).registerSystemMetadata(testSession, guid, sysmeta);
140
			    fail("We shouldn't get there since the test session can't regsiter system metadata");
141
			} catch (NotAuthorized ee) {
142
143
			}
144 6542 leinfelder
			Identifier retGuid = CNodeService.getInstance(request).registerSystemMetadata(session, guid, sysmeta);
145 6397 leinfelder
			assertEquals(guid.getValue(), retGuid.getValue());
146 6413 leinfelder
			return retGuid;
147 6295 leinfelder
        } catch(Exception e) {
148
            fail("Unexpected error: " + e.getMessage());
149 6122 leinfelder
        }
150 6413 leinfelder
        return null;
151 6295 leinfelder
	}
152
153 6317 leinfelder
	/**
154
	 * test for getting system metadata
155
	 */
156
	public void testGetSystemMetadata() {
157
	    printTestHeader("testGetSystemMetadata");
158
159
	    try {
160 9266 tao
            Session session = getCNSession();
161 6317 leinfelder
			Identifier guid = new Identifier();
162
			guid.setValue("testGetSystemMetadata." + System.currentTimeMillis());
163 6504 leinfelder
			InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
164
			SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
165 6542 leinfelder
			Identifier retGuid = CNodeService.getInstance(request).registerSystemMetadata(session, guid, sysmeta);
166 6397 leinfelder
			assertEquals(guid.getValue(), retGuid.getValue());
167 6317 leinfelder
			// get it
168 6542 leinfelder
			SystemMetadata retSysmeta = CNodeService.getInstance(request).getSystemMetadata(session, guid);
169 6317 leinfelder
			// check it
170
			assertEquals(sysmeta.getIdentifier().getValue(), retSysmeta.getIdentifier().getValue());
171
        } catch(Exception e) {
172
            fail("Unexpected error: " + e.getMessage());
173
        }
174
	}
175
176 6319 leinfelder
	public void testGetLogRecords() {
177
	    printTestHeader("testGetLogRecords");
178
	    try {
179
180 9266 tao
		    Session session = getCNSession();
181 6319 leinfelder
		    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
182
		    Date fromDate = sdf.parse("2010-01-01");
183
		    Date toDate = new Date();
184
		    Event event = Event.CREATE;
185
		    int start = 0;
186 6322 leinfelder
		    int count = 1;
187 6319 leinfelder
188 6542 leinfelder
		    Log log = CNodeService.getInstance(request).getLogRecords(session, fromDate, toDate,
189 8810 leinfelder
		    	event.xmlValue(), null, start, count);
190 6319 leinfelder
		    assertNotNull(log);
191 6322 leinfelder
		    assertTrue(log.getCount() == count);
192
		    assertTrue(log.getStart() == start);
193
		    assertTrue(log.getTotal() > 0);
194 6319 leinfelder
	    } catch (Exception e) {
195
		    e.printStackTrace();
196
		    fail("Unexpected error: " + e.getMessage());
197
	    }
198
	}
199
200 6295 leinfelder
	public void testCreate() {
201
	    printTestHeader("testCreate");
202
203
	    try {
204 9266 tao
            Session session = getCNSession();
205 6295 leinfelder
			Identifier guid = new Identifier();
206
			guid.setValue("testCreate." + System.currentTimeMillis());
207
			InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
208 6324 leinfelder
			SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
209 6542 leinfelder
			Identifier pid = CNodeService.getInstance(request).create(session, guid, object, sysmeta);
210 6295 leinfelder
			assertEquals(guid, pid);
211
        } catch(Exception e) {
212
        	e.printStackTrace();
213
            fail("Unexpected error: " + e.getMessage());
214 6122 leinfelder
        }
215
	}
216
217 6315 leinfelder
	public void testGet() {
218
	    printTestHeader("testGet");
219
220
	    try {
221 9266 tao
            Session session = getCNSession();
222 6315 leinfelder
			Identifier guid = new Identifier();
223
			guid.setValue("testGet." + System.currentTimeMillis());
224
			InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
225 6324 leinfelder
			SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
226 6542 leinfelder
			Identifier pid = CNodeService.getInstance(request).create(session, guid, object, sysmeta);
227 6397 leinfelder
			assertEquals(guid.getValue(), pid.getValue());
228 9112 tao
			System.out.println("the pid is+++++++++++++++++++++++++"+guid.getValue());
229 6315 leinfelder
			// get it
230 6542 leinfelder
			InputStream retObject = CNodeService.getInstance(request).get(session, pid);
231 6315 leinfelder
			// check it
232 6357 leinfelder
			object.reset();
233 6315 leinfelder
			assertTrue(IOUtils.contentEquals(object, retObject));
234
        } catch(Exception e) {
235
        	e.printStackTrace();
236
            fail("Unexpected error: " + e.getMessage());
237
        }
238
	}
239
240 6295 leinfelder
	public void testChecksum() {
241
	    printTestHeader("testChecksum");
242
243
	    try {
244 9266 tao
            Session session = getCNSession();
245 6295 leinfelder
			Identifier guid = new Identifier();
246
			guid.setValue("testChecksum." + System.currentTimeMillis());
247 6504 leinfelder
			InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
248
			SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
249 6295 leinfelder
			// save it
250 6542 leinfelder
			Identifier retGuid = CNodeService.getInstance(request).registerSystemMetadata(session, guid, sysmeta);
251 6397 leinfelder
			assertEquals(guid.getValue(), retGuid.getValue());
252 6295 leinfelder
			// check it
253 6542 leinfelder
			Checksum checksum = CNodeService.getInstance(request).getChecksum(session, guid);
254 6295 leinfelder
			assertEquals(sysmeta.getChecksum().getValue(), checksum.getValue());
255
        } catch(Exception e) {
256
            fail("Unexpected error: " + e.getMessage());
257
        }
258
	}
259
260
	public void testListNodes() {
261
	    printTestHeader("testListNodes");
262
263
	    try {
264 6542 leinfelder
	    	CNodeService.getInstance(request).listNodes();
265 6295 leinfelder
        } catch(NotImplemented e) {
266
        	// expecting not implemented
267
            assertTrue(true);
268
        } catch(Exception e) {
269
            fail("Unexpected error: " + e.getMessage());
270
        }
271
	}
272
273
	public void testReserveIdentifier() {
274
	    printTestHeader("testReserveIdentifier");
275
276
	    try {
277 9266 tao
            Session session = getCNSession();
278 6295 leinfelder
			Identifier guid = new Identifier();
279
			guid.setValue("testReserveIdentifier." + System.currentTimeMillis());
280
			// reserve it
281 6622 leinfelder
			Identifier resultPid = CNodeService.getInstance(request).reserveIdentifier(session, guid);
282
			assertNotNull(resultPid);
283
			assertEquals(guid.getValue(), resultPid.getValue());
284 6357 leinfelder
	    } catch(NotImplemented ni) {
285
        	// this is not implemented in Metacat
286
            assertTrue(true);
287 6295 leinfelder
        } catch(Exception e) {
288
        	e.printStackTrace();
289
            fail("Unexpected error: " + e.getMessage());
290
        }
291
	}
292
293
	public void testSearch() {
294
	    printTestHeader("testSearch");
295
296
	    try {
297 9266 tao
            Session session = getCNSession();
298 6295 leinfelder
299 7464 leinfelder
			// search for objects, but expect a NotImplemented exception
300
			try {
301
				ObjectList objectList = CNodeService.getInstance(request).search(session, null, null);
302
			} catch (NotImplemented ne) {
303
				assertTrue(true);
304 7466 leinfelder
				return;
305 6295 leinfelder
			}
306 7464 leinfelder
			fail("Metacat should not implement CN.search");
307
308 6295 leinfelder
        } catch(Exception e) {
309
            fail("Unexpected error: " + e.getMessage());
310
        }
311
	}
312
313
	public void testSetOwner() {
314
	    printTestHeader("testSetOwner");
315
316
	    try {
317 9266 tao
            Session session = getCNSession();
318 6295 leinfelder
			Identifier guid = new Identifier();
319
			guid.setValue("testSetOwner." + System.currentTimeMillis());
320 6504 leinfelder
			InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
321
			SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
322 6594 cjones
			long serialVersion = 1L;
323 6295 leinfelder
			// save it
324 6542 leinfelder
			Identifier retGuid = CNodeService.getInstance(request).registerSystemMetadata(session, guid, sysmeta);
325 6397 leinfelder
			assertEquals(guid.getValue(), retGuid.getValue());
326 6295 leinfelder
			Subject rightsHolder = new Subject();
327
			rightsHolder.setValue("newUser");
328
			// set it
329 6804 leinfelder
			Identifier retPid = CNodeService.getInstance(request).setRightsHolder(session, guid, rightsHolder, serialVersion);
330 6295 leinfelder
			assertEquals(guid, retPid);
331
			// get it
332 6542 leinfelder
			sysmeta = CNodeService.getInstance(request).getSystemMetadata(session, guid);
333 6295 leinfelder
			assertNotNull(sysmeta);
334
			// check it
335 6688 leinfelder
			assertTrue(rightsHolder.equals(sysmeta.getRightsHolder()));
336 6295 leinfelder
337
        } catch(Exception e) {
338
            fail("Unexpected error: " + e.getMessage());
339
        }
340
	}
341
342 6320 leinfelder
	public void testSetAccessPolicy() {
343
	    printTestHeader("testSetAccessPolicy");
344
345
	    try {
346 9266 tao
            Session session = getCNSession();
347 6320 leinfelder
			Identifier guid = new Identifier();
348
			guid.setValue("testSetAccessPolicy." + System.currentTimeMillis());
349 6504 leinfelder
			InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
350
			SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
351 6594 cjones
	    long serialVersion = 1L;
352
353 6320 leinfelder
			// save it
354 6542 leinfelder
			Identifier retGuid = CNodeService.getInstance(request).registerSystemMetadata(session, guid, sysmeta);
355 6397 leinfelder
			assertEquals(guid.getValue(), retGuid.getValue());
356 6320 leinfelder
			AccessPolicy accessPolicy = new AccessPolicy();
357
			AccessRule accessRule = new AccessRule();
358
			accessRule.addPermission(Permission.WRITE);
359
			Subject publicSubject = new Subject();
360 6532 leinfelder
			publicSubject.setValue(Constants.SUBJECT_PUBLIC);
361 6320 leinfelder
			accessRule.addSubject(publicSubject);
362
			accessPolicy.addAllow(accessRule);
363
			// set it
364 6594 cjones
			boolean result = CNodeService.getInstance(request).setAccessPolicy(session, guid, accessPolicy, serialVersion );
365 6320 leinfelder
			assertTrue(result);
366
			// check it
367 6542 leinfelder
			result = CNodeService.getInstance(request).isAuthorized(session, guid, Permission.WRITE);
368 6320 leinfelder
			assertTrue(result);
369
        } catch(Exception e) {
370
            fail("Unexpected error: " + e.getMessage());
371
        }
372
	}
373
374
	public void testIsAuthorized() {
375
	    printTestHeader("testIsAuthorized");
376
377
	    try {
378 9266 tao
            Session session = getCNSession();
379 6320 leinfelder
			Identifier guid = new Identifier();
380
			guid.setValue("testIsAuthorized." + System.currentTimeMillis());
381 6504 leinfelder
			InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
382
			SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
383 6320 leinfelder
			// save it
384 6542 leinfelder
			Identifier retGuid = CNodeService.getInstance(request).registerSystemMetadata(session, guid, sysmeta);
385 6397 leinfelder
			assertEquals(guid.getValue(), retGuid.getValue());
386 6320 leinfelder
			// check it
387
			Subject publicSubject = new Subject();
388 6532 leinfelder
			publicSubject.setValue(Constants.SUBJECT_PUBLIC);
389 6320 leinfelder
			session.setSubject(publicSubject);
390
			// public read
391 6542 leinfelder
			boolean result = CNodeService.getInstance(request).isAuthorized(session, guid, Permission.READ);
392 6320 leinfelder
			assertTrue(result);
393
			// not public write
394
			try {
395
				result = false;
396 6542 leinfelder
				result = CNodeService.getInstance(request).isAuthorized(session, guid, Permission.WRITE);
397 6320 leinfelder
				fail("Public WRITE should be denied");
398
			} catch (NotAuthorized nae) {
399
				result = true;
400
			}
401
			assertTrue(result);
402
        } catch(Exception e) {
403
            fail("Unexpected error: " + e.getMessage());
404
        }
405
	}
406
407 6295 leinfelder
	public void testReplicationPolicy() {
408
	    printTestHeader("testReplicationPolicy");
409
410
	    try {
411 9266 tao
            Session session = getCNSession();
412 6295 leinfelder
			Identifier guid = new Identifier();
413
			guid.setValue("testReplicationPolicy." + System.currentTimeMillis());
414 6504 leinfelder
			InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
415
			SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
416 6594 cjones
	    long serialVersion = 1L;
417
418 6295 leinfelder
			// save it
419 6542 leinfelder
			Identifier retGuid = CNodeService.getInstance(request).registerSystemMetadata(session, guid, sysmeta);
420 6397 leinfelder
			assertEquals(guid.getValue(), retGuid.getValue());
421 6295 leinfelder
422
			ReplicationPolicy policy = new ReplicationPolicy();
423
			NodeReference node = new NodeReference();
424
			node.setValue("testNode");
425
			policy.addPreferredMemberNode(node );
426
			// set it
427 6594 cjones
			boolean result = CNodeService.getInstance(request).setReplicationPolicy(session, guid, policy, serialVersion);
428 6295 leinfelder
			assertTrue(result);
429
			// get it
430 6542 leinfelder
			sysmeta = CNodeService.getInstance(request).getSystemMetadata(session, guid);
431 6295 leinfelder
			assertNotNull(sysmeta);
432
			// check it
433
			assertEquals(policy.getPreferredMemberNode(0).getValue(), sysmeta.getReplicationPolicy().getPreferredMemberNode(0).getValue());
434
435
        } catch(Exception e) {
436
            fail("Unexpected error: " + e.getMessage());
437
        }
438
	}
439
440
	public void testReplicationStatus() {
441
	    printTestHeader("testReplicationStatus");
442
443
	    try {
444 9266 tao
            Session session = getCNSession();
445 6295 leinfelder
			Identifier guid = new Identifier();
446
			guid.setValue("testReplicationStatus." + System.currentTimeMillis());
447 6504 leinfelder
			InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
448
			SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
449 6295 leinfelder
			Replica replica = new Replica();
450
			NodeReference replicaMemberNode = new NodeReference();
451
			replicaMemberNode.setValue("testNode");
452
			replica.setReplicationStatus(ReplicationStatus.REQUESTED);
453
			replica.setReplicaMemberNode(replicaMemberNode);
454 6879 cjones
			replica.setReplicaVerified(Calendar.getInstance().getTime());
455 6295 leinfelder
			sysmeta.addReplica(replica );
456
			// save it
457 6542 leinfelder
			Identifier retGuid = CNodeService.getInstance(request).registerSystemMetadata(session, guid, sysmeta);
458 6397 leinfelder
			assertEquals(guid.getValue(), retGuid.getValue());
459 6295 leinfelder
			// set it
460 9273 tao
			ReplicationStatus status = ReplicationStatus.QUEUED;
461 6797 leinfelder
			BaseException failure = new NotAuthorized("000", "Mock exception for " + this.getClass().getName());
462 9267 tao
			//Test the failure of setReplicationStatus by a non-cn subject
463
			Session testSession = getTestSession();
464
			try {
465
			    CNodeService.getInstance(request).setReplicationStatus(testSession, guid, replicaMemberNode, status, failure);
466
			    fail("It can't reach here since the non-cn subject can't call setReplicationStatus");
467
			} catch (NotAuthorized ee) {
468
469
			}
470
			//Test the success of setReplicationStatus by a cn subject
471 6797 leinfelder
			boolean result = CNodeService.getInstance(request).setReplicationStatus(session, guid, replicaMemberNode, status, failure);
472 6295 leinfelder
			assertTrue(result);
473
			// get it
474 6542 leinfelder
			sysmeta = CNodeService.getInstance(request).getSystemMetadata(session, guid);
475 6295 leinfelder
			assertNotNull(sysmeta);
476
			// check it
477
			assertEquals(status, sysmeta.getReplica(0).getReplicationStatus());
478
479 9273 tao
			//Test the success of setReplicationStatus by a register mn subject
480
			Session mnSession = getMNSessionFromCN();
481
			status = ReplicationStatus.COMPLETED;
482
			result = CNodeService.getInstance(request).setReplicationStatus(mnSession, guid, replicaMemberNode, status, failure);
483
			sysmeta = CNodeService.getInstance(request).getSystemMetadata(session, guid);
484
            assertNotNull(sysmeta);
485
            // check it
486
            assertEquals(status, sysmeta.getReplica(0).getReplicationStatus());
487
488 6295 leinfelder
        } catch(Exception e) {
489
            fail("Unexpected error: " + e.getMessage());
490
        }
491
	}
492
493 6122 leinfelder
	/**
494
	 * Run an initial test that always passes to check that the test harness is
495
	 * working.
496
	 */
497
	public void initialize()
498
	{
499
	    printTestHeader("initialize");
500
		assertTrue(1 == 1);
501
	}
502 6307 leinfelder
503 6697 leinfelder
	/**
504
	 * We want to act as the CN itself
505
	 * @throws ServiceFailure
506
	 * @throws Exception
507
	 */
508 9266 tao
	/*@Override
509 6697 leinfelder
	public Session getTestSession() throws Exception {
510
		Session session = super.getTestSession();
511
512
		// use the first CN we find in the nodelist
513
        NodeList nodeList = D1Client.getCN().listNodes();
514
        for (Node node : nodeList.getNodeList()) {
515
            if ( node.getType().equals(NodeType.CN) ) {
516
517
                List<Subject> subjects = node.getSubjectList();
518
                for (Subject subject : subjects) {
519
                   session.setSubject(subject);
520
                   // we are done here
521
                   return session;
522
                }
523
            }
524
        }
525
        // in case we didn't find it
526
        return session;
527 9266 tao
	}*/
528 6697 leinfelder
529 6141 cjones
530
	/**
531
	 * test to list the object formats registered in metacat
532
	 */
533
	public void testListFormats() {
534
535
    printTestHeader("testListFormats");
536
537 6307 leinfelder
    // make sure we are set up
538
    setUpFormats();
539
540 6141 cjones
    // there should be at least 59 formats in the list
541
  	int formatsCount = 59;
542
  	ObjectFormatList objectFormatList;
543
544
  	try {
545 6542 leinfelder
	    objectFormatList = CNodeService.getInstance(request).listFormats();
546 6141 cjones
	  	assertTrue(objectFormatList.getTotal() >= formatsCount);
547
548
  	} catch (ServiceFailure e) {
549
  		fail("Could not get the object format list: " + e.getMessage());
550
551
    } catch (NotImplemented e) {
552
  		fail("Could not get the object format list: " + e.getMessage());
553
554
    }
555
556
	}
557 6122 leinfelder
558 6141 cjones
  /**
559
   * Test getting a single object format from the registered list
560
   */
561
  public void testGetFormat() {
562
563
    printTestHeader("testGetFormat");
564
565 6307 leinfelder
    // make sure we are set up
566
    setUpFormats();
567
568 6141 cjones
    String knownFormat = "text/plain";
569
    ObjectFormatIdentifier fmtid = new ObjectFormatIdentifier();
570
    fmtid.setValue(knownFormat);
571
572
    try {
573
574
			String result =
575 6561 leinfelder
				CNodeService.getInstance(request).getFormat(fmtid).getFormatId().getValue();
576 6141 cjones
	  	System.out.println("Expected result: " + knownFormat);
577
	  	System.out.println("Found    result: " + result);
578
	  	assertTrue(result.equals(knownFormat));
579
580
    } catch (NullPointerException npe) {
581
	    fail("The returned format was null: " + npe.getMessage());
582
583
    } catch (NotFound nfe) {
584
    	fail("The format " + knownFormat + " was not found: " + nfe.getMessage());
585
586
    } catch (ServiceFailure sfe) {
587
    	fail("The format " + knownFormat + " was not found: " + sfe.getMessage());
588
589
    } catch (NotImplemented nie) {
590
    	fail("The getFormat() method has not been implemented: " + nie.getMessage());
591
592
    }
593
594
  }
595
596
  /**
597
   * Test getting a non-existent object format, returning NotFound
598
   */
599
  public void testObjectFormatNotFoundException() {
600
601
    printTestHeader("testObjectFormatNotFoundException");
602
603
    ObjectFormatIdentifier fmtid = new ObjectFormatIdentifier();
604
  	String badFormat = "text/bad-format";
605
  	fmtid.setValue(badFormat);
606
607
  	try {
608
609
	    ObjectFormat objectFormat =
610 6542 leinfelder
	    	CNodeService.getInstance(request).getFormat(fmtid);
611 6141 cjones
612
  	} catch (Exception e) {
613
614
  		assertTrue(e instanceof NotFound);
615
  	}
616
617
  }
618 8905 tao
619
  public void readDeletedObject() {
620
      printTestHeader("testCreate");
621
622
      try {
623 9266 tao
          Session session = getCNSession();
624 8905 tao
          Identifier guid = new Identifier();
625
          guid.setValue("testCreate." + System.currentTimeMillis());
626
          InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
627
          SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
628
          Identifier pid = CNodeService.getInstance(request).create(session, guid, object, sysmeta);
629
          assertEquals(guid, pid);
630
631
          Thread.sleep(3000);
632
          // use MN admin to delete
633
          session = getMNSession();
634
          Identifier deletedPid = CNodeService.getInstance(request).delete(session, pid);
635
          System.out.println("after deleting");
636
          assertEquals(pid.getValue(), deletedPid.getValue());
637
          // check that we cannot get the object
638
          session = getTestSession();
639
          InputStream deletedObject = null;
640
          try {
641
              //System.out.println("before read ===============");
642
              deletedObject = CNodeService.getInstance(request).get(session, deletedPid);
643
              //System.out.println("after read ===============");
644
          } catch (NotFound nf) {
645
              //System.out.println("the exception is1 "+nf.getMessage());
646
              //nf.printStackTrace();
647
              assertTrue(nf.getMessage().contains("deleted"));
648
          }
649
          try {
650
              //System.out.println("before read ===============");
651
              SystemMetadata sysmeta2 = CNodeService.getInstance(request).getSystemMetadata(session, deletedPid);
652
              //System.out.println("after read ===============");
653
          } catch (NotFound nf) {
654
              //System.out.println("the exception is "+nf.getMessage());
655
              //nf.printStackTrace();
656
              assertTrue(nf.getMessage().contains("deleted"));
657
          }
658
659
          try {
660
              //System.out.println("before read ===============");
661
              DescribeResponse describeResponse = CNodeService.getInstance(request).describe(session, pid);
662
              //System.out.println("after read ===============");
663
          } catch (NotFound nf) {
664
              //System.out.println("the exception is "+nf.getMessage());
665
              //nf.printStackTrace();
666
              assertTrue(nf.getMessage().contains("deleted"));
667
          }
668
669
          try {
670
              //System.out.println("before read ===============");
671
              Checksum checksum = CNodeService.getInstance(request).getChecksum(session, pid);
672
              //System.out.println("after read ===============");
673
          } catch (NotFound nf) {
674
              //System.out.println("the exception 3 is "+nf.getMessage());
675
              //nf.printStackTrace();
676
              assertTrue(nf.getMessage().contains("deleted"));
677
          }
678
679
          try {
680
              //System.out.println("before read ===============");
681
              boolean isAuthorized =
682
                      CNodeService.getInstance(request).isAuthorized(session, pid, Permission.READ);
683
              //System.out.println("after read ===============");
684
          } catch (NotFound nf) {
685
              //System.out.println("the exception 4 is "+nf.getMessage());
686
              //nf.printStackTrace();
687
              assertTrue(nf.getMessage().contains("deleted"));
688
          }
689
690
691
692
          assertNull(deletedObject);
693
      } catch(Exception e) {
694
          e.printStackTrace();
695
          fail("Unexpected error: " + e.getMessage());
696
      }
697
  }
698 9112 tao
699
  /**
700
   * Test the method - get api  for a speicified SID
701
   */
702
  public void testGetSID() {
703
      String str1 = "object1";
704
      String str2 = "object2";
705
      String str3 = "object3";
706
      try {
707
          //insert test documents with a series id
708 9266 tao
          Session session = getCNSession();
709 9112 tao
          Identifier guid = new Identifier();
710
          guid.setValue(generateDocumentId());
711
          InputStream object1 = new ByteArrayInputStream(str1.getBytes("UTF-8"));
712
          SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object1);
713
          String sid1= "sid."+System.nanoTime();
714
          Identifier seriesId = new Identifier();
715
          seriesId.setValue(sid1);
716
          System.out.println("the first sid is "+seriesId.getValue());
717
          sysmeta.setSeriesId(seriesId);
718
          CNodeService.getInstance(request).create(session, guid, object1, sysmeta);
719
          System.out.println("the first pid is "+guid.getValue());
720
          //test the get(pid) for v2
721
          InputStream result = CNodeService.getInstance(request).get(session, guid);
722
          // go back to beginning of original stream
723
          object1.reset();
724
          // check
725
          assertTrue(object1.available() > 0);
726
          assertTrue(result.available() > 0);
727
          assertTrue(IOUtils.contentEquals(result, object1));
728
          // test the get(id) for v2
729
          InputStream result1 = CNodeService.getInstance(request).get(session, seriesId);
730
          object1.reset();
731
          // check
732
          assertTrue(object1.available() > 0);
733
          assertTrue(result1.available() > 0);
734
          assertTrue(IOUtils.contentEquals(result1, object1));
735
          //test the get(pid) for v1
736
          InputStream result2 = edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).get(session, guid);
737
          object1.reset();
738
          // check
739
          assertTrue(object1.available() > 0);
740
          assertTrue(result2.available() > 0);
741
          assertTrue(IOUtils.contentEquals(result2, object1));
742
          //test the get(sid) for v1
743
          try {
744
              InputStream result3 = edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).get(session, seriesId);
745
              fail("the get(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
746
          } catch (NotFound ee) {
747
748
          }
749
          SystemMetadata metadata = CNodeService.getInstance(request).getSystemMetadata(session, seriesId);
750
          assertTrue(metadata.getIdentifier().getValue().equals(guid.getValue()));
751
          assertTrue(metadata.getSeriesId().getValue().equals(seriesId.getValue()));
752
          DescribeResponse describeResponse = CNodeService.getInstance(request).describe(session, seriesId);
753
          assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata.getChecksum().getValue());
754
          assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata.getFormatId().getValue());
755
756
          metadata = CNodeService.getInstance(request).getSystemMetadata(session, guid);
757
          assertTrue(metadata.getIdentifier().getValue().equals(guid.getValue()));
758
          assertTrue(metadata.getSeriesId().getValue().equals(seriesId.getValue()));
759
          describeResponse = CNodeService.getInstance(request).describe(session, guid);
760
          assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata.getChecksum().getValue());
761
          assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata.getFormatId().getValue());
762
763
          org.dataone.service.types.v1.SystemMetadata sys1=edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).getSystemMetadata(session, guid);
764
          assertTrue(metadata.getIdentifier().getValue().equals(guid.getValue()));
765
766
          try {
767
              org.dataone.service.types.v1.SystemMetadata sys2=edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).getSystemMetadata(session, seriesId);
768
              fail("the getSystemMetadata(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
769
          } catch(NotFound nf2) {
770
771
          }
772
773
          describeResponse = edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).describe(session, guid);
774
          assertEquals(describeResponse.getDataONE_Checksum().getValue(), sys1.getChecksum().getValue());
775
          assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), sys1.getFormatId().getValue());
776
          try {
777
              describeResponse = edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).describe(session, seriesId);
778
              fail("the describe(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
779
          } catch(NotFound nf2) {
780
781
          }
782
783
          Checksum sum = CNodeService.getInstance(request).getChecksum(session, guid);
784
          assertTrue(sum.getValue().equals("5b78f9689b9aab1ebc0f3c1df916dd97"));
785
786
          try {
787
              sum = CNodeService.getInstance(request).getChecksum(session, seriesId);
788
              fail("the getCheckSum shouldn't work for sid");
789
          } catch(NotFound nf3) {
790
791
          }
792
793
          sum = edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).getChecksum(session, guid);
794
          assertTrue(sum.getValue().equals("5b78f9689b9aab1ebc0f3c1df916dd97"));
795
796
          try {
797
              sum = edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).getChecksum(session, seriesId);
798
              fail("the getCheckSum shouldn't work for sid");
799
          } catch(NotFound nf3) {
800
801
          }
802
803
          boolean isAuthorized =
804
                  CNodeService.getInstance(request).isAuthorized(session, guid, Permission.READ);
805
          assertEquals(isAuthorized, true);
806
807
          isAuthorized =
808
                  CNodeService.getInstance(request).isAuthorized(session, seriesId, Permission.READ);
809
          assertEquals(isAuthorized, true);
810
811
          isAuthorized =
812
                  edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).isAuthorized(session, guid, Permission.READ);
813
          assertEquals(isAuthorized, true);
814
815
          try {
816
              isAuthorized =
817
                      edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).isAuthorized(session, seriesId, Permission.READ);
818
              fail("we can't reach here since the v1 isAuthorized method doesn't suppport series id");
819
          } catch (NotFound e) {
820
821
          }
822
823
          //do a update with the same series id
824
          Thread.sleep(1000);
825
          Identifier newPid = new Identifier();
826
          newPid.setValue(generateDocumentId()+"1");
827
          System.out.println("the second pid is "+newPid.getValue());
828
          InputStream object2 = new ByteArrayInputStream(str2.getBytes("UTF-8"));
829
          SystemMetadata newSysMeta = createSystemMetadata(newPid, session.getSubject(), object2);
830
          newSysMeta.setObsoletes(guid);
831
          newSysMeta.setSeriesId(seriesId);
832
          //CNodeService.getInstance(request).update(session, guid, object2, newPid, newSysMeta);
833
          CNodeService.getInstance(request).create(session, newPid, object2, newSysMeta);
834
          //update the system metadata of previous version.
835
          sysmeta.setObsoletedBy(newPid);
836
          CNodeService.getInstance(request).updateSystemMetadata(session, guid, sysmeta);
837
          InputStream result4 = CNodeService.getInstance(request).get(session, guid);
838
          // go back to beginning of original stream
839
          object1.reset();
840
          // check
841
          assertTrue(object1.available() > 0);
842
          assertTrue(result4.available() > 0);
843
          assertTrue(IOUtils.contentEquals(result4, object1));
844
845
          InputStream result5 = CNodeService.getInstance(request).get(session, newPid);
846
          // go back to beginning of original stream
847
          object2.reset();
848
          // check
849
          assertTrue(object2.available() > 0);
850
          assertTrue(result5.available() > 0);
851
          assertTrue(IOUtils.contentEquals(result5, object2));
852
853
854
          InputStream result6 = CNodeService.getInstance(request).get(session, seriesId);
855
          object2.reset();
856
          // check
857
          assertTrue(object2.available() > 0);
858
          assertTrue(result6.available() > 0);
859
          assertTrue(IOUtils.contentEquals(result6, object2));
860
          //test the get(pid) for v1
861
          InputStream result7 = edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).get(session, guid);
862
          //System.out.println("+++++++++++++++++++++"+IOUtils.toString(result7));
863
          object1.reset();
864
          // check
865
          assertTrue(object1.available() > 0);
866
          assertTrue(result7.available() > 0);
867
          assertTrue(IOUtils.contentEquals(result7, object1));
868
869
          InputStream result8 = edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).get(session, newPid);
870
          object2.reset();
871
          // check
872
          assertTrue(object2.available() > 0);
873
          assertTrue(result8.available() > 0);
874
          assertTrue(IOUtils.contentEquals(result8, object2));
875
          //test the get(sid) for v1
876
          try {
877
              InputStream result3 = edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).get(session, seriesId);
878
              fail("the get(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
879
          } catch (NotFound ee) {
880
881
          }
882
883
          SystemMetadata metadata1 = CNodeService.getInstance(request).getSystemMetadata(session, seriesId);
884
          assertTrue(metadata1.getIdentifier().getValue().equals(newPid.getValue()));
885
          assertTrue(metadata1.getSeriesId().getValue().equals(seriesId.getValue()));
886
          describeResponse = CNodeService.getInstance(request).describe(session, seriesId);
887
          assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata1.getChecksum().getValue());
888
          assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata1.getFormatId().getValue());
889
890
          SystemMetadata metadata2 = CNodeService.getInstance(request).getSystemMetadata(session, guid);
891
          assertTrue(metadata2.getIdentifier().getValue().equals(guid.getValue()));
892
          assertTrue(metadata2.getSeriesId().getValue().equals(seriesId.getValue()));
893
          describeResponse = CNodeService.getInstance(request).describe(session, guid);
894
          assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata2.getChecksum().getValue());
895
          assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata2.getFormatId().getValue());
896
897
          SystemMetadata metadata3 = CNodeService.getInstance(request).getSystemMetadata(session, newPid);
898
          assertTrue(metadata3.getIdentifier().getValue().equals(newPid.getValue()));
899
          assertTrue(metadata3.getSeriesId().getValue().equals(seriesId.getValue()));
900
          describeResponse = CNodeService.getInstance(request).describe(session, newPid);
901
          assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata3.getChecksum().getValue());
902
          assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata3.getFormatId().getValue());
903
904
          //do another update with different series id
905
          Thread.sleep(1000);
906
          String sid2 = "sid."+System.nanoTime();
907
          Identifier seriesId2= new Identifier();
908
          seriesId2.setValue(sid2);
909
          System.out.println("the second sid is "+seriesId2.getValue());
910
          Identifier newPid2 = new Identifier();
911
          newPid2.setValue(generateDocumentId()+"2");
912
          System.out.println("the third pid is "+newPid2.getValue());
913
          InputStream object3 = new ByteArrayInputStream(str3.getBytes("UTF-8"));
914
          SystemMetadata sysmeta3 = createSystemMetadata(newPid2, session.getSubject(), object3);
915
          sysmeta3.setObsoletes(newPid);
916
          sysmeta3.setSeriesId(seriesId2);
917
          //CNodeService.getInstance(request).update(session, newPid, object3, newPid2, sysmeta3);
918
          CNodeService.getInstance(request).create(session, newPid2, object3, sysmeta3);
919
          //update the system metadata of the previous version
920
          newSysMeta.setObsoletedBy(newPid2);
921
          CNodeService.getInstance(request).updateSystemMetadata(session, newPid, newSysMeta);
922
923
          InputStream result9 = CNodeService.getInstance(request).get(session, guid);
924
          // go back to beginning of original stream
925
          object1.reset();
926
          // check
927
          assertTrue(object1.available() > 0);
928
          assertTrue(result9.available() > 0);
929
          assertTrue(IOUtils.contentEquals(result9, object1));
930
931
          InputStream result10 = CNodeService.getInstance(request).get(session, newPid);
932
          // go back to beginning of original stream
933
          object2.reset();
934
          // check
935
          assertTrue(object2.available() > 0);
936
          assertTrue(result10.available() > 0);
937
          assertTrue(IOUtils.contentEquals(result10, object2));
938
939
940
          InputStream result11 = CNodeService.getInstance(request).get(session, newPid2);
941
          // go back to beginning of original stream
942
          object3.reset();
943
          // check
944
          assertTrue(object3.available() > 0);
945
          assertTrue(result11.available() > 0);
946
          assertTrue(IOUtils.contentEquals(result11, object3));
947
948
          InputStream result12 = CNodeService.getInstance(request).get(session, seriesId2);
949
          object3.reset();
950
          // check
951
          assertTrue(object3.available() > 0);
952
          assertTrue(result12.available() > 0);
953
          assertTrue(IOUtils.contentEquals(result12, object3));
954
955
          InputStream result16 = CNodeService.getInstance(request).get(session, seriesId);
956
          object2.reset();
957
          // check
958
          assertTrue(object2.available() > 0);
959
          assertTrue(result16.available() > 0);
960
          assertTrue(IOUtils.contentEquals(result16, object2));
961
962
          //test the get(pid) for v1
963
          InputStream result13 = edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).get(session, guid);
964
          object1.reset();
965
          // check
966
          assertTrue(object1.available() > 0);
967
          assertTrue(result13.available() > 0);
968
          assertTrue(IOUtils.contentEquals(result13, object1));
969
970
          InputStream result14 = edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).get(session, newPid);
971
          object2.reset();
972
          // check
973
          assertTrue(object2.available() > 0);
974
          assertTrue(result14.available() > 0);
975
          assertTrue(IOUtils.contentEquals(result14, object2));
976
977
          InputStream result15 = edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).get(session, newPid2);
978
          object3.reset();
979
          // check
980
          assertTrue(object3.available() > 0);
981
          assertTrue(result15.available() > 0);
982
          assertTrue(IOUtils.contentEquals(result15, object3));
983
984
          SystemMetadata metadata4 = CNodeService.getInstance(request).getSystemMetadata(session, seriesId);
985
          assertTrue(metadata4.getIdentifier().getValue().equals(newPid.getValue()));
986
          assertTrue(metadata4.getSeriesId().getValue().equals(seriesId.getValue()));
987
          describeResponse = CNodeService.getInstance(request).describe(session, seriesId);
988
          assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata4.getChecksum().getValue());
989
          assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata4.getFormatId().getValue());
990
991
          SystemMetadata metadata5 = CNodeService.getInstance(request).getSystemMetadata(session, seriesId2);
992
          assertTrue(metadata5.getIdentifier().getValue().equals(newPid2.getValue()));
993
          assertTrue(metadata5.getSeriesId().getValue().equals(seriesId2.getValue()));
994
          describeResponse = CNodeService.getInstance(request).describe(session, seriesId2);
995
          assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata5.getChecksum().getValue());
996
          assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata5.getFormatId().getValue());
997
998
          SystemMetadata metadata6 = CNodeService.getInstance(request).getSystemMetadata(session, guid);
999
          assertTrue(metadata6.getIdentifier().getValue().equals(guid.getValue()));
1000
          assertTrue(metadata6.getSeriesId().getValue().equals(seriesId.getValue()));
1001
          describeResponse = CNodeService.getInstance(request).describe(session, guid);
1002
          assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata6.getChecksum().getValue());
1003
          assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata6.getFormatId().getValue());
1004
1005
          SystemMetadata metadata7 = CNodeService.getInstance(request).getSystemMetadata(session, newPid);
1006
          assertTrue(metadata7.getIdentifier().getValue().equals(newPid.getValue()));
1007
          assertTrue(metadata7.getSeriesId().getValue().equals(seriesId.getValue()));
1008
          describeResponse = CNodeService.getInstance(request).describe(session, newPid);
1009
          assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata7.getChecksum().getValue());
1010
          assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata7.getFormatId().getValue());
1011
1012
          SystemMetadata metadata8 = CNodeService.getInstance(request).getSystemMetadata(session, newPid2);
1013
          assertTrue(metadata8.getIdentifier().getValue().equals(newPid2.getValue()));
1014
          assertTrue(metadata8.getSeriesId().getValue().equals(seriesId2.getValue()));
1015
          describeResponse = CNodeService.getInstance(request).describe(session, newPid2);
1016
          assertEquals(describeResponse.getDataONE_Checksum().getValue(), metadata8.getChecksum().getValue());
1017
          assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), metadata8.getFormatId().getValue());
1018
1019
1020
1021
          System.out.println("here===========================");
1022
          //test the get(sid) for v1
1023
          try {
1024
              InputStream result3 = edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).get(session, seriesId);
1025
              fail("the get(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1026
          } catch (NotFound ee) {
1027
1028
          }
1029
1030
          //test the get(sid) for v1
1031
          try {
1032
              InputStream result3 = edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).get(session, seriesId2);
1033
              fail("the get(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1034
          } catch (NotFound ee) {
1035
1036
          }
1037
1038
          //test to get non-existing id for v2
1039
          try {
1040
           // the pid should be null when we try to get a no-exist sid
1041
              Identifier non_exist_sid = new Identifier();
1042
              non_exist_sid.setValue("no-sid-exist-123qwe");
1043
              InputStream result3 = CNodeService.getInstance(request).get(session, non_exist_sid);
1044
              fail("the get(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1045
          } catch (NotFound ee) {
1046
1047
          }
1048
1049
          try {
1050
              // the pid should be null when we try to get a no-exist sid
1051
                 Identifier non_exist_sid = new Identifier();
1052
                 non_exist_sid.setValue("no-sid-exist-123qwe");
1053
                 SystemMetadata result3 = CNodeService.getInstance(request).getSystemMetadata(session, non_exist_sid);
1054
                 fail("the getSystemMetadata(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1055
          } catch (NotFound ee) {
1056
1057
          }
1058
1059
          try {
1060
              // the pid should be null when we try to get a no-exist sid
1061
                 Identifier non_exist_sid = new Identifier();
1062
                 non_exist_sid.setValue("no-sid-exist-123qwe");
1063
                  CNodeService.getInstance(request).describe(session, non_exist_sid);
1064
                 fail("the describe(sid) methoud should throw a not found exception for the sid "+seriesId.getValue());
1065
             } catch (NotFound ee) {
1066
1067
             }
1068
1069
1070
          //do another update with invalid series ids
1071
          Thread.sleep(1000);
1072
          Identifier newPid3 = new Identifier();
1073
          newPid3.setValue(generateDocumentId()+"3");
1074
          System.out.println("the third pid is "+newPid3.getValue());
1075
          InputStream object4 = new ByteArrayInputStream(str3.getBytes("UTF-8"));
1076
          SystemMetadata sysmeta4 = createSystemMetadata(newPid3, session.getSubject(), object4);
1077
          sysmeta4.setObsoletes(newPid2);
1078
          sysmeta4.setSeriesId(seriesId);
1079 9171 tao
          /*try {
1080 9112 tao
              CNodeService.getInstance(request).create(session, newPid3, object4, sysmeta4);
1081
              fail("we can't reach here since the sid is using an old one ");
1082
          } catch (InvalidSystemMetadata eee) {
1083
1084 9171 tao
          } */
1085 9112 tao
1086 9171 tao
          /*sysmeta4.setSeriesId(newPid3);
1087 9112 tao
          try {
1088
              CNodeService.getInstance(request).create(session, newPid3, object4, sysmeta4);
1089
              fail("we can't reach here since the sid is using the pid ");
1090
          } catch (InvalidSystemMetadata eee) {
1091
1092 9171 tao
          }*/
1093 9112 tao
1094
          //test archive a series id by v1
1095
          try {
1096
              edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).archive(session, seriesId2);
1097
              fail("we can't reach here since the v1 archive method doesn't support the sid ");
1098
          } catch (NotFound nf2) {
1099
1100
          }
1101
1102
          // test delete a series id by v1
1103
          Session mnSession = getMNSession();
1104
          try {
1105
              edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).delete(mnSession, seriesId2);
1106
              fail("we can't reach here since the v1 delete method doesn't support the sid ");
1107
          } catch (NotFound nf2) {
1108
1109
          }
1110
1111
          // test archive a series id by v2
1112
          CNodeService.getInstance(request).archive(session, seriesId2);
1113
          SystemMetadata archived = CNodeService.getInstance(request).getSystemMetadata(session, seriesId2);
1114
          assertTrue(archived.getArchived());
1115
          archived = CNodeService.getInstance(request).getSystemMetadata(session, newPid2);
1116
          assertTrue(archived.getArchived());
1117
1118
          // test delete a series id by v2
1119
          CNodeService.getInstance(request).delete(mnSession, seriesId2);
1120
          try {
1121
              CNodeService.getInstance(request).get(session, seriesId2);
1122
              fail("we can't reach here since the series id was deleted ");
1123
          } catch (NotFound nf3) {
1124
              System.out.println("the message is ============="+nf3.getMessage());
1125
              //assertTrue(nf3.getMessage().indexOf("delete") >0);
1126
          }
1127
1128
          try {
1129
              CNodeService.getInstance(request).get(session, newPid2);
1130
              fail("we can't reach here since the series id was deleted ");
1131
          } catch (NotFound nf3) {
1132
              //System.out.println("the message is ============="+nf3.getMessage());
1133
              assertTrue(nf3.getMessage().indexOf("delete") >0);
1134
          }
1135
1136
          try {
1137
              edu.ucsb.nceas.metacat.dataone.v1.CNodeService.getInstance(request).get(session, newPid2);
1138
              fail("we can't reach here since the series id was deleted ");
1139
          } catch (NotFound nf3) {
1140
              System.out.println("the message is ============="+nf3.getMessage());
1141
              assertTrue(nf3.getMessage().indexOf("delete") >0);
1142
          }
1143
1144
          //archive seriesId
1145
          CNodeService.getInstance(request).archive(mnSession, seriesId);
1146
          archived = CNodeService.getInstance(request).getSystemMetadata(session, seriesId);
1147
          assertTrue(archived.getArchived());
1148
          archived = CNodeService.getInstance(request).getSystemMetadata(session, newPid);
1149
          assertTrue(archived.getArchived());
1150
1151
1152
          //delete seriesId
1153
          CNodeService.getInstance(request).delete(mnSession, seriesId);
1154
          try {
1155
              CNodeService.getInstance(request).get(session, newPid);
1156
              fail("we can't reach here since the series id was deleted ");
1157
          } catch (NotFound nf3) {
1158
              //System.out.println("the message is ============="+nf3.getMessage());
1159
              assertTrue(nf3.getMessage().indexOf("delete") >0);
1160
          }
1161
          SystemMetadata meta = CNodeService.getInstance(request).getSystemMetadata(session, seriesId);
1162
          assertTrue(meta.getIdentifier().getValue().equals(guid.getValue()));
1163
1164
      } catch (Exception e) {
1165
          e.printStackTrace();
1166
          fail(e.getMessage());
1167
      }
1168
  }
1169 6122 leinfelder
1170 9147 tao
  /**
1171
   * Test the listView methods.
1172
   * @throws Excpetion
1173
   */
1174
  public void testListViews() throws Exception {
1175
      OptionList list = CNodeService.getInstance(request).listViews();
1176
      assertTrue(list.sizeOptionList() >0);
1177
      List<String> names = list.getOptionList();
1178
      for(String name : names) {
1179
          System.out.println("It has the view named "+name);
1180
      }
1181
  }
1182 9167 tao
1183
  public void testUpdateSystemMetadata() throws Exception {
1184
          String str1 = "object1";
1185
          String str2 = "object2";
1186
          String str3 = "object3";
1187
1188
          //insert test documents with a series id
1189 9266 tao
          Session session = getCNSession();
1190 9167 tao
          Identifier guid = new Identifier();
1191
          guid.setValue(generateDocumentId());
1192
          InputStream object1 = new ByteArrayInputStream(str1.getBytes("UTF-8"));
1193
          SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object1);
1194
          String sid1= "sid."+System.nanoTime();
1195
          Identifier seriesId = new Identifier();
1196
          seriesId.setValue(sid1);
1197
          System.out.println("the first sid is "+seriesId.getValue());
1198
          sysmeta.setSeriesId(seriesId);
1199
          sysmeta.setArchived(false);
1200
          CNodeService.getInstance(request).create(session, guid, object1, sysmeta);
1201
          //Test the generating object succeeded.
1202
          SystemMetadata metadata = CNodeService.getInstance(request).getSystemMetadata(session, guid);
1203
          assertTrue(metadata.getIdentifier().equals(guid));
1204
          assertTrue(metadata.getArchived().equals(false));
1205
          System.out.println("the checksum from request is "+metadata.getChecksum().getValue());
1206
          assertTrue(metadata.getSize().equals(sysmeta.getSize()));
1207
1208 9267 tao
          //test to fail to update system metadata by a non-cn subject
1209
          Session testSession = getTestSession();
1210
          metadata.setArchived(true);
1211
          try {
1212
              CNodeService.getInstance(request).updateSystemMetadata(testSession, guid, metadata);
1213
              fail("It shouldn't get there since the test session can't update system metadata");
1214
          } catch (NotAuthorized e) {
1215
1216
          }
1217
1218
1219 9167 tao
          //update system metadata sucessfully
1220
          metadata.setArchived(true);
1221
          CNodeService.getInstance(request).updateSystemMetadata(session, guid, metadata);
1222
          SystemMetadata metadata2 = CNodeService.getInstance(request).getSystemMetadata(session, seriesId);
1223
          assertTrue(metadata2.getIdentifier().equals(guid));
1224
          assertTrue(metadata2.getSeriesId().equals(seriesId));
1225
          assertTrue(metadata2.getArchived().equals(true));
1226
          assertTrue(metadata2.getChecksum().getValue().equals(metadata.getChecksum().getValue()));
1227
1228
          Identifier newId = new Identifier();
1229
          newId.setValue("newValue");
1230
          metadata.setIdentifier(newId);
1231
          try {
1232
              CNodeService.getInstance(request).updateSystemMetadata(session, guid, metadata);
1233
              fail("We shouldn't get there");
1234
          } catch (Exception e) {
1235
              assertTrue(e instanceof InvalidRequest);
1236
          }
1237
1238
          newId.setValue("newValue");
1239
          metadata.setSeriesId(newId);
1240
          try {
1241
              CNodeService.getInstance(request).updateSystemMetadata(session, guid, metadata);
1242
              fail("We shouldn't get there");
1243
          } catch (Exception e) {
1244
              assertTrue(e instanceof InvalidRequest);
1245
          }
1246
1247
          Date newDate = new Date();
1248
          metadata.setDateUploaded(newDate);
1249
          try {
1250
              CNodeService.getInstance(request).updateSystemMetadata(session, guid, metadata);
1251
              fail("We shouldn't get there");
1252
          } catch (Exception e) {
1253
              assertTrue(e instanceof InvalidRequest);
1254
          }
1255
1256
          Checksum checkSum = new Checksum();
1257
          checkSum.setValue("12345");
1258
          metadata.setChecksum(checkSum);
1259
          try {
1260
              CNodeService.getInstance(request).updateSystemMetadata(session, guid, metadata);
1261
              fail("We shouldn't get there");
1262
          } catch (Exception e) {
1263
              assertTrue(e instanceof InvalidRequest);
1264
          }
1265
1266
          BigInteger size = new BigInteger("4000");
1267
          metadata.setSize(size);
1268
          try {
1269
              CNodeService.getInstance(request).updateSystemMetadata(session, guid, metadata);
1270
              fail("We shouldn't get there");
1271
          } catch (Exception e) {
1272
              assertTrue(e instanceof InvalidRequest);
1273
          }
1274
  }
1275 9273 tao
1276
  public Session getMNSessionFromCN() throws NotImplemented, ServiceFailure {
1277
      Session session = new Session();
1278
      Subject subject = null;
1279
      CNode cn = D1Client.getCN();
1280
      System.out.println("the cn is "+cn.getNodeBaseServiceUrl());
1281
      List<Node> nodes = cn.listNodes().getNodeList();
1282
      System.out.println("the size of the list is "+nodes.size());
1283
      // find the first CN in the node list
1284
      for (Node node : nodes) {
1285
          if (node.getType().equals(NodeType.MN)) {
1286
              subject = node.getSubject(0);
1287
              break;
1288
          }
1289
      }
1290
      session.setSubject(subject);
1291
      return session;
1292
  }
1293
1294 6122 leinfelder
}