/**
* Copyright © 2013 enioka. All rights reserved
* Authors: Marc-Antoine GOUILLART (marc-antoine.gouillart@enioka.com)
* Pierre COPPEE (pierre.coppee@enioka.com)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.enioka.jqm.tools;
import java.io.File;
import java.lang.management.ManagementFactory;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import javax.management.MBeanServer;
import javax.management.ObjectName;
import javax.naming.InitialContext;
import javax.naming.spi.NamingManager;
import org.junit.Assert;
import org.junit.Test;
import com.enioka.jqm.api.JobRequest;
import com.enioka.jqm.api.Query;
import com.enioka.jqm.api.State;
import com.enioka.jqm.test.helpers.CreationTools;
import com.enioka.jqm.test.helpers.TestHelpers;
public class JndiTest extends JqmBaseTest
{
// @Test
// NOT AN AUTO TEST: this requires to have MQ Series jars which are not libre software!
public void testJmsWmq() throws Exception
{
CreationTools.createJobDef(null, true, "com.enioka.jqm.testpackages.SuperTestPayload", null,
"jqm-tests/jqm-test-jndijms-wmq/target/test.jar", TestHelpers.qVip, 42, "Jms", "Franquin", "ModuleMachin", "other1",
"other2", "other3", false, cnx);
JobRequest.create("Jms", "TestUser").addParameter("p1", "1").addParameter("p2", "2").submit();
// Create JMS JNDI references for use by the test jar
CreationTools.createJndiQueueMQSeries(cnx, "jms/testqueue", "test Queue", "Q.GEO.OUT", null);
CreationTools.createJndiQcfMQSeries(cnx, "jms/qcf", "test QCF", "10.0.1.90", "QM.TEC1", 1414, "WASCHANNEL");
addAndStartEngine();
TestHelpers.waitFor(1, 10000, cnx);
Assert.assertEquals(1, TestHelpers.getOkCount(cnx));
Assert.assertEquals(0, TestHelpers.getNonOkCount(cnx)); // Exception in jar => CRASHED
}
@Test
public void testJmsAmq() throws Exception
{
CreationTools.createJobDef(null, true, "com.enioka.jqm.testpackages.SuperTestPayload", null,
"jqm-tests/jqm-test-jndijms-amq/target/test.jar", TestHelpers.qVip, 42, "Jms", null, "Franquin", "ModuleMachin", "other1",
"other2", false, cnx);
JobRequest.create("Jms", "TestUser").submit();
// Create JMS JNDI references for use by the test jar
CreationTools.createJndiQueueActiveMQ(cnx, "jms/testqueue", "test queue", "Q.TEST", null);
CreationTools.createJndiQcfActiveMQ(cnx, "jms/qcf", "test QCF", "vm:broker:(tcp://localhost:1234)?persistent=false&useJmx=false",
null);
cnx.commit();
addAndStartEngine();
TestHelpers.waitFor(1, 10000, cnx);
Assert.assertEquals(1, TestHelpers.getOkCount(cnx));
Assert.assertEquals(0, TestHelpers.getNonOkCount(cnx)); // Exception in jar => CRASHED
}
@Test
public void testJmsAmqWrongAlias() throws Exception
{
CreationTools.createJobDef(null, true, "com.enioka.jqm.testpackages.SuperTestPayload", null,
"jqm-tests/jqm-test-jndijms-amq/target/test.jar", TestHelpers.qVip, 42, "Jms", null, "Franquin", "ModuleMachin", "other1",
"other2", false, cnx);
JobRequest.create("Jms", "TestUser").submit();
// Create JMS JNDI references for use by the test jar
CreationTools.createJndiQueueActiveMQ(cnx, "jms/testqueue", "test queue", "Q.TEST", null);
CreationTools.createJndiQcfActiveMQ(cnx, "jms/qcf2", "test QCF", "vm:broker:(tcp://localhost:1234)?persistent=false&useJmx=false",
null);
cnx.commit();
addAndStartEngine();
TestHelpers.waitFor(1, 10000, cnx);
Assert.assertEquals(0, TestHelpers.getOkCount(cnx));
Assert.assertEquals(1, TestHelpers.getNonOkCount(cnx));
Assert.assertEquals(State.CRASHED, Query.create().run().get(0).getState());
}
@Test
public void testDefCon() throws Exception
{
JqmSimpleTest.create(cnx, "pyl.EngineApiDefCon").run(this);
}
@Test
public void testFileJndi() throws Exception
{
// Create JMS JNDI references for use by the test jar
String path = "./testdir";
CreationTools.createJndiFile(cnx, "fs/testdirectory", "test directory", path);
cnx.commit();
// Create the directory...
(new File(path)).mkdir();
// Test
try
{
File f = (File) NamingManager.getInitialContext(null).lookup("fs/testdirectory");
Assert.assertTrue(f.isDirectory());
f.delete();
}
catch (Exception e)
{
Assert.fail(e.getMessage());
}
}
@Test
public void testUrlJndi() throws Exception
{
// Create JMS JNDI references for use by the test jar
String url = "http://www.marsupilami.com";
CreationTools.createJndiUrl(cnx, "url/testurl", "test directory", url);
cnx.commit();
try
{
URL f = (URL) NamingManager.getInitialContext(null).lookup("url/testurl");
Assert.assertEquals(url, f.toString());
}
catch (Exception e)
{
Assert.fail(e.getMessage());
}
}
@Test
public void testJndiFile() throws Exception
{
// Create JMS JNDI references for use by the test jar
CreationTools.createJndiFile(cnx, "fs/test", "test resource", "/tmp");
JqmSimpleTest.create(cnx, "pyl.JndiFile", "jqm-test-pyl-nodep").run(this);
}
@Test
public void testJndiServerName() throws Exception
{
addAndStartEngine();
String s = (String) InitialContext.doLookup("serverName");
Assert.assertEquals("localhost", s);
}
@Test
public void testJndiJdbcPool() throws Exception
{
CreationTools.createDatabaseProp("jdbc/test", "org.hsqldb.jdbcDriver", "jdbc:hsqldb:mem:testdbmarsu", "SA", "", cnx,
"SELECT 1 FROM INFORMATION_SCHEMA.SYSTEM_USERS", null);
cnx.runUpdate("jndiprm_update_value_by_key", "true", "jmxEnabled");
cnx.commit();
addAndStartEngine();
CreationTools.createJobDef(null, true, "pyl.JndiDb", null, "jqm-tests/jqm-test-pyl-nodep/target/test.jar", TestHelpers.qVip, 42,
"TestApp", null, "Test", "ModuleTest", "other", "other", false, cnx);
JobRequest.create("TestApp", "TestUser").submit();
TestHelpers.waitFor(1, 5000, cnx);
TestHelpers.testOkCount(1, cnx);
MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
int nb = (Integer) mbs.getAttribute(new ObjectName("com.enioka.jqm:type=JdbcPool,name=jdbc/test"), "Active");
Assert.assertEquals(0, nb);
}
@Test
public void testJndiJdbcPoolLeakWithoutHunter() throws Exception
{
// Sanity check - our test DOES leak connections
CreationTools.createDatabaseProp("jdbc/test", "org.hsqldb.jdbcDriver", "jdbc:hsqldb:mem:testdbmarsu", "SA", "", cnx,
"SELECT 1 FROM INFORMATION_SCHEMA.SYSTEM_USERS", null);
cnx.runUpdate("jndiprm_update_value_by_key", "true", "jmxEnabled");
cnx.commit();
addAndStartEngine();
// Run the payload, it should leave an open conn at the end
CreationTools.createJobDef(null, true, "pyl.JndiDbLeak", null, "jqm-tests/jqm-test-pyl-nodep/target/test.jar", TestHelpers.qVip, 42,
"TestApp", null, "Test", "ModuleTest", "other", "other", false, cnx);
JobRequest.create("TestApp", "TestUser").submit();
TestHelpers.waitFor(1, 5000, cnx);
TestHelpers.testOkCount(1, cnx);
MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
int nb = (Integer) mbs.getAttribute(new ObjectName("com.enioka.jqm:type=JdbcPool,name=jdbc/test"), "Active");
Assert.assertEquals(1, nb);
// Clean the pool forcefully so as not to impact other tests
JndiContext.createJndiContext().resetSingletons();
}
@Test
public void testJndiJdbcPoolLeakWithHunter() throws Exception
{
// Create a connection with our custom interceptor
Map<String, String> prms = new HashMap<String, String>(1);
prms.put("jdbcInterceptors", "com.enioka.jqm.providers.PayloadInterceptor");
CreationTools.createDatabaseProp("jdbc/test", "org.hsqldb.jdbcDriver", "jdbc:hsqldb:mem:testdbmarsu", "SA", "", cnx,
"SELECT 1 FROM INFORMATION_SCHEMA.SYSTEM_USERS", prms);
cnx.runUpdate("jndiprm_update_value_by_key", "true", "jmxEnabled");
cnx.commit();
addAndStartEngine();
// Sanity check: the leak hunter does not harm normal payloads.
CreationTools.createJobDef(null, true, "pyl.JndiDb", null, "jqm-tests/jqm-test-pyl-nodep/target/test.jar", TestHelpers.qVip, 42,
"TestApp", null, "Test", "ModuleTest", "other", "other", false, cnx);
JobRequest.create("TestApp", "TestUser").submit();
TestHelpers.waitFor(1, 5000, cnx);
TestHelpers.testOkCount(1, cnx);
MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
int nb = (Integer) mbs.getAttribute(new ObjectName("com.enioka.jqm:type=JdbcPool,name=jdbc/test"), "Active");
Assert.assertEquals(0, nb);
// Run the payload, it should leave an open conn that should be forcibly closed.
CreationTools.createJobDef(null, true, "pyl.JndiDbLeak", null, "jqm-tests/jqm-test-pyl-nodep/target/test.jar", TestHelpers.qVip, 42,
"TestApp2", null, "Test", "ModuleTest", "other", "other", false, cnx);
JobRequest.create("TestApp2", "TestUser").submit();
TestHelpers.waitFor(1, 5000, cnx);
// Test
TestHelpers.testOkCount(2, cnx);
nb = (Integer) mbs.getAttribute(new ObjectName("com.enioka.jqm:type=JdbcPool,name=jdbc/test"), "Active");
Assert.assertEquals(0, nb);
}
}