/** * 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.jdbc; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.Driver; import java.sql.SQLException; import java.util.Collection; import java.util.Properties; import org.junit.After; import org.junit.Before; import org.junit.Test; import com.springsource.insight.collection.ObscuredValueSetMarker; import com.springsource.insight.intercept.operation.Operation; import com.springsource.insight.intercept.operation.OperationMap; import com.springsource.insight.intercept.plugin.CollectionSettingsRegistry; import com.springsource.insight.intercept.trace.ObscuredValueMarker; import com.springsource.insight.util.StringUtil; /** * */ public class JdbcDriverConnectOperationCollectionAspectTest extends JdbcConnectionOperationCollectionTestSupport { private ObscuredValueMarker originalMarker; private final ObscuredValueSetMarker replaceMarker = new ObscuredValueSetMarker(); public JdbcDriverConnectOperationCollectionAspectTest() { super(); } @Override @Before public void setUp() { super.setUp(); JdbcDriverConnectOperationCollectionAspect aspectInstance = getAspect(); originalMarker = aspectInstance.getSensitiveValueMarker(); replaceMarker.clear(); aspectInstance.setSensitiveValueMarker(replaceMarker); } @Override @After public void restore() { JdbcDriverConnectOperationCollectionAspect aspectInstance = getAspect(); aspectInstance.setSensitiveValueMarker(originalMarker); // restore the original obfuscation settings CollectionSettingsRegistry registry = CollectionSettingsRegistry.getInstance(); registry.set(JdbcDriverConnectOperationCollectionAspect.OBFUSCATED_PROPERTIES_SETTING, JdbcDriverConnectOperationCollectionAspect.DEFAULT_OBFUSCATED_PROPERTIES_LIST); super.restore(); } @Test public void testDriverConnect() throws SQLException { Operation op = runConnectionTest(); assertObscuredProperties(op, StringUtil.explode(JdbcDriverConnectOperationCollectionAspect.DEFAULT_OBFUSCATED_PROPERTIES_LIST, ","), true); } @Test public void testPropertiesObfuscation() throws SQLException { CollectionSettingsRegistry registry = CollectionSettingsRegistry.getInstance(); // make sure the defaults are overridden registry.set(JdbcDriverConnectOperationCollectionAspect.OBFUSCATED_PROPERTIES_SETTING, "x,y,z"); Operation op = runConnectionTest(); assertObscuredProperties(op, StringUtil.explode(JdbcDriverConnectOperationCollectionAspect.DEFAULT_OBFUSCATED_PROPERTIES_LIST, ","), false); } @Override public JdbcDriverConnectOperationCollectionAspect getAspect() { return JdbcDriverConnectOperationCollectionAspect.aspectOf(); } private Operation runConnectionTest() throws SQLException { Connection conn = connectDriver.connect(connectUrl, connectProps); try { DatabaseMetaData metaData = conn.getMetaData(); String connURL = metaData.getURL(); /* * NOTE: this is not a test failure since this is not where we expect to * get our data, but let's leave it here in case we detect something strange */ assertEquals("Mismatched meta-data URL(s)", connectUrl, connURL); assertTrackedConnection(conn, connURL); } finally { conn.close(); // don't need it for anything assertConnectionNotTracked(conn); } return assertConnectDetails(connectDriver, connectUrl, connectProps); } private Operation assertConnectDetails(Driver driver, String url, Properties props) { Operation op = assertConnectDetails(url, "create"); assertEquals("Mismatched driver class", driver.getClass().getName(), op.get("driverClass", String.class)); OperationMap actualParams = op.get("params", OperationMap.class); if (actualParams != null) { // OK if missing - means 'collectExtraInformation' is FALSE OperationMap expectedParams = JdbcDriverConnectOperationCollectionAspect.addConnectionProperties(new Operation(), props); assertEquals("Mismatched parameters size", expectedParams.size(), actualParams.size()); for (String key : expectedParams.keySet()) { Object expValue = expectedParams.get(key), actValue = actualParams.get(key); assertEquals("Mismatched value for parameter=" + key, expValue, actValue); } } return op; } private void assertObscuredProperties(Operation op, Collection<String> obscuredKeys, boolean expectedState) { OperationMap params = op.get("params", OperationMap.class); if (params == null) return; JdbcDriverConnectOperationCollectionAspect aspectInstance = getAspect(); ObscuredValueSetMarker obscuredValue = (ObscuredValueSetMarker) aspectInstance.getSensitiveValueMarker(); for (String key : obscuredKeys) { Object value = params.get(key); if (value == null) { continue; } assertEquals("Key=" + key + " obscured state mismatch", Boolean.valueOf(expectedState), Boolean.valueOf(obscuredValue.contains(value))); } } }