/* * #%L * P6Spy * %% * Copyright (C) 2013 P6Spy * %% * 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. * #L% */ package com.p6spy.engine.spy; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.io.IOException; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import com.p6spy.engine.logging.P6LogOptions; import com.p6spy.engine.test.P6TestFramework; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; @RunWith(Parameterized.class) public class P6TestResultSet extends P6TestFramework { ResultSet resultSet = null; public P6TestResultSet(String db) throws SQLException, IOException { super(db); } @Before public void setup() throws SQLException { resultSet = executeQuery("select id from customers where id in (1,2,3,4) order by id"); P6LogOptions.getActiveInstance().setExcludecategories("info,debug,result"); clearLogEntries(); clearLastLogStackTrace(); } private ResultSet executeQuery(String sql) throws SQLException { Statement statement = connection.createStatement(); return statement.executeQuery(sql); } @Test public void testSkipLoggingBeforeFirstRowOnNext() throws SQLException { // The first call to ResultSet.next() should not log anything since // it is the advance to the first row. No columns could have been accessed. //when resultSet.next(); //then assertEquals("Incorrect number of log messages", 0, getLogEntriesCount()); } @Test public void testSkipLoggingBeforeFirstRowOnClose() throws SQLException { // Calling ResultSet.close() before the first row is accessed should not log anything //when resultSet.close(); //then assertEquals("Incorrect number of log messages", 0, getLogEntriesCount()); } @Test public void testLoggingOnNext() throws SQLException { // Columns accessed on the current row should be logged when // ResultSet.next() is called. // given resultSet.next(); // advance to first row //when resultSet.getInt("id"); resultSet.next(); //then assertEquals("Incorrect number of log messages", 1, getLogEntriesCount()); } @Test public void testLoggingOnNextWithNoColumnsAccessed() throws SQLException { // Even rows on which no columns have been accessed should be logged // given resultSet.next(); // advance to first row //when resultSet.next(); //then assertEquals("Incorrect number of log messages", 1, getLogEntriesCount()); } @Test public void testLoggingOnCloseBeforeEndOfResultSet() throws SQLException { // Calling ResultSet.close() after ResultSet.next() returns true should result in a // log message. // given resultSet.next(); // advance to first row //when resultSet.getInt("id"); resultSet.close(); //then assertEquals("Incorrect number of log messages", 1, getLogEntriesCount()); } @Test public void testLoggingOnCloseAfterEndOfResultSet() throws SQLException { // Calling ResultSet.close() after ResultSet.next() returns false should not result in a // log message. // given while( resultSet.next() ) { resultSet.getInt("id"); } clearLogEntries(); //when resultSet.close(); //then assertEquals("Incorrect number of log messages", 0, getLogEntriesCount()); } @Test public void testLogMessageCountWhenAllRowsRead() throws SQLException { // The query will return 4 records. 4 log messages will be created. // when while( resultSet.next() ) { resultSet.getInt("id"); } resultSet.close(); //then assertEquals("Incorrect number of log messages", 4, getLogEntriesCount()); assertTrue(getLogEntries().get(0).contains("id = 1")); assertTrue(getLogEntries().get(1).contains("id = 2")); assertTrue(getLogEntries().get(2).contains("id = 3")); assertTrue(getLogEntries().get(3).contains("id = 4")); } @Test public void testLogMessageCountWhenLessThanAllRowsAreRead() throws SQLException { // The query will return 4 records. Only the first record will be accessed. // given resultSet.next(); // advance to first row // when resultSet.getInt("id"); resultSet.close(); //then assertEquals("Incorrect number of log messages", 1, getLogEntriesCount()); } @Test public void testNoLoggingOnEmptyResultSetOnClose() throws SQLException { // Calls to ResultSet.close() should not produce // log messages if no rows were returned // given resultSet = executeQuery("select id from customers where 1=0"); clearLogEntries(); //when resultSet.next(); // this will return false resultSet.close(); // then assertEquals("Incorrect number of log messages", 0, getLogEntriesCount()); } @Test public void testResultLogging() throws SQLException { // Every call to ResultSet.next() that returns true should log the execution time in RESULT category // given P6LogOptions.getActiveInstance().setExcludecategories("info,debug,resultset"); int rowCount = 0; // when while( resultSet.next() ) { rowCount++; } // then assertEquals("Incorrect number of log messages", rowCount, getLogEntriesCount()); } }