/**
* Copyright (c) 2009-2011 VMware, Inc. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.springsource.insight.plugin.eclipse.persistence;
import java.util.Collection;
import org.eclipse.persistence.exceptions.DatabaseException;
import org.eclipse.persistence.sessions.DatabaseSession;
import org.eclipse.persistence.sessions.Login;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mockito;
import com.springsource.insight.collection.ObscuredValueSetMarker;
import com.springsource.insight.intercept.operation.Operation;
import com.springsource.insight.intercept.operation.OperationFields;
import com.springsource.insight.intercept.operation.OperationList;
import com.springsource.insight.intercept.trace.ObscuredValueMarker;
/**
*
*/
public class DatabaseSessionOperationCollectionAspectTest
extends EclipsePersistenceCollectionTestSupport {
private ObscuredValueMarker originalMarker;
private final ObscuredValueSetMarker replaceMarker = new ObscuredValueSetMarker();
public DatabaseSessionOperationCollectionAspectTest() {
super();
}
@Before
@Override
public void setUp() {
super.setUp();
DatabaseSessionOperationCollectionAspect aspectInstance = getAspect();
originalMarker = aspectInstance.getSensitiveValueMarker();
replaceMarker.clear();
aspectInstance.setSensitiveValueMarker(replaceMarker);
}
@After
@Override
public void restore() {
DatabaseSessionOperationCollectionAspect aspectInstance = getAspect();
aspectInstance.setSensitiveValueMarker(originalMarker);
super.restore();
}
@Test
public void testLogin() {
DatabaseSessionOperationCollectionAspect aspectInstance = getAspect();
ObscuredValueSetMarker marker = (ObscuredValueSetMarker) aspectInstance.getSensitiveValueMarker();
for (LoginAction action : LoginAction.values()) {
Login mockLogin = Mockito.mock(Login.class);
Mockito.when(mockLogin.getUserName()).thenReturn("username:" + action.name());
Mockito.when(mockLogin.getPassword()).thenReturn("password:" + action.name());
mockSession.setLogin(mockLogin);
action.executeAction(mockSession, mockLogin);
Operation op = assertDatabaseSessionOperation(action.name(), "login");
action.assertExecutionResult(op, mockLogin, marker);
// prepare for next iteration
Mockito.reset(spiedOperationCollector);
marker.clear();
}
}
@Test
public void testLogout() {
mockSession.logout();
assertDatabaseSessionOperation("testLogout", "logout");
}
@Override
public DatabaseSessionOperationCollectionAspect getAspect() {
return DatabaseSessionOperationCollectionAspect.aspectOf();
}
protected Operation assertDatabaseSessionOperation(String testName, String action) {
return assertPersistenceOperation(testName, EclipsePersistenceDefinitions.DB, action);
}
static enum LoginAction {
LOGINEMPTY(0, false) {
@Override
public void executeAction(DatabaseSession session, Login login) throws DatabaseException {
session.login();
}
},
LOGINLOGIN(1, false) {
@Override
public void executeAction(DatabaseSession session, Login login) throws DatabaseException {
session.login(login);
}
},
LOGINUSERPASS(2, true) {
@Override
public void executeAction(DatabaseSession session, Login login) throws DatabaseException {
session.login(login.getUserName(), login.getPassword());
}
};
private final int numArgs;
private final boolean obscured;
LoginAction(@SuppressWarnings("hiding") int numArgs, @SuppressWarnings("hiding") boolean obscured) {
this.numArgs = numArgs;
this.obscured = obscured;
}
public abstract void executeAction(DatabaseSession session, Login login) throws DatabaseException;
public OperationList assertExecutionResult(Operation op, Login login, Collection<?> markedValues) {
OperationList argsList = op.get(OperationFields.ARGUMENTS, OperationList.class);
assertNotNull(name() + ": No arguments extracted", argsList);
assertEquals(name() + ": Mismatched number of arguments", numArgs, argsList.size());
if (obscured) {
assertTrue(name() + ": username not obscured", markedValues.contains(login.getUserName()));
assertTrue(name() + ": password not obscured", markedValues.contains(login.getUserName()));
}
return argsList;
}
}
}