/*
* 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.runtime;
import static org.junit.Assert.*;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.EnumSet;
import java.util.List;
import java.util.Properties;
import java.util.Set;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;
import org.teiid.adminapi.*;
import org.teiid.adminapi.Admin.SchemaObjectType;
import org.teiid.adminapi.Admin.TranlatorPropertyType;
import org.teiid.adminapi.VDB.ConnectionType;
import org.teiid.adminapi.impl.DataPolicyMetadata;
import org.teiid.adminapi.impl.ModelMetaData;
import org.teiid.adminapi.impl.RequestMetadata;
import org.teiid.adminapi.impl.SourceMappingMetadata;
import org.teiid.adminapi.impl.VDBMetaData;
import org.teiid.translator.file.FileExecutionFactory;
@SuppressWarnings("nls")
public class TestEmbeddedServerAdmin {
private static Admin admin;
private static EmbeddedServer server;
@BeforeClass
public static void init() throws Exception {
server = new EmbeddedServer();
EmbeddedConfiguration config = new EmbeddedConfiguration();
server.start(config);
FileExecutionFactory executionFactory = new FileExecutionFactory();
executionFactory.start();
server.addTranslator("file", executionFactory);
server.deployVDB(new FileInputStream(new File("src/test/resources/adminapi-test-vdb.xml")));
// admin = server.getAdmin();
admin = EmbeddedAdminFactory.getInstance().createAdmin(server);
}
private Connection newSession() throws SQLException {
return server.getDriver().connect("jdbc:teiid:AdminAPITestVDB", new Properties());
}
@Test
public void testGetVdbs() throws AdminException {
for(VDB vdb : admin.getVDBs()) {
assertEquals(vdb.getName(), "AdminAPITestVDB");
assertEquals(vdb.getVersion(), "1");
assertEquals(vdb.getDescription(), "The adminapi test VDB");
assertEquals(vdb.getModels().size(), 1);
}
}
@Test
public void testGetVDB() throws AdminException{
VDB vdb = admin.getVDB("AdminAPITestVDB", 1);
assertEquals(vdb.getDescription(), "The adminapi test VDB");
assertEquals(vdb.getModels().size(), 1);
}
@Test
public void testSource() throws AdminException {
admin.addSource("AdminAPITestVDB", 1, "TestModel", "text-connector-test", "file", "java:/test-file");
for(VDB vdb : admin.getVDBs()){
VDBMetaData vdbMetaData = (VDBMetaData) vdb;
for (ModelMetaData m : vdbMetaData.getModelMetaDatas().values()) {
SourceMappingMetadata mapping = m.getSourceMapping("text-connector-test");
if (mapping != null){
assertEquals(mapping.getConnectionJndiName(), "java:/test-file");
assertEquals(mapping.getTranslatorName(), "file");
}
}
}
admin.updateSource("AdminAPITestVDB", 1, "text-connector-test", "mysql", "java:/test-jdbc");
for(VDB vdb : admin.getVDBs()){
VDBMetaData vdbMetaData = (VDBMetaData) vdb;
for (ModelMetaData m : vdbMetaData.getModelMetaDatas().values()) {
SourceMappingMetadata mapping = m.getSourceMapping("text-connector-test");
if (mapping != null){
assertEquals(mapping.getConnectionJndiName(), "java:/test-jdbc");
assertEquals(mapping.getTranslatorName(), "mysql");
}
}
}
admin.removeSource("AdminAPITestVDB", 1, "TestModel", "text-connector-test");
}
@Test
public void testChangeVDBConnectionType() throws AdminException {
ConnectionType previous = admin.getVDB("AdminAPITestVDB", 1).getConnectionType();
admin.changeVDBConnectionType("AdminAPITestVDB", 1, ConnectionType.ANY);
assertEquals(ConnectionType.ANY, admin.getVDB("AdminAPITestVDB", 1).getConnectionType());
admin.changeVDBConnectionType("AdminAPITestVDB", 1, previous);
}
@Test
public void testDeployUndeploy() throws AdminException, FileNotFoundException {
admin.undeploy("AdminAPITestVDB");
assertNull(admin.getVDB("AdminAPITestVDB", 1));
admin.deploy("AdminAPITestVDB-vdb.xml", new FileInputStream(new File("src/test/resources/adminapi-test-vdb.xml")));
assertNotNull(admin.getVDB("AdminAPITestVDB", 1));
}
@Test
public void testRestartVDB() throws AdminException{
admin.restartVDB("AdminAPITestVDB", 1, "TestModel");
assertNotNull(admin.getVDB("AdminAPITestVDB", 1));
}
@Test
public void testGetTranslator() throws AdminException {
for(Translator translator : admin.getTranslators()){
assertEquals("file", translator.getName());
assertEquals("File Translator, reads contents of files or writes to them", translator.getDescription());
assertEquals("false", translator.getProperties().getProperty("supportsOuterJoins"));
}
Translator translator = admin.getTranslator("file");
assertEquals("File Translator, reads contents of files or writes to them", translator.getDescription());
assertEquals("false", translator.getProperties().getProperty("supportsOuterJoins"));
}
@Test
public void testGetWorkerPoolStats() throws AdminException{
for(WorkerPoolStatistics pool : admin.getWorkerPoolStats()){
assertEquals("QueryProcessorQueue", pool.getQueueName());
assertEquals(64, pool.getMaxThreads());
}
}
@Test
public void testGetCacheTypes() throws AdminException{
Set<String> cacheTypes = (Set<String>) admin.getCacheTypes();
assertTrue(cacheTypes.contains("PREPARED_PLAN_CACHE"));
assertTrue(cacheTypes.contains("QUERY_SERVICE_RESULT_SET_CACHE"));
}
@SuppressWarnings("unchecked")
@Test
public void testGetSessions() throws AdminException, SQLException {
Connection conn = newSession();
List<Session> sessions = (List<Session>) admin.getSessions();
assertEquals(1, sessions.size());
assertEquals("AdminAPITestVDB", sessions.get(0).getVDBName());
assertEquals("1", sessions.get(0).getVDBVersion());
assertEquals("JDBC", sessions.get(0).getApplicationName());
assertNotNull(sessions.get(0).getSessionId());
conn.close();
}
@SuppressWarnings("unchecked")
@Test
public void testGetRequests() throws AdminException, SQLException {
Connection conn = newSession();
Statement stmt = conn.createStatement();
String command = "SELECT * FROM helloworld" ;
ResultSet rs = stmt.executeQuery(command);
List<RequestMetadata> requests = (List<RequestMetadata>) admin.getRequests();
assertEquals(1, requests.size());
assertEquals(command, requests.get(0).getCommand());
assertNotNull(requests.get(0).getSessionId());
rs.close();
stmt.close();
conn.close();
}
@SuppressWarnings("unchecked")
@Test
public void testGetRequest() throws AdminException, SQLException {
Connection conn = newSession();
Statement stmt = conn.createStatement();
String command = "SELECT * FROM helloworld" ;
ResultSet rs = stmt.executeQuery(command);
List<Session> sessions = (List<Session>) admin.getSessions();
String id = sessions.get(0).getSessionId();
List<Request> requests = (List<Request>) admin.getRequestsForSession(id);
assertEquals(1, requests.size());
assertEquals(command, requests.get(0).getCommand());
assertEquals(id, requests.get(0).getSessionId());
rs.close();
stmt.close();
conn.close();
}
@Test(expected = AdminProcessingException.class)
public void testGetTemplatePropertyDefinitions() throws AdminException {
admin.getTemplatePropertyDefinitions("file");
}
@SuppressWarnings("unchecked")
@Test
public void testGetTranslatorPropertyDefinitions() throws AdminException {
List<PropertyDefinition> list = (List<PropertyDefinition>) admin.getTranslatorPropertyDefinitions("file", TranlatorPropertyType.OVERRIDE);
assertEquals(21, list.size());
list = (List<PropertyDefinition>) admin.getTranslatorPropertyDefinitions("file", TranlatorPropertyType.ALL);
assertEquals(21, list.size());
}
@Test
public void testGetTransactions() throws AdminException, SQLException {
Connection conn = newSession();
conn.setAutoCommit(false);
assertEquals(0, admin.getTransactions().size());
conn.commit();
conn.close();
}
public void testClearCache() throws AdminException{
admin.clearCache("PREPARED_PLAN_CACHE");
admin.clearCache("QUERY_SERVICE_RESULT_SET_CACHE");
admin.clearCache("PREPARED_PLAN_CACHE", "AdminAPITestVDB", 1);
admin.clearCache("QUERY_SERVICE_RESULT_SET_CACHE", "AdminAPITestVDB", 1);
}
@SuppressWarnings("unchecked")
@Test
public void testGetCacheStats() throws AdminException {
List<CacheStatistics> list = (List<CacheStatistics>) admin.getCacheStats("PREPARED_PLAN_CACHE");
assertEquals(list.get(0).getName(), Admin.Cache.PREPARED_PLAN_CACHE.name());
list = (List<CacheStatistics>) admin.getCacheStats("QUERY_SERVICE_RESULT_SET_CACHE");
assertEquals(list.get(0).getName(), Admin.Cache.QUERY_SERVICE_RESULT_SET_CACHE.name());
}
@SuppressWarnings("unchecked")
@Test
public void testGetEngineStats() throws AdminException, SQLException {
Connection conn1 = newSession();
Connection conn2 = newSession();
List<EngineStatistics> list = (List<EngineStatistics>) admin.getEngineStats();
assertEquals(2, list.get(0).getSessionCount());
conn1.close();
conn2.close();
}
@SuppressWarnings("unchecked")
@Test
public void testTerminateSession() throws AdminException, SQLException {
Connection conn = newSession();
List<Session> sessions = (List<Session>) admin.getSessions();
String sessionId = sessions.get(0).getSessionId();
admin.terminateSession(sessionId);
assertEquals(0, admin.getSessions().size());
conn.close();
}
@SuppressWarnings("unchecked")
@Test
public void testCancelRequest() throws AdminException, SQLException {
Connection conn = newSession();
Statement stmt = conn.createStatement();
String command = "SELECT * FROM helloworld" ;
ResultSet rs = stmt.executeQuery(command);
List<Session> sessions = (List<Session>) admin.getSessions();
String id = sessions.get(0).getSessionId();
List<Request> requests = (List<Request>) admin.getRequestsForSession(id);
long executionId = requests.get(0).getExecutionId();
assertEquals(1, admin.getRequests().size());
admin.cancelRequest(id, executionId);
assertEquals(0, admin.getRequests().size());
rs.close();
stmt.close();
conn.close();
}
@Ignore("This test need enable DataRole Configuration in 'adminapi-test-vdb.xml'")
@Test
public void testDataRoleMapping() throws AdminException {
String vdbName = "AdminAPITestVDB";
int vdbVersion = 1;
String policyName = "TestDataRole";
DataPolicyMetadata policy = getPolicy(admin.getVDB(vdbName, vdbVersion), policyName);
assertEquals(1, policy.getMappedRoleNames().size());
admin.addDataRoleMapping(vdbName, vdbVersion, policyName, "test-role-name");
policy = getPolicy(admin.getVDB(vdbName, vdbVersion), policyName);
assertEquals(2, policy.getMappedRoleNames().size());
admin.removeDataRoleMapping(vdbName, vdbVersion, policyName, "test-role-name");
policy = getPolicy(admin.getVDB(vdbName, vdbVersion), policyName);
assertEquals(1, policy.getMappedRoleNames().size());
boolean previous = policy.isAnyAuthenticated();
admin.setAnyAuthenticatedForDataRole(vdbName, vdbVersion, policyName, !previous);
policy = getPolicy(admin.getVDB(vdbName, vdbVersion), policyName);
assertEquals(!previous, policy.isAnyAuthenticated());
admin.setAnyAuthenticatedForDataRole(vdbName, vdbVersion, policyName, previous);
}
private DataPolicyMetadata getPolicy(VDB vdb, String policyName) {
VDBMetaData vdbMetaData = (VDBMetaData) vdb;
return vdbMetaData.getDataPolicyMap().get(policyName);
}
@Test
public void testTerminateTransaction() throws AdminException {
// need enhance
admin.terminateTransaction("xid");
}
@Test(expected = AdminProcessingException.class)
public void testDataSources() throws AdminException{
admin.createDataSource("", "", new Properties());
admin.getDataSource("");
admin.deleteDataSource("");
admin.getDataSourceNames();
admin.getDataSourceTemplateNames();
admin.markDataSourceAvailable("");
}
@Test
public void testGetSchema() throws AdminException {
String expected = "CREATE VIEW helloworld (\n" +
" expr1 string\n" +
")\n" +
"AS\n" +
"SELECT 'HELLO WORLD';";
EnumSet<SchemaObjectType> allowedTypes = EnumSet.of(Admin.SchemaObjectType.TABLES);
String schema = admin.getSchema("AdminAPITestVDB", 1, "TestModel", allowedTypes, "helloworld");
assertEquals(expected, schema);
schema = admin.getSchema("AdminAPITestVDB", 1, "TestModel", null, null);
assertEquals(expected, schema);
}
@SuppressWarnings("unchecked")
@Test
public void testGetQueryPlan() throws SQLException, AdminException {
Connection conn = newSession();
Statement stmt = conn.createStatement();
stmt.execute("set showplan on");
String command = "SELECT * FROM helloworld" ;
ResultSet rs = stmt.executeQuery(command);
List<Session> sessions = (List<Session>) admin.getSessions();
String sessionId = sessions.get(0).getSessionId();
List<Request> requests = (List<Request>) admin.getRequestsForSession(sessionId);
int executionId = (int) requests.get(0).getExecutionId();
String plan = admin.getQueryPlan(sessionId, executionId);
assertNotNull(plan);
rs.close();
stmt.close();
conn.close();
}
@AfterClass
public static void destory() throws SQLException {
admin.close();
server.stop();
}
}