/*
* JBoss, Home of Professional Open Source.
* See the COPYRIGHT.txt file distributed with this work for information
* regarding copyright ownership. Some portions may be licensed
* to Red Hat, Inc. under one or more contributor license agreements.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301 USA.
*/
package org.teiid.arquillian;
import static org.junit.Assert.*;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Properties;
import java.util.Set;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import org.jboss.arquillian.junit.Arquillian;
import org.jboss.shrinkwrap.api.ArchivePaths;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.asset.ByteArrayAsset;
import org.jboss.shrinkwrap.api.exporter.ZipExporter;
import org.jboss.shrinkwrap.api.spec.JavaArchive;
import org.junit.After;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.postgresql.Driver;
import org.teiid.adminapi.*;
import org.teiid.adminapi.Admin.TranlatorPropertyType;
import org.teiid.adminapi.VDB.ConnectionType;
import org.teiid.adminapi.VDB.Status;
import org.teiid.adminapi.impl.VDBTranslatorMetaData;
import org.teiid.adminapi.jboss.AdminFactory;
import org.teiid.core.util.UnitTestUtil;
import org.teiid.jdbc.TeiidDriver;
@RunWith(Arquillian.class)
@SuppressWarnings("nls")
public class IntegrationTestDeployment {
private Admin admin;
@Before
public void setup() throws Exception {
admin = AdminFactory.getInstance().createAdmin("localhost",
AdminUtil.MANAGEMENT_PORT, "admin", "admin".toCharArray());
}
@After
public void teardown() throws AdminException {
AdminUtil.cleanUp(admin);
admin.close();
}
@Test public void testChainedDelegates() throws Exception {
Properties props = new Properties();
props.setProperty("connection-url","jdbc:h2:mem:test;DB_CLOSE_DELAY=-1");
props.setProperty("user-name", "sa");
props.setProperty("password", "sa");
AdminUtil.createDataSource(admin, "ChainedDS", "h2", props);
admin.deploy("fake.jar",new FileInputStream(UnitTestUtil.getTestDataFile("fake.jar")));
try {
admin.deploy("chained-vdb.xml",new FileInputStream(UnitTestUtil.getTestDataFile("chained-vdb.xml")));
} finally {
admin.undeploy("fake.jar");
admin.deleteDataSource("ChainedDS");
}
}
@Test
public void testVDBDeployment() throws Exception {
Collection<?> vdbs = admin.getVDBs();
assertTrue(vdbs.toString(), vdbs.isEmpty());
Collection<String> dsNames = admin.getDataSourceNames();
if (dsNames.contains("Oracle11_PushDS")) {
admin.deleteDataSource("Oracle11_PushDS");
}
admin.deploy("bqt.vdb",new FileInputStream(UnitTestUtil.getTestDataFile("bqt.vdb")));
vdbs = admin.getVDBs();
assertFalse(vdbs.isEmpty());
VDB vdb = admin.getVDB("bqt", 1);
assertFalse(vdb.isValid());
assertTrue(AdminUtil.waitForVDBLoad(admin, "bqt", 1, 3));
assertFalse(vdb.isValid());
Properties props = new Properties();
props.setProperty("connection-url","jdbc:h2:mem:test;DB_CLOSE_DELAY=-1");
props.setProperty("user-name", "sa");
props.setProperty("password", "sa");
props.setProperty("connection-properties", "foo=bar,blah=blah");
admin.createDataSource("Oracle11_PushDS", "h2", props);
vdb = admin.getVDB("bqt", 1);
assertTrue(vdb.isValid());
assertTrue(vdb.getStatus().equals(Status.ACTIVE));
dsNames = admin.getDataSourceNames();
assertTrue(dsNames.contains("Oracle11_PushDS"));
/*
admin.deleteDataSource("Oracle11_PushDS");
vdb = admin.getVDB("bqt", 1);
assertFalse(vdb.isValid());
admin.deploy("bqt.2.vdb",new FileInputStream(UnitTestUtil.getTestDataFile("bqt.vdb")));
vdb = admin.getVDB("bqt", 2);
assertEquals("2", vdb.getVersion());
*/
}
@Test
public void testGetDatasourceProperties() throws Exception {
// jdbc data source
String jdbcSource = "jdbc-source";
assertFalse(admin.getDataSourceNames().contains(jdbcSource));
Properties props = new Properties();
props.setProperty("connection-url","jdbc:h2:mem:test;DB_CLOSE_DELAY=-1");
props.setProperty("user-name", "sa");
props.setProperty("password", "sa");
props.setProperty("connection-properties", "foo=bar,blah=blah");
props.setProperty("max-pool-size", "4");
admin.createDataSource(jdbcSource, "h2", props);
assertTrue(admin.getDataSourceNames().contains(jdbcSource));
Properties p = admin.getDataSource(jdbcSource);
assertEquals("4", p.getProperty("max-pool-size"));
assertEquals("jdbc:h2:mem:test;DB_CLOSE_DELAY=-1", p.getProperty("connection-url"));
assertEquals("h2", p.getProperty("driver-name"));
admin.deleteDataSource("jdbc-source");
assertFalse(admin.getDataSourceNames().contains(jdbcSource));
// resource -adapter
assertTrue(admin.getDataSourceTemplateNames().contains("webservice"));
String raSource = "ra-source";
assertFalse(admin.getDataSourceNames().contains(raSource));
p = new Properties();
p.setProperty("class-name", "org.teiid.resource.adapter.ws.WSManagedConnectionFactory");
p.setProperty("EndPoint", "{endpoint}");
admin.createDataSource(raSource, "webservice", p);
assertTrue(admin.getDataSourceNames().contains(raSource));
p = admin.getDataSource(raSource);
assertEquals("org.teiid.resource.adapter.ws.WSManagedConnectionFactory", p.getProperty("class-name"));
assertEquals("{endpoint}", p.getProperty("EndPoint"));
assertEquals("webservice", p.getProperty("driver-name"));
admin.deleteDataSource(raSource);
assertFalse(admin.getDataSourceNames().contains(raSource));
assertTrue(admin.getDataSourceTemplateNames().contains("webservice"));
}
@Test
public void testTraslators() throws Exception {
Collection<? extends Translator> translators = admin.getTranslators();
assertEquals(translators.toString(), 58, translators.size());
JavaArchive jar = getLoopyArchive();
try {
admin.deploy("loopy.jar", jar.as(ZipExporter.class).exportAsInputStream());
VDBTranslatorMetaData t = (VDBTranslatorMetaData)admin.getTranslator("loopy");
assertNotNull(t);
assertEquals("ANY", t.getPropertyValue("SupportedJoinCriteria"));
assertEquals("true", t.getPropertyValue("supportsSelectDistinct"));
} finally {
admin.undeploy("loopy.jar");
}
VDBTranslatorMetaData t = (VDBTranslatorMetaData)admin.getTranslator("orcl");
assertNull(t);
}
@Test
public void testTraslatorProperties() throws Exception {
Collection<? extends PropertyDefinition> props = admin.getTranslatorPropertyDefinitions("accumulo", TranlatorPropertyType.OVERRIDE);
assertEquals(20, props.size());
props = admin.getTranslatorPropertyDefinitions("accumulo", TranlatorPropertyType.EXTENSION_METADATA);
assertEquals(3, props.size());
for (PropertyDefinition p: props) {
if (p.getName().equals("{http://www.teiid.org/translator/accumulo/2013}CF")) {
assertEquals("org.teiid.metadata.Column", p.getPropertyValue("owner"));
}
}
props = admin.getTranslatorPropertyDefinitions("accumulo", TranlatorPropertyType.IMPORT);
assertEquals(2, props.size());
for (PropertyDefinition p: props) {
if (p.getName().equals("importer.ColumnNamePattern")) {
assertEquals("java.lang.String", p.getPropertyTypeClassName());
}
}
}
private JavaArchive getLoopyArchive() {
JavaArchive jar = ShrinkWrap.create(JavaArchive.class, "loopy.jar")
.addClasses(SampleExecutionFactory.class)
.addAsManifestResource(new ByteArrayAsset(SampleExecutionFactory.class.getName().getBytes()),
ArchivePaths.create("services/org.teiid.translator.ExecutionFactory"));
jar.addAsManifestResource(new ByteArrayAsset("Dependencies: org.jboss.teiid.translator.loopback\n".getBytes()),
ArchivePaths.create("MANIFEST.MF"));
return jar;
}
@Test
public void testVDBConnectionType() throws Exception {
admin.deploy("bqt.vdb", new FileInputStream(UnitTestUtil.getTestDataFile("bqt.vdb")));
AdminUtil.waitForVDBLoad(admin, "bqt2", 1, 3);
VDB vdb = admin.getVDB("bqt", 1);
Model model = vdb.getModels().get(0);
admin.updateSource("bqt", 1, "Source", "h2", "java:jboss/datasources/ExampleDS");
try {
//should not be able to remove from non-multisource
admin.removeSource("bqt", 1, model.getName(), "Source");
fail();
} catch (AdminException e) {
}
assertEquals(ConnectionType.BY_VERSION, vdb.getConnectionType());
Connection conn = TeiidDriver.getInstance().connect("jdbc:teiid:bqt@mm://localhost:31000;user=user;password=user", null);
conn.close();
admin.changeVDBConnectionType("bqt", 1, ConnectionType.NONE);
try {
TeiidDriver.getInstance().connect("jdbc:teiid:bqt@mm://localhost:31000;user=user;password=user", null);
fail("should have failed to connect as no new connections allowed");
} catch (Exception e) {
//pass
}
admin.deploy("bqt2.vdb", new FileInputStream(UnitTestUtil.getTestDataFile("bqt2.vdb")));
AdminUtil.waitForVDBLoad(admin, "bqt2", 1, 3);
admin.updateSource("bqt", 2, "Source", "h2", "java:jboss/datasources/ExampleDS");
conn = TeiidDriver.getInstance().connect("jdbc:teiid:bqt@mm://localhost:31000;user=user;password=user", null);
conn.close();
admin.changeVDBConnectionType("bqt", 2, ConnectionType.ANY);
conn = TeiidDriver.getInstance().connect("jdbc:teiid:bqt@mm://localhost:31000;user=user;password=user", null);
conn.close();
vdb = admin.getVDB("bqt", 2);
model = vdb.getModels().get(0);
assertEquals(model.getSourceConnectionJndiName("Source"), "java:jboss/datasources/ExampleDS");
assertEquals(model.getSourceTranslatorName("Source"), "h2");
assertEquals(ConnectionType.ANY, vdb.getConnectionType());
}
@Test
public void testCacheTypes() throws Exception {
String[] array = {Admin.Cache.PREPARED_PLAN_CACHE.toString(), Admin.Cache.QUERY_SERVICE_RESULT_SET_CACHE.toString()};
Collection<String> types = admin.getCacheTypes();
assertArrayEquals(array, types.toArray());
}
@Test
public void testSessions() throws Exception {
deployVdb();
Collection<? extends Session> sessions = admin.getSessions();
assertEquals (0, sessions.size());
Connection conn = TeiidDriver.getInstance().connect("jdbc:teiid:bqt@mm://localhost:31000;user=user;password=user;ApplicationName=test", null);
sessions = admin.getSessions();
assertEquals (1, sessions.size());
Session s = sessions.iterator().next();
assertEquals("user", s.getUserName());
assertEquals("test", s.getApplicationName());
assertEquals("bqt", s.getVDBName());
assertEquals("1", s.getVDBVersion());
assertNotNull(s.getSessionId());
conn.close();
conn = TeiidDriver.getInstance().connect("jdbc:teiid:bqt@mm://localhost:31000;user=user;password=user;ApplicationName=test", null);
sessions = admin.getSessions();
assertEquals (1, sessions.size());
s = sessions.iterator().next();
admin.terminateSession(s.getSessionId());
Thread.sleep(2000);
sessions = admin.getSessions();
assertEquals (0, sessions.size());
conn.close();
}
private boolean deployVdb() throws AdminException, FileNotFoundException {
boolean vdbOneDeployed;
admin.deploy("bqt.vdb", new FileInputStream(UnitTestUtil.getTestDataFile("bqt.vdb")));
AdminUtil.waitForVDBLoad(admin, "bqt", 1, 3);
vdbOneDeployed = true;
VDB vdb = admin.getVDB("bqt", 1);
Model model = vdb.getModels().get(0);
admin.updateSource("bqt", 1, "Source", "h2", "java:jboss/datasources/ExampleDS");
return vdbOneDeployed;
}
@Test
public void testOSDQ() throws Exception {
deployVdb();
Connection conn = TeiidDriver.getInstance().connect("jdbc:teiid:bqt@mm://localhost:31000;user=user;password=user;ApplicationName=test", null);
Statement s = conn.createStatement();
ResultSet rs = s.executeQuery("select osdq.validemail('not really'), validemail('user@teiid.org')");
rs.next();
assertFalse(rs.getBoolean(1));
assertTrue(rs.getBoolean(2));
conn.close();
}
@Test
public void testGetRequests() throws Exception {
JavaArchive jar = getLoopyArchive();
try {
admin.deploy("loopy.jar", jar.as(ZipExporter.class).exportAsInputStream());
deployVdb();
Translator t = admin.getTranslator("loopy");
assertNotNull(t);
admin.updateSource("bqt", 1, "Source", "loopy", "java:jboss/datasources/ExampleDS");
Connection conn = TeiidDriver.getInstance().connect("jdbc:teiid:bqt@mm://localhost:31000;user=user;password=user", null);
Collection<? extends Session> sessions = admin.getSessions();
assertTrue (sessions.size() >= 1);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("select session_id()");
rs.next();
String session = rs.getString(1);
rs.close();
Thread.sleep(500);
Collection<? extends Request> requests = admin.getRequestsForSession(session);
assertEquals(0, requests.size());
stmt.execute("select * from source.smalla");
requests = admin.getRequests();
assertEquals(1, requests.size());
Request r = requests.iterator().next();
assertEquals("select * from source.smalla", r.getCommand());
assertNotNull(r.getExecutionId());
assertNotNull(r.getSessionId());
String plan = admin.getQueryPlan(r.getSessionId(), r.getExecutionId());
assertNotNull(plan);
stmt.execute("select * from source.smalla");
Collection<? extends Request> requests2 = admin.getRequestsForSession(session);
assertEquals(1, requests2.size());
Request r2 = requests.iterator().next();
assertEquals("select * from source.smalla", r2.getCommand());
assertEquals(session, r2.getSessionId());
stmt.close();
conn.close();
requests = admin.getRequestsForSession(session);
assertEquals(0, requests.size());
} finally {
admin.undeploy("loopy.jar");
}
}
@Test
public void getDatasourceTemplateNames() throws Exception {
Set<String> vals = new HashSet<String>(Arrays.asList(new String[]{"teiid-local", "google", "teiid", "ldap",
"accumulo", "file", "ftp", "cassandra", "salesforce", "salesforce-34", "mongodb", "solr", "webservice",
"simpledb", "h2", "teiid-xa", "h2-xa", "teiid-local-xa", "couchbase", "infinispan"}));
deployVdb();
Set<String> templates = admin.getDataSourceTemplateNames();
assertEquals(vals, templates);
}
@Test
public void getTemplatePropertyDefinitions() throws Exception{
HashSet<String> props = new HashSet<String>();
deployVdb();
Collection<? extends PropertyDefinition> pds = admin.getTemplatePropertyDefinitions("h2");
for(PropertyDefinition pd:pds) {
props.add(pd.getName());
}
assertTrue(props.contains("connection-url"));
assertTrue(props.contains("user-name"));
assertTrue(props.contains("password"));
assertTrue(props.contains("check-valid-connection-sql"));
assertTrue(props.contains("max-pool-size"));
assertTrue(props.contains("connection-properties"));
assertTrue(props.contains("max-pool-size"));
HashSet<String> rar_props = new HashSet<String>();
pds = admin.getTemplatePropertyDefinitions("file");
for(PropertyDefinition pd:pds) {
rar_props.add(pd.getName());
}
assertTrue(rar_props.contains("ParentDirectory"));
assertTrue(rar_props.contains("FileMapping"));
assertTrue(rar_props.contains("AllowParentPaths"));
assertTrue(rar_props.contains("resourceadapter-class"));
assertTrue(rar_props.contains("managedconnectionfactory-class"));
assertTrue(rar_props.contains("max-pool-size"));
}
@Test
public void getTranslatorPropertyDefinitions() throws Exception{
HashSet<String> props = new HashSet<String>();
Collection<? extends PropertyDefinition> pds = admin.getTranslatorPropertyDefinitions("ws");
for(PropertyDefinition pd:pds) {
props.add(pd.getName());
}
assertTrue(props.contains("DefaultBinding"));
assertTrue(props.contains("DefaultServiceMode"));
assertTrue(props.contains("MaxDependentInPredicates"));
for(PropertyDefinition pd:pds) {
if (pd.getName().equals("DefaultBinding")) {
assertEquals("java.lang.String", pd.getPropertyTypeClassName());
assertFalse(pd.isRequired());
assertEquals("Contols what SOAP or HTTP type of invocation will be used if none is specified.", pd.getDescription());
assertEquals("Default Binding", pd.getDisplayName());
assertTrue(pd.isModifiable());
assertFalse(pd.isAdvanced());
assertFalse(pd.isMasked());
assertEquals("SOAP12", pd.getDefaultValue());
assertNotNull(pd.getAllowedValues());
}
}
}
@Test
public void getWorkerPoolStats() throws Exception{
deployVdb();
assertNotNull(admin.getWorkerPoolStats());
}
@Test
public void testDataRoleMapping() throws Exception{
admin.deploy("bqt2.vdb", new FileInputStream(UnitTestUtil.getTestDataFile("bqt2.vdb")));
AdminUtil.waitForVDBLoad(admin, "bqt2", 1, 3);
VDB vdb = admin.getVDB("bqt", 2);
Model model = vdb.getModels().get(0);
admin.updateSource("bqt", 2, "Source", "h2", "java:jboss/datasources/ExampleDS");
vdb = admin.getVDB("bqt", 2);
assertTrue(vdb.isValid());
List<DataPolicy> policies = vdb.getDataPolicies();
assertEquals(1, policies.size());
DataPolicy dp = policies.get(0);
assertEquals("roleOne", dp.getName());
assertEquals(2, dp.getPermissions().size());
assertTrue(dp.isAllowCreateTemporaryTables());
assertTrue(dp.isAnyAuthenticated());
List<String> roleNames = dp.getMappedRoleNames();
assertArrayEquals(new String[]{"ROLE1", "ROLE2"}, roleNames.toArray());
admin.removeDataRoleMapping("bqt", 2, "roleOne", "ROLE1");
vdb = admin.getVDB("bqt", 2);
policies = vdb.getDataPolicies();
dp = policies.get(0);
roleNames = dp.getMappedRoleNames();
assertArrayEquals(new String[]{"ROLE2"}, roleNames.toArray());
admin.addDataRoleMapping("bqt", 2, "roleOne", "ROLE3");
vdb = admin.getVDB("bqt", 2);
policies = vdb.getDataPolicies();
dp = policies.get(0);
roleNames = dp.getMappedRoleNames();
assertArrayEquals(new String[]{"ROLE2", "ROLE3"}, roleNames.toArray());
admin.setAnyAuthenticatedForDataRole("bqt", 2, "roleOne", false);
vdb = admin.getVDB("bqt", 2);
policies = vdb.getDataPolicies();
dp = policies.get(0);
assertFalse(dp.isAnyAuthenticated());
}
@Test
@Ignore
public void testCreateConnectionFactory() throws Exception{
String deployedName = "wsOne";
assertFalse(admin.getDataSourceNames().contains(deployedName));
Properties p = new Properties();
p.setProperty("class-name", "org.teiid.resource.adapter.ws.WSManagedConnectionFactory");
p.setProperty("EndPoint", "{endpoint}");
admin.createDataSource(deployedName, "webservice", p);
assertTrue(admin.getDataSourceNames().contains(deployedName));
admin.deleteDataSource(deployedName);
assertFalse(admin.getDataSourceNames().contains(deployedName));
admin.createDataSource(deployedName, "webservice", p);
assertTrue(admin.getDataSourceNames().contains(deployedName));
admin.deleteDataSource(deployedName);
}
@Test
public void testCreateXADatasource() throws Exception {
String vdbName = "test";
String deployedName = "fooXA";
String testVDB = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" +
"<vdb name=\"test\" version=\"1\">\n" +
" <property name=\"cache-metadata\" value=\"true\" />\n" +
" <model name=\"loopy\">\n" +
" <source name=\"loop\" translator-name=\"loopback\" />\n" +
" </model>\n" +
"</vdb>";
admin.deploy("test-vdb.xml", new ByteArrayInputStream(testVDB.getBytes()));
AdminUtil.waitForVDBLoad(admin, vdbName, 1, 3);
assertTrue(admin.getDataSourceTemplateNames().contains("teiid-xa"));
Properties p = new Properties();
p.setProperty("DatabaseName", "test");
try {
admin.createDataSource(deployedName, "teiid-xa", p);
fail("should have fail not find portNumber");
} catch(AdminException e) {
}
assertFalse(admin.getDataSourceNames().contains(deployedName));
p.setProperty("ServerName", "127.0.0.1");
p.setProperty("PortNumber", "31000");
admin.createDataSource(deployedName, "teiid-xa", p);
assertTrue(admin.getDataSourceNames().contains(deployedName));
//admin.deleteDataSource(deployedName);
}
@Test
public void testVDBRestart() throws Exception{
String vdbName = "test";
String testVDB = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" +
"<vdb name=\"test\" version=\"1\">\n" +
" <property name=\"cache-metadata\" value=\"true\" />\n" +
" <model name=\"loopy\">\n" +
" <source name=\"loop\" translator-name=\"loopy\" />\n" +
" </model>\n" +
"</vdb>";
Collection<?> vdbs = admin.getVDBs();
assertTrue(vdbs.toString(), vdbs.isEmpty());
JavaArchive jar = getLoopyArchive();
admin.deploy("loopy.jar", jar.as(ZipExporter.class).exportAsInputStream());
// normal load
admin.deploy("test-vdb.xml", new ByteArrayInputStream(testVDB.getBytes()));
AdminUtil.waitForVDBLoad(admin, vdbName, 1, 3);
int count = assertMetadataLoadCount(false, 1);
// 1st restart
admin.restartVDB(vdbName, 1);
AdminUtil.waitForVDBLoad(admin, vdbName, 1, 3);
count = assertMetadataLoadCount(true, count+1);
// 2nd restart
admin.restartVDB(vdbName, 1);
AdminUtil.waitForVDBLoad(admin, vdbName, 1, 3);
count = assertMetadataLoadCount(true, count+1);
admin.undeploy("loopy.jar");
}
private int assertMetadataLoadCount(boolean check, int expected) throws SQLException {
Connection conn = TeiidDriver.getInstance().connect("jdbc:teiid:test.1@mm://localhost:31000;user=user;password=user", null);
Statement stmt = conn.createStatement();
stmt.execute("SELECT execCount FROM Matadata");
ResultSet rs = stmt.getResultSet();
rs.next();
int execCount = rs.getInt(1);
if (check) {
assertEquals(expected, execCount);
}
rs.close();
stmt.close();
conn.close();
return execCount;
}
@Test
public void testDDLExport() throws Exception{
String vdbName = "test";
String testVDB = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" +
"<vdb name=\"test\" version=\"1\">\n" +
" <property name=\"cache-metadata\" value=\"true\" />\n" +
" <model name=\"loopy\">\n" +
" <source name=\"loop\" translator-name=\"loopy\" />\n" +
" </model>\n" +
"</vdb>";
Collection<?> vdbs = admin.getVDBs();
assertTrue(vdbs.toString(), vdbs.isEmpty());
JavaArchive jar = getLoopyArchive();
admin.deploy("loopy.jar", jar.as(ZipExporter.class).exportAsInputStream());
// normal load
admin.deploy("test-vdb.xml", new ByteArrayInputStream(testVDB.getBytes()));
AdminUtil.waitForVDBLoad(admin, vdbName, 1, 3);
String ddl = admin.getSchema(vdbName, 1, "loopy", null, null);
String expected = "CREATE FOREIGN TABLE Matadata (\n" +
" execCount integer\n" +
");";
assertEquals(expected, ddl);
admin.undeploy("loopy.jar");
}
@Test public void testErrorDeployment() throws Exception {
Collection<?> vdbs = admin.getVDBs();
assertTrue(vdbs.toString(), vdbs.isEmpty());
admin.deploy("error-vdb.xml",new FileInputStream(UnitTestUtil.getTestDataFile("error-vdb.xml")));
AdminUtil.waitForVDBLoad(admin, "error", 1, 3);
VDB vdb = admin.getVDB("error", 1);
assertEquals(Status.FAILED, vdb.getStatus());
}
@Test
public void testODBCConnectionSuccess() throws Exception {
admin.deploy("bqt.vdb",new FileInputStream(UnitTestUtil.getTestDataFile("bqt.vdb")));
Driver d = new Driver();
Properties p = new Properties();
p.setProperty("user", "user");
p.setProperty("password", "user");
Connection c = d.connect("jdbc:postgresql://127.0.0.1:35432/bqt", p);
c.close();
}
@Test
public void testODBCConnectionFailure() throws Exception {
admin.deploy("bqt.vdb",new FileInputStream(UnitTestUtil.getTestDataFile("bqt.vdb")));
Driver d = new Driver();
Properties p = new Properties();
p.setProperty("user", "user");
p.setProperty("password", "notpassword");
try {
d.connect("jdbc:postgresql://127.0.0.1:35432/bqt", p);
fail("failed due to bad credentials");
} catch (SQLException e) {
}
}
@Test
public void testSystemPropertiesInVDBXML() throws Exception{
String vdbName = "test";
String testVDB = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" +
"<vdb name=\"test\" version=\"1\">\n" +
" <property name=\"cache-metadata\" value=\"${teiid.vdb.UseConnectorMetadata:false}\" />\n" +
" <model name=\"loopy\">\n" +
" <source name=\"loop\" translator-name=\"loopy\" />\n" +
" </model>\n" +
"</vdb>";
Collection<?> vdbs = admin.getVDBs();
assertTrue(vdbs.toString(), vdbs.isEmpty());
JavaArchive jar = getLoopyArchive();
admin.deploy("loopy.jar", jar.as(ZipExporter.class).exportAsInputStream());
// normal load
admin.deploy("test-vdb.xml", new ByteArrayInputStream(testVDB.getBytes()));
AdminUtil.waitForVDBLoad(admin, vdbName, 1, 3);
VDB vdb = admin.getVDB(vdbName, 1);
String value = vdb.getPropertyValue("cache-metadata");
// see the arquillian.zml file in resources in the JVM proeprties section for the expected value
assertEquals("true", value);
admin.undeploy("loopy.jar");
admin.undeploy("test-vdb.xml");
}
@Test
public void testGeometry() throws Exception {
admin.deploy("bqt.vdb", new FileInputStream(UnitTestUtil.getTestDataFile("bqt.vdb")));
AdminUtil.waitForVDBLoad(admin, "bqt", 1, 3);
Connection conn = TeiidDriver.getInstance().connect("jdbc:teiid:bqt@mm://localhost:31000;user=user;password=user", null);
Statement s = conn.createStatement();
//test each functional area - jts, proj4j, and geojson
s.executeQuery("select st_geomfromtext('POINT(0 0)')");
s.executeQuery("select ST_AsText(ST_Transform(ST_GeomFromText('POLYGON((743238 2967416,743238 2967450,743265 2967450,743265.625 2967416,743238 2967416))',2249),4326))");
s.executeQuery("select ST_AsGeoJson(ST_GeomFromText('POINT (-48.23456 20.12345)'))");
s.executeQuery("select ST_AsText(ST_GeomFromGeoJSON('{\"coordinates\":[-48.23456,20.12345],\"type\":\"Point\"}'))");
}
@Test(expected=AdminProcessingException.class) public void testAmbigiousDeployment() throws Exception {
admin.deploy("bqt2.vdb", new FileInputStream(UnitTestUtil.getTestDataFile("bqt2.vdb")));
AdminUtil.waitForVDBLoad(admin, "bqt2", 1, 3);
admin.deploy("bqt2-1.vdb", new FileInputStream(UnitTestUtil.getTestDataFile("bqt2.vdb")));
}
@Test
public void testInsensitiveDeployment() throws Exception {
admin.deploy("dynamicview-VDB.xml", new FileInputStream(UnitTestUtil.getTestDataFile("dynamicview-vdb.xml")));
AdminUtil.waitForVDBLoad(admin, "dynamic", 1, 3);
VDB vdb = admin.getVDB("dynamic", "1");
assertTrue(vdb.getStatus() == Status.ACTIVE);
admin.undeploy("dynamicview-VDB.xml");
admin.deploy("bqt.VDB", new FileInputStream(UnitTestUtil.getTestDataFile("bqt.vdb")));
AdminUtil.waitForVDBLoad(admin, "bqt", 1, 3);
vdb = admin.getVDB("bqt", "1");
assertTrue(vdb.getStatus() == Status.ACTIVE);
admin.undeploy("bqt.VDB");
}
@Test
public void testDeployZipDDL() throws Exception {
File f = UnitTestUtil.getTestScratchFile("some.vdb");
ZipOutputStream out = new ZipOutputStream(new FileOutputStream(f));
out.putNextEntry(new ZipEntry("v1.ddl"));
out.write("CREATE VIEW helloworld as SELECT 'HELLO WORLD';".getBytes("UTF-8"));
out.putNextEntry(new ZipEntry("META-INF/vdb.ddl"));
String externalDDL = "CREATE DATABASE test2 VERSION '1';"
+ "USE DATABASE test2 VERSION '1';"
+ "CREATE VIRTUAL SCHEMA test2;"
+ "IMPORT FOREIGN SCHEMA public FROM REPOSITORY \"DDL-FILE\" INTO test2 OPTIONS(\"ddl-file\" '/v1.ddl');";
out.write(externalDDL.getBytes("UTF-8"));
out.close();
admin.deploy("some.vdb", new FileInputStream(f));
AdminUtil.waitForVDBLoad(admin, "test2", "1", 3);
Connection conn = TeiidDriver.getInstance().connect("jdbc:teiid:test2@mm://localhost:31000;user=user;password=user", null);
ResultSet rs = conn.createStatement().executeQuery("select * from helloworld");
rs.next();
assertEquals("HELLO WORLD", rs.getString(1));
}
}