http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/77dff880/software/webapp/src/test/java/org/apache/brooklyn/entity/webapp/jboss/JBoss6ServerNonInheritingIntegrationTest.java ---------------------------------------------------------------------- diff --git a/software/webapp/src/test/java/org/apache/brooklyn/entity/webapp/jboss/JBoss6ServerNonInheritingIntegrationTest.java b/software/webapp/src/test/java/org/apache/brooklyn/entity/webapp/jboss/JBoss6ServerNonInheritingIntegrationTest.java new file mode 100644 index 0000000..48dbc5c --- /dev/null +++ b/software/webapp/src/test/java/org/apache/brooklyn/entity/webapp/jboss/JBoss6ServerNonInheritingIntegrationTest.java @@ -0,0 +1,104 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 org.apache.brooklyn.entity.webapp.jboss; + +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertNotNull; + +import java.net.URL; + +import org.apache.brooklyn.entity.webapp.jboss.JBoss6Server; +import org.apache.brooklyn.test.HttpTestUtils; +import org.apache.brooklyn.test.TestResourceUnavailableException; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +import brooklyn.entity.BrooklynAppLiveTestSupport; +import brooklyn.entity.java.UsesJmx; +import brooklyn.entity.proxying.EntitySpec; +import brooklyn.location.basic.LocalhostMachineProvisioningLocation; +import brooklyn.test.Asserts; + +import com.google.common.collect.ImmutableList; + +/** + * TODO re-write this like WebAppIntegrationTest, rather than being jboss6 specific. + */ +public class JBoss6ServerNonInheritingIntegrationTest extends BrooklynAppLiveTestSupport { + + // FIXME Fails deploying hello-world.war + // 07:27:30,958 ERROR [AbstractKernelController] Error installing to Parse: name=vfs:///tmp/brooklyn-aled/apps/FJMcnSjO/entities/JBoss6Server_UZ2gA9HR/server/standard/deploy/ROOT.war state=PreParse mode=Manual requiredState=Parse: org.jboss.deployers.spi.DeploymentException: Error creating managed object for vfs:///tmp/brooklyn-aled/apps/FJMcnSjO/entities/JBoss6Server_UZ2gA9HR/server/standard/deploy/ROOT.war + // ... + // Caused by: org.xml.sax.SAXException: cvc-complex-type.2.4.d: Invalid content was found starting with element 'url-pattern'. No child element is expected at this point. @ vfs:///tmp/brooklyn-aled/apps/FJMcnSjO/entities/JBoss6Server_UZ2gA9HR/server/standard/deploy/ROOT.war/WEB-INF/web.xml[21,22] + // at org.jboss.xb.binding.parser.sax.SaxJBossXBParser.error(SaxJBossXBParser.java:416) [jbossxb.jar:2.0.3.GA] + + // Port increment for JBoss 6. + public static final int PORT_INCREMENT = 400; + + private LocalhostMachineProvisioningLocation localhostProvisioningLocation; + + @BeforeMethod(alwaysRun=true) + public void setUp() throws Exception { + super.setUp(); + + localhostProvisioningLocation = app.newLocalhostProvisioningLocation(); + } + + public String getTestWarWithNoMapping() { + TestResourceUnavailableException.throwIfResourceUnavailable(getClass(), "/hello-world-no-mapping.war"); + return "classpath://hello-world-no-mapping.war"; + } + + @Test(groups = "Integration") + public void testJmxmp() throws Exception { + runTest(UsesJmx.JmxAgentModes.JMXMP); + } + + @Test(groups = "Integration") + public void testJmxRmi() throws Exception { + runTest(UsesJmx.JmxAgentModes.JMX_RMI_CUSTOM_AGENT); + } + + @Test(groups = "Integration") + public void testJmxAutodetect() throws Exception { + runTest(UsesJmx.JmxAgentModes.AUTODETECT); + } + + protected void runTest(UsesJmx.JmxAgentModes jmxAgentMode) throws Exception { + final JBoss6Server server = app.createAndManageChild(EntitySpec.create(JBoss6Server.class) + .configure(JBoss6Server.PORT_INCREMENT, PORT_INCREMENT) + .configure(UsesJmx.JMX_AGENT_MODE, jmxAgentMode) + .configure("war", getTestWarWithNoMapping())); + + app.start(ImmutableList.of(localhostProvisioningLocation)); + + String httpUrl = server.getAttribute(JBoss6Server.ROOT_URL); + + HttpTestUtils.assertHttpStatusCodeEventuallyEquals(httpUrl, 200); + HttpTestUtils.assertContentContainsText(httpUrl, "Hello"); + + Asserts.succeedsEventually(new Runnable() { + @Override public void run() { + // TODO Could test other attributes as well; see jboss7 test + assertNotNull(server.getAttribute(JBoss6Server.REQUEST_COUNT)); + assertNotNull(server.getAttribute(JBoss6Server.ERROR_COUNT)); + assertNotNull(server.getAttribute(JBoss6Server.TOTAL_PROCESSING_TIME)); + }}); + } +}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/77dff880/software/webapp/src/test/java/org/apache/brooklyn/entity/webapp/jboss/JBoss7PasswordHashingTest.java ---------------------------------------------------------------------- diff --git a/software/webapp/src/test/java/org/apache/brooklyn/entity/webapp/jboss/JBoss7PasswordHashingTest.java b/software/webapp/src/test/java/org/apache/brooklyn/entity/webapp/jboss/JBoss7PasswordHashingTest.java new file mode 100644 index 0000000..1a3d7b5 --- /dev/null +++ b/software/webapp/src/test/java/org/apache/brooklyn/entity/webapp/jboss/JBoss7PasswordHashingTest.java @@ -0,0 +1,62 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 org.apache.brooklyn.entity.webapp.jboss; + +import org.testng.annotations.Test; + +import static org.testng.Assert.assertEquals; + +import org.apache.brooklyn.entity.webapp.jboss.JBoss7SshDriver; + +/** + * Expected values in tests were generated by AS7's add-user.sh script and copied here. + */ +public class JBoss7PasswordHashingTest { + + @Test + public void testPasswordForManagementRealm() { + assertEquals( + JBoss7SshDriver.hashPassword("username", "password", "ManagementRealm"), + "8959126dd54df47f694cd762a51a1a6f"); + assertEquals( + JBoss7SshDriver.hashPassword("test", "123", "ManagementRealm"), + "090d846d31185e54a5e8811a2ccb43ee"); + } + + @Test + public void testPasswordForApplicationRealm() { + assertEquals( + JBoss7SshDriver.hashPassword("username", "password", "ApplicationRealm"), + "888a0504c559a34b1c3e919dcec6d941"); + assertEquals( + JBoss7SshDriver.hashPassword("test", "321", "ApplicationRealm"), + "a0fdaa45e2d509ac2d390ff6820e2a10"); + } + + @Test + public void testPasswordForCustomRealm() { + assertEquals( + JBoss7SshDriver.hashPassword("abcdef", "ghijkl", "BrooklynRealm"), + "a65be1ba2eb88b9b9edc6a2a7105af72"); + assertEquals( + JBoss7SshDriver.hashPassword("username", "password", "BrooklynRealm"), + "161124b73591a1483330f496311b0692"); + } + +} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/77dff880/software/webapp/src/test/java/org/apache/brooklyn/entity/webapp/jboss/JBoss7ServerAwsEc2LiveTest.java ---------------------------------------------------------------------- diff --git a/software/webapp/src/test/java/org/apache/brooklyn/entity/webapp/jboss/JBoss7ServerAwsEc2LiveTest.java b/software/webapp/src/test/java/org/apache/brooklyn/entity/webapp/jboss/JBoss7ServerAwsEc2LiveTest.java new file mode 100644 index 0000000..cc27f3c --- /dev/null +++ b/software/webapp/src/test/java/org/apache/brooklyn/entity/webapp/jboss/JBoss7ServerAwsEc2LiveTest.java @@ -0,0 +1,79 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 org.apache.brooklyn.entity.webapp.jboss; + +import static com.google.common.base.Preconditions.checkNotNull; +import static org.testng.Assert.assertNotNull; + +import java.net.URL; + +import org.apache.brooklyn.entity.webapp.jboss.JBoss7Server; +import org.apache.brooklyn.test.HttpTestUtils; +import org.apache.brooklyn.test.TestResourceUnavailableException; +import org.testng.annotations.Test; + +import brooklyn.entity.AbstractEc2LiveTest; +import brooklyn.entity.proxying.EntitySpec; +import brooklyn.location.Location; +import brooklyn.test.Asserts; + +import com.google.common.collect.ImmutableList; + +/** + * A simple test of installing+running on AWS-EC2, using various OS distros and versions. + */ +public class JBoss7ServerAwsEc2LiveTest extends AbstractEc2LiveTest { + + public String getTestWar() { + TestResourceUnavailableException.throwIfResourceUnavailable(getClass(), "/hello-world.war"); + return "classpath://hello-world.war"; + } + + @Override + protected void doTest(Location loc) throws Exception { + final JBoss7Server server = app.createAndManageChild(EntitySpec.create(JBoss7Server.class) + .configure("war", getTestWar())); + + app.start(ImmutableList.of(loc)); + + String url = server.getAttribute(JBoss7Server.ROOT_URL); + + HttpTestUtils.assertHttpStatusCodeEventuallyEquals(url, 200); + HttpTestUtils.assertContentContainsText(url, "Hello"); + + Asserts.succeedsEventually(new Runnable() { + @Override public void run() { + assertNotNull(server.getAttribute(JBoss7Server.REQUEST_COUNT)); + assertNotNull(server.getAttribute(JBoss7Server.ERROR_COUNT)); + assertNotNull(server.getAttribute(JBoss7Server.TOTAL_PROCESSING_TIME)); + assertNotNull(server.getAttribute(JBoss7Server.MAX_PROCESSING_TIME)); + assertNotNull(server.getAttribute(JBoss7Server.BYTES_RECEIVED)); + assertNotNull(server.getAttribute(JBoss7Server.BYTES_SENT)); + }}); + } + + @Test(groups = {"Live", "Live-sanity"}) + @Override + public void test_CentOS_6_3() throws Exception { + super.test_CentOS_6_3(); + } + + @Test(enabled=false) + public void testDummy() {} // Convince testng IDE integration that this really does have test methods +} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/77dff880/software/webapp/src/test/java/org/apache/brooklyn/entity/webapp/jboss/JBoss7ServerDockerLiveTest.java ---------------------------------------------------------------------- diff --git a/software/webapp/src/test/java/org/apache/brooklyn/entity/webapp/jboss/JBoss7ServerDockerLiveTest.java b/software/webapp/src/test/java/org/apache/brooklyn/entity/webapp/jboss/JBoss7ServerDockerLiveTest.java new file mode 100644 index 0000000..aa8299d --- /dev/null +++ b/software/webapp/src/test/java/org/apache/brooklyn/entity/webapp/jboss/JBoss7ServerDockerLiveTest.java @@ -0,0 +1,78 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 org.apache.brooklyn.entity.webapp.jboss; + +import brooklyn.entity.proxying.EntitySpec; +import brooklyn.entity.software.AbstractDockerLiveTest; +import brooklyn.location.Location; +import brooklyn.test.Asserts; + +import org.apache.brooklyn.entity.webapp.jboss.JBoss7Server; +import org.apache.brooklyn.test.HttpTestUtils; +import org.apache.brooklyn.test.TestResourceUnavailableException; + +import com.google.common.collect.ImmutableList; + +import org.testng.annotations.Test; + +import java.net.URL; + +import static com.google.common.base.Preconditions.checkNotNull; +import static org.testng.Assert.assertNotNull; + +/** + * A simple test of installing+running on Docker, using various OS distros and versions. + */ +public class JBoss7ServerDockerLiveTest extends AbstractDockerLiveTest { + + public String getTestWar() { + TestResourceUnavailableException.throwIfResourceUnavailable(getClass(), "/hello-world.war"); + return "classpath://hello-world.war"; + } + + @Override + protected void doTest(Location loc) throws Exception { + final JBoss7Server server = app.createAndManageChild(EntitySpec.create(JBoss7Server.class) + .configure("war", getTestWar())); + + app.start(ImmutableList.of(loc)); + + String url = server.getAttribute(JBoss7Server.ROOT_URL); + + HttpTestUtils.assertHttpStatusCodeEventuallyEquals(url, 200); + HttpTestUtils.assertContentContainsText(url, "Hello"); + + Asserts.succeedsEventually(new Runnable() { + @Override + public void run() { + assertNotNull(server.getAttribute(JBoss7Server.REQUEST_COUNT)); + assertNotNull(server.getAttribute(JBoss7Server.ERROR_COUNT)); + assertNotNull(server.getAttribute(JBoss7Server.TOTAL_PROCESSING_TIME)); + assertNotNull(server.getAttribute(JBoss7Server.MAX_PROCESSING_TIME)); + assertNotNull(server.getAttribute(JBoss7Server.BYTES_RECEIVED)); + assertNotNull(server.getAttribute(JBoss7Server.BYTES_SENT)); + } + }); + } + + @Test(enabled = false) + public void testDummy() { + } // Convince testng IDE integration that this really does have test methods + +} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/77dff880/software/webapp/src/test/java/org/apache/brooklyn/entity/webapp/jboss/JBoss7ServerNonInheritingIntegrationTest.java ---------------------------------------------------------------------- diff --git a/software/webapp/src/test/java/org/apache/brooklyn/entity/webapp/jboss/JBoss7ServerNonInheritingIntegrationTest.java b/software/webapp/src/test/java/org/apache/brooklyn/entity/webapp/jboss/JBoss7ServerNonInheritingIntegrationTest.java new file mode 100644 index 0000000..8a4ab3e --- /dev/null +++ b/software/webapp/src/test/java/org/apache/brooklyn/entity/webapp/jboss/JBoss7ServerNonInheritingIntegrationTest.java @@ -0,0 +1,192 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 org.apache.brooklyn.entity.webapp.jboss; + +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertNotNull; + +import java.io.File; +import java.net.URI; + +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +import brooklyn.entity.BrooklynAppLiveTestSupport; +import brooklyn.entity.basic.Entities; +import brooklyn.entity.proxying.EntitySpec; +import brooklyn.location.basic.LocalhostMachineProvisioningLocation; +import brooklyn.test.Asserts; + +import org.apache.brooklyn.entity.webapp.AbstractWebAppFixtureIntegrationTest; +import org.apache.brooklyn.entity.webapp.HttpsSslConfig; +import org.apache.brooklyn.entity.webapp.jboss.JBoss7Server; +import org.apache.brooklyn.test.HttpTestUtils; +import org.apache.brooklyn.test.TestResourceUnavailableException; + +import brooklyn.test.entity.TestApplication; + +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableSet; + +/** + * TODO re-write this like WebAppIntegrationTest, inheriting, rather than being jboss7 specific. + */ +public class JBoss7ServerNonInheritingIntegrationTest extends BrooklynAppLiveTestSupport { + + private LocalhostMachineProvisioningLocation localhostProvisioningLocation; + private File keystoreFile; + + @BeforeMethod(alwaysRun=true) + @Override + public void setUp() throws Exception { + super.setUp(); + localhostProvisioningLocation = app.newLocalhostProvisioningLocation(); + keystoreFile = AbstractWebAppFixtureIntegrationTest.createTemporaryKeyStore("myname", "mypass"); + } + + @AfterMethod(alwaysRun=true) + @Override + public void tearDown() throws Exception { + super.tearDown(); + if (app != null) Entities.destroyAll(app.getManagementContext()); + if (keystoreFile != null) keystoreFile.delete(); + } + + public String getTestWar() { + TestResourceUnavailableException.throwIfResourceUnavailable(getClass(), "/hello-world.war"); + return "classpath://hello-world.war"; + } + + @Test(groups = "Integration") + public void testHttp() throws Exception { + final JBoss7Server server = app.createAndManageChild(EntitySpec.create(JBoss7Server.class) + .configure("war", getTestWar())); + + app.start(ImmutableList.of(localhostProvisioningLocation)); + + // Don't rely on hostname; differs from URL when tests run on AWS VM + String httpUrl = server.getAttribute(JBoss7Server.ROOT_URL); + assertEquals(httpUrl.toLowerCase(), ("http://"+URI.create(httpUrl).getHost()+":"+server.getAttribute(JBoss7Server.HTTP_PORT)+"/").toLowerCase()); + HttpTestUtils.assertHttpStatusCodeEventuallyEquals(httpUrl, 200); + HttpTestUtils.assertContentContainsText(httpUrl, "Hello"); + + String httpsUrl = "https://"+URI.create(httpUrl).getHost()+":"+server.getAttribute(JBoss7Server.HTTPS_PORT)+"/"; + HttpTestUtils.assertUrlUnreachable(httpsUrl); + + Asserts.succeedsEventually(new Runnable() { + public void run() { + assertNotNull(server.getAttribute(JBoss7Server.REQUEST_COUNT)); + assertNotNull(server.getAttribute(JBoss7Server.ERROR_COUNT)); + assertNotNull(server.getAttribute(JBoss7Server.TOTAL_PROCESSING_TIME)); + assertNotNull(server.getAttribute(JBoss7Server.MAX_PROCESSING_TIME)); + assertNotNull(server.getAttribute(JBoss7Server.BYTES_RECEIVED)); + assertNotNull(server.getAttribute(JBoss7Server.BYTES_SENT)); + }}); + } + + @Test(groups = {"Integration"}) + public void testHttps() throws Exception { + final JBoss7Server server = app.createAndManageChild(EntitySpec.create(JBoss7Server.class) + .configure("war", getTestWar()) + .configure(JBoss7Server.ENABLED_PROTOCOLS, ImmutableSet.of("https")) + .configure(JBoss7Server.HTTPS_SSL_CONFIG, new HttpsSslConfig().keyAlias("myname").keystorePassword("mypass").keystoreUrl(keystoreFile.getAbsolutePath()))); + + app.start(ImmutableList.of(localhostProvisioningLocation)); + + // Don't rely on hostname; differs from URL when tests run on AWS VM + String httpsUrl = server.getAttribute(JBoss7Server.ROOT_URL); + assertEquals(httpsUrl.toLowerCase(), ("https://"+URI.create(httpsUrl).getHost()+":"+server.getAttribute(JBoss7Server.HTTPS_PORT)+"/").toLowerCase()); + + String httpUrl = "http://"+URI.create(httpsUrl).getHost()+":"+server.getAttribute(JBoss7Server.HTTP_PORT)+"/"; + HttpTestUtils.assertUrlUnreachable(httpUrl); + + // FIXME HttpTestUtils isn't coping with https, giving + // javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target + // Uncomment this as soon as HttpTestUtils is fixed + // Manual inspection with breakpoint and web-browser confirmed this was working +// HttpTestUtils.assertHttpStatusCodeEventuallyEquals(httpsUrl, 200); +// HttpTestUtils.assertContentContainsText(httpsUrl, "Hello"); + + // FIXME querying for http://localhost:9990/management/subsystem/web/connector/http/read-resource?include-runtime=true + // gives 500 when http is disabled, but if miss out "?include-runtime=true" then it works fine. + // So not getting these metrics! +// TestUtils.executeUntilSucceeds(new Runnable() { +// public void run() { +// assertNotNull(server.getAttribute(JBoss7Server.REQUEST_COUNT)); +// assertNotNull(server.getAttribute(JBoss7Server.ERROR_COUNT)); +// assertNotNull(server.getAttribute(JBoss7Server.TOTAL_PROCESSING_TIME)); +// assertNotNull(server.getAttribute(JBoss7Server.MAX_PROCESSING_TIME)); +// assertNotNull(server.getAttribute(JBoss7Server.BYTES_RECEIVED)); +// assertNotNull(server.getAttribute(JBoss7Server.BYTES_SENT)); +// }}); + } + + @Test(groups = {"Integration"}) + public void testHttpAndHttps() throws Exception { + final JBoss7Server server = app.createAndManageChild(EntitySpec.create(JBoss7Server.class) + .configure("war", getTestWar()) + .configure(JBoss7Server.ENABLED_PROTOCOLS, ImmutableSet.of("http", "https")) + .configure(JBoss7Server.HTTPS_SSL_CONFIG, new HttpsSslConfig().keyAlias("myname").keystorePassword("mypass").keystoreUrl(keystoreFile.getAbsolutePath()))); + + app.start(ImmutableList.of(localhostProvisioningLocation)); + + // Don't rely on hostname; differs from URL when tests run on AWS VM + String httpsUrl = server.getAttribute(JBoss7Server.ROOT_URL); + String httpUrl = "http://"+URI.create(httpsUrl).getHost()+":"+server.getAttribute(JBoss7Server.HTTP_PORT)+"/"; + + assertEquals(httpsUrl.toLowerCase(), ("https://"+URI.create(httpsUrl).getHost()+":"+server.getAttribute(JBoss7Server.HTTPS_PORT)+"/").toLowerCase()); + + HttpTestUtils.assertHttpStatusCodeEventuallyEquals(httpUrl, 200); + HttpTestUtils.assertContentContainsText(httpUrl, "Hello"); + + // FIXME HttpTestUtils isn't coping with https, giving + // javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target + // Uncomment this as soon as HttpTestUtils is fixed + // Manual inspection with breakpoint and web-browser confirmed this was working + //HttpTestUtils.assertHttpStatusCodeEventuallyEquals(httpsUrl, 200); + //HttpTestUtils.assertContentContainsText(httpsUrl, "Hello"); + + Asserts.succeedsEventually(new Runnable() { + public void run() { + assertNotNull(server.getAttribute(JBoss7Server.REQUEST_COUNT)); + assertNotNull(server.getAttribute(JBoss7Server.ERROR_COUNT)); + assertNotNull(server.getAttribute(JBoss7Server.TOTAL_PROCESSING_TIME)); + assertNotNull(server.getAttribute(JBoss7Server.MAX_PROCESSING_TIME)); + assertNotNull(server.getAttribute(JBoss7Server.BYTES_RECEIVED)); + assertNotNull(server.getAttribute(JBoss7Server.BYTES_SENT)); + }}); + } + + @Test(groups = {"Integration"}) + public void testUsingPortOffsets() throws Exception { + final JBoss7Server serverA = app.createAndManageChild(EntitySpec.create(JBoss7Server.class) + .configure("portIncrement", 100)); + final JBoss7Server serverB = app.createAndManageChild(EntitySpec.create(JBoss7Server.class) + .configure("portIncrement", 200)); + app.start(ImmutableList.of(localhostProvisioningLocation)); + + Asserts.succeedsEventually(new Runnable() { + public void run() { + assertNotNull(serverA.getAttribute(JBoss7Server.BYTES_SENT)); + assertNotNull(serverB.getAttribute(JBoss7Server.BYTES_SENT)); + }}); + } + +} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/77dff880/software/webapp/src/test/java/org/apache/brooklyn/entity/webapp/jboss/JBoss7ServerRebindingIntegrationTest.java ---------------------------------------------------------------------- diff --git a/software/webapp/src/test/java/org/apache/brooklyn/entity/webapp/jboss/JBoss7ServerRebindingIntegrationTest.java b/software/webapp/src/test/java/org/apache/brooklyn/entity/webapp/jboss/JBoss7ServerRebindingIntegrationTest.java new file mode 100644 index 0000000..93b19fe --- /dev/null +++ b/software/webapp/src/test/java/org/apache/brooklyn/entity/webapp/jboss/JBoss7ServerRebindingIntegrationTest.java @@ -0,0 +1,126 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 org.apache.brooklyn.entity.webapp.jboss; + +import static org.testng.Assert.assertEquals; + +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +import org.apache.brooklyn.entity.webapp.jboss.JBoss7Server; +import org.apache.brooklyn.test.EntityTestUtils; +import org.apache.brooklyn.test.HttpTestUtils; +import org.apache.brooklyn.test.TestResourceUnavailableException; +import org.apache.brooklyn.test.WebAppMonitor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +import brooklyn.entity.basic.SoftwareProcess; +import brooklyn.entity.proxying.EntitySpec; +import brooklyn.entity.rebind.RebindOptions; +import brooklyn.entity.rebind.RebindTestFixtureWithApp; +import brooklyn.location.basic.LocalhostMachineProvisioningLocation; +import brooklyn.test.entity.TestApplication; + +import com.google.common.base.Predicates; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.Iterables; + +public class JBoss7ServerRebindingIntegrationTest extends RebindTestFixtureWithApp { + private static final Logger LOG = LoggerFactory.getLogger(JBoss7ServerRebindingIntegrationTest.class); + + private LocalhostMachineProvisioningLocation localhostProvisioningLocation; + private TestApplication newApp; + private List<WebAppMonitor> webAppMonitors = new CopyOnWriteArrayList<WebAppMonitor>(); + private ExecutorService executor; + + @BeforeMethod(groups = "Integration") + @Override + public void setUp() throws Exception { + super.setUp(); + executor = Executors.newCachedThreadPool(); + localhostProvisioningLocation = (LocalhostMachineProvisioningLocation) origManagementContext.getLocationRegistry().resolve("localhost"); + } + + @Override + @AfterMethod(alwaysRun=true) + public void tearDown() throws Exception { + for (WebAppMonitor monitor : webAppMonitors) { + monitor.terminate(); + } + if (executor != null) executor.shutdownNow(); + super.tearDown(); + } + + public String getTestWar() { + TestResourceUnavailableException.throwIfResourceUnavailable(getClass(), "/hello-world.war"); + return "classpath://hello-world.war"; + } + + private WebAppMonitor newWebAppMonitor(String url) { + WebAppMonitor monitor = new WebAppMonitor(url) +// .delayMillis(0) + .logFailures(LOG); + webAppMonitors.add(monitor); + executor.execute(monitor); + return monitor; + } + + @Test(groups = "Integration") + public void testRebindsToRunningServer() throws Exception { + // Start an app-server, and wait for it to be fully up + JBoss7Server origServer = origApp.createAndManageChild(EntitySpec.create(JBoss7Server.class) + .configure("war", getTestWar())); + + origApp.start(ImmutableList.of(localhostProvisioningLocation)); + + HttpTestUtils.assertHttpStatusCodeEventuallyEquals(origServer.getAttribute(JBoss7Server.ROOT_URL), 200); + WebAppMonitor monitor = newWebAppMonitor(origServer.getAttribute(JBoss7Server.ROOT_URL)); + + // Rebind + newApp = rebind(RebindOptions.create().terminateOrigManagementContext(true)); + JBoss7Server newServer = (JBoss7Server) Iterables.find(newApp.getChildren(), Predicates.instanceOf(JBoss7Server.class)); + String newRootUrl = newServer.getAttribute(JBoss7Server.ROOT_URL); + + assertEquals(newRootUrl, origServer.getAttribute(JBoss7Server.ROOT_URL)); + assertEquals(newServer.getAttribute(JBoss7Server.MANAGEMENT_HTTP_PORT), origServer.getAttribute(JBoss7Server.MANAGEMENT_HTTP_PORT)); + assertEquals(newServer.getAttribute(JBoss7Server.DEPLOYED_WARS), origServer.getAttribute(JBoss7Server.DEPLOYED_WARS)); + + EntityTestUtils.assertAttributeEqualsEventually(newServer, SoftwareProcess.SERVICE_UP, true); + HttpTestUtils.assertHttpStatusCodeEventuallyEquals(newRootUrl, 200); + + // confirm that deploy() effector affects the correct jboss server + newServer.deploy(getTestWar(), "myhello.war"); + HttpTestUtils.assertHttpStatusCodeEventuallyEquals(newRootUrl+"myhello", 200); + + // check we see evidence of the enrichers and sensor-feeds having an effect. + // Relying on WebAppMonitor to cause these to change. + EntityTestUtils.assertAttributeChangesEventually(newServer, JBoss7Server.REQUEST_COUNT); + EntityTestUtils.assertAttributeChangesEventually(newServer, JBoss7Server.REQUESTS_PER_SECOND_IN_WINDOW); + EntityTestUtils.assertAttributeChangesEventually(newServer, JBoss7Server.REQUESTS_PER_SECOND_IN_WINDOW); + EntityTestUtils.assertAttributeChangesEventually(newServer, JBoss7Server.PROCESSING_TIME_FRACTION_IN_WINDOW); + + assertEquals(monitor.getFailures(), 0); + } +} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/77dff880/software/webapp/src/test/java/org/apache/brooklyn/entity/webapp/jboss/JBossServersMultiVersionWebAppFixtureIntegrationTest.java ---------------------------------------------------------------------- diff --git a/software/webapp/src/test/java/org/apache/brooklyn/entity/webapp/jboss/JBossServersMultiVersionWebAppFixtureIntegrationTest.java b/software/webapp/src/test/java/org/apache/brooklyn/entity/webapp/jboss/JBossServersMultiVersionWebAppFixtureIntegrationTest.java new file mode 100644 index 0000000..2de395e --- /dev/null +++ b/software/webapp/src/test/java/org/apache/brooklyn/entity/webapp/jboss/JBossServersMultiVersionWebAppFixtureIntegrationTest.java @@ -0,0 +1,108 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 org.apache.brooklyn.entity.webapp.jboss; + +import org.apache.brooklyn.entity.webapp.AbstractWebAppFixtureIntegrationTest; +import org.apache.brooklyn.entity.webapp.JavaWebAppSoftwareProcess; +import org.apache.brooklyn.entity.webapp.jboss.JBoss6Server; +import org.apache.brooklyn.entity.webapp.jboss.JBoss7Server; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; + +import brooklyn.entity.basic.SoftwareProcess; +import brooklyn.entity.proxying.EntitySpec; +import brooklyn.location.basic.PortRanges; +import brooklyn.test.entity.TestApplication; + +public class JBossServersMultiVersionWebAppFixtureIntegrationTest extends AbstractWebAppFixtureIntegrationTest { + + @Test(groups = "Integration", dataProvider = "basicEntities") + public void testReportsServiceDownWhenKilled(final SoftwareProcess entity) throws Exception { + super.testReportsServiceDownWhenKilled(entity); + } + + @DataProvider(name = "basicEntities") + public Object[][] basicEntities() { + TestApplication jboss6App = newTestApplication(); + JBoss6Server jboss6 = jboss6App.createAndManageChild(EntitySpec.create(JBoss6Server.class) + .configure(JBoss6Server.PORT_INCREMENT, PORT_INCREMENT)); + + TestApplication jboss7App = newTestApplication(); + JBoss7Server jboss7 = jboss7App.createAndManageChild(EntitySpec.create(JBoss7Server.class) + .configure(JBoss7Server.HTTP_PORT, PortRanges.fromString(DEFAULT_HTTP_PORT))); + + return new JavaWebAppSoftwareProcess[][] { + new JavaWebAppSoftwareProcess[] {jboss6}, + new JavaWebAppSoftwareProcess[] {jboss7} + + }; + } + + // to be able to test on this class in Eclipse IDE + @Test(groups = "Integration", dataProvider = "basicEntities") + public void canStartAndStop(final SoftwareProcess entity) { + super.canStartAndStop(entity); + } + +// @Override +// // TODO override parent and add seam-booking-as{6,7} +// @DataProvider(name = "entitiesWithWarAndURL") +// public Object[][] entitiesWithWar() { +// List<Object[]> result = Lists.newArrayList(); +// +// for (Object[] entity : basicEntities()) { +// result.add(new Object[] { +// entity[0], +// "hello-world.war", +// "hello-world/", +// "" // no sub-page path +// }); +// } +// +// TestApplication tomcatApp = newTestApplication(); +// TomcatServer tomcat = tomcatApp.createAndManageChild(EntitySpec.create(TomcatServer.class) +// .configure(TomcatServer.HTTP_PORT, PortRanges.fromString(DEFAULT_HTTP_PORT))); +// result.add(new Object[] { +// tomcat, +// "swf-booking-mvc.war", +// "swf-booking-mvc/", +// "spring/intro", +// }); +// // FIXME seam-booking does not work +//// [ new JBoss6ServerImpl(parent:application, portIncrement:PORT_INCREMENT), +//// "seam-booking-as6.war", +//// "seam-booking-as6/", +//// ], +//// [ new JBoss7ServerImpl(parent:application, httpPort:DEFAULT_HTTP_PORT), +//// "seam-booking-as7.war", +//// "seam-booking-as7/", +//// ], +// +// return result.toArray(new Object[][] {}); +// } + + public static void main(String ...args) throws Exception { + JBossServersMultiVersionWebAppFixtureIntegrationTest t = new JBossServersMultiVersionWebAppFixtureIntegrationTest(); + t.setUp(); + t.testReportsServiceDownWhenKilled((SoftwareProcess) t.basicEntities()[0][0]); + t.shutdownApp(); + t.shutdownMgmt(); + } + +} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/77dff880/software/webapp/src/test/java/org/apache/brooklyn/entity/webapp/jboss/Jboss7ServerGoogleComputeLiveTest.java ---------------------------------------------------------------------- diff --git a/software/webapp/src/test/java/org/apache/brooklyn/entity/webapp/jboss/Jboss7ServerGoogleComputeLiveTest.java b/software/webapp/src/test/java/org/apache/brooklyn/entity/webapp/jboss/Jboss7ServerGoogleComputeLiveTest.java new file mode 100644 index 0000000..343ec03 --- /dev/null +++ b/software/webapp/src/test/java/org/apache/brooklyn/entity/webapp/jboss/Jboss7ServerGoogleComputeLiveTest.java @@ -0,0 +1,79 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 org.apache.brooklyn.entity.webapp.jboss; + +import static com.google.common.base.Preconditions.checkNotNull; +import static org.testng.Assert.assertNotNull; + +import java.net.URL; + +import org.apache.brooklyn.entity.webapp.jboss.JBoss7Server; +import org.apache.brooklyn.test.HttpTestUtils; +import org.apache.brooklyn.test.TestResourceUnavailableException; +import org.testng.annotations.Test; + +import brooklyn.entity.AbstractGoogleComputeLiveTest; +import brooklyn.entity.proxying.EntitySpec; +import brooklyn.location.Location; +import brooklyn.test.Asserts; + +import com.google.common.collect.ImmutableList; + +/** + * A simple test of installing+running on AWS-EC2, using various OS distros and versions. + */ +public class Jboss7ServerGoogleComputeLiveTest extends AbstractGoogleComputeLiveTest { + + public String getTestWar() { + TestResourceUnavailableException.throwIfResourceUnavailable(getClass(), "/hello-world.war"); + return "classpath://hello-world.war"; + } + + @Override + protected void doTest(Location loc) throws Exception { + final JBoss7Server server = app.createAndManageChild(EntitySpec.create(JBoss7Server.class) + .configure("war", getTestWar())); + + app.start(ImmutableList.of(loc)); + + String url = server.getAttribute(JBoss7Server.ROOT_URL); + + HttpTestUtils.assertHttpStatusCodeEventuallyEquals(url, 200); + HttpTestUtils.assertContentContainsText(url, "Hello"); + + Asserts.succeedsEventually(new Runnable() { + @Override public void run() { + assertNotNull(server.getAttribute(JBoss7Server.REQUEST_COUNT)); + assertNotNull(server.getAttribute(JBoss7Server.ERROR_COUNT)); + assertNotNull(server.getAttribute(JBoss7Server.TOTAL_PROCESSING_TIME)); + assertNotNull(server.getAttribute(JBoss7Server.MAX_PROCESSING_TIME)); + assertNotNull(server.getAttribute(JBoss7Server.BYTES_RECEIVED)); + assertNotNull(server.getAttribute(JBoss7Server.BYTES_SENT)); + }}); + } + + @Test(groups = {"Live"}) + @Override + public void test_DefaultImage() throws Exception { + super.test_DefaultImage(); + } + + @Test(enabled=false) + public void testDummy() {} // Convince testng IDE integration that this really does have test methods +} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/77dff880/software/webapp/src/test/java/org/apache/brooklyn/entity/webapp/jetty/JettyWebAppFixtureIntegrationTest.java ---------------------------------------------------------------------- diff --git a/software/webapp/src/test/java/org/apache/brooklyn/entity/webapp/jetty/JettyWebAppFixtureIntegrationTest.java b/software/webapp/src/test/java/org/apache/brooklyn/entity/webapp/jetty/JettyWebAppFixtureIntegrationTest.java new file mode 100644 index 0000000..a5bd7a8 --- /dev/null +++ b/software/webapp/src/test/java/org/apache/brooklyn/entity/webapp/jetty/JettyWebAppFixtureIntegrationTest.java @@ -0,0 +1,70 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 org.apache.brooklyn.entity.webapp.jetty; + +import org.apache.brooklyn.entity.webapp.AbstractWebAppFixtureIntegrationTest; +import org.apache.brooklyn.entity.webapp.JavaWebAppSoftwareProcess; +import org.apache.brooklyn.entity.webapp.jetty.Jetty6Server; +import org.apache.brooklyn.entity.webapp.jetty.JettyWebAppFixtureIntegrationTest; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; + +import brooklyn.entity.basic.SoftwareProcess; +import brooklyn.entity.proxying.EntitySpec; +import brooklyn.location.basic.PortRanges; +import brooklyn.test.entity.TestApplication; + +public class JettyWebAppFixtureIntegrationTest extends AbstractWebAppFixtureIntegrationTest { + + // FIXME Fails with this is in the jetty log: + // Caused by: java.lang.ClassNotFoundException: mx4j.tools.adaptor.http.HttpAdaptor + + @Test(groups = "Integration", dataProvider = "basicEntities") + public void canStartAndStop(final SoftwareProcess entity) { + super.canStartAndStop(entity); + } + + @DataProvider(name = "basicEntities") + public Object[][] basicEntities() { + TestApplication jettyApp = newTestApplication(); + Jetty6Server jetty = jettyApp.createAndManageChild(EntitySpec.create(Jetty6Server.class) + .configure(Jetty6Server.HTTP_PORT, PortRanges.fromString(DEFAULT_HTTP_PORT))); + + return new JavaWebAppSoftwareProcess[][] { + new JavaWebAppSoftwareProcess[] {jetty} + }; + } + + // to be able to test on this class in Eclipse IDE + @Override + @Test(groups = "Integration", dataProvider = "entitiesWithWarAndURL") + public void testWarDeployAndUndeploy(JavaWebAppSoftwareProcess entity, String war, String urlSubPathToWebApp, + String urlSubPathToPageToQuery) { + super.testWarDeployAndUndeploy(entity, war, urlSubPathToWebApp, urlSubPathToPageToQuery); + } + + public static void main(String ...args) throws Exception { + JettyWebAppFixtureIntegrationTest t = new JettyWebAppFixtureIntegrationTest(); + t.setUp(); + t.canStartAndStop((SoftwareProcess) t.basicEntities()[0][0]); + t.shutdownApp(); + t.shutdownMgmt(); + } + +} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/77dff880/software/webapp/src/test/java/org/apache/brooklyn/entity/webapp/nodejs/NodeJsWebAppEc2LiveTest.java ---------------------------------------------------------------------- diff --git a/software/webapp/src/test/java/org/apache/brooklyn/entity/webapp/nodejs/NodeJsWebAppEc2LiveTest.java b/software/webapp/src/test/java/org/apache/brooklyn/entity/webapp/nodejs/NodeJsWebAppEc2LiveTest.java new file mode 100644 index 0000000..d3f0dae --- /dev/null +++ b/software/webapp/src/test/java/org/apache/brooklyn/entity/webapp/nodejs/NodeJsWebAppEc2LiveTest.java @@ -0,0 +1,61 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 org.apache.brooklyn.entity.webapp.nodejs; + +import static org.apache.brooklyn.entity.webapp.nodejs.NodeJsWebAppFixtureIntegrationTest.APP_FILE; +import static org.apache.brooklyn.entity.webapp.nodejs.NodeJsWebAppFixtureIntegrationTest.APP_NAME; +import static org.apache.brooklyn.entity.webapp.nodejs.NodeJsWebAppFixtureIntegrationTest.GIT_REPO_URL; + +import org.apache.brooklyn.entity.webapp.nodejs.NodeJsWebAppService; +import org.apache.brooklyn.test.HttpTestUtils; +import org.testng.annotations.Test; + +import brooklyn.entity.AbstractEc2LiveTest; +import brooklyn.entity.proxying.EntitySpec; +import brooklyn.location.Location; + +import com.google.common.collect.ImmutableList; + +/** + * A simple test of installing+running on AWS-EC2, using various OS distros and versions. + */ +public class NodeJsWebAppEc2LiveTest extends AbstractEc2LiveTest { + + @Override + protected void doTest(Location loc) throws Exception { + final NodeJsWebAppService server = app.createAndManageChild(EntitySpec.create(NodeJsWebAppService.class) + .configure("gitRepoUrl", GIT_REPO_URL) + .configure("appFileName", APP_FILE) + .configure("appName", APP_NAME)); + + app.start(ImmutableList.of(loc)); + + String url = server.getAttribute(NodeJsWebAppService.ROOT_URL); + + HttpTestUtils.assertHttpStatusCodeEventuallyEquals(url, 200); + HttpTestUtils.assertContentContainsText(url, "Hello"); + } + + @Test(groups = {"Live", "Live-sanity"}) + @Override + public void test_Ubuntu_12_0() throws Exception { + super.test_Ubuntu_12_0(); + } + +} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/77dff880/software/webapp/src/test/java/org/apache/brooklyn/entity/webapp/nodejs/NodeJsWebAppFixtureIntegrationTest.java ---------------------------------------------------------------------- diff --git a/software/webapp/src/test/java/org/apache/brooklyn/entity/webapp/nodejs/NodeJsWebAppFixtureIntegrationTest.java b/software/webapp/src/test/java/org/apache/brooklyn/entity/webapp/nodejs/NodeJsWebAppFixtureIntegrationTest.java new file mode 100644 index 0000000..c85efc1 --- /dev/null +++ b/software/webapp/src/test/java/org/apache/brooklyn/entity/webapp/nodejs/NodeJsWebAppFixtureIntegrationTest.java @@ -0,0 +1,172 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 org.apache.brooklyn.entity.webapp.nodejs; + +import brooklyn.entity.Entity; +import brooklyn.entity.basic.Entities; +import brooklyn.entity.basic.SoftwareProcessDriver; +import brooklyn.entity.drivers.DriverDependentEntity; +import brooklyn.entity.proxying.EntitySpec; +import brooklyn.entity.trait.Startable; +import brooklyn.location.Location; +import brooklyn.location.basic.PortRanges; +import brooklyn.test.Asserts; +import brooklyn.test.entity.TestApplication; +import brooklyn.util.collections.MutableMap; +import brooklyn.util.net.Urls; +import brooklyn.util.time.Duration; + +import com.google.common.collect.ImmutableList; + +import org.apache.brooklyn.entity.webapp.WebAppService; +import org.apache.brooklyn.entity.webapp.nodejs.NodeJsWebAppService; +import org.apache.brooklyn.management.ManagementContext; +import org.apache.brooklyn.test.EntityTestUtils; +import org.apache.brooklyn.test.HttpTestUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +import static org.testng.Assert.assertFalse; +import static org.testng.Assert.assertTrue; + +/** + * Integration tests for NodeJS. + * + * Only works on Linux (including Ubuntu and CentOS); not on OS X + */ +public class NodeJsWebAppFixtureIntegrationTest { + + // TODO Remove duplication from AbstractWebAppFixtureIntegrationTest. Those tests are geared towards Java-based + // tests (e.g. deploying WAR), so not extending it. + + // TODO Test deploy and undeploy; see AbstractWebAppFixtureIntegrationTest#testWarDeployAndUndeploy + + // TODO Does not set WebAppService.REQUEST_COUNT, WebAppService.ERROR_COUNT, REQUESTS_PER_SECOND_IN_WINDOW etc + // See AbstractWebAppFixtureIntegrationTest#testPublishesRequestAndErrorCountMetrics and + // testPublishesRequestsPerSecondMetric for example tests. + + + private static final Logger LOG = LoggerFactory.getLogger(NodeJsWebAppFixtureIntegrationTest.class); + + // Don't use 8080 since that is commonly used by testing software + public static final String DEFAULT_HTTP_PORT = "7880+"; + + public static final String GIT_REPO_URL = "https://github.com/grkvlt/node-hello-world.git"; + public static final String APP_FILE = "app.js"; + public static final String APP_NAME = "node-hello-world"; + + // The parent application entity for these tests + private ManagementContext mgmt; + private TestApplication app; + private Location loc; + private NodeJsWebAppService entity; + + public static void main(String ...args) throws Exception { + NodeJsWebAppFixtureIntegrationTest t = new NodeJsWebAppFixtureIntegrationTest(); + try { + t.setUp(); + t.testReportsServiceDownWhenKilled(); + } finally { + t.tearDown(); + } + } + + @BeforeMethod(alwaysRun=true) + public void setUp() throws Exception { + app = TestApplication.Factory.newManagedInstanceForTests(); + mgmt = app.getManagementContext(); + loc = app.newLocalhostProvisioningLocation(); + + entity = app.createAndManageChild(EntitySpec.create(NodeJsWebAppService.class) + .configure(NodeJsWebAppService.HTTP_PORT, PortRanges.fromString(DEFAULT_HTTP_PORT)) + .configure("gitRepoUrl", GIT_REPO_URL) + .configure("appFileName", APP_FILE) + .configure("appName", APP_NAME)); + } + + @AfterMethod(alwaysRun=true) + public void tearDown() { + if (mgmt != null) Entities.destroyAll(mgmt); + mgmt = null; + } + + /** + * Checks an entity can start, set SERVICE_UP to true and shutdown again. + */ + @Test(groups = "Integration") + public void testCanStartAndStop() { + LOG.info("test=canStartAndStop; entity="+entity+"; app="+entity.getApplication()); + + Entities.start(entity.getApplication(), ImmutableList.of(loc)); + Asserts.succeedsEventually(MutableMap.of("timeout", 120*1000), new Runnable() { + public void run() { + assertTrue(entity.getAttribute(Startable.SERVICE_UP)); + }}); + + entity.stop(); + assertFalse(entity.getAttribute(Startable.SERVICE_UP)); + } + + /** + * Checks an entity can start, set SERVICE_UP to true and shutdown again. + */ + @Test(groups = "Integration") + public void testReportsServiceDownWhenKilled() throws Exception { + LOG.info("test=testReportsServiceDownWithKilled; entity="+entity+"; app="+entity.getApplication()); + + Entities.start(entity.getApplication(), ImmutableList.of(loc)); + EntityTestUtils.assertAttributeEqualsEventually(MutableMap.of("timeout", Duration.minutes(2)), entity, Startable.SERVICE_UP, true); + + // Stop the underlying entity, but without our entity instance being told! + killEntityBehindBack(entity); + LOG.info("Killed {} behind mgmt's back, waiting for service up false in mgmt context", entity); + + EntityTestUtils.assertAttributeEqualsEventually(entity, Startable.SERVICE_UP, false); + + LOG.info("success getting service up false in primary mgmt universe"); + } + + /** + * Stop the given underlying entity, but without our entity instance being told! + */ + protected void killEntityBehindBack(Entity tokill) throws Exception { + ((SoftwareProcessDriver)((DriverDependentEntity<?>) Entities.deproxy(tokill)).getDriver()).stop(); + // old method of doing this did some dodgy legacy rebind and failed due to too many dangling refs; above is better in any case + // but TODO we should have some rebind tests for these! + } + + @Test(groups = "Integration") + public void testInitialNamedDeployments() { + final String urlSubPathToWebApp = APP_NAME; + final String urlSubPathToPageToQuery = ""; + LOG.info("test=testInitialNamedDeployments; entity="+entity+"; app="+entity.getApplication()); + + Entities.start(entity.getApplication(), ImmutableList.of(loc)); + + Asserts.succeedsEventually(MutableMap.of("timeout", Duration.minutes(1)), new Runnable() { + public void run() { + // TODO get this URL from a web-app entity of some kind? + String url = Urls.mergePaths(entity.getAttribute(WebAppService.ROOT_URL), urlSubPathToWebApp, urlSubPathToPageToQuery); + HttpTestUtils.assertHttpStatusCodeEquals(url, 200); + }}); + } +} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/77dff880/software/webapp/src/test/java/org/apache/brooklyn/entity/webapp/nodejs/NodeJsWebAppSimpleIntegrationTest.java ---------------------------------------------------------------------- diff --git a/software/webapp/src/test/java/org/apache/brooklyn/entity/webapp/nodejs/NodeJsWebAppSimpleIntegrationTest.java b/software/webapp/src/test/java/org/apache/brooklyn/entity/webapp/nodejs/NodeJsWebAppSimpleIntegrationTest.java new file mode 100644 index 0000000..f5bb7c9 --- /dev/null +++ b/software/webapp/src/test/java/org/apache/brooklyn/entity/webapp/nodejs/NodeJsWebAppSimpleIntegrationTest.java @@ -0,0 +1,84 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 org.apache.brooklyn.entity.webapp.nodejs; + +import static org.testng.Assert.assertFalse; +import static org.testng.Assert.fail; + +import java.net.ServerSocket; +import java.util.Iterator; + +import org.apache.brooklyn.entity.webapp.nodejs.NodeJsWebAppService; +import org.apache.brooklyn.entity.webapp.nodejs.NodeJsWebAppServiceImpl; +import org.jclouds.util.Throwables2; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +import brooklyn.entity.BrooklynAppLiveTestSupport; +import brooklyn.entity.proxying.EntitySpec; +import brooklyn.location.PortRange; +import brooklyn.location.basic.LocalhostMachineProvisioningLocation; +import brooklyn.location.basic.PortRanges; +import brooklyn.util.net.Networking; + +import com.google.common.collect.ImmutableList; + +/** + * This tests the operation of the {@link NodeJsWebAppService} entity. + */ +public class NodeJsWebAppSimpleIntegrationTest extends BrooklynAppLiveTestSupport { + + private static PortRange DEFAULT_PORT_RANGE = PortRanges.fromString("3000-3099"); + + private int httpPort; + + @BeforeMethod(alwaysRun=true) + public void pickFreePort() { + for (Iterator<Integer> iter = DEFAULT_PORT_RANGE.iterator(); iter.hasNext();) { + Integer port = iter.next(); + if (Networking.isPortAvailable(port)) { + httpPort = port; + return; + } + } + fail("someone is already listening on ports "+DEFAULT_PORT_RANGE+"; tests assume that port is free on localhost"); + } + + @Test(groups="Integration") + public void detectFailureIfNodeJsBindToPort() throws Exception { + ServerSocket listener = new ServerSocket(httpPort); + try { + LocalhostMachineProvisioningLocation loc = app.newLocalhostProvisioningLocation(); + NodeJsWebAppService nodejs = app.createAndManageChild(EntitySpec.create(NodeJsWebAppService.class).configure("httpPort", httpPort)); + try { + nodejs.start(ImmutableList.of(loc)); + fail("Should have thrown start-exception"); + } catch (Exception e) { + // LocalhostMachineProvisioningLocation does NetworkUtils.isPortAvailable, so get -1 + IllegalArgumentException iae = Throwables2.getFirstThrowableOfType(e, IllegalArgumentException.class); + if (iae == null || iae.getMessage() == null || !iae.getMessage().equals("port for http is null")) throw e; + } finally { + nodejs.stop(); + } + assertFalse(nodejs.getAttribute(NodeJsWebAppServiceImpl.SERVICE_UP)); + } finally { + listener.close(); + } + } +} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/77dff880/software/webapp/src/test/java/org/apache/brooklyn/entity/webapp/nodejs/NodeJsWebAppSoftlayerLiveTest.java ---------------------------------------------------------------------- diff --git a/software/webapp/src/test/java/org/apache/brooklyn/entity/webapp/nodejs/NodeJsWebAppSoftlayerLiveTest.java b/software/webapp/src/test/java/org/apache/brooklyn/entity/webapp/nodejs/NodeJsWebAppSoftlayerLiveTest.java new file mode 100644 index 0000000..163e232 --- /dev/null +++ b/software/webapp/src/test/java/org/apache/brooklyn/entity/webapp/nodejs/NodeJsWebAppSoftlayerLiveTest.java @@ -0,0 +1,60 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 org.apache.brooklyn.entity.webapp.nodejs; + +import static org.apache.brooklyn.entity.webapp.nodejs.NodeJsWebAppFixtureIntegrationTest.APP_FILE; +import static org.apache.brooklyn.entity.webapp.nodejs.NodeJsWebAppFixtureIntegrationTest.APP_NAME; +import static org.apache.brooklyn.entity.webapp.nodejs.NodeJsWebAppFixtureIntegrationTest.GIT_REPO_URL; + +import org.apache.brooklyn.entity.webapp.nodejs.NodeJsWebAppService; +import org.apache.brooklyn.test.HttpTestUtils; +import org.testng.annotations.Test; + +import brooklyn.entity.AbstractSoftlayerLiveTest; +import brooklyn.entity.proxying.EntitySpec; +import brooklyn.location.Location; + +import com.google.common.collect.ImmutableList; + +/** + * A simple test of installing+running on Softlayer, using various OS distros and versions. + */ +public class NodeJsWebAppSoftlayerLiveTest extends AbstractSoftlayerLiveTest { + + @Override + protected void doTest(Location loc) throws Exception { + final NodeJsWebAppService server = app.createAndManageChild(EntitySpec.create(NodeJsWebAppService.class) + .configure("gitRepoUrl", GIT_REPO_URL) + .configure("appFileName", APP_FILE) + .configure("appName", APP_NAME)); + + app.start(ImmutableList.of(loc)); + + String url = server.getAttribute(NodeJsWebAppService.ROOT_URL); + + HttpTestUtils.assertHttpStatusCodeEventuallyEquals(url, 200); + HttpTestUtils.assertContentContainsText(url, "Hello"); + } + + @Test(groups = {"Live", "Live-sanity"}) + @Override + public void test_Ubuntu_12_0_4() throws Exception { + super.test_Ubuntu_12_0_4(); + } +} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/77dff880/software/webapp/src/test/java/org/apache/brooklyn/entity/webapp/tomcat/Tomcat8ServerEc2LiveTest.java ---------------------------------------------------------------------- diff --git a/software/webapp/src/test/java/org/apache/brooklyn/entity/webapp/tomcat/Tomcat8ServerEc2LiveTest.java b/software/webapp/src/test/java/org/apache/brooklyn/entity/webapp/tomcat/Tomcat8ServerEc2LiveTest.java new file mode 100644 index 0000000..ad1aca3 --- /dev/null +++ b/software/webapp/src/test/java/org/apache/brooklyn/entity/webapp/tomcat/Tomcat8ServerEc2LiveTest.java @@ -0,0 +1,68 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 org.apache.brooklyn.entity.webapp.tomcat; + +import static org.testng.Assert.assertNotNull; + +import org.testng.annotations.Test; + +import brooklyn.entity.AbstractEc2LiveTest; +import brooklyn.entity.proxying.EntitySpec; +import brooklyn.location.Location; +import brooklyn.test.Asserts; + +import org.apache.brooklyn.entity.webapp.tomcat.Tomcat8Server; +import org.apache.brooklyn.test.HttpTestUtils; +import org.apache.brooklyn.test.TestResourceUnavailableException; + +import com.google.common.collect.ImmutableList; + +/** + * A simple test of installing+running on AWS-EC2, using various OS distros and versions. + */ +public class Tomcat8ServerEc2LiveTest extends AbstractEc2LiveTest { + + public String getTestWar() { + TestResourceUnavailableException.throwIfResourceUnavailable(getClass(), "/hello-world.war"); + return "classpath://hello-world.war"; + } + + @Override + protected void doTest(Location loc) throws Exception { + final Tomcat8Server server = app.createAndManageChild(EntitySpec.create(Tomcat8Server.class) + .configure("war", getTestWar())); + + app.start(ImmutableList.of(loc)); + + String url = server.getAttribute(Tomcat8Server.ROOT_URL); + + HttpTestUtils.assertHttpStatusCodeEventuallyEquals(url, 200); + HttpTestUtils.assertContentContainsText(url, "Hello"); + + Asserts.succeedsEventually(new Runnable() { + @Override public void run() { + assertNotNull(server.getAttribute(Tomcat8Server.REQUEST_COUNT)); + assertNotNull(server.getAttribute(Tomcat8Server.ERROR_COUNT)); + assertNotNull(server.getAttribute(Tomcat8Server.TOTAL_PROCESSING_TIME)); + }}); + } + + @Test(enabled=false) + public void testDummy() {} // Convince testng IDE integration that this really does have test methods +} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/77dff880/software/webapp/src/test/java/org/apache/brooklyn/entity/webapp/tomcat/Tomcat8ServerRestartIntegrationTest.java ---------------------------------------------------------------------- diff --git a/software/webapp/src/test/java/org/apache/brooklyn/entity/webapp/tomcat/Tomcat8ServerRestartIntegrationTest.java b/software/webapp/src/test/java/org/apache/brooklyn/entity/webapp/tomcat/Tomcat8ServerRestartIntegrationTest.java new file mode 100644 index 0000000..53eb739 --- /dev/null +++ b/software/webapp/src/test/java/org/apache/brooklyn/entity/webapp/tomcat/Tomcat8ServerRestartIntegrationTest.java @@ -0,0 +1,45 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 org.apache.brooklyn.entity.webapp.tomcat; + +import org.apache.brooklyn.entity.webapp.tomcat.Tomcat8Server; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.testng.annotations.Test; + +import brooklyn.entity.basic.AbstractSoftwareProcessRestartIntegrationTest; +import brooklyn.entity.basic.SoftwareProcess; +import brooklyn.entity.proxying.EntitySpec; + +/** + * Tests restart of the software *process* (as opposed to the VM). + */ +@Test(groups="Integration") +public class Tomcat8ServerRestartIntegrationTest extends AbstractSoftwareProcessRestartIntegrationTest { + + // TODO Remove duplication from MySqlRestartIntegrationTest + + @SuppressWarnings("unused") + private static final Logger LOG = LoggerFactory.getLogger(Tomcat8ServerRestartIntegrationTest.class); + + @Override + protected EntitySpec<? extends SoftwareProcess> newEntitySpec() { + return EntitySpec.create(Tomcat8Server.class); + } +} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/77dff880/software/webapp/src/test/java/org/apache/brooklyn/entity/webapp/tomcat/Tomcat8ServerSoftlayerLiveTest.java ---------------------------------------------------------------------- diff --git a/software/webapp/src/test/java/org/apache/brooklyn/entity/webapp/tomcat/Tomcat8ServerSoftlayerLiveTest.java b/software/webapp/src/test/java/org/apache/brooklyn/entity/webapp/tomcat/Tomcat8ServerSoftlayerLiveTest.java new file mode 100644 index 0000000..2e37974 --- /dev/null +++ b/software/webapp/src/test/java/org/apache/brooklyn/entity/webapp/tomcat/Tomcat8ServerSoftlayerLiveTest.java @@ -0,0 +1,77 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 org.apache.brooklyn.entity.webapp.tomcat; + +import static org.testng.Assert.assertNotNull; + +import org.testng.annotations.Test; + +import brooklyn.entity.AbstractSoftlayerLiveTest; +import brooklyn.entity.proxying.EntitySpec; +import brooklyn.location.Location; +import brooklyn.test.Asserts; + +import org.apache.brooklyn.entity.webapp.tomcat.Tomcat8Server; +import org.apache.brooklyn.test.HttpTestUtils; +import org.apache.brooklyn.test.TestResourceUnavailableException; + +import com.google.common.collect.ImmutableList; + +/** + * A simple test of installing+running on Softlayer, using various OS distros and versions. + */ +public class Tomcat8ServerSoftlayerLiveTest extends AbstractSoftlayerLiveTest { + + public String getTestWar() { + TestResourceUnavailableException.throwIfResourceUnavailable(getClass(), "/hello-world.war"); + return "classpath://hello-world.war"; + } + + @Override + protected void doTest(Location loc) throws Exception { + final Tomcat8Server server = app.createAndManageChild(EntitySpec.create(Tomcat8Server.class) + .configure("war", getTestWar())); + + app.start(ImmutableList.of(loc)); + + String url = server.getAttribute(Tomcat8Server.ROOT_URL); + + HttpTestUtils.assertHttpStatusCodeEventuallyEquals(url, 200); + HttpTestUtils.assertContentContainsText(url, "Hello"); + + Asserts.succeedsEventually(new Runnable() { + @Override public void run() { + assertNotNull(server.getAttribute(Tomcat8Server.REQUEST_COUNT)); + assertNotNull(server.getAttribute(Tomcat8Server.ERROR_COUNT)); + assertNotNull(server.getAttribute(Tomcat8Server.TOTAL_PROCESSING_TIME)); + + // TODO These appear not to be set in TomcatServerImpl.connectSensors + // See TomcatServerEc2LiveTest, where these are also not included. +// assertNotNull(server.getAttribute(TomcatServer.MAX_PROCESSING_TIME)); +// assertNotNull(server.getAttribute(TomcatServer.BYTES_RECEIVED)); +// assertNotNull(server.getAttribute(TomcatServer.BYTES_SENT)); + }}); + } + + @Test(groups = {"Live", "Live-sanity"}) + @Override + public void test_Ubuntu_12_0_4() throws Exception { + super.test_Ubuntu_12_0_4(); + } +} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/77dff880/software/webapp/src/test/java/org/apache/brooklyn/entity/webapp/tomcat/Tomcat8ServerWebAppFixtureIntegrationTest.java ---------------------------------------------------------------------- diff --git a/software/webapp/src/test/java/org/apache/brooklyn/entity/webapp/tomcat/Tomcat8ServerWebAppFixtureIntegrationTest.java b/software/webapp/src/test/java/org/apache/brooklyn/entity/webapp/tomcat/Tomcat8ServerWebAppFixtureIntegrationTest.java new file mode 100644 index 0000000..acf2e85 --- /dev/null +++ b/software/webapp/src/test/java/org/apache/brooklyn/entity/webapp/tomcat/Tomcat8ServerWebAppFixtureIntegrationTest.java @@ -0,0 +1,177 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 org.apache.brooklyn.entity.webapp.tomcat; + +import java.io.File; +import java.net.InetAddress; +import java.net.Socket; +import java.net.SocketException; +import java.util.List; +import java.util.concurrent.Callable; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicReference; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.testng.Assert; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; + +import brooklyn.entity.basic.SoftwareProcess; +import brooklyn.entity.proxying.EntitySpec; +import brooklyn.location.basic.PortRanges; + +import org.apache.brooklyn.entity.webapp.AbstractWebAppFixtureIntegrationTest; +import org.apache.brooklyn.entity.webapp.HttpsSslConfig; +import org.apache.brooklyn.entity.webapp.JavaWebAppSoftwareProcess; +import org.apache.brooklyn.entity.webapp.tomcat.Tomcat8Server; +import org.apache.brooklyn.test.TestResourceUnavailableException; +import brooklyn.test.entity.TestApplication; +import brooklyn.util.exceptions.Exceptions; +import brooklyn.util.repeat.Repeater; + +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Lists; + +public class Tomcat8ServerWebAppFixtureIntegrationTest extends AbstractWebAppFixtureIntegrationTest { + + @SuppressWarnings("unused") + private static final Logger log = LoggerFactory.getLogger(Tomcat8ServerWebAppFixtureIntegrationTest.class); + + @DataProvider(name = "basicEntities") + public Object[][] basicEntities() { + TestApplication tomcatApp = newTestApplication(); + Tomcat8Server tomcat = tomcatApp.createAndManageChild(EntitySpec.create(Tomcat8Server.class) + .configure(Tomcat8Server.HTTP_PORT, PortRanges.fromString(DEFAULT_HTTP_PORT))); + + + File keystoreFile; + try { + keystoreFile = createTemporaryKeyStore("myname", "mypass"); + keystoreFile.deleteOnExit(); + } catch (Exception e) { + throw Exceptions.propagate(e); + } + + TestApplication tomcatHttpsApp = newTestApplication(); + Tomcat8Server httpsTomcat = tomcatHttpsApp.createAndManageChild(EntitySpec.create(Tomcat8Server.class) + .configure(Tomcat8Server.ENABLED_PROTOCOLS, ImmutableSet.of("https")) + .configure(Tomcat8Server.HTTPS_SSL_CONFIG, + new HttpsSslConfig().keyAlias("myname").keystorePassword("mypass").keystoreUrl(keystoreFile.getAbsolutePath()))); + + return new JavaWebAppSoftwareProcess[][] { + new JavaWebAppSoftwareProcess[] { tomcat }, + new JavaWebAppSoftwareProcess[] { httpsTomcat } + }; + } + + // exists to be able to test on this class from GUI in Eclipse IDE + @Test(groups = "Integration", dataProvider = "basicEntities") + public void canStartAndStop(final SoftwareProcess entity) { + super.canStartAndStop(entity); + } + @Test(groups = "Integration", dataProvider = "basicEntities") + public void testReportsServiceDownWhenKilled(final SoftwareProcess entity) throws Exception { + super.testReportsServiceDownWhenKilled(entity); + } + + @Override + // as parent, but with spring travel + @DataProvider(name = "entitiesWithWarAndURL") + public Object[][] entitiesWithWar() { + TestResourceUnavailableException.throwIfResourceUnavailable(getClass(), "/hello-world.war"); + List<Object[]> result = Lists.newArrayList(); + + for (Object[] entity : basicEntities()) { + result.add(new Object[] { + entity[0], + "hello-world.war", + "hello-world/", + "" // no sub-page path + }); + } + + // TODO would be nice to test against spring web framework stock booking example + // but we'd need an external URL for that (we removed the binary from here for apache compliance reasons) +// TestApplication tomcatApp = newTestApplication(); +// TomcatServer tomcat = tomcatApp.createAndManageChild(EntitySpec.create(TomcatServer.class) +// .configure(TomcatServer.HTTP_PORT, PortRanges.fromString(DEFAULT_HTTP_PORT))); +// result.add(new Object[] { +// tomcat, +// "swf-booking-mvc.war", +// "swf-booking-mvc/", +// "spring/intro", +// }); + + return result.toArray(new Object[][] {}); + } + + @AfterMethod(alwaysRun=true, dependsOnMethods="shutdownApp") + public void ensureIsShutDown() throws Exception { + final AtomicReference<Socket> shutdownSocket = new AtomicReference<Socket>(); + final AtomicReference<SocketException> gotException = new AtomicReference<SocketException>(); + final Integer shutdownPort = (entity != null) ? entity.getAttribute(Tomcat8Server.SHUTDOWN_PORT) : null; + + if (shutdownPort != null) { + boolean socketClosed = Repeater.create("Checking WebApp has shut down") + .repeat(new Callable<Void>() { + public Void call() throws Exception { + if (shutdownSocket.get() != null) shutdownSocket.get().close(); + try { + shutdownSocket.set(new Socket(InetAddress.getLocalHost(), shutdownPort)); + gotException.set(null); + } catch (SocketException e) { + gotException.set(e); + } + return null; + }}) + .every(100, TimeUnit.MILLISECONDS) + .until(new Callable<Boolean>() { + public Boolean call() { + return (gotException.get() != null); + }}) + .limitIterationsTo(25) + .run(); + + if (socketClosed == false) { +// log.error("WebApp did not shut down - this is a failure of the last test run"); +// log.warn("I'm sending a message to the shutdown port {}", shutdownPort); +// OutputStreamWriter writer = new OutputStreamWriter(shutdownSocket.getOutputStream()); +// writer.write("SHUTDOWN\r\n"); +// writer.flush(); +// writer.close(); +// shutdownSocket.close(); + throw new Exception("Last test run did not shut down WebApp entity "+entity+" (port "+shutdownPort+")"); + } + } else { + Assert.fail("Cannot shutdown, because shutdown-port not set for "+entity); + } + } + + public static void main(String ...args) throws Exception { + Tomcat8ServerWebAppFixtureIntegrationTest t = new Tomcat8ServerWebAppFixtureIntegrationTest(); + t.setUp(); + t.testReportsServiceDownWhenKilled((SoftwareProcess) t.basicEntities()[0][0]); + t.shutdownApp(); + t.ensureIsShutDown(); + t.shutdownMgmt(); + } + +} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/77dff880/software/webapp/src/test/java/org/apache/brooklyn/entity/webapp/tomcat/TomcatServerDisableRetrieveUsageMetricsIntegrationTest.java ---------------------------------------------------------------------- diff --git a/software/webapp/src/test/java/org/apache/brooklyn/entity/webapp/tomcat/TomcatServerDisableRetrieveUsageMetricsIntegrationTest.java b/software/webapp/src/test/java/org/apache/brooklyn/entity/webapp/tomcat/TomcatServerDisableRetrieveUsageMetricsIntegrationTest.java new file mode 100644 index 0000000..03d1492 --- /dev/null +++ b/software/webapp/src/test/java/org/apache/brooklyn/entity/webapp/tomcat/TomcatServerDisableRetrieveUsageMetricsIntegrationTest.java @@ -0,0 +1,66 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 org.apache.brooklyn.entity.webapp.tomcat; + +import static org.testng.Assert.assertNotNull; +import static org.testng.Assert.assertNull; + +import org.apache.brooklyn.entity.webapp.tomcat.TomcatServer; +import org.apache.brooklyn.test.EntityTestUtils; +import org.testng.annotations.Test; + +import brooklyn.entity.BrooklynAppLiveTestSupport; +import brooklyn.entity.basic.SoftwareProcess; +import brooklyn.entity.proxying.EntitySpec; +import brooklyn.location.basic.LocalhostMachineProvisioningLocation; +import brooklyn.test.Asserts; + +import com.google.common.collect.ImmutableList; + +public class TomcatServerDisableRetrieveUsageMetricsIntegrationTest extends BrooklynAppLiveTestSupport { + + // Note we test the default and the disabled with two entities, in the same method. + // This piggie-backs off the necessary length of time required for the default entity + // to have its metrics set; we then assert that the other entity does not have its set. + @Test(groups="Integration") + public void testDisableRetrievalOfUsageMetrics() throws Exception { + LocalhostMachineProvisioningLocation loc = app.newLocalhostProvisioningLocation(); + final TomcatServer tc1 = app.createAndManageChild(EntitySpec.create(TomcatServer.class) + .configure(SoftwareProcess.RETRIEVE_USAGE_METRICS, false)); + final TomcatServer tc2 = app.createAndManageChild(EntitySpec.create(TomcatServer.class)); + + tc1.start(ImmutableList.of(loc)); + tc2.start(ImmutableList.of(loc)); + + // tc2 uses defaults, so will include usage metrics + Asserts.succeedsEventually(new Runnable() { + public void run() { + assertNotNull(tc2.getAttribute(TomcatServer.CONNECTOR_STATUS)); + assertNotNull(tc2.getAttribute(TomcatServer.ERROR_COUNT)); + assertNotNull(tc2.getAttribute(TomcatServer.REQUEST_COUNT)); + assertNotNull(tc2.getAttribute(TomcatServer.TOTAL_PROCESSING_TIME)); + }}); + + // tc1 should have status info, but not usage metrics + EntityTestUtils.assertAttributeEventuallyNonNull(tc1, TomcatServer.CONNECTOR_STATUS); + EntityTestUtils.assertAttributeEqualsContinually(tc1, TomcatServer.ERROR_COUNT, null); + assertNull(tc1.getAttribute(TomcatServer.REQUEST_COUNT)); + assertNull(tc1.getAttribute(TomcatServer.TOTAL_PROCESSING_TIME)); + } +}
