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: tao $'
8
 *     '$Date: 2015-02-06 15:23:44 -0800 (Fri, 06 Feb 2015) $'
9
 * '$Revision: 9104 $'
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.IOException;
29
import java.io.InputStream;
30
import java.io.InputStreamReader;
31
import java.io.Reader;
32
import java.math.BigInteger;
33
import java.util.Date;
34
import java.util.List;
35

    
36
import org.apache.wicket.protocol.http.mock.MockHttpServletRequest;
37
import org.dataone.client.D1Node;
38
import org.dataone.client.NodeLocator;
39
import org.dataone.client.exception.ClientSideException;
40
import org.dataone.client.v2.CNode;
41
import org.dataone.client.v2.itk.D1Client;
42
import org.dataone.client.v2.formats.ObjectFormatCache;
43
import org.dataone.service.types.v1.AccessPolicy;
44
import org.dataone.service.types.v1.AccessRule;
45
import org.dataone.service.types.v1.Checksum;
46
import org.dataone.service.types.v1.Identifier;
47
import org.dataone.service.types.v2.Node;
48
import org.dataone.service.types.v2.ObjectFormatList;
49
import org.dataone.service.types.v1.NodeReference;
50
import org.dataone.service.types.v1.NodeType;
51
import org.dataone.service.types.v1.Permission;
52
import org.dataone.service.types.v1.Session;
53
import org.dataone.service.types.v1.Subject;
54
import org.dataone.service.types.v2.SystemMetadata;
55
import org.dataone.service.types.v1.util.ChecksumUtil;
56
import org.dataone.service.types.v2.util.ObjectFormatServiceImpl;
57
import org.dataone.service.util.Constants;
58
import org.dataone.service.util.TypeMarshaller;
59

    
60
import edu.ucsb.nceas.MCTestCase;
61
import edu.ucsb.nceas.metacat.client.Metacat;
62
import edu.ucsb.nceas.metacat.client.MetacatFactory;
63

    
64
/**
65
 * A JUnit superclass for testing the dataone Node implementations
66
 */
67
public class D1NodeServiceTest extends MCTestCase {   
68
    
69
    protected MockHttpServletRequest request;
70

    
71
	/**
72
    * constructor for the test
73
    */
74
    public D1NodeServiceTest(String name) {
75
        super(name);
76
        // set up the fake request (for logging)
77
        request = new MockHttpServletRequest(null, null, null);
78
    }
79
  
80
    /**
81
	 * Establish a testing framework by initializing appropriate objects
82
	 */
83
    public void setUp() throws Exception {
84
    	super.setUp();
85
		NodeLocator nodeLocator = new NodeLocator() {
86
			@Override
87
			public D1Node getCNode() throws ClientSideException {
88
			    D1Node node = null;
89
			    try {
90
			        node = new MockCNode();
91
			    } catch (IOException e) {
92
			        throw new ClientSideException(e.getMessage());
93
			    }
94
				return node;
95
			}
96
		};
97
		D1Client.setNodeLocator(nodeLocator );
98
    	
99
    }
100

    
101
	/**
102
	 * Release any objects after tests are complete
103
	 */
104
	public void tearDown() {
105
		// set back to force it to use defaults
106
		D1Client.setNodeLocator(null);
107
	}
108
	
109
	/**
110
	 * constructs a "fake" session with a test subject
111
	 * @return
112
	 */
113
	public Session getTestSession() throws Exception {
114
		Session session = new Session();
115
        Subject subject = new Subject();
116
        subject.setValue("cn=test,dc=dataone,dc=org");
117
        session.setSubject(subject);
118
        return session;
119
	}
120
	
121
	/**
122
	 * constructs a "fake" session with the MN subject
123
	 * @return
124
	 */
125
	public Session getMNSession() throws Exception {
126
		Session session = new Session();
127
        Subject subject = MNodeService.getInstance(request).getCapabilities().getSubject(0);
128
        session.setSubject(subject);
129
        return session;
130
	}
131

    
132
	public Session getCNSession() throws Exception {
133
		Session session = new Session();
134
		Subject subject = null;
135
		CNode cn = D1Client.getCN();
136
		List<Node> nodes = cn.listNodes().getNodeList();
137

    
138
		// find the first CN in the node list
139
		for (Node node : nodes) {
140
			if (node.getType() == NodeType.CN) {
141
				subject = node.getSubject(0);
142
				break;
143
			}
144
		}
145
		session.setSubject(subject);
146
		return session;
147

    
148
	}
149
	
150
	/**
151
	 * Run an initial test that always passes to check that the test harness is
152
	 * working.
153
	 */
154
	public void initialize() 
155
	{
156
	    printTestHeader("initialize");
157
		assertTrue(1 == 1);
158
	}
159
	
160
	/**
161
	 * create system metadata with a specified id
162
	 */
163
	public SystemMetadata createSystemMetadata(Identifier id, Subject owner, InputStream object)
164
	  throws Exception
165
	{
166
	    SystemMetadata sm = new SystemMetadata();
167
	    sm.setSerialVersion(BigInteger.valueOf(1));
168
        // set the id
169
        sm.setIdentifier(id);
170
        sm.setFormatId(ObjectFormatCache.getInstance().getFormat("application/octet-stream").getFormatId());
171
        // create the checksum
172
        Checksum checksum = new Checksum();
173
        String ca = "MD5";
174
        checksum.setValue("test");
175
        checksum.setAlgorithm(ca);
176
        // actually generate one
177
        if (object != null) {
178
            checksum = ChecksumUtil.checksum(object, ca);
179
        }
180
        sm.setChecksum(checksum);
181
        // set the size
182
        sm.setSize(new BigInteger("0"));
183
        sm.setSubmitter(owner);
184
        sm.setRightsHolder(owner);
185
        sm.setDateUploaded(new Date());
186
        sm.setDateSysMetadataModified(new Date());
187
        NodeReference nr = new NodeReference();
188
        nr.setValue("metacat");
189
        sm.setOriginMemberNode(nr);
190
        sm.setAuthoritativeMemberNode(nr);
191
		// set the access to public read
192
        AccessPolicy accessPolicy = new AccessPolicy();
193
        AccessRule allow = new AccessRule();
194
        allow.addPermission(Permission.READ);
195
        Subject publicSubject = new Subject();
196
        publicSubject.setValue(Constants.SUBJECT_PUBLIC);
197
		allow.addSubject(publicSubject);
198
		accessPolicy.addAllow(allow);
199
        sm.setAccessPolicy(accessPolicy);
200
        
201
        return sm;
202
	}
203
	
204
	/**
205
	 * For fresh Metacat installations without the Object Format List
206
	 * we insert the default version from d1_common.jar
207
	 */
208
	protected void setUpFormats() {
209
		try {
210
			Metacat m = MetacatFactory.createMetacatConnection(metacatUrl);
211
			m.login(username, password);
212
			// check if it exists already
213
			InputStream is = null;
214
			try {
215
				is = m.read(ObjectFormatService.OBJECT_FORMAT_DOCID);
216
			} catch (Exception e) {
217
				// probably missing the doc
218
			}
219
			
220
			if (is != null) {
221
				// check for v2 OFL
222
				try {
223
					ObjectFormatList ofl = TypeMarshaller.unmarshalTypeFromStream(ObjectFormatList.class, is);
224
				} catch (ClassCastException cce) {
225
					// need to update it
226
					InputStream formats = ObjectFormatServiceImpl.getInstance().getObjectFormatFile();
227
					Reader xmlDocument = new InputStreamReader(formats);
228
					int rev = m.getNewestDocRevision(ObjectFormatService.OBJECT_FORMAT_DOCID);
229
					rev++;
230
					m.update(ObjectFormatService.OBJECT_FORMAT_DOCID + "." + rev, xmlDocument, null);
231
				}
232
				
233
			}
234
			else {
235
				// get the default from d1_common
236
				InputStream formats = ObjectFormatServiceImpl.getInstance().getObjectFormatFile();
237
				Reader xmlDocument = new InputStreamReader(formats);
238
				m.insert(ObjectFormatService.OBJECT_FORMAT_DOCID + ".1", xmlDocument, null);
239
			}
240
			m.logout();
241
		} catch (Exception e) {
242
			// any number of things could go wrong
243
			e.printStackTrace();
244
		}
245
	}
246

    
247
	/**
248
	 * print a header to start each test
249
	 */
250
	protected void printTestHeader(String testName)
251
	{
252
	    System.out.println();
253
	    System.out.println("*************** " + testName + " ***************");
254
	}
255
 
256
}
(2-2/8)