package com.teiid.quickstart.loopback; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertEquals; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.junit.Assert; import org.junit.Test; import org.teiid.language.Command; import org.teiid.metadata.RuntimeMetadata; import org.teiid.translator.DataNotAvailableException; import org.teiid.translator.Execution; import org.teiid.translator.ResultSetExecution; import org.teiid.translator.TranslatorException; import org.teiid.translator.UpdateExecution; import org.teiid.translator.loopback.LoopbackExecutionFactory; import com.teiid.quickstart.FakeTranslationFactory; import com.teiid.quickstart.TranslationUtility; public class TestLoopback { @Test public void testInit() { LoopbackExecutionFactory factory = new LoopbackExecutionFactory(); factory.setWaitTime(1000 * 5); factory.setRowCount(100); assertNotNull(factory); } @Test public void testSearch() throws TranslatorException { LoopbackExecutionFactory factory = new LoopbackExecutionFactory(); factory.setWaitTime(0); factory.setRowCount(1); factory.setIncrementRows(false); String sql = "SELECT intkey FROM BQT1.SmallA"; TranslationUtility util = FakeTranslationFactory.getInstance().getBQTTranslationUtility(); Object[][] expectedResults = new Object[][] {new Object[] { new Integer(0) }}; Command command = util.parseCommand(sql); RuntimeMetadata metadata = util.createRuntimeMetadata(); Execution exec = factory.createExecution(command, null, metadata, null); exec.execute(); List results = readResultsFromExecution(exec); exec.close(); assertEquals(results.size(), expectedResults.length); compareResults(expectedResults, results); } @Test public void testInsert() throws Exception { LoopbackExecutionFactory factory = new LoopbackExecutionFactory(); factory.setWaitTime(0); factory.setRowCount(1); factory.setIncrementRows(false); String sql = "INSERT INTO BQT1.SmallA (stringkey) VALUES ('x')"; TranslationUtility util = FakeTranslationFactory.getInstance().getBQTTranslationUtility(); Object[][] expectedResults = new Object[][] {new Object[] { new Integer(0) }}; Command command = util.parseCommand(sql); RuntimeMetadata metadata = util.createRuntimeMetadata(); Execution exec = factory.createExecution(command, null, metadata, null); exec.execute(); List results = readResultsFromExecution(exec); exec.close(); assertEquals(results.size(), expectedResults.length); compareResults(expectedResults, results); } @Test public void testUpdate() throws Exception { LoopbackExecutionFactory factory = new LoopbackExecutionFactory(); factory.setWaitTime(0); factory.setRowCount(1); factory.setIncrementRows(false); String sql = "UPDATE BQT1.SmallA SET stringkey = 'x'"; TranslationUtility util = FakeTranslationFactory.getInstance().getBQTTranslationUtility(); Object[][] expectedResults = new Object[][] {new Object[] { new Integer(0) }}; Command command = util.parseCommand(sql); RuntimeMetadata metadata = util.createRuntimeMetadata(); Execution exec = factory.createExecution(command, null, metadata, null); exec.execute(); List results = readResultsFromExecution(exec); exec.close(); assertEquals(results.size(), expectedResults.length); compareResults(expectedResults, results); } @Test public void testDelete() throws Exception { LoopbackExecutionFactory factory = new LoopbackExecutionFactory(); factory.setWaitTime(0); factory.setRowCount(1); factory.setIncrementRows(false); String sql = "DELETE FROM BQT1.SmallA"; TranslationUtility util = FakeTranslationFactory.getInstance().getBQTTranslationUtility(); Object[][] expectedResults = new Object[][] {new Object[] { new Integer(0) }}; Command command = util.parseCommand(sql); RuntimeMetadata metadata = util.createRuntimeMetadata(); Execution exec = factory.createExecution(command, null, metadata, null); exec.execute(); List results = readResultsFromExecution(exec); exec.close(); assertEquals(results.size(), expectedResults.length); compareResults(expectedResults, results); } private void compareResults(Object[][] expectedResults, List results) { for(int r=0; r<expectedResults.length; r++) { Object[] expectedRow = expectedResults[r]; List actualRow = (List) results.get(r); for (int c = 0; c < expectedRow.length; c++) { Object expectedValue = expectedRow[c]; Object actualValue = actualRow.get(c); if (expectedValue == null) { if (actualValue != null) { Assert.fail("Row " + r + ", Col " + c + ": Expected null but got " + actualValue + " of type " + actualValue.getClass().getName()); } } else if(actualValue == null) { Assert.fail("Row " + r + ", Col " + c + ": Expected " + expectedValue + " but got null"); } else { Assert.assertEquals("Row " + r + ", Col " + c + ": Expected " + expectedValue + " but got " + actualValue, expectedValue, actualValue); } } } } private List<List> readResultsFromExecution(Execution execution) throws TranslatorException { List<List> results = new ArrayList<List>(); while (true) { try { if (execution instanceof ResultSetExecution) { ResultSetExecution rs = (ResultSetExecution)execution; List result = null; while ((result = rs.next()) != null) { results.add(result); } break; } UpdateExecution rs = (UpdateExecution)execution; int[] result = rs.getUpdateCounts(); for (int i = 0; i < result.length; i++) { results.add(Arrays.asList(result[i])); } break; } catch (DataNotAvailableException e) { if (e.getRetryDelay() > 0) { try { Thread.sleep(e.getRetryDelay()); } catch (InterruptedException e1) { throw new TranslatorException(e1); } } } } return results; } }