package org.teiid.jdbc; import static org.junit.Assert.*; import java.io.ByteArrayInputStream; import java.sql.SQLException; import java.util.Arrays; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.teiid.adminapi.impl.VDBImportMetadata; import org.teiid.core.util.UnitTestUtil; import org.teiid.jdbc.FakeServer.DeployVDBParameter; import org.teiid.runtime.HardCodedExecutionFactory; @SuppressWarnings("nls") public class TestVDBMerge extends AbstractMMQueryTestCase { private static final String VDB1 = "PartsSupplier"; //$NON-NLS-1$ private static final String VDB2 = "QT_Ora9DS"; //$NON-NLS-1$ private FakeServer server; @Before public void setup() throws Exception { server = new FakeServer(true); server.setThrowMetadataErrors(false); //test vdb has errors } @After public void teardown() throws Exception { server.stop(); } @Test public void testMerge() throws Throwable { server.deployVDB(VDB1, UnitTestUtil.getTestDataPath() + "/PartsSupplier.vdb"); this.internalConnection = server.createConnection("jdbc:teiid:"+VDB1); execute("select * from tables where schemaname ='PartsSupplier'"); //$NON-NLS-1$ TestMMDatabaseMetaData.compareResultSet("TestVDBMerge/merge.test", this.internalResultSet); execute("select * from tables where schemaname='BQT1'"); //$NON-NLS-1$ TestMMDatabaseMetaData.compareResultSet("TestVDBMerge/merge.before", this.internalResultSet); this.internalConnection.close(); server.deployVDB(VDB2, UnitTestUtil.getTestDataPath()+"/QT_Ora9DS_1.vdb"); DeployVDBParameter param = new DeployVDBParameter(null, null); VDBImportMetadata vdbImport = new VDBImportMetadata(); vdbImport.setName(VDB2); vdbImport.setVersion("1"); param.vdbImports = Arrays.asList(vdbImport); server.removeVDB(VDB1); server.deployVDB(VDB1, UnitTestUtil.getTestDataPath()+"/PartsSupplier.vdb", param); this.internalConnection = server.createConnection("jdbc:teiid:"+VDB1); execute("select * from tables where schemaname='BQT1' order by name"); //$NON-NLS-1$ TestMMDatabaseMetaData.compareResultSet("TestVDBMerge/merge.after", this.internalResultSet); } @Test public void testMergeWithEmptyVDB() throws Exception { server.deployVDB("empty", UnitTestUtil.getTestDataPath() + "/empty.vdb"); this.internalConnection = server.createConnection("jdbc:teiid:empty"); execute("select * from tables where schemaname ='BQT1'"); //$NON-NLS-1$ TestMMDatabaseMetaData.compareResultSet("TestVDBMerge/mergeEmpty.before", this.internalResultSet); this.internalConnection.close(); server.deployVDB(VDB2, UnitTestUtil.getTestDataPath()+"/QT_Ora9DS_1.vdb"); DeployVDBParameter param = new DeployVDBParameter(null, null); VDBImportMetadata vdbImport = new VDBImportMetadata(); vdbImport.setName(VDB2); vdbImport.setVersion("1"); param.vdbImports = Arrays.asList(vdbImport); server.undeployVDB("empty"); server.deployVDB("empty", UnitTestUtil.getTestDataPath() + "/empty.vdb", param); this.internalConnection = server.createConnection("jdbc:teiid:empty"); execute("select * from tables where schemaname='BQT1'"); //$NON-NLS-1$ TestMMDatabaseMetaData.compareResultSet("TestVDBMerge/mergeEmpty.after", this.internalResultSet); } @Test public void testMergeWithPolicies() throws Exception { server.deployVDB(new ByteArrayInputStream(new String("<vdb name=\"role-1\" version=\"1\">" + "<model name=\"myschema\" type=\"virtual\">" + "<metadata type = \"DDL\"><![CDATA[CREATE VIEW vw as select 'a' as col;]]></metadata></model>" + "<data-role name=\"y\" any-authenticated=\"true\"/></vdb>").getBytes())); this.internalConnection = server.createConnection("jdbc:teiid:role-1"); try { execute("select * from vw"); //$NON-NLS-1$ fail("should not be authorized"); } catch (SQLException e) { } server.deployVDB(new ByteArrayInputStream(new String("<vdb name=\"role-2\" version=\"1\">" + "<import-vdb name=\"role-1\" version=\"1\"/>" + "</vdb>").getBytes())); this.internalConnection = server.createConnection("jdbc:teiid:role-2"); try { execute("select * from vw"); //$NON-NLS-1$ fail("should not be authorized"); } catch (SQLException e) { } server.deployVDB(new ByteArrayInputStream(new String("<vdb name=\"role-3\" version=\"1\">" + "<import-vdb name=\"role-1\" version=\"1\" import-data-policies=\"false\"/>" + "</vdb>").getBytes())); this.internalConnection = server.createConnection("jdbc:teiid:role-3"); execute("select * from vw"); //$NON-NLS-1$ } @Test public void testMergeWithMultiSource() throws Exception { HardCodedExecutionFactory hc = new HardCodedExecutionFactory(); hc.addData("SELECT tbl.col FROM tbl", Arrays.asList(Arrays.asList("a"))); server.addTranslator("hc", hc); server.deployVDB(new ByteArrayInputStream(new String("<vdb name=\"ms-base\" version=\"1\">" + "<model name=\"myschema\"><source name=\"a\" translator-name=\"hc\"/><source name=\"b\" translator-name=\"hc\"/>" + "<metadata type = \"DDL\"><![CDATA[CREATE foreign table tbl (col string);]]></metadata></model>" + "</vdb>").getBytes())); this.internalConnection = server.createConnection("jdbc:teiid:ms-base"); execute("select * from tbl"); //$NON-NLS-1$ assertRowCount(2); server.deployVDB(new ByteArrayInputStream(new String("<vdb name=\"ms-2\" version=\"1\">" + "<import-vdb name=\"ms-base\" version=\"1\"/>" + "</vdb>").getBytes())); this.internalConnection = server.createConnection("jdbc:teiid:ms-2"); execute("select * from tbl"); //$NON-NLS-1$ assertRowCount(2); } }