package kg.apc.jmeter.dbmon; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.util.HashMap; import java.util.Map; import kg.apc.emulators.TestJMeterUtils; import kg.apc.jmeter.JMeterPluginsUtils; import kg.apc.jmeter.vizualizers.DbMonGui; import org.apache.avalon.excalibur.datasource.DataSourceComponent; import org.apache.avalon.framework.configuration.Configuration; import org.apache.avalon.framework.configuration.ConfigurationException; import org.apache.jmeter.gui.util.PowerTableModel; import org.apache.jmeter.samplers.SampleEvent; import org.apache.jmeter.threads.JMeterContextService; import static org.junit.Assert.*; import org.junit.Before; import org.junit.Test; public class DbmonTest implements TestConnection.TestConnectionDataProvider { public static final String TEST_CONNECTION = "testConnection"; public static final String QUERY1 = "select value1 from table1"; public static final String QUERY2 = "select value2 from table1"; public static final String PROBE1 = "probe1"; public static final String PROBE2 = "probe2"; private PowerTableModel dataModel; private boolean threadStoped = false; private Map<String, Double> latestSamples = new HashMap<String, Double>(); private Map<String, Double> queryResults = new HashMap<String, Double>(); @Before public void setUp() { TestJMeterUtils.createJmeterEnv(); JMeterContextService.getContext().getVariables().putObject(TEST_CONNECTION, new TestDataSource()); dataModel = new PowerTableModel(DbMonGui.columnIdentifiers, DbMonGui.columnClasses); dataModel.addRow(new Object[]{TEST_CONNECTION, PROBE1, false, QUERY1}); dataModel.addRow(new Object[]{TEST_CONNECTION, PROBE2, true, QUERY2}); } @Test public void testRun() throws InterruptedException { DbMonCollector instance = new TestDbMonCollector(); instance.setData(JMeterPluginsUtils.tableModelRowsToCollectionProperty(dataModel, DbMonCollector.DATA_PROPERTY)); instance.testStarted("localhost"); setQueryResult(QUERY1, 1); setQueryResult(QUERY2, 1); instance.processConnectors(); assertLastSample(PROBE1, 1); assertNull(latestSamples.get(PROBE2)); // Delta can not produce values at first loop setQueryResult(QUERY1, -2); setQueryResult(QUERY2, 2); instance.processConnectors(); assertLastSample(PROBE1, -2); assertLastSample(PROBE2, 1); setQueryResult(QUERY1, 13); setQueryResult(QUERY2, 1); instance.processConnectors(); assertLastSample(PROBE1, 13); assertLastSample(PROBE2, -1); instance.testEnded(); assertSampleGeneratorThreadIsStoped(); } public void setQueryResult(String sql, double value) { queryResults.put(sql, value); } @Override public ResultSet getQueryResult(String sql) { return TestConnection.resultSet(queryResults.get(sql)); } private void assertSampleGeneratorThreadIsStoped() throws InterruptedException { synchronized (this) { if (!threadStoped) { wait(1000); assertTrue(threadStoped); } } } private void assertLastSample(String probeName, double expected) { final Double actual = latestSamples.get(probeName); assertEquals(expected, actual, 0.0001); } private class TestDataSource implements DataSourceComponent { @Override public Connection getConnection() throws SQLException { return new TestConnection(DbmonTest.this); } @Override public void configure(Configuration c) throws ConfigurationException { throw new UnsupportedOperationException("Not supported yet."); } } private class TestDbMonCollector extends DbMonCollector { @Override public void run() { try { // Override run to controll the entire flow from the test Thread.sleep(24 * 60 * 60 * 1000); } catch (InterruptedException ex) { synchronized (DbmonTest.this) { threadStoped = true; DbmonTest.this.notifyAll(); } } } @Override public void dbMonSampleOccurred(SampleEvent event) { super.sampleOccurred(event); double value = DbMonSampleResult.getValue(event.getResult()); latestSamples.put(event.getResult().getSampleLabel(), value); } } }