/*
* JBoss, Home of Professional Open Source.
* See the COPYRIGHT.txt file distributed with this work for information
* regarding copyright ownership. Some portions may be licensed
* to Red Hat, Inc. under one or more contributor license agreements.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301 USA.
*/
package org.teiid.dqp.internal.process;
import static org.junit.Assert.*;
import java.util.Map;
import javax.security.auth.Subject;
import javax.security.auth.login.LoginException;
import org.junit.Test;
import org.mockito.Mockito;
import org.teiid.adminapi.DataPolicy;
import org.teiid.adminapi.impl.DataPolicyMetadata;
import org.teiid.adminapi.impl.SessionMetadata;
import org.teiid.adminapi.impl.VDBMetaData;
import org.teiid.core.util.UnitTestUtil;
import org.teiid.security.Credentials;
import org.teiid.security.GSSResult;
import org.teiid.security.SecurityHelper;
public class TestDQPWorkContext {
public static DQPWorkContext example() {
DQPWorkContext message = new DQPWorkContext();
message.getSession().setVDBName("vdbName"); //$NON-NLS-1$
message.getSession().setVDBVersion(1);
message.getSession().setApplicationName("querybuilder"); //$NON-NLS-1$
message.getSession().setSessionId(String.valueOf(5));
message.getSession().setUserName("userName"); //$NON-NLS-1$
return message;
}
@Test public void testSerialize() throws Exception {
DQPWorkContext copy = UnitTestUtil.helpSerialize(example());
assertEquals("5", copy.getSessionId()); //$NON-NLS-1$
assertEquals("userName", copy.getUserName()); //$NON-NLS-1$
assertEquals("vdbName", copy.getVdbName()); //$NON-NLS-1$
assertEquals("1", copy.getVdbVersion()); //$NON-NLS-1$
assertEquals("querybuilder", copy.getAppName()); //$NON-NLS-1$
}
@Test public void testClearPolicies() {
DQPWorkContext message = new DQPWorkContext();
message.setSession(Mockito.mock(SessionMetadata.class));
Mockito.stub(message.getSession().getVdb()).toReturn(new VDBMetaData());
Map<String, DataPolicy> map = message.getAllowedDataPolicies();
map.put("role", Mockito.mock(DataPolicy.class)); //$NON-NLS-1$
assertFalse(map.isEmpty());
message.setSession(Mockito.mock(SessionMetadata.class));
Mockito.stub(message.getSession().getVdb()).toReturn(new VDBMetaData());
map = message.getAllowedDataPolicies();
assertTrue(map.isEmpty());
}
@Test public void testAnyAuthenticated() {
DQPWorkContext message = new DQPWorkContext();
SessionMetadata mock = Mockito.mock(SessionMetadata.class);
message.setSession(mock);
VDBMetaData vdb = new VDBMetaData();
DataPolicyMetadata dpm = new DataPolicyMetadata();
dpm.setAnyAuthenticated(true);
vdb.addDataPolicy(dpm);
Mockito.stub(mock.getVdb()).toReturn(vdb);
//unauthenticated
Map<String, DataPolicy> map = message.getAllowedDataPolicies();
assertEquals(0, map.size());
//authenticated
message = new DQPWorkContext();
Mockito.stub(mock.getSubject()).toReturn(new Subject());
message.setSession(mock);
map = message.getAllowedDataPolicies();
assertEquals(1, map.size());
}
@Test public void testRestoreSecurityContext() {
final SecurityHelper sc = new SecurityHelper() {
Object mycontext = null;
@Override
public Object getSecurityContext() {
return this.mycontext;
}
@Override
public void clearSecurityContext() {
this.mycontext = null;
}
@Override
public Object associateSecurityContext(Object context) {
Object old = mycontext;
this.mycontext = context;
return old;
}
@Override
public Subject getSubjectInContext(Object context) {
return null;
}
@Override
public Subject getSubjectInContext(String securityDomain) {
return null;
}
@Override
public Object authenticate(String securityDomain, String baseUserName,
Credentials credentials, String applicationName) throws LoginException {
return null;
}
@Override
public GSSResult negotiateGssLogin(String securityDomain, byte[] serviceTicket) throws LoginException {
return null;
}
};
Object previousSC = "testSC";
sc.associateSecurityContext(previousSC);
DQPWorkContext message = new DQPWorkContext() {
@Override
public Subject getSubject() {
return new Subject();
}
};
message.setSecurityHelper(sc);
message.setSession(Mockito.mock(SessionMetadata.class));
final String currentSC = "teiid-security-context"; //$NON-NLS-1$
Mockito.stub(message.getSession().getSecurityContext()).toReturn(currentSC);
Runnable r = new Runnable() {
@Override
public void run() {
assertEquals(currentSC, sc.getSecurityContext());
}
};
message.runInContext(r);
assertEquals(previousSC, sc.getSecurityContext());
}
}