Project

General

Profile

1 6309 cjones
/**
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 6338 cjones
29 6309 cjones
import java.io.ByteArrayInputStream;
30 6942 cjones
import java.io.ByteArrayOutputStream;
31
import java.io.IOException;
32 6309 cjones
import java.io.InputStream;
33
import java.io.UnsupportedEncodingException;
34 6326 leinfelder
import java.text.SimpleDateFormat;
35 7040 cjones
import java.util.ArrayList;
36 6312 cjones
import java.util.Calendar;
37 6309 cjones
import java.util.Date;
38 7040 cjones
import java.util.List;
39 6309 cjones
40
import junit.framework.Test;
41
import junit.framework.TestSuite;
42
43 6324 leinfelder
import org.apache.commons.io.IOUtils;
44 6348 leinfelder
import org.dataone.configuration.Settings;
45 6942 cjones
import org.dataone.service.util.TypeMarshaller;
46 6309 cjones
import org.dataone.service.exceptions.IdentifierNotUnique;
47
import org.dataone.service.exceptions.InsufficientResources;
48
import org.dataone.service.exceptions.InvalidRequest;
49
import org.dataone.service.exceptions.InvalidSystemMetadata;
50
import org.dataone.service.exceptions.InvalidToken;
51
import org.dataone.service.exceptions.NotAuthorized;
52
import org.dataone.service.exceptions.NotFound;
53
import org.dataone.service.exceptions.NotImplemented;
54
import org.dataone.service.exceptions.ServiceFailure;
55 6333 leinfelder
import org.dataone.service.exceptions.SynchronizationFailed;
56 6309 cjones
import org.dataone.service.exceptions.UnsupportedType;
57 6366 leinfelder
import org.dataone.service.types.v1.AccessPolicy;
58
import org.dataone.service.types.v1.AccessRule;
59
import org.dataone.service.types.v1.Checksum;
60
import org.dataone.service.types.v1.DescribeResponse;
61
import org.dataone.service.types.v1.Event;
62
import org.dataone.service.types.v1.Identifier;
63
import org.dataone.service.types.v1.Log;
64
import org.dataone.service.types.v1.MonitorList;
65
import org.dataone.service.types.v1.Node;
66
import org.dataone.service.types.v1.NodeReference;
67
import org.dataone.service.types.v1.ObjectFormatIdentifier;
68
import org.dataone.service.types.v1.ObjectList;
69
import org.dataone.service.types.v1.Permission;
70 7040 cjones
import org.dataone.service.types.v1.Person;
71 6366 leinfelder
import org.dataone.service.types.v1.Session;
72
import org.dataone.service.types.v1.Subject;
73 7040 cjones
import org.dataone.service.types.v1.SubjectInfo;
74 6366 leinfelder
import org.dataone.service.types.v1.SystemMetadata;
75 6942 cjones
import org.jibx.runtime.JiBXException;
76 6309 cjones
import org.junit.After;
77
import org.junit.Before;
78
79
/**
80
 * A JUnit test to exercise the Metacat Member Node service implementation.
81
 * This also tests a few of the D1NodeService superclass methods
82
 *
83
 * @author cjones
84
 *
85
 */
86 6324 leinfelder
public class MNodeServiceTest extends D1NodeServiceTest {
87 6309 cjones
88 6354 cjones
  /**
89
   * Set up the test fixtures
90
   *
91
   * @throws Exception
92
   */
93
  @Before
94
  public void setUp() throws Exception {
95
    super.setUp();
96
    // set up the configuration for d1client
97
    Settings.getConfiguration().setProperty("D1Client.cnClassName", MockCNode.class.getName());
98
  }
99 6309 cjones
100 6354 cjones
  /**
101
   * Remove the test fixtures
102
   */
103
  @After
104
  public void tearDown() {
105
  }
106
107
  /**
108
   * Build the test suite
109
   * @return
110
   */
111
  public static Test suite() {
112
113
    TestSuite suite = new TestSuite();
114 6309 cjones
    suite.addTest(new MNodeServiceTest("initialize"));
115
    // MNStorage tests
116 7160 leinfelder
    suite.addTest(new MNodeServiceTest("testCreate"));
117 7816 leinfelder
    suite.addTest(new MNodeServiceTest("testCreateInvalidIdentifier"));
118 7160 leinfelder
    suite.addTest(new MNodeServiceTest("testUpdate"));
119 7161 leinfelder
    // this requires MN certificate
120 7163 leinfelder
    suite.addTest(new MNodeServiceTest("testDelete"));
121 7161 leinfelder
122 7160 leinfelder
    // MNRead tests
123
    suite.addTest(new MNodeServiceTest("testGet"));
124
    suite.addTest(new MNodeServiceTest("testGetChecksum"));
125
    suite.addTest(new MNodeServiceTest("testGetSystemMetadata"));
126
    suite.addTest(new MNodeServiceTest("testDescribe"));
127
    suite.addTest(new MNodeServiceTest("testListObjects"));
128 7161 leinfelder
    // this requires CN certificate
129 7164 leinfelder
    suite.addTest(new MNodeServiceTest("testSynchronizationFailed"));
130 7161 leinfelder
131 7160 leinfelder
    // MNCore tests
132
    suite.addTest(new MNodeServiceTest("testPing"));
133
    suite.addTest(new MNodeServiceTest("testGetLogRecords"));
134
    suite.addTest(new MNodeServiceTest("testGetOperationStatistics"));
135
    suite.addTest(new MNodeServiceTest("testGetCapabilities"));
136
    // include these when they are part of the MN interface definitions
137
    // suite.addTest(new MNodeServiceTest("testGetObjectStatistics"));
138
    // suite.addTest(new MNodeServiceTest("testGetStatus"));
139
    // MNAuthorization tests
140
    suite.addTest(new MNodeServiceTest("testIsAuthorized"));
141 7040 cjones
    suite.addTest(new MNodeServiceTest("testIsEquivIdentityAuthorized"));
142 7160 leinfelder
    suite.addTest(new MNodeServiceTest("testSetAccessPolicy"));
143
    // MNreplication tests
144
    suite.addTest(new MNodeServiceTest("testReplicate"));
145 6309 cjones
146 6354 cjones
147
    return suite;
148
149
  }
150
151
  /**
152
   * Constructor for the tests
153
   *
154
   * @param name - the name of the test
155
   */
156
  public MNodeServiceTest(String name) {
157
    super(name);
158
159
  }
160 6309 cjones
161 6354 cjones
  /**
162
   * Initial blank test
163
   */
164
  public void initialize() {
165
    assertTrue(1 == 1);
166
167
  }
168
169
  /**
170
   * Test getting a known object
171
   */
172
  public void testGet() {
173 6309 cjones
    printTestHeader("testGet");
174
175 6354 cjones
    try {
176
      Session session = getTestSession();
177
      Identifier guid = new Identifier();
178
      guid.setValue("testGet." + System.currentTimeMillis());
179
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
180
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
181 6542 leinfelder
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
182
      InputStream result = MNodeService.getInstance(request).get(session, guid);
183 6354 cjones
      // go back to beginning of original stream
184
      object.reset();
185
      // check
186
      assertTrue(object.available() > 0);
187
      assertTrue(result.available() > 0);
188
      assertTrue(IOUtils.contentEquals(result, object));
189
190 6309 cjones
    } catch (UnsupportedEncodingException e) {
191 6354 cjones
      e.printStackTrace();
192
      fail("Unexpected error: " + e.getMessage());
193 6309 cjones
194
    } catch (InvalidToken e) {
195 6354 cjones
      e.printStackTrace();
196
      fail("Unexpected error: " + e.getMessage());
197
198 6309 cjones
    } catch (ServiceFailure e) {
199 6354 cjones
      e.printStackTrace();
200
      fail("Unexpected error: " + e.getMessage());
201
202 6309 cjones
    } catch (NotAuthorized e) {
203 6354 cjones
      e.printStackTrace();
204
      fail("Unexpected error: " + e.getMessage());
205
206 6309 cjones
    } catch (IdentifierNotUnique e) {
207 6354 cjones
      e.printStackTrace();
208
      fail("Unexpected error: " + e.getMessage());
209
210 6309 cjones
    } catch (UnsupportedType e) {
211 6354 cjones
      e.printStackTrace();
212
      fail("Unexpected error: " + e.getMessage());
213
214 6309 cjones
    } catch (InsufficientResources e) {
215 6354 cjones
      e.printStackTrace();
216
      fail("Unexpected error: " + e.getMessage());
217
218 6309 cjones
    } catch (InvalidSystemMetadata e) {
219 6354 cjones
      e.printStackTrace();
220
      fail("Unexpected error: " + e.getMessage());
221
222 6309 cjones
    } catch (NotImplemented e) {
223 6354 cjones
      e.printStackTrace();
224
      fail("Unexpected error: " + e.getMessage());
225
226 6309 cjones
    } catch (InvalidRequest e) {
227 6354 cjones
      e.printStackTrace();
228
      fail("Unexpected error: " + e.getMessage());
229
230 6309 cjones
    } catch (NotFound e) {
231 6354 cjones
      e.printStackTrace();
232
      fail("Unexpected error: " + e.getMessage());
233
234 6309 cjones
    } catch (Exception e) {
235 6354 cjones
      e.printStackTrace();
236
      fail("Unexpected error: " + e.getMessage());
237
238 6309 cjones
    }
239
240 6354 cjones
  }
241 6309 cjones
242 6354 cjones
  /**
243
   * Test getting the system metadata of an object
244
   */
245
  public void testGetSystemMetadata() {
246 6309 cjones
    printTestHeader("testGetSystemMetadata");
247
248
    try {
249 6354 cjones
      Session session = getTestSession();
250
      Identifier guid = new Identifier();
251
      guid.setValue("testGetSystemMetadata." + System.currentTimeMillis());
252
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
253
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
254 6542 leinfelder
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
255
      SystemMetadata newsysmeta = MNodeService.getInstance(request).getSystemMetadata(session, pid);
256 6354 cjones
      assertEquals(newsysmeta.getIdentifier().getValue(), sysmeta.getIdentifier().getValue());
257
258 6309 cjones
    } catch (UnsupportedEncodingException e) {
259 6354 cjones
      e.printStackTrace();
260
      fail("Unexpected error: " + e.getMessage());
261 6309 cjones
262
    } catch (InvalidToken e) {
263 6354 cjones
      e.printStackTrace();
264
      fail("Unexpected error: " + e.getMessage());
265 6309 cjones
266
    } catch (ServiceFailure e) {
267 6354 cjones
      e.printStackTrace();
268
      fail("Unexpected error: " + e.getMessage());
269 6309 cjones
270
    } catch (NotAuthorized e) {
271 6354 cjones
      e.printStackTrace();
272
      fail("Unexpected error: " + e.getMessage());
273 6309 cjones
274
    } catch (IdentifierNotUnique e) {
275 6354 cjones
      e.printStackTrace();
276
      fail("Unexpected error: " + e.getMessage());
277
278 6309 cjones
    } catch (UnsupportedType e) {
279 6354 cjones
      e.printStackTrace();
280
      fail("Unexpected error: " + e.getMessage());
281 6309 cjones
282
    } catch (InsufficientResources e) {
283 6354 cjones
      e.printStackTrace();
284
      fail("Unexpected error: " + e.getMessage());
285 6309 cjones
286
    } catch (InvalidSystemMetadata e) {
287 6354 cjones
      e.printStackTrace();
288
      fail("Unexpected error: " + e.getMessage());
289 6309 cjones
290
    } catch (NotImplemented e) {
291 6354 cjones
      e.printStackTrace();
292
      fail("Unexpected error: " + e.getMessage());
293 6309 cjones
294
    } catch (InvalidRequest e) {
295 6354 cjones
      e.printStackTrace();
296
      fail("Unexpected error: " + e.getMessage());
297 6309 cjones
298
    } catch (NotFound e) {
299 6354 cjones
      e.printStackTrace();
300
      fail("Unexpected error: " + e.getMessage());
301 6309 cjones
302
    } catch (Exception e) {
303 6354 cjones
      e.printStackTrace();
304
      fail("Unexpected error: " + e.getMessage());
305 6309 cjones
306
    }
307
308 6354 cjones
  }
309 6309 cjones
310 6354 cjones
  /**
311
   * Test object creation
312
   */
313
  public void testCreate() {
314 6309 cjones
    printTestHeader("testCreate");
315
316 6354 cjones
    try {
317
      Session session = getTestSession();
318
      Identifier guid = new Identifier();
319
      guid.setValue("testCreate." + System.currentTimeMillis());
320
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
321
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
322 6542 leinfelder
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
323 6354 cjones
      assertEquals(guid.getValue(), pid.getValue());
324 6309 cjones
    } catch (UnsupportedEncodingException e) {
325 6354 cjones
      e.printStackTrace();
326
      fail("Unexpected error: " + e.getMessage());
327 6309 cjones
328
    } catch (InvalidToken e) {
329 6354 cjones
      e.printStackTrace();
330
      fail("Unexpected error: " + e.getMessage());
331 6309 cjones
332
    } catch (ServiceFailure e) {
333 6354 cjones
      e.printStackTrace();
334
      fail("Unexpected error: " + e.getMessage());
335 6309 cjones
336
    } catch (NotAuthorized e) {
337 6354 cjones
      e.printStackTrace();
338
      fail("Unexpected error: " + e.getMessage());
339 6309 cjones
340
    } catch (IdentifierNotUnique e) {
341 6354 cjones
      e.printStackTrace();
342
      fail("Unexpected error: " + e.getMessage());
343 6309 cjones
344
    } catch (UnsupportedType e) {
345 6354 cjones
      e.printStackTrace();
346
      fail("Unexpected error: " + e.getMessage());
347 6309 cjones
348
    } catch (InsufficientResources e) {
349 6354 cjones
      e.printStackTrace();
350
      fail("Unexpected error: " + e.getMessage());
351 6309 cjones
352
    } catch (InvalidSystemMetadata e) {
353 6354 cjones
      e.printStackTrace();
354
      fail("Unexpected error: " + e.getMessage());
355 6309 cjones
356
    } catch (NotImplemented e) {
357 6354 cjones
      e.printStackTrace();
358
      fail("Unexpected error: " + e.getMessage());
359 6309 cjones
360
    } catch (InvalidRequest e) {
361 6354 cjones
      e.printStackTrace();
362
      fail("Unexpected error: " + e.getMessage());
363 6309 cjones
364
    } catch (Exception e) {
365 6354 cjones
      e.printStackTrace();
366
      fail("Unexpected error: " + e.getMessage());
367 6309 cjones
368
    }
369
370
  }
371
372 6354 cjones
  /**
373
   * test object deletion
374
   */
375
  public void testDelete() {
376 6309 cjones
    printTestHeader("testDelete");
377
378 6354 cjones
    try {
379
      Session session = getTestSession();
380
      Identifier guid = new Identifier();
381
      guid.setValue("testDelete." + System.currentTimeMillis());
382
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
383
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
384 6542 leinfelder
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
385 7163 leinfelder
386
      // use MN admin to delete
387
      session = getMNSession();
388 6542 leinfelder
      Identifier deletedPid = MNodeService.getInstance(request).delete(session, pid);
389 6333 leinfelder
      assertEquals(pid.getValue(), deletedPid.getValue());
390 7160 leinfelder
      // check that we cannot get the object
391 7163 leinfelder
      session = getTestSession();
392 7160 leinfelder
      InputStream deletedObject = null;
393
      try {
394 7163 leinfelder
    	  deletedObject = MNodeService.getInstance(request).get(session, deletedPid);
395 7160 leinfelder
      } catch (NotFound nf) {
396
    	  // this is expected
397
      }
398
	  assertNull(deletedObject);
399 6309 cjones
400 6354 cjones
    } catch (UnsupportedEncodingException e) {
401
      e.printStackTrace();
402
403 6324 leinfelder
    } catch (Exception e) {
404 6354 cjones
      e.printStackTrace();
405
      fail("Unexpected error: " + e.getMessage());
406 6309 cjones
407 6324 leinfelder
    }
408 6309 cjones
409 6354 cjones
  }
410 6309 cjones
411 6354 cjones
  /**
412
   * Test object updating
413
   */
414
  public void testUpdate() {
415 6309 cjones
    printTestHeader("testUpdate");
416
417 6354 cjones
    try {
418
      Session session = getTestSession();
419
      Identifier guid = new Identifier();
420
      guid.setValue("testUpdate." + System.currentTimeMillis());
421
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
422
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
423
      Identifier newPid = new Identifier();
424 6596 leinfelder
      newPid.setValue("testUpdate." + (System.currentTimeMillis() + 1)); // ensure it is different from original
425 6354 cjones
      Identifier pid =
426 6542 leinfelder
        MNodeService.getInstance(request).create(session, guid, object, sysmeta);
427 6338 cjones
428 6354 cjones
      SystemMetadata newSysMeta = createSystemMetadata(newPid, session.getSubject(), object);
429
430
      // do the update
431
      Identifier updatedPid =
432 6542 leinfelder
        MNodeService.getInstance(request).update(session, pid, object, newPid, newSysMeta);
433 6338 cjones
434 6354 cjones
      // get the updated system metadata
435 6338 cjones
      SystemMetadata updatedSysMeta =
436 6542 leinfelder
        MNodeService.getInstance(request).getSystemMetadata(session, updatedPid);
437 6338 cjones
438 6354 cjones
      assertEquals(updatedPid.getValue(), newPid.getValue());
439 6366 leinfelder
//      assertTrue(updatedSysMeta.getObsolete(0).getValue().equals(pid.getValue()));
440
//      assertTrue(updatedSysMeta.getDerivedFrom(0).getValue().equals(pid.getValue()));
441 6354 cjones
442 6309 cjones
    } catch (UnsupportedEncodingException e) {
443 6354 cjones
      e.printStackTrace();
444
      fail("Unexpected error: " + e.getMessage());
445 6309 cjones
446
    } catch (InvalidToken e) {
447 6354 cjones
      e.printStackTrace();
448
      fail("Unexpected error: " + e.getMessage());
449 6309 cjones
450
    } catch (ServiceFailure e) {
451 6354 cjones
      e.printStackTrace();
452
      fail("Unexpected error: " + e.getMessage());
453 6309 cjones
454
    } catch (NotAuthorized e) {
455 6354 cjones
      e.printStackTrace();
456
      fail("Unexpected error: " + e.getMessage());
457 6309 cjones
458
    } catch (IdentifierNotUnique e) {
459 6354 cjones
      e.printStackTrace();
460
      fail("Unexpected error: " + e.getMessage());
461 6309 cjones
462
    } catch (UnsupportedType e) {
463 6354 cjones
      e.printStackTrace();
464
      fail("Unexpected error: " + e.getMessage());
465 6309 cjones
466
    } catch (InsufficientResources e) {
467 6354 cjones
      e.printStackTrace();
468
      fail("Unexpected error: " + e.getMessage());
469 6309 cjones
470
    } catch (InvalidSystemMetadata e) {
471 6354 cjones
      e.printStackTrace();
472
      fail("Unexpected error: " + e.getMessage());
473 6309 cjones
474
    } catch (NotImplemented e) {
475 6354 cjones
      e.printStackTrace();
476
      fail("Unexpected error: " + e.getMessage());
477 6309 cjones
478
    } catch (InvalidRequest e) {
479 6354 cjones
      e.printStackTrace();
480
      fail("Unexpected error: " + e.getMessage());
481 6309 cjones
482
    } catch (Exception e) {
483 6354 cjones
      e.printStackTrace();
484
      fail("Unexpected error: " + e.getMessage());
485 6309 cjones
486
    }
487 6354 cjones
  }
488 6309 cjones
489 6354 cjones
  /**
490
   * We currently expect this unit test to fail because it should rely on a different member node
491
   * to retrieve the object from. Currently it gets the object from itself and throws
492
   * and expected error for duplicate entry.
493
   *
494
   */
495
  public void testReplicate() {
496
      printTestHeader("testReplicate");
497
      try {
498
        Session session = getTestSession();
499
        Identifier guid = new Identifier();
500
        guid.setValue("testReplicate." + System.currentTimeMillis());
501
        InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
502
        SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
503
        // save locally
504 6542 leinfelder
        Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
505 6354 cjones
        // get our node reference (attempting to replicate with self)
506 6542 leinfelder
        NodeReference sourceNode = MNodeService.getInstance(request).getCapabilities().getIdentifier();
507 6354 cjones
        // attempt to replicate with ourselves -- this should fail!
508
      boolean result = false;
509
      try {
510 6542 leinfelder
        result = MNodeService.getInstance(request).replicate(session, sysmeta, sourceNode);
511 6354 cjones
      } catch (Exception inu) {
512
        // we are expecting this to fail since we already have the doc
513
        result = true;
514
      }
515
      assertTrue(result);
516
      } catch (Exception e) {
517
        e.printStackTrace();
518
      fail("Probably not yet implemented: " + e.getMessage());
519
    }
520
  }
521 6309 cjones
522 6354 cjones
  /**
523
   * Test describing an object
524
   */
525
  public void testDescribe() {
526 6314 cjones
    printTestHeader("testDescribe");
527 6309 cjones
528
    try {
529 6354 cjones
      Session session = getTestSession();
530
      Identifier guid = new Identifier();
531
      guid.setValue("testGetSystemMetadata." + System.currentTimeMillis());
532
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
533
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
534 6542 leinfelder
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
535
      DescribeResponse describeResponse = MNodeService.getInstance(request).describe(session, pid);
536 6354 cjones
      assertEquals(describeResponse.getDataONE_Checksum().getValue(), sysmeta.getChecksum().getValue());
537 6597 leinfelder
      assertEquals(describeResponse.getDataONE_ObjectFormatIdentifier().getValue(), sysmeta.getFormatId().getValue());
538 6354 cjones
539 6309 cjones
    } catch (UnsupportedEncodingException e) {
540 6354 cjones
      e.printStackTrace();
541
      fail("Unexpected error: " + e.getMessage());
542 6309 cjones
543
    } catch (InvalidToken e) {
544 6354 cjones
      e.printStackTrace();
545
      fail("Unexpected error: " + e.getMessage());
546 6309 cjones
547
    } catch (ServiceFailure e) {
548 6354 cjones
      e.printStackTrace();
549
      fail("Unexpected error: " + e.getMessage());
550 6309 cjones
551
    } catch (NotAuthorized e) {
552 6354 cjones
      e.printStackTrace();
553
      fail("Unexpected error: " + e.getMessage());
554 6309 cjones
555
    } catch (IdentifierNotUnique e) {
556 6354 cjones
      e.printStackTrace();
557
      fail("Unexpected error: " + e.getMessage());
558
559 6309 cjones
    } catch (UnsupportedType e) {
560 6354 cjones
      e.printStackTrace();
561
      fail("Unexpected error: " + e.getMessage());
562 6309 cjones
563
    } catch (InsufficientResources e) {
564 6354 cjones
      e.printStackTrace();
565
      fail("Unexpected error: " + e.getMessage());
566 6309 cjones
567
    } catch (InvalidSystemMetadata e) {
568 6354 cjones
      e.printStackTrace();
569
      fail("Unexpected error: " + e.getMessage());
570 6309 cjones
571
    } catch (NotImplemented e) {
572 6354 cjones
      e.printStackTrace();
573
      fail("Unexpected error: " + e.getMessage());
574 6309 cjones
575
    } catch (InvalidRequest e) {
576 6354 cjones
      e.printStackTrace();
577
      fail("Unexpected error: " + e.getMessage());
578 6309 cjones
579
    } catch (NotFound e) {
580 6354 cjones
      e.printStackTrace();
581
      fail("Unexpected error: " + e.getMessage());
582 6309 cjones
583
    } catch (Exception e) {
584 6354 cjones
      e.printStackTrace();
585
      fail("Unexpected error: " + e.getMessage());
586 6309 cjones
587
    }
588 6354 cjones
  }
589 6309 cjones
590 6354 cjones
  /**
591
   * Test getting the checksum of an object
592
   */
593
  public void testGetChecksum() {
594 6309 cjones
    printTestHeader("testGetChecksum");
595
596 6354 cjones
    try {
597
      Session session = getTestSession();
598
      Identifier guid = new Identifier();
599
      guid.setValue("testGetChecksum." + System.currentTimeMillis());
600
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
601
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
602 6542 leinfelder
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
603
      Checksum checksum = MNodeService.getInstance(request).getChecksum(session, pid, "MD5");
604 6354 cjones
      assertEquals(checksum.getValue(), sysmeta.getChecksum().getValue());
605 6309 cjones
606 6354 cjones
    } catch (UnsupportedEncodingException e) {
607
      e.printStackTrace();
608
      fail("Unexpected error: " + e.getMessage());
609 6309 cjones
610
    } catch (InvalidToken e) {
611 6354 cjones
      e.printStackTrace();
612
      fail("Unexpected error: " + e.getMessage());
613 6309 cjones
614
    } catch (ServiceFailure e) {
615 6354 cjones
      e.printStackTrace();
616
      fail("Unexpected error: " + e.getMessage());
617 6309 cjones
618
    } catch (NotAuthorized e) {
619 6354 cjones
      e.printStackTrace();
620
      fail("Unexpected error: " + e.getMessage());
621 6309 cjones
622
    } catch (IdentifierNotUnique e) {
623 6354 cjones
      e.printStackTrace();
624
      fail("Unexpected error: " + e.getMessage());
625 6309 cjones
626
    } catch (UnsupportedType e) {
627 6354 cjones
      e.printStackTrace();
628
      fail("Unexpected error: " + e.getMessage());
629 6309 cjones
630
    } catch (InsufficientResources e) {
631 6354 cjones
      e.printStackTrace();
632
      fail("Unexpected error: " + e.getMessage());
633 6309 cjones
634
    } catch (InvalidSystemMetadata e) {
635 6354 cjones
      e.printStackTrace();
636
      fail("Unexpected error: " + e.getMessage());
637 6309 cjones
638
    } catch (NotImplemented e) {
639 6354 cjones
      e.printStackTrace();
640
      fail("Unexpected error: " + e.getMessage());
641 6309 cjones
642
    } catch (InvalidRequest e) {
643 6354 cjones
      e.printStackTrace();
644
      fail("Unexpected error: " + e.getMessage());
645 6309 cjones
646
    } catch (NotFound e) {
647 6354 cjones
      e.printStackTrace();
648
      fail("Unexpected error: " + e.getMessage());
649 6309 cjones
650
    } catch (Exception e) {
651 6354 cjones
      e.printStackTrace();
652
      fail("Unexpected error: " + e.getMessage());
653 6309 cjones
654
    }
655 6354 cjones
656
  }
657 6309 cjones
658 6354 cjones
  /**
659
   * Testing listing objects on the Member Node
660
   */
661
  public void testListObjects() {
662
      printTestHeader("testListObjects");
663
664
      try {
665
666
        Session session = getTestSession();
667
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
668
        Date startTime = sdf.parse("2010-01-01");
669
        Date endTime = new Date();
670
        ObjectFormatIdentifier objectFormatId = null;
671
        boolean replicaStatus = false;
672
        int start = 0;
673
        int count = 1;
674
675
        // insert at least one object
676
        testCreate();
677
        // now check that we have at least one
678
        ObjectList objectList =
679 6542 leinfelder
          MNodeService.getInstance(request).listObjects(session, startTime, endTime,
680 6354 cjones
              objectFormatId, replicaStatus, start, count);
681
        assertNotNull(objectList);
682
        assertTrue(objectList.getCount() == count);
683
        assertTrue(objectList.getStart() == 0);
684
        assertTrue(objectList.getTotal() > 1);
685
686
      } catch (Exception e) {
687
        e.printStackTrace();
688
        fail("Unexpected error: " + e.getMessage());
689
690
      }
691
  }
692 6309 cjones
693 6354 cjones
  public void testGetCapabilities() {
694
      printTestHeader("testGetCapabilities");
695
    try {
696 6542 leinfelder
      Node node = MNodeService.getInstance(request).getCapabilities();
697 6942 cjones
      ByteArrayOutputStream baos = new ByteArrayOutputStream();
698
      TypeMarshaller.marshalTypeToOutputStream(node, baos);
699 6354 cjones
      assertNotNull(node);
700
      // TODO: should probably test other parts of the node information
701 6942 cjones
702
    } catch (JiBXException e) {
703
        e.printStackTrace();
704
        fail("The node instance couldn't be parsed correctly:" + e.getMessage());
705
706
    } catch (IOException e) {
707
        e.printStackTrace();
708
        fail("The node instance couldn't be read correctly:" + e.getMessage());
709
710 6354 cjones
    } catch (Exception e) {
711 6942 cjones
        e.printStackTrace();
712
        fail("Probably not yet implemented: " + e.getMessage());
713
714 6354 cjones
    }
715
716
  }
717 6309 cjones
718 6354 cjones
  public void testGetOperationStatistics() {
719
      printTestHeader("testGetOperationStatistics");
720
    try {
721 7261 leinfelder
      Session session = getCNSession();
722 6354 cjones
      SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
723
        Date startTime = sdf.parse("2010-01-01");
724
        Date endTime = new Date();
725
      MonitorList monitorList =
726 6542 leinfelder
        MNodeService.getInstance(request).getOperationStatistics(
727 6354 cjones
            session,
728
            startTime,
729
            endTime,
730
            session.getSubject(),
731
            Event.CREATE,
732
            null //formatId
733
            );
734
735
      assertNotNull(monitorList);
736
      // TODO: should probably test other parts of the information
737
    } catch (Exception e) {
738
      e.printStackTrace();
739
      fail("Probably not yet implemented: " + e.getMessage());
740
    }
741
  }
742 6309 cjones
743 6354 cjones
  public void testPing() {
744 6309 cjones
745 6354 cjones
    try {
746 6804 leinfelder
      Date mnDate = MNodeService.getInstance(request).ping();
747
      assertTrue(mnDate != null);
748 6354 cjones
749 6309 cjones
    } catch (NotImplemented e) {
750 6354 cjones
      e.printStackTrace();
751
      fail("Unexpected error: " + e.getMessage());
752 6309 cjones
753
    } catch (ServiceFailure e) {
754 6354 cjones
      e.printStackTrace();
755
      fail("Unexpected error: " + e.getMessage());
756 6309 cjones
757 6612 leinfelder
    }  catch (InsufficientResources e) {
758 6354 cjones
      e.printStackTrace();
759
      fail("Unexpected error: " + e.getMessage());
760 6309 cjones
761
    }
762 6354 cjones
763
  }
764 6309 cjones
765 6354 cjones
  public void testSynchronizationFailed() {
766
    printTestHeader("testSynchronizationFailed");
767
    try {
768
        Session session = getTestSession();
769
770
        // create the object
771
        Identifier pid = new Identifier();
772
        pid.setValue("testSynchronizationFailed." + System.currentTimeMillis());
773
        InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
774
        SystemMetadata sysmeta = createSystemMetadata(pid, session.getSubject(), object);
775 6542 leinfelder
        Identifier retPid = MNodeService.getInstance(request).create(session, pid, object, sysmeta);
776 6354 cjones
        assertEquals(retPid.getValue(), pid.getValue());
777
778 7163 leinfelder
        // pretend the sync failed, act as CN
779 6354 cjones
      SynchronizationFailed syncFailed =
780
        new SynchronizationFailed("0000", "Testing Synch Failure");
781 6366 leinfelder
      syncFailed.setPid(pid.getValue());
782 7163 leinfelder
      session = getCNSession();
783 6542 leinfelder
      MNodeService.getInstance(request).synchronizationFailed(session, syncFailed );
784 6354 cjones
    } catch (Exception e) {
785
      e.printStackTrace();
786
        fail("Unexpected error: " + e.getMessage());
787
    }
788 6333 leinfelder
789 6354 cjones
  }
790 6309 cjones
791 6605 cjones
  public void testSystemMetadataChanged() {
792
      printTestHeader("testSystemMetadataChanged");
793
      try {
794
          Session session = getTestSession();
795
796
          // create the object
797
          Identifier pid = new Identifier();
798
          pid.setValue("testSystemMetadataChanged." + System.currentTimeMillis());
799
          InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
800
          SystemMetadata sysmeta = createSystemMetadata(pid, session.getSubject(), object);
801
          Identifier retPid = MNodeService.getInstance(request).create(session, pid, object, sysmeta);
802
          assertEquals(retPid.getValue(), pid.getValue());
803
804
          // pretend the system metadata changed on the CN
805
          MNodeService.getInstance(request).systemMetadataChanged(session,
806
                  retPid, 5000L, Calendar.getInstance().getTime());
807
808
      } catch (Exception e) {
809
          if (e instanceof NotAuthorized) {
810
              // only CN subjects can call this
811
              // TODO: use a CN certificate in the tests
812
          } else {
813
              fail("Unexpected error: " + e.getMessage());
814
815
          }
816
      }
817
818
    }
819
820 6354 cjones
  public void testGetLogRecords() {
821 6312 cjones
    printTestHeader("testLogRecords");
822 6309 cjones
823 6698 leinfelder
    try {
824
	    Log log = null;
825 7261 leinfelder
	    Session session = getCNSession();
826 6698 leinfelder
	    Date fromDate = new Date();
827
	    Calendar calendar = Calendar.getInstance();
828
	    calendar.setTime(fromDate);
829
	    calendar.roll(Calendar.YEAR, false);
830
	    fromDate = calendar.getTime();
831
	    Date toDate = new Date();
832
	    Event event = Event.CREATE;
833
	    int start = 0;
834
	    int count = 1;
835 6309 cjones
836 6542 leinfelder
      log = MNodeService.getInstance(request).getLogRecords(session, fromDate, toDate,
837 7101 leinfelder
        event, null, start, count);
838 6354 cjones
839
      assertNotNull(log);
840
      assertTrue(log.getCount() == count);
841
      assertTrue(log.getStart() == start);
842
      assertTrue(log.getTotal() >= 1);
843
844 6698 leinfelder
    } catch (Exception e) {
845 6354 cjones
      e.printStackTrace();
846
      fail("Unexpected error: " + e.getMessage());
847 6309 cjones
848
    }
849 6354 cjones
  }
850 6309 cjones
851 6354 cjones
  /**
852
   * Testing setting access on a known object
853
   */
854
  public void testSetAccessPolicy() {
855 6309 cjones
    printTestHeader("testSetAccess");
856
857 6577 cjones
    //boolean accessWasSet = false;
858
    //
859
    //try {
860
    //  // create an object to set access on
861
    //  Session session = getTestSession();
862
    //  Identifier guid = new Identifier();
863
    //  guid.setValue("testSetAccess." + System.currentTimeMillis());
864
    //  InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
865
    //  SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
866
    //  Identifier pid =
867
    //    MNodeService.getInstance(request).create(session, guid, object, sysmeta);
868
    //  // set the access
869
    //  AccessPolicy accessPolicy = new AccessPolicy();
870
    //  AccessRule allow = new AccessRule();
871
    //  allow.addPermission(Permission.WRITE);
872
    //  Subject publicSubject = new Subject();
873
    //  publicSubject.setValue(Constants.SUBJECT_PUBLIC);
874
    //  allow.addSubject(publicSubject);
875
    //  accessPolicy.addAllow(allow);
876
    //
877
    //  accessWasSet =
878
    //    MNodeService.getInstance(request).setAccessPolicy(session, pid, accessPolicy);
879
    //  assertTrue(accessWasSet);
880
    //  // test that it is enforced
881
    //  session.setSubject(publicSubject);
882
    //  boolean isAuthorized = MNodeService.getInstance(request).isAuthorized(session, pid, Permission.WRITE);
883
    //  assertTrue(isAuthorized);
884
    //
885
    //} catch (UnsupportedEncodingException e) {
886
    //  e.printStackTrace();
887
    //
888
    //} catch (InvalidToken e) {
889
    //  e.printStackTrace();
890
    //  fail("Unexpected error: " + e.getMessage());
891
    //
892
    //} catch (ServiceFailure e) {
893
    //  e.printStackTrace();
894
    //  fail("Unexpected error: " + e.getMessage());
895
    //
896
    //} catch (NotAuthorized e) {
897
    //  e.printStackTrace();
898
    //  fail("Unexpected error: " + e.getMessage());
899
    //
900
    //} catch (IdentifierNotUnique e) {
901
    //  e.printStackTrace();
902
    //  fail("Unexpected error: " + e.getMessage());
903
    //
904
    //} catch (UnsupportedType e) {
905
    //  e.printStackTrace();
906
    //  fail("Unexpected error: " + e.getMessage());
907
    //
908
    //} catch (InsufficientResources e) {
909
    //  e.printStackTrace();
910
    //  fail("Unexpected error: " + e.getMessage());
911
    //
912
    //} catch (InvalidSystemMetadata e) {
913
    //  e.printStackTrace();
914
    //  fail("Unexpected error: " + e.getMessage());
915
    //
916
    //} catch (NotImplemented e) {
917
    //  e.printStackTrace();
918
    //  fail("Unexpected error: " + e.getMessage());
919
    //
920
    //} catch (InvalidRequest e) {
921
    //  e.printStackTrace();
922
    //  fail("Unexpected error: " + e.getMessage());
923
    //
924
    //} catch (NotFound e) {
925
    //  e.printStackTrace();
926
    //  fail("Unexpected error: " + e.getMessage());
927
    //
928
    //} catch (Exception e) {
929
    //  e.printStackTrace();
930
    //  fail("Unexpected error: " + e.getMessage());
931
    //
932
    //}
933 6354 cjones
934
  }
935 6309 cjones
936 6354 cjones
  /**
937
   * Test if a subject is authorized to read a known object
938
   */
939
  public void testIsAuthorized() {
940 6309 cjones
    printTestHeader("testIsAuthorized");
941
942 6354 cjones
    try {
943
      Session session = getTestSession();
944
      Identifier guid = new Identifier();
945
      guid.setValue("testIsAuthorized." + System.currentTimeMillis());
946
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
947
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
948
      Identifier pid =
949 6542 leinfelder
        MNodeService.getInstance(request).create(session, guid, object, sysmeta);
950 6354 cjones
      boolean isAuthorized =
951 6542 leinfelder
        MNodeService.getInstance(request).isAuthorized(session, pid, Permission.READ);
952 6354 cjones
      assertEquals(isAuthorized, true);
953
954 6309 cjones
    } catch (UnsupportedEncodingException e) {
955 6354 cjones
      e.printStackTrace();
956
      fail("Unexpected error: " + e.getMessage());
957 6309 cjones
958
    } catch (InvalidToken e) {
959 6354 cjones
      e.printStackTrace();
960
      fail("Unexpected error: " + e.getMessage());
961 6309 cjones
962
    } catch (ServiceFailure e) {
963 6354 cjones
      e.printStackTrace();
964
      fail("Unexpected error: " + e.getMessage());
965 6309 cjones
966
    } catch (NotAuthorized e) {
967 6354 cjones
      e.printStackTrace();
968
      fail("Unexpected error: " + e.getMessage());
969 6309 cjones
970
    } catch (IdentifierNotUnique e) {
971 6354 cjones
      e.printStackTrace();
972
      fail("Unexpected error: " + e.getMessage());
973 6309 cjones
974
    } catch (UnsupportedType e) {
975 6354 cjones
      e.printStackTrace();
976
      fail("Unexpected error: " + e.getMessage());
977 6309 cjones
978
    } catch (InsufficientResources e) {
979 6354 cjones
      e.printStackTrace();
980
      fail("Unexpected error: " + e.getMessage());
981 6309 cjones
982
    } catch (InvalidSystemMetadata e) {
983 6354 cjones
      e.printStackTrace();
984
      fail("Unexpected error: " + e.getMessage());
985 6309 cjones
986
    } catch (NotImplemented e) {
987 6354 cjones
      e.printStackTrace();
988
      fail("Unexpected error: " + e.getMessage());
989 6309 cjones
990
    } catch (InvalidRequest e) {
991 6354 cjones
      e.printStackTrace();
992
      fail("Unexpected error: " + e.getMessage());
993 6309 cjones
994
    } catch (Exception e) {
995 6354 cjones
      e.printStackTrace();
996
      fail("Unexpected error: " + e.getMessage());
997 6309 cjones
998
    }
999 6354 cjones
  }
1000 6309 cjones
1001
1002 7040 cjones
  public void testIsEquivIdentityAuthorized() {
1003
      printTestHeader("testIsEquivIdentityAuthorized");
1004
1005
      try {
1006
          Session session = new Session();
1007
          Subject s = new Subject();
1008
          s.setValue("cn=test,dc=dataone,dc=org");
1009
          session.setSubject(s);
1010
1011
          Identifier pid = new Identifier();
1012
          pid.setValue("testIsEquivIdentityAuthorized." + System.currentTimeMillis());
1013
          InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1014
          SystemMetadata sysmeta = createSystemMetadata(pid, session.getSubject(), object);
1015
1016
          // reset the access policy to only allow 'self' read (no public)
1017
          AccessPolicy ap = new AccessPolicy();
1018
          AccessRule ar = new AccessRule();
1019
          List<Subject> sList = new ArrayList<Subject>();
1020
          sList.add(session.getSubject());
1021
          ar.setSubjectList(sList);
1022
          List<Permission> permList = new ArrayList<Permission>();
1023
          permList.add(Permission.CHANGE_PERMISSION);
1024
          ar.setPermissionList(permList);
1025
          ap.addAllow(ar);
1026
          sysmeta.setAccessPolicy(ap);
1027
1028
          // save it
1029
          Identifier retPid = CNodeService.getInstance(request).registerSystemMetadata(session, pid, sysmeta);
1030
          assertEquals(pid.getValue(), retPid.getValue());
1031
1032
          //check it against an equivalent identity not listed in the access policy
1033
          session.getSubject().setValue("cn=newSubject,dc=dataone,dc=org");
1034
          SubjectInfo subjectInfo = new SubjectInfo();
1035
          Person person = new Person();
1036
          person.setSubject(session.getSubject());
1037
          List<String> givenNames = new ArrayList<String>();
1038
          givenNames.add("New");
1039
          person.setGivenNameList(givenNames);
1040
          person.setFamilyName("Subject");
1041
1042
          // add equivalent identities
1043
          List<Subject> equivIdentities = new ArrayList<Subject>();
1044
          Subject mappedSubject2 = new Subject();
1045
          mappedSubject2.setValue("cn=test2,dc=dataone,dc=org");
1046
          equivIdentities.add(mappedSubject2);
1047
1048
          Subject mappedSubject = new Subject();
1049
          mappedSubject.setValue("cn=test,dc=dataone,dc=org");
1050
          equivIdentities.add(mappedSubject);
1051
1052
          person.setEquivalentIdentityList(equivIdentities);
1053
1054
          List<Person> personList = new ArrayList<Person>();
1055
          personList.add(person);
1056
          subjectInfo.setPersonList(personList);
1057
1058
          // update the session to include subject info with a mapped identity
1059
          session.setSubjectInfo(subjectInfo);
1060
          boolean result = CNodeService.getInstance(request).isAuthorized(session, pid, Permission.READ);
1061
          assertTrue(result);
1062
1063
    } catch (Exception e) {
1064
        e.printStackTrace();
1065
1066
    }
1067
1068
  }
1069 7816 leinfelder
1070
/**
1071
   * Test object creation failure when there is a space in the identifier
1072
   */
1073
  public void testCreateInvalidIdentifier() {
1074
    printTestHeader("testCreateInvalidIdentifier");
1075
1076
    try {
1077
      Session session = getTestSession();
1078
      Identifier guid = new Identifier();
1079
      guid.setValue("testCreate withspace." + System.currentTimeMillis());
1080
      InputStream object = new ByteArrayInputStream("test".getBytes("UTF-8"));
1081
      SystemMetadata sysmeta = createSystemMetadata(guid, session.getSubject(), object);
1082
      Identifier pid = MNodeService.getInstance(request).create(session, guid, object, sysmeta);
1083
      fail("Should not be able to create with whitespace in indentifier");
1084
    } catch (InvalidRequest e) {
1085
    	// expect that this request fails
1086
        assertTrue(true);
1087
    } catch (Exception e) {
1088
      e.printStackTrace();
1089
      fail("Unexpected error: " + e.getMessage());
1090
    }
1091
1092
  }
1093 6354 cjones
1094
1095 7040 cjones
1096
1097 6309 cjones
}