Project

General

Profile

1 1783 jones
/**
2
 *  '$RCSfile$'
3
 *  Copyright: 2003 Regents of the University of California and the
4
 *              National Center for Ecological Analysis and Synthesis
5
 *  Purpose: To test the MetaCatURL class 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.metacattest.client;
27
28
import edu.ucsb.nceas.metacat.client.*;
29 1822 jones
import edu.ucsb.nceas.utilities.HttpMessage;
30 1784 jones
import edu.ucsb.nceas.utilities.IOUtil;
31 1783 jones
32 1784 jones
import java.io.FileReader;
33
import java.io.InputStreamReader;
34
import java.io.IOException;
35
import java.io.Reader;
36 1789 jones
import java.io.StringReader;
37 1784 jones
import java.io.StringWriter;
38 1791 jones
import java.text.DateFormat;
39
import java.util.Calendar;
40
import java.util.GregorianCalendar;
41
import java.util.Date;
42
import java.util.SimpleTimeZone;
43
import java.util.TimeZone;
44 1784 jones
45 1783 jones
import junit.framework.Test;
46
import junit.framework.TestCase;
47
import junit.framework.TestResult;
48
import junit.framework.TestSuite;
49
50
/**
51
 * A JUnit test for testing Step class processing
52
 */
53
public class MetacatClientTest extends TestCase
54
{
55 1828 jones
    private String metacatUrl = "@systemidserver@@servlet-path@";
56 1800 tao
    private String wrongMetacatUrl=
57
                    "http://somepalce.somewhere.com/some/servlet/metacat";
58 1783 jones
    private String username = "@mcuser@";
59
    private String password = "@mcpassword@";
60 1800 tao
    private String anotheruser = "@mcanotheruser@";
61
    private String anotherpassword = "@mcanotherpassword@";
62 1783 jones
    private String failpass = "uidfnkj43987yfdn";
63 1791 jones
    private String prefix = "test";
64
    private String newdocid = null;
65 1784 jones
    private String testfile = "test/jones.204.22.xml";
66 1787 tao
    private String queryFile = "test/query.xml";
67 1784 jones
    private String testdocument = "";
68 1783 jones
    private Metacat m;
69
70
    /**
71
     * Constructor to build the test
72
     *
73
     * @param name the name of the test method
74
     */
75
    public MetacatClientTest(String name)
76
    {
77
        super(name);
78 1791 jones
        newdocid = generateDocid();
79 1783 jones
    }
80
81
    /**
82
     * Establish a testing framework by initializing appropriate objects
83
     */
84
    public void setUp()
85
    {
86
        try {
87 1784 jones
            FileReader fr = new FileReader(testfile);
88 1788 jones
            testdocument = IOUtil.getAsString(fr, true);
89 1784 jones
        } catch (IOException ioe) {
90
            fail("Can't read test data to run the test: " + testfile);
91
        }
92
93
        try {
94 1828 jones
            System.err.println("Test Metacat: " + metacatUrl);
95 1783 jones
            m = MetacatFactory.createMetacatConnection(metacatUrl);
96
        } catch (MetacatInaccessibleException mie) {
97 1822 jones
            System.err.println("Metacat is: " + metacatUrl);
98 1783 jones
            fail("Metacat connection failed." + mie.getMessage());
99
        }
100
    }
101
102
    /**
103
     * Release any objects after tests are complete
104
     */
105
    public void tearDown()
106
    {
107
    }
108
109
    /**
110
     * Create a suite of tests to be run together
111
     */
112
    public static Test suite()
113
    {
114
        TestSuite suite = new TestSuite();
115
        suite.addTest(new MetacatClientTest("initialize"));
116
        suite.addTest(new MetacatClientTest("invalidLogin"));
117 1800 tao
        suite.addTest(new MetacatClientTest("logoutAndInvalidInsert"));
118 1783 jones
        suite.addTest(new MetacatClientTest("login"));
119 1789 jones
        suite.addTest(new MetacatClientTest("insert"));
120 1800 tao
        suite.addTest(new MetacatClientTest("invalidRead"));
121 1784 jones
        suite.addTest(new MetacatClientTest("read"));
122 1787 tao
        suite.addTest(new MetacatClientTest("query"));
123 1800 tao
        suite.addTest(new MetacatClientTest("invalidUpdate"));
124 1795 jones
        suite.addTest(new MetacatClientTest("update"));
125 1822 jones
        suite.addTest(new MetacatClientTest("invalidDelete"));
126 1795 jones
        suite.addTest(new MetacatClientTest("delete"));
127 1826 jones
        suite.addTest(new MetacatClientTest("inaccessibleMetacat"));
128
        suite.addTest(new MetacatClientTest("reuseSession"));
129 1828 jones
        suite.addTest(new MetacatClientTest("reuseInvalidSession"));
130 1783 jones
        return suite;
131
    }
132
133
    /**
134
     * Run an initial test that always passes to check that the test
135
     * harness is working.
136
     */
137
    public void initialize()
138
    {
139
        assertTrue(1 == 1);
140
    }
141
142
    /**
143
     * Test the login() function with valid credentials
144
     */
145
    public void login()
146
    {
147
        // Try a valid login
148
        try {
149 1822 jones
            String response = m.login(username, password);
150
            System.err.println("Login response: " + response);
151
            assertTrue(response != null);
152
            assertTrue(response.indexOf("<login>") != -1);
153
            String sessionId = m.getSessionId();
154
            System.err.println("Session ID: " + m.getSessionId());
155 1825 jones
            assertTrue(sessionId != null);
156
            assertTrue(response.indexOf(m.getSessionId()) != -1);
157 1783 jones
        } catch (MetacatAuthException mae) {
158
            fail("Authorization failed:\n" + mae.getMessage());
159
        } catch (MetacatInaccessibleException mie) {
160
            fail("Metacat Inaccessible:\n" + mie.getMessage());
161
        }
162
    }
163
164
    /**
165
     * Test the login() function with INVALID credentials
166
     */
167
    public void invalidLogin()
168
    {
169
        // Try an invalid login
170
        try {
171
            m.login(username, failpass);
172
            fail("Authorization should have failed.");
173
        } catch (MetacatAuthException mae) {
174
            assertTrue(1 == 1);
175
        } catch (MetacatInaccessibleException mie) {
176
            fail("Metacat Inaccessible:\n" + mie.getMessage());
177
        }
178
    }
179 1800 tao
180
    /**
181
     * Test the logout() function. When logout, user will be public, it couldn't
182
     * insert a document.
183
     */
184
    public void logoutAndInvalidInsert()
185
    {
186
       try {
187
            String identifier = newdocid + ".1";
188
            m.login(username, password);
189
            m.logout();
190
            String response = m.insert(identifier,
191
                    new StringReader(testdocument), null);
192 1822 jones
            System.err.println("Response in logout: "+response);
193 1800 tao
            assertTrue(response.indexOf("<success>") == -1);
194
        } catch (MetacatAuthException mae) {
195
            fail("Authorization failed:\n" + mae.getMessage());
196
        } catch (MetacatInaccessibleException mie) {
197
            fail("Metacat Inaccessible:\n" + mie.getMessage());
198
        } catch (InsufficientKarmaException ike) {
199
            fail("Insufficient karma:\n" + ike.getMessage());
200
        } catch (MetacatException me) {
201
            fail("Metacat Error:\n" + me.getMessage());
202
        } catch (Exception e) {
203
            fail("General exception:\n" + e.getMessage());
204
        }
205
    }
206 1784 jones
207
    /**
208
     * Test the read() function with a known document
209
     */
210
    public void read()
211
    {
212
        try {
213
            m.login(username, password);
214 1791 jones
            Reader r = m.read(newdocid+".1");
215 1788 jones
            String doc = IOUtil.getAsString(r, true);
216 1800 tao
            doc = doc +"\n";
217 1784 jones
            System.err.println(doc);
218
            assertTrue(doc.equals(testdocument));
219
        } catch (MetacatAuthException mae) {
220
            fail("Authorization failed:\n" + mae.getMessage());
221
        } catch (MetacatInaccessibleException mie) {
222
            fail("Metacat Inaccessible:\n" + mie.getMessage());
223
        } catch (Exception e) {
224
            fail("General exception:\n" + e.getMessage());
225
        }
226
    }
227 1787 tao
228
    /**
229 1800 tao
     * A user try to read a document which it doesn't have read permission
230
     */
231
    public void invalidRead()
232
    {
233
        try {
234
            m.login(anotheruser, anotherpassword);
235
            Reader r = m.read(newdocid+".1");
236
            String doc = IOUtil.getAsString(r, true);
237
            assertTrue(doc.indexOf("<error>") != -1);
238
            System.err.println(doc);
239
        } catch (MetacatAuthException mae) {
240
            fail("Authorization failed:\n" + mae.getMessage());
241
        } catch (MetacatInaccessibleException mie) {
242
            fail("Metacat Inaccessible:\n" + mie.getMessage());
243
        } catch (InsufficientKarmaException ike) {
244
            assertTrue(1 == 1);
245
        } catch (MetacatException e) {
246
            fail("Metacat exception:\n" + e.getMessage());
247
        } catch (IOException ioe) {
248
            fail("IO exception:\n" + ioe.getMessage());
249
        }
250
    }
251
252
    /**
253 1787 tao
     * Test the query() function with a known document
254
     */
255
    public void query()
256
    {
257
        try {
258 1828 jones
            m.login(username,password);
259 1787 tao
            FileReader fr = new FileReader(queryFile);
260
            Reader r = m.query(fr);
261 1828 jones
            System.err.println("Starting query...");
262 1788 jones
            String result = IOUtil.getAsString(r, true);
263 1828 jones
            System.err.println("Query result:\n" + result);
264 1792 jones
            assertTrue(result.indexOf(newdocid+".1")!=-1);
265 1828 jones
        } catch (MetacatAuthException mae) {
266
            fail("Authorization failed:\n" + mae.getMessage());
267 1787 tao
        } catch (MetacatInaccessibleException mie) {
268
            fail("Metacat Inaccessible:\n" + mie.getMessage());
269
        } catch (Exception e) {
270
            fail("General exception:\n" + e.getMessage());
271
        }
272
    }
273 1789 jones
274
    /**
275
     * Test the insert() function with a known document
276
     */
277
    public void insert()
278
    {
279
        try {
280 1791 jones
            String identifier = newdocid + ".1";
281 1789 jones
            m.login(username, password);
282 1791 jones
            String response = m.insert(identifier,
283 1789 jones
                    new StringReader(testdocument), null);
284
            assertTrue(response.indexOf("<success>") != -1);
285 1791 jones
            assertTrue(response.indexOf(identifier) != -1);
286
            System.err.println(response);
287 1789 jones
288
        } catch (MetacatAuthException mae) {
289
            fail("Authorization failed:\n" + mae.getMessage());
290
        } catch (MetacatInaccessibleException mie) {
291
            fail("Metacat Inaccessible:\n" + mie.getMessage());
292
        } catch (InsufficientKarmaException ike) {
293 1800 tao
            assertTrue(1 == 1);
294 1789 jones
            fail("Insufficient karma:\n" + ike.getMessage());
295
        } catch (MetacatException me) {
296
            fail("Metacat Error:\n" + me.getMessage());
297
        } catch (Exception e) {
298
            fail("General exception:\n" + e.getMessage());
299
        }
300
    }
301 1791 jones
302
    /**
303 1800 tao
     * Test the invalidUpdate() function. A user try to update a document
304
     * which it doesn't have permission
305
     */
306
    public void invalidUpdate()
307
    {
308
        try {
309
            String identifier = newdocid + ".2";
310
            m.login(anotheruser, anotherpassword);
311
            String response = m.update(identifier,
312
                    new StringReader(testdocument), null);
313
            assertTrue(response.indexOf("<success>") == -1);
314
315
        } catch (MetacatAuthException mae) {
316
            fail("Authorization failed:\n" + mae.getMessage());
317
        } catch (MetacatInaccessibleException mie) {
318
            fail("Metacat Inaccessible:\n" + mie.getMessage());
319
        } catch (InsufficientKarmaException ike) {
320
            assertTrue(1 == 1);
321
        } catch (MetacatException me) {
322
            fail("Metacat Error:\n" + me.getMessage());
323
        } catch (Exception e) {
324
            fail("General exception:\n" + e.getMessage());
325
        }
326
    }
327
328
    /**
329 1795 jones
     * Test the update() function with a known document
330
     */
331
    public void update()
332
    {
333
        try {
334
            String identifier = newdocid + ".2";
335
            m.login(username, password);
336
            String response = m.update(identifier,
337
                    new StringReader(testdocument), null);
338
            assertTrue(response.indexOf("<success>") != -1);
339
            assertTrue(response.indexOf(identifier) != -1);
340
            System.err.println(response);
341
342
        } catch (MetacatAuthException mae) {
343
            fail("Authorization failed:\n" + mae.getMessage());
344
        } catch (MetacatInaccessibleException mie) {
345
            fail("Metacat Inaccessible:\n" + mie.getMessage());
346
        } catch (InsufficientKarmaException ike) {
347
            fail("Insufficient karma:\n" + ike.getMessage());
348
        } catch (MetacatException me) {
349
            fail("Metacat Error:\n" + me.getMessage());
350
        } catch (Exception e) {
351
            fail("General exception:\n" + e.getMessage());
352
        }
353
    }
354 1800 tao
355
    /**
356
     * A user try delete a document which it doesn't have permission
357
     */
358
    public void invalidDelete()
359
    {
360
        try {
361
            String identifier = newdocid + ".2";
362
            m.login(anotheruser, anotherpassword);
363
            String response = m.delete(identifier);
364
            assertTrue(response.indexOf("<success>") == -1);
365
            System.err.println(response);
366 1795 jones
367 1800 tao
        } catch (MetacatAuthException mae) {
368
            fail("Authorization failed:\n" + mae.getMessage());
369
        } catch (MetacatInaccessibleException mie) {
370
            fail("Metacat Inaccessible:\n" + mie.getMessage());
371
        } catch (InsufficientKarmaException ike) {
372
            assertTrue(1 == 1);
373
        } catch (MetacatException me) {
374
            assertTrue(1 == 1);
375
        } catch (Exception e) {
376
            fail("General exception:\n" + e.getMessage());
377
        }
378
    }
379
380 1795 jones
    /**
381
     * Test the delete() function with a known document
382
     */
383
    public void delete()
384
    {
385
        try {
386
            String identifier = newdocid + ".2";
387
            m.login(username, password);
388
            String response = m.delete(identifier);
389
            assertTrue(response.indexOf("<success>") != -1);
390
            System.err.println(response);
391
392
        } catch (MetacatAuthException mae) {
393
            fail("Authorization failed:\n" + mae.getMessage());
394
        } catch (MetacatInaccessibleException mie) {
395
            fail("Metacat Inaccessible:\n" + mie.getMessage());
396
        } catch (InsufficientKarmaException ike) {
397
            fail("Insufficient karma:\n" + ike.getMessage());
398
        } catch (MetacatException me) {
399
            fail("Metacat Error:\n" + me.getMessage());
400
        } catch (Exception e) {
401
            fail("General exception:\n" + e.getMessage());
402
        }
403
    }
404 1800 tao
405
    /**
406
     * Test the to connect a wrong metacat url. Create a new metacat with a
407
     * inaccessible url. Then try to login it. If get a MetacatInaccessible
408
     * exception, this is right.
409
     */
410 1826 jones
    public void inaccessibleMetacat()
411 1800 tao
    {
412
        Metacat mWrong = null;
413
        try {
414
            mWrong = MetacatFactory.createMetacatConnection(wrongMetacatUrl);
415
        } catch (MetacatInaccessibleException mie) {
416
            fail("Metacat Inaccessible:\n" + mie.getMessage());
417
        }
418
419
        try {
420
            mWrong.login(username, password);
421
        } catch (MetacatInaccessibleException mie) {
422
            assertTrue(1 == 1);
423
        } catch (MetacatAuthException mae) {
424
            fail("Authorization failed:\n" + mae.getMessage());
425
        }
426
    }
427 1795 jones
428
    /**
429 1826 jones
     * Try to perform an action that requires a session to be valid without
430
     * having logged in first by setting the sessionId from a previous
431
     * session.  Then insert a document.
432
     */
433
    public void reuseSession()
434
    {
435
        String oldSessionId = "";
436
        try {
437
            Metacat mtemp = MetacatFactory.createMetacatConnection(metacatUrl);
438
            String response = mtemp.login(username, password);
439
            oldSessionId = mtemp.getSessionId();
440 1828 jones
            System.err.println("SessionId (mtemp): " + oldSessionId);
441 1826 jones
        } catch (MetacatAuthException mae) {
442
            fail("Authorization failed:\n" + mae.getMessage());
443
        } catch (MetacatInaccessibleException mie) {
444
            System.err.println("Metacat is: " + metacatUrl);
445
            fail("Metacat connection failed." + mie.getMessage());
446
        }
447
448
        try {
449
            String identifier = generateDocid() + ".1";
450
            Metacat m2 = null;
451
            try {
452
                m2 = MetacatFactory.createMetacatConnection(metacatUrl);
453
            } catch (MetacatInaccessibleException mie) {
454
                System.err.println("Metacat is: " + metacatUrl);
455
                fail("Metacat connection failed." + mie.getMessage());
456
            }
457 1828 jones
            System.err.println("SessionId (m2): " + m2.getSessionId());
458 1826 jones
            m2.setSessionId(oldSessionId);
459 1828 jones
            System.err.println("SessionId (m2 after set): " + m2.getSessionId());
460 1826 jones
            String response = m2.insert(identifier,
461
                    new StringReader(testdocument), null);
462
            System.err.println("Reuse Insert response: " + response);
463
            assertTrue(response.indexOf("<success>") != -1);
464
        } catch (MetacatInaccessibleException mie) {
465
            fail("Metacat Inaccessible:\n" + mie.getMessage());
466
        } catch (InsufficientKarmaException ike) {
467
            fail("Insufficient karma:\n" + ike.getMessage());
468
        } catch (MetacatException me) {
469
            fail("Metacat Error:\n" + me.getMessage());
470
        } catch (Exception e) {
471
            fail("General exception:\n" + e.getMessage());
472
        }
473
    }
474
475
    /**
476 1828 jones
     * Try to perform an action that requires a session to be valid without
477 1829 jones
     * having logged in first, but use an invalid session identifier.
478
     * Then insert a document, which should fail.
479 1828 jones
     */
480
    public void reuseInvalidSession()
481
    {
482 1829 jones
        System.err.println("Starting resuseInvalidSession test...");
483 1828 jones
        String oldSessionId = "foobar";
484
        try {
485
            String identifier = generateDocid() + ".1";
486 1829 jones
            Metacat m3 = null;
487 1828 jones
            try {
488 1829 jones
                m3 = MetacatFactory.createMetacatConnection(metacatUrl);
489 1828 jones
            } catch (MetacatInaccessibleException mie) {
490
                System.err.println("Metacat is: " + metacatUrl);
491
                fail("Metacat connection failed." + mie.getMessage());
492
            }
493 1829 jones
            System.err.println("SessionId (m3): " + m3.getSessionId());
494
            m3.setSessionId(oldSessionId);
495
            System.err.println("SessionId (m3 after set): " + m3.getSessionId());
496
            System.err.println("Performing resuseInvalidSession insert: " +
497
                    identifier);
498
            String response = m3.insert(identifier,
499 1828 jones
                    new StringReader(testdocument), null);
500 1829 jones
            System.err.println("ReuseInvalid Insert response: " + response);
501 1828 jones
            assertTrue(response.indexOf("<success>") == -1);
502
        } catch (MetacatInaccessibleException mie) {
503
            fail("Metacat Inaccessible:\n" + mie.getMessage());
504
        } catch (InsufficientKarmaException ike) {
505
            fail("Insufficient karma:\n" + ike.getMessage());
506
        } catch (MetacatException me) {
507
            fail("Metacat Error:\n" + me.getMessage());
508
        } catch (Exception e) {
509
            fail("General exception:\n" + e.getMessage());
510
        }
511
    }
512
    /**
513 1791 jones
     * Create a hopefully unique docid for testing insert and update. Does
514
     * not include the 'revision' part of the id.
515
     *
516
     * @return a String docid based on the current date and time
517
     */
518
    private String generateDocid()
519
    {
520
        StringBuffer docid = new StringBuffer(prefix);
521
        docid.append(".");
522
523
        // Create a calendar to get the date formatted properly
524
        String[] ids = TimeZone.getAvailableIDs(-8 * 60 * 60 * 1000);
525
        SimpleTimeZone pdt = new SimpleTimeZone(-8 * 60 * 60 * 1000, ids[0]);
526
        pdt.setStartRule(Calendar.APRIL, 1, Calendar.SUNDAY, 2*60*60*1000);
527
        pdt.setEndRule(Calendar.OCTOBER, -1, Calendar.SUNDAY, 2*60*60*1000);
528
        Calendar calendar = new GregorianCalendar(pdt);
529
        Date trialTime = new Date();
530
        calendar.setTime(trialTime);
531
        docid.append(calendar.get(Calendar.YEAR));
532
        docid.append(calendar.get(Calendar.DAY_OF_YEAR));
533
        docid.append(calendar.get(Calendar.HOUR_OF_DAY));
534
        docid.append(calendar.get(Calendar.MINUTE));
535
        docid.append(calendar.get(Calendar.SECOND));
536
537
        return docid.toString();
538
    }
539 1783 jones
}