Project

General

Profile

1
/**
2
 *  '$RCSfile$'
3
 *  Copyright: 2010 Regents of the University of California and the
4
 *              National Center for Ecological Analysis and Synthesis
5
 *  Purpose: To test the Access Controls in metacat by JUnit
6
 *
7
 *   '$Author: leinfelder $'
8
 *     '$Date: 2011-07-27 16:25:30 -0700 (Wed, 27 Jul 2011) $'
9
 * '$Revision: 6366 $'
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
import java.io.ByteArrayInputStream;
29
import java.io.InputStream;
30
import java.text.SimpleDateFormat;
31
import java.util.Date;
32

    
33
import junit.framework.Test;
34
import junit.framework.TestSuite;
35

    
36
import org.apache.commons.io.IOUtils;
37
import org.dataone.service.Constants;
38
import org.dataone.service.exceptions.InsufficientResources;
39
import org.dataone.service.exceptions.InvalidRequest;
40
import org.dataone.service.exceptions.NotAuthorized;
41
import org.dataone.service.exceptions.NotFound;
42
import org.dataone.service.exceptions.NotImplemented;
43
import org.dataone.service.exceptions.ServiceFailure;
44
import org.dataone.service.types.v1.AccessPolicy;
45
import org.dataone.service.types.v1.AccessRule;
46
import org.dataone.service.types.v1.Checksum;
47
import org.dataone.service.types.v1.Event;
48
import org.dataone.service.types.v1.Identifier;
49
import org.dataone.service.types.v1.Log;
50
import org.dataone.service.types.v1.NodeReference;
51
import org.dataone.service.types.v1.ObjectFormat;
52
import org.dataone.service.types.v1.ObjectFormatIdentifier;
53
import org.dataone.service.types.v1.ObjectFormatList;
54
import org.dataone.service.types.v1.ObjectInfo;
55
import org.dataone.service.types.v1.ObjectList;
56
import org.dataone.service.types.v1.Permission;
57
import org.dataone.service.types.v1.Replica;
58
import org.dataone.service.types.v1.ReplicationPolicy;
59
import org.dataone.service.types.v1.ReplicationStatus;
60
import org.dataone.service.types.v1.Session;
61
import org.dataone.service.types.v1.Subject;
62
import org.dataone.service.types.v1.SystemMetadata;
63

    
64
/**
65
 * A JUnit test for testing the dataone CNCore implementation
66
 */
67
public class CNodeServiceTest extends D1NodeServiceTest {   
68
    
69
    /**
70
    * constructor for the test
71
    */
72
    public CNodeServiceTest(String name)
73
    {
74
        super(name);
75
    }
76

    
77
	/**
78
	 * Create a suite of tests to be run together
79
	 */
80
	public static Test suite() 
81
	{
82
		TestSuite suite = new TestSuite();
83
		suite.addTest(new CNodeServiceTest("initialize"));
84
		
85
		suite.addTest(new CNodeServiceTest("testAssertRelation"));
86
		suite.addTest(new CNodeServiceTest("testChecksum"));
87
		suite.addTest(new CNodeServiceTest("testCreate"));
88
		suite.addTest(new CNodeServiceTest("testGet"));
89
		suite.addTest(new CNodeServiceTest("testGetFormat"));
90
		suite.addTest(new CNodeServiceTest("testGetLogRecords"));
91
		suite.addTest(new CNodeServiceTest("testGetSystemMetadata"));
92
		suite.addTest(new CNodeServiceTest("testIsAuthorized"));
93
		suite.addTest(new CNodeServiceTest("testListFormats"));
94
		suite.addTest(new CNodeServiceTest("testListNodes"));
95
		suite.addTest(new CNodeServiceTest("testObjectFormatNotFoundException"));
96
		suite.addTest(new CNodeServiceTest("testRegisterSystemMetadata"));
97
		suite.addTest(new CNodeServiceTest("testReplicationPolicy"));
98
		suite.addTest(new CNodeServiceTest("testReplicationStatus"));
99
		suite.addTest(new CNodeServiceTest("testReserveIdentifier"));
100
		suite.addTest(new CNodeServiceTest("testSearch"));
101
		suite.addTest(new CNodeServiceTest("testSetAccessPolicy"));
102
		suite.addTest(new CNodeServiceTest("testSetOwner"));
103
	
104
		return suite;
105
	}
106
	
107
	
108
	/**
109
	 * test for registering standalone system metadata
110
	 */
111
	public void testRegisterSystemMetadata() {
112
	    printTestHeader("testRegisterSystemMetadata");
113

    
114
	    try {
115
            Session session = getTestSession();
116
			Identifier guid = new Identifier();
117
			guid.setValue("testRegisterSystemMetadata." + System.currentTimeMillis());
118
			SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), null);
119
			boolean result = CNodeService.getInstance().registerSystemMetadata(session, guid, sysmeta);
120
			assertTrue(result);
121
        } catch(Exception e) {
122
            fail("Unexpected error: " + e.getMessage());
123
        }
124
	}
125
	
126
	/**
127
	 * test for getting system metadata
128
	 */
129
	public void testGetSystemMetadata() {
130
	    printTestHeader("testGetSystemMetadata");
131

    
132
	    try {
133
            Session session = getTestSession();
134
			Identifier guid = new Identifier();
135
			guid.setValue("testGetSystemMetadata." + System.currentTimeMillis());
136
			SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), null);
137
			boolean result = CNodeService.getInstance().registerSystemMetadata(session, guid, sysmeta);
138
			assertTrue(result);
139
			// get it
140
			SystemMetadata retSysmeta = CNodeService.getInstance().getSystemMetadata(session, guid);
141
			// check it
142
			assertEquals(sysmeta.getIdentifier().getValue(), retSysmeta.getIdentifier().getValue());
143
        } catch(Exception e) {
144
            fail("Unexpected error: " + e.getMessage());
145
        }
146
	}
147
	
148
	public void testGetLogRecords() {
149
	    printTestHeader("testGetLogRecords");
150
	    try {
151

    
152
		    Session session = getTestSession();
153
		    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
154
		    Date fromDate = sdf.parse("2010-01-01");
155
		    Date toDate = new Date();
156
		    Event event = Event.CREATE;
157
		    int start = 0;
158
		    int count = 1;
159
	    
160
		    Log log = CNodeService.getInstance().getLogRecords(session, fromDate, toDate, 
161
		    	event, start, count);
162
		    assertNotNull(log);
163
		    assertTrue(log.getCount() == count);
164
		    assertTrue(log.getStart() == start);
165
		    assertTrue(log.getTotal() > 0);
166
	    } catch (Exception e) {
167
		    e.printStackTrace();
168
		    fail("Unexpected error: " + e.getMessage());
169
	    } 
170
	}
171
	
172
	public void testCreate() {
173
	    printTestHeader("testCreate");
174

    
175
	    try {
176
            Session session = getTestSession();
177
			Identifier guid = new Identifier();
178
			guid.setValue("testCreate." + System.currentTimeMillis());
179
			InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
180
			SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
181
			Identifier pid = CNodeService.getInstance().create(session, guid, object, sysmeta);
182
			assertEquals(guid, pid);
183
        } catch(Exception e) {
184
        	e.printStackTrace();
185
            fail("Unexpected error: " + e.getMessage());
186
        }
187
	}
188
	
189
	public void testGet() {
190
	    printTestHeader("testGet");
191

    
192
	    try {
193
            Session session = getTestSession();
194
			Identifier guid = new Identifier();
195
			guid.setValue("testGet." + System.currentTimeMillis());
196
			InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
197
			SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
198
			Identifier pid = CNodeService.getInstance().create(session, guid, object, sysmeta);
199
			assertEquals(guid, pid);
200
			// get it
201
			InputStream retObject = CNodeService.getInstance().get(session, pid);
202
			// check it
203
			object.reset();
204
			assertTrue(IOUtils.contentEquals(object, retObject));
205
        } catch(Exception e) {
206
        	e.printStackTrace();
207
            fail("Unexpected error: " + e.getMessage());
208
        }
209
	}
210
	
211
	public void testAssertRelation() {
212
	    printTestHeader("testAssertRelation");
213

    
214
	    try {
215
            Session session = getTestSession();
216
			Identifier guid = new Identifier();
217
			guid.setValue("testAssertRelation." + System.currentTimeMillis());
218
			SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), null);
219
			Identifier describePid = new Identifier();
220
			describePid.setValue("describePid." + System.currentTimeMillis());
221
			//sysmeta.addDescribe(describePid);
222
			// save it
223
			boolean result = CNodeService.getInstance().registerSystemMetadata(session, guid, sysmeta);
224
			assertTrue(result);
225
			// save the other
226
			SystemMetadata describeSysmeta = createSystemMetadata(describePid, session.getSubject(), null);
227
			result = CNodeService.getInstance().registerSystemMetadata(session, describePid, describeSysmeta);
228
			assertTrue(result);
229
			// check it
230
			result = CNodeService.getInstance().assertRelation(session, guid, "describes", describePid);
231
			assertTrue(result);
232
        } catch(Exception e) {
233
        	e.printStackTrace();
234
            fail("Unexpected error: " + e.getMessage());
235
        }
236
	}
237
	
238
	public void testChecksum() {
239
	    printTestHeader("testChecksum");
240

    
241
	    try {
242
            Session session = getTestSession();
243
			Identifier guid = new Identifier();
244
			guid.setValue("testChecksum." + System.currentTimeMillis());
245
			SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), null);
246
			// save it
247
			boolean result = CNodeService.getInstance().registerSystemMetadata(session, guid, sysmeta);
248
			assertTrue(result);
249
			// check it
250
			Checksum checksum = CNodeService.getInstance().getChecksum(session, guid);
251
			assertEquals(sysmeta.getChecksum().getValue(), checksum.getValue());
252
        } catch(Exception e) {
253
            fail("Unexpected error: " + e.getMessage());
254
        }
255
	}
256
	
257
	public void testListNodes() {
258
	    printTestHeader("testListNodes");
259

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

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

    
292
	    try {
293
            Session session = getTestSession();
294
			Identifier guid = new Identifier();
295
			guid.setValue("testSearch." + System.currentTimeMillis());
296
			SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), null);
297
			
298
			// save it
299
			boolean result = CNodeService.getInstance().registerSystemMetadata(session, guid, sysmeta);
300
			assertTrue(result);
301
			// search for it
302
			ObjectList objectList = CNodeService.getInstance().search(session, null, null);
303
			// check it
304
			assertNotNull(objectList);
305
			result = false;
306
			for (ObjectInfo objectInfo: objectList.getObjectInfoList()) {
307
				Identifier pid = objectInfo.getIdentifier();
308
				if (pid.getValue().equals(guid.getValue())) {
309
					result = true;
310
					break;
311
				}
312
			}
313
			assertTrue(result);
314
        } catch(Exception e) {
315
            fail("Unexpected error: " + e.getMessage());
316
        }
317
	}
318
	
319
	public void testSetOwner() {
320
	    printTestHeader("testSetOwner");
321

    
322
	    try {
323
            Session session = getTestSession();
324
			Identifier guid = new Identifier();
325
			guid.setValue("testSetOwner." + System.currentTimeMillis());
326
			SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), null);
327
			// save it
328
			boolean result = CNodeService.getInstance().registerSystemMetadata(session, guid, sysmeta);
329
			assertTrue(result);
330
			Subject rightsHolder = new Subject();
331
			rightsHolder.setValue("newUser");
332
			// set it
333
			Identifier retPid = CNodeService.getInstance().setOwner(session, guid, rightsHolder);
334
			assertEquals(guid, retPid);
335
			// get it
336
			sysmeta = CNodeService.getInstance().getSystemMetadata(session, guid);
337
			assertNotNull(sysmeta);
338
			// check it
339
			assertEquals(rightsHolder.getValue(), sysmeta.getRightsHolder().getValue());
340
			
341
        } catch(Exception e) {
342
            fail("Unexpected error: " + e.getMessage());
343
        }
344
	}
345
	
346
	public void testSetAccessPolicy() {
347
	    printTestHeader("testSetAccessPolicy");
348

    
349
	    try {
350
            Session session = getTestSession();
351
			Identifier guid = new Identifier();
352
			guid.setValue("testSetAccessPolicy." + System.currentTimeMillis());
353
			SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), null);
354
			// save it
355
			boolean result = CNodeService.getInstance().registerSystemMetadata(session, guid, sysmeta);
356
			assertTrue(result);
357
			AccessPolicy accessPolicy = new AccessPolicy();
358
			AccessRule accessRule = new AccessRule();
359
			accessRule.addPermission(Permission.WRITE);
360
			Subject publicSubject = new Subject();
361
			publicSubject.setValue(Constants.PUBLIC_SUBJECT);
362
			accessRule.addSubject(publicSubject);
363
			accessPolicy.addAllow(accessRule);
364
			// set it
365
			result = CNodeService.getInstance().setAccessPolicy(session, guid, accessPolicy );
366
			assertTrue(result);
367
			// check it
368
			result = CNodeService.getInstance().isAuthorized(session, guid, Permission.WRITE);
369
			assertTrue(result);
370
        } catch(Exception e) {
371
            fail("Unexpected error: " + e.getMessage());
372
        }
373
	}
374
	
375
	public void testIsAuthorized() {
376
	    printTestHeader("testIsAuthorized");
377

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

    
410
	    try {
411
            Session session = getTestSession();
412
			Identifier guid = new Identifier();
413
			guid.setValue("testReplicationPolicy." + System.currentTimeMillis());
414
			SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), null);
415
			// save it
416
			boolean result = CNodeService.getInstance().registerSystemMetadata(session, guid, sysmeta);
417
			assertTrue(result);
418
			
419
			ReplicationPolicy policy = new ReplicationPolicy();
420
			NodeReference node = new NodeReference();
421
			node.setValue("testNode");
422
			policy.addPreferredMemberNode(node );
423
			// set it
424
			result = CNodeService.getInstance().setReplicationPolicy(session, guid, policy);
425
			assertTrue(result);
426
			// get it
427
			sysmeta = CNodeService.getInstance().getSystemMetadata(session, guid);
428
			assertNotNull(sysmeta);
429
			// check it
430
			assertEquals(policy.getPreferredMemberNode(0).getValue(), sysmeta.getReplicationPolicy().getPreferredMemberNode(0).getValue());
431
			
432
        } catch(Exception e) {
433
            fail("Unexpected error: " + e.getMessage());
434
        }
435
	}
436
	
437
	public void testReplicationStatus() {
438
	    printTestHeader("testReplicationStatus");
439

    
440
	    try {
441
            Session session = getTestSession();
442
			Identifier guid = new Identifier();
443
			guid.setValue("testReplicationStatus." + System.currentTimeMillis());
444
			SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), null);
445
			Replica replica = new Replica();
446
			NodeReference replicaMemberNode = new NodeReference();
447
			replicaMemberNode.setValue("testNode");
448
			replica.setReplicationStatus(ReplicationStatus.REQUESTED);
449
			replica.setReplicaMemberNode(replicaMemberNode);
450
			replica.setReplicaVerified(new Date());
451
			sysmeta.addReplica(replica );
452
			// save it
453
			boolean result = CNodeService.getInstance().registerSystemMetadata(session, guid, sysmeta);
454
			assertTrue(result);
455
			// set it
456
			ReplicationStatus status = ReplicationStatus.COMPLETED;
457
			result = CNodeService.getInstance().setReplicationStatus(session, guid, status);
458
			assertTrue(result);
459
			// get it
460
			sysmeta = CNodeService.getInstance().getSystemMetadata(session, guid);
461
			assertNotNull(sysmeta);
462
			// check it
463
			assertEquals(status, sysmeta.getReplica(0).getReplicationStatus());
464
			
465
        } catch(Exception e) {
466
            fail("Unexpected error: " + e.getMessage());
467
        }
468
	}
469
	
470
	/**
471
	 * Run an initial test that always passes to check that the test harness is
472
	 * working.
473
	 */
474
	public void initialize() 
475
	{
476
	    printTestHeader("initialize");
477
		assertTrue(1 == 1);
478
	}
479
	
480

    
481
	/**
482
	 * test to list the object formats registered in metacat
483
	 */
484
	public void testListFormats() {
485
		
486
    printTestHeader("testListFormats");
487
    
488
    // make sure we are set up
489
    setUpFormats();
490
    
491
    // there should be at least 59 formats in the list
492
  	int formatsCount = 59;
493
  	ObjectFormatList objectFormatList;
494
  	
495
  	try {
496
	    objectFormatList = CNodeService.getInstance().listFormats();
497
	  	assertTrue(objectFormatList.getTotal() >= formatsCount);
498
  	
499
  	} catch (InvalidRequest e) {
500
  		fail("Could not get the object format list: " + e.getMessage());
501
    
502
  	} catch (ServiceFailure e) {
503
  		fail("Could not get the object format list: " + e.getMessage());
504

    
505
    } catch (NotFound e) {
506
  		fail("Could not get the object format list: " + e.getMessage());
507

    
508
    } catch (InsufficientResources e) {
509
  		fail("Could not get the object format list: " + e.getMessage());
510

    
511
    } catch (NotImplemented e) {
512
  		fail("Could not get the object format list: " + e.getMessage());
513

    
514
    }
515
    
516
	}
517
	
518
  /**
519
   * Test getting a single object format from the registered list
520
   */
521
  public void testGetFormat() {
522
  	
523
    printTestHeader("testGetFormat");
524

    
525
    // make sure we are set up
526
    setUpFormats();
527
    
528
    String knownFormat = "text/plain";
529
    ObjectFormatIdentifier fmtid = new ObjectFormatIdentifier();
530
    fmtid.setValue(knownFormat);
531
  	
532
    try {
533
	    
534
			String result = 
535
				CNodeService.getInstance().getFormat(fmtid).getFmtid().getValue();
536
	  	System.out.println("Expected result: " + knownFormat);
537
	  	System.out.println("Found    result: " + result);
538
	  	assertTrue(result.equals(knownFormat));
539
  
540
    } catch (NullPointerException npe) {	  
541
	    fail("The returned format was null: " + npe.getMessage());
542
    
543
    } catch (NotFound nfe) {     
544
    	fail("The format " + knownFormat + " was not found: " + nfe.getMessage());
545
    	
546
    } catch (InvalidRequest ire) {
547
    	fail("The format " + knownFormat + " was not found: " + ire.getMessage());
548

    
549
    } catch (ServiceFailure sfe) {
550
    	fail("The format " + knownFormat + " was not found: " + sfe.getMessage());
551

    
552
    } catch (InsufficientResources ise) {
553
    	fail("The format " + knownFormat + " was not found: " + ise.getMessage());
554
 
555
    } catch (NotImplemented nie) {
556
    	fail("The getFormat() method has not been implemented: " + nie.getMessage());
557

    
558
    }
559
  	
560
  }
561
	
562
  /**
563
   * Test getting a non-existent object format, returning NotFound
564
   */
565
  public void testObjectFormatNotFoundException() {
566
  
567
    printTestHeader("testObjectFormatNotFoundException");
568

    
569
    ObjectFormatIdentifier fmtid = new ObjectFormatIdentifier();
570
  	String badFormat = "text/bad-format";
571
  	fmtid.setValue(badFormat);
572
  	
573
  	try {
574
  		
575
	    ObjectFormat objectFormat = 
576
	    	CNodeService.getInstance().getFormat(fmtid);
577
      
578
  	} catch (Exception e) {
579
	    
580
  		assertTrue(e instanceof NotFound);
581
  	}
582
  	
583
  }
584
 
585
}
(1-1/6)