modules/enterprise/server/itests/pom.xml | 263 ++++ modules/enterprise/server/itests/src/test/java/org/rhq/enterprise/server/drift/DriftServerPluginService.java | 146 ++ modules/enterprise/server/itests/src/test/java/org/rhq/enterprise/server/drift/DriftServerPluginServiceMBean.java | 25 modules/enterprise/server/itests/src/test/java/org/rhq/enterprise/server/drift/DriftServerTest.java | 241 +++ modules/enterprise/server/itests/src/test/java/org/rhq/enterprise/server/drift/DriftTemplateManagerBeanTest.java | 603 ++++++++++ modules/enterprise/server/itests/src/test/java/org/rhq/enterprise/server/drift/InitDB.java | 32 modules/enterprise/server/itests/src/test/java/org/rhq/enterprise/server/drift/JPADriftServerBeanTest.java | 309 +++++ modules/enterprise/server/itests/src/test/java/org/rhq/enterprise/server/drift/ManageDriftDefinitionsTest.java | 223 +++ modules/enterprise/server/itests/src/test/java/org/rhq/enterprise/server/drift/ManageSnapshotsTest.java | 236 +++ modules/enterprise/server/itests/src/test/resources/META-INF/ejb-jar.xml | 28 modules/enterprise/server/itests/src/test/resources/binary-blob-sample.jar |binary modules/enterprise/server/itests/src/test/resources/default.persistence.properties | 22 modules/enterprise/server/itests/src/test/resources/ejb3-interceptors-aop.xml | 360 +++++ modules/enterprise/server/itests/src/test/resources/embedded-jboss-beans.xml | 160 ++ modules/enterprise/server/itests/src/test/resources/jboss-jms-beans.xml | 132 ++ modules/enterprise/server/itests/src/test/resources/jms-ra.rar |binary modules/enterprise/server/itests/src/test/resources/jndi.properties | 2 modules/enterprise/server/itests/src/test/resources/log4j.xml | 74 + modules/enterprise/server/itests/src/test/resources/login-config.xml | 72 + modules/enterprise/server/itests/src/test/resources/rhq-mdb-beans.xml | 25 modules/enterprise/server/itests/src/test/resources/security-beans.xml | 13 modules/enterprise/server/itests/src/test/resources/test-assist-color-number.txt | 46 modules/enterprise/server/itests/src/test/resources/test-ldap.properties | 2 modules/enterprise/server/itests/src/test/resources/test-scheduler.properties | 29 modules/enterprise/server/itests/src/test/resources/testng.xml | 12 modules/enterprise/server/jar/pom.xml | 1 modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/drift/DriftServerPluginService.java | 146 -- modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/drift/DriftServerPluginServiceMBean.java | 25 modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/drift/DriftServerTest.java | 242 ---- modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/drift/DriftTemplateManagerBeanTest.java | 600 --------- modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/drift/InitDB.java | 32 modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/drift/JPADriftServerBeanTest.java | 306 ----- modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/drift/ManageDriftDefinitionsTest.java | 222 --- modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/drift/ManageSnapshotsTest.java | 235 --- modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3Test.java | 15 modules/enterprise/server/pom.xml | 1 36 files changed, 3067 insertions(+), 1813 deletions(-)
New commits: commit 62bc3e9330af52494db77e43ebbe656b71028d21 Author: John Sanda jsanda@redhat.com Date: Tue Nov 1 13:43:50 2011 -0400
no longer need to exclude drift tests in server/jar
diff --git a/modules/enterprise/server/jar/pom.xml b/modules/enterprise/server/jar/pom.xml index 67c95af..541313b 100644 --- a/modules/enterprise/server/jar/pom.xml +++ b/modules/enterprise/server/jar/pom.xml @@ -610,7 +610,6 @@ Build-OS-Version=${os.version} <excludes> <exclude>com/**/*.java</exclude> <exclude>org/rhq/**/performance/**/*.java</exclude> - <exclude>**/drift/*.java</exclude> </excludes> <excludedGroups>${rhq.testng.excludedGroups}</excludedGroups> <groups>${rhq.testng.includedGroups}</groups>
commit bcd034ffdc3d4883bada50bb801f202acacc4ff3 Author: John Sanda jsanda@redhat.com Date: Tue Nov 1 13:35:21 2011 -0400
removing unnecessary dependencies
diff --git a/modules/enterprise/server/itests/pom.xml b/modules/enterprise/server/itests/pom.xml index 6d871a1..f512aed 100644 --- a/modules/enterprise/server/itests/pom.xml +++ b/modules/enterprise/server/itests/pom.xml @@ -15,8 +15,8 @@ <description>RHQ enterprise server integration tests</description>
<scm> - <connection>scm:git:ssh://git.fedorahosted.org/git/rhq.git/modules/enterprise/server/integration-tests/</connection> - <developerConnection>scm:git:ssh://git.fedorahosted.org/git/rhq.git/modules/enterprise/server/integration-tests/</developerConnection> + <connection>scm:git:ssh://git.fedorahosted.org/git/rhq.git/modules/enterprise/server/itests/</connection> + <developerConnection>scm:git:ssh://git.fedorahosted.org/git/rhq.git/modules/enterprise/server/itests/</developerConnection> </scm>
<properties> @@ -26,42 +26,6 @@ </properties>
<dependencies> - <dependency> - <groupId>org.rhq</groupId> - <artifactId>rhq-enterprise-comm</artifactId> - <version>${project.version}</version> - </dependency> - - <dependency> - <groupId>org.rhq</groupId> - <artifactId>rhq-enterprise-server-xml-schemas</artifactId> - <version>${project.version}</version> - </dependency> - - <dependency> - <groupId>org.rhq</groupId> - <artifactId>rhq-core-domain</artifactId> - <version>${project.version}</version> - </dependency> - - <dependency> - <groupId>org.rhq</groupId> - <artifactId>rhq-core-client-api</artifactId> - <version>${project.version}</version> - </dependency> - - <dependency> - <groupId>org.rhq</groupId> - <artifactId>rhq-common-drift</artifactId> - <version>${project.version}</version> - </dependency> - - <dependency> - <groupId>com.googlecode.java-diff-utils</groupId> - <artifactId>diffutils</artifactId> - <version>1.2.1</version> - </dependency> - <!--================ Test Deps ================-->
<!-- Note, the test deps are intentionally placed above the other scoped deps because of classpath @@ -140,19 +104,12 @@ <!-- NOTE: The remaining test deps correspond to the classes contained in hibernate-all.jar and thirdparty-all.jar. -->
<dependency> - <groupId>antlr</groupId> - <artifactId>antlr</artifactId> - <version>2.7.7</version> - <scope>test</scope> - </dependency> - - <dependency> <groupId>jboss</groupId> <artifactId>javassist</artifactId> - <!-- NOTE: The version is defined in the root POM's dependencyManagement section. --> <scope>test</scope> </dependency>
+ <!-- needed by embedded ejb container --> <dependency> <groupId>trove</groupId> <artifactId>trove</artifactId> @@ -160,6 +117,7 @@ <scope>test</scope> </dependency>
+ <!-- needed by embedded ejb container --> <dependency> <groupId>xerces</groupId> <artifactId>xercesImpl</artifactId> @@ -167,63 +125,8 @@ <scope>test</scope> </dependency>
- <dependency> - <groupId>net.sf.opencsv</groupId> - <artifactId>opencsv</artifactId> - <version>1.8</version> - <scope>test</scope> - </dependency> - - <dependency> - <groupId>commons-jxpath</groupId> - <artifactId>commons-jxpath</artifactId> - <version>1.3</version> - <scope>test</scope> - </dependency> - - <!-- 3rd Party Deps -->
- <dependency> - <groupId>org.antlr</groupId> - <artifactId>antlr</artifactId> - <version>3.2</version> - </dependency> - - <!-- Required by a couple APL and Lather classes - TODO: Remove this once APL and Lather have been excised. --> - <dependency> - <groupId>commons-beanutils</groupId> - <artifactId>commons-beanutils</artifactId> - <version>1.6.1</version> - </dependency> - - <!-- Required by a couple APL classes - TODO: Remove this once APL has been removed. --> - <!-- also required by EJB3 Embedded (test scope) --> - <dependency> - <groupId>commons-collections</groupId> - <artifactId>commons-collections</artifactId> - <version>3.2</version> - </dependency> - - <dependency> - <groupId>commons-httpclient</groupId> - <artifactId>commons-httpclient</artifactId> - <version>3.0.1</version> - </dependency> - - <dependency> - <groupId>commons-lang</groupId> - <artifactId>commons-lang</artifactId> - <version>2.4</version> - </dependency> - - <!-- Required by a couple APL classes - TODO: Remove this once APL has been removed. --> - <dependency> - <groupId>commons-validator</groupId> - <artifactId>commons-validator</artifactId> - <version>1.1.4</version> - </dependency> - <!-- required by RHQ server classes, as well as EJB3 Embedded --> <dependency> <groupId>dom4j</groupId> @@ -233,12 +136,6 @@ </dependency>
<dependency> - <groupId>gnu-getopt</groupId> - <artifactId>getopt</artifactId> - <!-- NOTE: The version is defined in the root POM's dependencyManagement section. --> - </dependency> - - <dependency> <groupId>hibernate</groupId> <artifactId>hibernate3</artifactId> <!-- NOTE: The version is defined in the root POM's dependencyManagement section. --> @@ -255,22 +152,13 @@ <dependency> <groupId>hibernate-entitymanager</groupId> <artifactId>hibernate-entitymanager</artifactId> - <!-- NOTE: The version is defined in the root POM's dependencyManagement section. --> - <scope>provided</scope> <!-- by JBossAS --> - </dependency> - - <dependency> - <groupId>i18nlog</groupId> - <artifactId>i18nlog</artifactId> + <scope>provided</scope> </dependency>
<dependency> - <groupId>org.apache.geronimo.specs</groupId> - <artifactId>geronimo-javamail_1.3.1_spec</artifactId> - <!-- The Sun javamail jar isn't available from a public repo due to licensing issues, - so use the Geronimo one instead. --> - <version>1.3</version> - <scope>provided</scope> <!-- by JBossAS --> + <groupId>javax.mail</groupId> + <artifactId>mail</artifactId> + <version>1.4</version> </dependency>
<dependency> @@ -281,47 +169,12 @@ </dependency>
<dependency> - <groupId>javax.servlet</groupId> - <artifactId>servlet-api</artifactId> - <version>2.4</version> - <scope>provided</scope> <!-- by JBossAS --> - </dependency> - - <dependency> - <groupId>javax.servlet</groupId> - <artifactId>jsp-api</artifactId> - <version>2.0</version> - <scope>provided</scope> <!-- by JBossAS --> - </dependency> - - <dependency> <groupId>jboss</groupId> <artifactId>jboss-annotations-ejb3</artifactId> <!-- NOTE: The version is defined in the root POM's dependencyManagement section. --> <scope>provided</scope> <!-- by JBossAS --> </dependency>
- <dependency> - <groupId>jboss</groupId> - <artifactId>jboss-cache</artifactId> - <!-- NOTE: The version is defined in the root POM's dependencyManagement section. --> - <scope>compile</scope> - </dependency> - - <dependency> - <groupId>jboss</groupId> - <artifactId>jboss-common</artifactId> - <!-- NOTE: The version is defined in the root POM's dependencyManagement section. --> - <scope>provided</scope> <!-- by JBossAS --> - </dependency> - - <dependency> - <groupId>jboss</groupId> - <artifactId>jboss-ejb3x</artifactId> - <!-- NOTE: The version is defined in the root POM's dependencyManagement section. --> - <scope>provided</scope> <!-- by JBossAS --> - </dependency> - <!-- includes the org.jboss.ejb3.StrictMaxPool class, which is needed by the PoolClass annotation used on some of our SLSB's --> <dependency> @@ -331,40 +184,6 @@ <scope>provided</scope> <!-- by JBossAS --> </dependency>
- <dependency> - <groupId>jboss</groupId> - <artifactId>jboss-j2ee</artifactId> - <!-- NOTE: The version is defined in the root POM's dependencyManagement section. --> - <scope>provided</scope> <!-- by JBossAS --> - </dependency> - - <dependency> - <groupId>jboss</groupId> - <artifactId>jboss-jmx</artifactId> - <!-- NOTE: The version is defined in the root POM's dependencyManagement section. --> - <scope>provided</scope> <!-- by JBossAS --> - </dependency> - - <dependency> - <groupId>jboss</groupId> - <artifactId>jboss-system</artifactId> - <!-- NOTE: The version is defined in the root POM's dependencyManagement section. --> - <scope>provided</scope> <!-- by JBossAS --> - </dependency> - - <dependency> - <groupId>jboss</groupId> - <artifactId>jbosssx</artifactId> - <!-- NOTE: The version is defined in the root POM's dependencyManagement section. --> - <scope>provided</scope> <!-- by JBossAS --> - </dependency> - - <dependency> - <groupId>jboss</groupId> - <artifactId>jbpm</artifactId> - <version>3.1.1</version> - </dependency> - <!-- for the transaction interrupt EJB3 interceptor --> <dependency> <groupId>org.jboss.transaction</groupId> @@ -387,92 +206,20 @@ <scope>provided</scope> <!-- by JBossAS itself, which the container build has packaged with 1.6.5 --> </dependency>
+ <!-- This is needed cglib which is in turn needed by hibernate --> <dependency> <groupId>org.easymock</groupId> <artifactId>easymockclassextension</artifactId> <version>2.2</version> <scope>test</scope> - <!-- somehow this is needed otherwise the hibernate stuff doesn't initialize in our tests --> - </dependency> - - <dependency> - <groupId>org.snmp4j</groupId> - <artifactId>snmp4j</artifactId> - <version>1.8.2</version> </dependency>
- <!-- required by RHQ server classes, as well as EJB3 Embedded --> - <dependency> - <groupId>oswego-concurrent</groupId> - <artifactId>concurrent</artifactId> - <version>1.3.4</version> - </dependency> - - <!-- TODO: Why is this needed? --> - <dependency> - <groupId>postgresql</groupId> - <artifactId>postgresql</artifactId> - <!--<scope>test</scope>--> - </dependency> - - <dependency> - <groupId>rss4j</groupId> - <artifactId>rss4j</artifactId> - <version>0.92-on.2</version> - </dependency> - - <dependency> - <groupId>tomcat</groupId> - <artifactId>catalina</artifactId> - <version>5.5.20</version> - <scope>provided</scope> - </dependency> - - <dependency> - <groupId>tomcat</groupId> - <artifactId>tomcat-jk</artifactId> - <version>4.1.31</version> - <scope>provided</scope> - </dependency> - - <!-- Needed by com.jboss.jbossnetwork.apl.actions.xml.XPathProcessor; TODO: Remove once APL has been excised. --> - <dependency> - <groupId>xalan</groupId> - <artifactId>xalan</artifactId> - <version>2.5.1</version> - <scope>provided</scope> - </dependency> - - <dependency> - <groupId>com.jcraft</groupId> - <artifactId>jsch</artifactId> - <version>0.1.29</version> - </dependency> - - <dependency> - <groupId>org.jboss.el</groupId> - <artifactId>jboss-el</artifactId> - <version>2.0.1.GA</version> - <scope>provided</scope> - </dependency> <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.18</version> <scope>provided</scope> </dependency> - - <dependency> - <groupId>org.rhq</groupId> - <artifactId>rhq-core-dbutils</artifactId> - <version>${project.version}</version> - <exclusions> - <exclusion> - <groupId>ant</groupId> - <artifactId>ant</artifactId> - </exclusion> - </exclusions> - </dependency> </dependencies>
<build> @@ -487,45 +234,6 @@ <plugin> <artifactId>maven-antrun-plugin</artifactId> <executions> - - <execution> - <phase>process-classes</phase> - <configuration> - <tasks> - <!-- generate the I18N resource bundles --> - <taskdef name="i18n" classpathref="maven.runtime.classpath" classname="mazz.i18n.ant.I18NAntTask" /> - - <i18n outputdir="${project.build.outputDirectory}" defaultlocale="en" verbose="false" append="false" verify="true"> - <classpath refid="maven.runtime.classpath" /> - <classfileset dir="${project.build.outputDirectory}"> - <include name="**/ServerI18NResourceKeys.class" /> - <include name="**/AlertI18NResourceKeys.class" /> - </classfileset> - </i18n> - - <!-- create our rhq-server-version.properties file that goes in our jar --> - <tstamp> - <format property="build.time" pattern="dd.MMM.yyyy HH.mm.ss z" /> - </tstamp> - - <echo file="${project.build.outputDirectory}/rhq-server-version.properties" append="false">Product-Name=${rhq.product.name} -Product-Version=${project.version} -Module-Name=${project.name} -Module-Version=${project.version} -Build-Number=${buildNumber} -Build-Date=${build.time} -Build-Jdk-Vendor=${java.vendor} -Build-Jdk=${java.version} -Build-OS-Name=${os.name} -Build-OS-Version=${os.version} -</echo> - </tasks> - </configuration> - <goals> - <goal>run</goal> - </goals> - </execution> - <!-- in order to get JMS to work properly in embedded test container, extract jms-rs.rar classes --> <execution> <id>Extract JMS classes from RAR needed for JMS tests</id> @@ -548,7 +256,6 @@ Build-OS-Version=${os.version} <goal>run</goal> </goals> </execution> - </executions> </plugin> </plugins>
commit 97168e68c88467c33a85f8f5e376c59545edb704 Author: John Sanda jsanda@redhat.com Date: Tue Nov 1 11:34:11 2011 -0400
Renaming module integration-tests to itests
diff --git a/modules/enterprise/server/integration-tests/pom.xml b/modules/enterprise/server/integration-tests/pom.xml deleted file mode 100644 index 7c29615..0000000 --- a/modules/enterprise/server/integration-tests/pom.xml +++ /dev/null @@ -1,556 +0,0 @@ -<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> - - <modelVersion>4.0.0</modelVersion> - - <parent> - <groupId>org.rhq</groupId> - <artifactId>rhq-parent</artifactId> - <version>4.1.0-SNAPSHOT</version> - <relativePath>../../../../pom.xml</relativePath> - </parent> - - <artifactId>rhq-server-integration-tests</artifactId> - - <name>RHQ Server Integration Tests</name> - <description>RHQ enterprise server integration tests</description> - - <scm> - <connection>scm:git:ssh://git.fedorahosted.org/git/rhq.git/modules/enterprise/server/integration-tests/</connection> - <developerConnection>scm:git:ssh://git.fedorahosted.org/git/rhq.git/modules/enterprise/server/integration-tests/</developerConnection> - </scm> - - <properties> - <rhq.server.datasource>java:/RHQDS</rhq.server.datasource> - <rhq.server.ds-mapping>PostgreSQL</rhq.server.ds-mapping> - <jboss-embeddable-ejb3.version>1.0.0.Alpha9</jboss-embeddable-ejb3.version> - </properties> - - <dependencies> - <dependency> - <groupId>org.rhq</groupId> - <artifactId>rhq-enterprise-comm</artifactId> - <version>${project.version}</version> - </dependency> - - <dependency> - <groupId>org.rhq</groupId> - <artifactId>rhq-enterprise-server-xml-schemas</artifactId> - <version>${project.version}</version> - </dependency> - - <dependency> - <groupId>org.rhq</groupId> - <artifactId>rhq-core-domain</artifactId> - <version>${project.version}</version> - </dependency> - - <dependency> - <groupId>org.rhq</groupId> - <artifactId>rhq-core-client-api</artifactId> - <version>${project.version}</version> - </dependency> - - <dependency> - <groupId>org.rhq</groupId> - <artifactId>rhq-common-drift</artifactId> - <version>${project.version}</version> - </dependency> - - <dependency> - <groupId>com.googlecode.java-diff-utils</groupId> - <artifactId>diffutils</artifactId> - <version>1.2.1</version> - </dependency> - - <!--================ Test Deps ================--> - - <!-- Note, the test deps are intentionally placed above the other scoped deps because of classpath - reasons. Maven orders the [test] classpath in the order listed in the pom. We specifically - need the embeddable-ejb3 jar above the standard ejb3 jars because we need the embeddble packages - loaded when testing. --> - - <dependency> - <groupId>org.rhq</groupId> - <artifactId>test-utils</artifactId> - <version>${project.version}</version> - <scope>test</scope> - <exclusions> - <exclusion> - <groupId>org.testng</groupId> - <artifactId>testng</artifactId> - </exclusion> - </exclusions> - </dependency> - - <dependency> - <groupId>org.rhq</groupId> - <artifactId>rhq-core-domain</artifactId> - <version>${project.version}</version> - <type>test-jar</type> - <scope>test</scope> - </dependency> - - <dependency> - <groupId>org.rhq</groupId> - <artifactId>rhq-enterprise-server</artifactId> - <version>${project.version}</version> - <scope>test</scope> - </dependency> - - <dependency> - <groupId>org.rhq</groupId> - <artifactId>rhq-enterprise-server</artifactId> - <version>${project.version}</version> - <type>test-jar</type> - <scope>test</scope> - </dependency> - - <dependency> - <groupId>${project.groupId}</groupId> - <artifactId>rhq-core-client-api</artifactId> - <version>${project.version}</version> - <type>test-jar</type> - <scope>test</scope> - </dependency> - - <dependency> - <groupId>org.rhq.helpers</groupId> - <artifactId>perftest-support</artifactId> - <version>${project.version}</version> - <scope>test</scope> - <exclusions> - <exclusion> - <groupId>ant</groupId> - <artifactId>ant</artifactId> - </exclusion> - <exclusion> - <groupId>ant</groupId> - <artifactId>ant-launcher</artifactId> - </exclusion> - </exclusions> - </dependency> - - <dependency> - <groupId>jboss.jboss-embeddable-ejb3</groupId> - <artifactId>jboss-ejb3-all</artifactId> - <version>${jboss-embeddable-ejb3.version}</version> - <scope>test</scope> - </dependency> - - <!-- NOTE: The remaining test deps correspond to the classes contained in hibernate-all.jar and thirdparty-all.jar. --> - - <dependency> - <groupId>antlr</groupId> - <artifactId>antlr</artifactId> - <version>2.7.7</version> - <scope>test</scope> - </dependency> - - <dependency> - <groupId>jboss</groupId> - <artifactId>javassist</artifactId> - <!-- NOTE: The version is defined in the root POM's dependencyManagement section. --> - <scope>test</scope> - </dependency> - - <dependency> - <groupId>trove</groupId> - <artifactId>trove</artifactId> - <version>1.0.2</version> - <scope>test</scope> - </dependency> - - <dependency> - <groupId>xerces</groupId> - <artifactId>xercesImpl</artifactId> - <version>2.8.1</version> - <scope>test</scope> - </dependency> - - <dependency> - <groupId>net.sf.opencsv</groupId> - <artifactId>opencsv</artifactId> - <version>1.8</version> - <scope>test</scope> - </dependency> - - <dependency> - <groupId>commons-jxpath</groupId> - <artifactId>commons-jxpath</artifactId> - <version>1.3</version> - <scope>test</scope> - </dependency> - - - <!-- 3rd Party Deps --> - - <dependency> - <groupId>org.antlr</groupId> - <artifactId>antlr</artifactId> - <version>3.2</version> - </dependency> - - <!-- Required by a couple APL and Lather classes - TODO: Remove this once APL and Lather have been excised. --> - <dependency> - <groupId>commons-beanutils</groupId> - <artifactId>commons-beanutils</artifactId> - <version>1.6.1</version> - </dependency> - - <!-- Required by a couple APL classes - TODO: Remove this once APL has been removed. --> - <!-- also required by EJB3 Embedded (test scope) --> - <dependency> - <groupId>commons-collections</groupId> - <artifactId>commons-collections</artifactId> - <version>3.2</version> - </dependency> - - <dependency> - <groupId>commons-httpclient</groupId> - <artifactId>commons-httpclient</artifactId> - <version>3.0.1</version> - </dependency> - - <dependency> - <groupId>commons-lang</groupId> - <artifactId>commons-lang</artifactId> - <version>2.4</version> - </dependency> - - <!-- Required by a couple APL classes - TODO: Remove this once APL has been removed. --> - <dependency> - <groupId>commons-validator</groupId> - <artifactId>commons-validator</artifactId> - <version>1.1.4</version> - </dependency> - - <!-- required by RHQ server classes, as well as EJB3 Embedded --> - <dependency> - <groupId>dom4j</groupId> - <artifactId>dom4j</artifactId> - <version>1.6.1-jboss</version> - <scope>runtime</scope> - </dependency> - - <dependency> - <groupId>gnu-getopt</groupId> - <artifactId>getopt</artifactId> - <!-- NOTE: The version is defined in the root POM's dependencyManagement section. --> - </dependency> - - <dependency> - <groupId>hibernate</groupId> - <artifactId>hibernate3</artifactId> - <!-- NOTE: The version is defined in the root POM's dependencyManagement section. --> - <scope>provided</scope> <!-- by JBossAS --> - </dependency> - - <dependency> - <groupId>hibernate-annotations</groupId> - <artifactId>hibernate-annotations</artifactId> - <!-- NOTE: The version is defined in the root POM's dependencyManagement section. --> - <scope>provided</scope> <!-- by JBossAS --> - </dependency> - - <dependency> - <groupId>hibernate-entitymanager</groupId> - <artifactId>hibernate-entitymanager</artifactId> - <!-- NOTE: The version is defined in the root POM's dependencyManagement section. --> - <scope>provided</scope> <!-- by JBossAS --> - </dependency> - - <dependency> - <groupId>i18nlog</groupId> - <artifactId>i18nlog</artifactId> - </dependency> - - <dependency> - <groupId>org.apache.geronimo.specs</groupId> - <artifactId>geronimo-javamail_1.3.1_spec</artifactId> - <!-- The Sun javamail jar isn't available from a public repo due to licensing issues, - so use the Geronimo one instead. --> - <version>1.3</version> - <scope>provided</scope> <!-- by JBossAS --> - </dependency> - - <dependency> - <groupId>javax.persistence</groupId> - <artifactId>persistence-api</artifactId> - <version>1.0</version> - <scope>provided</scope> <!-- by JBossAS --> - </dependency> - - <dependency> - <groupId>javax.servlet</groupId> - <artifactId>servlet-api</artifactId> - <version>2.4</version> - <scope>provided</scope> <!-- by JBossAS --> - </dependency> - - <dependency> - <groupId>javax.servlet</groupId> - <artifactId>jsp-api</artifactId> - <version>2.0</version> - <scope>provided</scope> <!-- by JBossAS --> - </dependency> - - <dependency> - <groupId>jboss</groupId> - <artifactId>jboss-annotations-ejb3</artifactId> - <!-- NOTE: The version is defined in the root POM's dependencyManagement section. --> - <scope>provided</scope> <!-- by JBossAS --> - </dependency> - - <dependency> - <groupId>jboss</groupId> - <artifactId>jboss-cache</artifactId> - <!-- NOTE: The version is defined in the root POM's dependencyManagement section. --> - <scope>compile</scope> - </dependency> - - <dependency> - <groupId>jboss</groupId> - <artifactId>jboss-common</artifactId> - <!-- NOTE: The version is defined in the root POM's dependencyManagement section. --> - <scope>provided</scope> <!-- by JBossAS --> - </dependency> - - <dependency> - <groupId>jboss</groupId> - <artifactId>jboss-ejb3x</artifactId> - <!-- NOTE: The version is defined in the root POM's dependencyManagement section. --> - <scope>provided</scope> <!-- by JBossAS --> - </dependency> - - <!-- includes the org.jboss.ejb3.StrictMaxPool class, which is needed by the PoolClass annotation used on some - of our SLSB's --> - <dependency> - <groupId>jboss</groupId> - <artifactId>jboss-ejb3</artifactId> - <!-- NOTE: The version is defined in the root POM's dependencyManagement section. --> - <scope>provided</scope> <!-- by JBossAS --> - </dependency> - - <dependency> - <groupId>jboss</groupId> - <artifactId>jboss-j2ee</artifactId> - <!-- NOTE: The version is defined in the root POM's dependencyManagement section. --> - <scope>provided</scope> <!-- by JBossAS --> - </dependency> - - <dependency> - <groupId>jboss</groupId> - <artifactId>jboss-jmx</artifactId> - <!-- NOTE: The version is defined in the root POM's dependencyManagement section. --> - <scope>provided</scope> <!-- by JBossAS --> - </dependency> - - <dependency> - <groupId>jboss</groupId> - <artifactId>jboss-system</artifactId> - <!-- NOTE: The version is defined in the root POM's dependencyManagement section. --> - <scope>provided</scope> <!-- by JBossAS --> - </dependency> - - <dependency> - <groupId>jboss</groupId> - <artifactId>jbosssx</artifactId> - <!-- NOTE: The version is defined in the root POM's dependencyManagement section. --> - <scope>provided</scope> <!-- by JBossAS --> - </dependency> - - <dependency> - <groupId>jboss</groupId> - <artifactId>jbpm</artifactId> - <version>3.1.1</version> - </dependency> - - <!-- for the transaction interrupt EJB3 interceptor --> - <dependency> - <groupId>org.jboss.transaction</groupId> - <artifactId>jboss-jta</artifactId> - <!-- NOTE: The version is defined in the root POM's dependencyManagement section. --> - <scope>provided</scope> <!-- by JBossAS --> - </dependency> - - <dependency> - <groupId>org.opensymphony.quartz</groupId> - <artifactId>quartz</artifactId> - <!-- NOTE: The version is defined in the root POM's dependencyManagement section. --> - <scope>provided</scope> <!-- by JBossAS itself, which the container build has packaged with 1.6.5 --> - </dependency> - - <dependency> - <groupId>org.opensymphony.quartz</groupId> - <artifactId>quartz-oracle</artifactId> - <!-- NOTE: The version is defined in the root POM's dependencyManagement section. --> - <scope>provided</scope> <!-- by JBossAS itself, which the container build has packaged with 1.6.5 --> - </dependency> - - <dependency> - <groupId>org.easymock</groupId> - <artifactId>easymockclassextension</artifactId> - <version>2.2</version> - <scope>test</scope> - <!-- somehow this is needed otherwise the hibernate stuff doesn't initialize in our tests --> - </dependency> - - <dependency> - <groupId>org.snmp4j</groupId> - <artifactId>snmp4j</artifactId> - <version>1.8.2</version> - </dependency> - - <!-- required by RHQ server classes, as well as EJB3 Embedded --> - <dependency> - <groupId>oswego-concurrent</groupId> - <artifactId>concurrent</artifactId> - <version>1.3.4</version> - </dependency> - - <!-- TODO: Why is this needed? --> - <dependency> - <groupId>postgresql</groupId> - <artifactId>postgresql</artifactId> - <!--<scope>test</scope>--> - </dependency> - - <dependency> - <groupId>rss4j</groupId> - <artifactId>rss4j</artifactId> - <version>0.92-on.2</version> - </dependency> - - <dependency> - <groupId>tomcat</groupId> - <artifactId>catalina</artifactId> - <version>5.5.20</version> - <scope>provided</scope> - </dependency> - - <dependency> - <groupId>tomcat</groupId> - <artifactId>tomcat-jk</artifactId> - <version>4.1.31</version> - <scope>provided</scope> - </dependency> - - <!-- Needed by com.jboss.jbossnetwork.apl.actions.xml.XPathProcessor; TODO: Remove once APL has been excised. --> - <dependency> - <groupId>xalan</groupId> - <artifactId>xalan</artifactId> - <version>2.5.1</version> - <scope>provided</scope> - </dependency> - - <dependency> - <groupId>com.jcraft</groupId> - <artifactId>jsch</artifactId> - <version>0.1.29</version> - </dependency> - - <dependency> - <groupId>org.jboss.el</groupId> - <artifactId>jboss-el</artifactId> - <version>2.0.1.GA</version> - <scope>provided</scope> - </dependency> - <dependency> - <groupId>org.freemarker</groupId> - <artifactId>freemarker</artifactId> - <version>2.3.18</version> - <scope>provided</scope> - </dependency> - - <dependency> - <groupId>org.rhq</groupId> - <artifactId>rhq-core-dbutils</artifactId> - <version>${project.version}</version> - <exclusions> - <exclusion> - <groupId>ant</groupId> - <artifactId>ant</artifactId> - </exclusion> - </exclusions> - </dependency> - </dependencies> - - <build> - <testResources> - <testResource> - <directory>src/test/resources</directory> - <filtering>true</filtering> - </testResource> - </testResources> - - <plugins> - <plugin> - <artifactId>maven-antrun-plugin</artifactId> - <executions> - - <execution> - <phase>process-classes</phase> - <configuration> - <tasks> - <!-- generate the I18N resource bundles --> - <taskdef name="i18n" classpathref="maven.runtime.classpath" classname="mazz.i18n.ant.I18NAntTask" /> - - <i18n outputdir="${project.build.outputDirectory}" defaultlocale="en" verbose="false" append="false" verify="true"> - <classpath refid="maven.runtime.classpath" /> - <classfileset dir="${project.build.outputDirectory}"> - <include name="**/ServerI18NResourceKeys.class" /> - <include name="**/AlertI18NResourceKeys.class" /> - </classfileset> - </i18n> - - <!-- create our rhq-server-version.properties file that goes in our jar --> - <tstamp> - <format property="build.time" pattern="dd.MMM.yyyy HH.mm.ss z" /> - </tstamp> - - <echo file="${project.build.outputDirectory}/rhq-server-version.properties" append="false">Product-Name=${rhq.product.name} -Product-Version=${project.version} -Module-Name=${project.name} -Module-Version=${project.version} -Build-Number=${buildNumber} -Build-Date=${build.time} -Build-Jdk-Vendor=${java.vendor} -Build-Jdk=${java.version} -Build-OS-Name=${os.name} -Build-OS-Version=${os.version} -</echo> - </tasks> - </configuration> - <goals> - <goal>run</goal> - </goals> - </execution> - - <!-- in order to get JMS to work properly in embedded test container, extract jms-rs.rar classes --> - <execution> - <id>Extract JMS classes from RAR needed for JMS tests</id> - <phase>process-classes</phase> - <configuration> - <tasks> - <unzip src="src/test/resources/jms-ra.rar" dest="target"> - <patternset> - <include name="jms-ra.jar"/> - </patternset> - </unzip> - <unzip src="target/jms-ra.jar" dest="target/test-classes"> - <patternset> - <include name="org/**"/> - </patternset> - </unzip> - </tasks> - </configuration> - <goals> - <goal>run</goal> - </goals> - </execution> - - </executions> - </plugin> - </plugins> - </build> -</project> diff --git a/modules/enterprise/server/integration-tests/src/test/java/org/rhq/enterprise/server/drift/DriftServerPluginService.java b/modules/enterprise/server/integration-tests/src/test/java/org/rhq/enterprise/server/drift/DriftServerPluginService.java deleted file mode 100644 index 64c6537..0000000 --- a/modules/enterprise/server/integration-tests/src/test/java/org/rhq/enterprise/server/drift/DriftServerPluginService.java +++ /dev/null @@ -1,146 +0,0 @@ -/* - * RHQ Management Platform - * Copyright (C) 2011 Red Hat, Inc. - * All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation version 2 of the License. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -package org.rhq.enterprise.server.drift; - -import java.io.File; -import java.net.URL; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.rhq.core.domain.configuration.Configuration; -import org.rhq.core.domain.configuration.definition.ConfigurationDefinition; -import org.rhq.core.domain.plugin.PluginKey; -import org.rhq.core.domain.plugin.PluginStatusType; -import org.rhq.core.domain.plugin.ServerPlugin; -import org.rhq.core.util.MessageDigestGenerator; -import org.rhq.enterprise.server.plugin.pc.AbstractTypeServerPluginContainer; -import org.rhq.enterprise.server.plugin.pc.MasterServerPluginContainer; -import org.rhq.enterprise.server.plugin.pc.MasterServerPluginContainerConfiguration; -import org.rhq.enterprise.server.plugin.pc.ServerPluginEnvironment; -import org.rhq.enterprise.server.plugin.pc.ServerPluginManager; -import org.rhq.enterprise.server.plugin.pc.ServerPluginService; -import org.rhq.enterprise.server.plugin.pc.ServerPluginType; -import org.rhq.enterprise.server.plugin.pc.drift.DriftServerPluginContainer; -import org.rhq.enterprise.server.plugin.pc.drift.DriftServerPluginManager; -import org.rhq.enterprise.server.xmlschema.ServerPluginDescriptorMetadataParser; -import org.rhq.enterprise.server.xmlschema.generated.serverplugin.ServerPluginDescriptorType; - -public class DriftServerPluginService extends ServerPluginService implements DriftServerPluginServiceMBean { - - public TestMasterServerPluginContainer master; - public MasterServerPluginContainerConfiguration masterConfig; - - public DriftServerPluginService() { - // build the config at constructor time so tests have it even before the PC is initialized - File dir = new File(System.getProperty("java.io.tmpdir"), "test-server-plugins"); - this.masterConfig = new MasterServerPluginContainerConfiguration(dir, dir, dir, null); - } - - @Override - public MasterServerPluginContainer createMasterPluginContainer() { - this.master = new TestMasterServerPluginContainer(); - this.master.initialize(this.masterConfig); - return this.master; - } - - class TestMasterServerPluginContainer extends MasterServerPluginContainer { - @Override - protected ClassLoader createRootServerPluginClassLoader() { - return getClass().getClassLoader(); - } - - @Override - protected Map<URL, ? extends ServerPluginDescriptorType> preloadAllPlugins() throws Exception { - // if our test never setup any plugins, ignore it and just return an empty map - File pluginDir = getConfiguration().getPluginDirectory(); - if (pluginDir == null || pluginDir.listFiles() == null || pluginDir.listFiles().length == 0) { - return new HashMap<URL, ServerPluginDescriptorType>(); - } else { - return super.preloadAllPlugins(); - } - } - - @Override - protected List<PluginKey> getDisabledPluginKeys() { - // in the real world, the db is checked for enable flag, here we say all plugins are enabled - return new ArrayList<PluginKey>(); - } - - @Override - protected List<AbstractTypeServerPluginContainer> createPluginContainers() { - ArrayList<AbstractTypeServerPluginContainer> pcs = new ArrayList<AbstractTypeServerPluginContainer>(1); - DriftServerPluginContainer driftPC = new TestDriftServerPluginContainer(this); - pcs.add(driftPC); - - return pcs; - } - } - - class TestDriftServerPluginContainer extends DriftServerPluginContainer { - public TestDriftServerPluginContainer(MasterServerPluginContainer master) { - super(master); - } - - @Override - protected ServerPluginManager createPluginManager() { - return new TestDriftServerPluginManager(this); - } - } - - class TestDriftServerPluginManager extends DriftServerPluginManager { - public TestDriftServerPluginManager(DriftServerPluginContainer pc) { - super(pc); - } - - @Override - protected ServerPlugin getPlugin(ServerPluginEnvironment env) { - try { - Configuration pluginConfig = null; - Configuration scheduledJobsConfig = null; - ConfigurationDefinition configDef; - - ServerPluginDescriptorType pluginDescriptor = env.getPluginDescriptor(); - - configDef = ServerPluginDescriptorMetadataParser.getPluginConfigurationDefinition(pluginDescriptor); - if (configDef != null) { - pluginConfig = configDef.getDefaultTemplate().createConfiguration(); - } - - configDef = ServerPluginDescriptorMetadataParser.getScheduledJobsDefinition(pluginDescriptor); - if (configDef != null) { - scheduledJobsConfig = configDef.getDefaultTemplate().createConfiguration(); - } - - File pluginFile = new File(env.getPluginUrl().toURI()); - ServerPlugin plugin = new ServerPlugin(0, env.getPluginKey().getPluginName(), pluginFile.getName(), - pluginDescriptor.getDisplayName(), true, PluginStatusType.INSTALLED, pluginDescriptor - .getDescription(), "", MessageDigestGenerator.getDigestString(pluginFile), pluginDescriptor - .getVersion(), pluginDescriptor.getVersion(), pluginConfig, scheduledJobsConfig, - new ServerPluginType(pluginDescriptor).stringify(), System.currentTimeMillis(), System - .currentTimeMillis()); - return plugin; - } catch (Exception e) { - throw new RuntimeException(e); - } - } - } -} diff --git a/modules/enterprise/server/integration-tests/src/test/java/org/rhq/enterprise/server/drift/DriftServerPluginServiceMBean.java b/modules/enterprise/server/integration-tests/src/test/java/org/rhq/enterprise/server/drift/DriftServerPluginServiceMBean.java deleted file mode 100644 index d38374e..0000000 --- a/modules/enterprise/server/integration-tests/src/test/java/org/rhq/enterprise/server/drift/DriftServerPluginServiceMBean.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * RHQ Management Platform - * Copyright (C) 2011 Red Hat, Inc. - * All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation version 2 of the License. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -package org.rhq.enterprise.server.drift; - -import org.rhq.enterprise.server.plugin.pc.ServerPluginServiceManagement; - -public interface DriftServerPluginServiceMBean extends ServerPluginServiceManagement { -} diff --git a/modules/enterprise/server/integration-tests/src/test/java/org/rhq/enterprise/server/drift/DriftServerTest.java b/modules/enterprise/server/integration-tests/src/test/java/org/rhq/enterprise/server/drift/DriftServerTest.java deleted file mode 100644 index 7db3365..0000000 --- a/modules/enterprise/server/integration-tests/src/test/java/org/rhq/enterprise/server/drift/DriftServerTest.java +++ /dev/null @@ -1,241 +0,0 @@ -/* - * RHQ Management Platform - * Copyright (C) 2011 Red Hat, Inc. - * All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation version 2 of the License. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -package org.rhq.enterprise.server.drift; - -import static org.rhq.core.domain.resource.ResourceCategory.SERVER; -import static org.rhq.enterprise.server.util.LookupUtil.getSubjectManager; - -import java.io.File; -import java.lang.reflect.Method; -import java.util.List; - -import javax.persistence.EntityManager; -import javax.persistence.NoResultException; -import javax.persistence.NonUniqueResultException; - -import org.apache.commons.io.FileUtils; -import org.testng.annotations.AfterClass; -import org.testng.annotations.AfterMethod; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Test; - -import org.rhq.core.domain.auth.Subject; -import org.rhq.core.domain.drift.Drift; -import org.rhq.core.domain.drift.DriftDefinition; -import org.rhq.core.domain.drift.DriftDefinitionTemplate; -import org.rhq.core.domain.resource.Agent; -import org.rhq.core.domain.resource.Resource; -import org.rhq.core.domain.resource.ResourceType; -import org.rhq.core.domain.shared.ResourceBuilder; -import org.rhq.core.domain.shared.ResourceTypeBuilder; -import org.rhq.enterprise.server.plugin.ServerPluginsLocal; -import org.rhq.enterprise.server.test.AbstractEJB3Test; -import org.rhq.enterprise.server.test.TestServerCommunicationsService; -import org.rhq.test.TransactionCallback; - -@Test(groups = "drift") -public class DriftServerTest extends AbstractEJB3Test { - - protected final String RESOURCE_TYPE_NAME = getClass().getSimpleName() + "_RESOURCE_TYPE"; - - protected final String AGENT_NAME = getClass().getSimpleName() + "_AGENT"; - - protected final String RESOURCE_NAME = getClass().getSimpleName() + "_RESOURCE"; - - private ServerPluginsLocal serverPluginsMgr; - - protected DriftServerPluginService driftServerPluginService; - - protected TestServerCommunicationsService agentServiceContainer; - - protected ResourceType resourceType; - - protected Agent agent; - - protected Resource resource; - - @BeforeMethod - public void initServices(Method testMethod) throws Exception { - initDriftServer(); - initAgentServices(); - - InitDB annotation = testMethod.getAnnotation(InitDB.class); - if (annotation == null || annotation.value()) { - initDB(); - } - } - - private void initDriftServer() throws Exception { - driftServerPluginService = new DriftServerPluginService(); - prepareCustomServerPluginService(driftServerPluginService); - driftServerPluginService.masterConfig.getPluginDirectory().mkdirs(); - - File jpaDriftPlugin = new File("../plugins/drift-rhq/target/rhq-serverplugin-drift-4.1.0-SNAPSHOT.jar"); - assertTrue("Drift server plugin JAR file not found at" + jpaDriftPlugin.getPath(), jpaDriftPlugin.exists()); - FileUtils.copyFileToDirectory(jpaDriftPlugin, driftServerPluginService.masterConfig.getPluginDirectory()); - - driftServerPluginService.startMasterPluginContainer(); - - //serverPluginsMgr = LookupUtil.getServerPlugins(); - } - - private void initAgentServices() { - agentServiceContainer = prepareForTestAgents(); - agentServiceContainer.driftService = new TestDefService(); - } - - @AfterMethod(inheritGroups = true) - public void shutDownServices() throws Exception { - shutDownDriftServer(); - shutDownAgentServices(); - } - - private void shutDownDriftServer() throws Exception { - unprepareServerPluginService(); - driftServerPluginService.stopMasterPluginContainer(); - } - - private void shutDownAgentServices() { - agentServiceContainer = null; - unprepareForTestAgents(); - } - - @AfterClass(inheritGroups = true) - public void cleanUpDB() throws Exception { - purgeDB(); - executeInTransaction(new TransactionCallback() { - @Override - public void execute() throws Exception { - purgeDB(getEntityManager()); - } - }); - } - - private void initDB() throws Exception { - purgeDB(); - executeInTransaction(new TransactionCallback() { - @Override - public void execute() throws Exception { - EntityManager em = getEntityManager(); - initResourceType(); - initAgent(); - initResource(); - - em.persist(resourceType); - em.persist(agent); - resource.setAgent(agent); - em.persist(resource); - - initDB(em); - } - }); - } - - private void purgeDB() { - executeInTransaction(new TransactionCallback() { - @Override - public void execute() throws Exception { - EntityManager em = getEntityManager(); - - em.createQuery("delete from JPADrift ").executeUpdate(); - em.createQuery("delete from JPADriftChangeSet").executeUpdate(); - em.createQuery("delete from JPADriftSet").executeUpdate(); - em.createQuery("delete from JPADriftFile").executeUpdate(); - em.createQuery("delete from DriftDefinition").executeUpdate(); - em.createQuery("delete from DriftDefinitionTemplate").executeUpdate(); - - deleteEntity(Resource.class, RESOURCE_NAME, em); - deleteEntity(Agent.class, AGENT_NAME, em); - deleteEntity(ResourceType.class, RESOURCE_TYPE_NAME, em); - - purgeDB(em); - } - }); - } - - protected void purgeDB(EntityManager em) { - } - - protected void initDB(EntityManager em) { - } - - protected void deleteEntity(Class<?> clazz, String name, EntityManager em) { - try { - Object entity = em.createQuery( - "select entity from " + clazz.getSimpleName() + " entity where entity.name = :name") - .setParameter("name", name) - .getSingleResult(); - em.remove(entity); - } catch (NoResultException e) { - // we can ignore no results because this code will run when the db - // is empty and we expect no results in that case - } catch (NonUniqueResultException e) { - // we will fail here to let the person running the test know that - // the database may not be in a consistent state - fail("Purging " + name + " failed. Expected to find one instance of " + clazz.getSimpleName() + - " but found more than one. The database may not be in a consistent state."); - } - } - - protected void initResourceType() { - resourceType = new ResourceTypeBuilder().createResourceType() - .withId(0) - .withName(RESOURCE_TYPE_NAME) - .withCategory(SERVER) - .withPlugin(RESOURCE_TYPE_NAME.toLowerCase()) - .build(); - } - - protected void initAgent() { - agent = new Agent(AGENT_NAME, "localhost", 1, "", AGENT_NAME + "_TOKEN"); - } - - protected void initResource() { - resource = new ResourceBuilder().createResource() - .withId(0) - .withName(RESOURCE_NAME) - .withResourceKey(RESOURCE_NAME) - .withRandomUuid() - .withResourceType(resourceType) - .build(); - } - - protected Subject getOverlord() { - return getSubjectManager().getOverlord(); - } - - protected String toString(DriftDefinition def) { - return "DriftDefinition[id: " + def.getId() + ", name: " + def.getName() + "]"; - } - - protected String toString(DriftDefinitionTemplate template) { - return DriftDefinitionTemplate.class.getSimpleName() + "[id: " + template.getId() + ", name: " + - template.getName() + "]"; - } - - protected Drift findDriftByPath(List<? extends Drift> drifts, String path) { - for (Drift drift : drifts) { - if (drift.getPath().equals(path)) { - return drift; - } - } - return null; - } -} diff --git a/modules/enterprise/server/integration-tests/src/test/java/org/rhq/enterprise/server/drift/DriftTemplateManagerBeanTest.java b/modules/enterprise/server/integration-tests/src/test/java/org/rhq/enterprise/server/drift/DriftTemplateManagerBeanTest.java deleted file mode 100644 index de93b74..0000000 --- a/modules/enterprise/server/integration-tests/src/test/java/org/rhq/enterprise/server/drift/DriftTemplateManagerBeanTest.java +++ /dev/null @@ -1,603 +0,0 @@ -/* - * RHQ Management Platform - * Copyright (C) 2011 Red Hat, Inc. - * All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation version 2 of the License. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -package org.rhq.enterprise.server.drift; - -import static java.util.Arrays.asList; -import static org.rhq.core.domain.common.EntityContext.forResource; -import static org.rhq.core.domain.drift.DriftCategory.FILE_ADDED; -import static org.rhq.core.domain.drift.DriftChangeSetCategory.COVERAGE; -import static org.rhq.core.domain.drift.DriftChangeSetCategory.DRIFT; -import static org.rhq.core.domain.drift.DriftConfigurationDefinition.BaseDirValueContext.fileSystem; -import static org.rhq.core.domain.drift.DriftConfigurationDefinition.DriftHandlingMode.normal; -import static org.rhq.core.domain.drift.DriftConfigurationDefinition.DriftHandlingMode.plannedChanges; -import static org.rhq.core.domain.drift.DriftDefinitionComparator.CompareMode.BOTH_BASE_INFO_AND_DIRECTORY_SPECIFICATIONS; -import static org.rhq.enterprise.server.safeinvoker.HibernateDetachUtility.SerializationType.SERIALIZATION; -import static org.rhq.enterprise.server.util.LookupUtil.getDriftManager; -import static org.rhq.enterprise.server.util.LookupUtil.getDriftTemplateManager; -import static org.rhq.test.AssertUtils.assertPropertiesMatch; - -import java.util.ArrayList; -import java.util.LinkedList; -import java.util.List; - -import javax.ejb.EJBException; -import javax.persistence.EntityManager; - -import org.testng.annotations.BeforeClass; -import org.testng.annotations.Test; - -import org.rhq.core.domain.configuration.Configuration; -import org.rhq.core.domain.criteria.DriftDefinitionCriteria; -import org.rhq.core.domain.criteria.DriftDefinitionTemplateCriteria; -import org.rhq.core.domain.criteria.GenericDriftChangeSetCriteria; -import org.rhq.core.domain.criteria.JPADriftChangeSetCriteria; -import org.rhq.core.domain.drift.Drift; -import org.rhq.core.domain.drift.DriftChangeSet; -import org.rhq.core.domain.drift.DriftDefinition; -import org.rhq.core.domain.drift.DriftDefinitionComparator; -import org.rhq.core.domain.drift.DriftDefinitionTemplate; -import org.rhq.core.domain.drift.DriftSnapshot; -import org.rhq.core.domain.drift.Filter; -import org.rhq.core.domain.drift.JPADrift; -import org.rhq.core.domain.drift.JPADriftChangeSet; -import org.rhq.core.domain.drift.JPADriftFile; -import org.rhq.core.domain.drift.JPADriftSet; -import org.rhq.core.domain.resource.Resource; -import org.rhq.core.domain.resource.ResourceType; -import org.rhq.core.domain.util.PageList; -import org.rhq.enterprise.server.safeinvoker.HibernateDetachUtility; -import org.rhq.test.AssertUtils; -import org.rhq.test.TransactionCallback; - -public class DriftTemplateManagerBeanTest extends DriftServerTest { - - private DriftTemplateManagerLocal templateMgr; - - private DriftManagerLocal driftMgr; - - private List<Resource> resources = new LinkedList<Resource>(); - - private JPADrift drift1; - private JPADrift drift2; - private JPADriftFile driftFile1; - private JPADriftFile driftFile2; - - @BeforeClass - public void initClass() { - templateMgr = getDriftTemplateManager(); - driftMgr = getDriftManager(); - - } - - @Override - protected void initDB(EntityManager em) { - agentServiceContainer.driftService = new TestDefService() { - @Override - public void unscheduleDriftDetection(int resourceId, DriftDefinition driftDef) { - detach(driftDef); - } - - @Override - public void updateDriftDetection(int resourceId, DriftDefinition driftDef) { - detach(driftDef); - } - - @Override - public void updateDriftDetection(int resourceId, DriftDefinition driftDef, DriftSnapshot driftSnapshot) { - detach(driftDef); - detach(driftSnapshot); - } - - private void detach(Object object) { - try { - HibernateDetachUtility.nullOutUninitializedFields(object, SERIALIZATION); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - }; - } - - public void createNewTemplate() { - final DriftDefinition definition = new DriftDefinition(new Configuration()); - definition.setName("test::createNewTemplate"); - definition.setEnabled(true); - definition.setDriftHandlingMode(normal); - definition.setInterval(2400L); - definition.setBasedir(new DriftDefinition.BaseDirectory(fileSystem, "/foo/bar/test")); - - final DriftDefinitionTemplate newTemplate = templateMgr.createTemplate(getOverlord(), resourceType.getId(), - true, definition); - - executeInTransaction(new TransactionCallback() { - @Override - public void execute() throws Exception { - EntityManager em = getEntityManager(); - - ResourceType updatedType = em.find(ResourceType.class, resourceType.getId()); - - assertEquals("Failed to add new drift definition to resource type", 1, updatedType - .getDriftDefinitionTemplates().size()); - - DriftDefinitionTemplate expectedTemplate = new DriftDefinitionTemplate(); - expectedTemplate.setTemplateDefinition(definition); - expectedTemplate.setUserDefined(true); - - assertDriftTemplateEquals("Failed to save template", expectedTemplate, newTemplate); - assertTrue("The template should have its id set", newTemplate.getId() > 0); - } - }); - } - - public void createTemplateForNegativeUpdateTests() { - DriftDefinition definition = new DriftDefinition(new Configuration()); - definition.setName("test::createTemplateForNegativeUpdateTests"); - definition.setEnabled(true); - definition.setDriftHandlingMode(normal); - definition.setInterval(2400L); - definition.setBasedir(new DriftDefinition.BaseDirectory(fileSystem, "/foo/bar/test")); - - templateMgr.createTemplate(getOverlord(), resourceType.getId(), true, definition); - - assertNotNull("Failed to load template", loadTemplate(definition.getName())); - } - - @Test(dependsOnMethods = "createTemplateForNegativeUpdateTests", - expectedExceptions = EJBException.class, - expectedExceptionsMessageRegExp = ".*base directory.*cannot be modified") - @InitDB(false) - public void doNotAllowBaseDirToBeUpdated() { - DriftDefinitionTemplate template = loadTemplate("test::createTemplateForNegativeUpdateTests"); - DriftDefinition definition = template.getTemplateDefinition(); - definition.setBasedir(new DriftDefinition.BaseDirectory(fileSystem, "/foo/bar/TEST")); - - templateMgr.updateTemplate(getOverlord(), template); - } - - @Test(dependsOnMethods = "createTemplateForNegativeUpdateTests", - expectedExceptions = EJBException.class, - expectedExceptionsMessageRegExp = ".*filters.*cannot be modified") - @InitDB(false) - public void doNotAllowFiltersToBeUpdated() { - DriftDefinitionTemplate template = loadTemplate("test::createTemplateForNegativeUpdateTests"); - DriftDefinition definition = template.getTemplateDefinition(); - definition.addExclude(new Filter("/foo/bar/TEST/conf", "*.xml")); - - templateMgr.updateTemplate(getOverlord(), template); - } - - @Test(dependsOnMethods = "createTemplateForNegativeUpdateTests", - expectedExceptions = EJBException.class, - expectedExceptionsMessageRegExp = ".*name.*cannot be modified") - @InitDB(false) - public void doNotAllowTemplateNameToBeUpdated() { - DriftDefinitionTemplate template = loadTemplate("test::createTemplateForNegativeUpdateTests"); - template.setName("A new name"); - - templateMgr.updateTemplate(getOverlord(), template); - } - - public void createAndUpdateTemplate() { - // create the template - DriftDefinition definition = new DriftDefinition(new Configuration()); - definition.setName("test::updateTemplate"); - definition.setDescription("update template test"); - definition.setEnabled(true); - definition.setDriftHandlingMode(normal); - definition.setInterval(2400L); - definition.setBasedir(new DriftDefinition.BaseDirectory(fileSystem, "/foo/bar/test")); - - DriftDefinitionTemplate template = templateMgr.createTemplate(getOverlord(), resourceType.getId(), true, - definition); - - // next create some definitions from the template - final DriftDefinition attachedDef1 = createDefinition(template, "attachedDef1", true); - final DriftDefinition attachedDef2 = createDefinition(template, "attachedDef2", true); - final DriftDefinition detachedDef1 = createDefinition(template, "detachedDef1", false); - final DriftDefinition detachedDef2 = createDefinition(template, "detachedDef2", false); - - driftMgr.updateDriftDefinition(getOverlord(), forResource(resource.getId()), attachedDef1); - driftMgr.updateDriftDefinition(getOverlord(), forResource(resource.getId()), attachedDef2); - driftMgr.updateDriftDefinition(getOverlord(), forResource(resource.getId()), detachedDef1); - driftMgr.updateDriftDefinition(getOverlord(), forResource(resource.getId()), detachedDef2); - - // update the template - final DriftDefinition newTemplateDef = template.getTemplateDefinition(); - newTemplateDef.setInterval(4800L); - newTemplateDef.setDriftHandlingMode(plannedChanges); - newTemplateDef.setEnabled(false); - - templateMgr.updateTemplate(getOverlord(), template); - - // verify that the tempalte has been updated - final DriftDefinitionTemplate updatedTemplate = loadTemplate(template.getName()); - AssertUtils.assertPropertiesMatch("Failed to update template", template, updatedTemplate, "resourceType", - "driftDefinitions", "templateDefinition"); - - // verify that attached definitions are updated. - for (DriftDefinition def : asList(attachedDef1, attachedDef2)) { - DriftDefinition updatedDef = loadDefinition(def.getId()); - String msg = "Failed to propagate update to attached definition " + toString(updatedDef) + " - "; - DriftDefinition updatedTemplateDef = updatedTemplate.getTemplateDefinition(); - - assertEquals(msg + "enabled property not updated", updatedTemplateDef.isEnabled(), - updatedDef.isEnabled()); - assertEquals(msg + "driftHandlingMode property not updated", - updatedTemplateDef.getDriftHandlingMode(), updatedDef.getDriftHandlingMode()); - assertEquals(msg + "interval property not updated", updatedTemplateDef.getInterval(), - updatedDef.getInterval()); - } - - // verify that the detached definitions have not been updated. - for (DriftDefinition def : asList(detachedDef1, detachedDef2)) { - DriftDefinition defAfterUpdate = loadDefinition(def.getId()); - String msg = "Detached definition " + toString(def) + " should not get updated - "; - - assertEquals(msg + "enabled property was modified", def.isEnabled(), defAfterUpdate.isEnabled()); - assertEquals(msg + "driftHandlingMode property was modified", def.getDriftHandlingMode(), - defAfterUpdate.getDriftHandlingMode()); - assertEquals(msg + "interval property was modified", def.getInterval(), defAfterUpdate.getInterval()); - } - } - - - @SuppressWarnings("unchecked") - public void pinTemplate() throws Exception { - // First create the template - final DriftDefinition templateDef = new DriftDefinition(new Configuration()); - templateDef.setName("test::pinTemplate"); - templateDef.setEnabled(true); - templateDef.setDriftHandlingMode(normal); - templateDef.setInterval(2400L); - templateDef.setBasedir(new DriftDefinition.BaseDirectory(fileSystem, "/foo/bar/test")); - - final DriftDefinitionTemplate template = templateMgr.createTemplate(getOverlord(), - resourceType.getId(), true, templateDef); - - // next create some resource level definitions - final DriftDefinition attachedDef1 = createDefinition(template, "attachedDef1", true); - final DriftDefinition attachedDef2 = createDefinition(template, "attachedDef2", true); - final DriftDefinition detachedDef1 = createDefinition(template, "detachedDef1", false); - final DriftDefinition detachedDef2 = createDefinition(template, "detachedDef2", false); - - // create initial change set from which the snapshot will be generated - final JPADriftChangeSet changeSet0 = new JPADriftChangeSet(resource, 0, COVERAGE, attachedDef1); - - driftFile1 = new JPADriftFile("a1b2c3"); - drift1 = new JPADrift(changeSet0, "drift.1", FILE_ADDED, null, driftFile1); - - final JPADriftSet driftSet = new JPADriftSet(); - driftSet.addDrift(drift1); - - // create change set v1 - driftFile2 = new JPADriftFile("1a2b3c"); - final JPADriftChangeSet changeSet1 = new JPADriftChangeSet(resource, 1, DRIFT, attachedDef1); - drift2 = new JPADrift(changeSet1, "drift.2", FILE_ADDED, null, driftFile2); - - executeInTransaction(new TransactionCallback() { - @Override - public void execute() throws Exception { - EntityManager em = getEntityManager(); - - em.persist(attachedDef1); - - em.persist(driftFile1); - em.persist(driftFile2); - - em.persist(changeSet0); - em.persist(driftSet); - changeSet0.setInitialDriftSet(driftSet); - em.merge(changeSet0); - - em.persist(changeSet1); - em.persist(drift2); - - em.persist(attachedDef2); - em.persist(detachedDef1); - em.persist(detachedDef2); - } - }); - - // now we pin the snapshot to the template - templateMgr.pinTemplate(getOverlord(), template.getId(), attachedDef1.getId(), 1); - - // verify that the template is now pinned - DriftDefinitionTemplate updatedTemplate = loadTemplate(template.getName()); - assertTrue("Template should be marked pinned", updatedTemplate.isPinned()); - } - - @Test(dependsOnMethods = "pinTemplate") - @InitDB(false) - public void persistChangeSetWhenTemplateGetsPinned() throws Exception { - DriftDefinitionTemplate template = loadTemplate("test::pinTemplate"); - - GenericDriftChangeSetCriteria criteria = new GenericDriftChangeSetCriteria(); - criteria.addFilterId(template.getChangeSetId()); - - PageList<? extends DriftChangeSet<?>> changeSets = driftMgr.findDriftChangeSetsByCriteria(getOverlord(), - criteria); - - assertEquals("Expected to find change set for pinned template", 1, changeSets.size()); - - JPADriftChangeSet expectedChangeSet = new JPADriftChangeSet(resource, 1, COVERAGE, null); - List<? extends Drift> expectedDrifts = asList( - new JPADrift(expectedChangeSet, "drift.1", FILE_ADDED, null, driftFile1), - new JPADrift(expectedChangeSet, drift2.getPath(), FILE_ADDED, null, driftFile2)); - - DriftChangeSet<?> actualChangeSet = changeSets.get(0); - List<? extends Drift> actualDrifts = new ArrayList(actualChangeSet.getDrifts()); - - AssertUtils.assertCollectionMatchesNoOrder( - "Expected to find drifts from change sets 1 and 2 in the template change set", - (List<Drift>) expectedDrifts, (List<Drift>) actualDrifts, "id", "ctime", "changeSet", "newDriftFile"); - - // we need to compare the newDriftFile properties separately because - // assertCollectionMatchesNoOrder compares properties via equals() and JPADriftFile - // does not implement equals. - assertPropertiesMatch(drift1.getNewDriftFile(), findDriftByPath(actualDrifts, "drift.1").getNewDriftFile(), - "The newDriftFile property was not set correctly for " + drift1); - assertPropertiesMatch(drift2.getNewDriftFile(), findDriftByPath(actualDrifts, "drift.2").getNewDriftFile(), - "The newDriftFile property was not set correctly for " + drift1); - } - - @Test(dependsOnMethods = "pinTemplate") - @InitDB(false) - public void updateAttachedDefinitionsWhenTemplateGetsPinned() throws Exception { - DriftDefinitionTemplate template = loadTemplate("test::pinTemplate"); - - // get the attached definitions - List<DriftDefinition> attachedDefs = new LinkedList<DriftDefinition>(); - for (DriftDefinition d : template.getDriftDefinitions()) { - if (d.isAttached() && (d.getName().equals("attachedDef1") || d.getName().equals("attachedDef2"))) { - attachedDefs.add(d); - } - } - assertEquals("Failed to get attached definitions for " + toString(template), 2, attachedDefs.size()); - assertDefinitionIsPinned(attachedDefs.get(0)); - assertDefinitionIsPinned(attachedDefs.get(1)); - } - - @Test(dependsOnMethods = "pinTemplate") - @InitDB(false) - public void doNotUpdateDetachedDefinitionsWhenTemplateGetsPinned() throws Exception { - DriftDefinitionTemplate template = loadTemplate("test::pinTemplate"); - - // get the detached definitions - List<DriftDefinition> detachedDefs = new LinkedList<DriftDefinition>(); - for (DriftDefinition d : template.getDriftDefinitions()) { - if (!d.isAttached() && (d.getName().equals("detachedDef1") || d.getName().equals("detachedDef2"))) { - detachedDefs.add(d); - } - } - assertEquals("Failed to get detached definitions for " + toString(template), 2, detachedDefs.size()); - assertDefinitionIsNotPinned(detachedDefs.get(0)); - assertDefinitionIsNotPinned(detachedDefs.get(1)); - } - - public void deleteTemplate() throws Exception { - // first create the template - final DriftDefinition templateDef = new DriftDefinition(new Configuration()); - templateDef.setName("test::pinTemplate"); - templateDef.setEnabled(true); - templateDef.setDriftHandlingMode(normal); - templateDef.setInterval(2400L); - templateDef.setBasedir(new DriftDefinition.BaseDirectory(fileSystem, "/foo/bar/test")); - - final DriftDefinitionTemplate template = templateMgr.createTemplate(getOverlord(), - resourceType.getId(), true, templateDef); - - // next create some resource level definitions - final DriftDefinition attachedDef1 = createDefinition(template, "attachedDef1", true); - final DriftDefinition attachedDef2 = createDefinition(template, "attachedDef2", true); - final DriftDefinition detachedDef1 = createDefinition(template, "detachedDef1", false); - final DriftDefinition detachedDef2 = createDefinition(template, "detachedDef2", false); - - // create some change sets - final JPADriftChangeSet changeSet0 = new JPADriftChangeSet(resource, 0, COVERAGE, attachedDef1); - - driftFile1 = new JPADriftFile("a1b2c3"); - drift1 = new JPADrift(changeSet0, "drift.1", FILE_ADDED, null, driftFile1); - - final JPADriftSet driftSet0 = new JPADriftSet(); - driftSet0.addDrift(drift1); - - final JPADriftChangeSet changeSet1 = new JPADriftChangeSet(resource, 0, DRIFT, detachedDef1); - - driftFile2 = new JPADriftFile("1a2b3c"); - drift2 = new JPADrift(changeSet1, "drift.2", FILE_ADDED, null, driftFile2); - - final JPADriftSet driftSet1 = new JPADriftSet(); - driftSet1.addDrift(drift2); - - executeInTransaction(new TransactionCallback() { - @Override - public void execute() throws Exception { - EntityManager em = getEntityManager(); - - em.persist(attachedDef1); - em.persist(attachedDef2); - em.persist(detachedDef1); - em.persist(detachedDef2); - - em.persist(driftFile1); - em.persist(driftFile2); - - em.persist(changeSet0); - em.persist(driftSet0); - changeSet0.setInitialDriftSet(driftSet0); - em.merge(changeSet0); - - em.persist(changeSet1); - em.persist(driftSet1); - changeSet1.setInitialDriftSet(driftSet1); - em.merge(changeSet1); - } - }); - - // delete the template - templateMgr.deleteTemplate(getOverlord(), template.getId()); - - // verify that attached definitions along with their change sets have - // been deleted - assertNull("Change sets belonging to attached definitions should be deleted", loadChangeSet(changeSet0.getId())); - assertNull("Attached definition " + toString(attachedDef1) + " should be deleted", - loadDefinition(attachedDef1.getId())); - assertNull("Attached definition " + toString(attachedDef2) + " should be deleted", - loadDefinition(attachedDef2.getId())); - - // verify that detached definitions along with their change sets have not been deleted - assertNotNull("Change sets belonging to detached definitions should not be deleted", - loadChangeSet(changeSet1.getId())); - assertDetachedDefinitionNotDeleted(detachedDef1.getId()); - assertDetachedDefinitionNotDeleted(detachedDef2.getId()); - - // verify that the template itself has been deleted - assertNull("The template " + toString(template) + " should have been deleted", - loadTemplate(template.getName(), false)); - } - - private void assertDefinitionIsPinned(DriftDefinition definition) throws Exception { - // verify that the definition is marked as pinned - assertTrue("Expected " + toString(definition) + " to be pinned", definition.isPinned()); - - // verify that the initial change set is generated for the definition - JPADriftChangeSetCriteria criteria = new JPADriftChangeSetCriteria(); - criteria.addFilterDriftDefinitionId(definition.getId()); - criteria.addFilterCategory(COVERAGE); - criteria.fetchDrifts(true); - - PageList<? extends DriftChangeSet<?>> changeSets = driftMgr.findDriftChangeSetsByCriteria(getOverlord(), - criteria); - assertEquals("Expected to find one change set", 1, changeSets.size()); - - JPADriftChangeSet expectedChangeSet = new JPADriftChangeSet(resource, 1, COVERAGE, null); - List<? extends Drift> expectedDrifts = asList( - new JPADrift(expectedChangeSet, drift1.getPath(), FILE_ADDED, null, driftFile1), - new JPADrift(expectedChangeSet, drift2.getPath(), FILE_ADDED, null, driftFile2)); - - DriftChangeSet<?> actualChangeSet = changeSets.get(0); - List<? extends Drift> actualDrifts = new ArrayList(actualChangeSet.getDrifts()); - - AssertUtils.assertCollectionMatchesNoOrder( - "Expected to find drifts from change sets 1 and 2 in the template change set", - (List<Drift>) expectedDrifts, (List<Drift>) actualDrifts, "id", "ctime", "changeSet", "newDriftFile"); - - // Finally make sure that there are no other change sets - criteria = new JPADriftChangeSetCriteria(); - criteria.addFilterStartVersion(1); - criteria.addFilterDriftDefinitionId(definition.getId()); - - assertEquals("There should not be any drift change sets", 0, - driftMgr.findDriftChangeSetsByCriteria(getOverlord(), criteria).size()); - } - - private void assertDefinitionIsNotPinned(DriftDefinition definition) throws Exception { - // verify that the definition is not pinned - assertFalse("Expected " + toString(definition) + " to be unpinned", definition.isPinned()); - - // Note that this method assumes that the definition has no change sets - // associated with it and therefore checks that there are no change sets. - JPADriftChangeSetCriteria criteria = new JPADriftChangeSetCriteria(); - criteria.addFilterDriftDefinitionId(definition.getId()); - - PageList<? extends DriftChangeSet<?>> changeSets = driftMgr.findDriftChangeSetsByCriteria(getOverlord(), - criteria); - assertEquals("Did not expect to find any change sets for " + toString(definition) + ". Note that this " + - "assertion method assumes that the definition you are testing is not supposed to have any change sets.", - 0, changeSets.size()); - } - - private void assertDriftTemplateEquals(String msg, DriftDefinitionTemplate expected, DriftDefinitionTemplate actual) { - AssertUtils - .assertPropertiesMatch(msg + ": basic drift definition template properties do not match", expected, actual, - "id", "resourceType", "ctime", "templateDefinition"); - assertDriftDefEquals(msg + ": template definitions do not match", expected.getTemplateDefinition(), actual - .getTemplateDefinition()); - } - - private void assertDriftDefEquals(String msg, DriftDefinition expected, DriftDefinition actual) { - DriftDefinitionComparator comparator = new DriftDefinitionComparator( - BOTH_BASE_INFO_AND_DIRECTORY_SPECIFICATIONS); - assertEquals(msg, 0, comparator.compare(expected, actual)); - } - - private void assertDetachedDefinitionNotDeleted(int definitionId) { - DriftDefinition definition = loadDefinition(definitionId); - assertNotNull("Detached definition " + toString(definition) + " should not be deleted", definition); - assertNull("The detached definition's template reference should be set to null when the template is deleted", - definition.getTemplate()); - } - - private DriftDefinition createDefinition(DriftDefinitionTemplate template, String defName, boolean isAttached) { - DriftDefinition def = template.createDefinition(); - def.setName(defName); - def.setAttached(isAttached); - def.setTemplate(template); - def.setResource(resource); - return def; - } - - private DriftDefinitionTemplate loadTemplate(String name) { - return loadTemplate(name, true); - } - - private DriftDefinitionTemplate loadTemplate(String name, boolean verifyResultsUnique) { - DriftDefinitionTemplateCriteria criteria = new DriftDefinitionTemplateCriteria(); - criteria.addFilterResourceTypeId(resourceType.getId()); - criteria.addFilterName(name); - criteria.fetchDriftDefinitions(true); - - PageList<DriftDefinitionTemplate> templates = templateMgr.findTemplatesByCriteria(getOverlord(), criteria); - if (verifyResultsUnique) { - assertEquals("Expected to find one template", 1, templates.size()); - } - - if (templates.isEmpty()) { - return null; - } - return templates.get(0); - } - - private DriftDefinition loadDefinition(int definitionId) { - DriftDefinitionCriteria criteria = new DriftDefinitionCriteria(); - criteria.addFilterId(definitionId); - criteria.fetchConfiguration(true); - criteria.fetchTemplate(true); - PageList<DriftDefinition> definitions = driftMgr.findDriftDefinitionsByCriteria(getOverlord(), criteria); - - if (definitions.isEmpty()) { - return null; - } - return definitions.get(0); - } - - private DriftChangeSet<?> loadChangeSet(String id) throws Exception { - GenericDriftChangeSetCriteria criteria = new GenericDriftChangeSetCriteria(); - criteria.addFilterId(id); - PageList<? extends DriftChangeSet<?>> changeSets = driftMgr.findDriftChangeSetsByCriteria(getOverlord(), - criteria); - - if (changeSets.isEmpty()) { - return null; - } - return changeSets.get(0); - } - -} diff --git a/modules/enterprise/server/integration-tests/src/test/java/org/rhq/enterprise/server/drift/InitDB.java b/modules/enterprise/server/integration-tests/src/test/java/org/rhq/enterprise/server/drift/InitDB.java deleted file mode 100644 index 65a6523..0000000 --- a/modules/enterprise/server/integration-tests/src/test/java/org/rhq/enterprise/server/drift/InitDB.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * RHQ Management Platform - * Copyright (C) 2011 Red Hat, Inc. - * All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation version 2 of the License. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -package org.rhq.enterprise.server.drift; - -import static java.lang.annotation.RetentionPolicy.RUNTIME; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -@Retention(RUNTIME) -@Target({ElementType.METHOD }) -public @interface InitDB { - boolean value() default true; -} diff --git a/modules/enterprise/server/integration-tests/src/test/java/org/rhq/enterprise/server/drift/JPADriftServerBeanTest.java b/modules/enterprise/server/integration-tests/src/test/java/org/rhq/enterprise/server/drift/JPADriftServerBeanTest.java deleted file mode 100644 index 4faca1b..0000000 --- a/modules/enterprise/server/integration-tests/src/test/java/org/rhq/enterprise/server/drift/JPADriftServerBeanTest.java +++ /dev/null @@ -1,309 +0,0 @@ -/* - * RHQ Management Platform - * Copyright (C) 2011 Red Hat, Inc. - * All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation version 2 of the License. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -package org.rhq.enterprise.server.drift; - -import static java.util.Arrays.asList; -import static org.apache.commons.io.IOUtils.toInputStream; -import static org.rhq.core.domain.drift.DriftCategory.FILE_ADDED; -import static org.rhq.core.domain.drift.DriftChangeSetCategory.COVERAGE; -import static org.rhq.core.domain.drift.DriftConfigurationDefinition.BaseDirValueContext.fileSystem; -import static org.rhq.core.domain.drift.DriftConfigurationDefinition.DriftHandlingMode.normal; -import static org.rhq.core.domain.drift.DriftFileStatus.LOADED; -import static org.rhq.enterprise.server.util.LookupUtil.getJPADriftServer; -import static org.rhq.test.AssertUtils.assertPropertiesMatch; - -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -import javax.persistence.EntityManager; - -import org.testng.annotations.BeforeClass; -import org.testng.annotations.BeforeMethod; - -import org.rhq.core.domain.configuration.Configuration; -import org.rhq.core.domain.criteria.JPADriftChangeSetCriteria; -import org.rhq.core.domain.drift.Drift; -import org.rhq.core.domain.drift.DriftDefinition; -import org.rhq.core.domain.drift.JPADrift; -import org.rhq.core.domain.drift.JPADriftChangeSet; -import org.rhq.core.domain.drift.JPADriftFile; -import org.rhq.core.domain.drift.JPADriftSet; -import org.rhq.core.domain.drift.dto.DriftChangeSetDTO; -import org.rhq.core.domain.drift.dto.DriftDTO; -import org.rhq.core.domain.drift.dto.DriftFileDTO; -import org.rhq.core.domain.util.PageList; -import org.rhq.test.AssertUtils; -import org.rhq.test.TransactionCallback; - -public class JPADriftServerBeanTest extends DriftServerTest { - - private JPADriftServerLocal jpaDriftServer; - - private final String DRIFT_FILE_1_ID = "a1b2c3d4"; - - private final String DRIFT_FILE_2_ID = "1ab2b3c4d"; - - private JPADriftFile driftFile1; - - private JPADriftFile driftFile2; - - @BeforeClass - public void initTests() { - jpaDriftServer = getJPADriftServer(); - } - - @BeforeMethod - public void persistDriftFiles() throws Exception { - driftFile1 = jpaDriftServer.persistDriftFile(new JPADriftFile(DRIFT_FILE_1_ID)); - driftFile2 = jpaDriftServer.persistDriftFile(new JPADriftFile(DRIFT_FILE_2_ID)); - - String driftFile1Content = "drift file 1 content..."; - String driftFile2Content = "drift file 2 content..."; - - jpaDriftServer.persistDriftFileData(driftFile1, toInputStream(driftFile1Content), driftFile1Content.length()); - jpaDriftServer.persistDriftFileData(driftFile2, toInputStream(driftFile2Content), driftFile2Content.length()); - - driftFile1 = jpaDriftServer.getDriftFile(getOverlord(), DRIFT_FILE_1_ID); - driftFile2 = jpaDriftServer.getDriftFile(getOverlord(), DRIFT_FILE_2_ID); - - assertDriftFilePersisted(driftFile1, "driftFile1", driftFile1Content); - assertDriftFilePersisted(driftFile2, "driftFile2", driftFile2Content); - } - - public void persistResourceChangeSet() { - // first create and persist the drift definition - final DriftDefinition driftDef = new DriftDefinition(new Configuration()); - driftDef.setName("test::persistResourceChangeSet"); - driftDef.setEnabled(true); - driftDef.setDriftHandlingMode(normal); - driftDef.setInterval(2400L); - driftDef.setBasedir(new DriftDefinition.BaseDirectory(fileSystem, "/foo/bar/test")); - driftDef.setResource(resource); - - executeInTransaction(new TransactionCallback() { - @Override - public void execute() throws Exception { - EntityManager em = getEntityManager(); - em.persist(driftDef); - } - }); - - // create the change set to be persisted - DriftChangeSetDTO changeSet = new DriftChangeSetDTO(); - changeSet.setCategory(COVERAGE); - changeSet.setVersion(1); - changeSet.setDriftDefinitionId(driftDef.getId()); - changeSet.setResourceId(resource.getId()); - changeSet.setDriftHandlingMode(normal); - changeSet.setCtime(System.currentTimeMillis()); - - DriftDTO drift1 = new DriftDTO(); - drift1.setCategory(FILE_ADDED); - drift1.setPath("drift.1"); - drift1.setChangeSet(changeSet); - drift1.setCtime(System.currentTimeMillis()); - drift1.setNewDriftFile(toDTo(driftFile1)); - - DriftDTO drift2 = new DriftDTO(); - drift2.setCategory(FILE_ADDED); - drift2.setPath("drift.2"); - drift2.setChangeSet(changeSet); - drift2.setCtime(System.currentTimeMillis()); - drift2.setNewDriftFile(toDTo(driftFile2)); - - Set<DriftDTO> drifts = new HashSet<DriftDTO>(); - drifts.add(drift1); - drifts.add(drift2); - changeSet.setDrifts(drifts); - - String newChangeSetId = jpaDriftServer.persistChangeSet(getOverlord(), changeSet); - - // verify that the change set was persisted - JPADriftChangeSetCriteria criteria = new JPADriftChangeSetCriteria(); - criteria.addFilterId(newChangeSetId); - criteria.fetchDrifts(true); - - PageList<JPADriftChangeSet> changeSets = jpaDriftServer.findDriftChangeSetsByCriteria(getOverlord(), criteria); - assertEquals("Expected to find one change set", 1, changeSets.size()); - - JPADriftChangeSet jpaChangeSet = changeSets.get(0); - assertEquals("Expected change set to contain two drifts. This could be a result of the change set not being " + - "persisted correctly or the criteria fetch being done incorrectly.", 2, jpaChangeSet.getDrifts().size()); - - AssertUtils - .assertPropertiesMatch("The change set was not persisted correctly", changeSet, jpaChangeSet, "id", "drifts", - "class", "ctime"); - - List<? extends Drift> expectedDrifts = asList(drift1, drift2); - List<? extends Drift> actualDrifts = new ArrayList(jpaChangeSet.getDrifts()); - - // We ignore the id and ctime properties because those are set by JPADriftServerBean - // and are somewhat implmentation specific. We ignore the directory property because - // it is really a calculated property. newDriftFile has to be compared separately - // since it does not implement equals. - AssertUtils.assertCollectionMatchesNoOrder("The change set drifts were not persisted correctly", - (List<Drift>) expectedDrifts, (List<Drift>) actualDrifts, "id", "ctime", "changeSet", "directory", - "newDriftFile", "class"); - - assertPropertiesMatch("The newDriftFile property was not set correctly for " + drift1, drift1.getNewDriftFile(), - findDriftByPath(actualDrifts, "drift.1").getNewDriftFile(), "class", "ctime") ; - assertPropertiesMatch("The newDriftFile property was not set correctly for " + drift2, drift2.getNewDriftFile(), - findDriftByPath(actualDrifts, "drift.2").getNewDriftFile(), "class", "ctime") ; - } - - public void persistTemplateChangeSet() { - // create the change set to be persisted - // - // Note that we do not set the drift definition id or resource id since - // the change set is not owned by a resource. It is owned by the - // resource type. - DriftChangeSetDTO changeSet = new DriftChangeSetDTO(); - changeSet.setCategory(COVERAGE); - changeSet.setVersion(1); - changeSet.setDriftHandlingMode(normal); - changeSet.setCtime(System.currentTimeMillis()); - - DriftDTO drift1 = new DriftDTO(); - drift1.setCategory(FILE_ADDED); - drift1.setPath("drift.1"); - drift1.setChangeSet(changeSet); - drift1.setCtime(System.currentTimeMillis()); - drift1.setNewDriftFile(toDTo(driftFile1)); - - DriftDTO drift2 = new DriftDTO(); - drift2.setCategory(FILE_ADDED); - drift2.setPath("drift.2"); - drift2.setChangeSet(changeSet); - drift2.setCtime(System.currentTimeMillis()); - drift2.setNewDriftFile(toDTo(driftFile2)); - - Set<DriftDTO> drifts = new HashSet<DriftDTO>(); - drifts.add(drift1); - drifts.add(drift2); - changeSet.setDrifts(drifts); - - String newChangeSetId = jpaDriftServer.persistChangeSet(getOverlord(), changeSet); - - // verify that the change set was persisted - JPADriftChangeSetCriteria criteria = new JPADriftChangeSetCriteria(); - criteria.addFilterId(newChangeSetId); - criteria.fetchDrifts(true); - - PageList<JPADriftChangeSet> changeSets = jpaDriftServer.findDriftChangeSetsByCriteria(getOverlord(), criteria); - assertEquals("Expected to find one change set", 1, changeSets.size()); - - JPADriftChangeSet jpaChangeSet = changeSets.get(0); - assertEquals("Expected change set to contain two drifts. This could be a result of the change set not being " + - "persisted correctly or the criteria fetch being done incorrectly.", 2, jpaChangeSet.getDrifts().size()); - - AssertUtils - .assertPropertiesMatch("The change set was not persisted correctly", changeSet, jpaChangeSet, "id", "drifts", - "class", "ctime"); - - List<? extends Drift> expectedDrifts = asList(drift1, drift2); - List<? extends Drift> actualDrifts = new ArrayList(jpaChangeSet.getDrifts()); - - // We ignore the id and ctime properties because those are set by JPADriftServerBean - // and are somewhat implmentation specific. We ignore the directory property because - // it is really a calculated property. newDriftFile has to be compared separately - // since it does not implement equals. - AssertUtils.assertCollectionMatchesNoOrder("The change set drifts were not persisted correctly", - (List<Drift>) expectedDrifts, (List<Drift>) actualDrifts, "id", "ctime", "changeSet", "directory", - "newDriftFile", "class"); - - assertPropertiesMatch("The newDriftFile property was not set correctly for " + drift1, drift1.getNewDriftFile(), - findDriftByPath(actualDrifts, "drift.1").getNewDriftFile(), "class", "ctime") ; - assertPropertiesMatch("The newDriftFile property was not set correctly for " + drift2, drift2.getNewDriftFile(), - findDriftByPath(actualDrifts, "drift.2").getNewDriftFile(), "class", "ctime") ; - } - - public void copyChangeSet() { - // first create the change set that will be copied - final JPADriftChangeSet changeSet = new JPADriftChangeSet(null, 0, COVERAGE, null); - changeSet.setDriftHandlingMode(normal); - - final JPADrift drift1 = new JPADrift(changeSet, "drift.1", FILE_ADDED, null, driftFile1); - final JPADrift drift2 = new JPADrift(changeSet, "drift.2", FILE_ADDED, null, driftFile2); - - final JPADriftSet driftSet = new JPADriftSet(); - driftSet.addDrift(drift1); - driftSet.addDrift(drift2); - - // next create the drift definition - final DriftDefinition driftDef = new DriftDefinition(new Configuration()); - driftDef.setName("test::copyChangeSet"); - driftDef.setEnabled(true); - driftDef.setDriftHandlingMode(normal); - driftDef.setInterval(2400L); - driftDef.setBasedir(new DriftDefinition.BaseDirectory(fileSystem, "/foo/bar/test")); - driftDef.setResource(resource); - - // persist the change set and drift definition - executeInTransaction(new TransactionCallback() { - @Override - public void execute() throws Exception { - EntityManager em = getEntityManager(); - em.persist(changeSet); - em.persist(driftDef); - em.persist(driftSet); - changeSet.setInitialDriftSet(driftSet); - em.merge(changeSet); - } - }); - - jpaDriftServer.copyChangeSet(getOverlord(), changeSet.getId(), driftDef.getId(), resource.getId()); - - // verify that the change set was created for the definition - JPADriftChangeSetCriteria criteria = new JPADriftChangeSetCriteria(); - criteria.addFilterDriftDefinitionId(driftDef.getId()); - criteria.addFilterCategory(COVERAGE); - - PageList<JPADriftChangeSet> changeSets = jpaDriftServer.findDriftChangeSetsByCriteria(getOverlord(), criteria); - - assertEquals("Expected to get back one change set", 1,changeSets.size()); - - JPADriftChangeSet newChangeSet = changeSets.get(0); - Set<JPADrift> expectedDrifts = new HashSet<JPADrift>(asList(drift1, drift2)); - Set<JPADrift> actualDrifts = newChangeSet.getDrifts(); - - AssertUtils.assertCollectionMatchesNoOrder("The change set drifts were not copied correctly", expectedDrifts, - actualDrifts, - "changeSet", "newDriftFile"); - } - - private DriftFileDTO toDTo(JPADriftFile driftFile) { - DriftFileDTO dto = new DriftFileDTO(); - dto.setHashId(driftFile.getHashId()); - dto.setDataSize(driftFile.getDataSize()); - dto.setStatus(driftFile.getStatus()); - return dto; - } - - - private void assertDriftFilePersisted(JPADriftFile driftFile, String name, String content) { - assertNotNull("Failed to get " + name + " Was it persisted?", driftFile); - assertEquals("The content for " + name + " is wrong", content, jpaDriftServer.getDriftFileBits( - driftFile.getHashId())); - assertEquals("The drift file status is wrong", LOADED, driftFile.getStatus()); - } - -} diff --git a/modules/enterprise/server/integration-tests/src/test/java/org/rhq/enterprise/server/drift/ManageDriftDefinitionsTest.java b/modules/enterprise/server/integration-tests/src/test/java/org/rhq/enterprise/server/drift/ManageDriftDefinitionsTest.java deleted file mode 100644 index 66afcb0..0000000 --- a/modules/enterprise/server/integration-tests/src/test/java/org/rhq/enterprise/server/drift/ManageDriftDefinitionsTest.java +++ /dev/null @@ -1,223 +0,0 @@ -/* - * RHQ Management Platform - * Copyright (C) 2011 Red Hat, Inc. - * All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation version 2 of the License. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -package org.rhq.enterprise.server.drift; - -import static java.util.Arrays.asList; -import static org.rhq.core.domain.drift.DriftCategory.FILE_ADDED; -import static org.rhq.core.domain.drift.DriftChangeSetCategory.COVERAGE; -import static org.rhq.core.domain.drift.DriftConfigurationDefinition.BaseDirValueContext.fileSystem; -import static org.rhq.core.domain.drift.DriftConfigurationDefinition.DriftHandlingMode.normal; -import static org.rhq.core.domain.drift.DriftDefinitionComparator.CompareMode.BOTH_BASE_INFO_AND_DIRECTORY_SPECIFICATIONS; -import static org.rhq.enterprise.server.util.LookupUtil.getDriftManager; -import static org.rhq.enterprise.server.util.LookupUtil.getDriftTemplateManager; - -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.atomic.AtomicBoolean; - -import javax.persistence.EntityManager; - -import org.testng.annotations.BeforeClass; - -import org.rhq.core.domain.common.EntityContext; -import org.rhq.core.domain.configuration.Configuration; -import org.rhq.core.domain.criteria.DriftDefinitionCriteria; -import org.rhq.core.domain.criteria.JPADriftChangeSetCriteria; -import org.rhq.core.domain.drift.Drift; -import org.rhq.core.domain.drift.DriftChangeSet; -import org.rhq.core.domain.drift.DriftConfigurationDefinition; -import org.rhq.core.domain.drift.DriftDefinition; -import org.rhq.core.domain.drift.DriftDefinitionComparator; -import org.rhq.core.domain.drift.DriftDefinitionTemplate; -import org.rhq.core.domain.drift.DriftSnapshot; -import org.rhq.core.domain.drift.JPADrift; -import org.rhq.core.domain.drift.JPADriftChangeSet; -import org.rhq.core.domain.drift.JPADriftFile; -import org.rhq.core.domain.drift.JPADriftSet; -import org.rhq.core.domain.util.PageList; -import org.rhq.enterprise.server.safeinvoker.HibernateDetachUtility; -import org.rhq.test.AssertUtils; -import org.rhq.test.TransactionCallback; - -public class ManageDriftDefinitionsTest extends DriftServerTest { - - private DriftManagerLocal driftMgr; - - private DriftTemplateManagerLocal templateMgr; - - @BeforeClass - public void initClass() throws Exception { - driftMgr = getDriftManager(); - templateMgr = getDriftTemplateManager(); - } - - public void createDefinitionFromUnpinnedTemplate() { - // first create a template - final DriftDefinition templateDef = new DriftDefinition(new Configuration()); - templateDef.setName("test_createUnpinnedDefinition"); - templateDef.setEnabled(true); - templateDef.setDriftHandlingMode(normal); - templateDef.setInterval(2400L); - templateDef.setBasedir(new DriftDefinition.BaseDirectory(fileSystem, "/foo/bar/test")); - - // persist the template - DriftDefinitionTemplate template = templateMgr.createTemplate(getOverlord(), resourceType.getId(), false, - templateDef); - - // create and persist the definition - DriftDefinition definition = template.createDefinition(); - definition.setTemplate(template); - driftMgr.updateDriftDefinition(getOverlord(), EntityContext.forResource(resource.getId()), definition); - - // verify that the definition was created - DriftDefinition newDef = loadDefinition(definition.getName()); - DriftDefinitionComparator comparator = new DriftDefinitionComparator( - BOTH_BASE_INFO_AND_DIRECTORY_SPECIFICATIONS); - - assertEquals("The drift definition was not persisted correctly", 0, comparator.compare(definition, newDef)); - assertEquals("The template association was not set on the definition", template, newDef.getTemplate()); - } - - @SuppressWarnings("unchecked") - public void createDefinitionFromPinnedTemplate() throws Exception { - // We first need to create a pinned template. Users can only create a pinned - // template from a snapshot of an existing resource-level drift definition. - // We are going to take a bit of a short cut though by directly creating - // and persisting the pinned change set. - - // first create the change set - final JPADriftChangeSet changeSet0 = new JPADriftChangeSet(null, 0, COVERAGE, null); - changeSet0.setDriftHandlingMode(DriftConfigurationDefinition.DriftHandlingMode.normal); - - final JPADriftFile driftFile1 = new JPADriftFile("a1b2c3"); - final JPADriftFile driftFile2 = new JPADriftFile("1a2b3c"); - - JPADrift drift1 = new JPADrift(changeSet0, "drift.1", FILE_ADDED, null, driftFile1); - JPADrift drift2 = new JPADrift(changeSet0, "drift.2", FILE_ADDED, null, driftFile2); - - final JPADriftSet driftSet = new JPADriftSet(); - driftSet.addDrift(drift1); - driftSet.addDrift(drift2); - - // create the template - final DriftDefinition templateDef = new DriftDefinition(new Configuration()); - templateDef.setName("test_createUnpinnedDefinition"); - templateDef.setEnabled(true); - templateDef.setDriftHandlingMode(normal); - templateDef.setInterval(2400L); - templateDef.setBasedir(new DriftDefinition.BaseDirectory(fileSystem, "/foo/bar/test")); - templateDef.setPinned(true); - - final DriftDefinitionTemplate template = templateMgr.createTemplate(getOverlord(), resourceType.getId(), true, - templateDef); - - executeInTransaction(new TransactionCallback() { - @Override - public void execute() throws Exception { - EntityManager em = getEntityManager(); - - em.persist(driftFile1); - em.persist(driftFile2); - em.persist(changeSet0); - em.persist(driftSet); - changeSet0.setInitialDriftSet(driftSet); - em.merge(changeSet0); - - // setting the change set id on the template is the last and the - // most important step in making the template pinned - template.setChangeSetId(changeSet0.getId()); - em.merge(template); - } - }); - - // Create and persist a resource-level definition. - final DriftDefinition definition = template.createDefinition(); - definition.setTemplate(template); - - final AtomicBoolean agentInvoked = new AtomicBoolean(false); - - agentServiceContainer.driftService = new TestDefService() { - @Override - public void updateDriftDetection(int resourceId, DriftDefinition driftDef, DriftSnapshot snapshot) { - try { - HibernateDetachUtility.nullOutUninitializedFields(driftDef, - HibernateDetachUtility.SerializationType.SERIALIZATION); - HibernateDetachUtility.nullOutUninitializedFields(snapshot, - HibernateDetachUtility.SerializationType.SERIALIZATION); - agentInvoked.set(true); - assertNotNull("Expected snapshot drift instances collection to be non-null", - snapshot.getDriftInstances()); - assertEquals("Expected snapshot to contain two drift entries", 2, snapshot.getDriftInstances().size()); - } catch (Exception e) { - String msg = "Do not pass attached entites to agent since those entities are outside of " + - "Hibernate's control. The persistence context should be flushed and cleared to ensure that " + - "only detached objects are sent to the agent"; - throw new RuntimeException(msg, e); - } - } - }; - - driftMgr.updateDriftDefinition(getOverlord(), EntityContext.forResource(resource.getId()), definition); - - DriftDefinition newDef = loadDefinition(definition.getName()); - - // verify that the definition is marked as pinned - assertTrue("The drift definition should be marked as pinned", newDef.isPinned()); - - // verify that the initial change set is generated for the definition - JPADriftChangeSetCriteria criteria = new JPADriftChangeSetCriteria(); - criteria.addFilterDriftDefinitionId(definition.getId()); - criteria.addFilterCategory(COVERAGE); - criteria.fetchDrifts(true); - - PageList<? extends DriftChangeSet<?>> changeSets = driftMgr.findDriftChangeSetsByCriteria(getOverlord(), - criteria); - assertEquals("Expected to find one change set", 1, changeSets.size()); - - JPADriftChangeSet expectedChangeSet = new JPADriftChangeSet(resource, 1, COVERAGE, null); - List<? extends Drift> expectedDrifts = asList( - new JPADrift(expectedChangeSet, drift1.getPath(), FILE_ADDED, null, driftFile1), - new JPADrift(expectedChangeSet, drift2.getPath(), FILE_ADDED, null, driftFile2)); - - DriftChangeSet<?> actualChangeSet = changeSets.get(0); - List<? extends Drift> actualDrifts = new ArrayList(actualChangeSet.getDrifts()); - - AssertUtils.assertCollectionMatchesNoOrder( - "Expected to find drifts from change sets 1 and 2 in the template change set", - (List<Drift>) expectedDrifts, (List<Drift>) actualDrifts, "id", "ctime", "changeSet", "newDriftFile"); - - // lastly verify that the agent is called - assertTrue("Failed to send drift definition along with snapshot to agent", agentInvoked.get()); - } - - private DriftDefinition loadDefinition(String name) { - DriftDefinitionCriteria criteria = new DriftDefinitionCriteria(); - criteria.addFilterResourceIds(resource.getId()); - criteria.addFilterName(name); - criteria.fetchConfiguration(true); - criteria.fetchResource(true); - criteria.fetchTemplate(true); - - PageList<DriftDefinition> driftDefs = driftMgr.findDriftDefinitionsByCriteria(getOverlord(), criteria); - assertEquals("Expected to find one drift definition", 1, driftDefs.size()); - - return driftDefs.get(0); - } -} diff --git a/modules/enterprise/server/integration-tests/src/test/java/org/rhq/enterprise/server/drift/ManageSnapshotsTest.java b/modules/enterprise/server/integration-tests/src/test/java/org/rhq/enterprise/server/drift/ManageSnapshotsTest.java deleted file mode 100644 index e7341e4..0000000 --- a/modules/enterprise/server/integration-tests/src/test/java/org/rhq/enterprise/server/drift/ManageSnapshotsTest.java +++ /dev/null @@ -1,236 +0,0 @@ -/* - * RHQ Management Platform - * Copyright (C) 2011 Red Hat, Inc. - * All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation version 2 of the License. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -package org.rhq.enterprise.server.drift; - -import static java.util.Arrays.asList; -import static org.rhq.core.domain.drift.DriftCategory.FILE_ADDED; -import static org.rhq.core.domain.drift.DriftChangeSetCategory.COVERAGE; -import static org.rhq.core.domain.drift.DriftChangeSetCategory.DRIFT; -import static org.rhq.core.domain.drift.DriftConfigurationDefinition.BaseDirValueContext.fileSystem; -import static org.rhq.core.domain.drift.DriftConfigurationDefinition.DriftHandlingMode.normal; -import static org.rhq.enterprise.server.util.LookupUtil.getDriftManager; -import static org.rhq.enterprise.server.util.LookupUtil.getDriftTemplateManager; -import static org.rhq.test.AssertUtils.assertPropertiesMatch; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.ObjectOutputStream; -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.atomic.AtomicBoolean; - -import javax.persistence.EntityManager; - -import org.testng.annotations.BeforeClass; - -import org.rhq.core.domain.configuration.Configuration; -import org.rhq.core.domain.criteria.GenericDriftChangeSetCriteria; -import org.rhq.core.domain.drift.Drift; -import org.rhq.core.domain.drift.DriftChangeSet; -import org.rhq.core.domain.drift.DriftDefinition; -import org.rhq.core.domain.drift.DriftSnapshot; -import org.rhq.core.domain.drift.JPADrift; -import org.rhq.core.domain.drift.JPADriftChangeSet; -import org.rhq.core.domain.drift.JPADriftFile; -import org.rhq.core.domain.drift.JPADriftSet; -import org.rhq.core.domain.util.PageList; -import org.rhq.core.server.EntitySerializer; -import org.rhq.test.AssertUtils; -import org.rhq.test.TransactionCallback; - -public class ManageSnapshotsTest extends DriftServerTest { - - private DriftManagerLocal driftMgr; - - private DriftTemplateManagerLocal templateMgr; - - @BeforeClass(inheritGroups = true) - public void initClass() throws Exception { - driftMgr = getDriftManager(); - templateMgr = getDriftTemplateManager(); - } - - public void pinningSnapshotShouldSetDriftDefAsPinned() { - final DriftDefinition driftDef = createAndPersistDriftDef("test::setPinnedFlag"); - - // create initial change set - final JPADriftChangeSet changeSet = new JPADriftChangeSet(resource, 0, COVERAGE, driftDef); - - final JPADriftFile driftFile1 = new JPADriftFile("a1b2c3"); - JPADrift drift = new JPADrift(changeSet, "drift.1", FILE_ADDED, null, driftFile1); - - final JPADriftSet driftSet = new JPADriftSet(); - driftSet.addDrift(drift); - - executeInTransaction(new TransactionCallback() { - @Override - public void execute() throws Exception { - EntityManager em = getEntityManager(); - em.persist(driftFile1); - em.persist(changeSet); - em.persist(driftSet); - changeSet.setInitialDriftSet(driftSet); - em.merge(changeSet); - } - }); - - driftMgr.pinSnapshot(getOverlord(), driftDef.getId(), 0); - DriftDefinition updatedDriftDef = driftMgr.getDriftDefinition(getOverlord(), driftDef.getId()); - - assertNotNull("Failed to get " + toString(driftDef), updatedDriftDef); - assertTrue("Failed to set pinned flag of " + toString(driftDef), updatedDriftDef.isPinned()); - } - - @SuppressWarnings("unchecked") - public void pinningSnapshotShouldMakeSnapshotTheInitialChangeSet() throws Exception { - final DriftDefinition driftDef = createAndPersistDriftDef("test::makeSnapshotVersionZero"); - - // create initial change set - final JPADriftChangeSet changeSet0 = new JPADriftChangeSet(resource, 0, COVERAGE, driftDef); - - final JPADriftFile driftFile1 = new JPADriftFile("a1b2c3"); - JPADrift drift1 = new JPADrift(changeSet0, "drift.1", FILE_ADDED, null, driftFile1); - - final JPADriftSet driftSet = new JPADriftSet(); - driftSet.addDrift(drift1); - - // create change set v1 - final JPADriftFile driftFile2 = new JPADriftFile("1a2b3c"); - final JPADriftChangeSet changeSet1 = new JPADriftChangeSet(resource, 1, DRIFT, driftDef); - final JPADrift drift2 = new JPADrift(changeSet1, "drift.2", FILE_ADDED, null, driftFile2); - - executeInTransaction(new TransactionCallback() { - @Override - public void execute() throws Exception { - EntityManager em = getEntityManager(); - em.persist(driftFile1); - em.persist(driftFile2); - em.persist(changeSet0); - em.persist(driftSet); - changeSet0.setInitialDriftSet(driftSet); - em.merge(changeSet0); - em.persist(changeSet1); - em.persist(drift2); - } - }); - - driftMgr.pinSnapshot(getOverlord(), driftDef.getId(), 1); - - // Verify that there is now only one change set for the drift def - GenericDriftChangeSetCriteria criteria = new GenericDriftChangeSetCriteria(); - criteria.addFilterDriftDefinitionId(driftDef.getId()); - - PageList<? extends DriftChangeSet<?>> changeSets = driftMgr.findDriftChangeSetsByCriteria(getOverlord(), - criteria); - assertEquals("All change sets except the change set representing the pinned snapshot should be removed", - 1, changeSets.size()); - DriftChangeSet<?> changeSet = changeSets.get(0); - - assertEquals("The pinned snapshot version should be reset to zero", 0, changeSet.getVersion()); - assertEquals("The change set category is wrong", COVERAGE, changeSet.getCategory()); - - JPADriftChangeSet expectedChangeSet = new JPADriftChangeSet(resource, 1, COVERAGE, driftDef); - List<? extends Drift> expectedDrifts = asList( - new JPADrift(expectedChangeSet, drift1.getPath(), FILE_ADDED, null, driftFile1), - new JPADrift(expectedChangeSet, drift2.getPath(), FILE_ADDED, null, driftFile2)); - - List<? extends Drift> actualDrifts = new ArrayList(changeSet.getDrifts()); - - AssertUtils.assertCollectionMatchesNoOrder( - "Expected to find drifts from change sets 1 and 2 in the new initial change set", - (List<Drift>) expectedDrifts, (List<Drift>) actualDrifts, "id", "ctime", "changeSet", "newDriftFile"); - - // we need to compare the newDriftFile properties separately because - // assertCollectionMatchesNoOrder compares properties via equals() and JPADriftFile - // does not implement equals. - assertPropertiesMatch(drift1.getNewDriftFile(), findDriftByPath(actualDrifts, "drift.1").getNewDriftFile(), - "The newDriftFile property was not set correctly for " + drift1); - assertPropertiesMatch(drift2.getNewDriftFile(), findDriftByPath(actualDrifts, "drift.2").getNewDriftFile(), - "The newDriftFile property was not set correctly for " + drift1); - } - - public void pinningSnapshotShouldSendRequestToAgent() { - final DriftDefinition driftDef = createAndPersistDriftDef("test::setPinnedFlag"); - - // create initial change set - final JPADriftChangeSet changeSet = new JPADriftChangeSet(resource, 0, COVERAGE, driftDef); - - final JPADriftFile driftFile1 = new JPADriftFile("a1b2c3"); - JPADrift drift = new JPADrift(changeSet, "drift.1", FILE_ADDED, null, driftFile1); - - final JPADriftSet driftSet = new JPADriftSet(); - driftSet.addDrift(drift); - - executeInTransaction(new TransactionCallback() { - @Override - public void execute() throws Exception { - EntityManager em = getEntityManager(); - em.persist(driftFile1); - em.persist(changeSet); - em.persist(driftSet); - changeSet.setInitialDriftSet(driftSet); - em.merge(changeSet); - } - }); - - final AtomicBoolean agentInvoked = new AtomicBoolean(false); - agentServiceContainer.driftService = new TestDefService() { - @Override - public void pinSnapshot(int resourceId, String configName, DriftSnapshot snapshot) { - try { - agentInvoked.set(true); - // serialize the method arguments here to more closely simulate what - // happens during the call. We cannot send hibernate-proxied objects - // to the agent. This is an attempt to catch that. - ObjectOutputStream stream = new ObjectOutputStream(new ByteArrayOutputStream()); - EntitySerializer.writeExternalRemote(resourceId, stream); - EntitySerializer.writeExternalRemote(configName, stream); - EntitySerializer.writeExternalRemote(snapshot, stream); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - }; - - driftMgr.pinSnapshot(getOverlord(), driftDef.getId(), 0); - - assertTrue("Failed to send request to agent to pin snapshot", agentInvoked.get()); - } - - private DriftDefinition createAndPersistDriftDef(String name) { - final DriftDefinition driftDef = new DriftDefinition(new Configuration()); - driftDef.setName(name); - driftDef.setEnabled(true); - driftDef.setDriftHandlingMode(normal); - driftDef.setInterval(1800L); - driftDef.setBasedir(new DriftDefinition.BaseDirectory(fileSystem, "/foo/bar/test")); - - executeInTransaction(new TransactionCallback() { - @Override - public void execute() throws Exception { - driftDef.setResource(resource); - getEntityManager().persist(driftDef); - } - }); - - return driftDef; - } - -} diff --git a/modules/enterprise/server/integration-tests/src/test/resources/META-INF/ejb-jar.xml b/modules/enterprise/server/integration-tests/src/test/resources/META-INF/ejb-jar.xml deleted file mode 100644 index 8222948..0000000 --- a/modules/enterprise/server/integration-tests/src/test/resources/META-INF/ejb-jar.xml +++ /dev/null @@ -1,28 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<ejb-jar xmlns="http://java.sun.com/xml/ns/javaee" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd" - version="3.0"> - - <description>RHQ</description> - <display-name>RHQ</display-name> - - <assembly-descriptor> - - <!-- all our EJB3 SLSBs can define custom @RequiredPermissions annotations for authorization checks--> - <interceptor-binding> - <ejb-name>*</ejb-name> - <interceptor-class>org.rhq.enterprise.server.authz.RequiredPermissionsInterceptor</interceptor-class> - </interceptor-binding> - <interceptor-binding> - <ejb-name>*</ejb-name> - <interceptor-class>org.rhq.enterprise.server.common.TransactionInterruptInterceptor</interceptor-class> - </interceptor-binding> - <interceptor-binding> - <ejb-name>*</ejb-name> - <interceptor-class>org.rhq.enterprise.server.common.PerformanceMonitorInterceptor</interceptor-class> - </interceptor-binding> - - </assembly-descriptor> - -</ejb-jar> diff --git a/modules/enterprise/server/integration-tests/src/test/resources/binary-blob-sample.jar b/modules/enterprise/server/integration-tests/src/test/resources/binary-blob-sample.jar deleted file mode 100644 index 0a629ec..0000000 Binary files a/modules/enterprise/server/integration-tests/src/test/resources/binary-blob-sample.jar and /dev/null differ diff --git a/modules/enterprise/server/integration-tests/src/test/resources/default.persistence.properties b/modules/enterprise/server/integration-tests/src/test/resources/default.persistence.properties deleted file mode 100644 index 8e4f317..0000000 --- a/modules/enterprise/server/integration-tests/src/test/resources/default.persistence.properties +++ /dev/null @@ -1,22 +0,0 @@ -hibernate.transaction.manager_lookup_class=org.hibernate.transaction.JBossTransactionManagerLookup -#hibernate.connection.release_mode=after_statement -#hibernate.transaction.flush_before_completion=false -#hibernate.transaction.auto_close_session=false -#hibernate.query.factory_class=org.hibernate.hql.ast.ASTQueryTranslatorFactory -#hibernate.hbm2ddl.auto=create-drop -#hibernate.hbm2ddl.auto=create -hibernate.cache.provider_class=org.hibernate.cache.HashtableCacheProvider -# Clustered cache with TreeCache -#hibernate.cache.provider_class=org.jboss.ejb3.entity.TreeCacheProviderHook -#hibernate.treecache.mbean.object_name=jboss.cache:service=EJB3EntityTreeCache -#hibernate.dialect=org.hibernate.dialect.HSQLDialect -hibernate.jndi.java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory -hibernate.jndi.java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces -hibernate.bytecode.use_reflection_optimizer=false -# I don't think this is honored, but EJB3Deployer uses it -hibernate.bytecode.provider=javassist -hibernate.jdbc.use_streams_for_binary=true -hibernate.show_sql=false -hibernate.format_sql=true -hibernate.default_batch_fetch_size=16 -hibernate.jdbc.batch_size=20 diff --git a/modules/enterprise/server/integration-tests/src/test/resources/ejb3-interceptors-aop.xml b/modules/enterprise/server/integration-tests/src/test/resources/ejb3-interceptors-aop.xml deleted file mode 100644 index f30aa70..0000000 --- a/modules/enterprise/server/integration-tests/src/test/resources/ejb3-interceptors-aop.xml +++ /dev/null @@ -1,360 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE aop PUBLIC - "-//JBoss//DTD JBOSS AOP 1.0//EN" - "http://www.jboss.org/aop/dtd/jboss-aop_1_0.dtd"> - -<aop> - <interceptor class="org.jboss.aspects.remoting.InvokeRemoteInterceptor" scope="PER_VM"/> - <interceptor class="org.jboss.aspects.security.SecurityClientInterceptor" scope="PER_VM"/> - <interceptor class="org.jboss.aspects.tx.ClientTxPropagationInterceptor" scope="PER_VM"/> - <interceptor class="org.jboss.ejb3.remoting.IsLocalInterceptor" scope="PER_VM"/> - <interceptor class="org.jboss.aspects.remoting.ClusterChooserInterceptor" scope="PER_VM"/> - - <interceptor class="org.jboss.aspects.tx.TxPropagationInterceptor" scope="PER_VM"/> - - <stack name="ServiceClientInterceptors"> - <interceptor-ref name="org.jboss.ejb3.remoting.IsLocalInterceptor"/> - <interceptor-ref name="org.jboss.aspects.security.SecurityClientInterceptor"/> - <interceptor-ref name="org.jboss.aspects.tx.ClientTxPropagationInterceptor"/> - <interceptor-ref name="org.jboss.aspects.remoting.InvokeRemoteInterceptor"/> - </stack> - - <stack name="AsynchronousStatelessSessionClientInterceptors"> - <interceptor-ref name="org.jboss.ejb3.remoting.IsLocalInterceptor"/> - <interceptor-ref name="org.jboss.aspects.security.SecurityClientInterceptor"/> - <interceptor-ref name="org.jboss.aspects.tx.ClientTxPropagationInterceptor"/> - <interceptor-ref name="org.jboss.aspects.remoting.InvokeRemoteInterceptor"/> - </stack> - - <stack name="AsynchronousStatefulSessionClientInterceptors"> - <interceptor-ref name="org.jboss.ejb3.remoting.IsLocalInterceptor"/> - <interceptor-ref name="org.jboss.aspects.security.SecurityClientInterceptor"/> - <interceptor-ref name="org.jboss.aspects.tx.ClientTxPropagationInterceptor"/> - <interceptor-ref name="org.jboss.aspects.remoting.InvokeRemoteInterceptor"/> - </stack> - - <stack name="StatelessSessionClientInterceptors"> - <interceptor-ref name="org.jboss.ejb3.remoting.IsLocalInterceptor"/> - <interceptor-ref name="org.jboss.aspects.security.SecurityClientInterceptor"/> - <interceptor-ref name="org.jboss.aspects.tx.ClientTxPropagationInterceptor"/> - <interceptor-ref name="org.jboss.aspects.remoting.InvokeRemoteInterceptor"/> - </stack> - - <stack name="StatefulSessionClientInterceptors"> - <interceptor-ref name="org.jboss.ejb3.remoting.IsLocalInterceptor"/> - <interceptor-ref name="org.jboss.aspects.security.SecurityClientInterceptor"/> - <interceptor-ref name="org.jboss.aspects.tx.ClientTxPropagationInterceptor"/> - <interceptor-ref name="org.jboss.aspects.remoting.InvokeRemoteInterceptor"/> - </stack> - - <stack name="ClusteredStatelessSessionClientInterceptors"> - <interceptor-ref name="org.jboss.ejb3.remoting.IsLocalInterceptor"/> - <interceptor-ref name="org.jboss.aspects.security.SecurityClientInterceptor"/> - <interceptor-ref name="org.jboss.aspects.tx.ClientTxPropagationInterceptor"/> - <interceptor-ref name="org.jboss.aspects.remoting.ClusterChooserInterceptor"/> - <interceptor-ref name="org.jboss.aspects.remoting.InvokeRemoteInterceptor"/> - </stack> - - <stack name="ClusteredStatefulSessionClientInterceptors"> - <interceptor-ref name="org.jboss.ejb3.remoting.IsLocalInterceptor"/> - <interceptor-ref name="org.jboss.aspects.security.SecurityClientInterceptor"/> - <interceptor-ref name="org.jboss.aspects.tx.ClientTxPropagationInterceptor"/> - <interceptor-ref name="org.jboss.aspects.remoting.ClusterChooserInterceptor"/> - <interceptor-ref name="org.jboss.aspects.remoting.InvokeRemoteInterceptor"/> - </stack> - - <interceptor class="org.jboss.ejb3.asynchronous.AsynchronousInterceptor" scope="PER_CLASS"/> - <interceptor class="org.jboss.ejb3.ENCPropagationInterceptor" scope="PER_VM"/> - <interceptor name="Basic Authorization" factory="org.jboss.ejb3.security.RoleBasedAuthorizationInterceptorFactory" scope="PER_CLASS"/> - <interceptor name="JACC Authorization" factory="org.jboss.ejb3.security.JaccAuthorizationInterceptorFactory" scope="PER_CLASS"/> - <interceptor factory="org.jboss.ejb3.security.AuthenticationInterceptorFactory" scope="PER_CLASS"/> - <interceptor factory="org.jboss.ejb3.security.RunAsSecurityInterceptorFactory" scope="PER_CLASS"/> - <interceptor class="org.jboss.ejb3.entity.ExtendedPersistenceContextPropagationInterceptor" scope="PER_VM"/> - <interceptor class="org.jboss.ejb3.stateless.StatelessInstanceInterceptor" scope="PER_VM"/> - <interceptor class="org.jboss.ejb3.stateful.StatefulInstanceInterceptor" scope="PER_VM"/> - <interceptor class="org.jboss.ejb3.stateful.SessionSynchronizationInterceptor" scope="PER_VM"/> - <interceptor class="org.jboss.ejb3.service.ServiceSingletonInterceptor" scope="PER_VM"/> - <interceptor class="org.jboss.ejb3.cache.StatefulReplicationInterceptor" scope="PER_VM"/> - <interceptor factory="org.jboss.ejb3.stateful.StatefulRemoveFactory" scope="PER_CLASS_JOINPOINT"/> - <interceptor factory="org.jboss.ejb3.tx.TxInterceptorFactory" scope="PER_CLASS_JOINPOINT"/> - <interceptor factory="org.jboss.ejb3.interceptor.EJB3InterceptorsFactory" scope="PER_CLASS_JOINPOINT"/> - <interceptor factory="org.jboss.ejb3.remoting.ReplicantsManagerInterceptorFactory" scope="PER_CLASS"/> - <interceptor class="org.jboss.ejb3.AllowedOperationsInterceptor" scope="PER_VM"/> - <interceptor factory="org.jboss.ejb3.mdb.CurrentMessageInjectorInterceptorFactory" scope="PER_CLASS"/> - <interceptor class="org.jboss.ejb3.entity.TransactionScopedEntityManagerInterceptor" scope="PER_VM"/> - - <domain name="Stateless Bean"> - <bind pointcut="execution(public * *->*(..))"> - <interceptor-ref name="org.jboss.ejb3.asynchronous.AsynchronousInterceptor"/> - <interceptor-ref name="org.jboss.ejb3.ENCPropagationInterceptor"/> - <interceptor-ref name="org.jboss.ejb3.security.AuthenticationInterceptorFactory"/> - </bind> - <bind pointcut="execution(public * @org.jboss.annotation.security.SecurityDomain->*(..))"> - <interceptor-ref name="Basic Authorization"/> - </bind> - <bind pointcut="execution(public * @javax.annotation.security.RunAs->*(..))"> - <interceptor-ref name="org.jboss.ejb3.security.RunAsSecurityInterceptorFactory"/> - </bind> - <bind pointcut="execution(public * @org.jboss.annotation.ejb.Clustered->*(..))"> - <interceptor-ref name="org.jboss.ejb3.remoting.ReplicantsManagerInterceptorFactory"/> - </bind> - <bind pointcut="execution(public * *->*(..))"> - <interceptor-ref name="org.jboss.ejb3.stateless.StatelessInstanceInterceptor"/> - <interceptor-ref name="org.jboss.aspects.tx.TxPropagationInterceptor"/> - <interceptor-ref name="org.jboss.ejb3.tx.TxInterceptorFactory"/> - <interceptor-ref name="org.jboss.ejb3.AllowedOperationsInterceptor"/> - <interceptor-ref name="org.jboss.ejb3.entity.TransactionScopedEntityManagerInterceptor"/> - <interceptor-ref name="org.jboss.ejb3.interceptor.EJB3InterceptorsFactory"/> - </bind> - <annotation expr="!class(@org.jboss.annotation.ejb.PoolClass)"> - @org.jboss.annotation.ejb.PoolClass (value=org.jboss.ejb3.ThreadlocalPool.class, maxSize=30, timeout=10000) - </annotation> - </domain> - - <domain name="JACC Stateless Bean"> - <bind pointcut="execution(public * *->*(..))"> - <interceptor-ref name="org.jboss.ejb3.asynchronous.AsynchronousInterceptor"/> - <interceptor-ref name="org.jboss.ejb3.ENCPropagationInterceptor"/> - <interceptor-ref name="org.jboss.ejb3.security.AuthenticationInterceptorFactory"/> - </bind> - <bind pointcut="execution(public * @org.jboss.annotation.security.SecurityDomain->*(..))"> - <interceptor-ref name="JACC Authorization"/> - </bind> - <bind pointcut="execution(public * @javax.annotation.security.RunAs->*(..))"> - <interceptor-ref name="org.jboss.ejb3.security.RunAsSecurityInterceptorFactory"/> - </bind> - <bind pointcut="execution(public * @org.jboss.annotation.ejb.Clustered->*(..))"> - <interceptor-ref name="org.jboss.ejb3.remoting.ReplicantsManagerInterceptorFactory"/> - </bind> - <bind pointcut="execution(public * *->*(..))"> - <interceptor-ref name="org.jboss.ejb3.stateless.StatelessInstanceInterceptor"/> - <interceptor-ref name="org.jboss.aspects.tx.TxPropagationInterceptor"/> - <interceptor-ref name="org.jboss.ejb3.tx.TxInterceptorFactory"/> - <interceptor-ref name="org.jboss.ejb3.AllowedOperationsInterceptor"/> - <interceptor-ref name="org.jboss.ejb3.entity.TransactionScopedEntityManagerInterceptor"/> - <interceptor-ref name="org.jboss.ejb3.interceptor.EJB3InterceptorsFactory"/> - </bind> - <annotation expr="!class(@org.jboss.annotation.ejb.PoolClass)"> - @org.jboss.annotation.ejb.PoolClass (value=org.jboss.ejb3.ThreadlocalPool.class, maxSize=30, timeout=10000) - </annotation> - </domain> - - <domain name="Base Stateful Bean"> - <bind pointcut="execution(public * *->*(..))"> - <interceptor-ref name="org.jboss.ejb3.asynchronous.AsynchronousInterceptor"/> - <interceptor-ref name="org.jboss.ejb3.ENCPropagationInterceptor"/> - <interceptor-ref name="org.jboss.ejb3.security.AuthenticationInterceptorFactory"/> - </bind> - <bind pointcut="execution(public * @org.jboss.annotation.security.SecurityDomain->*(..))"> - <interceptor-ref name="Basic Authorization"/> - </bind> - <bind pointcut="execution(public * @javax.annotation.security.RunAs->*(..))"> - <interceptor-ref name="org.jboss.ejb3.security.RunAsSecurityInterceptorFactory"/> - </bind> - <bind pointcut="execution(public * @org.jboss.annotation.ejb.Clustered->*(..))"> - <interceptor-ref name="org.jboss.ejb3.remoting.ReplicantsManagerInterceptorFactory"/> - </bind> - <bind pointcut="execution(public * *->@javax.ejb.Remove(..))"> - <interceptor-ref name="org.jboss.ejb3.stateful.StatefulRemoveFactory"/> - </bind> - <bind pointcut="execution(public * *->*(..))"> - <interceptor-ref name="org.jboss.ejb3.stateful.StatefulInstanceInterceptor"/> - <interceptor-ref name="org.jboss.aspects.tx.TxPropagationInterceptor"/> - <interceptor-ref name="org.jboss.ejb3.tx.TxInterceptorFactory"/> - <interceptor-ref name="org.jboss.ejb3.AllowedOperationsInterceptor"/> - </bind> - <bind pointcut="execution(public * $instanceof{javax.ejb.SessionSynchronization}->*(..))"> - <interceptor-ref name="org.jboss.ejb3.stateful.SessionSynchronizationInterceptor"/> - </bind> - <bind pointcut="execution(public * *->*(..))"> - <interceptor-ref name="org.jboss.ejb3.entity.TransactionScopedEntityManagerInterceptor"/> - <interceptor-ref name="org.jboss.ejb3.entity.ExtendedPersistenceContextPropagationInterceptor"/> - <interceptor-ref name="org.jboss.ejb3.interceptor.EJB3InterceptorsFactory"/> - </bind> - - <bind pointcut="execution(public * @org.jboss.annotation.ejb.Clustered->*(..)) AND !execution(public * *->@javax.ejb.Remove(..))"> - <interceptor-ref name="org.jboss.ejb3.cache.StatefulReplicationInterceptor"/> - </bind> - <annotation expr="!class(@org.jboss.annotation.ejb.PoolClass)"> - @org.jboss.annotation.ejb.PoolClass (value=org.jboss.ejb3.ThreadlocalPool.class, maxSize=30, timeout=10000) - </annotation> - </domain> - - <domain name="Stateful Bean" extends="Base Stateful Bean" inheritBindings="true"> - <!-- NON Clustered cache configuration --> - <annotation expr="!class(@org.jboss.annotation.ejb.cache.Cache) AND !class(@org.jboss.annotation.ejb.Clustered)"> - @org.jboss.annotation.ejb.cache.Cache (org.jboss.ejb3.cache.simple.SimpleStatefulCache.class) - </annotation> - <annotation expr="!class(@org.jboss.annotation.ejb.cache.simple.PersistenceManager) AND !class(@org.jboss.annotation.ejb.Clustered)"> - @org.jboss.annotation.ejb.cache.simple.PersistenceManager (org.jboss.ejb3.cache.simple.StatefulSessionFilePersistenceManager.class) - </annotation> - <annotation expr="!class(@org.jboss.annotation.ejb.cache.simple.CacheConfig) AND !class(@org.jboss.annotation.ejb.Clustered)"> - @org.jboss.annotation.ejb.cache.simple.CacheConfig (maxSize=100000, idleTimeoutSeconds=300) - </annotation> - - <!-- Clustered cache configuration --> - <annotation expr="!class(@org.jboss.annotation.ejb.cache.Cache) AND class(@org.jboss.annotation.ejb.Clustered)"> - @org.jboss.annotation.ejb.cache.Cache (org.jboss.ejb3.cache.tree.StatefulTreeCache.class) - </annotation> - <annotation expr="!class(@org.jboss.annotation.ejb.cache.tree.CacheConfig) AND class(@org.jboss.annotation.ejb.Clustered)"> - @org.jboss.annotation.ejb.cache.tree.CacheConfig (name="jboss.cache:service=EJB3SFSBClusteredCache", maxSize=100000, idleTimeoutSeconds=300) - </annotation> - </domain> - - <domain name="JACC Stateful Bean"> - <bind pointcut="execution(public * *->*(..))"> - <interceptor-ref name="org.jboss.ejb3.asynchronous.AsynchronousInterceptor"/> - <interceptor-ref name="org.jboss.ejb3.ENCPropagationInterceptor"/> - <interceptor-ref name="org.jboss.ejb3.security.AuthenticationInterceptorFactory"/> - </bind> - <bind pointcut="execution(public * @org.jboss.annotation.security.SecurityDomain->*(..))"> - <interceptor-ref name="JACC Authorization"/> - </bind> - <bind pointcut="execution(public * @javax.annotation.security.RunAs->*(..))"> - <interceptor-ref name="org.jboss.ejb3.security.RunAsSecurityInterceptorFactory"/> - </bind> - <bind pointcut="execution(public * @org.jboss.annotation.ejb.Clustered->*(..))"> - <interceptor-ref name="org.jboss.ejb3.remoting.ReplicantsManagerInterceptorFactory"/> - </bind> - <bind pointcut="execution(public * *->@javax.ejb.Remove(..))"> - <interceptor-ref name="org.jboss.ejb3.stateful.StatefulRemoveFactory"/> - </bind> - <bind pointcut="execution(public * *->*(..))"> - <interceptor-ref name="org.jboss.ejb3.stateful.StatefulInstanceInterceptor"/> - <interceptor-ref name="org.jboss.aspects.tx.TxPropagationInterceptor"/> - <interceptor-ref name="org.jboss.ejb3.tx.TxInterceptorFactory"/> - <interceptor-ref name="org.jboss.ejb3.AllowedOperationsInterceptor"/> - </bind> - <bind pointcut="execution(public * $instanceof{javax.ejb.SessionSynchronization}->*(..))"> - <interceptor-ref name="org.jboss.ejb3.stateful.SessionSynchronizationInterceptor"/> - </bind> - <bind pointcut="execution(public * *->*(..))"> - <interceptor-ref name="org.jboss.ejb3.entity.TransactionScopedEntityManagerInterceptor"/> - <interceptor-ref name="org.jboss.ejb3.entity.ExtendedPersistenceContextPropagationInterceptor"/> - <interceptor-ref name="org.jboss.ejb3.interceptor.EJB3InterceptorsFactory"/> - </bind> - - <bind pointcut="execution(public * @org.jboss.annotation.ejb.Clustered->*(..)) AND !execution(public * *->@javax.ejb.Remove(..))"> - <interceptor-ref name="org.jboss.ejb3.cache.StatefulReplicationInterceptor"/> - </bind> - <annotation expr="!class(@org.jboss.annotation.ejb.PoolClass)"> - @org.jboss.annotation.ejb.PoolClass (value=org.jboss.ejb3.ThreadlocalPool.class, maxSize=30, timeout=10000) - </annotation> - - <!-- NON Clustered cache configuration --> - <annotation expr="!class(@org.jboss.annotation.ejb.cache.Cache) AND !class(@org.jboss.annotation.ejb.Clustered)"> - @org.jboss.annotation.ejb.cache.Cache (org.jboss.ejb3.cache.simple.SimpleStatefulCache.class) - </annotation> - <annotation expr="!class(@org.jboss.annotation.ejb.cache.simple.PersistenceManager) AND !class(@org.jboss.annotation.ejb.Clustered)"> - @org.jboss.annotation.ejb.cache.simple.PersistenceManager (org.jboss.ejb3.cache.simple.StatefulSessionFilePersistenceManager.class) - </annotation> - <annotation expr="!class(@org.jboss.annotation.ejb.cache.simple.CacheConfig) AND !class(@org.jboss.annotation.ejb.Clustered)"> - @org.jboss.annotation.ejb.cache.simple.CacheConfig (maxSize=100000, idleTimeoutSeconds=300) - </annotation> - - <!-- Clustered cache configuration --> - <annotation expr="!class(@org.jboss.annotation.ejb.cache.Cache) AND class(@org.jboss.annotation.ejb.Clustered)"> - @org.jboss.annotation.ejb.cache.Cache (org.jboss.ejb3.cache.tree.StatefulTreeCache.class) - </annotation> - <annotation expr="!class(@org.jboss.annotation.ejb.cache.tree.CacheConfig) AND class(@org.jboss.annotation.ejb.Clustered)"> - @org.jboss.annotation.ejb.cache.tree.CacheConfig (name="jboss.cache:service=EJB3SFSBClusteredCache", maxSize=100000, idleTimeoutSeconds=300) - </annotation> - </domain> - - <domain name="Embedded Stateful Bean" extends="Base Stateful Bean" inheritBindings="true"> - <!-- NON Clustered cache configuration --> - <annotation expr="!class(@org.jboss.annotation.ejb.cache.Cache)"> - @org.jboss.annotation.ejb.cache.Cache (org.jboss.ejb3.cache.NoPassivationCache.class) - </annotation> - - </domain> - - <domain name="Message Driven Bean"> - <bind pointcut="execution(public * @javax.annotation.security.RunAs->*(..))"> - <interceptor-ref name="org.jboss.ejb3.security.RunAsSecurityInterceptorFactory"/> - </bind> - <bind pointcut="execution(public * *->*(..))"> - <interceptor-ref name="org.jboss.ejb3.stateless.StatelessInstanceInterceptor"/> - <interceptor-ref name="org.jboss.ejb3.tx.TxInterceptorFactory"/> - <interceptor-ref name="org.jboss.ejb3.AllowedOperationsInterceptor"/> - <interceptor-ref name="org.jboss.ejb3.entity.TransactionScopedEntityManagerInterceptor"/> - <interceptor-ref name="org.jboss.ejb3.interceptor.EJB3InterceptorsFactory"/> - </bind> - <annotation expr="!class(@org.jboss.annotation.ejb.PoolClass)"> - @org.jboss.annotation.ejb.PoolClass (value=org.jboss.ejb3.StrictMaxPool.class, maxSize=30, timeout=10000) - </annotation> - </domain> - - <domain name="Consumer Bean"> - <bind pointcut="execution(public * @javax.annotation.security.RunAs->*(..))"> - <interceptor-ref name="org.jboss.ejb3.security.RunAsSecurityInterceptorFactory"/> - </bind> - <bind pointcut="execution(public * *->*(..))"> - <interceptor-ref name="org.jboss.ejb3.stateless.StatelessInstanceInterceptor"/> - <interceptor-ref name="org.jboss.ejb3.tx.TxInterceptorFactory"/> - <interceptor-ref name="org.jboss.ejb3.AllowedOperationsInterceptor"/> - <interceptor-ref name="org.jboss.ejb3.entity.TransactionScopedEntityManagerInterceptor"/> - </bind> - <bind pointcut="execution(public * *->*(..)) AND (has(* *->@org.jboss.annotation.ejb.CurrentMessage(..)) OR hasfield(* *->@org.jboss.annotation.ejb.CurrentMessage))"> - <interceptor-ref name="org.jboss.ejb3.mdb.CurrentMessageInjectorInterceptorFactory"/> - </bind> - <bind pointcut="execution(public * *->*(..))"> - <interceptor-ref name="org.jboss.ejb3.interceptor.EJB3InterceptorsFactory"/> - </bind> - <annotation expr="!class(@org.jboss.annotation.ejb.PoolClass)"> - @org.jboss.annotation.ejb.PoolClass (value=org.jboss.ejb3.StrictMaxPool.class, maxSize=30, timeout=10000) - </annotation> - </domain> - - <domain name="Service Bean"> - <bind pointcut="execution(public * *->*(..))"> - <interceptor-ref name="org.jboss.ejb3.asynchronous.AsynchronousInterceptor"/> - <interceptor-ref name="org.jboss.ejb3.ENCPropagationInterceptor"/> - </bind> - <bind pointcut="!execution(* *->create()) AND !execution(* *->start()) AND !execution(*->new(..))"> - <interceptor-ref name="org.jboss.ejb3.security.AuthenticationInterceptorFactory"/> - </bind> - <bind pointcut="execution(public * @org.jboss.annotation.security.SecurityDomain->*(..))"> - <interceptor-ref name="Basic Authorization"/> - </bind> - <bind pointcut="execution(public * @javax.annotation.security.RunAs->*(..))"> - <interceptor-ref name="org.jboss.ejb3.security.RunAsSecurityInterceptorFactory"/> - </bind> - <bind pointcut="execution(public * *->*(..))"> - <interceptor-ref name="org.jboss.aspects.tx.TxPropagationInterceptor"/> - <interceptor-ref name="org.jboss.ejb3.tx.TxInterceptorFactory"/> - <interceptor-ref name="org.jboss.ejb3.AllowedOperationsInterceptor"/> - <interceptor-ref name="org.jboss.ejb3.entity.TransactionScopedEntityManagerInterceptor"/> - </bind> - <bind pointcut="execution(public * *->*(..)) AND !execution(* *->create()) AND !execution(* *->start())"> - <interceptor-ref name="org.jboss.ejb3.interceptor.EJB3InterceptorsFactory"/> - </bind> - </domain> - - <domain name="JACC Service Bean"> - <bind pointcut="execution(public * *->*(..))"> - <interceptor-ref name="org.jboss.ejb3.asynchronous.AsynchronousInterceptor"/> - <interceptor-ref name="org.jboss.ejb3.ENCPropagationInterceptor"/> - </bind> - <bind pointcut="!execution(* *->create()) AND !execution(* *->start()) AND !execution(*->new(..))"> - <interceptor-ref name="org.jboss.ejb3.security.AuthenticationInterceptorFactory"/> - </bind> - <bind pointcut="execution(public * @org.jboss.annotation.security.SecurityDomain->*(..))"> - <interceptor-ref name="Basic Authorization"/> - </bind> - <bind pointcut="execution(public * @javax.annotation.security.RunAs->*(..))"> - <interceptor-ref name="org.jboss.ejb3.security.RunAsSecurityInterceptorFactory"/> - </bind> - <bind pointcut="execution(public * *->*(..))"> - <interceptor-ref name="org.jboss.aspects.tx.TxPropagationInterceptor"/> - <interceptor-ref name="org.jboss.ejb3.tx.TxInterceptorFactory"/> - <interceptor-ref name="org.jboss.ejb3.AllowedOperationsInterceptor"/> - <interceptor-ref name="org.jboss.ejb3.entity.TransactionScopedEntityManagerInterceptor"/> - </bind> - <bind pointcut="execution(public * *->*(..)) AND !execution(* *->create()) AND !execution(* *->start())"> - <interceptor-ref name="org.jboss.ejb3.interceptor.EJB3InterceptorsFactory"/> - </bind> - </domain> - - -</aop> \ No newline at end of file diff --git a/modules/enterprise/server/integration-tests/src/test/resources/embedded-jboss-beans.xml b/modules/enterprise/server/integration-tests/src/test/resources/embedded-jboss-beans.xml deleted file mode 100644 index 05edefa..0000000 --- a/modules/enterprise/server/integration-tests/src/test/resources/embedded-jboss-beans.xml +++ /dev/null @@ -1,160 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> - -<deployment xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="urn:jboss:bean-deployer:2.0 bean-deployer_2_0.xsd" - xmlns="urn:jboss:bean-deployer:2.0"> - - <bean name="Naming" class="org.jnp.server.SingletonNamingServer"/> - - <bean name="InitialContextProperties" class="java.util.Hashtable"> - <constructor> - <parameter class="java.util.Map"> - <map keyClass="java.lang.String" valueClass="java.lang.String"> - <entry> - <key>java.naming.factory.initial</key> - <value>org.jnp.interfaces.LocalOnlyContextFactory</value> - </entry> - <entry> - <key>java.naming.factory.url.pkgs</key> - <value>org.jboss.naming:org.jnp.interfaces</value> - </entry> - </map> - </parameter> - </constructor> - </bean> - - <bean name="java:comp/Initializer" class="org.jboss.ejb3.embedded.JavaCompInitializer"> - <property name="jndiProperties"> - <inject bean="InitialContextProperties"/> - </property> - </bean> - - <bean name="XidFactory" class="org.jboss.tm.XidFactoryImpl"/> - - <bean name="XidFactoryMBean" class="org.jboss.ejb3.embedded.XidFactoryMBean"> - <constructor> - <parameter class="org.jboss.tm.XidFactoryBase"> - <inject bean="XidFactory"/> - </parameter> - </constructor> - </bean> - - <bean name="TransactionManagerInitializer" class="org.jboss.tm.TransactionManagerInitializer"> - <property name="xidFactory"> - <inject bean="XidFactory"/> - </property> - <property name="initialContextProperties"> - <inject bean="InitialContextProperties"/> - </property> - </bean> - - <bean name="UserTransaction" class="org.jboss.ejb3.embedded.UserTransactionImpl"> - <demand>TransactionManagerInitializer</demand> - </bean> - - <bean name="UserTransactionBinding" class="org.jboss.ejb3.embedded.JndiBinder"> - <property name="jndiProperties"> - <inject bean="InitialContextProperties"/> - </property> - <property name="target"> - <inject bean="UserTransaction"/> - </property> - <property name="bindTo">UserTransaction</property> - <property name="serializable">false</property> - </bean> - - - <bean name="TransactionManager" class="java.lang.Object"> - <constructor factoryMethod="getTransactionManager"> - <factory bean="TransactionManagerInitializer"/> - </constructor> - </bean> - <bean name="CachedConnectionManager" class="org.jboss.resource.connectionmanager.CachedConnectionManagerReference"> - <property name="transactionManager"> - <inject bean="TransactionManager"/> - </property> - </bean> - - <bean name="RHQDSBootstrap" class="org.jboss.resource.adapter.jdbc.local.LocalTxDataSource"> - <property name="driverClass">${rhq.test.ds.driver-class}</property> - <property name="connectionURL">${rhq.test.ds.connection-url}</property> - <property name="userName">${rhq.test.ds.user-name}</property> - <property name="password">${rhq.test.ds.password}</property> - <property name="jndiName">java:/RHQDS</property> - <property name="minSize">0</property> - <property name="maxSize">20</property> - <property name="blockingTimeout">3000</property> - <property name="idleTimeout">100000</property> - <property name="transactionManager"> - <inject bean="TransactionManager"/> - </property> - <property name="cachedConnectionManager"> - <inject bean="CachedConnectionManager"/> - </property> - <property name="initialContextProperties"> - <inject bean="InitialContextProperties"/> - </property> - </bean> - - <bean name="RHQDS" class="java.lang.Object"> - <constructor factoryMethod="getDatasource"> - <factory bean="RHQDSBootstrap"/> - </constructor> - </bean> - - <!-- needed for Quartz' no-TX data source (even though this is a local-tx, seems like Quartz is still working) --> - <bean name="NoTxRHQDSBootstrap" class="org.jboss.resource.adapter.jdbc.local.LocalTxDataSource"> - <property name="driverClass">${rhq.test.ds.driver-class}</property> - <property name="connectionURL">${rhq.test.ds.connection-url}</property> - <property name="userName">${rhq.test.ds.user-name}</property> - <property name="password">${rhq.test.ds.password}</property> - <property name="jndiName">java:/NoTxRHQDS</property> - <property name="minSize">0</property> - <property name="maxSize">10</property> - <property name="blockingTimeout">1000</property> - <property name="idleTimeout">100000</property> - <property name="transactionManager"> - <inject bean="TransactionManager"/> - </property> - <property name="cachedConnectionManager"> - <inject bean="CachedConnectionManager"/> - </property> - <property name="initialContextProperties"> - <inject bean="InitialContextProperties"/> - </property> - </bean> - - <bean name="NoTxRHQDS" class="java.lang.Object"> - <constructor factoryMethod="getDatasource"> - <factory bean="NoTxRHQDSBootstrap"/> - </constructor> - </bean> - - <bean name="DefaultDSBootstrap" class="org.jboss.resource.adapter.jdbc.local.LocalTxDataSource"> - <property name="driverClass">org.hsqldb.jdbcDriver</property> - <property name="connectionURL">jdbc:hsqldb:.</property> - <!-- <property name="connectionURL">jdbc:hsqldb:./hypersonic/localDB</property> --> - <property name="userName">sa</property> - <property name="jndiName">java:/DefaultDS</property> - <property name="minSize">0</property> - <property name="maxSize">10</property> - <property name="blockingTimeout">1000</property> - <property name="idleTimeout">100000</property> - <property name="transactionManager"> - <inject bean="TransactionManager"/> - </property> - <property name="cachedConnectionManager"> - <inject bean="CachedConnectionManager"/> - </property> - <property name="initialContextProperties"> - <inject bean="InitialContextProperties"/> - </property> - </bean> - - <bean name="DefaultDS" class="java.lang.Object"> - <constructor factoryMethod="getDatasource"> - <factory bean="DefaultDSBootstrap"/> - </constructor> - </bean> - -</deployment> \ No newline at end of file diff --git a/modules/enterprise/server/integration-tests/src/test/resources/jboss-jms-beans.xml b/modules/enterprise/server/integration-tests/src/test/resources/jboss-jms-beans.xml deleted file mode 100644 index 287cffc..0000000 --- a/modules/enterprise/server/integration-tests/src/test/resources/jboss-jms-beans.xml +++ /dev/null @@ -1,132 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> - -<deployment xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="urn:jboss:bean-deployer:2.0 bean-deployer_2_0.xsd" - xmlns="urn:jboss:bean-deployer:2.0"> - <bean name="jboss.mq:service=JMSProviderLoader,name=JMSProvider" class="org.jboss.jms.jndi.JNDIProviderAdapter"> - <property name="factoryRef">java:/JmsXA</property> - <property name="queueFactoryRef">java:/JmsXA</property> - <property name="topicFactoryRef">java:/JmsXA</property> - <property name="properties" class="java.util.Properties"> - <map keyClass="java.lang.String" valueClass="java.lang.String"> - <entry> - <key>java.naming.factory.initial</key> - <value>org.jnp.interfaces.LocalOnlyContextFactory</value> - </entry> - <entry> - <key>java.naming.factory.url.pkgs</key> - <value>org.jboss.naming:org.jnp.interfaces</value> - </entry> - </map> - </property> - </bean> - - <bean name="b1" class="org.jboss.ejb3.embedded.JndiBinder"> - <property name="jndiProperties"><inject bean="InitialContextProperties"/></property> - <property name="target"><inject bean="jboss.mq:service=JMSProviderLoader,name=JMSProvider"/></property> - <property name="bindTo">java:/DefaultJMSProvider</property> - <property name="serializable">true</property> - </bean> - - <bean name="jboss.mq:service=ServerSessionPoolMBean,name=StdJMSPool" class="org.jboss.jms.asf.StdServerSessionPoolFactory"> - <property name="name">StdJMSPool</property> - <property name="xidFactory"><inject bean="XidFactoryMBean"/></property> - <property name="transactionManager"><inject bean="TransactionManager"/></property> - </bean> - - <bean name="b2" class="org.jboss.ejb3.embedded.JndiBinder"> - <property name="jndiProperties"><inject bean="InitialContextProperties"/></property> - <property name="target"><inject bean="jboss.mq:service=ServerSessionPoolMBean,name=StdJMSPool"/></property> - <property name="bindTo">java:/StdJMSPool</property> - <property name="serializable">false</property> - </bean> - - - <bean name="jboss.mq:service=PersistenceManager" class="org.jboss.mq.pm.none.PersistenceManager"> - </bean> - - <bean name="jboss.mq:service=MessageCache" class="org.jboss.mq.kernel.MessageCache"> - <property name="persistenceManager"><inject bean="jboss.mq:service=PersistenceManager"/></property> - <property name="highMemoryMark">50</property> - <property name="maxMemoryMark">60</property> - </bean> - - <bean name="jms-rar-WorkManager" class="org.jboss.ejb3.embedded.resource.JBossWorkManager"> - </bean> - - <bean name="jms-rar-DeploymentInfo" class="org.jboss.ejb3.embedded.resource.Ejb3DeploymentInfo"> - <constructor> - <parameter class="java.lang.String">jms-ra.rar</parameter> - <parameter class="java.lang.String">javax.jms.MessageListener</parameter> - <parameter class="java.lang.String">org.jboss.resource.adapter.jms.inflow.JmsActivationSpec</parameter> - </constructor> - </bean> - - <bean name="jboss.jca:name='jms-ra.rar',service=RARDeployment" class="org.jboss.ejb3.embedded.resource.RARDeployment"> - <constructor> - <parameter class="org.jboss.deployment.DeploymentInfo"> - <inject bean="jms-rar-DeploymentInfo"/> - </parameter> - </constructor> - <property name="workManager"><inject bean="jms-rar-WorkManager"/></property> - </bean> - - <bean name="jboss.mq:service=StateManager" class="org.jboss.mq.sm.none.NullStateManager"> - </bean> - - <bean name="BasicQueueParameters" class="org.jboss.mq.server.BasicQueueParameters"/> - - <bean name="jboss.mq:service=ThreadPool" class="org.jboss.util.threadpool.BasicThreadPool"> - <property name="name">JMSThread</property> - <property name="threadGroupName">JBossMQ Server Threads</property> - <!-- The max number of threads in the pool --> - <property name="maximumPoolSize">10</property> - <!-- The max number of tasks before the queue is full --> - <property name="maximumQueueSize">1000</property> - <!-- The behavior of the pool when a task is added and the queue is full. - abort - a RuntimeException is thrown - run - the calling thread executes the task - wait - the calling thread blocks until the queue has room - discard - the task is silently discarded without being run - discardOldest - check to see if a task is about to complete and enque - the new task if possible, else run the task in the calling thread - --> - <property name="blockingMode">run</property> - </bean> - - <bean name="jboss.mq:service=DestinationManager" class="org.jboss.mq.server.JMSDestinationManager"> - <constructor> - <parameter class="org.jboss.mq.server.BasicQueueParameters"> - <inject bean="BasicQueueParameters"/> - </parameter> - </constructor> - <property name="persistenceManager"><inject bean="jboss.mq:service=PersistenceManager"/></property> - <property name="messageCache"><inject bean="jboss.mq:service=MessageCache"/></property> - <property name="stateManager"><inject bean="jboss.mq:service=StateManager"/></property> - <property name="threadPool"><inject bean="jboss.mq:service=ThreadPool"/></property> - <property name="threadGroup"><inject bean="jboss.mq:service=ThreadPool" property="threadGroup"/></property> - <start method="startServer"/> - <stop method="stopServer"/> - </bean> - - <bean name="jboss.mq.destination:service=Queue,name=DLQ" class="org.jboss.mq.kernel.Queue"> - <property name="destinationManagerPojo"><inject bean="jboss.mq:service=DestinationManager"/></property> - <property name="initialContextProperties"><inject bean="InitialContextProperties"/></property> - <property name="destinationName">DLQ</property> - </bean> - - <bean name="jboss.mq:service=Invoker" class="org.jboss.mq.server.JMSServerInvoker"> - <property name="next"><inject bean="jboss.mq:service=DestinationManager"/></property> - </bean> - - <bean name="jboss.mq:service=invocationlayer,type=JVM" class="org.jboss.mq.kernel.JVMIL"> - <property name="jmsInvoker"><inject bean="jboss.mq:service=Invoker"/></property> - <!-- notice we actually switched - the non-xa connection factory JNDI Ref is the JNDI name our EJBs use --> - <!-- the embedded EJB container doesn't support XA, so the connection factory our JmsXA JNDI lookup will return will be a non-XA factory --> - <property name="connectionFactoryJNDIRef">java:/JmsXA</property> - <property name="XAConnectionFactoryJNDIRef">java:/ConnectionFactory</property> - <property name="pingPeriod">0</property> - <property name="initialContextProperties"><inject bean="InitialContextProperties"/></property> - </bean> - -</deployment> diff --git a/modules/enterprise/server/integration-tests/src/test/resources/jms-ra.rar b/modules/enterprise/server/integration-tests/src/test/resources/jms-ra.rar deleted file mode 100644 index c4807c6..0000000 Binary files a/modules/enterprise/server/integration-tests/src/test/resources/jms-ra.rar and /dev/null differ diff --git a/modules/enterprise/server/integration-tests/src/test/resources/jndi.properties b/modules/enterprise/server/integration-tests/src/test/resources/jndi.properties deleted file mode 100644 index 9225cef..0000000 --- a/modules/enterprise/server/integration-tests/src/test/resources/jndi.properties +++ /dev/null @@ -1,2 +0,0 @@ -java.naming.factory.initial=org.jnp.interfaces.LocalOnlyContextFactory -java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces \ No newline at end of file diff --git a/modules/enterprise/server/integration-tests/src/test/resources/log4j.xml b/modules/enterprise/server/integration-tests/src/test/resources/log4j.xml deleted file mode 100644 index bc65329..0000000 --- a/modules/enterprise/server/integration-tests/src/test/resources/log4j.xml +++ /dev/null @@ -1,74 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> - -<!-- ===================================================================== --> -<!-- --> -<!-- Log4j Configuration --> -<!-- --> -<!-- ===================================================================== --> - -<!-- $Id: log4j.xml 39945 2006-01-12 02:44:07Z bill $ --> - -<!-- - | For more configuration infromation and examples see the Jakarta Log4j - | owebsite: http://jakarta.apache.org/log4j - --> - -<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="true"> - - <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender"> - <errorHandler class="org.jboss.logging.util.OnlyOnceErrorHandler"/> - <param name="Target" value="System.out"/> - <param name="Threshold" value="WARN"/> - - <layout class="org.apache.log4j.PatternLayout"> - <!-- The default pattern: Date Priority [Category] Messagen --> - <!-- - <param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%c{1}] %m%n"/> - --> - <param name="ConversionPattern" value="%-5p %d{dd-MM HH:mm:ss,SSS} [%c] (%F:%M:%L) -%m%n"/> - </layout> - </appender> - - <appender name="FILE" class="org.apache.log4j.RollingFileAppender"> - <param name="File" value="target/server-jar-test.log"/> - <param name="Threshold" value="WARN"/> - <param name="Append" value="false"/> - - <layout class="org.apache.log4j.PatternLayout"> - <!-- The default pattern: Date Priority [Category] Messagen --> - <!-- - <param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%c{1}] %m%n"/> - --> - <param name="ConversionPattern" value="%-5p %d{dd-MM HH:mm:ss,SSS} [%c] (%F:%M:%L) -%m%n"/> - </layout> - </appender> - - <!-- Hibernate logs WARNINGS frequent from this class, in test envs. --> - <category name="org.hibernate.hql.ast.QueryTranslatorImpl"> - <priority value="ERROR"/> - </category> - - <!-- hides the TIMER SERVICE IS NOT INSTALLED warning - we know embedded EJB3 container doesn't support timers --> - <category name="org.jboss.ejb3.timerservice.jboss.JBossTimerServiceFactory"> - <priority value="ERROR"/> - </category> - - <!-- hides the shutdown warnings - for some reason, the container spits out some warnings when shutting down --> - <category name="org.jboss.kernel.plugins.dependency.StartStopLifecycleAction"> - <priority value="ERROR"/> - </category> - - <!-- Hibernate SQL logs --> - <!-- - <category name="org.hibernate.SQL"> - <priority value="DEBUG"/> - </category> - --> - - <root> - <appender-ref ref="CONSOLE"/> - <appender-ref ref="FILE"/> - </root> - -</log4j:configuration> diff --git a/modules/enterprise/server/integration-tests/src/test/resources/login-config.xml b/modules/enterprise/server/integration-tests/src/test/resources/login-config.xml deleted file mode 100644 index 645294d..0000000 --- a/modules/enterprise/server/integration-tests/src/test/resources/login-config.xml +++ /dev/null @@ -1,72 +0,0 @@ -<?xml version='1.0'?> - -<!DOCTYPE policy PUBLIC - "-//JBoss//DTD JBOSS Security Config 3.0//EN" - "http://www.jboss.org/j2ee/dtd/security_config.dtd"> - -<!-- The XML based JAAS login configuration read by the -org.jboss.security.auth.login.XMLLoginConfig mbean. Add -an application-policy element for each security domain. - -The outline of the application-policy is: -<application-policy name="security-domain-name"> - <authentication> - <login-module code="login.module1.class.name" flag="control_flag"> - <module-option name = "option1-name">option1-value</module-option> - <module-option name = "option2-name">option2-value</module-option> - ... - </login-module> - - <login-module code="login.module2.class.name" flag="control_flag"> - ... - </login-module> - ... - </authentication> -</application-policy> - -$Revision: 42748 $ ---> - -<policy> - <!-- Used by clients within the application server VM such as - mbeans and servlets that access EJBs. - --> - <application-policy name="client-login"> - <authentication> - <login-module code="org.jboss.security.ClientLoginModule" - flag="required"> - <!-- Any existing security context will be restored on logout --> - <module-option name="restore-login-identity">true</module-option> - </login-module> - </authentication> - </application-policy> - - <application-policy name = "jbossmq"> - <authentication> - <login-module code = "org.jboss.mq.sm.file.DynamicLoginModule" flag = "required"> - <module-option name = "unauthenticatedIdentity">guest</module-option> - <module-option name = "sm.objectname">jboss.mq:service=StateManager</module-option> - </login-module> - </authentication> - </application-policy> - - <application-policy name="other"> - <!-- A simple server login module, which can be used when the number - of users is relatively small. It uses two properties files: - users.properties, which holds users (key) and their password (value). - roles.properties, which holds users (key) and a comma-separated list of - their roles (value). - The unauthenticatedIdentity property defines the name of the principal - that will be used when a null username and password are presented as is - the case for an unuathenticated web client or MDB. If you want to - allow such users to be authenticated add the property, e.g., - unauthenticatedIdentity="nobody" - --> - <authentication> - <login-module code="org.jboss.security.auth.spi.UsersRolesLoginModule" - flag="required"/> - </authentication> - </application-policy> - -</policy> - diff --git a/modules/enterprise/server/integration-tests/src/test/resources/rhq-mdb-beans.xml b/modules/enterprise/server/integration-tests/src/test/resources/rhq-mdb-beans.xml deleted file mode 100644 index ad05b5e..0000000 --- a/modules/enterprise/server/integration-tests/src/test/resources/rhq-mdb-beans.xml +++ /dev/null @@ -1,25 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> - -<deployment xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="urn:jboss:bean-deployer:2.0 bean-deployer_2_0.xsd" - xmlns="urn:jboss:bean-deployer:2.0"> - - <bean name="jboss.mq.destination:service=Queue,name=AlertConditionQueue" class="org.jboss.mq.kernel.Queue"> - <property name="destinationManagerPojo"><inject bean="jboss.mq:service=DestinationManager"/></property> - <property name="initialContextProperties"><inject bean="InitialContextProperties"/></property> - <property name="destinationName">AlertConditionQueue</property> - </bean> - - <bean name="jboss.mq.destination:service=Queue,name=DriftChangesetQueue" class="org.jboss.mq.kernel.Queue"> - <property name="destinationManagerPojo"><inject bean="jboss.mq:service=DestinationManager"/></property> - <property name="initialContextProperties"><inject bean="InitialContextProperties"/></property> - <property name="destinationName">DriftChangesetQueue</property> - </bean> - - <bean name="jboss.mq.destination:service=Queue,name=DriftFileQueue" class="org.jboss.mq.kernel.Queue"> - <property name="destinationManagerPojo"><inject bean="jboss.mq:service=DestinationManager"/></property> - <property name="initialContextProperties"><inject bean="InitialContextProperties"/></property> - <property name="destinationName">DriftFileQueue</property> - </bean> - -</deployment> \ No newline at end of file diff --git a/modules/enterprise/server/integration-tests/src/test/resources/security-beans.xml b/modules/enterprise/server/integration-tests/src/test/resources/security-beans.xml deleted file mode 100644 index 84fa819..0000000 --- a/modules/enterprise/server/integration-tests/src/test/resources/security-beans.xml +++ /dev/null @@ -1,13 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> - -<deployment xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="urn:jboss:bean-deployer bean-deployer_1_0.xsd" - xmlns="urn:jboss:bean-deployer"> - - <bean class="org.jboss.ejb3.embedded.JaasSecurityManagerService" - name="jboss.security:service=JaasSecurityManager"> - <property name="initialContextProperties"> - <inject bean="InitialContextProperties"/> - </property> - </bean> -</deployment> diff --git a/modules/enterprise/server/integration-tests/src/test/resources/test-assist-color-number.txt b/modules/enterprise/server/integration-tests/src/test/resources/test-assist-color-number.txt deleted file mode 100644 index 6ad90cc..0000000 --- a/modules/enterprise/server/integration-tests/src/test/resources/test-assist-color-number.txt +++ /dev/null @@ -1,46 +0,0 @@ - -color[ number -c -color[ -n -number -r -color[ number -lo -color[ -number -number!= number!== number= number== -be -number -number== -number=="two" number=="four" number=="twenty-two" number=="twenty-four" number=="forty-two" -number==t -number=="two" number=="twenty-two" number=="twenty-four" number=="forty-two" -number==fo -number=="four" number=="twenty-four" number=="forty-two" -color -color[ -color[ -color[primary] color[other] -color[p -color[primary] -color[o -color[other] -color[r -color[primary] color[other] -color[primary -color[primary] -color[primary] -color[primary]!= color[primary]!== color[primary]= color[primary]== -color[primary]= -color[primary]="red" color[primary]="green" color[primary]="blue" -color[primary]=e -color[primary]="red" color[primary]="green" color[primary]="blue" -color[primary]=d -color[primary]="red" -color[primary]=g -color[primary]="green" -color[primary]=b -color[primary]="blue" -color[primary]=r -color[primary]="red" color[primary]="green" \ No newline at end of file diff --git a/modules/enterprise/server/integration-tests/src/test/resources/test-ldap.properties b/modules/enterprise/server/integration-tests/src/test/resources/test-ldap.properties deleted file mode 100644 index 3316083..0000000 --- a/modules/enterprise/server/integration-tests/src/test/resources/test-ldap.properties +++ /dev/null @@ -1,2 +0,0 @@ -rhq.test.ldap.url=${rhq.test.ldap.url} -rhq.test.ldap.LDAPFactory=${rhq.test.ldap.LDAPFactory} \ No newline at end of file diff --git a/modules/enterprise/server/integration-tests/src/test/resources/test-scheduler.properties b/modules/enterprise/server/integration-tests/src/test/resources/test-scheduler.properties deleted file mode 100644 index 804639a..0000000 --- a/modules/enterprise/server/integration-tests/src/test/resources/test-scheduler.properties +++ /dev/null @@ -1,29 +0,0 @@ -# QUARTZ CONFIGURATION FOR OUR UNIT TESTS -# our test timeout will be fast, 5 seconds -rhq.server.operation-timeout = 5 - -# scheduler factory config -org.quartz.scheduler.instanceName = RHQScheduler -org.quartz.scheduler.instanceId = AUTO - -# thread pool config -org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool -org.quartz.threadPool.threadCount = 25 -org.quartz.threadPool.threadPriority = 5 - -# database config - note the use of POSTGRES for tests -org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreCMT -org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.PostgreSQLDelegate -# tests don't need this -org.quartz.jobStore.isClustered = false -org.quartz.jobStore.clusterCheckinInterval = 600000 -# make this a small non-zero time (in ms) so the scheduler (almost) never sleeps for more predictable test timing -org.quartz.scheduler.idleWaitTime = 10 -org.quartz.jobStore.tablePrefix = RHQ_QRTZ_ -org.quartz.jobStore.useProperties = true -org.quartz.jobStore.dataSource = RHQDS -org.quartz.dataSource.RHQDS.jndiURL = java:/RHQDS -org.quartz.dataSource.RHQDS.maxConnections = 10 -org.quartz.jobStore.nonManagedTXDataSource = NoTxRHQDS -org.quartz.dataSource.NoTxRHQDS.jndiURL = java:/NoTxRHQDS -org.quartz.dataSource.NoTxRHQDS.maxConnections = 10 \ No newline at end of file diff --git a/modules/enterprise/server/integration-tests/src/test/resources/testng.xml b/modules/enterprise/server/integration-tests/src/test/resources/testng.xml deleted file mode 100644 index 1452edb..0000000 --- a/modules/enterprise/server/integration-tests/src/test/resources/testng.xml +++ /dev/null @@ -1,12 +0,0 @@ -<!DOCTYPE suite SYSTEM "http://beust.com/testng/testng-1.0.dtd" > - -<suite name="EJB3 Testsuite" > - <test name="EJB3 tests" > - <groups> - <run> - <include name="integration.ejb3"/> - </run> - </groups> - - </test> -</suite> diff --git a/modules/enterprise/server/itests/pom.xml b/modules/enterprise/server/itests/pom.xml new file mode 100644 index 0000000..6d871a1 --- /dev/null +++ b/modules/enterprise/server/itests/pom.xml @@ -0,0 +1,556 @@ +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> + + <modelVersion>4.0.0</modelVersion> + + <parent> + <groupId>org.rhq</groupId> + <artifactId>rhq-parent</artifactId> + <version>4.1.0-SNAPSHOT</version> + <relativePath>../../../../pom.xml</relativePath> + </parent> + + <artifactId>rhq-server-itests</artifactId> + + <name>RHQ Server Integration Tests</name> + <description>RHQ enterprise server integration tests</description> + + <scm> + <connection>scm:git:ssh://git.fedorahosted.org/git/rhq.git/modules/enterprise/server/integration-tests/</connection> + <developerConnection>scm:git:ssh://git.fedorahosted.org/git/rhq.git/modules/enterprise/server/integration-tests/</developerConnection> + </scm> + + <properties> + <rhq.server.datasource>java:/RHQDS</rhq.server.datasource> + <rhq.server.ds-mapping>PostgreSQL</rhq.server.ds-mapping> + <jboss-embeddable-ejb3.version>1.0.0.Alpha9</jboss-embeddable-ejb3.version> + </properties> + + <dependencies> + <dependency> + <groupId>org.rhq</groupId> + <artifactId>rhq-enterprise-comm</artifactId> + <version>${project.version}</version> + </dependency> + + <dependency> + <groupId>org.rhq</groupId> + <artifactId>rhq-enterprise-server-xml-schemas</artifactId> + <version>${project.version}</version> + </dependency> + + <dependency> + <groupId>org.rhq</groupId> + <artifactId>rhq-core-domain</artifactId> + <version>${project.version}</version> + </dependency> + + <dependency> + <groupId>org.rhq</groupId> + <artifactId>rhq-core-client-api</artifactId> + <version>${project.version}</version> + </dependency> + + <dependency> + <groupId>org.rhq</groupId> + <artifactId>rhq-common-drift</artifactId> + <version>${project.version}</version> + </dependency> + + <dependency> + <groupId>com.googlecode.java-diff-utils</groupId> + <artifactId>diffutils</artifactId> + <version>1.2.1</version> + </dependency> + + <!--================ Test Deps ================--> + + <!-- Note, the test deps are intentionally placed above the other scoped deps because of classpath + reasons. Maven orders the [test] classpath in the order listed in the pom. We specifically + need the embeddable-ejb3 jar above the standard ejb3 jars because we need the embeddble packages + loaded when testing. --> + + <dependency> + <groupId>org.rhq</groupId> + <artifactId>test-utils</artifactId> + <version>${project.version}</version> + <scope>test</scope> + <exclusions> + <exclusion> + <groupId>org.testng</groupId> + <artifactId>testng</artifactId> + </exclusion> + </exclusions> + </dependency> + + <dependency> + <groupId>org.rhq</groupId> + <artifactId>rhq-core-domain</artifactId> + <version>${project.version}</version> + <type>test-jar</type> + <scope>test</scope> + </dependency> + + <dependency> + <groupId>org.rhq</groupId> + <artifactId>rhq-enterprise-server</artifactId> + <version>${project.version}</version> + <scope>test</scope> + </dependency> + + <dependency> + <groupId>org.rhq</groupId> + <artifactId>rhq-enterprise-server</artifactId> + <version>${project.version}</version> + <type>test-jar</type> + <scope>test</scope> + </dependency> + + <dependency> + <groupId>${project.groupId}</groupId> + <artifactId>rhq-core-client-api</artifactId> + <version>${project.version}</version> + <type>test-jar</type> + <scope>test</scope> + </dependency> + + <dependency> + <groupId>org.rhq.helpers</groupId> + <artifactId>perftest-support</artifactId> + <version>${project.version}</version> + <scope>test</scope> + <exclusions> + <exclusion> + <groupId>ant</groupId> + <artifactId>ant</artifactId> + </exclusion> + <exclusion> + <groupId>ant</groupId> + <artifactId>ant-launcher</artifactId> + </exclusion> + </exclusions> + </dependency> + + <dependency> + <groupId>jboss.jboss-embeddable-ejb3</groupId> + <artifactId>jboss-ejb3-all</artifactId> + <version>${jboss-embeddable-ejb3.version}</version> + <scope>test</scope> + </dependency> + + <!-- NOTE: The remaining test deps correspond to the classes contained in hibernate-all.jar and thirdparty-all.jar. --> + + <dependency> + <groupId>antlr</groupId> + <artifactId>antlr</artifactId> + <version>2.7.7</version> + <scope>test</scope> + </dependency> + + <dependency> + <groupId>jboss</groupId> + <artifactId>javassist</artifactId> + <!-- NOTE: The version is defined in the root POM's dependencyManagement section. --> + <scope>test</scope> + </dependency> + + <dependency> + <groupId>trove</groupId> + <artifactId>trove</artifactId> + <version>1.0.2</version> + <scope>test</scope> + </dependency> + + <dependency> + <groupId>xerces</groupId> + <artifactId>xercesImpl</artifactId> + <version>2.8.1</version> + <scope>test</scope> + </dependency> + + <dependency> + <groupId>net.sf.opencsv</groupId> + <artifactId>opencsv</artifactId> + <version>1.8</version> + <scope>test</scope> + </dependency> + + <dependency> + <groupId>commons-jxpath</groupId> + <artifactId>commons-jxpath</artifactId> + <version>1.3</version> + <scope>test</scope> + </dependency> + + + <!-- 3rd Party Deps --> + + <dependency> + <groupId>org.antlr</groupId> + <artifactId>antlr</artifactId> + <version>3.2</version> + </dependency> + + <!-- Required by a couple APL and Lather classes - TODO: Remove this once APL and Lather have been excised. --> + <dependency> + <groupId>commons-beanutils</groupId> + <artifactId>commons-beanutils</artifactId> + <version>1.6.1</version> + </dependency> + + <!-- Required by a couple APL classes - TODO: Remove this once APL has been removed. --> + <!-- also required by EJB3 Embedded (test scope) --> + <dependency> + <groupId>commons-collections</groupId> + <artifactId>commons-collections</artifactId> + <version>3.2</version> + </dependency> + + <dependency> + <groupId>commons-httpclient</groupId> + <artifactId>commons-httpclient</artifactId> + <version>3.0.1</version> + </dependency> + + <dependency> + <groupId>commons-lang</groupId> + <artifactId>commons-lang</artifactId> + <version>2.4</version> + </dependency> + + <!-- Required by a couple APL classes - TODO: Remove this once APL has been removed. --> + <dependency> + <groupId>commons-validator</groupId> + <artifactId>commons-validator</artifactId> + <version>1.1.4</version> + </dependency> + + <!-- required by RHQ server classes, as well as EJB3 Embedded --> + <dependency> + <groupId>dom4j</groupId> + <artifactId>dom4j</artifactId> + <version>1.6.1-jboss</version> + <scope>runtime</scope> + </dependency> + + <dependency> + <groupId>gnu-getopt</groupId> + <artifactId>getopt</artifactId> + <!-- NOTE: The version is defined in the root POM's dependencyManagement section. --> + </dependency> + + <dependency> + <groupId>hibernate</groupId> + <artifactId>hibernate3</artifactId> + <!-- NOTE: The version is defined in the root POM's dependencyManagement section. --> + <scope>provided</scope> <!-- by JBossAS --> + </dependency> + + <dependency> + <groupId>hibernate-annotations</groupId> + <artifactId>hibernate-annotations</artifactId> + <!-- NOTE: The version is defined in the root POM's dependencyManagement section. --> + <scope>provided</scope> <!-- by JBossAS --> + </dependency> + + <dependency> + <groupId>hibernate-entitymanager</groupId> + <artifactId>hibernate-entitymanager</artifactId> + <!-- NOTE: The version is defined in the root POM's dependencyManagement section. --> + <scope>provided</scope> <!-- by JBossAS --> + </dependency> + + <dependency> + <groupId>i18nlog</groupId> + <artifactId>i18nlog</artifactId> + </dependency> + + <dependency> + <groupId>org.apache.geronimo.specs</groupId> + <artifactId>geronimo-javamail_1.3.1_spec</artifactId> + <!-- The Sun javamail jar isn't available from a public repo due to licensing issues, + so use the Geronimo one instead. --> + <version>1.3</version> + <scope>provided</scope> <!-- by JBossAS --> + </dependency> + + <dependency> + <groupId>javax.persistence</groupId> + <artifactId>persistence-api</artifactId> + <version>1.0</version> + <scope>provided</scope> <!-- by JBossAS --> + </dependency> + + <dependency> + <groupId>javax.servlet</groupId> + <artifactId>servlet-api</artifactId> + <version>2.4</version> + <scope>provided</scope> <!-- by JBossAS --> + </dependency> + + <dependency> + <groupId>javax.servlet</groupId> + <artifactId>jsp-api</artifactId> + <version>2.0</version> + <scope>provided</scope> <!-- by JBossAS --> + </dependency> + + <dependency> + <groupId>jboss</groupId> + <artifactId>jboss-annotations-ejb3</artifactId> + <!-- NOTE: The version is defined in the root POM's dependencyManagement section. --> + <scope>provided</scope> <!-- by JBossAS --> + </dependency> + + <dependency> + <groupId>jboss</groupId> + <artifactId>jboss-cache</artifactId> + <!-- NOTE: The version is defined in the root POM's dependencyManagement section. --> + <scope>compile</scope> + </dependency> + + <dependency> + <groupId>jboss</groupId> + <artifactId>jboss-common</artifactId> + <!-- NOTE: The version is defined in the root POM's dependencyManagement section. --> + <scope>provided</scope> <!-- by JBossAS --> + </dependency> + + <dependency> + <groupId>jboss</groupId> + <artifactId>jboss-ejb3x</artifactId> + <!-- NOTE: The version is defined in the root POM's dependencyManagement section. --> + <scope>provided</scope> <!-- by JBossAS --> + </dependency> + + <!-- includes the org.jboss.ejb3.StrictMaxPool class, which is needed by the PoolClass annotation used on some + of our SLSB's --> + <dependency> + <groupId>jboss</groupId> + <artifactId>jboss-ejb3</artifactId> + <!-- NOTE: The version is defined in the root POM's dependencyManagement section. --> + <scope>provided</scope> <!-- by JBossAS --> + </dependency> + + <dependency> + <groupId>jboss</groupId> + <artifactId>jboss-j2ee</artifactId> + <!-- NOTE: The version is defined in the root POM's dependencyManagement section. --> + <scope>provided</scope> <!-- by JBossAS --> + </dependency> + + <dependency> + <groupId>jboss</groupId> + <artifactId>jboss-jmx</artifactId> + <!-- NOTE: The version is defined in the root POM's dependencyManagement section. --> + <scope>provided</scope> <!-- by JBossAS --> + </dependency> + + <dependency> + <groupId>jboss</groupId> + <artifactId>jboss-system</artifactId> + <!-- NOTE: The version is defined in the root POM's dependencyManagement section. --> + <scope>provided</scope> <!-- by JBossAS --> + </dependency> + + <dependency> + <groupId>jboss</groupId> + <artifactId>jbosssx</artifactId> + <!-- NOTE: The version is defined in the root POM's dependencyManagement section. --> + <scope>provided</scope> <!-- by JBossAS --> + </dependency> + + <dependency> + <groupId>jboss</groupId> + <artifactId>jbpm</artifactId> + <version>3.1.1</version> + </dependency> + + <!-- for the transaction interrupt EJB3 interceptor --> + <dependency> + <groupId>org.jboss.transaction</groupId> + <artifactId>jboss-jta</artifactId> + <!-- NOTE: The version is defined in the root POM's dependencyManagement section. --> + <scope>provided</scope> <!-- by JBossAS --> + </dependency> + + <dependency> + <groupId>org.opensymphony.quartz</groupId> + <artifactId>quartz</artifactId> + <!-- NOTE: The version is defined in the root POM's dependencyManagement section. --> + <scope>provided</scope> <!-- by JBossAS itself, which the container build has packaged with 1.6.5 --> + </dependency> + + <dependency> + <groupId>org.opensymphony.quartz</groupId> + <artifactId>quartz-oracle</artifactId> + <!-- NOTE: The version is defined in the root POM's dependencyManagement section. --> + <scope>provided</scope> <!-- by JBossAS itself, which the container build has packaged with 1.6.5 --> + </dependency> + + <dependency> + <groupId>org.easymock</groupId> + <artifactId>easymockclassextension</artifactId> + <version>2.2</version> + <scope>test</scope> + <!-- somehow this is needed otherwise the hibernate stuff doesn't initialize in our tests --> + </dependency> + + <dependency> + <groupId>org.snmp4j</groupId> + <artifactId>snmp4j</artifactId> + <version>1.8.2</version> + </dependency> + + <!-- required by RHQ server classes, as well as EJB3 Embedded --> + <dependency> + <groupId>oswego-concurrent</groupId> + <artifactId>concurrent</artifactId> + <version>1.3.4</version> + </dependency> + + <!-- TODO: Why is this needed? --> + <dependency> + <groupId>postgresql</groupId> + <artifactId>postgresql</artifactId> + <!--<scope>test</scope>--> + </dependency> + + <dependency> + <groupId>rss4j</groupId> + <artifactId>rss4j</artifactId> + <version>0.92-on.2</version> + </dependency> + + <dependency> + <groupId>tomcat</groupId> + <artifactId>catalina</artifactId> + <version>5.5.20</version> + <scope>provided</scope> + </dependency> + + <dependency> + <groupId>tomcat</groupId> + <artifactId>tomcat-jk</artifactId> + <version>4.1.31</version> + <scope>provided</scope> + </dependency> + + <!-- Needed by com.jboss.jbossnetwork.apl.actions.xml.XPathProcessor; TODO: Remove once APL has been excised. --> + <dependency> + <groupId>xalan</groupId> + <artifactId>xalan</artifactId> + <version>2.5.1</version> + <scope>provided</scope> + </dependency> + + <dependency> + <groupId>com.jcraft</groupId> + <artifactId>jsch</artifactId> + <version>0.1.29</version> + </dependency> + + <dependency> + <groupId>org.jboss.el</groupId> + <artifactId>jboss-el</artifactId> + <version>2.0.1.GA</version> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>org.freemarker</groupId> + <artifactId>freemarker</artifactId> + <version>2.3.18</version> + <scope>provided</scope> + </dependency> + + <dependency> + <groupId>org.rhq</groupId> + <artifactId>rhq-core-dbutils</artifactId> + <version>${project.version}</version> + <exclusions> + <exclusion> + <groupId>ant</groupId> + <artifactId>ant</artifactId> + </exclusion> + </exclusions> + </dependency> + </dependencies> + + <build> + <testResources> + <testResource> + <directory>src/test/resources</directory> + <filtering>true</filtering> + </testResource> + </testResources> + + <plugins> + <plugin> + <artifactId>maven-antrun-plugin</artifactId> + <executions> + + <execution> + <phase>process-classes</phase> + <configuration> + <tasks> + <!-- generate the I18N resource bundles --> + <taskdef name="i18n" classpathref="maven.runtime.classpath" classname="mazz.i18n.ant.I18NAntTask" /> + + <i18n outputdir="${project.build.outputDirectory}" defaultlocale="en" verbose="false" append="false" verify="true"> + <classpath refid="maven.runtime.classpath" /> + <classfileset dir="${project.build.outputDirectory}"> + <include name="**/ServerI18NResourceKeys.class" /> + <include name="**/AlertI18NResourceKeys.class" /> + </classfileset> + </i18n> + + <!-- create our rhq-server-version.properties file that goes in our jar --> + <tstamp> + <format property="build.time" pattern="dd.MMM.yyyy HH.mm.ss z" /> + </tstamp> + + <echo file="${project.build.outputDirectory}/rhq-server-version.properties" append="false">Product-Name=${rhq.product.name} +Product-Version=${project.version} +Module-Name=${project.name} +Module-Version=${project.version} +Build-Number=${buildNumber} +Build-Date=${build.time} +Build-Jdk-Vendor=${java.vendor} +Build-Jdk=${java.version} +Build-OS-Name=${os.name} +Build-OS-Version=${os.version} +</echo> + </tasks> + </configuration> + <goals> + <goal>run</goal> + </goals> + </execution> + + <!-- in order to get JMS to work properly in embedded test container, extract jms-rs.rar classes --> + <execution> + <id>Extract JMS classes from RAR needed for JMS tests</id> + <phase>process-classes</phase> + <configuration> + <tasks> + <unzip src="src/test/resources/jms-ra.rar" dest="target"> + <patternset> + <include name="jms-ra.jar"/> + </patternset> + </unzip> + <unzip src="target/jms-ra.jar" dest="target/test-classes"> + <patternset> + <include name="org/**"/> + </patternset> + </unzip> + </tasks> + </configuration> + <goals> + <goal>run</goal> + </goals> + </execution> + + </executions> + </plugin> + </plugins> + </build> +</project> diff --git a/modules/enterprise/server/itests/src/test/java/org/rhq/enterprise/server/drift/DriftServerPluginService.java b/modules/enterprise/server/itests/src/test/java/org/rhq/enterprise/server/drift/DriftServerPluginService.java new file mode 100644 index 0000000..64c6537 --- /dev/null +++ b/modules/enterprise/server/itests/src/test/java/org/rhq/enterprise/server/drift/DriftServerPluginService.java @@ -0,0 +1,146 @@ +/* + * RHQ Management Platform + * Copyright (C) 2011 Red Hat, Inc. + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation version 2 of the License. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +package org.rhq.enterprise.server.drift; + +import java.io.File; +import java.net.URL; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.rhq.core.domain.configuration.Configuration; +import org.rhq.core.domain.configuration.definition.ConfigurationDefinition; +import org.rhq.core.domain.plugin.PluginKey; +import org.rhq.core.domain.plugin.PluginStatusType; +import org.rhq.core.domain.plugin.ServerPlugin; +import org.rhq.core.util.MessageDigestGenerator; +import org.rhq.enterprise.server.plugin.pc.AbstractTypeServerPluginContainer; +import org.rhq.enterprise.server.plugin.pc.MasterServerPluginContainer; +import org.rhq.enterprise.server.plugin.pc.MasterServerPluginContainerConfiguration; +import org.rhq.enterprise.server.plugin.pc.ServerPluginEnvironment; +import org.rhq.enterprise.server.plugin.pc.ServerPluginManager; +import org.rhq.enterprise.server.plugin.pc.ServerPluginService; +import org.rhq.enterprise.server.plugin.pc.ServerPluginType; +import org.rhq.enterprise.server.plugin.pc.drift.DriftServerPluginContainer; +import org.rhq.enterprise.server.plugin.pc.drift.DriftServerPluginManager; +import org.rhq.enterprise.server.xmlschema.ServerPluginDescriptorMetadataParser; +import org.rhq.enterprise.server.xmlschema.generated.serverplugin.ServerPluginDescriptorType; + +public class DriftServerPluginService extends ServerPluginService implements DriftServerPluginServiceMBean { + + public TestMasterServerPluginContainer master; + public MasterServerPluginContainerConfiguration masterConfig; + + public DriftServerPluginService() { + // build the config at constructor time so tests have it even before the PC is initialized + File dir = new File(System.getProperty("java.io.tmpdir"), "test-server-plugins"); + this.masterConfig = new MasterServerPluginContainerConfiguration(dir, dir, dir, null); + } + + @Override + public MasterServerPluginContainer createMasterPluginContainer() { + this.master = new TestMasterServerPluginContainer(); + this.master.initialize(this.masterConfig); + return this.master; + } + + class TestMasterServerPluginContainer extends MasterServerPluginContainer { + @Override + protected ClassLoader createRootServerPluginClassLoader() { + return getClass().getClassLoader(); + } + + @Override + protected Map<URL, ? extends ServerPluginDescriptorType> preloadAllPlugins() throws Exception { + // if our test never setup any plugins, ignore it and just return an empty map + File pluginDir = getConfiguration().getPluginDirectory(); + if (pluginDir == null || pluginDir.listFiles() == null || pluginDir.listFiles().length == 0) { + return new HashMap<URL, ServerPluginDescriptorType>(); + } else { + return super.preloadAllPlugins(); + } + } + + @Override + protected List<PluginKey> getDisabledPluginKeys() { + // in the real world, the db is checked for enable flag, here we say all plugins are enabled + return new ArrayList<PluginKey>(); + } + + @Override + protected List<AbstractTypeServerPluginContainer> createPluginContainers() { + ArrayList<AbstractTypeServerPluginContainer> pcs = new ArrayList<AbstractTypeServerPluginContainer>(1); + DriftServerPluginContainer driftPC = new TestDriftServerPluginContainer(this); + pcs.add(driftPC); + + return pcs; + } + } + + class TestDriftServerPluginContainer extends DriftServerPluginContainer { + public TestDriftServerPluginContainer(MasterServerPluginContainer master) { + super(master); + } + + @Override + protected ServerPluginManager createPluginManager() { + return new TestDriftServerPluginManager(this); + } + } + + class TestDriftServerPluginManager extends DriftServerPluginManager { + public TestDriftServerPluginManager(DriftServerPluginContainer pc) { + super(pc); + } + + @Override + protected ServerPlugin getPlugin(ServerPluginEnvironment env) { + try { + Configuration pluginConfig = null; + Configuration scheduledJobsConfig = null; + ConfigurationDefinition configDef; + + ServerPluginDescriptorType pluginDescriptor = env.getPluginDescriptor(); + + configDef = ServerPluginDescriptorMetadataParser.getPluginConfigurationDefinition(pluginDescriptor); + if (configDef != null) { + pluginConfig = configDef.getDefaultTemplate().createConfiguration(); + } + + configDef = ServerPluginDescriptorMetadataParser.getScheduledJobsDefinition(pluginDescriptor); + if (configDef != null) { + scheduledJobsConfig = configDef.getDefaultTemplate().createConfiguration(); + } + + File pluginFile = new File(env.getPluginUrl().toURI()); + ServerPlugin plugin = new ServerPlugin(0, env.getPluginKey().getPluginName(), pluginFile.getName(), + pluginDescriptor.getDisplayName(), true, PluginStatusType.INSTALLED, pluginDescriptor + .getDescription(), "", MessageDigestGenerator.getDigestString(pluginFile), pluginDescriptor + .getVersion(), pluginDescriptor.getVersion(), pluginConfig, scheduledJobsConfig, + new ServerPluginType(pluginDescriptor).stringify(), System.currentTimeMillis(), System + .currentTimeMillis()); + return plugin; + } catch (Exception e) { + throw new RuntimeException(e); + } + } + } +} diff --git a/modules/enterprise/server/itests/src/test/java/org/rhq/enterprise/server/drift/DriftServerPluginServiceMBean.java b/modules/enterprise/server/itests/src/test/java/org/rhq/enterprise/server/drift/DriftServerPluginServiceMBean.java new file mode 100644 index 0000000..d38374e --- /dev/null +++ b/modules/enterprise/server/itests/src/test/java/org/rhq/enterprise/server/drift/DriftServerPluginServiceMBean.java @@ -0,0 +1,25 @@ +/* + * RHQ Management Platform + * Copyright (C) 2011 Red Hat, Inc. + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation version 2 of the License. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +package org.rhq.enterprise.server.drift; + +import org.rhq.enterprise.server.plugin.pc.ServerPluginServiceManagement; + +public interface DriftServerPluginServiceMBean extends ServerPluginServiceManagement { +} diff --git a/modules/enterprise/server/itests/src/test/java/org/rhq/enterprise/server/drift/DriftServerTest.java b/modules/enterprise/server/itests/src/test/java/org/rhq/enterprise/server/drift/DriftServerTest.java new file mode 100644 index 0000000..7db3365 --- /dev/null +++ b/modules/enterprise/server/itests/src/test/java/org/rhq/enterprise/server/drift/DriftServerTest.java @@ -0,0 +1,241 @@ +/* + * RHQ Management Platform + * Copyright (C) 2011 Red Hat, Inc. + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation version 2 of the License. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +package org.rhq.enterprise.server.drift; + +import static org.rhq.core.domain.resource.ResourceCategory.SERVER; +import static org.rhq.enterprise.server.util.LookupUtil.getSubjectManager; + +import java.io.File; +import java.lang.reflect.Method; +import java.util.List; + +import javax.persistence.EntityManager; +import javax.persistence.NoResultException; +import javax.persistence.NonUniqueResultException; + +import org.apache.commons.io.FileUtils; +import org.testng.annotations.AfterClass; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +import org.rhq.core.domain.auth.Subject; +import org.rhq.core.domain.drift.Drift; +import org.rhq.core.domain.drift.DriftDefinition; +import org.rhq.core.domain.drift.DriftDefinitionTemplate; +import org.rhq.core.domain.resource.Agent; +import org.rhq.core.domain.resource.Resource; +import org.rhq.core.domain.resource.ResourceType; +import org.rhq.core.domain.shared.ResourceBuilder; +import org.rhq.core.domain.shared.ResourceTypeBuilder; +import org.rhq.enterprise.server.plugin.ServerPluginsLocal; +import org.rhq.enterprise.server.test.AbstractEJB3Test; +import org.rhq.enterprise.server.test.TestServerCommunicationsService; +import org.rhq.test.TransactionCallback; + +@Test(groups = "drift") +public class DriftServerTest extends AbstractEJB3Test { + + protected final String RESOURCE_TYPE_NAME = getClass().getSimpleName() + "_RESOURCE_TYPE"; + + protected final String AGENT_NAME = getClass().getSimpleName() + "_AGENT"; + + protected final String RESOURCE_NAME = getClass().getSimpleName() + "_RESOURCE"; + + private ServerPluginsLocal serverPluginsMgr; + + protected DriftServerPluginService driftServerPluginService; + + protected TestServerCommunicationsService agentServiceContainer; + + protected ResourceType resourceType; + + protected Agent agent; + + protected Resource resource; + + @BeforeMethod + public void initServices(Method testMethod) throws Exception { + initDriftServer(); + initAgentServices(); + + InitDB annotation = testMethod.getAnnotation(InitDB.class); + if (annotation == null || annotation.value()) { + initDB(); + } + } + + private void initDriftServer() throws Exception { + driftServerPluginService = new DriftServerPluginService(); + prepareCustomServerPluginService(driftServerPluginService); + driftServerPluginService.masterConfig.getPluginDirectory().mkdirs(); + + File jpaDriftPlugin = new File("../plugins/drift-rhq/target/rhq-serverplugin-drift-4.1.0-SNAPSHOT.jar"); + assertTrue("Drift server plugin JAR file not found at" + jpaDriftPlugin.getPath(), jpaDriftPlugin.exists()); + FileUtils.copyFileToDirectory(jpaDriftPlugin, driftServerPluginService.masterConfig.getPluginDirectory()); + + driftServerPluginService.startMasterPluginContainer(); + + //serverPluginsMgr = LookupUtil.getServerPlugins(); + } + + private void initAgentServices() { + agentServiceContainer = prepareForTestAgents(); + agentServiceContainer.driftService = new TestDefService(); + } + + @AfterMethod(inheritGroups = true) + public void shutDownServices() throws Exception { + shutDownDriftServer(); + shutDownAgentServices(); + } + + private void shutDownDriftServer() throws Exception { + unprepareServerPluginService(); + driftServerPluginService.stopMasterPluginContainer(); + } + + private void shutDownAgentServices() { + agentServiceContainer = null; + unprepareForTestAgents(); + } + + @AfterClass(inheritGroups = true) + public void cleanUpDB() throws Exception { + purgeDB(); + executeInTransaction(new TransactionCallback() { + @Override + public void execute() throws Exception { + purgeDB(getEntityManager()); + } + }); + } + + private void initDB() throws Exception { + purgeDB(); + executeInTransaction(new TransactionCallback() { + @Override + public void execute() throws Exception { + EntityManager em = getEntityManager(); + initResourceType(); + initAgent(); + initResource(); + + em.persist(resourceType); + em.persist(agent); + resource.setAgent(agent); + em.persist(resource); + + initDB(em); + } + }); + } + + private void purgeDB() { + executeInTransaction(new TransactionCallback() { + @Override + public void execute() throws Exception { + EntityManager em = getEntityManager(); + + em.createQuery("delete from JPADrift ").executeUpdate(); + em.createQuery("delete from JPADriftChangeSet").executeUpdate(); + em.createQuery("delete from JPADriftSet").executeUpdate(); + em.createQuery("delete from JPADriftFile").executeUpdate(); + em.createQuery("delete from DriftDefinition").executeUpdate(); + em.createQuery("delete from DriftDefinitionTemplate").executeUpdate(); + + deleteEntity(Resource.class, RESOURCE_NAME, em); + deleteEntity(Agent.class, AGENT_NAME, em); + deleteEntity(ResourceType.class, RESOURCE_TYPE_NAME, em); + + purgeDB(em); + } + }); + } + + protected void purgeDB(EntityManager em) { + } + + protected void initDB(EntityManager em) { + } + + protected void deleteEntity(Class<?> clazz, String name, EntityManager em) { + try { + Object entity = em.createQuery( + "select entity from " + clazz.getSimpleName() + " entity where entity.name = :name") + .setParameter("name", name) + .getSingleResult(); + em.remove(entity); + } catch (NoResultException e) { + // we can ignore no results because this code will run when the db + // is empty and we expect no results in that case + } catch (NonUniqueResultException e) { + // we will fail here to let the person running the test know that + // the database may not be in a consistent state + fail("Purging " + name + " failed. Expected to find one instance of " + clazz.getSimpleName() + + " but found more than one. The database may not be in a consistent state."); + } + } + + protected void initResourceType() { + resourceType = new ResourceTypeBuilder().createResourceType() + .withId(0) + .withName(RESOURCE_TYPE_NAME) + .withCategory(SERVER) + .withPlugin(RESOURCE_TYPE_NAME.toLowerCase()) + .build(); + } + + protected void initAgent() { + agent = new Agent(AGENT_NAME, "localhost", 1, "", AGENT_NAME + "_TOKEN"); + } + + protected void initResource() { + resource = new ResourceBuilder().createResource() + .withId(0) + .withName(RESOURCE_NAME) + .withResourceKey(RESOURCE_NAME) + .withRandomUuid() + .withResourceType(resourceType) + .build(); + } + + protected Subject getOverlord() { + return getSubjectManager().getOverlord(); + } + + protected String toString(DriftDefinition def) { + return "DriftDefinition[id: " + def.getId() + ", name: " + def.getName() + "]"; + } + + protected String toString(DriftDefinitionTemplate template) { + return DriftDefinitionTemplate.class.getSimpleName() + "[id: " + template.getId() + ", name: " + + template.getName() + "]"; + } + + protected Drift findDriftByPath(List<? extends Drift> drifts, String path) { + for (Drift drift : drifts) { + if (drift.getPath().equals(path)) { + return drift; + } + } + return null; + } +} diff --git a/modules/enterprise/server/itests/src/test/java/org/rhq/enterprise/server/drift/DriftTemplateManagerBeanTest.java b/modules/enterprise/server/itests/src/test/java/org/rhq/enterprise/server/drift/DriftTemplateManagerBeanTest.java new file mode 100644 index 0000000..de93b74 --- /dev/null +++ b/modules/enterprise/server/itests/src/test/java/org/rhq/enterprise/server/drift/DriftTemplateManagerBeanTest.java @@ -0,0 +1,603 @@ +/* + * RHQ Management Platform + * Copyright (C) 2011 Red Hat, Inc. + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation version 2 of the License. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +package org.rhq.enterprise.server.drift; + +import static java.util.Arrays.asList; +import static org.rhq.core.domain.common.EntityContext.forResource; +import static org.rhq.core.domain.drift.DriftCategory.FILE_ADDED; +import static org.rhq.core.domain.drift.DriftChangeSetCategory.COVERAGE; +import static org.rhq.core.domain.drift.DriftChangeSetCategory.DRIFT; +import static org.rhq.core.domain.drift.DriftConfigurationDefinition.BaseDirValueContext.fileSystem; +import static org.rhq.core.domain.drift.DriftConfigurationDefinition.DriftHandlingMode.normal; +import static org.rhq.core.domain.drift.DriftConfigurationDefinition.DriftHandlingMode.plannedChanges; +import static org.rhq.core.domain.drift.DriftDefinitionComparator.CompareMode.BOTH_BASE_INFO_AND_DIRECTORY_SPECIFICATIONS; +import static org.rhq.enterprise.server.safeinvoker.HibernateDetachUtility.SerializationType.SERIALIZATION; +import static org.rhq.enterprise.server.util.LookupUtil.getDriftManager; +import static org.rhq.enterprise.server.util.LookupUtil.getDriftTemplateManager; +import static org.rhq.test.AssertUtils.assertPropertiesMatch; + +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; + +import javax.ejb.EJBException; +import javax.persistence.EntityManager; + +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; + +import org.rhq.core.domain.configuration.Configuration; +import org.rhq.core.domain.criteria.DriftDefinitionCriteria; +import org.rhq.core.domain.criteria.DriftDefinitionTemplateCriteria; +import org.rhq.core.domain.criteria.GenericDriftChangeSetCriteria; +import org.rhq.core.domain.criteria.JPADriftChangeSetCriteria; +import org.rhq.core.domain.drift.Drift; +import org.rhq.core.domain.drift.DriftChangeSet; +import org.rhq.core.domain.drift.DriftDefinition; +import org.rhq.core.domain.drift.DriftDefinitionComparator; +import org.rhq.core.domain.drift.DriftDefinitionTemplate; +import org.rhq.core.domain.drift.DriftSnapshot; +import org.rhq.core.domain.drift.Filter; +import org.rhq.core.domain.drift.JPADrift; +import org.rhq.core.domain.drift.JPADriftChangeSet; +import org.rhq.core.domain.drift.JPADriftFile; +import org.rhq.core.domain.drift.JPADriftSet; +import org.rhq.core.domain.resource.Resource; +import org.rhq.core.domain.resource.ResourceType; +import org.rhq.core.domain.util.PageList; +import org.rhq.enterprise.server.safeinvoker.HibernateDetachUtility; +import org.rhq.test.AssertUtils; +import org.rhq.test.TransactionCallback; + +public class DriftTemplateManagerBeanTest extends DriftServerTest { + + private DriftTemplateManagerLocal templateMgr; + + private DriftManagerLocal driftMgr; + + private List<Resource> resources = new LinkedList<Resource>(); + + private JPADrift drift1; + private JPADrift drift2; + private JPADriftFile driftFile1; + private JPADriftFile driftFile2; + + @BeforeClass + public void initClass() { + templateMgr = getDriftTemplateManager(); + driftMgr = getDriftManager(); + + } + + @Override + protected void initDB(EntityManager em) { + agentServiceContainer.driftService = new TestDefService() { + @Override + public void unscheduleDriftDetection(int resourceId, DriftDefinition driftDef) { + detach(driftDef); + } + + @Override + public void updateDriftDetection(int resourceId, DriftDefinition driftDef) { + detach(driftDef); + } + + @Override + public void updateDriftDetection(int resourceId, DriftDefinition driftDef, DriftSnapshot driftSnapshot) { + detach(driftDef); + detach(driftSnapshot); + } + + private void detach(Object object) { + try { + HibernateDetachUtility.nullOutUninitializedFields(object, SERIALIZATION); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + }; + } + + public void createNewTemplate() { + final DriftDefinition definition = new DriftDefinition(new Configuration()); + definition.setName("test::createNewTemplate"); + definition.setEnabled(true); + definition.setDriftHandlingMode(normal); + definition.setInterval(2400L); + definition.setBasedir(new DriftDefinition.BaseDirectory(fileSystem, "/foo/bar/test")); + + final DriftDefinitionTemplate newTemplate = templateMgr.createTemplate(getOverlord(), resourceType.getId(), + true, definition); + + executeInTransaction(new TransactionCallback() { + @Override + public void execute() throws Exception { + EntityManager em = getEntityManager(); + + ResourceType updatedType = em.find(ResourceType.class, resourceType.getId()); + + assertEquals("Failed to add new drift definition to resource type", 1, updatedType + .getDriftDefinitionTemplates().size()); + + DriftDefinitionTemplate expectedTemplate = new DriftDefinitionTemplate(); + expectedTemplate.setTemplateDefinition(definition); + expectedTemplate.setUserDefined(true); + + assertDriftTemplateEquals("Failed to save template", expectedTemplate, newTemplate); + assertTrue("The template should have its id set", newTemplate.getId() > 0); + } + }); + } + + public void createTemplateForNegativeUpdateTests() { + DriftDefinition definition = new DriftDefinition(new Configuration()); + definition.setName("test::createTemplateForNegativeUpdateTests"); + definition.setEnabled(true); + definition.setDriftHandlingMode(normal); + definition.setInterval(2400L); + definition.setBasedir(new DriftDefinition.BaseDirectory(fileSystem, "/foo/bar/test")); + + templateMgr.createTemplate(getOverlord(), resourceType.getId(), true, definition); + + assertNotNull("Failed to load template", loadTemplate(definition.getName())); + } + + @Test(dependsOnMethods = "createTemplateForNegativeUpdateTests", + expectedExceptions = EJBException.class, + expectedExceptionsMessageRegExp = ".*base directory.*cannot be modified") + @InitDB(false) + public void doNotAllowBaseDirToBeUpdated() { + DriftDefinitionTemplate template = loadTemplate("test::createTemplateForNegativeUpdateTests"); + DriftDefinition definition = template.getTemplateDefinition(); + definition.setBasedir(new DriftDefinition.BaseDirectory(fileSystem, "/foo/bar/TEST")); + + templateMgr.updateTemplate(getOverlord(), template); + } + + @Test(dependsOnMethods = "createTemplateForNegativeUpdateTests", + expectedExceptions = EJBException.class, + expectedExceptionsMessageRegExp = ".*filters.*cannot be modified") + @InitDB(false) + public void doNotAllowFiltersToBeUpdated() { + DriftDefinitionTemplate template = loadTemplate("test::createTemplateForNegativeUpdateTests"); + DriftDefinition definition = template.getTemplateDefinition(); + definition.addExclude(new Filter("/foo/bar/TEST/conf", "*.xml")); + + templateMgr.updateTemplate(getOverlord(), template); + } + + @Test(dependsOnMethods = "createTemplateForNegativeUpdateTests", + expectedExceptions = EJBException.class, + expectedExceptionsMessageRegExp = ".*name.*cannot be modified") + @InitDB(false) + public void doNotAllowTemplateNameToBeUpdated() { + DriftDefinitionTemplate template = loadTemplate("test::createTemplateForNegativeUpdateTests"); + template.setName("A new name"); + + templateMgr.updateTemplate(getOverlord(), template); + } + + public void createAndUpdateTemplate() { + // create the template + DriftDefinition definition = new DriftDefinition(new Configuration()); + definition.setName("test::updateTemplate"); + definition.setDescription("update template test"); + definition.setEnabled(true); + definition.setDriftHandlingMode(normal); + definition.setInterval(2400L); + definition.setBasedir(new DriftDefinition.BaseDirectory(fileSystem, "/foo/bar/test")); + + DriftDefinitionTemplate template = templateMgr.createTemplate(getOverlord(), resourceType.getId(), true, + definition); + + // next create some definitions from the template + final DriftDefinition attachedDef1 = createDefinition(template, "attachedDef1", true); + final DriftDefinition attachedDef2 = createDefinition(template, "attachedDef2", true); + final DriftDefinition detachedDef1 = createDefinition(template, "detachedDef1", false); + final DriftDefinition detachedDef2 = createDefinition(template, "detachedDef2", false); + + driftMgr.updateDriftDefinition(getOverlord(), forResource(resource.getId()), attachedDef1); + driftMgr.updateDriftDefinition(getOverlord(), forResource(resource.getId()), attachedDef2); + driftMgr.updateDriftDefinition(getOverlord(), forResource(resource.getId()), detachedDef1); + driftMgr.updateDriftDefinition(getOverlord(), forResource(resource.getId()), detachedDef2); + + // update the template + final DriftDefinition newTemplateDef = template.getTemplateDefinition(); + newTemplateDef.setInterval(4800L); + newTemplateDef.setDriftHandlingMode(plannedChanges); + newTemplateDef.setEnabled(false); + + templateMgr.updateTemplate(getOverlord(), template); + + // verify that the tempalte has been updated + final DriftDefinitionTemplate updatedTemplate = loadTemplate(template.getName()); + AssertUtils.assertPropertiesMatch("Failed to update template", template, updatedTemplate, "resourceType", + "driftDefinitions", "templateDefinition"); + + // verify that attached definitions are updated. + for (DriftDefinition def : asList(attachedDef1, attachedDef2)) { + DriftDefinition updatedDef = loadDefinition(def.getId()); + String msg = "Failed to propagate update to attached definition " + toString(updatedDef) + " - "; + DriftDefinition updatedTemplateDef = updatedTemplate.getTemplateDefinition(); + + assertEquals(msg + "enabled property not updated", updatedTemplateDef.isEnabled(), + updatedDef.isEnabled()); + assertEquals(msg + "driftHandlingMode property not updated", + updatedTemplateDef.getDriftHandlingMode(), updatedDef.getDriftHandlingMode()); + assertEquals(msg + "interval property not updated", updatedTemplateDef.getInterval(), + updatedDef.getInterval()); + } + + // verify that the detached definitions have not been updated. + for (DriftDefinition def : asList(detachedDef1, detachedDef2)) { + DriftDefinition defAfterUpdate = loadDefinition(def.getId()); + String msg = "Detached definition " + toString(def) + " should not get updated - "; + + assertEquals(msg + "enabled property was modified", def.isEnabled(), defAfterUpdate.isEnabled()); + assertEquals(msg + "driftHandlingMode property was modified", def.getDriftHandlingMode(), + defAfterUpdate.getDriftHandlingMode()); + assertEquals(msg + "interval property was modified", def.getInterval(), defAfterUpdate.getInterval()); + } + } + + + @SuppressWarnings("unchecked") + public void pinTemplate() throws Exception { + // First create the template + final DriftDefinition templateDef = new DriftDefinition(new Configuration()); + templateDef.setName("test::pinTemplate"); + templateDef.setEnabled(true); + templateDef.setDriftHandlingMode(normal); + templateDef.setInterval(2400L); + templateDef.setBasedir(new DriftDefinition.BaseDirectory(fileSystem, "/foo/bar/test")); + + final DriftDefinitionTemplate template = templateMgr.createTemplate(getOverlord(), + resourceType.getId(), true, templateDef); + + // next create some resource level definitions + final DriftDefinition attachedDef1 = createDefinition(template, "attachedDef1", true); + final DriftDefinition attachedDef2 = createDefinition(template, "attachedDef2", true); + final DriftDefinition detachedDef1 = createDefinition(template, "detachedDef1", false); + final DriftDefinition detachedDef2 = createDefinition(template, "detachedDef2", false); + + // create initial change set from which the snapshot will be generated + final JPADriftChangeSet changeSet0 = new JPADriftChangeSet(resource, 0, COVERAGE, attachedDef1); + + driftFile1 = new JPADriftFile("a1b2c3"); + drift1 = new JPADrift(changeSet0, "drift.1", FILE_ADDED, null, driftFile1); + + final JPADriftSet driftSet = new JPADriftSet(); + driftSet.addDrift(drift1); + + // create change set v1 + driftFile2 = new JPADriftFile("1a2b3c"); + final JPADriftChangeSet changeSet1 = new JPADriftChangeSet(resource, 1, DRIFT, attachedDef1); + drift2 = new JPADrift(changeSet1, "drift.2", FILE_ADDED, null, driftFile2); + + executeInTransaction(new TransactionCallback() { + @Override + public void execute() throws Exception { + EntityManager em = getEntityManager(); + + em.persist(attachedDef1); + + em.persist(driftFile1); + em.persist(driftFile2); + + em.persist(changeSet0); + em.persist(driftSet); + changeSet0.setInitialDriftSet(driftSet); + em.merge(changeSet0); + + em.persist(changeSet1); + em.persist(drift2); + + em.persist(attachedDef2); + em.persist(detachedDef1); + em.persist(detachedDef2); + } + }); + + // now we pin the snapshot to the template + templateMgr.pinTemplate(getOverlord(), template.getId(), attachedDef1.getId(), 1); + + // verify that the template is now pinned + DriftDefinitionTemplate updatedTemplate = loadTemplate(template.getName()); + assertTrue("Template should be marked pinned", updatedTemplate.isPinned()); + } + + @Test(dependsOnMethods = "pinTemplate") + @InitDB(false) + public void persistChangeSetWhenTemplateGetsPinned() throws Exception { + DriftDefinitionTemplate template = loadTemplate("test::pinTemplate"); + + GenericDriftChangeSetCriteria criteria = new GenericDriftChangeSetCriteria(); + criteria.addFilterId(template.getChangeSetId()); + + PageList<? extends DriftChangeSet<?>> changeSets = driftMgr.findDriftChangeSetsByCriteria(getOverlord(), + criteria); + + assertEquals("Expected to find change set for pinned template", 1, changeSets.size()); + + JPADriftChangeSet expectedChangeSet = new JPADriftChangeSet(resource, 1, COVERAGE, null); + List<? extends Drift> expectedDrifts = asList( + new JPADrift(expectedChangeSet, "drift.1", FILE_ADDED, null, driftFile1), + new JPADrift(expectedChangeSet, drift2.getPath(), FILE_ADDED, null, driftFile2)); + + DriftChangeSet<?> actualChangeSet = changeSets.get(0); + List<? extends Drift> actualDrifts = new ArrayList(actualChangeSet.getDrifts()); + + AssertUtils.assertCollectionMatchesNoOrder( + "Expected to find drifts from change sets 1 and 2 in the template change set", + (List<Drift>) expectedDrifts, (List<Drift>) actualDrifts, "id", "ctime", "changeSet", "newDriftFile"); + + // we need to compare the newDriftFile properties separately because + // assertCollectionMatchesNoOrder compares properties via equals() and JPADriftFile + // does not implement equals. + assertPropertiesMatch(drift1.getNewDriftFile(), findDriftByPath(actualDrifts, "drift.1").getNewDriftFile(), + "The newDriftFile property was not set correctly for " + drift1); + assertPropertiesMatch(drift2.getNewDriftFile(), findDriftByPath(actualDrifts, "drift.2").getNewDriftFile(), + "The newDriftFile property was not set correctly for " + drift1); + } + + @Test(dependsOnMethods = "pinTemplate") + @InitDB(false) + public void updateAttachedDefinitionsWhenTemplateGetsPinned() throws Exception { + DriftDefinitionTemplate template = loadTemplate("test::pinTemplate"); + + // get the attached definitions + List<DriftDefinition> attachedDefs = new LinkedList<DriftDefinition>(); + for (DriftDefinition d : template.getDriftDefinitions()) { + if (d.isAttached() && (d.getName().equals("attachedDef1") || d.getName().equals("attachedDef2"))) { + attachedDefs.add(d); + } + } + assertEquals("Failed to get attached definitions for " + toString(template), 2, attachedDefs.size()); + assertDefinitionIsPinned(attachedDefs.get(0)); + assertDefinitionIsPinned(attachedDefs.get(1)); + } + + @Test(dependsOnMethods = "pinTemplate") + @InitDB(false) + public void doNotUpdateDetachedDefinitionsWhenTemplateGetsPinned() throws Exception { + DriftDefinitionTemplate template = loadTemplate("test::pinTemplate"); + + // get the detached definitions + List<DriftDefinition> detachedDefs = new LinkedList<DriftDefinition>(); + for (DriftDefinition d : template.getDriftDefinitions()) { + if (!d.isAttached() && (d.getName().equals("detachedDef1") || d.getName().equals("detachedDef2"))) { + detachedDefs.add(d); + } + } + assertEquals("Failed to get detached definitions for " + toString(template), 2, detachedDefs.size()); + assertDefinitionIsNotPinned(detachedDefs.get(0)); + assertDefinitionIsNotPinned(detachedDefs.get(1)); + } + + public void deleteTemplate() throws Exception { + // first create the template + final DriftDefinition templateDef = new DriftDefinition(new Configuration()); + templateDef.setName("test::pinTemplate"); + templateDef.setEnabled(true); + templateDef.setDriftHandlingMode(normal); + templateDef.setInterval(2400L); + templateDef.setBasedir(new DriftDefinition.BaseDirectory(fileSystem, "/foo/bar/test")); + + final DriftDefinitionTemplate template = templateMgr.createTemplate(getOverlord(), + resourceType.getId(), true, templateDef); + + // next create some resource level definitions + final DriftDefinition attachedDef1 = createDefinition(template, "attachedDef1", true); + final DriftDefinition attachedDef2 = createDefinition(template, "attachedDef2", true); + final DriftDefinition detachedDef1 = createDefinition(template, "detachedDef1", false); + final DriftDefinition detachedDef2 = createDefinition(template, "detachedDef2", false); + + // create some change sets + final JPADriftChangeSet changeSet0 = new JPADriftChangeSet(resource, 0, COVERAGE, attachedDef1); + + driftFile1 = new JPADriftFile("a1b2c3"); + drift1 = new JPADrift(changeSet0, "drift.1", FILE_ADDED, null, driftFile1); + + final JPADriftSet driftSet0 = new JPADriftSet(); + driftSet0.addDrift(drift1); + + final JPADriftChangeSet changeSet1 = new JPADriftChangeSet(resource, 0, DRIFT, detachedDef1); + + driftFile2 = new JPADriftFile("1a2b3c"); + drift2 = new JPADrift(changeSet1, "drift.2", FILE_ADDED, null, driftFile2); + + final JPADriftSet driftSet1 = new JPADriftSet(); + driftSet1.addDrift(drift2); + + executeInTransaction(new TransactionCallback() { + @Override + public void execute() throws Exception { + EntityManager em = getEntityManager(); + + em.persist(attachedDef1); + em.persist(attachedDef2); + em.persist(detachedDef1); + em.persist(detachedDef2); + + em.persist(driftFile1); + em.persist(driftFile2); + + em.persist(changeSet0); + em.persist(driftSet0); + changeSet0.setInitialDriftSet(driftSet0); + em.merge(changeSet0); + + em.persist(changeSet1); + em.persist(driftSet1); + changeSet1.setInitialDriftSet(driftSet1); + em.merge(changeSet1); + } + }); + + // delete the template + templateMgr.deleteTemplate(getOverlord(), template.getId()); + + // verify that attached definitions along with their change sets have + // been deleted + assertNull("Change sets belonging to attached definitions should be deleted", loadChangeSet(changeSet0.getId())); + assertNull("Attached definition " + toString(attachedDef1) + " should be deleted", + loadDefinition(attachedDef1.getId())); + assertNull("Attached definition " + toString(attachedDef2) + " should be deleted", + loadDefinition(attachedDef2.getId())); + + // verify that detached definitions along with their change sets have not been deleted + assertNotNull("Change sets belonging to detached definitions should not be deleted", + loadChangeSet(changeSet1.getId())); + assertDetachedDefinitionNotDeleted(detachedDef1.getId()); + assertDetachedDefinitionNotDeleted(detachedDef2.getId()); + + // verify that the template itself has been deleted + assertNull("The template " + toString(template) + " should have been deleted", + loadTemplate(template.getName(), false)); + } + + private void assertDefinitionIsPinned(DriftDefinition definition) throws Exception { + // verify that the definition is marked as pinned + assertTrue("Expected " + toString(definition) + " to be pinned", definition.isPinned()); + + // verify that the initial change set is generated for the definition + JPADriftChangeSetCriteria criteria = new JPADriftChangeSetCriteria(); + criteria.addFilterDriftDefinitionId(definition.getId()); + criteria.addFilterCategory(COVERAGE); + criteria.fetchDrifts(true); + + PageList<? extends DriftChangeSet<?>> changeSets = driftMgr.findDriftChangeSetsByCriteria(getOverlord(), + criteria); + assertEquals("Expected to find one change set", 1, changeSets.size()); + + JPADriftChangeSet expectedChangeSet = new JPADriftChangeSet(resource, 1, COVERAGE, null); + List<? extends Drift> expectedDrifts = asList( + new JPADrift(expectedChangeSet, drift1.getPath(), FILE_ADDED, null, driftFile1), + new JPADrift(expectedChangeSet, drift2.getPath(), FILE_ADDED, null, driftFile2)); + + DriftChangeSet<?> actualChangeSet = changeSets.get(0); + List<? extends Drift> actualDrifts = new ArrayList(actualChangeSet.getDrifts()); + + AssertUtils.assertCollectionMatchesNoOrder( + "Expected to find drifts from change sets 1 and 2 in the template change set", + (List<Drift>) expectedDrifts, (List<Drift>) actualDrifts, "id", "ctime", "changeSet", "newDriftFile"); + + // Finally make sure that there are no other change sets + criteria = new JPADriftChangeSetCriteria(); + criteria.addFilterStartVersion(1); + criteria.addFilterDriftDefinitionId(definition.getId()); + + assertEquals("There should not be any drift change sets", 0, + driftMgr.findDriftChangeSetsByCriteria(getOverlord(), criteria).size()); + } + + private void assertDefinitionIsNotPinned(DriftDefinition definition) throws Exception { + // verify that the definition is not pinned + assertFalse("Expected " + toString(definition) + " to be unpinned", definition.isPinned()); + + // Note that this method assumes that the definition has no change sets + // associated with it and therefore checks that there are no change sets. + JPADriftChangeSetCriteria criteria = new JPADriftChangeSetCriteria(); + criteria.addFilterDriftDefinitionId(definition.getId()); + + PageList<? extends DriftChangeSet<?>> changeSets = driftMgr.findDriftChangeSetsByCriteria(getOverlord(), + criteria); + assertEquals("Did not expect to find any change sets for " + toString(definition) + ". Note that this " + + "assertion method assumes that the definition you are testing is not supposed to have any change sets.", + 0, changeSets.size()); + } + + private void assertDriftTemplateEquals(String msg, DriftDefinitionTemplate expected, DriftDefinitionTemplate actual) { + AssertUtils + .assertPropertiesMatch(msg + ": basic drift definition template properties do not match", expected, actual, + "id", "resourceType", "ctime", "templateDefinition"); + assertDriftDefEquals(msg + ": template definitions do not match", expected.getTemplateDefinition(), actual + .getTemplateDefinition()); + } + + private void assertDriftDefEquals(String msg, DriftDefinition expected, DriftDefinition actual) { + DriftDefinitionComparator comparator = new DriftDefinitionComparator( + BOTH_BASE_INFO_AND_DIRECTORY_SPECIFICATIONS); + assertEquals(msg, 0, comparator.compare(expected, actual)); + } + + private void assertDetachedDefinitionNotDeleted(int definitionId) { + DriftDefinition definition = loadDefinition(definitionId); + assertNotNull("Detached definition " + toString(definition) + " should not be deleted", definition); + assertNull("The detached definition's template reference should be set to null when the template is deleted", + definition.getTemplate()); + } + + private DriftDefinition createDefinition(DriftDefinitionTemplate template, String defName, boolean isAttached) { + DriftDefinition def = template.createDefinition(); + def.setName(defName); + def.setAttached(isAttached); + def.setTemplate(template); + def.setResource(resource); + return def; + } + + private DriftDefinitionTemplate loadTemplate(String name) { + return loadTemplate(name, true); + } + + private DriftDefinitionTemplate loadTemplate(String name, boolean verifyResultsUnique) { + DriftDefinitionTemplateCriteria criteria = new DriftDefinitionTemplateCriteria(); + criteria.addFilterResourceTypeId(resourceType.getId()); + criteria.addFilterName(name); + criteria.fetchDriftDefinitions(true); + + PageList<DriftDefinitionTemplate> templates = templateMgr.findTemplatesByCriteria(getOverlord(), criteria); + if (verifyResultsUnique) { + assertEquals("Expected to find one template", 1, templates.size()); + } + + if (templates.isEmpty()) { + return null; + } + return templates.get(0); + } + + private DriftDefinition loadDefinition(int definitionId) { + DriftDefinitionCriteria criteria = new DriftDefinitionCriteria(); + criteria.addFilterId(definitionId); + criteria.fetchConfiguration(true); + criteria.fetchTemplate(true); + PageList<DriftDefinition> definitions = driftMgr.findDriftDefinitionsByCriteria(getOverlord(), criteria); + + if (definitions.isEmpty()) { + return null; + } + return definitions.get(0); + } + + private DriftChangeSet<?> loadChangeSet(String id) throws Exception { + GenericDriftChangeSetCriteria criteria = new GenericDriftChangeSetCriteria(); + criteria.addFilterId(id); + PageList<? extends DriftChangeSet<?>> changeSets = driftMgr.findDriftChangeSetsByCriteria(getOverlord(), + criteria); + + if (changeSets.isEmpty()) { + return null; + } + return changeSets.get(0); + } + +} diff --git a/modules/enterprise/server/itests/src/test/java/org/rhq/enterprise/server/drift/InitDB.java b/modules/enterprise/server/itests/src/test/java/org/rhq/enterprise/server/drift/InitDB.java new file mode 100644 index 0000000..65a6523 --- /dev/null +++ b/modules/enterprise/server/itests/src/test/java/org/rhq/enterprise/server/drift/InitDB.java @@ -0,0 +1,32 @@ +/* + * RHQ Management Platform + * Copyright (C) 2011 Red Hat, Inc. + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation version 2 of the License. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +package org.rhq.enterprise.server.drift; + +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +@Retention(RUNTIME) +@Target({ElementType.METHOD }) +public @interface InitDB { + boolean value() default true; +} diff --git a/modules/enterprise/server/itests/src/test/java/org/rhq/enterprise/server/drift/JPADriftServerBeanTest.java b/modules/enterprise/server/itests/src/test/java/org/rhq/enterprise/server/drift/JPADriftServerBeanTest.java new file mode 100644 index 0000000..4faca1b --- /dev/null +++ b/modules/enterprise/server/itests/src/test/java/org/rhq/enterprise/server/drift/JPADriftServerBeanTest.java @@ -0,0 +1,309 @@ +/* + * RHQ Management Platform + * Copyright (C) 2011 Red Hat, Inc. + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation version 2 of the License. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +package org.rhq.enterprise.server.drift; + +import static java.util.Arrays.asList; +import static org.apache.commons.io.IOUtils.toInputStream; +import static org.rhq.core.domain.drift.DriftCategory.FILE_ADDED; +import static org.rhq.core.domain.drift.DriftChangeSetCategory.COVERAGE; +import static org.rhq.core.domain.drift.DriftConfigurationDefinition.BaseDirValueContext.fileSystem; +import static org.rhq.core.domain.drift.DriftConfigurationDefinition.DriftHandlingMode.normal; +import static org.rhq.core.domain.drift.DriftFileStatus.LOADED; +import static org.rhq.enterprise.server.util.LookupUtil.getJPADriftServer; +import static org.rhq.test.AssertUtils.assertPropertiesMatch; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import javax.persistence.EntityManager; + +import org.testng.annotations.BeforeClass; +import org.testng.annotations.BeforeMethod; + +import org.rhq.core.domain.configuration.Configuration; +import org.rhq.core.domain.criteria.JPADriftChangeSetCriteria; +import org.rhq.core.domain.drift.Drift; +import org.rhq.core.domain.drift.DriftDefinition; +import org.rhq.core.domain.drift.JPADrift; +import org.rhq.core.domain.drift.JPADriftChangeSet; +import org.rhq.core.domain.drift.JPADriftFile; +import org.rhq.core.domain.drift.JPADriftSet; +import org.rhq.core.domain.drift.dto.DriftChangeSetDTO; +import org.rhq.core.domain.drift.dto.DriftDTO; +import org.rhq.core.domain.drift.dto.DriftFileDTO; +import org.rhq.core.domain.util.PageList; +import org.rhq.test.AssertUtils; +import org.rhq.test.TransactionCallback; + +public class JPADriftServerBeanTest extends DriftServerTest { + + private JPADriftServerLocal jpaDriftServer; + + private final String DRIFT_FILE_1_ID = "a1b2c3d4"; + + private final String DRIFT_FILE_2_ID = "1ab2b3c4d"; + + private JPADriftFile driftFile1; + + private JPADriftFile driftFile2; + + @BeforeClass + public void initTests() { + jpaDriftServer = getJPADriftServer(); + } + + @BeforeMethod + public void persistDriftFiles() throws Exception { + driftFile1 = jpaDriftServer.persistDriftFile(new JPADriftFile(DRIFT_FILE_1_ID)); + driftFile2 = jpaDriftServer.persistDriftFile(new JPADriftFile(DRIFT_FILE_2_ID)); + + String driftFile1Content = "drift file 1 content..."; + String driftFile2Content = "drift file 2 content..."; + + jpaDriftServer.persistDriftFileData(driftFile1, toInputStream(driftFile1Content), driftFile1Content.length()); + jpaDriftServer.persistDriftFileData(driftFile2, toInputStream(driftFile2Content), driftFile2Content.length()); + + driftFile1 = jpaDriftServer.getDriftFile(getOverlord(), DRIFT_FILE_1_ID); + driftFile2 = jpaDriftServer.getDriftFile(getOverlord(), DRIFT_FILE_2_ID); + + assertDriftFilePersisted(driftFile1, "driftFile1", driftFile1Content); + assertDriftFilePersisted(driftFile2, "driftFile2", driftFile2Content); + } + + public void persistResourceChangeSet() { + // first create and persist the drift definition + final DriftDefinition driftDef = new DriftDefinition(new Configuration()); + driftDef.setName("test::persistResourceChangeSet"); + driftDef.setEnabled(true); + driftDef.setDriftHandlingMode(normal); + driftDef.setInterval(2400L); + driftDef.setBasedir(new DriftDefinition.BaseDirectory(fileSystem, "/foo/bar/test")); + driftDef.setResource(resource); + + executeInTransaction(new TransactionCallback() { + @Override + public void execute() throws Exception { + EntityManager em = getEntityManager(); + em.persist(driftDef); + } + }); + + // create the change set to be persisted + DriftChangeSetDTO changeSet = new DriftChangeSetDTO(); + changeSet.setCategory(COVERAGE); + changeSet.setVersion(1); + changeSet.setDriftDefinitionId(driftDef.getId()); + changeSet.setResourceId(resource.getId()); + changeSet.setDriftHandlingMode(normal); + changeSet.setCtime(System.currentTimeMillis()); + + DriftDTO drift1 = new DriftDTO(); + drift1.setCategory(FILE_ADDED); + drift1.setPath("drift.1"); + drift1.setChangeSet(changeSet); + drift1.setCtime(System.currentTimeMillis()); + drift1.setNewDriftFile(toDTo(driftFile1)); + + DriftDTO drift2 = new DriftDTO(); + drift2.setCategory(FILE_ADDED); + drift2.setPath("drift.2"); + drift2.setChangeSet(changeSet); + drift2.setCtime(System.currentTimeMillis()); + drift2.setNewDriftFile(toDTo(driftFile2)); + + Set<DriftDTO> drifts = new HashSet<DriftDTO>(); + drifts.add(drift1); + drifts.add(drift2); + changeSet.setDrifts(drifts); + + String newChangeSetId = jpaDriftServer.persistChangeSet(getOverlord(), changeSet); + + // verify that the change set was persisted + JPADriftChangeSetCriteria criteria = new JPADriftChangeSetCriteria(); + criteria.addFilterId(newChangeSetId); + criteria.fetchDrifts(true); + + PageList<JPADriftChangeSet> changeSets = jpaDriftServer.findDriftChangeSetsByCriteria(getOverlord(), criteria); + assertEquals("Expected to find one change set", 1, changeSets.size()); + + JPADriftChangeSet jpaChangeSet = changeSets.get(0); + assertEquals("Expected change set to contain two drifts. This could be a result of the change set not being " + + "persisted correctly or the criteria fetch being done incorrectly.", 2, jpaChangeSet.getDrifts().size()); + + AssertUtils + .assertPropertiesMatch("The change set was not persisted correctly", changeSet, jpaChangeSet, "id", "drifts", + "class", "ctime"); + + List<? extends Drift> expectedDrifts = asList(drift1, drift2); + List<? extends Drift> actualDrifts = new ArrayList(jpaChangeSet.getDrifts()); + + // We ignore the id and ctime properties because those are set by JPADriftServerBean + // and are somewhat implmentation specific. We ignore the directory property because + // it is really a calculated property. newDriftFile has to be compared separately + // since it does not implement equals. + AssertUtils.assertCollectionMatchesNoOrder("The change set drifts were not persisted correctly", + (List<Drift>) expectedDrifts, (List<Drift>) actualDrifts, "id", "ctime", "changeSet", "directory", + "newDriftFile", "class"); + + assertPropertiesMatch("The newDriftFile property was not set correctly for " + drift1, drift1.getNewDriftFile(), + findDriftByPath(actualDrifts, "drift.1").getNewDriftFile(), "class", "ctime") ; + assertPropertiesMatch("The newDriftFile property was not set correctly for " + drift2, drift2.getNewDriftFile(), + findDriftByPath(actualDrifts, "drift.2").getNewDriftFile(), "class", "ctime") ; + } + + public void persistTemplateChangeSet() { + // create the change set to be persisted + // + // Note that we do not set the drift definition id or resource id since + // the change set is not owned by a resource. It is owned by the + // resource type. + DriftChangeSetDTO changeSet = new DriftChangeSetDTO(); + changeSet.setCategory(COVERAGE); + changeSet.setVersion(1); + changeSet.setDriftHandlingMode(normal); + changeSet.setCtime(System.currentTimeMillis()); + + DriftDTO drift1 = new DriftDTO(); + drift1.setCategory(FILE_ADDED); + drift1.setPath("drift.1"); + drift1.setChangeSet(changeSet); + drift1.setCtime(System.currentTimeMillis()); + drift1.setNewDriftFile(toDTo(driftFile1)); + + DriftDTO drift2 = new DriftDTO(); + drift2.setCategory(FILE_ADDED); + drift2.setPath("drift.2"); + drift2.setChangeSet(changeSet); + drift2.setCtime(System.currentTimeMillis()); + drift2.setNewDriftFile(toDTo(driftFile2)); + + Set<DriftDTO> drifts = new HashSet<DriftDTO>(); + drifts.add(drift1); + drifts.add(drift2); + changeSet.setDrifts(drifts); + + String newChangeSetId = jpaDriftServer.persistChangeSet(getOverlord(), changeSet); + + // verify that the change set was persisted + JPADriftChangeSetCriteria criteria = new JPADriftChangeSetCriteria(); + criteria.addFilterId(newChangeSetId); + criteria.fetchDrifts(true); + + PageList<JPADriftChangeSet> changeSets = jpaDriftServer.findDriftChangeSetsByCriteria(getOverlord(), criteria); + assertEquals("Expected to find one change set", 1, changeSets.size()); + + JPADriftChangeSet jpaChangeSet = changeSets.get(0); + assertEquals("Expected change set to contain two drifts. This could be a result of the change set not being " + + "persisted correctly or the criteria fetch being done incorrectly.", 2, jpaChangeSet.getDrifts().size()); + + AssertUtils + .assertPropertiesMatch("The change set was not persisted correctly", changeSet, jpaChangeSet, "id", "drifts", + "class", "ctime"); + + List<? extends Drift> expectedDrifts = asList(drift1, drift2); + List<? extends Drift> actualDrifts = new ArrayList(jpaChangeSet.getDrifts()); + + // We ignore the id and ctime properties because those are set by JPADriftServerBean + // and are somewhat implmentation specific. We ignore the directory property because + // it is really a calculated property. newDriftFile has to be compared separately + // since it does not implement equals. + AssertUtils.assertCollectionMatchesNoOrder("The change set drifts were not persisted correctly", + (List<Drift>) expectedDrifts, (List<Drift>) actualDrifts, "id", "ctime", "changeSet", "directory", + "newDriftFile", "class"); + + assertPropertiesMatch("The newDriftFile property was not set correctly for " + drift1, drift1.getNewDriftFile(), + findDriftByPath(actualDrifts, "drift.1").getNewDriftFile(), "class", "ctime") ; + assertPropertiesMatch("The newDriftFile property was not set correctly for " + drift2, drift2.getNewDriftFile(), + findDriftByPath(actualDrifts, "drift.2").getNewDriftFile(), "class", "ctime") ; + } + + public void copyChangeSet() { + // first create the change set that will be copied + final JPADriftChangeSet changeSet = new JPADriftChangeSet(null, 0, COVERAGE, null); + changeSet.setDriftHandlingMode(normal); + + final JPADrift drift1 = new JPADrift(changeSet, "drift.1", FILE_ADDED, null, driftFile1); + final JPADrift drift2 = new JPADrift(changeSet, "drift.2", FILE_ADDED, null, driftFile2); + + final JPADriftSet driftSet = new JPADriftSet(); + driftSet.addDrift(drift1); + driftSet.addDrift(drift2); + + // next create the drift definition + final DriftDefinition driftDef = new DriftDefinition(new Configuration()); + driftDef.setName("test::copyChangeSet"); + driftDef.setEnabled(true); + driftDef.setDriftHandlingMode(normal); + driftDef.setInterval(2400L); + driftDef.setBasedir(new DriftDefinition.BaseDirectory(fileSystem, "/foo/bar/test")); + driftDef.setResource(resource); + + // persist the change set and drift definition + executeInTransaction(new TransactionCallback() { + @Override + public void execute() throws Exception { + EntityManager em = getEntityManager(); + em.persist(changeSet); + em.persist(driftDef); + em.persist(driftSet); + changeSet.setInitialDriftSet(driftSet); + em.merge(changeSet); + } + }); + + jpaDriftServer.copyChangeSet(getOverlord(), changeSet.getId(), driftDef.getId(), resource.getId()); + + // verify that the change set was created for the definition + JPADriftChangeSetCriteria criteria = new JPADriftChangeSetCriteria(); + criteria.addFilterDriftDefinitionId(driftDef.getId()); + criteria.addFilterCategory(COVERAGE); + + PageList<JPADriftChangeSet> changeSets = jpaDriftServer.findDriftChangeSetsByCriteria(getOverlord(), criteria); + + assertEquals("Expected to get back one change set", 1,changeSets.size()); + + JPADriftChangeSet newChangeSet = changeSets.get(0); + Set<JPADrift> expectedDrifts = new HashSet<JPADrift>(asList(drift1, drift2)); + Set<JPADrift> actualDrifts = newChangeSet.getDrifts(); + + AssertUtils.assertCollectionMatchesNoOrder("The change set drifts were not copied correctly", expectedDrifts, + actualDrifts, + "changeSet", "newDriftFile"); + } + + private DriftFileDTO toDTo(JPADriftFile driftFile) { + DriftFileDTO dto = new DriftFileDTO(); + dto.setHashId(driftFile.getHashId()); + dto.setDataSize(driftFile.getDataSize()); + dto.setStatus(driftFile.getStatus()); + return dto; + } + + + private void assertDriftFilePersisted(JPADriftFile driftFile, String name, String content) { + assertNotNull("Failed to get " + name + " Was it persisted?", driftFile); + assertEquals("The content for " + name + " is wrong", content, jpaDriftServer.getDriftFileBits( + driftFile.getHashId())); + assertEquals("The drift file status is wrong", LOADED, driftFile.getStatus()); + } + +} diff --git a/modules/enterprise/server/itests/src/test/java/org/rhq/enterprise/server/drift/ManageDriftDefinitionsTest.java b/modules/enterprise/server/itests/src/test/java/org/rhq/enterprise/server/drift/ManageDriftDefinitionsTest.java new file mode 100644 index 0000000..66afcb0 --- /dev/null +++ b/modules/enterprise/server/itests/src/test/java/org/rhq/enterprise/server/drift/ManageDriftDefinitionsTest.java @@ -0,0 +1,223 @@ +/* + * RHQ Management Platform + * Copyright (C) 2011 Red Hat, Inc. + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation version 2 of the License. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +package org.rhq.enterprise.server.drift; + +import static java.util.Arrays.asList; +import static org.rhq.core.domain.drift.DriftCategory.FILE_ADDED; +import static org.rhq.core.domain.drift.DriftChangeSetCategory.COVERAGE; +import static org.rhq.core.domain.drift.DriftConfigurationDefinition.BaseDirValueContext.fileSystem; +import static org.rhq.core.domain.drift.DriftConfigurationDefinition.DriftHandlingMode.normal; +import static org.rhq.core.domain.drift.DriftDefinitionComparator.CompareMode.BOTH_BASE_INFO_AND_DIRECTORY_SPECIFICATIONS; +import static org.rhq.enterprise.server.util.LookupUtil.getDriftManager; +import static org.rhq.enterprise.server.util.LookupUtil.getDriftTemplateManager; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; + +import javax.persistence.EntityManager; + +import org.testng.annotations.BeforeClass; + +import org.rhq.core.domain.common.EntityContext; +import org.rhq.core.domain.configuration.Configuration; +import org.rhq.core.domain.criteria.DriftDefinitionCriteria; +import org.rhq.core.domain.criteria.JPADriftChangeSetCriteria; +import org.rhq.core.domain.drift.Drift; +import org.rhq.core.domain.drift.DriftChangeSet; +import org.rhq.core.domain.drift.DriftConfigurationDefinition; +import org.rhq.core.domain.drift.DriftDefinition; +import org.rhq.core.domain.drift.DriftDefinitionComparator; +import org.rhq.core.domain.drift.DriftDefinitionTemplate; +import org.rhq.core.domain.drift.DriftSnapshot; +import org.rhq.core.domain.drift.JPADrift; +import org.rhq.core.domain.drift.JPADriftChangeSet; +import org.rhq.core.domain.drift.JPADriftFile; +import org.rhq.core.domain.drift.JPADriftSet; +import org.rhq.core.domain.util.PageList; +import org.rhq.enterprise.server.safeinvoker.HibernateDetachUtility; +import org.rhq.test.AssertUtils; +import org.rhq.test.TransactionCallback; + +public class ManageDriftDefinitionsTest extends DriftServerTest { + + private DriftManagerLocal driftMgr; + + private DriftTemplateManagerLocal templateMgr; + + @BeforeClass + public void initClass() throws Exception { + driftMgr = getDriftManager(); + templateMgr = getDriftTemplateManager(); + } + + public void createDefinitionFromUnpinnedTemplate() { + // first create a template + final DriftDefinition templateDef = new DriftDefinition(new Configuration()); + templateDef.setName("test_createUnpinnedDefinition"); + templateDef.setEnabled(true); + templateDef.setDriftHandlingMode(normal); + templateDef.setInterval(2400L); + templateDef.setBasedir(new DriftDefinition.BaseDirectory(fileSystem, "/foo/bar/test")); + + // persist the template + DriftDefinitionTemplate template = templateMgr.createTemplate(getOverlord(), resourceType.getId(), false, + templateDef); + + // create and persist the definition + DriftDefinition definition = template.createDefinition(); + definition.setTemplate(template); + driftMgr.updateDriftDefinition(getOverlord(), EntityContext.forResource(resource.getId()), definition); + + // verify that the definition was created + DriftDefinition newDef = loadDefinition(definition.getName()); + DriftDefinitionComparator comparator = new DriftDefinitionComparator( + BOTH_BASE_INFO_AND_DIRECTORY_SPECIFICATIONS); + + assertEquals("The drift definition was not persisted correctly", 0, comparator.compare(definition, newDef)); + assertEquals("The template association was not set on the definition", template, newDef.getTemplate()); + } + + @SuppressWarnings("unchecked") + public void createDefinitionFromPinnedTemplate() throws Exception { + // We first need to create a pinned template. Users can only create a pinned + // template from a snapshot of an existing resource-level drift definition. + // We are going to take a bit of a short cut though by directly creating + // and persisting the pinned change set. + + // first create the change set + final JPADriftChangeSet changeSet0 = new JPADriftChangeSet(null, 0, COVERAGE, null); + changeSet0.setDriftHandlingMode(DriftConfigurationDefinition.DriftHandlingMode.normal); + + final JPADriftFile driftFile1 = new JPADriftFile("a1b2c3"); + final JPADriftFile driftFile2 = new JPADriftFile("1a2b3c"); + + JPADrift drift1 = new JPADrift(changeSet0, "drift.1", FILE_ADDED, null, driftFile1); + JPADrift drift2 = new JPADrift(changeSet0, "drift.2", FILE_ADDED, null, driftFile2); + + final JPADriftSet driftSet = new JPADriftSet(); + driftSet.addDrift(drift1); + driftSet.addDrift(drift2); + + // create the template + final DriftDefinition templateDef = new DriftDefinition(new Configuration()); + templateDef.setName("test_createUnpinnedDefinition"); + templateDef.setEnabled(true); + templateDef.setDriftHandlingMode(normal); + templateDef.setInterval(2400L); + templateDef.setBasedir(new DriftDefinition.BaseDirectory(fileSystem, "/foo/bar/test")); + templateDef.setPinned(true); + + final DriftDefinitionTemplate template = templateMgr.createTemplate(getOverlord(), resourceType.getId(), true, + templateDef); + + executeInTransaction(new TransactionCallback() { + @Override + public void execute() throws Exception { + EntityManager em = getEntityManager(); + + em.persist(driftFile1); + em.persist(driftFile2); + em.persist(changeSet0); + em.persist(driftSet); + changeSet0.setInitialDriftSet(driftSet); + em.merge(changeSet0); + + // setting the change set id on the template is the last and the + // most important step in making the template pinned + template.setChangeSetId(changeSet0.getId()); + em.merge(template); + } + }); + + // Create and persist a resource-level definition. + final DriftDefinition definition = template.createDefinition(); + definition.setTemplate(template); + + final AtomicBoolean agentInvoked = new AtomicBoolean(false); + + agentServiceContainer.driftService = new TestDefService() { + @Override + public void updateDriftDetection(int resourceId, DriftDefinition driftDef, DriftSnapshot snapshot) { + try { + HibernateDetachUtility.nullOutUninitializedFields(driftDef, + HibernateDetachUtility.SerializationType.SERIALIZATION); + HibernateDetachUtility.nullOutUninitializedFields(snapshot, + HibernateDetachUtility.SerializationType.SERIALIZATION); + agentInvoked.set(true); + assertNotNull("Expected snapshot drift instances collection to be non-null", + snapshot.getDriftInstances()); + assertEquals("Expected snapshot to contain two drift entries", 2, snapshot.getDriftInstances().size()); + } catch (Exception e) { + String msg = "Do not pass attached entites to agent since those entities are outside of " + + "Hibernate's control. The persistence context should be flushed and cleared to ensure that " + + "only detached objects are sent to the agent"; + throw new RuntimeException(msg, e); + } + } + }; + + driftMgr.updateDriftDefinition(getOverlord(), EntityContext.forResource(resource.getId()), definition); + + DriftDefinition newDef = loadDefinition(definition.getName()); + + // verify that the definition is marked as pinned + assertTrue("The drift definition should be marked as pinned", newDef.isPinned()); + + // verify that the initial change set is generated for the definition + JPADriftChangeSetCriteria criteria = new JPADriftChangeSetCriteria(); + criteria.addFilterDriftDefinitionId(definition.getId()); + criteria.addFilterCategory(COVERAGE); + criteria.fetchDrifts(true); + + PageList<? extends DriftChangeSet<?>> changeSets = driftMgr.findDriftChangeSetsByCriteria(getOverlord(), + criteria); + assertEquals("Expected to find one change set", 1, changeSets.size()); + + JPADriftChangeSet expectedChangeSet = new JPADriftChangeSet(resource, 1, COVERAGE, null); + List<? extends Drift> expectedDrifts = asList( + new JPADrift(expectedChangeSet, drift1.getPath(), FILE_ADDED, null, driftFile1), + new JPADrift(expectedChangeSet, drift2.getPath(), FILE_ADDED, null, driftFile2)); + + DriftChangeSet<?> actualChangeSet = changeSets.get(0); + List<? extends Drift> actualDrifts = new ArrayList(actualChangeSet.getDrifts()); + + AssertUtils.assertCollectionMatchesNoOrder( + "Expected to find drifts from change sets 1 and 2 in the template change set", + (List<Drift>) expectedDrifts, (List<Drift>) actualDrifts, "id", "ctime", "changeSet", "newDriftFile"); + + // lastly verify that the agent is called + assertTrue("Failed to send drift definition along with snapshot to agent", agentInvoked.get()); + } + + private DriftDefinition loadDefinition(String name) { + DriftDefinitionCriteria criteria = new DriftDefinitionCriteria(); + criteria.addFilterResourceIds(resource.getId()); + criteria.addFilterName(name); + criteria.fetchConfiguration(true); + criteria.fetchResource(true); + criteria.fetchTemplate(true); + + PageList<DriftDefinition> driftDefs = driftMgr.findDriftDefinitionsByCriteria(getOverlord(), criteria); + assertEquals("Expected to find one drift definition", 1, driftDefs.size()); + + return driftDefs.get(0); + } +} diff --git a/modules/enterprise/server/itests/src/test/java/org/rhq/enterprise/server/drift/ManageSnapshotsTest.java b/modules/enterprise/server/itests/src/test/java/org/rhq/enterprise/server/drift/ManageSnapshotsTest.java new file mode 100644 index 0000000..e7341e4 --- /dev/null +++ b/modules/enterprise/server/itests/src/test/java/org/rhq/enterprise/server/drift/ManageSnapshotsTest.java @@ -0,0 +1,236 @@ +/* + * RHQ Management Platform + * Copyright (C) 2011 Red Hat, Inc. + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation version 2 of the License. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +package org.rhq.enterprise.server.drift; + +import static java.util.Arrays.asList; +import static org.rhq.core.domain.drift.DriftCategory.FILE_ADDED; +import static org.rhq.core.domain.drift.DriftChangeSetCategory.COVERAGE; +import static org.rhq.core.domain.drift.DriftChangeSetCategory.DRIFT; +import static org.rhq.core.domain.drift.DriftConfigurationDefinition.BaseDirValueContext.fileSystem; +import static org.rhq.core.domain.drift.DriftConfigurationDefinition.DriftHandlingMode.normal; +import static org.rhq.enterprise.server.util.LookupUtil.getDriftManager; +import static org.rhq.enterprise.server.util.LookupUtil.getDriftTemplateManager; +import static org.rhq.test.AssertUtils.assertPropertiesMatch; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.ObjectOutputStream; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; + +import javax.persistence.EntityManager; + +import org.testng.annotations.BeforeClass; + +import org.rhq.core.domain.configuration.Configuration; +import org.rhq.core.domain.criteria.GenericDriftChangeSetCriteria; +import org.rhq.core.domain.drift.Drift; +import org.rhq.core.domain.drift.DriftChangeSet; +import org.rhq.core.domain.drift.DriftDefinition; +import org.rhq.core.domain.drift.DriftSnapshot; +import org.rhq.core.domain.drift.JPADrift; +import org.rhq.core.domain.drift.JPADriftChangeSet; +import org.rhq.core.domain.drift.JPADriftFile; +import org.rhq.core.domain.drift.JPADriftSet; +import org.rhq.core.domain.util.PageList; +import org.rhq.core.server.EntitySerializer; +import org.rhq.test.AssertUtils; +import org.rhq.test.TransactionCallback; + +public class ManageSnapshotsTest extends DriftServerTest { + + private DriftManagerLocal driftMgr; + + private DriftTemplateManagerLocal templateMgr; + + @BeforeClass(inheritGroups = true) + public void initClass() throws Exception { + driftMgr = getDriftManager(); + templateMgr = getDriftTemplateManager(); + } + + public void pinningSnapshotShouldSetDriftDefAsPinned() { + final DriftDefinition driftDef = createAndPersistDriftDef("test::setPinnedFlag"); + + // create initial change set + final JPADriftChangeSet changeSet = new JPADriftChangeSet(resource, 0, COVERAGE, driftDef); + + final JPADriftFile driftFile1 = new JPADriftFile("a1b2c3"); + JPADrift drift = new JPADrift(changeSet, "drift.1", FILE_ADDED, null, driftFile1); + + final JPADriftSet driftSet = new JPADriftSet(); + driftSet.addDrift(drift); + + executeInTransaction(new TransactionCallback() { + @Override + public void execute() throws Exception { + EntityManager em = getEntityManager(); + em.persist(driftFile1); + em.persist(changeSet); + em.persist(driftSet); + changeSet.setInitialDriftSet(driftSet); + em.merge(changeSet); + } + }); + + driftMgr.pinSnapshot(getOverlord(), driftDef.getId(), 0); + DriftDefinition updatedDriftDef = driftMgr.getDriftDefinition(getOverlord(), driftDef.getId()); + + assertNotNull("Failed to get " + toString(driftDef), updatedDriftDef); + assertTrue("Failed to set pinned flag of " + toString(driftDef), updatedDriftDef.isPinned()); + } + + @SuppressWarnings("unchecked") + public void pinningSnapshotShouldMakeSnapshotTheInitialChangeSet() throws Exception { + final DriftDefinition driftDef = createAndPersistDriftDef("test::makeSnapshotVersionZero"); + + // create initial change set + final JPADriftChangeSet changeSet0 = new JPADriftChangeSet(resource, 0, COVERAGE, driftDef); + + final JPADriftFile driftFile1 = new JPADriftFile("a1b2c3"); + JPADrift drift1 = new JPADrift(changeSet0, "drift.1", FILE_ADDED, null, driftFile1); + + final JPADriftSet driftSet = new JPADriftSet(); + driftSet.addDrift(drift1); + + // create change set v1 + final JPADriftFile driftFile2 = new JPADriftFile("1a2b3c"); + final JPADriftChangeSet changeSet1 = new JPADriftChangeSet(resource, 1, DRIFT, driftDef); + final JPADrift drift2 = new JPADrift(changeSet1, "drift.2", FILE_ADDED, null, driftFile2); + + executeInTransaction(new TransactionCallback() { + @Override + public void execute() throws Exception { + EntityManager em = getEntityManager(); + em.persist(driftFile1); + em.persist(driftFile2); + em.persist(changeSet0); + em.persist(driftSet); + changeSet0.setInitialDriftSet(driftSet); + em.merge(changeSet0); + em.persist(changeSet1); + em.persist(drift2); + } + }); + + driftMgr.pinSnapshot(getOverlord(), driftDef.getId(), 1); + + // Verify that there is now only one change set for the drift def + GenericDriftChangeSetCriteria criteria = new GenericDriftChangeSetCriteria(); + criteria.addFilterDriftDefinitionId(driftDef.getId()); + + PageList<? extends DriftChangeSet<?>> changeSets = driftMgr.findDriftChangeSetsByCriteria(getOverlord(), + criteria); + assertEquals("All change sets except the change set representing the pinned snapshot should be removed", + 1, changeSets.size()); + DriftChangeSet<?> changeSet = changeSets.get(0); + + assertEquals("The pinned snapshot version should be reset to zero", 0, changeSet.getVersion()); + assertEquals("The change set category is wrong", COVERAGE, changeSet.getCategory()); + + JPADriftChangeSet expectedChangeSet = new JPADriftChangeSet(resource, 1, COVERAGE, driftDef); + List<? extends Drift> expectedDrifts = asList( + new JPADrift(expectedChangeSet, drift1.getPath(), FILE_ADDED, null, driftFile1), + new JPADrift(expectedChangeSet, drift2.getPath(), FILE_ADDED, null, driftFile2)); + + List<? extends Drift> actualDrifts = new ArrayList(changeSet.getDrifts()); + + AssertUtils.assertCollectionMatchesNoOrder( + "Expected to find drifts from change sets 1 and 2 in the new initial change set", + (List<Drift>) expectedDrifts, (List<Drift>) actualDrifts, "id", "ctime", "changeSet", "newDriftFile"); + + // we need to compare the newDriftFile properties separately because + // assertCollectionMatchesNoOrder compares properties via equals() and JPADriftFile + // does not implement equals. + assertPropertiesMatch(drift1.getNewDriftFile(), findDriftByPath(actualDrifts, "drift.1").getNewDriftFile(), + "The newDriftFile property was not set correctly for " + drift1); + assertPropertiesMatch(drift2.getNewDriftFile(), findDriftByPath(actualDrifts, "drift.2").getNewDriftFile(), + "The newDriftFile property was not set correctly for " + drift1); + } + + public void pinningSnapshotShouldSendRequestToAgent() { + final DriftDefinition driftDef = createAndPersistDriftDef("test::setPinnedFlag"); + + // create initial change set + final JPADriftChangeSet changeSet = new JPADriftChangeSet(resource, 0, COVERAGE, driftDef); + + final JPADriftFile driftFile1 = new JPADriftFile("a1b2c3"); + JPADrift drift = new JPADrift(changeSet, "drift.1", FILE_ADDED, null, driftFile1); + + final JPADriftSet driftSet = new JPADriftSet(); + driftSet.addDrift(drift); + + executeInTransaction(new TransactionCallback() { + @Override + public void execute() throws Exception { + EntityManager em = getEntityManager(); + em.persist(driftFile1); + em.persist(changeSet); + em.persist(driftSet); + changeSet.setInitialDriftSet(driftSet); + em.merge(changeSet); + } + }); + + final AtomicBoolean agentInvoked = new AtomicBoolean(false); + agentServiceContainer.driftService = new TestDefService() { + @Override + public void pinSnapshot(int resourceId, String configName, DriftSnapshot snapshot) { + try { + agentInvoked.set(true); + // serialize the method arguments here to more closely simulate what + // happens during the call. We cannot send hibernate-proxied objects + // to the agent. This is an attempt to catch that. + ObjectOutputStream stream = new ObjectOutputStream(new ByteArrayOutputStream()); + EntitySerializer.writeExternalRemote(resourceId, stream); + EntitySerializer.writeExternalRemote(configName, stream); + EntitySerializer.writeExternalRemote(snapshot, stream); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + }; + + driftMgr.pinSnapshot(getOverlord(), driftDef.getId(), 0); + + assertTrue("Failed to send request to agent to pin snapshot", agentInvoked.get()); + } + + private DriftDefinition createAndPersistDriftDef(String name) { + final DriftDefinition driftDef = new DriftDefinition(new Configuration()); + driftDef.setName(name); + driftDef.setEnabled(true); + driftDef.setDriftHandlingMode(normal); + driftDef.setInterval(1800L); + driftDef.setBasedir(new DriftDefinition.BaseDirectory(fileSystem, "/foo/bar/test")); + + executeInTransaction(new TransactionCallback() { + @Override + public void execute() throws Exception { + driftDef.setResource(resource); + getEntityManager().persist(driftDef); + } + }); + + return driftDef; + } + +} diff --git a/modules/enterprise/server/itests/src/test/resources/META-INF/ejb-jar.xml b/modules/enterprise/server/itests/src/test/resources/META-INF/ejb-jar.xml new file mode 100644 index 0000000..8222948 --- /dev/null +++ b/modules/enterprise/server/itests/src/test/resources/META-INF/ejb-jar.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ejb-jar xmlns="http://java.sun.com/xml/ns/javaee" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd" + version="3.0"> + + <description>RHQ</description> + <display-name>RHQ</display-name> + + <assembly-descriptor> + + <!-- all our EJB3 SLSBs can define custom @RequiredPermissions annotations for authorization checks--> + <interceptor-binding> + <ejb-name>*</ejb-name> + <interceptor-class>org.rhq.enterprise.server.authz.RequiredPermissionsInterceptor</interceptor-class> + </interceptor-binding> + <interceptor-binding> + <ejb-name>*</ejb-name> + <interceptor-class>org.rhq.enterprise.server.common.TransactionInterruptInterceptor</interceptor-class> + </interceptor-binding> + <interceptor-binding> + <ejb-name>*</ejb-name> + <interceptor-class>org.rhq.enterprise.server.common.PerformanceMonitorInterceptor</interceptor-class> + </interceptor-binding> + + </assembly-descriptor> + +</ejb-jar> diff --git a/modules/enterprise/server/itests/src/test/resources/binary-blob-sample.jar b/modules/enterprise/server/itests/src/test/resources/binary-blob-sample.jar new file mode 100644 index 0000000..0a629ec Binary files /dev/null and b/modules/enterprise/server/itests/src/test/resources/binary-blob-sample.jar differ diff --git a/modules/enterprise/server/itests/src/test/resources/default.persistence.properties b/modules/enterprise/server/itests/src/test/resources/default.persistence.properties new file mode 100644 index 0000000..8e4f317 --- /dev/null +++ b/modules/enterprise/server/itests/src/test/resources/default.persistence.properties @@ -0,0 +1,22 @@ +hibernate.transaction.manager_lookup_class=org.hibernate.transaction.JBossTransactionManagerLookup +#hibernate.connection.release_mode=after_statement +#hibernate.transaction.flush_before_completion=false +#hibernate.transaction.auto_close_session=false +#hibernate.query.factory_class=org.hibernate.hql.ast.ASTQueryTranslatorFactory +#hibernate.hbm2ddl.auto=create-drop +#hibernate.hbm2ddl.auto=create +hibernate.cache.provider_class=org.hibernate.cache.HashtableCacheProvider +# Clustered cache with TreeCache +#hibernate.cache.provider_class=org.jboss.ejb3.entity.TreeCacheProviderHook +#hibernate.treecache.mbean.object_name=jboss.cache:service=EJB3EntityTreeCache +#hibernate.dialect=org.hibernate.dialect.HSQLDialect +hibernate.jndi.java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory +hibernate.jndi.java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces +hibernate.bytecode.use_reflection_optimizer=false +# I don't think this is honored, but EJB3Deployer uses it +hibernate.bytecode.provider=javassist +hibernate.jdbc.use_streams_for_binary=true +hibernate.show_sql=false +hibernate.format_sql=true +hibernate.default_batch_fetch_size=16 +hibernate.jdbc.batch_size=20 diff --git a/modules/enterprise/server/itests/src/test/resources/ejb3-interceptors-aop.xml b/modules/enterprise/server/itests/src/test/resources/ejb3-interceptors-aop.xml new file mode 100644 index 0000000..f30aa70 --- /dev/null +++ b/modules/enterprise/server/itests/src/test/resources/ejb3-interceptors-aop.xml @@ -0,0 +1,360 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE aop PUBLIC + "-//JBoss//DTD JBOSS AOP 1.0//EN" + "http://www.jboss.org/aop/dtd/jboss-aop_1_0.dtd"> + +<aop> + <interceptor class="org.jboss.aspects.remoting.InvokeRemoteInterceptor" scope="PER_VM"/> + <interceptor class="org.jboss.aspects.security.SecurityClientInterceptor" scope="PER_VM"/> + <interceptor class="org.jboss.aspects.tx.ClientTxPropagationInterceptor" scope="PER_VM"/> + <interceptor class="org.jboss.ejb3.remoting.IsLocalInterceptor" scope="PER_VM"/> + <interceptor class="org.jboss.aspects.remoting.ClusterChooserInterceptor" scope="PER_VM"/> + + <interceptor class="org.jboss.aspects.tx.TxPropagationInterceptor" scope="PER_VM"/> + + <stack name="ServiceClientInterceptors"> + <interceptor-ref name="org.jboss.ejb3.remoting.IsLocalInterceptor"/> + <interceptor-ref name="org.jboss.aspects.security.SecurityClientInterceptor"/> + <interceptor-ref name="org.jboss.aspects.tx.ClientTxPropagationInterceptor"/> + <interceptor-ref name="org.jboss.aspects.remoting.InvokeRemoteInterceptor"/> + </stack> + + <stack name="AsynchronousStatelessSessionClientInterceptors"> + <interceptor-ref name="org.jboss.ejb3.remoting.IsLocalInterceptor"/> + <interceptor-ref name="org.jboss.aspects.security.SecurityClientInterceptor"/> + <interceptor-ref name="org.jboss.aspects.tx.ClientTxPropagationInterceptor"/> + <interceptor-ref name="org.jboss.aspects.remoting.InvokeRemoteInterceptor"/> + </stack> + + <stack name="AsynchronousStatefulSessionClientInterceptors"> + <interceptor-ref name="org.jboss.ejb3.remoting.IsLocalInterceptor"/> + <interceptor-ref name="org.jboss.aspects.security.SecurityClientInterceptor"/> + <interceptor-ref name="org.jboss.aspects.tx.ClientTxPropagationInterceptor"/> + <interceptor-ref name="org.jboss.aspects.remoting.InvokeRemoteInterceptor"/> + </stack> + + <stack name="StatelessSessionClientInterceptors"> + <interceptor-ref name="org.jboss.ejb3.remoting.IsLocalInterceptor"/> + <interceptor-ref name="org.jboss.aspects.security.SecurityClientInterceptor"/> + <interceptor-ref name="org.jboss.aspects.tx.ClientTxPropagationInterceptor"/> + <interceptor-ref name="org.jboss.aspects.remoting.InvokeRemoteInterceptor"/> + </stack> + + <stack name="StatefulSessionClientInterceptors"> + <interceptor-ref name="org.jboss.ejb3.remoting.IsLocalInterceptor"/> + <interceptor-ref name="org.jboss.aspects.security.SecurityClientInterceptor"/> + <interceptor-ref name="org.jboss.aspects.tx.ClientTxPropagationInterceptor"/> + <interceptor-ref name="org.jboss.aspects.remoting.InvokeRemoteInterceptor"/> + </stack> + + <stack name="ClusteredStatelessSessionClientInterceptors"> + <interceptor-ref name="org.jboss.ejb3.remoting.IsLocalInterceptor"/> + <interceptor-ref name="org.jboss.aspects.security.SecurityClientInterceptor"/> + <interceptor-ref name="org.jboss.aspects.tx.ClientTxPropagationInterceptor"/> + <interceptor-ref name="org.jboss.aspects.remoting.ClusterChooserInterceptor"/> + <interceptor-ref name="org.jboss.aspects.remoting.InvokeRemoteInterceptor"/> + </stack> + + <stack name="ClusteredStatefulSessionClientInterceptors"> + <interceptor-ref name="org.jboss.ejb3.remoting.IsLocalInterceptor"/> + <interceptor-ref name="org.jboss.aspects.security.SecurityClientInterceptor"/> + <interceptor-ref name="org.jboss.aspects.tx.ClientTxPropagationInterceptor"/> + <interceptor-ref name="org.jboss.aspects.remoting.ClusterChooserInterceptor"/> + <interceptor-ref name="org.jboss.aspects.remoting.InvokeRemoteInterceptor"/> + </stack> + + <interceptor class="org.jboss.ejb3.asynchronous.AsynchronousInterceptor" scope="PER_CLASS"/> + <interceptor class="org.jboss.ejb3.ENCPropagationInterceptor" scope="PER_VM"/> + <interceptor name="Basic Authorization" factory="org.jboss.ejb3.security.RoleBasedAuthorizationInterceptorFactory" scope="PER_CLASS"/> + <interceptor name="JACC Authorization" factory="org.jboss.ejb3.security.JaccAuthorizationInterceptorFactory" scope="PER_CLASS"/> + <interceptor factory="org.jboss.ejb3.security.AuthenticationInterceptorFactory" scope="PER_CLASS"/> + <interceptor factory="org.jboss.ejb3.security.RunAsSecurityInterceptorFactory" scope="PER_CLASS"/> + <interceptor class="org.jboss.ejb3.entity.ExtendedPersistenceContextPropagationInterceptor" scope="PER_VM"/> + <interceptor class="org.jboss.ejb3.stateless.StatelessInstanceInterceptor" scope="PER_VM"/> + <interceptor class="org.jboss.ejb3.stateful.StatefulInstanceInterceptor" scope="PER_VM"/> + <interceptor class="org.jboss.ejb3.stateful.SessionSynchronizationInterceptor" scope="PER_VM"/> + <interceptor class="org.jboss.ejb3.service.ServiceSingletonInterceptor" scope="PER_VM"/> + <interceptor class="org.jboss.ejb3.cache.StatefulReplicationInterceptor" scope="PER_VM"/> + <interceptor factory="org.jboss.ejb3.stateful.StatefulRemoveFactory" scope="PER_CLASS_JOINPOINT"/> + <interceptor factory="org.jboss.ejb3.tx.TxInterceptorFactory" scope="PER_CLASS_JOINPOINT"/> + <interceptor factory="org.jboss.ejb3.interceptor.EJB3InterceptorsFactory" scope="PER_CLASS_JOINPOINT"/> + <interceptor factory="org.jboss.ejb3.remoting.ReplicantsManagerInterceptorFactory" scope="PER_CLASS"/> + <interceptor class="org.jboss.ejb3.AllowedOperationsInterceptor" scope="PER_VM"/> + <interceptor factory="org.jboss.ejb3.mdb.CurrentMessageInjectorInterceptorFactory" scope="PER_CLASS"/> + <interceptor class="org.jboss.ejb3.entity.TransactionScopedEntityManagerInterceptor" scope="PER_VM"/> + + <domain name="Stateless Bean"> + <bind pointcut="execution(public * *->*(..))"> + <interceptor-ref name="org.jboss.ejb3.asynchronous.AsynchronousInterceptor"/> + <interceptor-ref name="org.jboss.ejb3.ENCPropagationInterceptor"/> + <interceptor-ref name="org.jboss.ejb3.security.AuthenticationInterceptorFactory"/> + </bind> + <bind pointcut="execution(public * @org.jboss.annotation.security.SecurityDomain->*(..))"> + <interceptor-ref name="Basic Authorization"/> + </bind> + <bind pointcut="execution(public * @javax.annotation.security.RunAs->*(..))"> + <interceptor-ref name="org.jboss.ejb3.security.RunAsSecurityInterceptorFactory"/> + </bind> + <bind pointcut="execution(public * @org.jboss.annotation.ejb.Clustered->*(..))"> + <interceptor-ref name="org.jboss.ejb3.remoting.ReplicantsManagerInterceptorFactory"/> + </bind> + <bind pointcut="execution(public * *->*(..))"> + <interceptor-ref name="org.jboss.ejb3.stateless.StatelessInstanceInterceptor"/> + <interceptor-ref name="org.jboss.aspects.tx.TxPropagationInterceptor"/> + <interceptor-ref name="org.jboss.ejb3.tx.TxInterceptorFactory"/> + <interceptor-ref name="org.jboss.ejb3.AllowedOperationsInterceptor"/> + <interceptor-ref name="org.jboss.ejb3.entity.TransactionScopedEntityManagerInterceptor"/> + <interceptor-ref name="org.jboss.ejb3.interceptor.EJB3InterceptorsFactory"/> + </bind> + <annotation expr="!class(@org.jboss.annotation.ejb.PoolClass)"> + @org.jboss.annotation.ejb.PoolClass (value=org.jboss.ejb3.ThreadlocalPool.class, maxSize=30, timeout=10000) + </annotation> + </domain> + + <domain name="JACC Stateless Bean"> + <bind pointcut="execution(public * *->*(..))"> + <interceptor-ref name="org.jboss.ejb3.asynchronous.AsynchronousInterceptor"/> + <interceptor-ref name="org.jboss.ejb3.ENCPropagationInterceptor"/> + <interceptor-ref name="org.jboss.ejb3.security.AuthenticationInterceptorFactory"/> + </bind> + <bind pointcut="execution(public * @org.jboss.annotation.security.SecurityDomain->*(..))"> + <interceptor-ref name="JACC Authorization"/> + </bind> + <bind pointcut="execution(public * @javax.annotation.security.RunAs->*(..))"> + <interceptor-ref name="org.jboss.ejb3.security.RunAsSecurityInterceptorFactory"/> + </bind> + <bind pointcut="execution(public * @org.jboss.annotation.ejb.Clustered->*(..))"> + <interceptor-ref name="org.jboss.ejb3.remoting.ReplicantsManagerInterceptorFactory"/> + </bind> + <bind pointcut="execution(public * *->*(..))"> + <interceptor-ref name="org.jboss.ejb3.stateless.StatelessInstanceInterceptor"/> + <interceptor-ref name="org.jboss.aspects.tx.TxPropagationInterceptor"/> + <interceptor-ref name="org.jboss.ejb3.tx.TxInterceptorFactory"/> + <interceptor-ref name="org.jboss.ejb3.AllowedOperationsInterceptor"/> + <interceptor-ref name="org.jboss.ejb3.entity.TransactionScopedEntityManagerInterceptor"/> + <interceptor-ref name="org.jboss.ejb3.interceptor.EJB3InterceptorsFactory"/> + </bind> + <annotation expr="!class(@org.jboss.annotation.ejb.PoolClass)"> + @org.jboss.annotation.ejb.PoolClass (value=org.jboss.ejb3.ThreadlocalPool.class, maxSize=30, timeout=10000) + </annotation> + </domain> + + <domain name="Base Stateful Bean"> + <bind pointcut="execution(public * *->*(..))"> + <interceptor-ref name="org.jboss.ejb3.asynchronous.AsynchronousInterceptor"/> + <interceptor-ref name="org.jboss.ejb3.ENCPropagationInterceptor"/> + <interceptor-ref name="org.jboss.ejb3.security.AuthenticationInterceptorFactory"/> + </bind> + <bind pointcut="execution(public * @org.jboss.annotation.security.SecurityDomain->*(..))"> + <interceptor-ref name="Basic Authorization"/> + </bind> + <bind pointcut="execution(public * @javax.annotation.security.RunAs->*(..))"> + <interceptor-ref name="org.jboss.ejb3.security.RunAsSecurityInterceptorFactory"/> + </bind> + <bind pointcut="execution(public * @org.jboss.annotation.ejb.Clustered->*(..))"> + <interceptor-ref name="org.jboss.ejb3.remoting.ReplicantsManagerInterceptorFactory"/> + </bind> + <bind pointcut="execution(public * *->@javax.ejb.Remove(..))"> + <interceptor-ref name="org.jboss.ejb3.stateful.StatefulRemoveFactory"/> + </bind> + <bind pointcut="execution(public * *->*(..))"> + <interceptor-ref name="org.jboss.ejb3.stateful.StatefulInstanceInterceptor"/> + <interceptor-ref name="org.jboss.aspects.tx.TxPropagationInterceptor"/> + <interceptor-ref name="org.jboss.ejb3.tx.TxInterceptorFactory"/> + <interceptor-ref name="org.jboss.ejb3.AllowedOperationsInterceptor"/> + </bind> + <bind pointcut="execution(public * $instanceof{javax.ejb.SessionSynchronization}->*(..))"> + <interceptor-ref name="org.jboss.ejb3.stateful.SessionSynchronizationInterceptor"/> + </bind> + <bind pointcut="execution(public * *->*(..))"> + <interceptor-ref name="org.jboss.ejb3.entity.TransactionScopedEntityManagerInterceptor"/> + <interceptor-ref name="org.jboss.ejb3.entity.ExtendedPersistenceContextPropagationInterceptor"/> + <interceptor-ref name="org.jboss.ejb3.interceptor.EJB3InterceptorsFactory"/> + </bind> + + <bind pointcut="execution(public * @org.jboss.annotation.ejb.Clustered->*(..)) AND !execution(public * *->@javax.ejb.Remove(..))"> + <interceptor-ref name="org.jboss.ejb3.cache.StatefulReplicationInterceptor"/> + </bind> + <annotation expr="!class(@org.jboss.annotation.ejb.PoolClass)"> + @org.jboss.annotation.ejb.PoolClass (value=org.jboss.ejb3.ThreadlocalPool.class, maxSize=30, timeout=10000) + </annotation> + </domain> + + <domain name="Stateful Bean" extends="Base Stateful Bean" inheritBindings="true"> + <!-- NON Clustered cache configuration --> + <annotation expr="!class(@org.jboss.annotation.ejb.cache.Cache) AND !class(@org.jboss.annotation.ejb.Clustered)"> + @org.jboss.annotation.ejb.cache.Cache (org.jboss.ejb3.cache.simple.SimpleStatefulCache.class) + </annotation> + <annotation expr="!class(@org.jboss.annotation.ejb.cache.simple.PersistenceManager) AND !class(@org.jboss.annotation.ejb.Clustered)"> + @org.jboss.annotation.ejb.cache.simple.PersistenceManager (org.jboss.ejb3.cache.simple.StatefulSessionFilePersistenceManager.class) + </annotation> + <annotation expr="!class(@org.jboss.annotation.ejb.cache.simple.CacheConfig) AND !class(@org.jboss.annotation.ejb.Clustered)"> + @org.jboss.annotation.ejb.cache.simple.CacheConfig (maxSize=100000, idleTimeoutSeconds=300) + </annotation> + + <!-- Clustered cache configuration --> + <annotation expr="!class(@org.jboss.annotation.ejb.cache.Cache) AND class(@org.jboss.annotation.ejb.Clustered)"> + @org.jboss.annotation.ejb.cache.Cache (org.jboss.ejb3.cache.tree.StatefulTreeCache.class) + </annotation> + <annotation expr="!class(@org.jboss.annotation.ejb.cache.tree.CacheConfig) AND class(@org.jboss.annotation.ejb.Clustered)"> + @org.jboss.annotation.ejb.cache.tree.CacheConfig (name="jboss.cache:service=EJB3SFSBClusteredCache", maxSize=100000, idleTimeoutSeconds=300) + </annotation> + </domain> + + <domain name="JACC Stateful Bean"> + <bind pointcut="execution(public * *->*(..))"> + <interceptor-ref name="org.jboss.ejb3.asynchronous.AsynchronousInterceptor"/> + <interceptor-ref name="org.jboss.ejb3.ENCPropagationInterceptor"/> + <interceptor-ref name="org.jboss.ejb3.security.AuthenticationInterceptorFactory"/> + </bind> + <bind pointcut="execution(public * @org.jboss.annotation.security.SecurityDomain->*(..))"> + <interceptor-ref name="JACC Authorization"/> + </bind> + <bind pointcut="execution(public * @javax.annotation.security.RunAs->*(..))"> + <interceptor-ref name="org.jboss.ejb3.security.RunAsSecurityInterceptorFactory"/> + </bind> + <bind pointcut="execution(public * @org.jboss.annotation.ejb.Clustered->*(..))"> + <interceptor-ref name="org.jboss.ejb3.remoting.ReplicantsManagerInterceptorFactory"/> + </bind> + <bind pointcut="execution(public * *->@javax.ejb.Remove(..))"> + <interceptor-ref name="org.jboss.ejb3.stateful.StatefulRemoveFactory"/> + </bind> + <bind pointcut="execution(public * *->*(..))"> + <interceptor-ref name="org.jboss.ejb3.stateful.StatefulInstanceInterceptor"/> + <interceptor-ref name="org.jboss.aspects.tx.TxPropagationInterceptor"/> + <interceptor-ref name="org.jboss.ejb3.tx.TxInterceptorFactory"/> + <interceptor-ref name="org.jboss.ejb3.AllowedOperationsInterceptor"/> + </bind> + <bind pointcut="execution(public * $instanceof{javax.ejb.SessionSynchronization}->*(..))"> + <interceptor-ref name="org.jboss.ejb3.stateful.SessionSynchronizationInterceptor"/> + </bind> + <bind pointcut="execution(public * *->*(..))"> + <interceptor-ref name="org.jboss.ejb3.entity.TransactionScopedEntityManagerInterceptor"/> + <interceptor-ref name="org.jboss.ejb3.entity.ExtendedPersistenceContextPropagationInterceptor"/> + <interceptor-ref name="org.jboss.ejb3.interceptor.EJB3InterceptorsFactory"/> + </bind> + + <bind pointcut="execution(public * @org.jboss.annotation.ejb.Clustered->*(..)) AND !execution(public * *->@javax.ejb.Remove(..))"> + <interceptor-ref name="org.jboss.ejb3.cache.StatefulReplicationInterceptor"/> + </bind> + <annotation expr="!class(@org.jboss.annotation.ejb.PoolClass)"> + @org.jboss.annotation.ejb.PoolClass (value=org.jboss.ejb3.ThreadlocalPool.class, maxSize=30, timeout=10000) + </annotation> + + <!-- NON Clustered cache configuration --> + <annotation expr="!class(@org.jboss.annotation.ejb.cache.Cache) AND !class(@org.jboss.annotation.ejb.Clustered)"> + @org.jboss.annotation.ejb.cache.Cache (org.jboss.ejb3.cache.simple.SimpleStatefulCache.class) + </annotation> + <annotation expr="!class(@org.jboss.annotation.ejb.cache.simple.PersistenceManager) AND !class(@org.jboss.annotation.ejb.Clustered)"> + @org.jboss.annotation.ejb.cache.simple.PersistenceManager (org.jboss.ejb3.cache.simple.StatefulSessionFilePersistenceManager.class) + </annotation> + <annotation expr="!class(@org.jboss.annotation.ejb.cache.simple.CacheConfig) AND !class(@org.jboss.annotation.ejb.Clustered)"> + @org.jboss.annotation.ejb.cache.simple.CacheConfig (maxSize=100000, idleTimeoutSeconds=300) + </annotation> + + <!-- Clustered cache configuration --> + <annotation expr="!class(@org.jboss.annotation.ejb.cache.Cache) AND class(@org.jboss.annotation.ejb.Clustered)"> + @org.jboss.annotation.ejb.cache.Cache (org.jboss.ejb3.cache.tree.StatefulTreeCache.class) + </annotation> + <annotation expr="!class(@org.jboss.annotation.ejb.cache.tree.CacheConfig) AND class(@org.jboss.annotation.ejb.Clustered)"> + @org.jboss.annotation.ejb.cache.tree.CacheConfig (name="jboss.cache:service=EJB3SFSBClusteredCache", maxSize=100000, idleTimeoutSeconds=300) + </annotation> + </domain> + + <domain name="Embedded Stateful Bean" extends="Base Stateful Bean" inheritBindings="true"> + <!-- NON Clustered cache configuration --> + <annotation expr="!class(@org.jboss.annotation.ejb.cache.Cache)"> + @org.jboss.annotation.ejb.cache.Cache (org.jboss.ejb3.cache.NoPassivationCache.class) + </annotation> + + </domain> + + <domain name="Message Driven Bean"> + <bind pointcut="execution(public * @javax.annotation.security.RunAs->*(..))"> + <interceptor-ref name="org.jboss.ejb3.security.RunAsSecurityInterceptorFactory"/> + </bind> + <bind pointcut="execution(public * *->*(..))"> + <interceptor-ref name="org.jboss.ejb3.stateless.StatelessInstanceInterceptor"/> + <interceptor-ref name="org.jboss.ejb3.tx.TxInterceptorFactory"/> + <interceptor-ref name="org.jboss.ejb3.AllowedOperationsInterceptor"/> + <interceptor-ref name="org.jboss.ejb3.entity.TransactionScopedEntityManagerInterceptor"/> + <interceptor-ref name="org.jboss.ejb3.interceptor.EJB3InterceptorsFactory"/> + </bind> + <annotation expr="!class(@org.jboss.annotation.ejb.PoolClass)"> + @org.jboss.annotation.ejb.PoolClass (value=org.jboss.ejb3.StrictMaxPool.class, maxSize=30, timeout=10000) + </annotation> + </domain> + + <domain name="Consumer Bean"> + <bind pointcut="execution(public * @javax.annotation.security.RunAs->*(..))"> + <interceptor-ref name="org.jboss.ejb3.security.RunAsSecurityInterceptorFactory"/> + </bind> + <bind pointcut="execution(public * *->*(..))"> + <interceptor-ref name="org.jboss.ejb3.stateless.StatelessInstanceInterceptor"/> + <interceptor-ref name="org.jboss.ejb3.tx.TxInterceptorFactory"/> + <interceptor-ref name="org.jboss.ejb3.AllowedOperationsInterceptor"/> + <interceptor-ref name="org.jboss.ejb3.entity.TransactionScopedEntityManagerInterceptor"/> + </bind> + <bind pointcut="execution(public * *->*(..)) AND (has(* *->@org.jboss.annotation.ejb.CurrentMessage(..)) OR hasfield(* *->@org.jboss.annotation.ejb.CurrentMessage))"> + <interceptor-ref name="org.jboss.ejb3.mdb.CurrentMessageInjectorInterceptorFactory"/> + </bind> + <bind pointcut="execution(public * *->*(..))"> + <interceptor-ref name="org.jboss.ejb3.interceptor.EJB3InterceptorsFactory"/> + </bind> + <annotation expr="!class(@org.jboss.annotation.ejb.PoolClass)"> + @org.jboss.annotation.ejb.PoolClass (value=org.jboss.ejb3.StrictMaxPool.class, maxSize=30, timeout=10000) + </annotation> + </domain> + + <domain name="Service Bean"> + <bind pointcut="execution(public * *->*(..))"> + <interceptor-ref name="org.jboss.ejb3.asynchronous.AsynchronousInterceptor"/> + <interceptor-ref name="org.jboss.ejb3.ENCPropagationInterceptor"/> + </bind> + <bind pointcut="!execution(* *->create()) AND !execution(* *->start()) AND !execution(*->new(..))"> + <interceptor-ref name="org.jboss.ejb3.security.AuthenticationInterceptorFactory"/> + </bind> + <bind pointcut="execution(public * @org.jboss.annotation.security.SecurityDomain->*(..))"> + <interceptor-ref name="Basic Authorization"/> + </bind> + <bind pointcut="execution(public * @javax.annotation.security.RunAs->*(..))"> + <interceptor-ref name="org.jboss.ejb3.security.RunAsSecurityInterceptorFactory"/> + </bind> + <bind pointcut="execution(public * *->*(..))"> + <interceptor-ref name="org.jboss.aspects.tx.TxPropagationInterceptor"/> + <interceptor-ref name="org.jboss.ejb3.tx.TxInterceptorFactory"/> + <interceptor-ref name="org.jboss.ejb3.AllowedOperationsInterceptor"/> + <interceptor-ref name="org.jboss.ejb3.entity.TransactionScopedEntityManagerInterceptor"/> + </bind> + <bind pointcut="execution(public * *->*(..)) AND !execution(* *->create()) AND !execution(* *->start())"> + <interceptor-ref name="org.jboss.ejb3.interceptor.EJB3InterceptorsFactory"/> + </bind> + </domain> + + <domain name="JACC Service Bean"> + <bind pointcut="execution(public * *->*(..))"> + <interceptor-ref name="org.jboss.ejb3.asynchronous.AsynchronousInterceptor"/> + <interceptor-ref name="org.jboss.ejb3.ENCPropagationInterceptor"/> + </bind> + <bind pointcut="!execution(* *->create()) AND !execution(* *->start()) AND !execution(*->new(..))"> + <interceptor-ref name="org.jboss.ejb3.security.AuthenticationInterceptorFactory"/> + </bind> + <bind pointcut="execution(public * @org.jboss.annotation.security.SecurityDomain->*(..))"> + <interceptor-ref name="Basic Authorization"/> + </bind> + <bind pointcut="execution(public * @javax.annotation.security.RunAs->*(..))"> + <interceptor-ref name="org.jboss.ejb3.security.RunAsSecurityInterceptorFactory"/> + </bind> + <bind pointcut="execution(public * *->*(..))"> + <interceptor-ref name="org.jboss.aspects.tx.TxPropagationInterceptor"/> + <interceptor-ref name="org.jboss.ejb3.tx.TxInterceptorFactory"/> + <interceptor-ref name="org.jboss.ejb3.AllowedOperationsInterceptor"/> + <interceptor-ref name="org.jboss.ejb3.entity.TransactionScopedEntityManagerInterceptor"/> + </bind> + <bind pointcut="execution(public * *->*(..)) AND !execution(* *->create()) AND !execution(* *->start())"> + <interceptor-ref name="org.jboss.ejb3.interceptor.EJB3InterceptorsFactory"/> + </bind> + </domain> + + +</aop> \ No newline at end of file diff --git a/modules/enterprise/server/itests/src/test/resources/embedded-jboss-beans.xml b/modules/enterprise/server/itests/src/test/resources/embedded-jboss-beans.xml new file mode 100644 index 0000000..05edefa --- /dev/null +++ b/modules/enterprise/server/itests/src/test/resources/embedded-jboss-beans.xml @@ -0,0 +1,160 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<deployment xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="urn:jboss:bean-deployer:2.0 bean-deployer_2_0.xsd" + xmlns="urn:jboss:bean-deployer:2.0"> + + <bean name="Naming" class="org.jnp.server.SingletonNamingServer"/> + + <bean name="InitialContextProperties" class="java.util.Hashtable"> + <constructor> + <parameter class="java.util.Map"> + <map keyClass="java.lang.String" valueClass="java.lang.String"> + <entry> + <key>java.naming.factory.initial</key> + <value>org.jnp.interfaces.LocalOnlyContextFactory</value> + </entry> + <entry> + <key>java.naming.factory.url.pkgs</key> + <value>org.jboss.naming:org.jnp.interfaces</value> + </entry> + </map> + </parameter> + </constructor> + </bean> + + <bean name="java:comp/Initializer" class="org.jboss.ejb3.embedded.JavaCompInitializer"> + <property name="jndiProperties"> + <inject bean="InitialContextProperties"/> + </property> + </bean> + + <bean name="XidFactory" class="org.jboss.tm.XidFactoryImpl"/> + + <bean name="XidFactoryMBean" class="org.jboss.ejb3.embedded.XidFactoryMBean"> + <constructor> + <parameter class="org.jboss.tm.XidFactoryBase"> + <inject bean="XidFactory"/> + </parameter> + </constructor> + </bean> + + <bean name="TransactionManagerInitializer" class="org.jboss.tm.TransactionManagerInitializer"> + <property name="xidFactory"> + <inject bean="XidFactory"/> + </property> + <property name="initialContextProperties"> + <inject bean="InitialContextProperties"/> + </property> + </bean> + + <bean name="UserTransaction" class="org.jboss.ejb3.embedded.UserTransactionImpl"> + <demand>TransactionManagerInitializer</demand> + </bean> + + <bean name="UserTransactionBinding" class="org.jboss.ejb3.embedded.JndiBinder"> + <property name="jndiProperties"> + <inject bean="InitialContextProperties"/> + </property> + <property name="target"> + <inject bean="UserTransaction"/> + </property> + <property name="bindTo">UserTransaction</property> + <property name="serializable">false</property> + </bean> + + + <bean name="TransactionManager" class="java.lang.Object"> + <constructor factoryMethod="getTransactionManager"> + <factory bean="TransactionManagerInitializer"/> + </constructor> + </bean> + <bean name="CachedConnectionManager" class="org.jboss.resource.connectionmanager.CachedConnectionManagerReference"> + <property name="transactionManager"> + <inject bean="TransactionManager"/> + </property> + </bean> + + <bean name="RHQDSBootstrap" class="org.jboss.resource.adapter.jdbc.local.LocalTxDataSource"> + <property name="driverClass">${rhq.test.ds.driver-class}</property> + <property name="connectionURL">${rhq.test.ds.connection-url}</property> + <property name="userName">${rhq.test.ds.user-name}</property> + <property name="password">${rhq.test.ds.password}</property> + <property name="jndiName">java:/RHQDS</property> + <property name="minSize">0</property> + <property name="maxSize">20</property> + <property name="blockingTimeout">3000</property> + <property name="idleTimeout">100000</property> + <property name="transactionManager"> + <inject bean="TransactionManager"/> + </property> + <property name="cachedConnectionManager"> + <inject bean="CachedConnectionManager"/> + </property> + <property name="initialContextProperties"> + <inject bean="InitialContextProperties"/> + </property> + </bean> + + <bean name="RHQDS" class="java.lang.Object"> + <constructor factoryMethod="getDatasource"> + <factory bean="RHQDSBootstrap"/> + </constructor> + </bean> + + <!-- needed for Quartz' no-TX data source (even though this is a local-tx, seems like Quartz is still working) --> + <bean name="NoTxRHQDSBootstrap" class="org.jboss.resource.adapter.jdbc.local.LocalTxDataSource"> + <property name="driverClass">${rhq.test.ds.driver-class}</property> + <property name="connectionURL">${rhq.test.ds.connection-url}</property> + <property name="userName">${rhq.test.ds.user-name}</property> + <property name="password">${rhq.test.ds.password}</property> + <property name="jndiName">java:/NoTxRHQDS</property> + <property name="minSize">0</property> + <property name="maxSize">10</property> + <property name="blockingTimeout">1000</property> + <property name="idleTimeout">100000</property> + <property name="transactionManager"> + <inject bean="TransactionManager"/> + </property> + <property name="cachedConnectionManager"> + <inject bean="CachedConnectionManager"/> + </property> + <property name="initialContextProperties"> + <inject bean="InitialContextProperties"/> + </property> + </bean> + + <bean name="NoTxRHQDS" class="java.lang.Object"> + <constructor factoryMethod="getDatasource"> + <factory bean="NoTxRHQDSBootstrap"/> + </constructor> + </bean> + + <bean name="DefaultDSBootstrap" class="org.jboss.resource.adapter.jdbc.local.LocalTxDataSource"> + <property name="driverClass">org.hsqldb.jdbcDriver</property> + <property name="connectionURL">jdbc:hsqldb:.</property> + <!-- <property name="connectionURL">jdbc:hsqldb:./hypersonic/localDB</property> --> + <property name="userName">sa</property> + <property name="jndiName">java:/DefaultDS</property> + <property name="minSize">0</property> + <property name="maxSize">10</property> + <property name="blockingTimeout">1000</property> + <property name="idleTimeout">100000</property> + <property name="transactionManager"> + <inject bean="TransactionManager"/> + </property> + <property name="cachedConnectionManager"> + <inject bean="CachedConnectionManager"/> + </property> + <property name="initialContextProperties"> + <inject bean="InitialContextProperties"/> + </property> + </bean> + + <bean name="DefaultDS" class="java.lang.Object"> + <constructor factoryMethod="getDatasource"> + <factory bean="DefaultDSBootstrap"/> + </constructor> + </bean> + +</deployment> \ No newline at end of file diff --git a/modules/enterprise/server/itests/src/test/resources/jboss-jms-beans.xml b/modules/enterprise/server/itests/src/test/resources/jboss-jms-beans.xml new file mode 100644 index 0000000..287cffc --- /dev/null +++ b/modules/enterprise/server/itests/src/test/resources/jboss-jms-beans.xml @@ -0,0 +1,132 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<deployment xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="urn:jboss:bean-deployer:2.0 bean-deployer_2_0.xsd" + xmlns="urn:jboss:bean-deployer:2.0"> + <bean name="jboss.mq:service=JMSProviderLoader,name=JMSProvider" class="org.jboss.jms.jndi.JNDIProviderAdapter"> + <property name="factoryRef">java:/JmsXA</property> + <property name="queueFactoryRef">java:/JmsXA</property> + <property name="topicFactoryRef">java:/JmsXA</property> + <property name="properties" class="java.util.Properties"> + <map keyClass="java.lang.String" valueClass="java.lang.String"> + <entry> + <key>java.naming.factory.initial</key> + <value>org.jnp.interfaces.LocalOnlyContextFactory</value> + </entry> + <entry> + <key>java.naming.factory.url.pkgs</key> + <value>org.jboss.naming:org.jnp.interfaces</value> + </entry> + </map> + </property> + </bean> + + <bean name="b1" class="org.jboss.ejb3.embedded.JndiBinder"> + <property name="jndiProperties"><inject bean="InitialContextProperties"/></property> + <property name="target"><inject bean="jboss.mq:service=JMSProviderLoader,name=JMSProvider"/></property> + <property name="bindTo">java:/DefaultJMSProvider</property> + <property name="serializable">true</property> + </bean> + + <bean name="jboss.mq:service=ServerSessionPoolMBean,name=StdJMSPool" class="org.jboss.jms.asf.StdServerSessionPoolFactory"> + <property name="name">StdJMSPool</property> + <property name="xidFactory"><inject bean="XidFactoryMBean"/></property> + <property name="transactionManager"><inject bean="TransactionManager"/></property> + </bean> + + <bean name="b2" class="org.jboss.ejb3.embedded.JndiBinder"> + <property name="jndiProperties"><inject bean="InitialContextProperties"/></property> + <property name="target"><inject bean="jboss.mq:service=ServerSessionPoolMBean,name=StdJMSPool"/></property> + <property name="bindTo">java:/StdJMSPool</property> + <property name="serializable">false</property> + </bean> + + + <bean name="jboss.mq:service=PersistenceManager" class="org.jboss.mq.pm.none.PersistenceManager"> + </bean> + + <bean name="jboss.mq:service=MessageCache" class="org.jboss.mq.kernel.MessageCache"> + <property name="persistenceManager"><inject bean="jboss.mq:service=PersistenceManager"/></property> + <property name="highMemoryMark">50</property> + <property name="maxMemoryMark">60</property> + </bean> + + <bean name="jms-rar-WorkManager" class="org.jboss.ejb3.embedded.resource.JBossWorkManager"> + </bean> + + <bean name="jms-rar-DeploymentInfo" class="org.jboss.ejb3.embedded.resource.Ejb3DeploymentInfo"> + <constructor> + <parameter class="java.lang.String">jms-ra.rar</parameter> + <parameter class="java.lang.String">javax.jms.MessageListener</parameter> + <parameter class="java.lang.String">org.jboss.resource.adapter.jms.inflow.JmsActivationSpec</parameter> + </constructor> + </bean> + + <bean name="jboss.jca:name='jms-ra.rar',service=RARDeployment" class="org.jboss.ejb3.embedded.resource.RARDeployment"> + <constructor> + <parameter class="org.jboss.deployment.DeploymentInfo"> + <inject bean="jms-rar-DeploymentInfo"/> + </parameter> + </constructor> + <property name="workManager"><inject bean="jms-rar-WorkManager"/></property> + </bean> + + <bean name="jboss.mq:service=StateManager" class="org.jboss.mq.sm.none.NullStateManager"> + </bean> + + <bean name="BasicQueueParameters" class="org.jboss.mq.server.BasicQueueParameters"/> + + <bean name="jboss.mq:service=ThreadPool" class="org.jboss.util.threadpool.BasicThreadPool"> + <property name="name">JMSThread</property> + <property name="threadGroupName">JBossMQ Server Threads</property> + <!-- The max number of threads in the pool --> + <property name="maximumPoolSize">10</property> + <!-- The max number of tasks before the queue is full --> + <property name="maximumQueueSize">1000</property> + <!-- The behavior of the pool when a task is added and the queue is full. + abort - a RuntimeException is thrown + run - the calling thread executes the task + wait - the calling thread blocks until the queue has room + discard - the task is silently discarded without being run + discardOldest - check to see if a task is about to complete and enque + the new task if possible, else run the task in the calling thread + --> + <property name="blockingMode">run</property> + </bean> + + <bean name="jboss.mq:service=DestinationManager" class="org.jboss.mq.server.JMSDestinationManager"> + <constructor> + <parameter class="org.jboss.mq.server.BasicQueueParameters"> + <inject bean="BasicQueueParameters"/> + </parameter> + </constructor> + <property name="persistenceManager"><inject bean="jboss.mq:service=PersistenceManager"/></property> + <property name="messageCache"><inject bean="jboss.mq:service=MessageCache"/></property> + <property name="stateManager"><inject bean="jboss.mq:service=StateManager"/></property> + <property name="threadPool"><inject bean="jboss.mq:service=ThreadPool"/></property> + <property name="threadGroup"><inject bean="jboss.mq:service=ThreadPool" property="threadGroup"/></property> + <start method="startServer"/> + <stop method="stopServer"/> + </bean> + + <bean name="jboss.mq.destination:service=Queue,name=DLQ" class="org.jboss.mq.kernel.Queue"> + <property name="destinationManagerPojo"><inject bean="jboss.mq:service=DestinationManager"/></property> + <property name="initialContextProperties"><inject bean="InitialContextProperties"/></property> + <property name="destinationName">DLQ</property> + </bean> + + <bean name="jboss.mq:service=Invoker" class="org.jboss.mq.server.JMSServerInvoker"> + <property name="next"><inject bean="jboss.mq:service=DestinationManager"/></property> + </bean> + + <bean name="jboss.mq:service=invocationlayer,type=JVM" class="org.jboss.mq.kernel.JVMIL"> + <property name="jmsInvoker"><inject bean="jboss.mq:service=Invoker"/></property> + <!-- notice we actually switched - the non-xa connection factory JNDI Ref is the JNDI name our EJBs use --> + <!-- the embedded EJB container doesn't support XA, so the connection factory our JmsXA JNDI lookup will return will be a non-XA factory --> + <property name="connectionFactoryJNDIRef">java:/JmsXA</property> + <property name="XAConnectionFactoryJNDIRef">java:/ConnectionFactory</property> + <property name="pingPeriod">0</property> + <property name="initialContextProperties"><inject bean="InitialContextProperties"/></property> + </bean> + +</deployment> diff --git a/modules/enterprise/server/itests/src/test/resources/jms-ra.rar b/modules/enterprise/server/itests/src/test/resources/jms-ra.rar new file mode 100644 index 0000000..c4807c6 Binary files /dev/null and b/modules/enterprise/server/itests/src/test/resources/jms-ra.rar differ diff --git a/modules/enterprise/server/itests/src/test/resources/jndi.properties b/modules/enterprise/server/itests/src/test/resources/jndi.properties new file mode 100644 index 0000000..9225cef --- /dev/null +++ b/modules/enterprise/server/itests/src/test/resources/jndi.properties @@ -0,0 +1,2 @@ +java.naming.factory.initial=org.jnp.interfaces.LocalOnlyContextFactory +java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces \ No newline at end of file diff --git a/modules/enterprise/server/itests/src/test/resources/log4j.xml b/modules/enterprise/server/itests/src/test/resources/log4j.xml new file mode 100644 index 0000000..bc65329 --- /dev/null +++ b/modules/enterprise/server/itests/src/test/resources/log4j.xml @@ -0,0 +1,74 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> + +<!-- ===================================================================== --> +<!-- --> +<!-- Log4j Configuration --> +<!-- --> +<!-- ===================================================================== --> + +<!-- $Id: log4j.xml 39945 2006-01-12 02:44:07Z bill $ --> + +<!-- + | For more configuration infromation and examples see the Jakarta Log4j + | owebsite: http://jakarta.apache.org/log4j + --> + +<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="true"> + + <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender"> + <errorHandler class="org.jboss.logging.util.OnlyOnceErrorHandler"/> + <param name="Target" value="System.out"/> + <param name="Threshold" value="WARN"/> + + <layout class="org.apache.log4j.PatternLayout"> + <!-- The default pattern: Date Priority [Category] Messagen --> + <!-- + <param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%c{1}] %m%n"/> + --> + <param name="ConversionPattern" value="%-5p %d{dd-MM HH:mm:ss,SSS} [%c] (%F:%M:%L) -%m%n"/> + </layout> + </appender> + + <appender name="FILE" class="org.apache.log4j.RollingFileAppender"> + <param name="File" value="target/server-jar-test.log"/> + <param name="Threshold" value="WARN"/> + <param name="Append" value="false"/> + + <layout class="org.apache.log4j.PatternLayout"> + <!-- The default pattern: Date Priority [Category] Messagen --> + <!-- + <param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%c{1}] %m%n"/> + --> + <param name="ConversionPattern" value="%-5p %d{dd-MM HH:mm:ss,SSS} [%c] (%F:%M:%L) -%m%n"/> + </layout> + </appender> + + <!-- Hibernate logs WARNINGS frequent from this class, in test envs. --> + <category name="org.hibernate.hql.ast.QueryTranslatorImpl"> + <priority value="ERROR"/> + </category> + + <!-- hides the TIMER SERVICE IS NOT INSTALLED warning - we know embedded EJB3 container doesn't support timers --> + <category name="org.jboss.ejb3.timerservice.jboss.JBossTimerServiceFactory"> + <priority value="ERROR"/> + </category> + + <!-- hides the shutdown warnings - for some reason, the container spits out some warnings when shutting down --> + <category name="org.jboss.kernel.plugins.dependency.StartStopLifecycleAction"> + <priority value="ERROR"/> + </category> + + <!-- Hibernate SQL logs --> + <!-- + <category name="org.hibernate.SQL"> + <priority value="DEBUG"/> + </category> + --> + + <root> + <appender-ref ref="CONSOLE"/> + <appender-ref ref="FILE"/> + </root> + +</log4j:configuration> diff --git a/modules/enterprise/server/itests/src/test/resources/login-config.xml b/modules/enterprise/server/itests/src/test/resources/login-config.xml new file mode 100644 index 0000000..645294d --- /dev/null +++ b/modules/enterprise/server/itests/src/test/resources/login-config.xml @@ -0,0 +1,72 @@ +<?xml version='1.0'?> + +<!DOCTYPE policy PUBLIC + "-//JBoss//DTD JBOSS Security Config 3.0//EN" + "http://www.jboss.org/j2ee/dtd/security_config.dtd"> + +<!-- The XML based JAAS login configuration read by the +org.jboss.security.auth.login.XMLLoginConfig mbean. Add +an application-policy element for each security domain. + +The outline of the application-policy is: +<application-policy name="security-domain-name"> + <authentication> + <login-module code="login.module1.class.name" flag="control_flag"> + <module-option name = "option1-name">option1-value</module-option> + <module-option name = "option2-name">option2-value</module-option> + ... + </login-module> + + <login-module code="login.module2.class.name" flag="control_flag"> + ... + </login-module> + ... + </authentication> +</application-policy> + +$Revision: 42748 $ +--> + +<policy> + <!-- Used by clients within the application server VM such as + mbeans and servlets that access EJBs. + --> + <application-policy name="client-login"> + <authentication> + <login-module code="org.jboss.security.ClientLoginModule" + flag="required"> + <!-- Any existing security context will be restored on logout --> + <module-option name="restore-login-identity">true</module-option> + </login-module> + </authentication> + </application-policy> + + <application-policy name = "jbossmq"> + <authentication> + <login-module code = "org.jboss.mq.sm.file.DynamicLoginModule" flag = "required"> + <module-option name = "unauthenticatedIdentity">guest</module-option> + <module-option name = "sm.objectname">jboss.mq:service=StateManager</module-option> + </login-module> + </authentication> + </application-policy> + + <application-policy name="other"> + <!-- A simple server login module, which can be used when the number + of users is relatively small. It uses two properties files: + users.properties, which holds users (key) and their password (value). + roles.properties, which holds users (key) and a comma-separated list of + their roles (value). + The unauthenticatedIdentity property defines the name of the principal + that will be used when a null username and password are presented as is + the case for an unuathenticated web client or MDB. If you want to + allow such users to be authenticated add the property, e.g., + unauthenticatedIdentity="nobody" + --> + <authentication> + <login-module code="org.jboss.security.auth.spi.UsersRolesLoginModule" + flag="required"/> + </authentication> + </application-policy> + +</policy> + diff --git a/modules/enterprise/server/itests/src/test/resources/rhq-mdb-beans.xml b/modules/enterprise/server/itests/src/test/resources/rhq-mdb-beans.xml new file mode 100644 index 0000000..ad05b5e --- /dev/null +++ b/modules/enterprise/server/itests/src/test/resources/rhq-mdb-beans.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<deployment xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="urn:jboss:bean-deployer:2.0 bean-deployer_2_0.xsd" + xmlns="urn:jboss:bean-deployer:2.0"> + + <bean name="jboss.mq.destination:service=Queue,name=AlertConditionQueue" class="org.jboss.mq.kernel.Queue"> + <property name="destinationManagerPojo"><inject bean="jboss.mq:service=DestinationManager"/></property> + <property name="initialContextProperties"><inject bean="InitialContextProperties"/></property> + <property name="destinationName">AlertConditionQueue</property> + </bean> + + <bean name="jboss.mq.destination:service=Queue,name=DriftChangesetQueue" class="org.jboss.mq.kernel.Queue"> + <property name="destinationManagerPojo"><inject bean="jboss.mq:service=DestinationManager"/></property> + <property name="initialContextProperties"><inject bean="InitialContextProperties"/></property> + <property name="destinationName">DriftChangesetQueue</property> + </bean> + + <bean name="jboss.mq.destination:service=Queue,name=DriftFileQueue" class="org.jboss.mq.kernel.Queue"> + <property name="destinationManagerPojo"><inject bean="jboss.mq:service=DestinationManager"/></property> + <property name="initialContextProperties"><inject bean="InitialContextProperties"/></property> + <property name="destinationName">DriftFileQueue</property> + </bean> + +</deployment> \ No newline at end of file diff --git a/modules/enterprise/server/itests/src/test/resources/security-beans.xml b/modules/enterprise/server/itests/src/test/resources/security-beans.xml new file mode 100644 index 0000000..84fa819 --- /dev/null +++ b/modules/enterprise/server/itests/src/test/resources/security-beans.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<deployment xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="urn:jboss:bean-deployer bean-deployer_1_0.xsd" + xmlns="urn:jboss:bean-deployer"> + + <bean class="org.jboss.ejb3.embedded.JaasSecurityManagerService" + name="jboss.security:service=JaasSecurityManager"> + <property name="initialContextProperties"> + <inject bean="InitialContextProperties"/> + </property> + </bean> +</deployment> diff --git a/modules/enterprise/server/itests/src/test/resources/test-assist-color-number.txt b/modules/enterprise/server/itests/src/test/resources/test-assist-color-number.txt new file mode 100644 index 0000000..6ad90cc --- /dev/null +++ b/modules/enterprise/server/itests/src/test/resources/test-assist-color-number.txt @@ -0,0 +1,46 @@ + +color[ number +c +color[ +n +number +r +color[ number +lo +color[ +number +number!= number!== number= number== +be +number +number== +number=="two" number=="four" number=="twenty-two" number=="twenty-four" number=="forty-two" +number==t +number=="two" number=="twenty-two" number=="twenty-four" number=="forty-two" +number==fo +number=="four" number=="twenty-four" number=="forty-two" +color +color[ +color[ +color[primary] color[other] +color[p +color[primary] +color[o +color[other] +color[r +color[primary] color[other] +color[primary +color[primary] +color[primary] +color[primary]!= color[primary]!== color[primary]= color[primary]== +color[primary]= +color[primary]="red" color[primary]="green" color[primary]="blue" +color[primary]=e +color[primary]="red" color[primary]="green" color[primary]="blue" +color[primary]=d +color[primary]="red" +color[primary]=g +color[primary]="green" +color[primary]=b +color[primary]="blue" +color[primary]=r +color[primary]="red" color[primary]="green" \ No newline at end of file diff --git a/modules/enterprise/server/itests/src/test/resources/test-ldap.properties b/modules/enterprise/server/itests/src/test/resources/test-ldap.properties new file mode 100644 index 0000000..3316083 --- /dev/null +++ b/modules/enterprise/server/itests/src/test/resources/test-ldap.properties @@ -0,0 +1,2 @@ +rhq.test.ldap.url=${rhq.test.ldap.url} +rhq.test.ldap.LDAPFactory=${rhq.test.ldap.LDAPFactory} \ No newline at end of file diff --git a/modules/enterprise/server/itests/src/test/resources/test-scheduler.properties b/modules/enterprise/server/itests/src/test/resources/test-scheduler.properties new file mode 100644 index 0000000..804639a --- /dev/null +++ b/modules/enterprise/server/itests/src/test/resources/test-scheduler.properties @@ -0,0 +1,29 @@ +# QUARTZ CONFIGURATION FOR OUR UNIT TESTS +# our test timeout will be fast, 5 seconds +rhq.server.operation-timeout = 5 + +# scheduler factory config +org.quartz.scheduler.instanceName = RHQScheduler +org.quartz.scheduler.instanceId = AUTO + +# thread pool config +org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool +org.quartz.threadPool.threadCount = 25 +org.quartz.threadPool.threadPriority = 5 + +# database config - note the use of POSTGRES for tests +org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreCMT +org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.PostgreSQLDelegate +# tests don't need this +org.quartz.jobStore.isClustered = false +org.quartz.jobStore.clusterCheckinInterval = 600000 +# make this a small non-zero time (in ms) so the scheduler (almost) never sleeps for more predictable test timing +org.quartz.scheduler.idleWaitTime = 10 +org.quartz.jobStore.tablePrefix = RHQ_QRTZ_ +org.quartz.jobStore.useProperties = true +org.quartz.jobStore.dataSource = RHQDS +org.quartz.dataSource.RHQDS.jndiURL = java:/RHQDS +org.quartz.dataSource.RHQDS.maxConnections = 10 +org.quartz.jobStore.nonManagedTXDataSource = NoTxRHQDS +org.quartz.dataSource.NoTxRHQDS.jndiURL = java:/NoTxRHQDS +org.quartz.dataSource.NoTxRHQDS.maxConnections = 10 \ No newline at end of file diff --git a/modules/enterprise/server/itests/src/test/resources/testng.xml b/modules/enterprise/server/itests/src/test/resources/testng.xml new file mode 100644 index 0000000..1452edb --- /dev/null +++ b/modules/enterprise/server/itests/src/test/resources/testng.xml @@ -0,0 +1,12 @@ +<!DOCTYPE suite SYSTEM "http://beust.com/testng/testng-1.0.dtd" > + +<suite name="EJB3 Testsuite" > + <test name="EJB3 tests" > + <groups> + <run> + <include name="integration.ejb3"/> + </run> + </groups> + + </test> +</suite> diff --git a/modules/enterprise/server/pom.xml b/modules/enterprise/server/pom.xml index 08b43b1..a83ff2b 100644 --- a/modules/enterprise/server/pom.xml +++ b/modules/enterprise/server/pom.xml @@ -40,7 +40,7 @@ <module>ear</module> <module>safe-invoker</module> <module>client-api</module> - <module>integration-tests</module> + <module>itests</module> </modules> </profile>
@@ -58,23 +58,6 @@ </modules> </profile>
- <profile> - <id>integration-tests</id> - <activation> - <property> - <name>rhq.itests</name> - </property> - </activation> - <modules> - <module>xml-schemas</module> - <module>jar</module> - <module>sars</module> - <module>plugins</module> - <module>client-api</module> - <module>integration-tests</module> - </modules> - </profile> - </profiles>
</project>
commit 424fa3cf665209465d0dd124a292845eaa05fa4a Author: John Sanda jsanda@redhat.com Date: Tue Nov 1 11:23:30 2011 -0400
Initial commit for integration-tests module
The server/integration-tests module was born out of the need to resolve a dependency issue for drift tests. There were drift tests in server/jar that depended on having a drift server plugin installed, but the server plugins are not built until after server/jar is built.
This commit moves tests over to the integrations-tests module which is built after server/jar and the plugins, thus resolving the dependency issue.
server/jar now produces a test jar artifact so that integration-tests has access to AbstractEJB3Test. A better, longer term solution would be to extract AbstractEJB3Test out into a common module since it is duplicated in core/domain as well. I don't have time for that right now though.
diff --git a/modules/enterprise/server/integration-tests/pom.xml b/modules/enterprise/server/integration-tests/pom.xml new file mode 100644 index 0000000..7c29615 --- /dev/null +++ b/modules/enterprise/server/integration-tests/pom.xml @@ -0,0 +1,556 @@ +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> + + <modelVersion>4.0.0</modelVersion> + + <parent> + <groupId>org.rhq</groupId> + <artifactId>rhq-parent</artifactId> + <version>4.1.0-SNAPSHOT</version> + <relativePath>../../../../pom.xml</relativePath> + </parent> + + <artifactId>rhq-server-integration-tests</artifactId> + + <name>RHQ Server Integration Tests</name> + <description>RHQ enterprise server integration tests</description> + + <scm> + <connection>scm:git:ssh://git.fedorahosted.org/git/rhq.git/modules/enterprise/server/integration-tests/</connection> + <developerConnection>scm:git:ssh://git.fedorahosted.org/git/rhq.git/modules/enterprise/server/integration-tests/</developerConnection> + </scm> + + <properties> + <rhq.server.datasource>java:/RHQDS</rhq.server.datasource> + <rhq.server.ds-mapping>PostgreSQL</rhq.server.ds-mapping> + <jboss-embeddable-ejb3.version>1.0.0.Alpha9</jboss-embeddable-ejb3.version> + </properties> + + <dependencies> + <dependency> + <groupId>org.rhq</groupId> + <artifactId>rhq-enterprise-comm</artifactId> + <version>${project.version}</version> + </dependency> + + <dependency> + <groupId>org.rhq</groupId> + <artifactId>rhq-enterprise-server-xml-schemas</artifactId> + <version>${project.version}</version> + </dependency> + + <dependency> + <groupId>org.rhq</groupId> + <artifactId>rhq-core-domain</artifactId> + <version>${project.version}</version> + </dependency> + + <dependency> + <groupId>org.rhq</groupId> + <artifactId>rhq-core-client-api</artifactId> + <version>${project.version}</version> + </dependency> + + <dependency> + <groupId>org.rhq</groupId> + <artifactId>rhq-common-drift</artifactId> + <version>${project.version}</version> + </dependency> + + <dependency> + <groupId>com.googlecode.java-diff-utils</groupId> + <artifactId>diffutils</artifactId> + <version>1.2.1</version> + </dependency> + + <!--================ Test Deps ================--> + + <!-- Note, the test deps are intentionally placed above the other scoped deps because of classpath + reasons. Maven orders the [test] classpath in the order listed in the pom. We specifically + need the embeddable-ejb3 jar above the standard ejb3 jars because we need the embeddble packages + loaded when testing. --> + + <dependency> + <groupId>org.rhq</groupId> + <artifactId>test-utils</artifactId> + <version>${project.version}</version> + <scope>test</scope> + <exclusions> + <exclusion> + <groupId>org.testng</groupId> + <artifactId>testng</artifactId> + </exclusion> + </exclusions> + </dependency> + + <dependency> + <groupId>org.rhq</groupId> + <artifactId>rhq-core-domain</artifactId> + <version>${project.version}</version> + <type>test-jar</type> + <scope>test</scope> + </dependency> + + <dependency> + <groupId>org.rhq</groupId> + <artifactId>rhq-enterprise-server</artifactId> + <version>${project.version}</version> + <scope>test</scope> + </dependency> + + <dependency> + <groupId>org.rhq</groupId> + <artifactId>rhq-enterprise-server</artifactId> + <version>${project.version}</version> + <type>test-jar</type> + <scope>test</scope> + </dependency> + + <dependency> + <groupId>${project.groupId}</groupId> + <artifactId>rhq-core-client-api</artifactId> + <version>${project.version}</version> + <type>test-jar</type> + <scope>test</scope> + </dependency> + + <dependency> + <groupId>org.rhq.helpers</groupId> + <artifactId>perftest-support</artifactId> + <version>${project.version}</version> + <scope>test</scope> + <exclusions> + <exclusion> + <groupId>ant</groupId> + <artifactId>ant</artifactId> + </exclusion> + <exclusion> + <groupId>ant</groupId> + <artifactId>ant-launcher</artifactId> + </exclusion> + </exclusions> + </dependency> + + <dependency> + <groupId>jboss.jboss-embeddable-ejb3</groupId> + <artifactId>jboss-ejb3-all</artifactId> + <version>${jboss-embeddable-ejb3.version}</version> + <scope>test</scope> + </dependency> + + <!-- NOTE: The remaining test deps correspond to the classes contained in hibernate-all.jar and thirdparty-all.jar. --> + + <dependency> + <groupId>antlr</groupId> + <artifactId>antlr</artifactId> + <version>2.7.7</version> + <scope>test</scope> + </dependency> + + <dependency> + <groupId>jboss</groupId> + <artifactId>javassist</artifactId> + <!-- NOTE: The version is defined in the root POM's dependencyManagement section. --> + <scope>test</scope> + </dependency> + + <dependency> + <groupId>trove</groupId> + <artifactId>trove</artifactId> + <version>1.0.2</version> + <scope>test</scope> + </dependency> + + <dependency> + <groupId>xerces</groupId> + <artifactId>xercesImpl</artifactId> + <version>2.8.1</version> + <scope>test</scope> + </dependency> + + <dependency> + <groupId>net.sf.opencsv</groupId> + <artifactId>opencsv</artifactId> + <version>1.8</version> + <scope>test</scope> + </dependency> + + <dependency> + <groupId>commons-jxpath</groupId> + <artifactId>commons-jxpath</artifactId> + <version>1.3</version> + <scope>test</scope> + </dependency> + + + <!-- 3rd Party Deps --> + + <dependency> + <groupId>org.antlr</groupId> + <artifactId>antlr</artifactId> + <version>3.2</version> + </dependency> + + <!-- Required by a couple APL and Lather classes - TODO: Remove this once APL and Lather have been excised. --> + <dependency> + <groupId>commons-beanutils</groupId> + <artifactId>commons-beanutils</artifactId> + <version>1.6.1</version> + </dependency> + + <!-- Required by a couple APL classes - TODO: Remove this once APL has been removed. --> + <!-- also required by EJB3 Embedded (test scope) --> + <dependency> + <groupId>commons-collections</groupId> + <artifactId>commons-collections</artifactId> + <version>3.2</version> + </dependency> + + <dependency> + <groupId>commons-httpclient</groupId> + <artifactId>commons-httpclient</artifactId> + <version>3.0.1</version> + </dependency> + + <dependency> + <groupId>commons-lang</groupId> + <artifactId>commons-lang</artifactId> + <version>2.4</version> + </dependency> + + <!-- Required by a couple APL classes - TODO: Remove this once APL has been removed. --> + <dependency> + <groupId>commons-validator</groupId> + <artifactId>commons-validator</artifactId> + <version>1.1.4</version> + </dependency> + + <!-- required by RHQ server classes, as well as EJB3 Embedded --> + <dependency> + <groupId>dom4j</groupId> + <artifactId>dom4j</artifactId> + <version>1.6.1-jboss</version> + <scope>runtime</scope> + </dependency> + + <dependency> + <groupId>gnu-getopt</groupId> + <artifactId>getopt</artifactId> + <!-- NOTE: The version is defined in the root POM's dependencyManagement section. --> + </dependency> + + <dependency> + <groupId>hibernate</groupId> + <artifactId>hibernate3</artifactId> + <!-- NOTE: The version is defined in the root POM's dependencyManagement section. --> + <scope>provided</scope> <!-- by JBossAS --> + </dependency> + + <dependency> + <groupId>hibernate-annotations</groupId> + <artifactId>hibernate-annotations</artifactId> + <!-- NOTE: The version is defined in the root POM's dependencyManagement section. --> + <scope>provided</scope> <!-- by JBossAS --> + </dependency> + + <dependency> + <groupId>hibernate-entitymanager</groupId> + <artifactId>hibernate-entitymanager</artifactId> + <!-- NOTE: The version is defined in the root POM's dependencyManagement section. --> + <scope>provided</scope> <!-- by JBossAS --> + </dependency> + + <dependency> + <groupId>i18nlog</groupId> + <artifactId>i18nlog</artifactId> + </dependency> + + <dependency> + <groupId>org.apache.geronimo.specs</groupId> + <artifactId>geronimo-javamail_1.3.1_spec</artifactId> + <!-- The Sun javamail jar isn't available from a public repo due to licensing issues, + so use the Geronimo one instead. --> + <version>1.3</version> + <scope>provided</scope> <!-- by JBossAS --> + </dependency> + + <dependency> + <groupId>javax.persistence</groupId> + <artifactId>persistence-api</artifactId> + <version>1.0</version> + <scope>provided</scope> <!-- by JBossAS --> + </dependency> + + <dependency> + <groupId>javax.servlet</groupId> + <artifactId>servlet-api</artifactId> + <version>2.4</version> + <scope>provided</scope> <!-- by JBossAS --> + </dependency> + + <dependency> + <groupId>javax.servlet</groupId> + <artifactId>jsp-api</artifactId> + <version>2.0</version> + <scope>provided</scope> <!-- by JBossAS --> + </dependency> + + <dependency> + <groupId>jboss</groupId> + <artifactId>jboss-annotations-ejb3</artifactId> + <!-- NOTE: The version is defined in the root POM's dependencyManagement section. --> + <scope>provided</scope> <!-- by JBossAS --> + </dependency> + + <dependency> + <groupId>jboss</groupId> + <artifactId>jboss-cache</artifactId> + <!-- NOTE: The version is defined in the root POM's dependencyManagement section. --> + <scope>compile</scope> + </dependency> + + <dependency> + <groupId>jboss</groupId> + <artifactId>jboss-common</artifactId> + <!-- NOTE: The version is defined in the root POM's dependencyManagement section. --> + <scope>provided</scope> <!-- by JBossAS --> + </dependency> + + <dependency> + <groupId>jboss</groupId> + <artifactId>jboss-ejb3x</artifactId> + <!-- NOTE: The version is defined in the root POM's dependencyManagement section. --> + <scope>provided</scope> <!-- by JBossAS --> + </dependency> + + <!-- includes the org.jboss.ejb3.StrictMaxPool class, which is needed by the PoolClass annotation used on some + of our SLSB's --> + <dependency> + <groupId>jboss</groupId> + <artifactId>jboss-ejb3</artifactId> + <!-- NOTE: The version is defined in the root POM's dependencyManagement section. --> + <scope>provided</scope> <!-- by JBossAS --> + </dependency> + + <dependency> + <groupId>jboss</groupId> + <artifactId>jboss-j2ee</artifactId> + <!-- NOTE: The version is defined in the root POM's dependencyManagement section. --> + <scope>provided</scope> <!-- by JBossAS --> + </dependency> + + <dependency> + <groupId>jboss</groupId> + <artifactId>jboss-jmx</artifactId> + <!-- NOTE: The version is defined in the root POM's dependencyManagement section. --> + <scope>provided</scope> <!-- by JBossAS --> + </dependency> + + <dependency> + <groupId>jboss</groupId> + <artifactId>jboss-system</artifactId> + <!-- NOTE: The version is defined in the root POM's dependencyManagement section. --> + <scope>provided</scope> <!-- by JBossAS --> + </dependency> + + <dependency> + <groupId>jboss</groupId> + <artifactId>jbosssx</artifactId> + <!-- NOTE: The version is defined in the root POM's dependencyManagement section. --> + <scope>provided</scope> <!-- by JBossAS --> + </dependency> + + <dependency> + <groupId>jboss</groupId> + <artifactId>jbpm</artifactId> + <version>3.1.1</version> + </dependency> + + <!-- for the transaction interrupt EJB3 interceptor --> + <dependency> + <groupId>org.jboss.transaction</groupId> + <artifactId>jboss-jta</artifactId> + <!-- NOTE: The version is defined in the root POM's dependencyManagement section. --> + <scope>provided</scope> <!-- by JBossAS --> + </dependency> + + <dependency> + <groupId>org.opensymphony.quartz</groupId> + <artifactId>quartz</artifactId> + <!-- NOTE: The version is defined in the root POM's dependencyManagement section. --> + <scope>provided</scope> <!-- by JBossAS itself, which the container build has packaged with 1.6.5 --> + </dependency> + + <dependency> + <groupId>org.opensymphony.quartz</groupId> + <artifactId>quartz-oracle</artifactId> + <!-- NOTE: The version is defined in the root POM's dependencyManagement section. --> + <scope>provided</scope> <!-- by JBossAS itself, which the container build has packaged with 1.6.5 --> + </dependency> + + <dependency> + <groupId>org.easymock</groupId> + <artifactId>easymockclassextension</artifactId> + <version>2.2</version> + <scope>test</scope> + <!-- somehow this is needed otherwise the hibernate stuff doesn't initialize in our tests --> + </dependency> + + <dependency> + <groupId>org.snmp4j</groupId> + <artifactId>snmp4j</artifactId> + <version>1.8.2</version> + </dependency> + + <!-- required by RHQ server classes, as well as EJB3 Embedded --> + <dependency> + <groupId>oswego-concurrent</groupId> + <artifactId>concurrent</artifactId> + <version>1.3.4</version> + </dependency> + + <!-- TODO: Why is this needed? --> + <dependency> + <groupId>postgresql</groupId> + <artifactId>postgresql</artifactId> + <!--<scope>test</scope>--> + </dependency> + + <dependency> + <groupId>rss4j</groupId> + <artifactId>rss4j</artifactId> + <version>0.92-on.2</version> + </dependency> + + <dependency> + <groupId>tomcat</groupId> + <artifactId>catalina</artifactId> + <version>5.5.20</version> + <scope>provided</scope> + </dependency> + + <dependency> + <groupId>tomcat</groupId> + <artifactId>tomcat-jk</artifactId> + <version>4.1.31</version> + <scope>provided</scope> + </dependency> + + <!-- Needed by com.jboss.jbossnetwork.apl.actions.xml.XPathProcessor; TODO: Remove once APL has been excised. --> + <dependency> + <groupId>xalan</groupId> + <artifactId>xalan</artifactId> + <version>2.5.1</version> + <scope>provided</scope> + </dependency> + + <dependency> + <groupId>com.jcraft</groupId> + <artifactId>jsch</artifactId> + <version>0.1.29</version> + </dependency> + + <dependency> + <groupId>org.jboss.el</groupId> + <artifactId>jboss-el</artifactId> + <version>2.0.1.GA</version> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>org.freemarker</groupId> + <artifactId>freemarker</artifactId> + <version>2.3.18</version> + <scope>provided</scope> + </dependency> + + <dependency> + <groupId>org.rhq</groupId> + <artifactId>rhq-core-dbutils</artifactId> + <version>${project.version}</version> + <exclusions> + <exclusion> + <groupId>ant</groupId> + <artifactId>ant</artifactId> + </exclusion> + </exclusions> + </dependency> + </dependencies> + + <build> + <testResources> + <testResource> + <directory>src/test/resources</directory> + <filtering>true</filtering> + </testResource> + </testResources> + + <plugins> + <plugin> + <artifactId>maven-antrun-plugin</artifactId> + <executions> + + <execution> + <phase>process-classes</phase> + <configuration> + <tasks> + <!-- generate the I18N resource bundles --> + <taskdef name="i18n" classpathref="maven.runtime.classpath" classname="mazz.i18n.ant.I18NAntTask" /> + + <i18n outputdir="${project.build.outputDirectory}" defaultlocale="en" verbose="false" append="false" verify="true"> + <classpath refid="maven.runtime.classpath" /> + <classfileset dir="${project.build.outputDirectory}"> + <include name="**/ServerI18NResourceKeys.class" /> + <include name="**/AlertI18NResourceKeys.class" /> + </classfileset> + </i18n> + + <!-- create our rhq-server-version.properties file that goes in our jar --> + <tstamp> + <format property="build.time" pattern="dd.MMM.yyyy HH.mm.ss z" /> + </tstamp> + + <echo file="${project.build.outputDirectory}/rhq-server-version.properties" append="false">Product-Name=${rhq.product.name} +Product-Version=${project.version} +Module-Name=${project.name} +Module-Version=${project.version} +Build-Number=${buildNumber} +Build-Date=${build.time} +Build-Jdk-Vendor=${java.vendor} +Build-Jdk=${java.version} +Build-OS-Name=${os.name} +Build-OS-Version=${os.version} +</echo> + </tasks> + </configuration> + <goals> + <goal>run</goal> + </goals> + </execution> + + <!-- in order to get JMS to work properly in embedded test container, extract jms-rs.rar classes --> + <execution> + <id>Extract JMS classes from RAR needed for JMS tests</id> + <phase>process-classes</phase> + <configuration> + <tasks> + <unzip src="src/test/resources/jms-ra.rar" dest="target"> + <patternset> + <include name="jms-ra.jar"/> + </patternset> + </unzip> + <unzip src="target/jms-ra.jar" dest="target/test-classes"> + <patternset> + <include name="org/**"/> + </patternset> + </unzip> + </tasks> + </configuration> + <goals> + <goal>run</goal> + </goals> + </execution> + + </executions> + </plugin> + </plugins> + </build> +</project> diff --git a/modules/enterprise/server/integration-tests/src/test/java/org/rhq/enterprise/server/drift/DriftServerPluginService.java b/modules/enterprise/server/integration-tests/src/test/java/org/rhq/enterprise/server/drift/DriftServerPluginService.java new file mode 100644 index 0000000..64c6537 --- /dev/null +++ b/modules/enterprise/server/integration-tests/src/test/java/org/rhq/enterprise/server/drift/DriftServerPluginService.java @@ -0,0 +1,146 @@ +/* + * RHQ Management Platform + * Copyright (C) 2011 Red Hat, Inc. + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation version 2 of the License. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +package org.rhq.enterprise.server.drift; + +import java.io.File; +import java.net.URL; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.rhq.core.domain.configuration.Configuration; +import org.rhq.core.domain.configuration.definition.ConfigurationDefinition; +import org.rhq.core.domain.plugin.PluginKey; +import org.rhq.core.domain.plugin.PluginStatusType; +import org.rhq.core.domain.plugin.ServerPlugin; +import org.rhq.core.util.MessageDigestGenerator; +import org.rhq.enterprise.server.plugin.pc.AbstractTypeServerPluginContainer; +import org.rhq.enterprise.server.plugin.pc.MasterServerPluginContainer; +import org.rhq.enterprise.server.plugin.pc.MasterServerPluginContainerConfiguration; +import org.rhq.enterprise.server.plugin.pc.ServerPluginEnvironment; +import org.rhq.enterprise.server.plugin.pc.ServerPluginManager; +import org.rhq.enterprise.server.plugin.pc.ServerPluginService; +import org.rhq.enterprise.server.plugin.pc.ServerPluginType; +import org.rhq.enterprise.server.plugin.pc.drift.DriftServerPluginContainer; +import org.rhq.enterprise.server.plugin.pc.drift.DriftServerPluginManager; +import org.rhq.enterprise.server.xmlschema.ServerPluginDescriptorMetadataParser; +import org.rhq.enterprise.server.xmlschema.generated.serverplugin.ServerPluginDescriptorType; + +public class DriftServerPluginService extends ServerPluginService implements DriftServerPluginServiceMBean { + + public TestMasterServerPluginContainer master; + public MasterServerPluginContainerConfiguration masterConfig; + + public DriftServerPluginService() { + // build the config at constructor time so tests have it even before the PC is initialized + File dir = new File(System.getProperty("java.io.tmpdir"), "test-server-plugins"); + this.masterConfig = new MasterServerPluginContainerConfiguration(dir, dir, dir, null); + } + + @Override + public MasterServerPluginContainer createMasterPluginContainer() { + this.master = new TestMasterServerPluginContainer(); + this.master.initialize(this.masterConfig); + return this.master; + } + + class TestMasterServerPluginContainer extends MasterServerPluginContainer { + @Override + protected ClassLoader createRootServerPluginClassLoader() { + return getClass().getClassLoader(); + } + + @Override + protected Map<URL, ? extends ServerPluginDescriptorType> preloadAllPlugins() throws Exception { + // if our test never setup any plugins, ignore it and just return an empty map + File pluginDir = getConfiguration().getPluginDirectory(); + if (pluginDir == null || pluginDir.listFiles() == null || pluginDir.listFiles().length == 0) { + return new HashMap<URL, ServerPluginDescriptorType>(); + } else { + return super.preloadAllPlugins(); + } + } + + @Override + protected List<PluginKey> getDisabledPluginKeys() { + // in the real world, the db is checked for enable flag, here we say all plugins are enabled + return new ArrayList<PluginKey>(); + } + + @Override + protected List<AbstractTypeServerPluginContainer> createPluginContainers() { + ArrayList<AbstractTypeServerPluginContainer> pcs = new ArrayList<AbstractTypeServerPluginContainer>(1); + DriftServerPluginContainer driftPC = new TestDriftServerPluginContainer(this); + pcs.add(driftPC); + + return pcs; + } + } + + class TestDriftServerPluginContainer extends DriftServerPluginContainer { + public TestDriftServerPluginContainer(MasterServerPluginContainer master) { + super(master); + } + + @Override + protected ServerPluginManager createPluginManager() { + return new TestDriftServerPluginManager(this); + } + } + + class TestDriftServerPluginManager extends DriftServerPluginManager { + public TestDriftServerPluginManager(DriftServerPluginContainer pc) { + super(pc); + } + + @Override + protected ServerPlugin getPlugin(ServerPluginEnvironment env) { + try { + Configuration pluginConfig = null; + Configuration scheduledJobsConfig = null; + ConfigurationDefinition configDef; + + ServerPluginDescriptorType pluginDescriptor = env.getPluginDescriptor(); + + configDef = ServerPluginDescriptorMetadataParser.getPluginConfigurationDefinition(pluginDescriptor); + if (configDef != null) { + pluginConfig = configDef.getDefaultTemplate().createConfiguration(); + } + + configDef = ServerPluginDescriptorMetadataParser.getScheduledJobsDefinition(pluginDescriptor); + if (configDef != null) { + scheduledJobsConfig = configDef.getDefaultTemplate().createConfiguration(); + } + + File pluginFile = new File(env.getPluginUrl().toURI()); + ServerPlugin plugin = new ServerPlugin(0, env.getPluginKey().getPluginName(), pluginFile.getName(), + pluginDescriptor.getDisplayName(), true, PluginStatusType.INSTALLED, pluginDescriptor + .getDescription(), "", MessageDigestGenerator.getDigestString(pluginFile), pluginDescriptor + .getVersion(), pluginDescriptor.getVersion(), pluginConfig, scheduledJobsConfig, + new ServerPluginType(pluginDescriptor).stringify(), System.currentTimeMillis(), System + .currentTimeMillis()); + return plugin; + } catch (Exception e) { + throw new RuntimeException(e); + } + } + } +} diff --git a/modules/enterprise/server/integration-tests/src/test/java/org/rhq/enterprise/server/drift/DriftServerPluginServiceMBean.java b/modules/enterprise/server/integration-tests/src/test/java/org/rhq/enterprise/server/drift/DriftServerPluginServiceMBean.java new file mode 100644 index 0000000..d38374e --- /dev/null +++ b/modules/enterprise/server/integration-tests/src/test/java/org/rhq/enterprise/server/drift/DriftServerPluginServiceMBean.java @@ -0,0 +1,25 @@ +/* + * RHQ Management Platform + * Copyright (C) 2011 Red Hat, Inc. + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation version 2 of the License. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +package org.rhq.enterprise.server.drift; + +import org.rhq.enterprise.server.plugin.pc.ServerPluginServiceManagement; + +public interface DriftServerPluginServiceMBean extends ServerPluginServiceManagement { +} diff --git a/modules/enterprise/server/integration-tests/src/test/java/org/rhq/enterprise/server/drift/DriftServerTest.java b/modules/enterprise/server/integration-tests/src/test/java/org/rhq/enterprise/server/drift/DriftServerTest.java new file mode 100644 index 0000000..7db3365 --- /dev/null +++ b/modules/enterprise/server/integration-tests/src/test/java/org/rhq/enterprise/server/drift/DriftServerTest.java @@ -0,0 +1,241 @@ +/* + * RHQ Management Platform + * Copyright (C) 2011 Red Hat, Inc. + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation version 2 of the License. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +package org.rhq.enterprise.server.drift; + +import static org.rhq.core.domain.resource.ResourceCategory.SERVER; +import static org.rhq.enterprise.server.util.LookupUtil.getSubjectManager; + +import java.io.File; +import java.lang.reflect.Method; +import java.util.List; + +import javax.persistence.EntityManager; +import javax.persistence.NoResultException; +import javax.persistence.NonUniqueResultException; + +import org.apache.commons.io.FileUtils; +import org.testng.annotations.AfterClass; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +import org.rhq.core.domain.auth.Subject; +import org.rhq.core.domain.drift.Drift; +import org.rhq.core.domain.drift.DriftDefinition; +import org.rhq.core.domain.drift.DriftDefinitionTemplate; +import org.rhq.core.domain.resource.Agent; +import org.rhq.core.domain.resource.Resource; +import org.rhq.core.domain.resource.ResourceType; +import org.rhq.core.domain.shared.ResourceBuilder; +import org.rhq.core.domain.shared.ResourceTypeBuilder; +import org.rhq.enterprise.server.plugin.ServerPluginsLocal; +import org.rhq.enterprise.server.test.AbstractEJB3Test; +import org.rhq.enterprise.server.test.TestServerCommunicationsService; +import org.rhq.test.TransactionCallback; + +@Test(groups = "drift") +public class DriftServerTest extends AbstractEJB3Test { + + protected final String RESOURCE_TYPE_NAME = getClass().getSimpleName() + "_RESOURCE_TYPE"; + + protected final String AGENT_NAME = getClass().getSimpleName() + "_AGENT"; + + protected final String RESOURCE_NAME = getClass().getSimpleName() + "_RESOURCE"; + + private ServerPluginsLocal serverPluginsMgr; + + protected DriftServerPluginService driftServerPluginService; + + protected TestServerCommunicationsService agentServiceContainer; + + protected ResourceType resourceType; + + protected Agent agent; + + protected Resource resource; + + @BeforeMethod + public void initServices(Method testMethod) throws Exception { + initDriftServer(); + initAgentServices(); + + InitDB annotation = testMethod.getAnnotation(InitDB.class); + if (annotation == null || annotation.value()) { + initDB(); + } + } + + private void initDriftServer() throws Exception { + driftServerPluginService = new DriftServerPluginService(); + prepareCustomServerPluginService(driftServerPluginService); + driftServerPluginService.masterConfig.getPluginDirectory().mkdirs(); + + File jpaDriftPlugin = new File("../plugins/drift-rhq/target/rhq-serverplugin-drift-4.1.0-SNAPSHOT.jar"); + assertTrue("Drift server plugin JAR file not found at" + jpaDriftPlugin.getPath(), jpaDriftPlugin.exists()); + FileUtils.copyFileToDirectory(jpaDriftPlugin, driftServerPluginService.masterConfig.getPluginDirectory()); + + driftServerPluginService.startMasterPluginContainer(); + + //serverPluginsMgr = LookupUtil.getServerPlugins(); + } + + private void initAgentServices() { + agentServiceContainer = prepareForTestAgents(); + agentServiceContainer.driftService = new TestDefService(); + } + + @AfterMethod(inheritGroups = true) + public void shutDownServices() throws Exception { + shutDownDriftServer(); + shutDownAgentServices(); + } + + private void shutDownDriftServer() throws Exception { + unprepareServerPluginService(); + driftServerPluginService.stopMasterPluginContainer(); + } + + private void shutDownAgentServices() { + agentServiceContainer = null; + unprepareForTestAgents(); + } + + @AfterClass(inheritGroups = true) + public void cleanUpDB() throws Exception { + purgeDB(); + executeInTransaction(new TransactionCallback() { + @Override + public void execute() throws Exception { + purgeDB(getEntityManager()); + } + }); + } + + private void initDB() throws Exception { + purgeDB(); + executeInTransaction(new TransactionCallback() { + @Override + public void execute() throws Exception { + EntityManager em = getEntityManager(); + initResourceType(); + initAgent(); + initResource(); + + em.persist(resourceType); + em.persist(agent); + resource.setAgent(agent); + em.persist(resource); + + initDB(em); + } + }); + } + + private void purgeDB() { + executeInTransaction(new TransactionCallback() { + @Override + public void execute() throws Exception { + EntityManager em = getEntityManager(); + + em.createQuery("delete from JPADrift ").executeUpdate(); + em.createQuery("delete from JPADriftChangeSet").executeUpdate(); + em.createQuery("delete from JPADriftSet").executeUpdate(); + em.createQuery("delete from JPADriftFile").executeUpdate(); + em.createQuery("delete from DriftDefinition").executeUpdate(); + em.createQuery("delete from DriftDefinitionTemplate").executeUpdate(); + + deleteEntity(Resource.class, RESOURCE_NAME, em); + deleteEntity(Agent.class, AGENT_NAME, em); + deleteEntity(ResourceType.class, RESOURCE_TYPE_NAME, em); + + purgeDB(em); + } + }); + } + + protected void purgeDB(EntityManager em) { + } + + protected void initDB(EntityManager em) { + } + + protected void deleteEntity(Class<?> clazz, String name, EntityManager em) { + try { + Object entity = em.createQuery( + "select entity from " + clazz.getSimpleName() + " entity where entity.name = :name") + .setParameter("name", name) + .getSingleResult(); + em.remove(entity); + } catch (NoResultException e) { + // we can ignore no results because this code will run when the db + // is empty and we expect no results in that case + } catch (NonUniqueResultException e) { + // we will fail here to let the person running the test know that + // the database may not be in a consistent state + fail("Purging " + name + " failed. Expected to find one instance of " + clazz.getSimpleName() + + " but found more than one. The database may not be in a consistent state."); + } + } + + protected void initResourceType() { + resourceType = new ResourceTypeBuilder().createResourceType() + .withId(0) + .withName(RESOURCE_TYPE_NAME) + .withCategory(SERVER) + .withPlugin(RESOURCE_TYPE_NAME.toLowerCase()) + .build(); + } + + protected void initAgent() { + agent = new Agent(AGENT_NAME, "localhost", 1, "", AGENT_NAME + "_TOKEN"); + } + + protected void initResource() { + resource = new ResourceBuilder().createResource() + .withId(0) + .withName(RESOURCE_NAME) + .withResourceKey(RESOURCE_NAME) + .withRandomUuid() + .withResourceType(resourceType) + .build(); + } + + protected Subject getOverlord() { + return getSubjectManager().getOverlord(); + } + + protected String toString(DriftDefinition def) { + return "DriftDefinition[id: " + def.getId() + ", name: " + def.getName() + "]"; + } + + protected String toString(DriftDefinitionTemplate template) { + return DriftDefinitionTemplate.class.getSimpleName() + "[id: " + template.getId() + ", name: " + + template.getName() + "]"; + } + + protected Drift findDriftByPath(List<? extends Drift> drifts, String path) { + for (Drift drift : drifts) { + if (drift.getPath().equals(path)) { + return drift; + } + } + return null; + } +} diff --git a/modules/enterprise/server/integration-tests/src/test/java/org/rhq/enterprise/server/drift/DriftTemplateManagerBeanTest.java b/modules/enterprise/server/integration-tests/src/test/java/org/rhq/enterprise/server/drift/DriftTemplateManagerBeanTest.java new file mode 100644 index 0000000..de93b74 --- /dev/null +++ b/modules/enterprise/server/integration-tests/src/test/java/org/rhq/enterprise/server/drift/DriftTemplateManagerBeanTest.java @@ -0,0 +1,603 @@ +/* + * RHQ Management Platform + * Copyright (C) 2011 Red Hat, Inc. + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation version 2 of the License. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +package org.rhq.enterprise.server.drift; + +import static java.util.Arrays.asList; +import static org.rhq.core.domain.common.EntityContext.forResource; +import static org.rhq.core.domain.drift.DriftCategory.FILE_ADDED; +import static org.rhq.core.domain.drift.DriftChangeSetCategory.COVERAGE; +import static org.rhq.core.domain.drift.DriftChangeSetCategory.DRIFT; +import static org.rhq.core.domain.drift.DriftConfigurationDefinition.BaseDirValueContext.fileSystem; +import static org.rhq.core.domain.drift.DriftConfigurationDefinition.DriftHandlingMode.normal; +import static org.rhq.core.domain.drift.DriftConfigurationDefinition.DriftHandlingMode.plannedChanges; +import static org.rhq.core.domain.drift.DriftDefinitionComparator.CompareMode.BOTH_BASE_INFO_AND_DIRECTORY_SPECIFICATIONS; +import static org.rhq.enterprise.server.safeinvoker.HibernateDetachUtility.SerializationType.SERIALIZATION; +import static org.rhq.enterprise.server.util.LookupUtil.getDriftManager; +import static org.rhq.enterprise.server.util.LookupUtil.getDriftTemplateManager; +import static org.rhq.test.AssertUtils.assertPropertiesMatch; + +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; + +import javax.ejb.EJBException; +import javax.persistence.EntityManager; + +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; + +import org.rhq.core.domain.configuration.Configuration; +import org.rhq.core.domain.criteria.DriftDefinitionCriteria; +import org.rhq.core.domain.criteria.DriftDefinitionTemplateCriteria; +import org.rhq.core.domain.criteria.GenericDriftChangeSetCriteria; +import org.rhq.core.domain.criteria.JPADriftChangeSetCriteria; +import org.rhq.core.domain.drift.Drift; +import org.rhq.core.domain.drift.DriftChangeSet; +import org.rhq.core.domain.drift.DriftDefinition; +import org.rhq.core.domain.drift.DriftDefinitionComparator; +import org.rhq.core.domain.drift.DriftDefinitionTemplate; +import org.rhq.core.domain.drift.DriftSnapshot; +import org.rhq.core.domain.drift.Filter; +import org.rhq.core.domain.drift.JPADrift; +import org.rhq.core.domain.drift.JPADriftChangeSet; +import org.rhq.core.domain.drift.JPADriftFile; +import org.rhq.core.domain.drift.JPADriftSet; +import org.rhq.core.domain.resource.Resource; +import org.rhq.core.domain.resource.ResourceType; +import org.rhq.core.domain.util.PageList; +import org.rhq.enterprise.server.safeinvoker.HibernateDetachUtility; +import org.rhq.test.AssertUtils; +import org.rhq.test.TransactionCallback; + +public class DriftTemplateManagerBeanTest extends DriftServerTest { + + private DriftTemplateManagerLocal templateMgr; + + private DriftManagerLocal driftMgr; + + private List<Resource> resources = new LinkedList<Resource>(); + + private JPADrift drift1; + private JPADrift drift2; + private JPADriftFile driftFile1; + private JPADriftFile driftFile2; + + @BeforeClass + public void initClass() { + templateMgr = getDriftTemplateManager(); + driftMgr = getDriftManager(); + + } + + @Override + protected void initDB(EntityManager em) { + agentServiceContainer.driftService = new TestDefService() { + @Override + public void unscheduleDriftDetection(int resourceId, DriftDefinition driftDef) { + detach(driftDef); + } + + @Override + public void updateDriftDetection(int resourceId, DriftDefinition driftDef) { + detach(driftDef); + } + + @Override + public void updateDriftDetection(int resourceId, DriftDefinition driftDef, DriftSnapshot driftSnapshot) { + detach(driftDef); + detach(driftSnapshot); + } + + private void detach(Object object) { + try { + HibernateDetachUtility.nullOutUninitializedFields(object, SERIALIZATION); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + }; + } + + public void createNewTemplate() { + final DriftDefinition definition = new DriftDefinition(new Configuration()); + definition.setName("test::createNewTemplate"); + definition.setEnabled(true); + definition.setDriftHandlingMode(normal); + definition.setInterval(2400L); + definition.setBasedir(new DriftDefinition.BaseDirectory(fileSystem, "/foo/bar/test")); + + final DriftDefinitionTemplate newTemplate = templateMgr.createTemplate(getOverlord(), resourceType.getId(), + true, definition); + + executeInTransaction(new TransactionCallback() { + @Override + public void execute() throws Exception { + EntityManager em = getEntityManager(); + + ResourceType updatedType = em.find(ResourceType.class, resourceType.getId()); + + assertEquals("Failed to add new drift definition to resource type", 1, updatedType + .getDriftDefinitionTemplates().size()); + + DriftDefinitionTemplate expectedTemplate = new DriftDefinitionTemplate(); + expectedTemplate.setTemplateDefinition(definition); + expectedTemplate.setUserDefined(true); + + assertDriftTemplateEquals("Failed to save template", expectedTemplate, newTemplate); + assertTrue("The template should have its id set", newTemplate.getId() > 0); + } + }); + } + + public void createTemplateForNegativeUpdateTests() { + DriftDefinition definition = new DriftDefinition(new Configuration()); + definition.setName("test::createTemplateForNegativeUpdateTests"); + definition.setEnabled(true); + definition.setDriftHandlingMode(normal); + definition.setInterval(2400L); + definition.setBasedir(new DriftDefinition.BaseDirectory(fileSystem, "/foo/bar/test")); + + templateMgr.createTemplate(getOverlord(), resourceType.getId(), true, definition); + + assertNotNull("Failed to load template", loadTemplate(definition.getName())); + } + + @Test(dependsOnMethods = "createTemplateForNegativeUpdateTests", + expectedExceptions = EJBException.class, + expectedExceptionsMessageRegExp = ".*base directory.*cannot be modified") + @InitDB(false) + public void doNotAllowBaseDirToBeUpdated() { + DriftDefinitionTemplate template = loadTemplate("test::createTemplateForNegativeUpdateTests"); + DriftDefinition definition = template.getTemplateDefinition(); + definition.setBasedir(new DriftDefinition.BaseDirectory(fileSystem, "/foo/bar/TEST")); + + templateMgr.updateTemplate(getOverlord(), template); + } + + @Test(dependsOnMethods = "createTemplateForNegativeUpdateTests", + expectedExceptions = EJBException.class, + expectedExceptionsMessageRegExp = ".*filters.*cannot be modified") + @InitDB(false) + public void doNotAllowFiltersToBeUpdated() { + DriftDefinitionTemplate template = loadTemplate("test::createTemplateForNegativeUpdateTests"); + DriftDefinition definition = template.getTemplateDefinition(); + definition.addExclude(new Filter("/foo/bar/TEST/conf", "*.xml")); + + templateMgr.updateTemplate(getOverlord(), template); + } + + @Test(dependsOnMethods = "createTemplateForNegativeUpdateTests", + expectedExceptions = EJBException.class, + expectedExceptionsMessageRegExp = ".*name.*cannot be modified") + @InitDB(false) + public void doNotAllowTemplateNameToBeUpdated() { + DriftDefinitionTemplate template = loadTemplate("test::createTemplateForNegativeUpdateTests"); + template.setName("A new name"); + + templateMgr.updateTemplate(getOverlord(), template); + } + + public void createAndUpdateTemplate() { + // create the template + DriftDefinition definition = new DriftDefinition(new Configuration()); + definition.setName("test::updateTemplate"); + definition.setDescription("update template test"); + definition.setEnabled(true); + definition.setDriftHandlingMode(normal); + definition.setInterval(2400L); + definition.setBasedir(new DriftDefinition.BaseDirectory(fileSystem, "/foo/bar/test")); + + DriftDefinitionTemplate template = templateMgr.createTemplate(getOverlord(), resourceType.getId(), true, + definition); + + // next create some definitions from the template + final DriftDefinition attachedDef1 = createDefinition(template, "attachedDef1", true); + final DriftDefinition attachedDef2 = createDefinition(template, "attachedDef2", true); + final DriftDefinition detachedDef1 = createDefinition(template, "detachedDef1", false); + final DriftDefinition detachedDef2 = createDefinition(template, "detachedDef2", false); + + driftMgr.updateDriftDefinition(getOverlord(), forResource(resource.getId()), attachedDef1); + driftMgr.updateDriftDefinition(getOverlord(), forResource(resource.getId()), attachedDef2); + driftMgr.updateDriftDefinition(getOverlord(), forResource(resource.getId()), detachedDef1); + driftMgr.updateDriftDefinition(getOverlord(), forResource(resource.getId()), detachedDef2); + + // update the template + final DriftDefinition newTemplateDef = template.getTemplateDefinition(); + newTemplateDef.setInterval(4800L); + newTemplateDef.setDriftHandlingMode(plannedChanges); + newTemplateDef.setEnabled(false); + + templateMgr.updateTemplate(getOverlord(), template); + + // verify that the tempalte has been updated + final DriftDefinitionTemplate updatedTemplate = loadTemplate(template.getName()); + AssertUtils.assertPropertiesMatch("Failed to update template", template, updatedTemplate, "resourceType", + "driftDefinitions", "templateDefinition"); + + // verify that attached definitions are updated. + for (DriftDefinition def : asList(attachedDef1, attachedDef2)) { + DriftDefinition updatedDef = loadDefinition(def.getId()); + String msg = "Failed to propagate update to attached definition " + toString(updatedDef) + " - "; + DriftDefinition updatedTemplateDef = updatedTemplate.getTemplateDefinition(); + + assertEquals(msg + "enabled property not updated", updatedTemplateDef.isEnabled(), + updatedDef.isEnabled()); + assertEquals(msg + "driftHandlingMode property not updated", + updatedTemplateDef.getDriftHandlingMode(), updatedDef.getDriftHandlingMode()); + assertEquals(msg + "interval property not updated", updatedTemplateDef.getInterval(), + updatedDef.getInterval()); + } + + // verify that the detached definitions have not been updated. + for (DriftDefinition def : asList(detachedDef1, detachedDef2)) { + DriftDefinition defAfterUpdate = loadDefinition(def.getId()); + String msg = "Detached definition " + toString(def) + " should not get updated - "; + + assertEquals(msg + "enabled property was modified", def.isEnabled(), defAfterUpdate.isEnabled()); + assertEquals(msg + "driftHandlingMode property was modified", def.getDriftHandlingMode(), + defAfterUpdate.getDriftHandlingMode()); + assertEquals(msg + "interval property was modified", def.getInterval(), defAfterUpdate.getInterval()); + } + } + + + @SuppressWarnings("unchecked") + public void pinTemplate() throws Exception { + // First create the template + final DriftDefinition templateDef = new DriftDefinition(new Configuration()); + templateDef.setName("test::pinTemplate"); + templateDef.setEnabled(true); + templateDef.setDriftHandlingMode(normal); + templateDef.setInterval(2400L); + templateDef.setBasedir(new DriftDefinition.BaseDirectory(fileSystem, "/foo/bar/test")); + + final DriftDefinitionTemplate template = templateMgr.createTemplate(getOverlord(), + resourceType.getId(), true, templateDef); + + // next create some resource level definitions + final DriftDefinition attachedDef1 = createDefinition(template, "attachedDef1", true); + final DriftDefinition attachedDef2 = createDefinition(template, "attachedDef2", true); + final DriftDefinition detachedDef1 = createDefinition(template, "detachedDef1", false); + final DriftDefinition detachedDef2 = createDefinition(template, "detachedDef2", false); + + // create initial change set from which the snapshot will be generated + final JPADriftChangeSet changeSet0 = new JPADriftChangeSet(resource, 0, COVERAGE, attachedDef1); + + driftFile1 = new JPADriftFile("a1b2c3"); + drift1 = new JPADrift(changeSet0, "drift.1", FILE_ADDED, null, driftFile1); + + final JPADriftSet driftSet = new JPADriftSet(); + driftSet.addDrift(drift1); + + // create change set v1 + driftFile2 = new JPADriftFile("1a2b3c"); + final JPADriftChangeSet changeSet1 = new JPADriftChangeSet(resource, 1, DRIFT, attachedDef1); + drift2 = new JPADrift(changeSet1, "drift.2", FILE_ADDED, null, driftFile2); + + executeInTransaction(new TransactionCallback() { + @Override + public void execute() throws Exception { + EntityManager em = getEntityManager(); + + em.persist(attachedDef1); + + em.persist(driftFile1); + em.persist(driftFile2); + + em.persist(changeSet0); + em.persist(driftSet); + changeSet0.setInitialDriftSet(driftSet); + em.merge(changeSet0); + + em.persist(changeSet1); + em.persist(drift2); + + em.persist(attachedDef2); + em.persist(detachedDef1); + em.persist(detachedDef2); + } + }); + + // now we pin the snapshot to the template + templateMgr.pinTemplate(getOverlord(), template.getId(), attachedDef1.getId(), 1); + + // verify that the template is now pinned + DriftDefinitionTemplate updatedTemplate = loadTemplate(template.getName()); + assertTrue("Template should be marked pinned", updatedTemplate.isPinned()); + } + + @Test(dependsOnMethods = "pinTemplate") + @InitDB(false) + public void persistChangeSetWhenTemplateGetsPinned() throws Exception { + DriftDefinitionTemplate template = loadTemplate("test::pinTemplate"); + + GenericDriftChangeSetCriteria criteria = new GenericDriftChangeSetCriteria(); + criteria.addFilterId(template.getChangeSetId()); + + PageList<? extends DriftChangeSet<?>> changeSets = driftMgr.findDriftChangeSetsByCriteria(getOverlord(), + criteria); + + assertEquals("Expected to find change set for pinned template", 1, changeSets.size()); + + JPADriftChangeSet expectedChangeSet = new JPADriftChangeSet(resource, 1, COVERAGE, null); + List<? extends Drift> expectedDrifts = asList( + new JPADrift(expectedChangeSet, "drift.1", FILE_ADDED, null, driftFile1), + new JPADrift(expectedChangeSet, drift2.getPath(), FILE_ADDED, null, driftFile2)); + + DriftChangeSet<?> actualChangeSet = changeSets.get(0); + List<? extends Drift> actualDrifts = new ArrayList(actualChangeSet.getDrifts()); + + AssertUtils.assertCollectionMatchesNoOrder( + "Expected to find drifts from change sets 1 and 2 in the template change set", + (List<Drift>) expectedDrifts, (List<Drift>) actualDrifts, "id", "ctime", "changeSet", "newDriftFile"); + + // we need to compare the newDriftFile properties separately because + // assertCollectionMatchesNoOrder compares properties via equals() and JPADriftFile + // does not implement equals. + assertPropertiesMatch(drift1.getNewDriftFile(), findDriftByPath(actualDrifts, "drift.1").getNewDriftFile(), + "The newDriftFile property was not set correctly for " + drift1); + assertPropertiesMatch(drift2.getNewDriftFile(), findDriftByPath(actualDrifts, "drift.2").getNewDriftFile(), + "The newDriftFile property was not set correctly for " + drift1); + } + + @Test(dependsOnMethods = "pinTemplate") + @InitDB(false) + public void updateAttachedDefinitionsWhenTemplateGetsPinned() throws Exception { + DriftDefinitionTemplate template = loadTemplate("test::pinTemplate"); + + // get the attached definitions + List<DriftDefinition> attachedDefs = new LinkedList<DriftDefinition>(); + for (DriftDefinition d : template.getDriftDefinitions()) { + if (d.isAttached() && (d.getName().equals("attachedDef1") || d.getName().equals("attachedDef2"))) { + attachedDefs.add(d); + } + } + assertEquals("Failed to get attached definitions for " + toString(template), 2, attachedDefs.size()); + assertDefinitionIsPinned(attachedDefs.get(0)); + assertDefinitionIsPinned(attachedDefs.get(1)); + } + + @Test(dependsOnMethods = "pinTemplate") + @InitDB(false) + public void doNotUpdateDetachedDefinitionsWhenTemplateGetsPinned() throws Exception { + DriftDefinitionTemplate template = loadTemplate("test::pinTemplate"); + + // get the detached definitions + List<DriftDefinition> detachedDefs = new LinkedList<DriftDefinition>(); + for (DriftDefinition d : template.getDriftDefinitions()) { + if (!d.isAttached() && (d.getName().equals("detachedDef1") || d.getName().equals("detachedDef2"))) { + detachedDefs.add(d); + } + } + assertEquals("Failed to get detached definitions for " + toString(template), 2, detachedDefs.size()); + assertDefinitionIsNotPinned(detachedDefs.get(0)); + assertDefinitionIsNotPinned(detachedDefs.get(1)); + } + + public void deleteTemplate() throws Exception { + // first create the template + final DriftDefinition templateDef = new DriftDefinition(new Configuration()); + templateDef.setName("test::pinTemplate"); + templateDef.setEnabled(true); + templateDef.setDriftHandlingMode(normal); + templateDef.setInterval(2400L); + templateDef.setBasedir(new DriftDefinition.BaseDirectory(fileSystem, "/foo/bar/test")); + + final DriftDefinitionTemplate template = templateMgr.createTemplate(getOverlord(), + resourceType.getId(), true, templateDef); + + // next create some resource level definitions + final DriftDefinition attachedDef1 = createDefinition(template, "attachedDef1", true); + final DriftDefinition attachedDef2 = createDefinition(template, "attachedDef2", true); + final DriftDefinition detachedDef1 = createDefinition(template, "detachedDef1", false); + final DriftDefinition detachedDef2 = createDefinition(template, "detachedDef2", false); + + // create some change sets + final JPADriftChangeSet changeSet0 = new JPADriftChangeSet(resource, 0, COVERAGE, attachedDef1); + + driftFile1 = new JPADriftFile("a1b2c3"); + drift1 = new JPADrift(changeSet0, "drift.1", FILE_ADDED, null, driftFile1); + + final JPADriftSet driftSet0 = new JPADriftSet(); + driftSet0.addDrift(drift1); + + final JPADriftChangeSet changeSet1 = new JPADriftChangeSet(resource, 0, DRIFT, detachedDef1); + + driftFile2 = new JPADriftFile("1a2b3c"); + drift2 = new JPADrift(changeSet1, "drift.2", FILE_ADDED, null, driftFile2); + + final JPADriftSet driftSet1 = new JPADriftSet(); + driftSet1.addDrift(drift2); + + executeInTransaction(new TransactionCallback() { + @Override + public void execute() throws Exception { + EntityManager em = getEntityManager(); + + em.persist(attachedDef1); + em.persist(attachedDef2); + em.persist(detachedDef1); + em.persist(detachedDef2); + + em.persist(driftFile1); + em.persist(driftFile2); + + em.persist(changeSet0); + em.persist(driftSet0); + changeSet0.setInitialDriftSet(driftSet0); + em.merge(changeSet0); + + em.persist(changeSet1); + em.persist(driftSet1); + changeSet1.setInitialDriftSet(driftSet1); + em.merge(changeSet1); + } + }); + + // delete the template + templateMgr.deleteTemplate(getOverlord(), template.getId()); + + // verify that attached definitions along with their change sets have + // been deleted + assertNull("Change sets belonging to attached definitions should be deleted", loadChangeSet(changeSet0.getId())); + assertNull("Attached definition " + toString(attachedDef1) + " should be deleted", + loadDefinition(attachedDef1.getId())); + assertNull("Attached definition " + toString(attachedDef2) + " should be deleted", + loadDefinition(attachedDef2.getId())); + + // verify that detached definitions along with their change sets have not been deleted + assertNotNull("Change sets belonging to detached definitions should not be deleted", + loadChangeSet(changeSet1.getId())); + assertDetachedDefinitionNotDeleted(detachedDef1.getId()); + assertDetachedDefinitionNotDeleted(detachedDef2.getId()); + + // verify that the template itself has been deleted + assertNull("The template " + toString(template) + " should have been deleted", + loadTemplate(template.getName(), false)); + } + + private void assertDefinitionIsPinned(DriftDefinition definition) throws Exception { + // verify that the definition is marked as pinned + assertTrue("Expected " + toString(definition) + " to be pinned", definition.isPinned()); + + // verify that the initial change set is generated for the definition + JPADriftChangeSetCriteria criteria = new JPADriftChangeSetCriteria(); + criteria.addFilterDriftDefinitionId(definition.getId()); + criteria.addFilterCategory(COVERAGE); + criteria.fetchDrifts(true); + + PageList<? extends DriftChangeSet<?>> changeSets = driftMgr.findDriftChangeSetsByCriteria(getOverlord(), + criteria); + assertEquals("Expected to find one change set", 1, changeSets.size()); + + JPADriftChangeSet expectedChangeSet = new JPADriftChangeSet(resource, 1, COVERAGE, null); + List<? extends Drift> expectedDrifts = asList( + new JPADrift(expectedChangeSet, drift1.getPath(), FILE_ADDED, null, driftFile1), + new JPADrift(expectedChangeSet, drift2.getPath(), FILE_ADDED, null, driftFile2)); + + DriftChangeSet<?> actualChangeSet = changeSets.get(0); + List<? extends Drift> actualDrifts = new ArrayList(actualChangeSet.getDrifts()); + + AssertUtils.assertCollectionMatchesNoOrder( + "Expected to find drifts from change sets 1 and 2 in the template change set", + (List<Drift>) expectedDrifts, (List<Drift>) actualDrifts, "id", "ctime", "changeSet", "newDriftFile"); + + // Finally make sure that there are no other change sets + criteria = new JPADriftChangeSetCriteria(); + criteria.addFilterStartVersion(1); + criteria.addFilterDriftDefinitionId(definition.getId()); + + assertEquals("There should not be any drift change sets", 0, + driftMgr.findDriftChangeSetsByCriteria(getOverlord(), criteria).size()); + } + + private void assertDefinitionIsNotPinned(DriftDefinition definition) throws Exception { + // verify that the definition is not pinned + assertFalse("Expected " + toString(definition) + " to be unpinned", definition.isPinned()); + + // Note that this method assumes that the definition has no change sets + // associated with it and therefore checks that there are no change sets. + JPADriftChangeSetCriteria criteria = new JPADriftChangeSetCriteria(); + criteria.addFilterDriftDefinitionId(definition.getId()); + + PageList<? extends DriftChangeSet<?>> changeSets = driftMgr.findDriftChangeSetsByCriteria(getOverlord(), + criteria); + assertEquals("Did not expect to find any change sets for " + toString(definition) + ". Note that this " + + "assertion method assumes that the definition you are testing is not supposed to have any change sets.", + 0, changeSets.size()); + } + + private void assertDriftTemplateEquals(String msg, DriftDefinitionTemplate expected, DriftDefinitionTemplate actual) { + AssertUtils + .assertPropertiesMatch(msg + ": basic drift definition template properties do not match", expected, actual, + "id", "resourceType", "ctime", "templateDefinition"); + assertDriftDefEquals(msg + ": template definitions do not match", expected.getTemplateDefinition(), actual + .getTemplateDefinition()); + } + + private void assertDriftDefEquals(String msg, DriftDefinition expected, DriftDefinition actual) { + DriftDefinitionComparator comparator = new DriftDefinitionComparator( + BOTH_BASE_INFO_AND_DIRECTORY_SPECIFICATIONS); + assertEquals(msg, 0, comparator.compare(expected, actual)); + } + + private void assertDetachedDefinitionNotDeleted(int definitionId) { + DriftDefinition definition = loadDefinition(definitionId); + assertNotNull("Detached definition " + toString(definition) + " should not be deleted", definition); + assertNull("The detached definition's template reference should be set to null when the template is deleted", + definition.getTemplate()); + } + + private DriftDefinition createDefinition(DriftDefinitionTemplate template, String defName, boolean isAttached) { + DriftDefinition def = template.createDefinition(); + def.setName(defName); + def.setAttached(isAttached); + def.setTemplate(template); + def.setResource(resource); + return def; + } + + private DriftDefinitionTemplate loadTemplate(String name) { + return loadTemplate(name, true); + } + + private DriftDefinitionTemplate loadTemplate(String name, boolean verifyResultsUnique) { + DriftDefinitionTemplateCriteria criteria = new DriftDefinitionTemplateCriteria(); + criteria.addFilterResourceTypeId(resourceType.getId()); + criteria.addFilterName(name); + criteria.fetchDriftDefinitions(true); + + PageList<DriftDefinitionTemplate> templates = templateMgr.findTemplatesByCriteria(getOverlord(), criteria); + if (verifyResultsUnique) { + assertEquals("Expected to find one template", 1, templates.size()); + } + + if (templates.isEmpty()) { + return null; + } + return templates.get(0); + } + + private DriftDefinition loadDefinition(int definitionId) { + DriftDefinitionCriteria criteria = new DriftDefinitionCriteria(); + criteria.addFilterId(definitionId); + criteria.fetchConfiguration(true); + criteria.fetchTemplate(true); + PageList<DriftDefinition> definitions = driftMgr.findDriftDefinitionsByCriteria(getOverlord(), criteria); + + if (definitions.isEmpty()) { + return null; + } + return definitions.get(0); + } + + private DriftChangeSet<?> loadChangeSet(String id) throws Exception { + GenericDriftChangeSetCriteria criteria = new GenericDriftChangeSetCriteria(); + criteria.addFilterId(id); + PageList<? extends DriftChangeSet<?>> changeSets = driftMgr.findDriftChangeSetsByCriteria(getOverlord(), + criteria); + + if (changeSets.isEmpty()) { + return null; + } + return changeSets.get(0); + } + +} diff --git a/modules/enterprise/server/integration-tests/src/test/java/org/rhq/enterprise/server/drift/InitDB.java b/modules/enterprise/server/integration-tests/src/test/java/org/rhq/enterprise/server/drift/InitDB.java new file mode 100644 index 0000000..65a6523 --- /dev/null +++ b/modules/enterprise/server/integration-tests/src/test/java/org/rhq/enterprise/server/drift/InitDB.java @@ -0,0 +1,32 @@ +/* + * RHQ Management Platform + * Copyright (C) 2011 Red Hat, Inc. + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation version 2 of the License. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +package org.rhq.enterprise.server.drift; + +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +@Retention(RUNTIME) +@Target({ElementType.METHOD }) +public @interface InitDB { + boolean value() default true; +} diff --git a/modules/enterprise/server/integration-tests/src/test/java/org/rhq/enterprise/server/drift/JPADriftServerBeanTest.java b/modules/enterprise/server/integration-tests/src/test/java/org/rhq/enterprise/server/drift/JPADriftServerBeanTest.java new file mode 100644 index 0000000..4faca1b --- /dev/null +++ b/modules/enterprise/server/integration-tests/src/test/java/org/rhq/enterprise/server/drift/JPADriftServerBeanTest.java @@ -0,0 +1,309 @@ +/* + * RHQ Management Platform + * Copyright (C) 2011 Red Hat, Inc. + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation version 2 of the License. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +package org.rhq.enterprise.server.drift; + +import static java.util.Arrays.asList; +import static org.apache.commons.io.IOUtils.toInputStream; +import static org.rhq.core.domain.drift.DriftCategory.FILE_ADDED; +import static org.rhq.core.domain.drift.DriftChangeSetCategory.COVERAGE; +import static org.rhq.core.domain.drift.DriftConfigurationDefinition.BaseDirValueContext.fileSystem; +import static org.rhq.core.domain.drift.DriftConfigurationDefinition.DriftHandlingMode.normal; +import static org.rhq.core.domain.drift.DriftFileStatus.LOADED; +import static org.rhq.enterprise.server.util.LookupUtil.getJPADriftServer; +import static org.rhq.test.AssertUtils.assertPropertiesMatch; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import javax.persistence.EntityManager; + +import org.testng.annotations.BeforeClass; +import org.testng.annotations.BeforeMethod; + +import org.rhq.core.domain.configuration.Configuration; +import org.rhq.core.domain.criteria.JPADriftChangeSetCriteria; +import org.rhq.core.domain.drift.Drift; +import org.rhq.core.domain.drift.DriftDefinition; +import org.rhq.core.domain.drift.JPADrift; +import org.rhq.core.domain.drift.JPADriftChangeSet; +import org.rhq.core.domain.drift.JPADriftFile; +import org.rhq.core.domain.drift.JPADriftSet; +import org.rhq.core.domain.drift.dto.DriftChangeSetDTO; +import org.rhq.core.domain.drift.dto.DriftDTO; +import org.rhq.core.domain.drift.dto.DriftFileDTO; +import org.rhq.core.domain.util.PageList; +import org.rhq.test.AssertUtils; +import org.rhq.test.TransactionCallback; + +public class JPADriftServerBeanTest extends DriftServerTest { + + private JPADriftServerLocal jpaDriftServer; + + private final String DRIFT_FILE_1_ID = "a1b2c3d4"; + + private final String DRIFT_FILE_2_ID = "1ab2b3c4d"; + + private JPADriftFile driftFile1; + + private JPADriftFile driftFile2; + + @BeforeClass + public void initTests() { + jpaDriftServer = getJPADriftServer(); + } + + @BeforeMethod + public void persistDriftFiles() throws Exception { + driftFile1 = jpaDriftServer.persistDriftFile(new JPADriftFile(DRIFT_FILE_1_ID)); + driftFile2 = jpaDriftServer.persistDriftFile(new JPADriftFile(DRIFT_FILE_2_ID)); + + String driftFile1Content = "drift file 1 content..."; + String driftFile2Content = "drift file 2 content..."; + + jpaDriftServer.persistDriftFileData(driftFile1, toInputStream(driftFile1Content), driftFile1Content.length()); + jpaDriftServer.persistDriftFileData(driftFile2, toInputStream(driftFile2Content), driftFile2Content.length()); + + driftFile1 = jpaDriftServer.getDriftFile(getOverlord(), DRIFT_FILE_1_ID); + driftFile2 = jpaDriftServer.getDriftFile(getOverlord(), DRIFT_FILE_2_ID); + + assertDriftFilePersisted(driftFile1, "driftFile1", driftFile1Content); + assertDriftFilePersisted(driftFile2, "driftFile2", driftFile2Content); + } + + public void persistResourceChangeSet() { + // first create and persist the drift definition + final DriftDefinition driftDef = new DriftDefinition(new Configuration()); + driftDef.setName("test::persistResourceChangeSet"); + driftDef.setEnabled(true); + driftDef.setDriftHandlingMode(normal); + driftDef.setInterval(2400L); + driftDef.setBasedir(new DriftDefinition.BaseDirectory(fileSystem, "/foo/bar/test")); + driftDef.setResource(resource); + + executeInTransaction(new TransactionCallback() { + @Override + public void execute() throws Exception { + EntityManager em = getEntityManager(); + em.persist(driftDef); + } + }); + + // create the change set to be persisted + DriftChangeSetDTO changeSet = new DriftChangeSetDTO(); + changeSet.setCategory(COVERAGE); + changeSet.setVersion(1); + changeSet.setDriftDefinitionId(driftDef.getId()); + changeSet.setResourceId(resource.getId()); + changeSet.setDriftHandlingMode(normal); + changeSet.setCtime(System.currentTimeMillis()); + + DriftDTO drift1 = new DriftDTO(); + drift1.setCategory(FILE_ADDED); + drift1.setPath("drift.1"); + drift1.setChangeSet(changeSet); + drift1.setCtime(System.currentTimeMillis()); + drift1.setNewDriftFile(toDTo(driftFile1)); + + DriftDTO drift2 = new DriftDTO(); + drift2.setCategory(FILE_ADDED); + drift2.setPath("drift.2"); + drift2.setChangeSet(changeSet); + drift2.setCtime(System.currentTimeMillis()); + drift2.setNewDriftFile(toDTo(driftFile2)); + + Set<DriftDTO> drifts = new HashSet<DriftDTO>(); + drifts.add(drift1); + drifts.add(drift2); + changeSet.setDrifts(drifts); + + String newChangeSetId = jpaDriftServer.persistChangeSet(getOverlord(), changeSet); + + // verify that the change set was persisted + JPADriftChangeSetCriteria criteria = new JPADriftChangeSetCriteria(); + criteria.addFilterId(newChangeSetId); + criteria.fetchDrifts(true); + + PageList<JPADriftChangeSet> changeSets = jpaDriftServer.findDriftChangeSetsByCriteria(getOverlord(), criteria); + assertEquals("Expected to find one change set", 1, changeSets.size()); + + JPADriftChangeSet jpaChangeSet = changeSets.get(0); + assertEquals("Expected change set to contain two drifts. This could be a result of the change set not being " + + "persisted correctly or the criteria fetch being done incorrectly.", 2, jpaChangeSet.getDrifts().size()); + + AssertUtils + .assertPropertiesMatch("The change set was not persisted correctly", changeSet, jpaChangeSet, "id", "drifts", + "class", "ctime"); + + List<? extends Drift> expectedDrifts = asList(drift1, drift2); + List<? extends Drift> actualDrifts = new ArrayList(jpaChangeSet.getDrifts()); + + // We ignore the id and ctime properties because those are set by JPADriftServerBean + // and are somewhat implmentation specific. We ignore the directory property because + // it is really a calculated property. newDriftFile has to be compared separately + // since it does not implement equals. + AssertUtils.assertCollectionMatchesNoOrder("The change set drifts were not persisted correctly", + (List<Drift>) expectedDrifts, (List<Drift>) actualDrifts, "id", "ctime", "changeSet", "directory", + "newDriftFile", "class"); + + assertPropertiesMatch("The newDriftFile property was not set correctly for " + drift1, drift1.getNewDriftFile(), + findDriftByPath(actualDrifts, "drift.1").getNewDriftFile(), "class", "ctime") ; + assertPropertiesMatch("The newDriftFile property was not set correctly for " + drift2, drift2.getNewDriftFile(), + findDriftByPath(actualDrifts, "drift.2").getNewDriftFile(), "class", "ctime") ; + } + + public void persistTemplateChangeSet() { + // create the change set to be persisted + // + // Note that we do not set the drift definition id or resource id since + // the change set is not owned by a resource. It is owned by the + // resource type. + DriftChangeSetDTO changeSet = new DriftChangeSetDTO(); + changeSet.setCategory(COVERAGE); + changeSet.setVersion(1); + changeSet.setDriftHandlingMode(normal); + changeSet.setCtime(System.currentTimeMillis()); + + DriftDTO drift1 = new DriftDTO(); + drift1.setCategory(FILE_ADDED); + drift1.setPath("drift.1"); + drift1.setChangeSet(changeSet); + drift1.setCtime(System.currentTimeMillis()); + drift1.setNewDriftFile(toDTo(driftFile1)); + + DriftDTO drift2 = new DriftDTO(); + drift2.setCategory(FILE_ADDED); + drift2.setPath("drift.2"); + drift2.setChangeSet(changeSet); + drift2.setCtime(System.currentTimeMillis()); + drift2.setNewDriftFile(toDTo(driftFile2)); + + Set<DriftDTO> drifts = new HashSet<DriftDTO>(); + drifts.add(drift1); + drifts.add(drift2); + changeSet.setDrifts(drifts); + + String newChangeSetId = jpaDriftServer.persistChangeSet(getOverlord(), changeSet); + + // verify that the change set was persisted + JPADriftChangeSetCriteria criteria = new JPADriftChangeSetCriteria(); + criteria.addFilterId(newChangeSetId); + criteria.fetchDrifts(true); + + PageList<JPADriftChangeSet> changeSets = jpaDriftServer.findDriftChangeSetsByCriteria(getOverlord(), criteria); + assertEquals("Expected to find one change set", 1, changeSets.size()); + + JPADriftChangeSet jpaChangeSet = changeSets.get(0); + assertEquals("Expected change set to contain two drifts. This could be a result of the change set not being " + + "persisted correctly or the criteria fetch being done incorrectly.", 2, jpaChangeSet.getDrifts().size()); + + AssertUtils + .assertPropertiesMatch("The change set was not persisted correctly", changeSet, jpaChangeSet, "id", "drifts", + "class", "ctime"); + + List<? extends Drift> expectedDrifts = asList(drift1, drift2); + List<? extends Drift> actualDrifts = new ArrayList(jpaChangeSet.getDrifts()); + + // We ignore the id and ctime properties because those are set by JPADriftServerBean + // and are somewhat implmentation specific. We ignore the directory property because + // it is really a calculated property. newDriftFile has to be compared separately + // since it does not implement equals. + AssertUtils.assertCollectionMatchesNoOrder("The change set drifts were not persisted correctly", + (List<Drift>) expectedDrifts, (List<Drift>) actualDrifts, "id", "ctime", "changeSet", "directory", + "newDriftFile", "class"); + + assertPropertiesMatch("The newDriftFile property was not set correctly for " + drift1, drift1.getNewDriftFile(), + findDriftByPath(actualDrifts, "drift.1").getNewDriftFile(), "class", "ctime") ; + assertPropertiesMatch("The newDriftFile property was not set correctly for " + drift2, drift2.getNewDriftFile(), + findDriftByPath(actualDrifts, "drift.2").getNewDriftFile(), "class", "ctime") ; + } + + public void copyChangeSet() { + // first create the change set that will be copied + final JPADriftChangeSet changeSet = new JPADriftChangeSet(null, 0, COVERAGE, null); + changeSet.setDriftHandlingMode(normal); + + final JPADrift drift1 = new JPADrift(changeSet, "drift.1", FILE_ADDED, null, driftFile1); + final JPADrift drift2 = new JPADrift(changeSet, "drift.2", FILE_ADDED, null, driftFile2); + + final JPADriftSet driftSet = new JPADriftSet(); + driftSet.addDrift(drift1); + driftSet.addDrift(drift2); + + // next create the drift definition + final DriftDefinition driftDef = new DriftDefinition(new Configuration()); + driftDef.setName("test::copyChangeSet"); + driftDef.setEnabled(true); + driftDef.setDriftHandlingMode(normal); + driftDef.setInterval(2400L); + driftDef.setBasedir(new DriftDefinition.BaseDirectory(fileSystem, "/foo/bar/test")); + driftDef.setResource(resource); + + // persist the change set and drift definition + executeInTransaction(new TransactionCallback() { + @Override + public void execute() throws Exception { + EntityManager em = getEntityManager(); + em.persist(changeSet); + em.persist(driftDef); + em.persist(driftSet); + changeSet.setInitialDriftSet(driftSet); + em.merge(changeSet); + } + }); + + jpaDriftServer.copyChangeSet(getOverlord(), changeSet.getId(), driftDef.getId(), resource.getId()); + + // verify that the change set was created for the definition + JPADriftChangeSetCriteria criteria = new JPADriftChangeSetCriteria(); + criteria.addFilterDriftDefinitionId(driftDef.getId()); + criteria.addFilterCategory(COVERAGE); + + PageList<JPADriftChangeSet> changeSets = jpaDriftServer.findDriftChangeSetsByCriteria(getOverlord(), criteria); + + assertEquals("Expected to get back one change set", 1,changeSets.size()); + + JPADriftChangeSet newChangeSet = changeSets.get(0); + Set<JPADrift> expectedDrifts = new HashSet<JPADrift>(asList(drift1, drift2)); + Set<JPADrift> actualDrifts = newChangeSet.getDrifts(); + + AssertUtils.assertCollectionMatchesNoOrder("The change set drifts were not copied correctly", expectedDrifts, + actualDrifts, + "changeSet", "newDriftFile"); + } + + private DriftFileDTO toDTo(JPADriftFile driftFile) { + DriftFileDTO dto = new DriftFileDTO(); + dto.setHashId(driftFile.getHashId()); + dto.setDataSize(driftFile.getDataSize()); + dto.setStatus(driftFile.getStatus()); + return dto; + } + + + private void assertDriftFilePersisted(JPADriftFile driftFile, String name, String content) { + assertNotNull("Failed to get " + name + " Was it persisted?", driftFile); + assertEquals("The content for " + name + " is wrong", content, jpaDriftServer.getDriftFileBits( + driftFile.getHashId())); + assertEquals("The drift file status is wrong", LOADED, driftFile.getStatus()); + } + +} diff --git a/modules/enterprise/server/integration-tests/src/test/java/org/rhq/enterprise/server/drift/ManageDriftDefinitionsTest.java b/modules/enterprise/server/integration-tests/src/test/java/org/rhq/enterprise/server/drift/ManageDriftDefinitionsTest.java new file mode 100644 index 0000000..66afcb0 --- /dev/null +++ b/modules/enterprise/server/integration-tests/src/test/java/org/rhq/enterprise/server/drift/ManageDriftDefinitionsTest.java @@ -0,0 +1,223 @@ +/* + * RHQ Management Platform + * Copyright (C) 2011 Red Hat, Inc. + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation version 2 of the License. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +package org.rhq.enterprise.server.drift; + +import static java.util.Arrays.asList; +import static org.rhq.core.domain.drift.DriftCategory.FILE_ADDED; +import static org.rhq.core.domain.drift.DriftChangeSetCategory.COVERAGE; +import static org.rhq.core.domain.drift.DriftConfigurationDefinition.BaseDirValueContext.fileSystem; +import static org.rhq.core.domain.drift.DriftConfigurationDefinition.DriftHandlingMode.normal; +import static org.rhq.core.domain.drift.DriftDefinitionComparator.CompareMode.BOTH_BASE_INFO_AND_DIRECTORY_SPECIFICATIONS; +import static org.rhq.enterprise.server.util.LookupUtil.getDriftManager; +import static org.rhq.enterprise.server.util.LookupUtil.getDriftTemplateManager; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; + +import javax.persistence.EntityManager; + +import org.testng.annotations.BeforeClass; + +import org.rhq.core.domain.common.EntityContext; +import org.rhq.core.domain.configuration.Configuration; +import org.rhq.core.domain.criteria.DriftDefinitionCriteria; +import org.rhq.core.domain.criteria.JPADriftChangeSetCriteria; +import org.rhq.core.domain.drift.Drift; +import org.rhq.core.domain.drift.DriftChangeSet; +import org.rhq.core.domain.drift.DriftConfigurationDefinition; +import org.rhq.core.domain.drift.DriftDefinition; +import org.rhq.core.domain.drift.DriftDefinitionComparator; +import org.rhq.core.domain.drift.DriftDefinitionTemplate; +import org.rhq.core.domain.drift.DriftSnapshot; +import org.rhq.core.domain.drift.JPADrift; +import org.rhq.core.domain.drift.JPADriftChangeSet; +import org.rhq.core.domain.drift.JPADriftFile; +import org.rhq.core.domain.drift.JPADriftSet; +import org.rhq.core.domain.util.PageList; +import org.rhq.enterprise.server.safeinvoker.HibernateDetachUtility; +import org.rhq.test.AssertUtils; +import org.rhq.test.TransactionCallback; + +public class ManageDriftDefinitionsTest extends DriftServerTest { + + private DriftManagerLocal driftMgr; + + private DriftTemplateManagerLocal templateMgr; + + @BeforeClass + public void initClass() throws Exception { + driftMgr = getDriftManager(); + templateMgr = getDriftTemplateManager(); + } + + public void createDefinitionFromUnpinnedTemplate() { + // first create a template + final DriftDefinition templateDef = new DriftDefinition(new Configuration()); + templateDef.setName("test_createUnpinnedDefinition"); + templateDef.setEnabled(true); + templateDef.setDriftHandlingMode(normal); + templateDef.setInterval(2400L); + templateDef.setBasedir(new DriftDefinition.BaseDirectory(fileSystem, "/foo/bar/test")); + + // persist the template + DriftDefinitionTemplate template = templateMgr.createTemplate(getOverlord(), resourceType.getId(), false, + templateDef); + + // create and persist the definition + DriftDefinition definition = template.createDefinition(); + definition.setTemplate(template); + driftMgr.updateDriftDefinition(getOverlord(), EntityContext.forResource(resource.getId()), definition); + + // verify that the definition was created + DriftDefinition newDef = loadDefinition(definition.getName()); + DriftDefinitionComparator comparator = new DriftDefinitionComparator( + BOTH_BASE_INFO_AND_DIRECTORY_SPECIFICATIONS); + + assertEquals("The drift definition was not persisted correctly", 0, comparator.compare(definition, newDef)); + assertEquals("The template association was not set on the definition", template, newDef.getTemplate()); + } + + @SuppressWarnings("unchecked") + public void createDefinitionFromPinnedTemplate() throws Exception { + // We first need to create a pinned template. Users can only create a pinned + // template from a snapshot of an existing resource-level drift definition. + // We are going to take a bit of a short cut though by directly creating + // and persisting the pinned change set. + + // first create the change set + final JPADriftChangeSet changeSet0 = new JPADriftChangeSet(null, 0, COVERAGE, null); + changeSet0.setDriftHandlingMode(DriftConfigurationDefinition.DriftHandlingMode.normal); + + final JPADriftFile driftFile1 = new JPADriftFile("a1b2c3"); + final JPADriftFile driftFile2 = new JPADriftFile("1a2b3c"); + + JPADrift drift1 = new JPADrift(changeSet0, "drift.1", FILE_ADDED, null, driftFile1); + JPADrift drift2 = new JPADrift(changeSet0, "drift.2", FILE_ADDED, null, driftFile2); + + final JPADriftSet driftSet = new JPADriftSet(); + driftSet.addDrift(drift1); + driftSet.addDrift(drift2); + + // create the template + final DriftDefinition templateDef = new DriftDefinition(new Configuration()); + templateDef.setName("test_createUnpinnedDefinition"); + templateDef.setEnabled(true); + templateDef.setDriftHandlingMode(normal); + templateDef.setInterval(2400L); + templateDef.setBasedir(new DriftDefinition.BaseDirectory(fileSystem, "/foo/bar/test")); + templateDef.setPinned(true); + + final DriftDefinitionTemplate template = templateMgr.createTemplate(getOverlord(), resourceType.getId(), true, + templateDef); + + executeInTransaction(new TransactionCallback() { + @Override + public void execute() throws Exception { + EntityManager em = getEntityManager(); + + em.persist(driftFile1); + em.persist(driftFile2); + em.persist(changeSet0); + em.persist(driftSet); + changeSet0.setInitialDriftSet(driftSet); + em.merge(changeSet0); + + // setting the change set id on the template is the last and the + // most important step in making the template pinned + template.setChangeSetId(changeSet0.getId()); + em.merge(template); + } + }); + + // Create and persist a resource-level definition. + final DriftDefinition definition = template.createDefinition(); + definition.setTemplate(template); + + final AtomicBoolean agentInvoked = new AtomicBoolean(false); + + agentServiceContainer.driftService = new TestDefService() { + @Override + public void updateDriftDetection(int resourceId, DriftDefinition driftDef, DriftSnapshot snapshot) { + try { + HibernateDetachUtility.nullOutUninitializedFields(driftDef, + HibernateDetachUtility.SerializationType.SERIALIZATION); + HibernateDetachUtility.nullOutUninitializedFields(snapshot, + HibernateDetachUtility.SerializationType.SERIALIZATION); + agentInvoked.set(true); + assertNotNull("Expected snapshot drift instances collection to be non-null", + snapshot.getDriftInstances()); + assertEquals("Expected snapshot to contain two drift entries", 2, snapshot.getDriftInstances().size()); + } catch (Exception e) { + String msg = "Do not pass attached entites to agent since those entities are outside of " + + "Hibernate's control. The persistence context should be flushed and cleared to ensure that " + + "only detached objects are sent to the agent"; + throw new RuntimeException(msg, e); + } + } + }; + + driftMgr.updateDriftDefinition(getOverlord(), EntityContext.forResource(resource.getId()), definition); + + DriftDefinition newDef = loadDefinition(definition.getName()); + + // verify that the definition is marked as pinned + assertTrue("The drift definition should be marked as pinned", newDef.isPinned()); + + // verify that the initial change set is generated for the definition + JPADriftChangeSetCriteria criteria = new JPADriftChangeSetCriteria(); + criteria.addFilterDriftDefinitionId(definition.getId()); + criteria.addFilterCategory(COVERAGE); + criteria.fetchDrifts(true); + + PageList<? extends DriftChangeSet<?>> changeSets = driftMgr.findDriftChangeSetsByCriteria(getOverlord(), + criteria); + assertEquals("Expected to find one change set", 1, changeSets.size()); + + JPADriftChangeSet expectedChangeSet = new JPADriftChangeSet(resource, 1, COVERAGE, null); + List<? extends Drift> expectedDrifts = asList( + new JPADrift(expectedChangeSet, drift1.getPath(), FILE_ADDED, null, driftFile1), + new JPADrift(expectedChangeSet, drift2.getPath(), FILE_ADDED, null, driftFile2)); + + DriftChangeSet<?> actualChangeSet = changeSets.get(0); + List<? extends Drift> actualDrifts = new ArrayList(actualChangeSet.getDrifts()); + + AssertUtils.assertCollectionMatchesNoOrder( + "Expected to find drifts from change sets 1 and 2 in the template change set", + (List<Drift>) expectedDrifts, (List<Drift>) actualDrifts, "id", "ctime", "changeSet", "newDriftFile"); + + // lastly verify that the agent is called + assertTrue("Failed to send drift definition along with snapshot to agent", agentInvoked.get()); + } + + private DriftDefinition loadDefinition(String name) { + DriftDefinitionCriteria criteria = new DriftDefinitionCriteria(); + criteria.addFilterResourceIds(resource.getId()); + criteria.addFilterName(name); + criteria.fetchConfiguration(true); + criteria.fetchResource(true); + criteria.fetchTemplate(true); + + PageList<DriftDefinition> driftDefs = driftMgr.findDriftDefinitionsByCriteria(getOverlord(), criteria); + assertEquals("Expected to find one drift definition", 1, driftDefs.size()); + + return driftDefs.get(0); + } +} diff --git a/modules/enterprise/server/integration-tests/src/test/java/org/rhq/enterprise/server/drift/ManageSnapshotsTest.java b/modules/enterprise/server/integration-tests/src/test/java/org/rhq/enterprise/server/drift/ManageSnapshotsTest.java new file mode 100644 index 0000000..e7341e4 --- /dev/null +++ b/modules/enterprise/server/integration-tests/src/test/java/org/rhq/enterprise/server/drift/ManageSnapshotsTest.java @@ -0,0 +1,236 @@ +/* + * RHQ Management Platform + * Copyright (C) 2011 Red Hat, Inc. + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation version 2 of the License. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +package org.rhq.enterprise.server.drift; + +import static java.util.Arrays.asList; +import static org.rhq.core.domain.drift.DriftCategory.FILE_ADDED; +import static org.rhq.core.domain.drift.DriftChangeSetCategory.COVERAGE; +import static org.rhq.core.domain.drift.DriftChangeSetCategory.DRIFT; +import static org.rhq.core.domain.drift.DriftConfigurationDefinition.BaseDirValueContext.fileSystem; +import static org.rhq.core.domain.drift.DriftConfigurationDefinition.DriftHandlingMode.normal; +import static org.rhq.enterprise.server.util.LookupUtil.getDriftManager; +import static org.rhq.enterprise.server.util.LookupUtil.getDriftTemplateManager; +import static org.rhq.test.AssertUtils.assertPropertiesMatch; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.ObjectOutputStream; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; + +import javax.persistence.EntityManager; + +import org.testng.annotations.BeforeClass; + +import org.rhq.core.domain.configuration.Configuration; +import org.rhq.core.domain.criteria.GenericDriftChangeSetCriteria; +import org.rhq.core.domain.drift.Drift; +import org.rhq.core.domain.drift.DriftChangeSet; +import org.rhq.core.domain.drift.DriftDefinition; +import org.rhq.core.domain.drift.DriftSnapshot; +import org.rhq.core.domain.drift.JPADrift; +import org.rhq.core.domain.drift.JPADriftChangeSet; +import org.rhq.core.domain.drift.JPADriftFile; +import org.rhq.core.domain.drift.JPADriftSet; +import org.rhq.core.domain.util.PageList; +import org.rhq.core.server.EntitySerializer; +import org.rhq.test.AssertUtils; +import org.rhq.test.TransactionCallback; + +public class ManageSnapshotsTest extends DriftServerTest { + + private DriftManagerLocal driftMgr; + + private DriftTemplateManagerLocal templateMgr; + + @BeforeClass(inheritGroups = true) + public void initClass() throws Exception { + driftMgr = getDriftManager(); + templateMgr = getDriftTemplateManager(); + } + + public void pinningSnapshotShouldSetDriftDefAsPinned() { + final DriftDefinition driftDef = createAndPersistDriftDef("test::setPinnedFlag"); + + // create initial change set + final JPADriftChangeSet changeSet = new JPADriftChangeSet(resource, 0, COVERAGE, driftDef); + + final JPADriftFile driftFile1 = new JPADriftFile("a1b2c3"); + JPADrift drift = new JPADrift(changeSet, "drift.1", FILE_ADDED, null, driftFile1); + + final JPADriftSet driftSet = new JPADriftSet(); + driftSet.addDrift(drift); + + executeInTransaction(new TransactionCallback() { + @Override + public void execute() throws Exception { + EntityManager em = getEntityManager(); + em.persist(driftFile1); + em.persist(changeSet); + em.persist(driftSet); + changeSet.setInitialDriftSet(driftSet); + em.merge(changeSet); + } + }); + + driftMgr.pinSnapshot(getOverlord(), driftDef.getId(), 0); + DriftDefinition updatedDriftDef = driftMgr.getDriftDefinition(getOverlord(), driftDef.getId()); + + assertNotNull("Failed to get " + toString(driftDef), updatedDriftDef); + assertTrue("Failed to set pinned flag of " + toString(driftDef), updatedDriftDef.isPinned()); + } + + @SuppressWarnings("unchecked") + public void pinningSnapshotShouldMakeSnapshotTheInitialChangeSet() throws Exception { + final DriftDefinition driftDef = createAndPersistDriftDef("test::makeSnapshotVersionZero"); + + // create initial change set + final JPADriftChangeSet changeSet0 = new JPADriftChangeSet(resource, 0, COVERAGE, driftDef); + + final JPADriftFile driftFile1 = new JPADriftFile("a1b2c3"); + JPADrift drift1 = new JPADrift(changeSet0, "drift.1", FILE_ADDED, null, driftFile1); + + final JPADriftSet driftSet = new JPADriftSet(); + driftSet.addDrift(drift1); + + // create change set v1 + final JPADriftFile driftFile2 = new JPADriftFile("1a2b3c"); + final JPADriftChangeSet changeSet1 = new JPADriftChangeSet(resource, 1, DRIFT, driftDef); + final JPADrift drift2 = new JPADrift(changeSet1, "drift.2", FILE_ADDED, null, driftFile2); + + executeInTransaction(new TransactionCallback() { + @Override + public void execute() throws Exception { + EntityManager em = getEntityManager(); + em.persist(driftFile1); + em.persist(driftFile2); + em.persist(changeSet0); + em.persist(driftSet); + changeSet0.setInitialDriftSet(driftSet); + em.merge(changeSet0); + em.persist(changeSet1); + em.persist(drift2); + } + }); + + driftMgr.pinSnapshot(getOverlord(), driftDef.getId(), 1); + + // Verify that there is now only one change set for the drift def + GenericDriftChangeSetCriteria criteria = new GenericDriftChangeSetCriteria(); + criteria.addFilterDriftDefinitionId(driftDef.getId()); + + PageList<? extends DriftChangeSet<?>> changeSets = driftMgr.findDriftChangeSetsByCriteria(getOverlord(), + criteria); + assertEquals("All change sets except the change set representing the pinned snapshot should be removed", + 1, changeSets.size()); + DriftChangeSet<?> changeSet = changeSets.get(0); + + assertEquals("The pinned snapshot version should be reset to zero", 0, changeSet.getVersion()); + assertEquals("The change set category is wrong", COVERAGE, changeSet.getCategory()); + + JPADriftChangeSet expectedChangeSet = new JPADriftChangeSet(resource, 1, COVERAGE, driftDef); + List<? extends Drift> expectedDrifts = asList( + new JPADrift(expectedChangeSet, drift1.getPath(), FILE_ADDED, null, driftFile1), + new JPADrift(expectedChangeSet, drift2.getPath(), FILE_ADDED, null, driftFile2)); + + List<? extends Drift> actualDrifts = new ArrayList(changeSet.getDrifts()); + + AssertUtils.assertCollectionMatchesNoOrder( + "Expected to find drifts from change sets 1 and 2 in the new initial change set", + (List<Drift>) expectedDrifts, (List<Drift>) actualDrifts, "id", "ctime", "changeSet", "newDriftFile"); + + // we need to compare the newDriftFile properties separately because + // assertCollectionMatchesNoOrder compares properties via equals() and JPADriftFile + // does not implement equals. + assertPropertiesMatch(drift1.getNewDriftFile(), findDriftByPath(actualDrifts, "drift.1").getNewDriftFile(), + "The newDriftFile property was not set correctly for " + drift1); + assertPropertiesMatch(drift2.getNewDriftFile(), findDriftByPath(actualDrifts, "drift.2").getNewDriftFile(), + "The newDriftFile property was not set correctly for " + drift1); + } + + public void pinningSnapshotShouldSendRequestToAgent() { + final DriftDefinition driftDef = createAndPersistDriftDef("test::setPinnedFlag"); + + // create initial change set + final JPADriftChangeSet changeSet = new JPADriftChangeSet(resource, 0, COVERAGE, driftDef); + + final JPADriftFile driftFile1 = new JPADriftFile("a1b2c3"); + JPADrift drift = new JPADrift(changeSet, "drift.1", FILE_ADDED, null, driftFile1); + + final JPADriftSet driftSet = new JPADriftSet(); + driftSet.addDrift(drift); + + executeInTransaction(new TransactionCallback() { + @Override + public void execute() throws Exception { + EntityManager em = getEntityManager(); + em.persist(driftFile1); + em.persist(changeSet); + em.persist(driftSet); + changeSet.setInitialDriftSet(driftSet); + em.merge(changeSet); + } + }); + + final AtomicBoolean agentInvoked = new AtomicBoolean(false); + agentServiceContainer.driftService = new TestDefService() { + @Override + public void pinSnapshot(int resourceId, String configName, DriftSnapshot snapshot) { + try { + agentInvoked.set(true); + // serialize the method arguments here to more closely simulate what + // happens during the call. We cannot send hibernate-proxied objects + // to the agent. This is an attempt to catch that. + ObjectOutputStream stream = new ObjectOutputStream(new ByteArrayOutputStream()); + EntitySerializer.writeExternalRemote(resourceId, stream); + EntitySerializer.writeExternalRemote(configName, stream); + EntitySerializer.writeExternalRemote(snapshot, stream); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + }; + + driftMgr.pinSnapshot(getOverlord(), driftDef.getId(), 0); + + assertTrue("Failed to send request to agent to pin snapshot", agentInvoked.get()); + } + + private DriftDefinition createAndPersistDriftDef(String name) { + final DriftDefinition driftDef = new DriftDefinition(new Configuration()); + driftDef.setName(name); + driftDef.setEnabled(true); + driftDef.setDriftHandlingMode(normal); + driftDef.setInterval(1800L); + driftDef.setBasedir(new DriftDefinition.BaseDirectory(fileSystem, "/foo/bar/test")); + + executeInTransaction(new TransactionCallback() { + @Override + public void execute() throws Exception { + driftDef.setResource(resource); + getEntityManager().persist(driftDef); + } + }); + + return driftDef; + } + +} diff --git a/modules/enterprise/server/integration-tests/src/test/resources/META-INF/ejb-jar.xml b/modules/enterprise/server/integration-tests/src/test/resources/META-INF/ejb-jar.xml new file mode 100644 index 0000000..8222948 --- /dev/null +++ b/modules/enterprise/server/integration-tests/src/test/resources/META-INF/ejb-jar.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ejb-jar xmlns="http://java.sun.com/xml/ns/javaee" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd" + version="3.0"> + + <description>RHQ</description> + <display-name>RHQ</display-name> + + <assembly-descriptor> + + <!-- all our EJB3 SLSBs can define custom @RequiredPermissions annotations for authorization checks--> + <interceptor-binding> + <ejb-name>*</ejb-name> + <interceptor-class>org.rhq.enterprise.server.authz.RequiredPermissionsInterceptor</interceptor-class> + </interceptor-binding> + <interceptor-binding> + <ejb-name>*</ejb-name> + <interceptor-class>org.rhq.enterprise.server.common.TransactionInterruptInterceptor</interceptor-class> + </interceptor-binding> + <interceptor-binding> + <ejb-name>*</ejb-name> + <interceptor-class>org.rhq.enterprise.server.common.PerformanceMonitorInterceptor</interceptor-class> + </interceptor-binding> + + </assembly-descriptor> + +</ejb-jar> diff --git a/modules/enterprise/server/integration-tests/src/test/resources/binary-blob-sample.jar b/modules/enterprise/server/integration-tests/src/test/resources/binary-blob-sample.jar new file mode 100644 index 0000000..0a629ec Binary files /dev/null and b/modules/enterprise/server/integration-tests/src/test/resources/binary-blob-sample.jar differ diff --git a/modules/enterprise/server/integration-tests/src/test/resources/default.persistence.properties b/modules/enterprise/server/integration-tests/src/test/resources/default.persistence.properties new file mode 100644 index 0000000..8e4f317 --- /dev/null +++ b/modules/enterprise/server/integration-tests/src/test/resources/default.persistence.properties @@ -0,0 +1,22 @@ +hibernate.transaction.manager_lookup_class=org.hibernate.transaction.JBossTransactionManagerLookup +#hibernate.connection.release_mode=after_statement +#hibernate.transaction.flush_before_completion=false +#hibernate.transaction.auto_close_session=false +#hibernate.query.factory_class=org.hibernate.hql.ast.ASTQueryTranslatorFactory +#hibernate.hbm2ddl.auto=create-drop +#hibernate.hbm2ddl.auto=create +hibernate.cache.provider_class=org.hibernate.cache.HashtableCacheProvider +# Clustered cache with TreeCache +#hibernate.cache.provider_class=org.jboss.ejb3.entity.TreeCacheProviderHook +#hibernate.treecache.mbean.object_name=jboss.cache:service=EJB3EntityTreeCache +#hibernate.dialect=org.hibernate.dialect.HSQLDialect +hibernate.jndi.java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory +hibernate.jndi.java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces +hibernate.bytecode.use_reflection_optimizer=false +# I don't think this is honored, but EJB3Deployer uses it +hibernate.bytecode.provider=javassist +hibernate.jdbc.use_streams_for_binary=true +hibernate.show_sql=false +hibernate.format_sql=true +hibernate.default_batch_fetch_size=16 +hibernate.jdbc.batch_size=20 diff --git a/modules/enterprise/server/integration-tests/src/test/resources/ejb3-interceptors-aop.xml b/modules/enterprise/server/integration-tests/src/test/resources/ejb3-interceptors-aop.xml new file mode 100644 index 0000000..f30aa70 --- /dev/null +++ b/modules/enterprise/server/integration-tests/src/test/resources/ejb3-interceptors-aop.xml @@ -0,0 +1,360 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE aop PUBLIC + "-//JBoss//DTD JBOSS AOP 1.0//EN" + "http://www.jboss.org/aop/dtd/jboss-aop_1_0.dtd"> + +<aop> + <interceptor class="org.jboss.aspects.remoting.InvokeRemoteInterceptor" scope="PER_VM"/> + <interceptor class="org.jboss.aspects.security.SecurityClientInterceptor" scope="PER_VM"/> + <interceptor class="org.jboss.aspects.tx.ClientTxPropagationInterceptor" scope="PER_VM"/> + <interceptor class="org.jboss.ejb3.remoting.IsLocalInterceptor" scope="PER_VM"/> + <interceptor class="org.jboss.aspects.remoting.ClusterChooserInterceptor" scope="PER_VM"/> + + <interceptor class="org.jboss.aspects.tx.TxPropagationInterceptor" scope="PER_VM"/> + + <stack name="ServiceClientInterceptors"> + <interceptor-ref name="org.jboss.ejb3.remoting.IsLocalInterceptor"/> + <interceptor-ref name="org.jboss.aspects.security.SecurityClientInterceptor"/> + <interceptor-ref name="org.jboss.aspects.tx.ClientTxPropagationInterceptor"/> + <interceptor-ref name="org.jboss.aspects.remoting.InvokeRemoteInterceptor"/> + </stack> + + <stack name="AsynchronousStatelessSessionClientInterceptors"> + <interceptor-ref name="org.jboss.ejb3.remoting.IsLocalInterceptor"/> + <interceptor-ref name="org.jboss.aspects.security.SecurityClientInterceptor"/> + <interceptor-ref name="org.jboss.aspects.tx.ClientTxPropagationInterceptor"/> + <interceptor-ref name="org.jboss.aspects.remoting.InvokeRemoteInterceptor"/> + </stack> + + <stack name="AsynchronousStatefulSessionClientInterceptors"> + <interceptor-ref name="org.jboss.ejb3.remoting.IsLocalInterceptor"/> + <interceptor-ref name="org.jboss.aspects.security.SecurityClientInterceptor"/> + <interceptor-ref name="org.jboss.aspects.tx.ClientTxPropagationInterceptor"/> + <interceptor-ref name="org.jboss.aspects.remoting.InvokeRemoteInterceptor"/> + </stack> + + <stack name="StatelessSessionClientInterceptors"> + <interceptor-ref name="org.jboss.ejb3.remoting.IsLocalInterceptor"/> + <interceptor-ref name="org.jboss.aspects.security.SecurityClientInterceptor"/> + <interceptor-ref name="org.jboss.aspects.tx.ClientTxPropagationInterceptor"/> + <interceptor-ref name="org.jboss.aspects.remoting.InvokeRemoteInterceptor"/> + </stack> + + <stack name="StatefulSessionClientInterceptors"> + <interceptor-ref name="org.jboss.ejb3.remoting.IsLocalInterceptor"/> + <interceptor-ref name="org.jboss.aspects.security.SecurityClientInterceptor"/> + <interceptor-ref name="org.jboss.aspects.tx.ClientTxPropagationInterceptor"/> + <interceptor-ref name="org.jboss.aspects.remoting.InvokeRemoteInterceptor"/> + </stack> + + <stack name="ClusteredStatelessSessionClientInterceptors"> + <interceptor-ref name="org.jboss.ejb3.remoting.IsLocalInterceptor"/> + <interceptor-ref name="org.jboss.aspects.security.SecurityClientInterceptor"/> + <interceptor-ref name="org.jboss.aspects.tx.ClientTxPropagationInterceptor"/> + <interceptor-ref name="org.jboss.aspects.remoting.ClusterChooserInterceptor"/> + <interceptor-ref name="org.jboss.aspects.remoting.InvokeRemoteInterceptor"/> + </stack> + + <stack name="ClusteredStatefulSessionClientInterceptors"> + <interceptor-ref name="org.jboss.ejb3.remoting.IsLocalInterceptor"/> + <interceptor-ref name="org.jboss.aspects.security.SecurityClientInterceptor"/> + <interceptor-ref name="org.jboss.aspects.tx.ClientTxPropagationInterceptor"/> + <interceptor-ref name="org.jboss.aspects.remoting.ClusterChooserInterceptor"/> + <interceptor-ref name="org.jboss.aspects.remoting.InvokeRemoteInterceptor"/> + </stack> + + <interceptor class="org.jboss.ejb3.asynchronous.AsynchronousInterceptor" scope="PER_CLASS"/> + <interceptor class="org.jboss.ejb3.ENCPropagationInterceptor" scope="PER_VM"/> + <interceptor name="Basic Authorization" factory="org.jboss.ejb3.security.RoleBasedAuthorizationInterceptorFactory" scope="PER_CLASS"/> + <interceptor name="JACC Authorization" factory="org.jboss.ejb3.security.JaccAuthorizationInterceptorFactory" scope="PER_CLASS"/> + <interceptor factory="org.jboss.ejb3.security.AuthenticationInterceptorFactory" scope="PER_CLASS"/> + <interceptor factory="org.jboss.ejb3.security.RunAsSecurityInterceptorFactory" scope="PER_CLASS"/> + <interceptor class="org.jboss.ejb3.entity.ExtendedPersistenceContextPropagationInterceptor" scope="PER_VM"/> + <interceptor class="org.jboss.ejb3.stateless.StatelessInstanceInterceptor" scope="PER_VM"/> + <interceptor class="org.jboss.ejb3.stateful.StatefulInstanceInterceptor" scope="PER_VM"/> + <interceptor class="org.jboss.ejb3.stateful.SessionSynchronizationInterceptor" scope="PER_VM"/> + <interceptor class="org.jboss.ejb3.service.ServiceSingletonInterceptor" scope="PER_VM"/> + <interceptor class="org.jboss.ejb3.cache.StatefulReplicationInterceptor" scope="PER_VM"/> + <interceptor factory="org.jboss.ejb3.stateful.StatefulRemoveFactory" scope="PER_CLASS_JOINPOINT"/> + <interceptor factory="org.jboss.ejb3.tx.TxInterceptorFactory" scope="PER_CLASS_JOINPOINT"/> + <interceptor factory="org.jboss.ejb3.interceptor.EJB3InterceptorsFactory" scope="PER_CLASS_JOINPOINT"/> + <interceptor factory="org.jboss.ejb3.remoting.ReplicantsManagerInterceptorFactory" scope="PER_CLASS"/> + <interceptor class="org.jboss.ejb3.AllowedOperationsInterceptor" scope="PER_VM"/> + <interceptor factory="org.jboss.ejb3.mdb.CurrentMessageInjectorInterceptorFactory" scope="PER_CLASS"/> + <interceptor class="org.jboss.ejb3.entity.TransactionScopedEntityManagerInterceptor" scope="PER_VM"/> + + <domain name="Stateless Bean"> + <bind pointcut="execution(public * *->*(..))"> + <interceptor-ref name="org.jboss.ejb3.asynchronous.AsynchronousInterceptor"/> + <interceptor-ref name="org.jboss.ejb3.ENCPropagationInterceptor"/> + <interceptor-ref name="org.jboss.ejb3.security.AuthenticationInterceptorFactory"/> + </bind> + <bind pointcut="execution(public * @org.jboss.annotation.security.SecurityDomain->*(..))"> + <interceptor-ref name="Basic Authorization"/> + </bind> + <bind pointcut="execution(public * @javax.annotation.security.RunAs->*(..))"> + <interceptor-ref name="org.jboss.ejb3.security.RunAsSecurityInterceptorFactory"/> + </bind> + <bind pointcut="execution(public * @org.jboss.annotation.ejb.Clustered->*(..))"> + <interceptor-ref name="org.jboss.ejb3.remoting.ReplicantsManagerInterceptorFactory"/> + </bind> + <bind pointcut="execution(public * *->*(..))"> + <interceptor-ref name="org.jboss.ejb3.stateless.StatelessInstanceInterceptor"/> + <interceptor-ref name="org.jboss.aspects.tx.TxPropagationInterceptor"/> + <interceptor-ref name="org.jboss.ejb3.tx.TxInterceptorFactory"/> + <interceptor-ref name="org.jboss.ejb3.AllowedOperationsInterceptor"/> + <interceptor-ref name="org.jboss.ejb3.entity.TransactionScopedEntityManagerInterceptor"/> + <interceptor-ref name="org.jboss.ejb3.interceptor.EJB3InterceptorsFactory"/> + </bind> + <annotation expr="!class(@org.jboss.annotation.ejb.PoolClass)"> + @org.jboss.annotation.ejb.PoolClass (value=org.jboss.ejb3.ThreadlocalPool.class, maxSize=30, timeout=10000) + </annotation> + </domain> + + <domain name="JACC Stateless Bean"> + <bind pointcut="execution(public * *->*(..))"> + <interceptor-ref name="org.jboss.ejb3.asynchronous.AsynchronousInterceptor"/> + <interceptor-ref name="org.jboss.ejb3.ENCPropagationInterceptor"/> + <interceptor-ref name="org.jboss.ejb3.security.AuthenticationInterceptorFactory"/> + </bind> + <bind pointcut="execution(public * @org.jboss.annotation.security.SecurityDomain->*(..))"> + <interceptor-ref name="JACC Authorization"/> + </bind> + <bind pointcut="execution(public * @javax.annotation.security.RunAs->*(..))"> + <interceptor-ref name="org.jboss.ejb3.security.RunAsSecurityInterceptorFactory"/> + </bind> + <bind pointcut="execution(public * @org.jboss.annotation.ejb.Clustered->*(..))"> + <interceptor-ref name="org.jboss.ejb3.remoting.ReplicantsManagerInterceptorFactory"/> + </bind> + <bind pointcut="execution(public * *->*(..))"> + <interceptor-ref name="org.jboss.ejb3.stateless.StatelessInstanceInterceptor"/> + <interceptor-ref name="org.jboss.aspects.tx.TxPropagationInterceptor"/> + <interceptor-ref name="org.jboss.ejb3.tx.TxInterceptorFactory"/> + <interceptor-ref name="org.jboss.ejb3.AllowedOperationsInterceptor"/> + <interceptor-ref name="org.jboss.ejb3.entity.TransactionScopedEntityManagerInterceptor"/> + <interceptor-ref name="org.jboss.ejb3.interceptor.EJB3InterceptorsFactory"/> + </bind> + <annotation expr="!class(@org.jboss.annotation.ejb.PoolClass)"> + @org.jboss.annotation.ejb.PoolClass (value=org.jboss.ejb3.ThreadlocalPool.class, maxSize=30, timeout=10000) + </annotation> + </domain> + + <domain name="Base Stateful Bean"> + <bind pointcut="execution(public * *->*(..))"> + <interceptor-ref name="org.jboss.ejb3.asynchronous.AsynchronousInterceptor"/> + <interceptor-ref name="org.jboss.ejb3.ENCPropagationInterceptor"/> + <interceptor-ref name="org.jboss.ejb3.security.AuthenticationInterceptorFactory"/> + </bind> + <bind pointcut="execution(public * @org.jboss.annotation.security.SecurityDomain->*(..))"> + <interceptor-ref name="Basic Authorization"/> + </bind> + <bind pointcut="execution(public * @javax.annotation.security.RunAs->*(..))"> + <interceptor-ref name="org.jboss.ejb3.security.RunAsSecurityInterceptorFactory"/> + </bind> + <bind pointcut="execution(public * @org.jboss.annotation.ejb.Clustered->*(..))"> + <interceptor-ref name="org.jboss.ejb3.remoting.ReplicantsManagerInterceptorFactory"/> + </bind> + <bind pointcut="execution(public * *->@javax.ejb.Remove(..))"> + <interceptor-ref name="org.jboss.ejb3.stateful.StatefulRemoveFactory"/> + </bind> + <bind pointcut="execution(public * *->*(..))"> + <interceptor-ref name="org.jboss.ejb3.stateful.StatefulInstanceInterceptor"/> + <interceptor-ref name="org.jboss.aspects.tx.TxPropagationInterceptor"/> + <interceptor-ref name="org.jboss.ejb3.tx.TxInterceptorFactory"/> + <interceptor-ref name="org.jboss.ejb3.AllowedOperationsInterceptor"/> + </bind> + <bind pointcut="execution(public * $instanceof{javax.ejb.SessionSynchronization}->*(..))"> + <interceptor-ref name="org.jboss.ejb3.stateful.SessionSynchronizationInterceptor"/> + </bind> + <bind pointcut="execution(public * *->*(..))"> + <interceptor-ref name="org.jboss.ejb3.entity.TransactionScopedEntityManagerInterceptor"/> + <interceptor-ref name="org.jboss.ejb3.entity.ExtendedPersistenceContextPropagationInterceptor"/> + <interceptor-ref name="org.jboss.ejb3.interceptor.EJB3InterceptorsFactory"/> + </bind> + + <bind pointcut="execution(public * @org.jboss.annotation.ejb.Clustered->*(..)) AND !execution(public * *->@javax.ejb.Remove(..))"> + <interceptor-ref name="org.jboss.ejb3.cache.StatefulReplicationInterceptor"/> + </bind> + <annotation expr="!class(@org.jboss.annotation.ejb.PoolClass)"> + @org.jboss.annotation.ejb.PoolClass (value=org.jboss.ejb3.ThreadlocalPool.class, maxSize=30, timeout=10000) + </annotation> + </domain> + + <domain name="Stateful Bean" extends="Base Stateful Bean" inheritBindings="true"> + <!-- NON Clustered cache configuration --> + <annotation expr="!class(@org.jboss.annotation.ejb.cache.Cache) AND !class(@org.jboss.annotation.ejb.Clustered)"> + @org.jboss.annotation.ejb.cache.Cache (org.jboss.ejb3.cache.simple.SimpleStatefulCache.class) + </annotation> + <annotation expr="!class(@org.jboss.annotation.ejb.cache.simple.PersistenceManager) AND !class(@org.jboss.annotation.ejb.Clustered)"> + @org.jboss.annotation.ejb.cache.simple.PersistenceManager (org.jboss.ejb3.cache.simple.StatefulSessionFilePersistenceManager.class) + </annotation> + <annotation expr="!class(@org.jboss.annotation.ejb.cache.simple.CacheConfig) AND !class(@org.jboss.annotation.ejb.Clustered)"> + @org.jboss.annotation.ejb.cache.simple.CacheConfig (maxSize=100000, idleTimeoutSeconds=300) + </annotation> + + <!-- Clustered cache configuration --> + <annotation expr="!class(@org.jboss.annotation.ejb.cache.Cache) AND class(@org.jboss.annotation.ejb.Clustered)"> + @org.jboss.annotation.ejb.cache.Cache (org.jboss.ejb3.cache.tree.StatefulTreeCache.class) + </annotation> + <annotation expr="!class(@org.jboss.annotation.ejb.cache.tree.CacheConfig) AND class(@org.jboss.annotation.ejb.Clustered)"> + @org.jboss.annotation.ejb.cache.tree.CacheConfig (name="jboss.cache:service=EJB3SFSBClusteredCache", maxSize=100000, idleTimeoutSeconds=300) + </annotation> + </domain> + + <domain name="JACC Stateful Bean"> + <bind pointcut="execution(public * *->*(..))"> + <interceptor-ref name="org.jboss.ejb3.asynchronous.AsynchronousInterceptor"/> + <interceptor-ref name="org.jboss.ejb3.ENCPropagationInterceptor"/> + <interceptor-ref name="org.jboss.ejb3.security.AuthenticationInterceptorFactory"/> + </bind> + <bind pointcut="execution(public * @org.jboss.annotation.security.SecurityDomain->*(..))"> + <interceptor-ref name="JACC Authorization"/> + </bind> + <bind pointcut="execution(public * @javax.annotation.security.RunAs->*(..))"> + <interceptor-ref name="org.jboss.ejb3.security.RunAsSecurityInterceptorFactory"/> + </bind> + <bind pointcut="execution(public * @org.jboss.annotation.ejb.Clustered->*(..))"> + <interceptor-ref name="org.jboss.ejb3.remoting.ReplicantsManagerInterceptorFactory"/> + </bind> + <bind pointcut="execution(public * *->@javax.ejb.Remove(..))"> + <interceptor-ref name="org.jboss.ejb3.stateful.StatefulRemoveFactory"/> + </bind> + <bind pointcut="execution(public * *->*(..))"> + <interceptor-ref name="org.jboss.ejb3.stateful.StatefulInstanceInterceptor"/> + <interceptor-ref name="org.jboss.aspects.tx.TxPropagationInterceptor"/> + <interceptor-ref name="org.jboss.ejb3.tx.TxInterceptorFactory"/> + <interceptor-ref name="org.jboss.ejb3.AllowedOperationsInterceptor"/> + </bind> + <bind pointcut="execution(public * $instanceof{javax.ejb.SessionSynchronization}->*(..))"> + <interceptor-ref name="org.jboss.ejb3.stateful.SessionSynchronizationInterceptor"/> + </bind> + <bind pointcut="execution(public * *->*(..))"> + <interceptor-ref name="org.jboss.ejb3.entity.TransactionScopedEntityManagerInterceptor"/> + <interceptor-ref name="org.jboss.ejb3.entity.ExtendedPersistenceContextPropagationInterceptor"/> + <interceptor-ref name="org.jboss.ejb3.interceptor.EJB3InterceptorsFactory"/> + </bind> + + <bind pointcut="execution(public * @org.jboss.annotation.ejb.Clustered->*(..)) AND !execution(public * *->@javax.ejb.Remove(..))"> + <interceptor-ref name="org.jboss.ejb3.cache.StatefulReplicationInterceptor"/> + </bind> + <annotation expr="!class(@org.jboss.annotation.ejb.PoolClass)"> + @org.jboss.annotation.ejb.PoolClass (value=org.jboss.ejb3.ThreadlocalPool.class, maxSize=30, timeout=10000) + </annotation> + + <!-- NON Clustered cache configuration --> + <annotation expr="!class(@org.jboss.annotation.ejb.cache.Cache) AND !class(@org.jboss.annotation.ejb.Clustered)"> + @org.jboss.annotation.ejb.cache.Cache (org.jboss.ejb3.cache.simple.SimpleStatefulCache.class) + </annotation> + <annotation expr="!class(@org.jboss.annotation.ejb.cache.simple.PersistenceManager) AND !class(@org.jboss.annotation.ejb.Clustered)"> + @org.jboss.annotation.ejb.cache.simple.PersistenceManager (org.jboss.ejb3.cache.simple.StatefulSessionFilePersistenceManager.class) + </annotation> + <annotation expr="!class(@org.jboss.annotation.ejb.cache.simple.CacheConfig) AND !class(@org.jboss.annotation.ejb.Clustered)"> + @org.jboss.annotation.ejb.cache.simple.CacheConfig (maxSize=100000, idleTimeoutSeconds=300) + </annotation> + + <!-- Clustered cache configuration --> + <annotation expr="!class(@org.jboss.annotation.ejb.cache.Cache) AND class(@org.jboss.annotation.ejb.Clustered)"> + @org.jboss.annotation.ejb.cache.Cache (org.jboss.ejb3.cache.tree.StatefulTreeCache.class) + </annotation> + <annotation expr="!class(@org.jboss.annotation.ejb.cache.tree.CacheConfig) AND class(@org.jboss.annotation.ejb.Clustered)"> + @org.jboss.annotation.ejb.cache.tree.CacheConfig (name="jboss.cache:service=EJB3SFSBClusteredCache", maxSize=100000, idleTimeoutSeconds=300) + </annotation> + </domain> + + <domain name="Embedded Stateful Bean" extends="Base Stateful Bean" inheritBindings="true"> + <!-- NON Clustered cache configuration --> + <annotation expr="!class(@org.jboss.annotation.ejb.cache.Cache)"> + @org.jboss.annotation.ejb.cache.Cache (org.jboss.ejb3.cache.NoPassivationCache.class) + </annotation> + + </domain> + + <domain name="Message Driven Bean"> + <bind pointcut="execution(public * @javax.annotation.security.RunAs->*(..))"> + <interceptor-ref name="org.jboss.ejb3.security.RunAsSecurityInterceptorFactory"/> + </bind> + <bind pointcut="execution(public * *->*(..))"> + <interceptor-ref name="org.jboss.ejb3.stateless.StatelessInstanceInterceptor"/> + <interceptor-ref name="org.jboss.ejb3.tx.TxInterceptorFactory"/> + <interceptor-ref name="org.jboss.ejb3.AllowedOperationsInterceptor"/> + <interceptor-ref name="org.jboss.ejb3.entity.TransactionScopedEntityManagerInterceptor"/> + <interceptor-ref name="org.jboss.ejb3.interceptor.EJB3InterceptorsFactory"/> + </bind> + <annotation expr="!class(@org.jboss.annotation.ejb.PoolClass)"> + @org.jboss.annotation.ejb.PoolClass (value=org.jboss.ejb3.StrictMaxPool.class, maxSize=30, timeout=10000) + </annotation> + </domain> + + <domain name="Consumer Bean"> + <bind pointcut="execution(public * @javax.annotation.security.RunAs->*(..))"> + <interceptor-ref name="org.jboss.ejb3.security.RunAsSecurityInterceptorFactory"/> + </bind> + <bind pointcut="execution(public * *->*(..))"> + <interceptor-ref name="org.jboss.ejb3.stateless.StatelessInstanceInterceptor"/> + <interceptor-ref name="org.jboss.ejb3.tx.TxInterceptorFactory"/> + <interceptor-ref name="org.jboss.ejb3.AllowedOperationsInterceptor"/> + <interceptor-ref name="org.jboss.ejb3.entity.TransactionScopedEntityManagerInterceptor"/> + </bind> + <bind pointcut="execution(public * *->*(..)) AND (has(* *->@org.jboss.annotation.ejb.CurrentMessage(..)) OR hasfield(* *->@org.jboss.annotation.ejb.CurrentMessage))"> + <interceptor-ref name="org.jboss.ejb3.mdb.CurrentMessageInjectorInterceptorFactory"/> + </bind> + <bind pointcut="execution(public * *->*(..))"> + <interceptor-ref name="org.jboss.ejb3.interceptor.EJB3InterceptorsFactory"/> + </bind> + <annotation expr="!class(@org.jboss.annotation.ejb.PoolClass)"> + @org.jboss.annotation.ejb.PoolClass (value=org.jboss.ejb3.StrictMaxPool.class, maxSize=30, timeout=10000) + </annotation> + </domain> + + <domain name="Service Bean"> + <bind pointcut="execution(public * *->*(..))"> + <interceptor-ref name="org.jboss.ejb3.asynchronous.AsynchronousInterceptor"/> + <interceptor-ref name="org.jboss.ejb3.ENCPropagationInterceptor"/> + </bind> + <bind pointcut="!execution(* *->create()) AND !execution(* *->start()) AND !execution(*->new(..))"> + <interceptor-ref name="org.jboss.ejb3.security.AuthenticationInterceptorFactory"/> + </bind> + <bind pointcut="execution(public * @org.jboss.annotation.security.SecurityDomain->*(..))"> + <interceptor-ref name="Basic Authorization"/> + </bind> + <bind pointcut="execution(public * @javax.annotation.security.RunAs->*(..))"> + <interceptor-ref name="org.jboss.ejb3.security.RunAsSecurityInterceptorFactory"/> + </bind> + <bind pointcut="execution(public * *->*(..))"> + <interceptor-ref name="org.jboss.aspects.tx.TxPropagationInterceptor"/> + <interceptor-ref name="org.jboss.ejb3.tx.TxInterceptorFactory"/> + <interceptor-ref name="org.jboss.ejb3.AllowedOperationsInterceptor"/> + <interceptor-ref name="org.jboss.ejb3.entity.TransactionScopedEntityManagerInterceptor"/> + </bind> + <bind pointcut="execution(public * *->*(..)) AND !execution(* *->create()) AND !execution(* *->start())"> + <interceptor-ref name="org.jboss.ejb3.interceptor.EJB3InterceptorsFactory"/> + </bind> + </domain> + + <domain name="JACC Service Bean"> + <bind pointcut="execution(public * *->*(..))"> + <interceptor-ref name="org.jboss.ejb3.asynchronous.AsynchronousInterceptor"/> + <interceptor-ref name="org.jboss.ejb3.ENCPropagationInterceptor"/> + </bind> + <bind pointcut="!execution(* *->create()) AND !execution(* *->start()) AND !execution(*->new(..))"> + <interceptor-ref name="org.jboss.ejb3.security.AuthenticationInterceptorFactory"/> + </bind> + <bind pointcut="execution(public * @org.jboss.annotation.security.SecurityDomain->*(..))"> + <interceptor-ref name="Basic Authorization"/> + </bind> + <bind pointcut="execution(public * @javax.annotation.security.RunAs->*(..))"> + <interceptor-ref name="org.jboss.ejb3.security.RunAsSecurityInterceptorFactory"/> + </bind> + <bind pointcut="execution(public * *->*(..))"> + <interceptor-ref name="org.jboss.aspects.tx.TxPropagationInterceptor"/> + <interceptor-ref name="org.jboss.ejb3.tx.TxInterceptorFactory"/> + <interceptor-ref name="org.jboss.ejb3.AllowedOperationsInterceptor"/> + <interceptor-ref name="org.jboss.ejb3.entity.TransactionScopedEntityManagerInterceptor"/> + </bind> + <bind pointcut="execution(public * *->*(..)) AND !execution(* *->create()) AND !execution(* *->start())"> + <interceptor-ref name="org.jboss.ejb3.interceptor.EJB3InterceptorsFactory"/> + </bind> + </domain> + + +</aop> \ No newline at end of file diff --git a/modules/enterprise/server/integration-tests/src/test/resources/embedded-jboss-beans.xml b/modules/enterprise/server/integration-tests/src/test/resources/embedded-jboss-beans.xml new file mode 100644 index 0000000..05edefa --- /dev/null +++ b/modules/enterprise/server/integration-tests/src/test/resources/embedded-jboss-beans.xml @@ -0,0 +1,160 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<deployment xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="urn:jboss:bean-deployer:2.0 bean-deployer_2_0.xsd" + xmlns="urn:jboss:bean-deployer:2.0"> + + <bean name="Naming" class="org.jnp.server.SingletonNamingServer"/> + + <bean name="InitialContextProperties" class="java.util.Hashtable"> + <constructor> + <parameter class="java.util.Map"> + <map keyClass="java.lang.String" valueClass="java.lang.String"> + <entry> + <key>java.naming.factory.initial</key> + <value>org.jnp.interfaces.LocalOnlyContextFactory</value> + </entry> + <entry> + <key>java.naming.factory.url.pkgs</key> + <value>org.jboss.naming:org.jnp.interfaces</value> + </entry> + </map> + </parameter> + </constructor> + </bean> + + <bean name="java:comp/Initializer" class="org.jboss.ejb3.embedded.JavaCompInitializer"> + <property name="jndiProperties"> + <inject bean="InitialContextProperties"/> + </property> + </bean> + + <bean name="XidFactory" class="org.jboss.tm.XidFactoryImpl"/> + + <bean name="XidFactoryMBean" class="org.jboss.ejb3.embedded.XidFactoryMBean"> + <constructor> + <parameter class="org.jboss.tm.XidFactoryBase"> + <inject bean="XidFactory"/> + </parameter> + </constructor> + </bean> + + <bean name="TransactionManagerInitializer" class="org.jboss.tm.TransactionManagerInitializer"> + <property name="xidFactory"> + <inject bean="XidFactory"/> + </property> + <property name="initialContextProperties"> + <inject bean="InitialContextProperties"/> + </property> + </bean> + + <bean name="UserTransaction" class="org.jboss.ejb3.embedded.UserTransactionImpl"> + <demand>TransactionManagerInitializer</demand> + </bean> + + <bean name="UserTransactionBinding" class="org.jboss.ejb3.embedded.JndiBinder"> + <property name="jndiProperties"> + <inject bean="InitialContextProperties"/> + </property> + <property name="target"> + <inject bean="UserTransaction"/> + </property> + <property name="bindTo">UserTransaction</property> + <property name="serializable">false</property> + </bean> + + + <bean name="TransactionManager" class="java.lang.Object"> + <constructor factoryMethod="getTransactionManager"> + <factory bean="TransactionManagerInitializer"/> + </constructor> + </bean> + <bean name="CachedConnectionManager" class="org.jboss.resource.connectionmanager.CachedConnectionManagerReference"> + <property name="transactionManager"> + <inject bean="TransactionManager"/> + </property> + </bean> + + <bean name="RHQDSBootstrap" class="org.jboss.resource.adapter.jdbc.local.LocalTxDataSource"> + <property name="driverClass">${rhq.test.ds.driver-class}</property> + <property name="connectionURL">${rhq.test.ds.connection-url}</property> + <property name="userName">${rhq.test.ds.user-name}</property> + <property name="password">${rhq.test.ds.password}</property> + <property name="jndiName">java:/RHQDS</property> + <property name="minSize">0</property> + <property name="maxSize">20</property> + <property name="blockingTimeout">3000</property> + <property name="idleTimeout">100000</property> + <property name="transactionManager"> + <inject bean="TransactionManager"/> + </property> + <property name="cachedConnectionManager"> + <inject bean="CachedConnectionManager"/> + </property> + <property name="initialContextProperties"> + <inject bean="InitialContextProperties"/> + </property> + </bean> + + <bean name="RHQDS" class="java.lang.Object"> + <constructor factoryMethod="getDatasource"> + <factory bean="RHQDSBootstrap"/> + </constructor> + </bean> + + <!-- needed for Quartz' no-TX data source (even though this is a local-tx, seems like Quartz is still working) --> + <bean name="NoTxRHQDSBootstrap" class="org.jboss.resource.adapter.jdbc.local.LocalTxDataSource"> + <property name="driverClass">${rhq.test.ds.driver-class}</property> + <property name="connectionURL">${rhq.test.ds.connection-url}</property> + <property name="userName">${rhq.test.ds.user-name}</property> + <property name="password">${rhq.test.ds.password}</property> + <property name="jndiName">java:/NoTxRHQDS</property> + <property name="minSize">0</property> + <property name="maxSize">10</property> + <property name="blockingTimeout">1000</property> + <property name="idleTimeout">100000</property> + <property name="transactionManager"> + <inject bean="TransactionManager"/> + </property> + <property name="cachedConnectionManager"> + <inject bean="CachedConnectionManager"/> + </property> + <property name="initialContextProperties"> + <inject bean="InitialContextProperties"/> + </property> + </bean> + + <bean name="NoTxRHQDS" class="java.lang.Object"> + <constructor factoryMethod="getDatasource"> + <factory bean="NoTxRHQDSBootstrap"/> + </constructor> + </bean> + + <bean name="DefaultDSBootstrap" class="org.jboss.resource.adapter.jdbc.local.LocalTxDataSource"> + <property name="driverClass">org.hsqldb.jdbcDriver</property> + <property name="connectionURL">jdbc:hsqldb:.</property> + <!-- <property name="connectionURL">jdbc:hsqldb:./hypersonic/localDB</property> --> + <property name="userName">sa</property> + <property name="jndiName">java:/DefaultDS</property> + <property name="minSize">0</property> + <property name="maxSize">10</property> + <property name="blockingTimeout">1000</property> + <property name="idleTimeout">100000</property> + <property name="transactionManager"> + <inject bean="TransactionManager"/> + </property> + <property name="cachedConnectionManager"> + <inject bean="CachedConnectionManager"/> + </property> + <property name="initialContextProperties"> + <inject bean="InitialContextProperties"/> + </property> + </bean> + + <bean name="DefaultDS" class="java.lang.Object"> + <constructor factoryMethod="getDatasource"> + <factory bean="DefaultDSBootstrap"/> + </constructor> + </bean> + +</deployment> \ No newline at end of file diff --git a/modules/enterprise/server/integration-tests/src/test/resources/jboss-jms-beans.xml b/modules/enterprise/server/integration-tests/src/test/resources/jboss-jms-beans.xml new file mode 100644 index 0000000..287cffc --- /dev/null +++ b/modules/enterprise/server/integration-tests/src/test/resources/jboss-jms-beans.xml @@ -0,0 +1,132 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<deployment xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="urn:jboss:bean-deployer:2.0 bean-deployer_2_0.xsd" + xmlns="urn:jboss:bean-deployer:2.0"> + <bean name="jboss.mq:service=JMSProviderLoader,name=JMSProvider" class="org.jboss.jms.jndi.JNDIProviderAdapter"> + <property name="factoryRef">java:/JmsXA</property> + <property name="queueFactoryRef">java:/JmsXA</property> + <property name="topicFactoryRef">java:/JmsXA</property> + <property name="properties" class="java.util.Properties"> + <map keyClass="java.lang.String" valueClass="java.lang.String"> + <entry> + <key>java.naming.factory.initial</key> + <value>org.jnp.interfaces.LocalOnlyContextFactory</value> + </entry> + <entry> + <key>java.naming.factory.url.pkgs</key> + <value>org.jboss.naming:org.jnp.interfaces</value> + </entry> + </map> + </property> + </bean> + + <bean name="b1" class="org.jboss.ejb3.embedded.JndiBinder"> + <property name="jndiProperties"><inject bean="InitialContextProperties"/></property> + <property name="target"><inject bean="jboss.mq:service=JMSProviderLoader,name=JMSProvider"/></property> + <property name="bindTo">java:/DefaultJMSProvider</property> + <property name="serializable">true</property> + </bean> + + <bean name="jboss.mq:service=ServerSessionPoolMBean,name=StdJMSPool" class="org.jboss.jms.asf.StdServerSessionPoolFactory"> + <property name="name">StdJMSPool</property> + <property name="xidFactory"><inject bean="XidFactoryMBean"/></property> + <property name="transactionManager"><inject bean="TransactionManager"/></property> + </bean> + + <bean name="b2" class="org.jboss.ejb3.embedded.JndiBinder"> + <property name="jndiProperties"><inject bean="InitialContextProperties"/></property> + <property name="target"><inject bean="jboss.mq:service=ServerSessionPoolMBean,name=StdJMSPool"/></property> + <property name="bindTo">java:/StdJMSPool</property> + <property name="serializable">false</property> + </bean> + + + <bean name="jboss.mq:service=PersistenceManager" class="org.jboss.mq.pm.none.PersistenceManager"> + </bean> + + <bean name="jboss.mq:service=MessageCache" class="org.jboss.mq.kernel.MessageCache"> + <property name="persistenceManager"><inject bean="jboss.mq:service=PersistenceManager"/></property> + <property name="highMemoryMark">50</property> + <property name="maxMemoryMark">60</property> + </bean> + + <bean name="jms-rar-WorkManager" class="org.jboss.ejb3.embedded.resource.JBossWorkManager"> + </bean> + + <bean name="jms-rar-DeploymentInfo" class="org.jboss.ejb3.embedded.resource.Ejb3DeploymentInfo"> + <constructor> + <parameter class="java.lang.String">jms-ra.rar</parameter> + <parameter class="java.lang.String">javax.jms.MessageListener</parameter> + <parameter class="java.lang.String">org.jboss.resource.adapter.jms.inflow.JmsActivationSpec</parameter> + </constructor> + </bean> + + <bean name="jboss.jca:name='jms-ra.rar',service=RARDeployment" class="org.jboss.ejb3.embedded.resource.RARDeployment"> + <constructor> + <parameter class="org.jboss.deployment.DeploymentInfo"> + <inject bean="jms-rar-DeploymentInfo"/> + </parameter> + </constructor> + <property name="workManager"><inject bean="jms-rar-WorkManager"/></property> + </bean> + + <bean name="jboss.mq:service=StateManager" class="org.jboss.mq.sm.none.NullStateManager"> + </bean> + + <bean name="BasicQueueParameters" class="org.jboss.mq.server.BasicQueueParameters"/> + + <bean name="jboss.mq:service=ThreadPool" class="org.jboss.util.threadpool.BasicThreadPool"> + <property name="name">JMSThread</property> + <property name="threadGroupName">JBossMQ Server Threads</property> + <!-- The max number of threads in the pool --> + <property name="maximumPoolSize">10</property> + <!-- The max number of tasks before the queue is full --> + <property name="maximumQueueSize">1000</property> + <!-- The behavior of the pool when a task is added and the queue is full. + abort - a RuntimeException is thrown + run - the calling thread executes the task + wait - the calling thread blocks until the queue has room + discard - the task is silently discarded without being run + discardOldest - check to see if a task is about to complete and enque + the new task if possible, else run the task in the calling thread + --> + <property name="blockingMode">run</property> + </bean> + + <bean name="jboss.mq:service=DestinationManager" class="org.jboss.mq.server.JMSDestinationManager"> + <constructor> + <parameter class="org.jboss.mq.server.BasicQueueParameters"> + <inject bean="BasicQueueParameters"/> + </parameter> + </constructor> + <property name="persistenceManager"><inject bean="jboss.mq:service=PersistenceManager"/></property> + <property name="messageCache"><inject bean="jboss.mq:service=MessageCache"/></property> + <property name="stateManager"><inject bean="jboss.mq:service=StateManager"/></property> + <property name="threadPool"><inject bean="jboss.mq:service=ThreadPool"/></property> + <property name="threadGroup"><inject bean="jboss.mq:service=ThreadPool" property="threadGroup"/></property> + <start method="startServer"/> + <stop method="stopServer"/> + </bean> + + <bean name="jboss.mq.destination:service=Queue,name=DLQ" class="org.jboss.mq.kernel.Queue"> + <property name="destinationManagerPojo"><inject bean="jboss.mq:service=DestinationManager"/></property> + <property name="initialContextProperties"><inject bean="InitialContextProperties"/></property> + <property name="destinationName">DLQ</property> + </bean> + + <bean name="jboss.mq:service=Invoker" class="org.jboss.mq.server.JMSServerInvoker"> + <property name="next"><inject bean="jboss.mq:service=DestinationManager"/></property> + </bean> + + <bean name="jboss.mq:service=invocationlayer,type=JVM" class="org.jboss.mq.kernel.JVMIL"> + <property name="jmsInvoker"><inject bean="jboss.mq:service=Invoker"/></property> + <!-- notice we actually switched - the non-xa connection factory JNDI Ref is the JNDI name our EJBs use --> + <!-- the embedded EJB container doesn't support XA, so the connection factory our JmsXA JNDI lookup will return will be a non-XA factory --> + <property name="connectionFactoryJNDIRef">java:/JmsXA</property> + <property name="XAConnectionFactoryJNDIRef">java:/ConnectionFactory</property> + <property name="pingPeriod">0</property> + <property name="initialContextProperties"><inject bean="InitialContextProperties"/></property> + </bean> + +</deployment> diff --git a/modules/enterprise/server/integration-tests/src/test/resources/jms-ra.rar b/modules/enterprise/server/integration-tests/src/test/resources/jms-ra.rar new file mode 100644 index 0000000..c4807c6 Binary files /dev/null and b/modules/enterprise/server/integration-tests/src/test/resources/jms-ra.rar differ diff --git a/modules/enterprise/server/integration-tests/src/test/resources/jndi.properties b/modules/enterprise/server/integration-tests/src/test/resources/jndi.properties new file mode 100644 index 0000000..9225cef --- /dev/null +++ b/modules/enterprise/server/integration-tests/src/test/resources/jndi.properties @@ -0,0 +1,2 @@ +java.naming.factory.initial=org.jnp.interfaces.LocalOnlyContextFactory +java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces \ No newline at end of file diff --git a/modules/enterprise/server/integration-tests/src/test/resources/log4j.xml b/modules/enterprise/server/integration-tests/src/test/resources/log4j.xml new file mode 100644 index 0000000..bc65329 --- /dev/null +++ b/modules/enterprise/server/integration-tests/src/test/resources/log4j.xml @@ -0,0 +1,74 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> + +<!-- ===================================================================== --> +<!-- --> +<!-- Log4j Configuration --> +<!-- --> +<!-- ===================================================================== --> + +<!-- $Id: log4j.xml 39945 2006-01-12 02:44:07Z bill $ --> + +<!-- + | For more configuration infromation and examples see the Jakarta Log4j + | owebsite: http://jakarta.apache.org/log4j + --> + +<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="true"> + + <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender"> + <errorHandler class="org.jboss.logging.util.OnlyOnceErrorHandler"/> + <param name="Target" value="System.out"/> + <param name="Threshold" value="WARN"/> + + <layout class="org.apache.log4j.PatternLayout"> + <!-- The default pattern: Date Priority [Category] Messagen --> + <!-- + <param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%c{1}] %m%n"/> + --> + <param name="ConversionPattern" value="%-5p %d{dd-MM HH:mm:ss,SSS} [%c] (%F:%M:%L) -%m%n"/> + </layout> + </appender> + + <appender name="FILE" class="org.apache.log4j.RollingFileAppender"> + <param name="File" value="target/server-jar-test.log"/> + <param name="Threshold" value="WARN"/> + <param name="Append" value="false"/> + + <layout class="org.apache.log4j.PatternLayout"> + <!-- The default pattern: Date Priority [Category] Messagen --> + <!-- + <param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%c{1}] %m%n"/> + --> + <param name="ConversionPattern" value="%-5p %d{dd-MM HH:mm:ss,SSS} [%c] (%F:%M:%L) -%m%n"/> + </layout> + </appender> + + <!-- Hibernate logs WARNINGS frequent from this class, in test envs. --> + <category name="org.hibernate.hql.ast.QueryTranslatorImpl"> + <priority value="ERROR"/> + </category> + + <!-- hides the TIMER SERVICE IS NOT INSTALLED warning - we know embedded EJB3 container doesn't support timers --> + <category name="org.jboss.ejb3.timerservice.jboss.JBossTimerServiceFactory"> + <priority value="ERROR"/> + </category> + + <!-- hides the shutdown warnings - for some reason, the container spits out some warnings when shutting down --> + <category name="org.jboss.kernel.plugins.dependency.StartStopLifecycleAction"> + <priority value="ERROR"/> + </category> + + <!-- Hibernate SQL logs --> + <!-- + <category name="org.hibernate.SQL"> + <priority value="DEBUG"/> + </category> + --> + + <root> + <appender-ref ref="CONSOLE"/> + <appender-ref ref="FILE"/> + </root> + +</log4j:configuration> diff --git a/modules/enterprise/server/integration-tests/src/test/resources/login-config.xml b/modules/enterprise/server/integration-tests/src/test/resources/login-config.xml new file mode 100644 index 0000000..645294d --- /dev/null +++ b/modules/enterprise/server/integration-tests/src/test/resources/login-config.xml @@ -0,0 +1,72 @@ +<?xml version='1.0'?> + +<!DOCTYPE policy PUBLIC + "-//JBoss//DTD JBOSS Security Config 3.0//EN" + "http://www.jboss.org/j2ee/dtd/security_config.dtd"> + +<!-- The XML based JAAS login configuration read by the +org.jboss.security.auth.login.XMLLoginConfig mbean. Add +an application-policy element for each security domain. + +The outline of the application-policy is: +<application-policy name="security-domain-name"> + <authentication> + <login-module code="login.module1.class.name" flag="control_flag"> + <module-option name = "option1-name">option1-value</module-option> + <module-option name = "option2-name">option2-value</module-option> + ... + </login-module> + + <login-module code="login.module2.class.name" flag="control_flag"> + ... + </login-module> + ... + </authentication> +</application-policy> + +$Revision: 42748 $ +--> + +<policy> + <!-- Used by clients within the application server VM such as + mbeans and servlets that access EJBs. + --> + <application-policy name="client-login"> + <authentication> + <login-module code="org.jboss.security.ClientLoginModule" + flag="required"> + <!-- Any existing security context will be restored on logout --> + <module-option name="restore-login-identity">true</module-option> + </login-module> + </authentication> + </application-policy> + + <application-policy name = "jbossmq"> + <authentication> + <login-module code = "org.jboss.mq.sm.file.DynamicLoginModule" flag = "required"> + <module-option name = "unauthenticatedIdentity">guest</module-option> + <module-option name = "sm.objectname">jboss.mq:service=StateManager</module-option> + </login-module> + </authentication> + </application-policy> + + <application-policy name="other"> + <!-- A simple server login module, which can be used when the number + of users is relatively small. It uses two properties files: + users.properties, which holds users (key) and their password (value). + roles.properties, which holds users (key) and a comma-separated list of + their roles (value). + The unauthenticatedIdentity property defines the name of the principal + that will be used when a null username and password are presented as is + the case for an unuathenticated web client or MDB. If you want to + allow such users to be authenticated add the property, e.g., + unauthenticatedIdentity="nobody" + --> + <authentication> + <login-module code="org.jboss.security.auth.spi.UsersRolesLoginModule" + flag="required"/> + </authentication> + </application-policy> + +</policy> + diff --git a/modules/enterprise/server/integration-tests/src/test/resources/rhq-mdb-beans.xml b/modules/enterprise/server/integration-tests/src/test/resources/rhq-mdb-beans.xml new file mode 100644 index 0000000..ad05b5e --- /dev/null +++ b/modules/enterprise/server/integration-tests/src/test/resources/rhq-mdb-beans.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<deployment xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="urn:jboss:bean-deployer:2.0 bean-deployer_2_0.xsd" + xmlns="urn:jboss:bean-deployer:2.0"> + + <bean name="jboss.mq.destination:service=Queue,name=AlertConditionQueue" class="org.jboss.mq.kernel.Queue"> + <property name="destinationManagerPojo"><inject bean="jboss.mq:service=DestinationManager"/></property> + <property name="initialContextProperties"><inject bean="InitialContextProperties"/></property> + <property name="destinationName">AlertConditionQueue</property> + </bean> + + <bean name="jboss.mq.destination:service=Queue,name=DriftChangesetQueue" class="org.jboss.mq.kernel.Queue"> + <property name="destinationManagerPojo"><inject bean="jboss.mq:service=DestinationManager"/></property> + <property name="initialContextProperties"><inject bean="InitialContextProperties"/></property> + <property name="destinationName">DriftChangesetQueue</property> + </bean> + + <bean name="jboss.mq.destination:service=Queue,name=DriftFileQueue" class="org.jboss.mq.kernel.Queue"> + <property name="destinationManagerPojo"><inject bean="jboss.mq:service=DestinationManager"/></property> + <property name="initialContextProperties"><inject bean="InitialContextProperties"/></property> + <property name="destinationName">DriftFileQueue</property> + </bean> + +</deployment> \ No newline at end of file diff --git a/modules/enterprise/server/integration-tests/src/test/resources/security-beans.xml b/modules/enterprise/server/integration-tests/src/test/resources/security-beans.xml new file mode 100644 index 0000000..84fa819 --- /dev/null +++ b/modules/enterprise/server/integration-tests/src/test/resources/security-beans.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<deployment xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="urn:jboss:bean-deployer bean-deployer_1_0.xsd" + xmlns="urn:jboss:bean-deployer"> + + <bean class="org.jboss.ejb3.embedded.JaasSecurityManagerService" + name="jboss.security:service=JaasSecurityManager"> + <property name="initialContextProperties"> + <inject bean="InitialContextProperties"/> + </property> + </bean> +</deployment> diff --git a/modules/enterprise/server/integration-tests/src/test/resources/test-assist-color-number.txt b/modules/enterprise/server/integration-tests/src/test/resources/test-assist-color-number.txt new file mode 100644 index 0000000..6ad90cc --- /dev/null +++ b/modules/enterprise/server/integration-tests/src/test/resources/test-assist-color-number.txt @@ -0,0 +1,46 @@ + +color[ number +c +color[ +n +number +r +color[ number +lo +color[ +number +number!= number!== number= number== +be +number +number== +number=="two" number=="four" number=="twenty-two" number=="twenty-four" number=="forty-two" +number==t +number=="two" number=="twenty-two" number=="twenty-four" number=="forty-two" +number==fo +number=="four" number=="twenty-four" number=="forty-two" +color +color[ +color[ +color[primary] color[other] +color[p +color[primary] +color[o +color[other] +color[r +color[primary] color[other] +color[primary +color[primary] +color[primary] +color[primary]!= color[primary]!== color[primary]= color[primary]== +color[primary]= +color[primary]="red" color[primary]="green" color[primary]="blue" +color[primary]=e +color[primary]="red" color[primary]="green" color[primary]="blue" +color[primary]=d +color[primary]="red" +color[primary]=g +color[primary]="green" +color[primary]=b +color[primary]="blue" +color[primary]=r +color[primary]="red" color[primary]="green" \ No newline at end of file diff --git a/modules/enterprise/server/integration-tests/src/test/resources/test-ldap.properties b/modules/enterprise/server/integration-tests/src/test/resources/test-ldap.properties new file mode 100644 index 0000000..3316083 --- /dev/null +++ b/modules/enterprise/server/integration-tests/src/test/resources/test-ldap.properties @@ -0,0 +1,2 @@ +rhq.test.ldap.url=${rhq.test.ldap.url} +rhq.test.ldap.LDAPFactory=${rhq.test.ldap.LDAPFactory} \ No newline at end of file diff --git a/modules/enterprise/server/integration-tests/src/test/resources/test-scheduler.properties b/modules/enterprise/server/integration-tests/src/test/resources/test-scheduler.properties new file mode 100644 index 0000000..804639a --- /dev/null +++ b/modules/enterprise/server/integration-tests/src/test/resources/test-scheduler.properties @@ -0,0 +1,29 @@ +# QUARTZ CONFIGURATION FOR OUR UNIT TESTS +# our test timeout will be fast, 5 seconds +rhq.server.operation-timeout = 5 + +# scheduler factory config +org.quartz.scheduler.instanceName = RHQScheduler +org.quartz.scheduler.instanceId = AUTO + +# thread pool config +org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool +org.quartz.threadPool.threadCount = 25 +org.quartz.threadPool.threadPriority = 5 + +# database config - note the use of POSTGRES for tests +org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreCMT +org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.PostgreSQLDelegate +# tests don't need this +org.quartz.jobStore.isClustered = false +org.quartz.jobStore.clusterCheckinInterval = 600000 +# make this a small non-zero time (in ms) so the scheduler (almost) never sleeps for more predictable test timing +org.quartz.scheduler.idleWaitTime = 10 +org.quartz.jobStore.tablePrefix = RHQ_QRTZ_ +org.quartz.jobStore.useProperties = true +org.quartz.jobStore.dataSource = RHQDS +org.quartz.dataSource.RHQDS.jndiURL = java:/RHQDS +org.quartz.dataSource.RHQDS.maxConnections = 10 +org.quartz.jobStore.nonManagedTXDataSource = NoTxRHQDS +org.quartz.dataSource.NoTxRHQDS.jndiURL = java:/NoTxRHQDS +org.quartz.dataSource.NoTxRHQDS.maxConnections = 10 \ No newline at end of file diff --git a/modules/enterprise/server/integration-tests/src/test/resources/testng.xml b/modules/enterprise/server/integration-tests/src/test/resources/testng.xml new file mode 100644 index 0000000..1452edb --- /dev/null +++ b/modules/enterprise/server/integration-tests/src/test/resources/testng.xml @@ -0,0 +1,12 @@ +<!DOCTYPE suite SYSTEM "http://beust.com/testng/testng-1.0.dtd" > + +<suite name="EJB3 Testsuite" > + <test name="EJB3 tests" > + <groups> + <run> + <include name="integration.ejb3"/> + </run> + </groups> + + </test> +</suite> diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/drift/DriftServerPluginService.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/drift/DriftServerPluginService.java deleted file mode 100644 index 64c6537..0000000 --- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/drift/DriftServerPluginService.java +++ /dev/null @@ -1,146 +0,0 @@ -/* - * RHQ Management Platform - * Copyright (C) 2011 Red Hat, Inc. - * All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation version 2 of the License. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -package org.rhq.enterprise.server.drift; - -import java.io.File; -import java.net.URL; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.rhq.core.domain.configuration.Configuration; -import org.rhq.core.domain.configuration.definition.ConfigurationDefinition; -import org.rhq.core.domain.plugin.PluginKey; -import org.rhq.core.domain.plugin.PluginStatusType; -import org.rhq.core.domain.plugin.ServerPlugin; -import org.rhq.core.util.MessageDigestGenerator; -import org.rhq.enterprise.server.plugin.pc.AbstractTypeServerPluginContainer; -import org.rhq.enterprise.server.plugin.pc.MasterServerPluginContainer; -import org.rhq.enterprise.server.plugin.pc.MasterServerPluginContainerConfiguration; -import org.rhq.enterprise.server.plugin.pc.ServerPluginEnvironment; -import org.rhq.enterprise.server.plugin.pc.ServerPluginManager; -import org.rhq.enterprise.server.plugin.pc.ServerPluginService; -import org.rhq.enterprise.server.plugin.pc.ServerPluginType; -import org.rhq.enterprise.server.plugin.pc.drift.DriftServerPluginContainer; -import org.rhq.enterprise.server.plugin.pc.drift.DriftServerPluginManager; -import org.rhq.enterprise.server.xmlschema.ServerPluginDescriptorMetadataParser; -import org.rhq.enterprise.server.xmlschema.generated.serverplugin.ServerPluginDescriptorType; - -public class DriftServerPluginService extends ServerPluginService implements DriftServerPluginServiceMBean { - - public TestMasterServerPluginContainer master; - public MasterServerPluginContainerConfiguration masterConfig; - - public DriftServerPluginService() { - // build the config at constructor time so tests have it even before the PC is initialized - File dir = new File(System.getProperty("java.io.tmpdir"), "test-server-plugins"); - this.masterConfig = new MasterServerPluginContainerConfiguration(dir, dir, dir, null); - } - - @Override - public MasterServerPluginContainer createMasterPluginContainer() { - this.master = new TestMasterServerPluginContainer(); - this.master.initialize(this.masterConfig); - return this.master; - } - - class TestMasterServerPluginContainer extends MasterServerPluginContainer { - @Override - protected ClassLoader createRootServerPluginClassLoader() { - return getClass().getClassLoader(); - } - - @Override - protected Map<URL, ? extends ServerPluginDescriptorType> preloadAllPlugins() throws Exception { - // if our test never setup any plugins, ignore it and just return an empty map - File pluginDir = getConfiguration().getPluginDirectory(); - if (pluginDir == null || pluginDir.listFiles() == null || pluginDir.listFiles().length == 0) { - return new HashMap<URL, ServerPluginDescriptorType>(); - } else { - return super.preloadAllPlugins(); - } - } - - @Override - protected List<PluginKey> getDisabledPluginKeys() { - // in the real world, the db is checked for enable flag, here we say all plugins are enabled - return new ArrayList<PluginKey>(); - } - - @Override - protected List<AbstractTypeServerPluginContainer> createPluginContainers() { - ArrayList<AbstractTypeServerPluginContainer> pcs = new ArrayList<AbstractTypeServerPluginContainer>(1); - DriftServerPluginContainer driftPC = new TestDriftServerPluginContainer(this); - pcs.add(driftPC); - - return pcs; - } - } - - class TestDriftServerPluginContainer extends DriftServerPluginContainer { - public TestDriftServerPluginContainer(MasterServerPluginContainer master) { - super(master); - } - - @Override - protected ServerPluginManager createPluginManager() { - return new TestDriftServerPluginManager(this); - } - } - - class TestDriftServerPluginManager extends DriftServerPluginManager { - public TestDriftServerPluginManager(DriftServerPluginContainer pc) { - super(pc); - } - - @Override - protected ServerPlugin getPlugin(ServerPluginEnvironment env) { - try { - Configuration pluginConfig = null; - Configuration scheduledJobsConfig = null; - ConfigurationDefinition configDef; - - ServerPluginDescriptorType pluginDescriptor = env.getPluginDescriptor(); - - configDef = ServerPluginDescriptorMetadataParser.getPluginConfigurationDefinition(pluginDescriptor); - if (configDef != null) { - pluginConfig = configDef.getDefaultTemplate().createConfiguration(); - } - - configDef = ServerPluginDescriptorMetadataParser.getScheduledJobsDefinition(pluginDescriptor); - if (configDef != null) { - scheduledJobsConfig = configDef.getDefaultTemplate().createConfiguration(); - } - - File pluginFile = new File(env.getPluginUrl().toURI()); - ServerPlugin plugin = new ServerPlugin(0, env.getPluginKey().getPluginName(), pluginFile.getName(), - pluginDescriptor.getDisplayName(), true, PluginStatusType.INSTALLED, pluginDescriptor - .getDescription(), "", MessageDigestGenerator.getDigestString(pluginFile), pluginDescriptor - .getVersion(), pluginDescriptor.getVersion(), pluginConfig, scheduledJobsConfig, - new ServerPluginType(pluginDescriptor).stringify(), System.currentTimeMillis(), System - .currentTimeMillis()); - return plugin; - } catch (Exception e) { - throw new RuntimeException(e); - } - } - } -} diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/drift/DriftServerPluginServiceMBean.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/drift/DriftServerPluginServiceMBean.java deleted file mode 100644 index d38374e..0000000 --- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/drift/DriftServerPluginServiceMBean.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * RHQ Management Platform - * Copyright (C) 2011 Red Hat, Inc. - * All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation version 2 of the License. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -package org.rhq.enterprise.server.drift; - -import org.rhq.enterprise.server.plugin.pc.ServerPluginServiceManagement; - -public interface DriftServerPluginServiceMBean extends ServerPluginServiceManagement { -} diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/drift/DriftServerTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/drift/DriftServerTest.java deleted file mode 100644 index 3843f38..0000000 --- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/drift/DriftServerTest.java +++ /dev/null @@ -1,242 +0,0 @@ -/* - * RHQ Management Platform - * Copyright (C) 2011 Red Hat, Inc. - * All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation version 2 of the License. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -package org.rhq.enterprise.server.drift; - -import static org.rhq.core.domain.resource.ResourceCategory.SERVER; -import static org.rhq.enterprise.server.util.LookupUtil.getSubjectManager; - -import java.io.File; -import java.lang.reflect.Method; -import java.util.List; - -import javax.persistence.EntityManager; -import javax.persistence.NoResultException; -import javax.persistence.NonUniqueResultException; - -import org.apache.commons.io.FileUtils; -import org.testng.annotations.AfterClass; -import org.testng.annotations.AfterMethod; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Test; - -import org.rhq.core.domain.auth.Subject; -import org.rhq.core.domain.drift.Drift; -import org.rhq.core.domain.drift.DriftDefinition; -import org.rhq.core.domain.drift.DriftDefinitionTemplate; -import org.rhq.core.domain.resource.Agent; -import org.rhq.core.domain.resource.Resource; -import org.rhq.core.domain.resource.ResourceType; -import org.rhq.core.domain.shared.ResourceBuilder; -import org.rhq.core.domain.shared.ResourceTypeBuilder; -import org.rhq.enterprise.server.plugin.ServerPluginsLocal; -import org.rhq.enterprise.server.test.AbstractEJB3Test; -import org.rhq.enterprise.server.test.TestServerCommunicationsService; -import org.rhq.enterprise.server.util.LookupUtil; -import org.rhq.test.TransactionCallback; - -@Test(groups = "drift") -public class DriftServerTest extends AbstractEJB3Test { - - protected final String RESOURCE_TYPE_NAME = getClass().getSimpleName() + "_RESOURCE_TYPE"; - - protected final String AGENT_NAME = getClass().getSimpleName() + "_AGENT"; - - protected final String RESOURCE_NAME = getClass().getSimpleName() + "_RESOURCE"; - - private ServerPluginsLocal serverPluginsMgr; - - protected DriftServerPluginService driftServerPluginService; - - protected TestServerCommunicationsService agentServiceContainer; - - protected ResourceType resourceType; - - protected Agent agent; - - protected Resource resource; - - @BeforeMethod - public void initServices(Method testMethod) throws Exception { - initDriftServer(); - initAgentServices(); - - InitDB annotation = testMethod.getAnnotation(InitDB.class); - if (annotation == null || annotation.value()) { - initDB(); - } - } - - private void initDriftServer() throws Exception { - driftServerPluginService = new DriftServerPluginService(); - prepareCustomServerPluginService(driftServerPluginService); - driftServerPluginService.masterConfig.getPluginDirectory().mkdirs(); - - File jpaDriftPlugin = new File("../plugins/drift-rhq/target/rhq-serverplugin-drift-4.1.0-SNAPSHOT.jar"); - assertTrue("Drift server plugin JAR file not found at" + jpaDriftPlugin.getPath(), jpaDriftPlugin.exists()); - FileUtils.copyFileToDirectory(jpaDriftPlugin, driftServerPluginService.masterConfig.getPluginDirectory()); - - driftServerPluginService.startMasterPluginContainer(); - - serverPluginsMgr = LookupUtil.getServerPlugins(); - } - - private void initAgentServices() { - agentServiceContainer = prepareForTestAgents(); - agentServiceContainer.driftService = new TestDefService(); - } - - @AfterMethod(inheritGroups = true) - public void shutDownServices() throws Exception { - shutDownDriftServer(); - shutDownAgentServices(); - } - - private void shutDownDriftServer() throws Exception { - unprepareServerPluginService(); - driftServerPluginService.stopMasterPluginContainer(); - } - - private void shutDownAgentServices() { - agentServiceContainer = null; - unprepareForTestAgents(); - } - - @AfterClass(inheritGroups = true) - public void cleanUpDB() throws Exception { - purgeDB(); - executeInTransaction(new TransactionCallback() { - @Override - public void execute() throws Exception { - purgeDB(getEntityManager()); - } - }); - } - - private void initDB() throws Exception { - purgeDB(); - executeInTransaction(new TransactionCallback() { - @Override - public void execute() throws Exception { - EntityManager em = getEntityManager(); - initResourceType(); - initAgent(); - initResource(); - - em.persist(resourceType); - em.persist(agent); - resource.setAgent(agent); - em.persist(resource); - - initDB(em); - } - }); - } - - private void purgeDB() { - executeInTransaction(new TransactionCallback() { - @Override - public void execute() throws Exception { - EntityManager em = getEntityManager(); - - em.createQuery("delete from JPADrift ").executeUpdate(); - em.createQuery("delete from JPADriftChangeSet").executeUpdate(); - em.createQuery("delete from JPADriftSet").executeUpdate(); - em.createQuery("delete from JPADriftFile").executeUpdate(); - em.createQuery("delete from DriftDefinition").executeUpdate(); - em.createQuery("delete from DriftDefinitionTemplate").executeUpdate(); - - deleteEntity(Resource.class, RESOURCE_NAME, em); - deleteEntity(Agent.class, AGENT_NAME, em); - deleteEntity(ResourceType.class, RESOURCE_TYPE_NAME, em); - - purgeDB(em); - } - }); - } - - protected void purgeDB(EntityManager em) { - } - - protected void initDB(EntityManager em) { - } - - protected void deleteEntity(Class<?> clazz, String name, EntityManager em) { - try { - Object entity = em.createQuery( - "select entity from " + clazz.getSimpleName() + " entity where entity.name = :name") - .setParameter("name", name) - .getSingleResult(); - em.remove(entity); - } catch (NoResultException e) { - // we can ignore no results because this code will run when the db - // is empty and we expect no results in that case - } catch (NonUniqueResultException e) { - // we will fail here to let the person running the test know that - // the database may not be in a consistent state - fail("Purging " + name + " failed. Expected to find one instance of " + clazz.getSimpleName() + - " but found more than one. The database may not be in a consistent state."); - } - } - - protected void initResourceType() { - resourceType = new ResourceTypeBuilder().createResourceType() - .withId(0) - .withName(RESOURCE_TYPE_NAME) - .withCategory(SERVER) - .withPlugin(RESOURCE_TYPE_NAME.toLowerCase()) - .build(); - } - - protected void initAgent() { - agent = new Agent(AGENT_NAME, "localhost", 1, "", AGENT_NAME + "_TOKEN"); - } - - protected void initResource() { - resource = new ResourceBuilder().createResource() - .withId(0) - .withName(RESOURCE_NAME) - .withResourceKey(RESOURCE_NAME) - .withRandomUuid() - .withResourceType(resourceType) - .build(); - } - - protected Subject getOverlord() { - return getSubjectManager().getOverlord(); - } - - protected String toString(DriftDefinition def) { - return "DriftDefinition[id: " + def.getId() + ", name: " + def.getName() + "]"; - } - - protected String toString(DriftDefinitionTemplate template) { - return DriftDefinitionTemplate.class.getSimpleName() + "[id: " + template.getId() + ", name: " + - template.getName() + "]"; - } - - protected Drift findDriftByPath(List<? extends Drift> drifts, String path) { - for (Drift drift : drifts) { - if (drift.getPath().equals(path)) { - return drift; - } - } - return null; - } -} diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/drift/DriftTemplateManagerBeanTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/drift/DriftTemplateManagerBeanTest.java deleted file mode 100644 index 125dfb3..0000000 --- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/drift/DriftTemplateManagerBeanTest.java +++ /dev/null @@ -1,600 +0,0 @@ -/* - * RHQ Management Platform - * Copyright (C) 2011 Red Hat, Inc. - * All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation version 2 of the License. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -package org.rhq.enterprise.server.drift; - -import static java.util.Arrays.asList; -import static org.rhq.core.domain.common.EntityContext.forResource; -import static org.rhq.core.domain.drift.DriftCategory.FILE_ADDED; -import static org.rhq.core.domain.drift.DriftChangeSetCategory.COVERAGE; -import static org.rhq.core.domain.drift.DriftChangeSetCategory.DRIFT; -import static org.rhq.core.domain.drift.DriftConfigurationDefinition.BaseDirValueContext.fileSystem; -import static org.rhq.core.domain.drift.DriftConfigurationDefinition.DriftHandlingMode.normal; -import static org.rhq.core.domain.drift.DriftConfigurationDefinition.DriftHandlingMode.plannedChanges; -import static org.rhq.core.domain.drift.DriftDefinitionComparator.CompareMode.BOTH_BASE_INFO_AND_DIRECTORY_SPECIFICATIONS; -import static org.rhq.enterprise.server.safeinvoker.HibernateDetachUtility.SerializationType.SERIALIZATION; -import static org.rhq.enterprise.server.util.LookupUtil.getDriftManager; -import static org.rhq.enterprise.server.util.LookupUtil.getDriftTemplateManager; -import static org.rhq.test.AssertUtils.assertCollectionMatchesNoOrder; -import static org.rhq.test.AssertUtils.assertPropertiesMatch; - -import java.util.ArrayList; -import java.util.LinkedList; -import java.util.List; - -import javax.ejb.EJBException; -import javax.persistence.EntityManager; - -import org.testng.annotations.BeforeClass; -import org.testng.annotations.Test; - -import org.rhq.core.domain.configuration.Configuration; -import org.rhq.core.domain.criteria.DriftDefinitionCriteria; -import org.rhq.core.domain.criteria.DriftDefinitionTemplateCriteria; -import org.rhq.core.domain.criteria.GenericDriftChangeSetCriteria; -import org.rhq.core.domain.criteria.JPADriftChangeSetCriteria; -import org.rhq.core.domain.drift.Drift; -import org.rhq.core.domain.drift.DriftChangeSet; -import org.rhq.core.domain.drift.DriftDefinition; -import org.rhq.core.domain.drift.DriftDefinitionComparator; -import org.rhq.core.domain.drift.DriftDefinitionTemplate; -import org.rhq.core.domain.drift.DriftSnapshot; -import org.rhq.core.domain.drift.Filter; -import org.rhq.core.domain.drift.JPADrift; -import org.rhq.core.domain.drift.JPADriftChangeSet; -import org.rhq.core.domain.drift.JPADriftFile; -import org.rhq.core.domain.drift.JPADriftSet; -import org.rhq.core.domain.resource.Resource; -import org.rhq.core.domain.resource.ResourceType; -import org.rhq.core.domain.util.PageList; -import org.rhq.enterprise.server.safeinvoker.HibernateDetachUtility; -import org.rhq.test.TransactionCallback; - -public class DriftTemplateManagerBeanTest extends DriftServerTest { - - private DriftTemplateManagerLocal templateMgr; - - private DriftManagerLocal driftMgr; - - private List<Resource> resources = new LinkedList<Resource>(); - - private JPADrift drift1; - private JPADrift drift2; - private JPADriftFile driftFile1; - private JPADriftFile driftFile2; - - @BeforeClass - public void initClass() { - templateMgr = getDriftTemplateManager(); - driftMgr = getDriftManager(); - - } - - @Override - protected void initDB(EntityManager em) { - agentServiceContainer.driftService = new TestDefService() { - @Override - public void unscheduleDriftDetection(int resourceId, DriftDefinition driftDef) { - detach(driftDef); - } - - @Override - public void updateDriftDetection(int resourceId, DriftDefinition driftDef) { - detach(driftDef); - } - - @Override - public void updateDriftDetection(int resourceId, DriftDefinition driftDef, DriftSnapshot driftSnapshot) { - detach(driftDef); - detach(driftSnapshot); - } - - private void detach(Object object) { - try { - HibernateDetachUtility.nullOutUninitializedFields(object, SERIALIZATION); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - }; - } - - public void createNewTemplate() { - final DriftDefinition definition = new DriftDefinition(new Configuration()); - definition.setName("test::createNewTemplate"); - definition.setEnabled(true); - definition.setDriftHandlingMode(normal); - definition.setInterval(2400L); - definition.setBasedir(new DriftDefinition.BaseDirectory(fileSystem, "/foo/bar/test")); - - final DriftDefinitionTemplate newTemplate = templateMgr.createTemplate(getOverlord(), resourceType.getId(), - true, definition); - - executeInTransaction(new TransactionCallback() { - @Override - public void execute() throws Exception { - EntityManager em = getEntityManager(); - - ResourceType updatedType = em.find(ResourceType.class, resourceType.getId()); - - assertEquals("Failed to add new drift definition to resource type", 1, updatedType - .getDriftDefinitionTemplates().size()); - - DriftDefinitionTemplate expectedTemplate = new DriftDefinitionTemplate(); - expectedTemplate.setTemplateDefinition(definition); - expectedTemplate.setUserDefined(true); - - assertDriftTemplateEquals("Failed to save template", expectedTemplate, newTemplate); - assertTrue("The template should have its id set", newTemplate.getId() > 0); - } - }); - } - - public void createTemplateForNegativeUpdateTests() { - DriftDefinition definition = new DriftDefinition(new Configuration()); - definition.setName("test::createTemplateForNegativeUpdateTests"); - definition.setEnabled(true); - definition.setDriftHandlingMode(normal); - definition.setInterval(2400L); - definition.setBasedir(new DriftDefinition.BaseDirectory(fileSystem, "/foo/bar/test")); - - templateMgr.createTemplate(getOverlord(), resourceType.getId(), true, definition); - - assertNotNull("Failed to load template", loadTemplate(definition.getName())); - } - - @Test(dependsOnMethods = "createTemplateForNegativeUpdateTests", - expectedExceptions = EJBException.class, - expectedExceptionsMessageRegExp = ".*base directory.*cannot be modified") - @InitDB(false) - public void doNotAllowBaseDirToBeUpdated() { - DriftDefinitionTemplate template = loadTemplate("test::createTemplateForNegativeUpdateTests"); - DriftDefinition definition = template.getTemplateDefinition(); - definition.setBasedir(new DriftDefinition.BaseDirectory(fileSystem, "/foo/bar/TEST")); - - templateMgr.updateTemplate(getOverlord(), template); - } - - @Test(dependsOnMethods = "createTemplateForNegativeUpdateTests", - expectedExceptions = EJBException.class, - expectedExceptionsMessageRegExp = ".*filters.*cannot be modified") - @InitDB(false) - public void doNotAllowFiltersToBeUpdated() { - DriftDefinitionTemplate template = loadTemplate("test::createTemplateForNegativeUpdateTests"); - DriftDefinition definition = template.getTemplateDefinition(); - definition.addExclude(new Filter("/foo/bar/TEST/conf", "*.xml")); - - templateMgr.updateTemplate(getOverlord(), template); - } - - @Test(dependsOnMethods = "createTemplateForNegativeUpdateTests", - expectedExceptions = EJBException.class, - expectedExceptionsMessageRegExp = ".*name.*cannot be modified") - @InitDB(false) - public void doNotAllowTemplateNameToBeUpdated() { - DriftDefinitionTemplate template = loadTemplate("test::createTemplateForNegativeUpdateTests"); - template.setName("A new name"); - - templateMgr.updateTemplate(getOverlord(), template); - } - - public void createAndUpdateTemplate() { - // create the template - DriftDefinition definition = new DriftDefinition(new Configuration()); - definition.setName("test::updateTemplate"); - definition.setDescription("update template test"); - definition.setEnabled(true); - definition.setDriftHandlingMode(normal); - definition.setInterval(2400L); - definition.setBasedir(new DriftDefinition.BaseDirectory(fileSystem, "/foo/bar/test")); - - DriftDefinitionTemplate template = templateMgr.createTemplate(getOverlord(), resourceType.getId(), true, - definition); - - // next create some definitions from the template - final DriftDefinition attachedDef1 = createDefinition(template, "attachedDef1", true); - final DriftDefinition attachedDef2 = createDefinition(template, "attachedDef2", true); - final DriftDefinition detachedDef1 = createDefinition(template, "detachedDef1", false); - final DriftDefinition detachedDef2 = createDefinition(template, "detachedDef2", false); - - driftMgr.updateDriftDefinition(getOverlord(), forResource(resource.getId()), attachedDef1); - driftMgr.updateDriftDefinition(getOverlord(), forResource(resource.getId()), attachedDef2); - driftMgr.updateDriftDefinition(getOverlord(), forResource(resource.getId()), detachedDef1); - driftMgr.updateDriftDefinition(getOverlord(), forResource(resource.getId()), detachedDef2); - - // update the template - final DriftDefinition newTemplateDef = template.getTemplateDefinition(); - newTemplateDef.setInterval(4800L); - newTemplateDef.setDriftHandlingMode(plannedChanges); - newTemplateDef.setEnabled(false); - - templateMgr.updateTemplate(getOverlord(), template); - - // verify that the tempalte has been updated - final DriftDefinitionTemplate updatedTemplate = loadTemplate(template.getName()); - assertPropertiesMatch("Failed to update template", template, updatedTemplate, "resourceType", - "driftDefinitions", "templateDefinition"); - - // verify that attached definitions are updated. - for (DriftDefinition def : asList(attachedDef1, attachedDef2)) { - DriftDefinition updatedDef = loadDefinition(def.getId()); - String msg = "Failed to propagate update to attached definition " + toString(updatedDef) + " - "; - DriftDefinition updatedTemplateDef = updatedTemplate.getTemplateDefinition(); - - assertEquals(msg + "enabled property not updated", updatedTemplateDef.isEnabled(), - updatedDef.isEnabled()); - assertEquals(msg + "driftHandlingMode property not updated", - updatedTemplateDef.getDriftHandlingMode(), updatedDef.getDriftHandlingMode()); - assertEquals(msg + "interval property not updated", updatedTemplateDef.getInterval(), - updatedDef.getInterval()); - } - - // verify that the detached definitions have not been updated. - for (DriftDefinition def : asList(detachedDef1, detachedDef2)) { - DriftDefinition defAfterUpdate = loadDefinition(def.getId()); - String msg = "Detached definition " + toString(def) + " should not get updated - "; - - assertEquals(msg + "enabled property was modified", def.isEnabled(), defAfterUpdate.isEnabled()); - assertEquals(msg + "driftHandlingMode property was modified", def.getDriftHandlingMode(), - defAfterUpdate.getDriftHandlingMode()); - assertEquals(msg + "interval property was modified", def.getInterval(), defAfterUpdate.getInterval()); - } - } - - - @SuppressWarnings("unchecked") - public void pinTemplate() throws Exception { - // First create the template - final DriftDefinition templateDef = new DriftDefinition(new Configuration()); - templateDef.setName("test::pinTemplate"); - templateDef.setEnabled(true); - templateDef.setDriftHandlingMode(normal); - templateDef.setInterval(2400L); - templateDef.setBasedir(new DriftDefinition.BaseDirectory(fileSystem, "/foo/bar/test")); - - final DriftDefinitionTemplate template = templateMgr.createTemplate(getOverlord(), - resourceType.getId(), true, templateDef); - - // next create some resource level definitions - final DriftDefinition attachedDef1 = createDefinition(template, "attachedDef1", true); - final DriftDefinition attachedDef2 = createDefinition(template, "attachedDef2", true); - final DriftDefinition detachedDef1 = createDefinition(template, "detachedDef1", false); - final DriftDefinition detachedDef2 = createDefinition(template, "detachedDef2", false); - - // create initial change set from which the snapshot will be generated - final JPADriftChangeSet changeSet0 = new JPADriftChangeSet(resource, 0, COVERAGE, attachedDef1); - - driftFile1 = new JPADriftFile("a1b2c3"); - drift1 = new JPADrift(changeSet0, "drift.1", FILE_ADDED, null, driftFile1); - - final JPADriftSet driftSet = new JPADriftSet(); - driftSet.addDrift(drift1); - - // create change set v1 - driftFile2 = new JPADriftFile("1a2b3c"); - final JPADriftChangeSet changeSet1 = new JPADriftChangeSet(resource, 1, DRIFT, attachedDef1); - drift2 = new JPADrift(changeSet1, "drift.2", FILE_ADDED, null, driftFile2); - - executeInTransaction(new TransactionCallback() { - @Override - public void execute() throws Exception { - EntityManager em = getEntityManager(); - - em.persist(attachedDef1); - - em.persist(driftFile1); - em.persist(driftFile2); - - em.persist(changeSet0); - em.persist(driftSet); - changeSet0.setInitialDriftSet(driftSet); - em.merge(changeSet0); - - em.persist(changeSet1); - em.persist(drift2); - - em.persist(attachedDef2); - em.persist(detachedDef1); - em.persist(detachedDef2); - } - }); - - // now we pin the snapshot to the template - templateMgr.pinTemplate(getOverlord(), template.getId(), attachedDef1.getId(), 1); - - // verify that the template is now pinned - DriftDefinitionTemplate updatedTemplate = loadTemplate(template.getName()); - assertTrue("Template should be marked pinned", updatedTemplate.isPinned()); - } - - @Test(dependsOnMethods = "pinTemplate") - @InitDB(false) - public void persistChangeSetWhenTemplateGetsPinned() throws Exception { - DriftDefinitionTemplate template = loadTemplate("test::pinTemplate"); - - GenericDriftChangeSetCriteria criteria = new GenericDriftChangeSetCriteria(); - criteria.addFilterId(template.getChangeSetId()); - - PageList<? extends DriftChangeSet<?>> changeSets = driftMgr.findDriftChangeSetsByCriteria(getOverlord(), - criteria); - - assertEquals("Expected to find change set for pinned template", 1, changeSets.size()); - - JPADriftChangeSet expectedChangeSet = new JPADriftChangeSet(resource, 1, COVERAGE, null); - List<? extends Drift> expectedDrifts = asList( - new JPADrift(expectedChangeSet, "drift.1", FILE_ADDED, null, driftFile1), - new JPADrift(expectedChangeSet, drift2.getPath(), FILE_ADDED, null, driftFile2)); - - DriftChangeSet<?> actualChangeSet = changeSets.get(0); - List<? extends Drift> actualDrifts = new ArrayList(actualChangeSet.getDrifts()); - - assertCollectionMatchesNoOrder("Expected to find drifts from change sets 1 and 2 in the template change set", - (List<Drift>)expectedDrifts, (List<Drift>)actualDrifts, "id", "ctime", "changeSet", "newDriftFile"); - - // we need to compare the newDriftFile properties separately because - // assertCollectionMatchesNoOrder compares properties via equals() and JPADriftFile - // does not implement equals. - assertPropertiesMatch(drift1.getNewDriftFile(), findDriftByPath(actualDrifts, "drift.1").getNewDriftFile(), - "The newDriftFile property was not set correctly for " + drift1); - assertPropertiesMatch(drift2.getNewDriftFile(), findDriftByPath(actualDrifts, "drift.2").getNewDriftFile(), - "The newDriftFile property was not set correctly for " + drift1); - } - - @Test(dependsOnMethods = "pinTemplate") - @InitDB(false) - public void updateAttachedDefinitionsWhenTemplateGetsPinned() throws Exception { - DriftDefinitionTemplate template = loadTemplate("test::pinTemplate"); - - // get the attached definitions - List<DriftDefinition> attachedDefs = new LinkedList<DriftDefinition>(); - for (DriftDefinition d : template.getDriftDefinitions()) { - if (d.isAttached() && (d.getName().equals("attachedDef1") || d.getName().equals("attachedDef2"))) { - attachedDefs.add(d); - } - } - assertEquals("Failed to get attached definitions for " + toString(template), 2, attachedDefs.size()); - assertDefinitionIsPinned(attachedDefs.get(0)); - assertDefinitionIsPinned(attachedDefs.get(1)); - } - - @Test(dependsOnMethods = "pinTemplate") - @InitDB(false) - public void doNotUpdateDetachedDefinitionsWhenTemplateGetsPinned() throws Exception { - DriftDefinitionTemplate template = loadTemplate("test::pinTemplate"); - - // get the detached definitions - List<DriftDefinition> detachedDefs = new LinkedList<DriftDefinition>(); - for (DriftDefinition d : template.getDriftDefinitions()) { - if (!d.isAttached() && (d.getName().equals("detachedDef1") || d.getName().equals("detachedDef2"))) { - detachedDefs.add(d); - } - } - assertEquals("Failed to get detached definitions for " + toString(template), 2, detachedDefs.size()); - assertDefinitionIsNotPinned(detachedDefs.get(0)); - assertDefinitionIsNotPinned(detachedDefs.get(1)); - } - - public void deleteTemplate() throws Exception { - // first create the template - final DriftDefinition templateDef = new DriftDefinition(new Configuration()); - templateDef.setName("test::pinTemplate"); - templateDef.setEnabled(true); - templateDef.setDriftHandlingMode(normal); - templateDef.setInterval(2400L); - templateDef.setBasedir(new DriftDefinition.BaseDirectory(fileSystem, "/foo/bar/test")); - - final DriftDefinitionTemplate template = templateMgr.createTemplate(getOverlord(), - resourceType.getId(), true, templateDef); - - // next create some resource level definitions - final DriftDefinition attachedDef1 = createDefinition(template, "attachedDef1", true); - final DriftDefinition attachedDef2 = createDefinition(template, "attachedDef2", true); - final DriftDefinition detachedDef1 = createDefinition(template, "detachedDef1", false); - final DriftDefinition detachedDef2 = createDefinition(template, "detachedDef2", false); - - // create some change sets - final JPADriftChangeSet changeSet0 = new JPADriftChangeSet(resource, 0, COVERAGE, attachedDef1); - - driftFile1 = new JPADriftFile("a1b2c3"); - drift1 = new JPADrift(changeSet0, "drift.1", FILE_ADDED, null, driftFile1); - - final JPADriftSet driftSet0 = new JPADriftSet(); - driftSet0.addDrift(drift1); - - final JPADriftChangeSet changeSet1 = new JPADriftChangeSet(resource, 0, DRIFT, detachedDef1); - - driftFile2 = new JPADriftFile("1a2b3c"); - drift2 = new JPADrift(changeSet1, "drift.2", FILE_ADDED, null, driftFile2); - - final JPADriftSet driftSet1 = new JPADriftSet(); - driftSet1.addDrift(drift2); - - executeInTransaction(new TransactionCallback() { - @Override - public void execute() throws Exception { - EntityManager em = getEntityManager(); - - em.persist(attachedDef1); - em.persist(attachedDef2); - em.persist(detachedDef1); - em.persist(detachedDef2); - - em.persist(driftFile1); - em.persist(driftFile2); - - em.persist(changeSet0); - em.persist(driftSet0); - changeSet0.setInitialDriftSet(driftSet0); - em.merge(changeSet0); - - em.persist(changeSet1); - em.persist(driftSet1); - changeSet1.setInitialDriftSet(driftSet1); - em.merge(changeSet1); - } - }); - - // delete the template - templateMgr.deleteTemplate(getOverlord(), template.getId()); - - // verify that attached definitions along with their change sets have - // been deleted - assertNull("Change sets belonging to attached definitions should be deleted", loadChangeSet(changeSet0.getId())); - assertNull("Attached definition " + toString(attachedDef1) + " should be deleted", - loadDefinition(attachedDef1.getId())); - assertNull("Attached definition " + toString(attachedDef2) + " should be deleted", - loadDefinition(attachedDef2.getId())); - - // verify that detached definitions along with their change sets have not been deleted - assertNotNull("Change sets belonging to detached definitions should not be deleted", - loadChangeSet(changeSet1.getId())); - assertDetachedDefinitionNotDeleted(detachedDef1.getId()); - assertDetachedDefinitionNotDeleted(detachedDef2.getId()); - - // verify that the template itself has been deleted - assertNull("The template " + toString(template) + " should have been deleted", - loadTemplate(template.getName(), false)); - } - - private void assertDefinitionIsPinned(DriftDefinition definition) throws Exception { - // verify that the definition is marked as pinned - assertTrue("Expected " + toString(definition) + " to be pinned", definition.isPinned()); - - // verify that the initial change set is generated for the definition - JPADriftChangeSetCriteria criteria = new JPADriftChangeSetCriteria(); - criteria.addFilterDriftDefinitionId(definition.getId()); - criteria.addFilterCategory(COVERAGE); - criteria.fetchDrifts(true); - - PageList<? extends DriftChangeSet<?>> changeSets = driftMgr.findDriftChangeSetsByCriteria(getOverlord(), - criteria); - assertEquals("Expected to find one change set", 1, changeSets.size()); - - JPADriftChangeSet expectedChangeSet = new JPADriftChangeSet(resource, 1, COVERAGE, null); - List<? extends Drift> expectedDrifts = asList( - new JPADrift(expectedChangeSet, drift1.getPath(), FILE_ADDED, null, driftFile1), - new JPADrift(expectedChangeSet, drift2.getPath(), FILE_ADDED, null, driftFile2)); - - DriftChangeSet<?> actualChangeSet = changeSets.get(0); - List<? extends Drift> actualDrifts = new ArrayList(actualChangeSet.getDrifts()); - - assertCollectionMatchesNoOrder("Expected to find drifts from change sets 1 and 2 in the template change set", - (List<Drift>)expectedDrifts, (List<Drift>)actualDrifts, "id", "ctime", "changeSet", "newDriftFile"); - - // Finally make sure that there are no other change sets - criteria = new JPADriftChangeSetCriteria(); - criteria.addFilterStartVersion(1); - criteria.addFilterDriftDefinitionId(definition.getId()); - - assertEquals("There should not be any drift change sets", 0, - driftMgr.findDriftChangeSetsByCriteria(getOverlord(), criteria).size()); - } - - private void assertDefinitionIsNotPinned(DriftDefinition definition) throws Exception { - // verify that the definition is not pinned - assertFalse("Expected " + toString(definition) + " to be unpinned", definition.isPinned()); - - // Note that this method assumes that the definition has no change sets - // associated with it and therefore checks that there are no change sets. - JPADriftChangeSetCriteria criteria = new JPADriftChangeSetCriteria(); - criteria.addFilterDriftDefinitionId(definition.getId()); - - PageList<? extends DriftChangeSet<?>> changeSets = driftMgr.findDriftChangeSetsByCriteria(getOverlord(), - criteria); - assertEquals("Did not expect to find any change sets for " + toString(definition) + ". Note that this " + - "assertion method assumes that the definition you are testing is not supposed to have any change sets.", - 0, changeSets.size()); - } - - private void assertDriftTemplateEquals(String msg, DriftDefinitionTemplate expected, DriftDefinitionTemplate actual) { - assertPropertiesMatch(msg + ": basic drift definition template properties do not match", expected, actual, - "id", "resourceType", "ctime", "templateDefinition"); - assertDriftDefEquals(msg + ": template definitions do not match", expected.getTemplateDefinition(), actual - .getTemplateDefinition()); - } - - private void assertDriftDefEquals(String msg, DriftDefinition expected, DriftDefinition actual) { - DriftDefinitionComparator comparator = new DriftDefinitionComparator( - BOTH_BASE_INFO_AND_DIRECTORY_SPECIFICATIONS); - assertEquals(msg, 0, comparator.compare(expected, actual)); - } - - private void assertDetachedDefinitionNotDeleted(int definitionId) { - DriftDefinition definition = loadDefinition(definitionId); - assertNotNull("Detached definition " + toString(definition) + " should not be deleted", definition); - assertNull("The detached definition's template reference should be set to null when the template is deleted", - definition.getTemplate()); - } - - private DriftDefinition createDefinition(DriftDefinitionTemplate template, String defName, boolean isAttached) { - DriftDefinition def = template.createDefinition(); - def.setName(defName); - def.setAttached(isAttached); - def.setTemplate(template); - def.setResource(resource); - return def; - } - - private DriftDefinitionTemplate loadTemplate(String name) { - return loadTemplate(name, true); - } - - private DriftDefinitionTemplate loadTemplate(String name, boolean verifyResultsUnique) { - DriftDefinitionTemplateCriteria criteria = new DriftDefinitionTemplateCriteria(); - criteria.addFilterResourceTypeId(resourceType.getId()); - criteria.addFilterName(name); - criteria.fetchDriftDefinitions(true); - - PageList<DriftDefinitionTemplate> templates = templateMgr.findTemplatesByCriteria(getOverlord(), criteria); - if (verifyResultsUnique) { - assertEquals("Expected to find one template", 1, templates.size()); - } - - if (templates.isEmpty()) { - return null; - } - return templates.get(0); - } - - private DriftDefinition loadDefinition(int definitionId) { - DriftDefinitionCriteria criteria = new DriftDefinitionCriteria(); - criteria.addFilterId(definitionId); - criteria.fetchConfiguration(true); - criteria.fetchTemplate(true); - PageList<DriftDefinition> definitions = driftMgr.findDriftDefinitionsByCriteria(getOverlord(), criteria); - - if (definitions.isEmpty()) { - return null; - } - return definitions.get(0); - } - - private DriftChangeSet<?> loadChangeSet(String id) throws Exception { - GenericDriftChangeSetCriteria criteria = new GenericDriftChangeSetCriteria(); - criteria.addFilterId(id); - PageList<? extends DriftChangeSet<?>> changeSets = driftMgr.findDriftChangeSetsByCriteria(getOverlord(), - criteria); - - if (changeSets.isEmpty()) { - return null; - } - return changeSets.get(0); - } - -} diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/drift/InitDB.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/drift/InitDB.java deleted file mode 100644 index 65a6523..0000000 --- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/drift/InitDB.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * RHQ Management Platform - * Copyright (C) 2011 Red Hat, Inc. - * All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation version 2 of the License. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -package org.rhq.enterprise.server.drift; - -import static java.lang.annotation.RetentionPolicy.RUNTIME; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -@Retention(RUNTIME) -@Target({ElementType.METHOD }) -public @interface InitDB { - boolean value() default true; -} diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/drift/JPADriftServerBeanTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/drift/JPADriftServerBeanTest.java deleted file mode 100644 index 2b3b33a..0000000 --- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/drift/JPADriftServerBeanTest.java +++ /dev/null @@ -1,306 +0,0 @@ -/* - * RHQ Management Platform - * Copyright (C) 2011 Red Hat, Inc. - * All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation version 2 of the License. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -package org.rhq.enterprise.server.drift; - -import static java.util.Arrays.asList; -import static org.apache.commons.io.IOUtils.toInputStream; -import static org.rhq.core.domain.drift.DriftCategory.FILE_ADDED; -import static org.rhq.core.domain.drift.DriftChangeSetCategory.COVERAGE; -import static org.rhq.core.domain.drift.DriftConfigurationDefinition.BaseDirValueContext.fileSystem; -import static org.rhq.core.domain.drift.DriftConfigurationDefinition.DriftHandlingMode.normal; -import static org.rhq.core.domain.drift.DriftFileStatus.LOADED; -import static org.rhq.enterprise.server.util.LookupUtil.getJPADriftServer; -import static org.rhq.test.AssertUtils.assertCollectionMatchesNoOrder; -import static org.rhq.test.AssertUtils.assertPropertiesMatch; - -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -import javax.persistence.EntityManager; - -import org.testng.annotations.BeforeClass; -import org.testng.annotations.BeforeMethod; - -import org.rhq.core.domain.configuration.Configuration; -import org.rhq.core.domain.criteria.JPADriftChangeSetCriteria; -import org.rhq.core.domain.drift.Drift; -import org.rhq.core.domain.drift.DriftDefinition; -import org.rhq.core.domain.drift.JPADrift; -import org.rhq.core.domain.drift.JPADriftChangeSet; -import org.rhq.core.domain.drift.JPADriftFile; -import org.rhq.core.domain.drift.JPADriftSet; -import org.rhq.core.domain.drift.dto.DriftChangeSetDTO; -import org.rhq.core.domain.drift.dto.DriftDTO; -import org.rhq.core.domain.drift.dto.DriftFileDTO; -import org.rhq.core.domain.util.PageList; -import org.rhq.test.TransactionCallback; - -public class JPADriftServerBeanTest extends DriftServerTest { - - private JPADriftServerLocal jpaDriftServer; - - private final String DRIFT_FILE_1_ID = "a1b2c3d4"; - - private final String DRIFT_FILE_2_ID = "1ab2b3c4d"; - - private JPADriftFile driftFile1; - - private JPADriftFile driftFile2; - - @BeforeClass - public void initTests() { - jpaDriftServer = getJPADriftServer(); - } - - @BeforeMethod - public void persistDriftFiles() throws Exception { - driftFile1 = jpaDriftServer.persistDriftFile(new JPADriftFile(DRIFT_FILE_1_ID)); - driftFile2 = jpaDriftServer.persistDriftFile(new JPADriftFile(DRIFT_FILE_2_ID)); - - String driftFile1Content = "drift file 1 content..."; - String driftFile2Content = "drift file 2 content..."; - - jpaDriftServer.persistDriftFileData(driftFile1, toInputStream(driftFile1Content), driftFile1Content.length()); - jpaDriftServer.persistDriftFileData(driftFile2, toInputStream(driftFile2Content), driftFile2Content.length()); - - driftFile1 = jpaDriftServer.getDriftFile(getOverlord(), DRIFT_FILE_1_ID); - driftFile2 = jpaDriftServer.getDriftFile(getOverlord(), DRIFT_FILE_2_ID); - - assertDriftFilePersisted(driftFile1, "driftFile1", driftFile1Content); - assertDriftFilePersisted(driftFile2, "driftFile2", driftFile2Content); - } - - public void persistResourceChangeSet() { - // first create and persist the drift definition - final DriftDefinition driftDef = new DriftDefinition(new Configuration()); - driftDef.setName("test::persistResourceChangeSet"); - driftDef.setEnabled(true); - driftDef.setDriftHandlingMode(normal); - driftDef.setInterval(2400L); - driftDef.setBasedir(new DriftDefinition.BaseDirectory(fileSystem, "/foo/bar/test")); - driftDef.setResource(resource); - - executeInTransaction(new TransactionCallback() { - @Override - public void execute() throws Exception { - EntityManager em = getEntityManager(); - em.persist(driftDef); - } - }); - - // create the change set to be persisted - DriftChangeSetDTO changeSet = new DriftChangeSetDTO(); - changeSet.setCategory(COVERAGE); - changeSet.setVersion(1); - changeSet.setDriftDefinitionId(driftDef.getId()); - changeSet.setResourceId(resource.getId()); - changeSet.setDriftHandlingMode(normal); - changeSet.setCtime(System.currentTimeMillis()); - - DriftDTO drift1 = new DriftDTO(); - drift1.setCategory(FILE_ADDED); - drift1.setPath("drift.1"); - drift1.setChangeSet(changeSet); - drift1.setCtime(System.currentTimeMillis()); - drift1.setNewDriftFile(toDTo(driftFile1)); - - DriftDTO drift2 = new DriftDTO(); - drift2.setCategory(FILE_ADDED); - drift2.setPath("drift.2"); - drift2.setChangeSet(changeSet); - drift2.setCtime(System.currentTimeMillis()); - drift2.setNewDriftFile(toDTo(driftFile2)); - - Set<DriftDTO> drifts = new HashSet<DriftDTO>(); - drifts.add(drift1); - drifts.add(drift2); - changeSet.setDrifts(drifts); - - String newChangeSetId = jpaDriftServer.persistChangeSet(getOverlord(), changeSet); - - // verify that the change set was persisted - JPADriftChangeSetCriteria criteria = new JPADriftChangeSetCriteria(); - criteria.addFilterId(newChangeSetId); - criteria.fetchDrifts(true); - - PageList<JPADriftChangeSet> changeSets = jpaDriftServer.findDriftChangeSetsByCriteria(getOverlord(), criteria); - assertEquals("Expected to find one change set", 1, changeSets.size()); - - JPADriftChangeSet jpaChangeSet = changeSets.get(0); - assertEquals("Expected change set to contain two drifts. This could be a result of the change set not being " + - "persisted correctly or the criteria fetch being done incorrectly.", 2, jpaChangeSet.getDrifts().size()); - - assertPropertiesMatch("The change set was not persisted correctly", changeSet, jpaChangeSet, "id", "drifts", - "class", "ctime"); - - List<? extends Drift> expectedDrifts = asList(drift1, drift2); - List<? extends Drift> actualDrifts = new ArrayList(jpaChangeSet.getDrifts()); - - // We ignore the id and ctime properties because those are set by JPADriftServerBean - // and are somewhat implmentation specific. We ignore the directory property because - // it is really a calculated property. newDriftFile has to be compared separately - // since it does not implement equals. - assertCollectionMatchesNoOrder("The change set drifts were not persisted correctly", - (List<Drift>) expectedDrifts, (List<Drift>) actualDrifts, "id", "ctime", "changeSet", "directory", - "newDriftFile", "class"); - - assertPropertiesMatch("The newDriftFile property was not set correctly for " + drift1, drift1.getNewDriftFile(), - findDriftByPath(actualDrifts, "drift.1").getNewDriftFile(), "class", "ctime") ; - assertPropertiesMatch("The newDriftFile property was not set correctly for " + drift2, drift2.getNewDriftFile(), - findDriftByPath(actualDrifts, "drift.2").getNewDriftFile(), "class", "ctime") ; - } - - public void persistTemplateChangeSet() { - // create the change set to be persisted - // - // Note that we do not set the drift definition id or resource id since - // the change set is not owned by a resource. It is owned by the - // resource type. - DriftChangeSetDTO changeSet = new DriftChangeSetDTO(); - changeSet.setCategory(COVERAGE); - changeSet.setVersion(1); - changeSet.setDriftHandlingMode(normal); - changeSet.setCtime(System.currentTimeMillis()); - - DriftDTO drift1 = new DriftDTO(); - drift1.setCategory(FILE_ADDED); - drift1.setPath("drift.1"); - drift1.setChangeSet(changeSet); - drift1.setCtime(System.currentTimeMillis()); - drift1.setNewDriftFile(toDTo(driftFile1)); - - DriftDTO drift2 = new DriftDTO(); - drift2.setCategory(FILE_ADDED); - drift2.setPath("drift.2"); - drift2.setChangeSet(changeSet); - drift2.setCtime(System.currentTimeMillis()); - drift2.setNewDriftFile(toDTo(driftFile2)); - - Set<DriftDTO> drifts = new HashSet<DriftDTO>(); - drifts.add(drift1); - drifts.add(drift2); - changeSet.setDrifts(drifts); - - String newChangeSetId = jpaDriftServer.persistChangeSet(getOverlord(), changeSet); - - // verify that the change set was persisted - JPADriftChangeSetCriteria criteria = new JPADriftChangeSetCriteria(); - criteria.addFilterId(newChangeSetId); - criteria.fetchDrifts(true); - - PageList<JPADriftChangeSet> changeSets = jpaDriftServer.findDriftChangeSetsByCriteria(getOverlord(), criteria); - assertEquals("Expected to find one change set", 1, changeSets.size()); - - JPADriftChangeSet jpaChangeSet = changeSets.get(0); - assertEquals("Expected change set to contain two drifts. This could be a result of the change set not being " + - "persisted correctly or the criteria fetch being done incorrectly.", 2, jpaChangeSet.getDrifts().size()); - - assertPropertiesMatch("The change set was not persisted correctly", changeSet, jpaChangeSet, "id", "drifts", - "class", "ctime"); - - List<? extends Drift> expectedDrifts = asList(drift1, drift2); - List<? extends Drift> actualDrifts = new ArrayList(jpaChangeSet.getDrifts()); - - // We ignore the id and ctime properties because those are set by JPADriftServerBean - // and are somewhat implmentation specific. We ignore the directory property because - // it is really a calculated property. newDriftFile has to be compared separately - // since it does not implement equals. - assertCollectionMatchesNoOrder("The change set drifts were not persisted correctly", - (List<Drift>) expectedDrifts, (List<Drift>) actualDrifts, "id", "ctime", "changeSet", "directory", - "newDriftFile", "class"); - - assertPropertiesMatch("The newDriftFile property was not set correctly for " + drift1, drift1.getNewDriftFile(), - findDriftByPath(actualDrifts, "drift.1").getNewDriftFile(), "class", "ctime") ; - assertPropertiesMatch("The newDriftFile property was not set correctly for " + drift2, drift2.getNewDriftFile(), - findDriftByPath(actualDrifts, "drift.2").getNewDriftFile(), "class", "ctime") ; - } - - public void copyChangeSet() { - // first create the change set that will be copied - final JPADriftChangeSet changeSet = new JPADriftChangeSet(null, 0, COVERAGE, null); - changeSet.setDriftHandlingMode(normal); - - final JPADrift drift1 = new JPADrift(changeSet, "drift.1", FILE_ADDED, null, driftFile1); - final JPADrift drift2 = new JPADrift(changeSet, "drift.2", FILE_ADDED, null, driftFile2); - - final JPADriftSet driftSet = new JPADriftSet(); - driftSet.addDrift(drift1); - driftSet.addDrift(drift2); - - // next create the drift definition - final DriftDefinition driftDef = new DriftDefinition(new Configuration()); - driftDef.setName("test::copyChangeSet"); - driftDef.setEnabled(true); - driftDef.setDriftHandlingMode(normal); - driftDef.setInterval(2400L); - driftDef.setBasedir(new DriftDefinition.BaseDirectory(fileSystem, "/foo/bar/test")); - driftDef.setResource(resource); - - // persist the change set and drift definition - executeInTransaction(new TransactionCallback() { - @Override - public void execute() throws Exception { - EntityManager em = getEntityManager(); - em.persist(changeSet); - em.persist(driftDef); - em.persist(driftSet); - changeSet.setInitialDriftSet(driftSet); - em.merge(changeSet); - } - }); - - jpaDriftServer.copyChangeSet(getOverlord(), changeSet.getId(), driftDef.getId(), resource.getId()); - - // verify that the change set was created for the definition - JPADriftChangeSetCriteria criteria = new JPADriftChangeSetCriteria(); - criteria.addFilterDriftDefinitionId(driftDef.getId()); - criteria.addFilterCategory(COVERAGE); - - PageList<JPADriftChangeSet> changeSets = jpaDriftServer.findDriftChangeSetsByCriteria(getOverlord(), criteria); - - assertEquals("Expected to get back one change set", 1,changeSets.size()); - - JPADriftChangeSet newChangeSet = changeSets.get(0); - Set<JPADrift> expectedDrifts = new HashSet<JPADrift>(asList(drift1, drift2)); - Set<JPADrift> actualDrifts = newChangeSet.getDrifts(); - - assertCollectionMatchesNoOrder("The change set drifts were not copied correctly", expectedDrifts, actualDrifts, - "changeSet", "newDriftFile"); - } - - private DriftFileDTO toDTo(JPADriftFile driftFile) { - DriftFileDTO dto = new DriftFileDTO(); - dto.setHashId(driftFile.getHashId()); - dto.setDataSize(driftFile.getDataSize()); - dto.setStatus(driftFile.getStatus()); - return dto; - } - - - private void assertDriftFilePersisted(JPADriftFile driftFile, String name, String content) { - assertNotNull("Failed to get " + name + " Was it persisted?", driftFile); - assertEquals("The content for " + name + " is wrong", content, jpaDriftServer.getDriftFileBits( - driftFile.getHashId())); - assertEquals("The drift file status is wrong", LOADED, driftFile.getStatus()); - } - -} diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/drift/ManageDriftDefinitionsTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/drift/ManageDriftDefinitionsTest.java deleted file mode 100644 index 1353293..0000000 --- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/drift/ManageDriftDefinitionsTest.java +++ /dev/null @@ -1,222 +0,0 @@ -/* - * RHQ Management Platform - * Copyright (C) 2011 Red Hat, Inc. - * All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation version 2 of the License. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -package org.rhq.enterprise.server.drift; - -import static java.util.Arrays.asList; -import static org.rhq.core.domain.drift.DriftCategory.FILE_ADDED; -import static org.rhq.core.domain.drift.DriftChangeSetCategory.COVERAGE; -import static org.rhq.core.domain.drift.DriftConfigurationDefinition.BaseDirValueContext.fileSystem; -import static org.rhq.core.domain.drift.DriftConfigurationDefinition.DriftHandlingMode.normal; -import static org.rhq.core.domain.drift.DriftDefinitionComparator.CompareMode.BOTH_BASE_INFO_AND_DIRECTORY_SPECIFICATIONS; -import static org.rhq.enterprise.server.util.LookupUtil.getDriftManager; -import static org.rhq.enterprise.server.util.LookupUtil.getDriftTemplateManager; -import static org.rhq.test.AssertUtils.assertCollectionMatchesNoOrder; - -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.atomic.AtomicBoolean; - -import javax.persistence.EntityManager; - -import org.testng.annotations.BeforeClass; - -import org.rhq.core.domain.common.EntityContext; -import org.rhq.core.domain.configuration.Configuration; -import org.rhq.core.domain.criteria.DriftDefinitionCriteria; -import org.rhq.core.domain.criteria.JPADriftChangeSetCriteria; -import org.rhq.core.domain.drift.Drift; -import org.rhq.core.domain.drift.DriftChangeSet; -import org.rhq.core.domain.drift.DriftConfigurationDefinition; -import org.rhq.core.domain.drift.DriftDefinition; -import org.rhq.core.domain.drift.DriftDefinitionComparator; -import org.rhq.core.domain.drift.DriftDefinitionTemplate; -import org.rhq.core.domain.drift.DriftSnapshot; -import org.rhq.core.domain.drift.JPADrift; -import org.rhq.core.domain.drift.JPADriftChangeSet; -import org.rhq.core.domain.drift.JPADriftFile; -import org.rhq.core.domain.drift.JPADriftSet; -import org.rhq.core.domain.util.PageList; -import org.rhq.enterprise.server.safeinvoker.HibernateDetachUtility; -import org.rhq.test.TransactionCallback; - -public class ManageDriftDefinitionsTest extends DriftServerTest { - - private DriftManagerLocal driftMgr; - - private DriftTemplateManagerLocal templateMgr; - - @BeforeClass - public void initClass() throws Exception { - driftMgr = getDriftManager(); - templateMgr = getDriftTemplateManager(); - } - - public void createDefinitionFromUnpinnedTemplate() { - // first create a template - final DriftDefinition templateDef = new DriftDefinition(new Configuration()); - templateDef.setName("test_createUnpinnedDefinition"); - templateDef.setEnabled(true); - templateDef.setDriftHandlingMode(normal); - templateDef.setInterval(2400L); - templateDef.setBasedir(new DriftDefinition.BaseDirectory(fileSystem, "/foo/bar/test")); - - // persist the template - DriftDefinitionTemplate template = templateMgr.createTemplate(getOverlord(), resourceType.getId(), false, - templateDef); - - // create and persist the definition - DriftDefinition definition = template.createDefinition(); - definition.setTemplate(template); - driftMgr.updateDriftDefinition(getOverlord(), EntityContext.forResource(resource.getId()), definition); - - // verify that the definition was created - DriftDefinition newDef = loadDefinition(definition.getName()); - DriftDefinitionComparator comparator = new DriftDefinitionComparator( - BOTH_BASE_INFO_AND_DIRECTORY_SPECIFICATIONS); - - assertEquals("The drift definition was not persisted correctly", 0, comparator.compare(definition, newDef)); - assertEquals("The template association was not set on the definition", template, newDef.getTemplate()); - } - - @SuppressWarnings("unchecked") - public void createDefinitionFromPinnedTemplate() throws Exception { - // We first need to create a pinned template. Users can only create a pinned - // template from a snapshot of an existing resource-level drift definition. - // We are going to take a bit of a short cut though by directly creating - // and persisting the pinned change set. - - // first create the change set - final JPADriftChangeSet changeSet0 = new JPADriftChangeSet(null, 0, COVERAGE, null); - changeSet0.setDriftHandlingMode(DriftConfigurationDefinition.DriftHandlingMode.normal); - - final JPADriftFile driftFile1 = new JPADriftFile("a1b2c3"); - final JPADriftFile driftFile2 = new JPADriftFile("1a2b3c"); - - JPADrift drift1 = new JPADrift(changeSet0, "drift.1", FILE_ADDED, null, driftFile1); - JPADrift drift2 = new JPADrift(changeSet0, "drift.2", FILE_ADDED, null, driftFile2); - - final JPADriftSet driftSet = new JPADriftSet(); - driftSet.addDrift(drift1); - driftSet.addDrift(drift2); - - // create the template - final DriftDefinition templateDef = new DriftDefinition(new Configuration()); - templateDef.setName("test_createUnpinnedDefinition"); - templateDef.setEnabled(true); - templateDef.setDriftHandlingMode(normal); - templateDef.setInterval(2400L); - templateDef.setBasedir(new DriftDefinition.BaseDirectory(fileSystem, "/foo/bar/test")); - templateDef.setPinned(true); - - final DriftDefinitionTemplate template = templateMgr.createTemplate(getOverlord(), resourceType.getId(), true, - templateDef); - - executeInTransaction(new TransactionCallback() { - @Override - public void execute() throws Exception { - EntityManager em = getEntityManager(); - - em.persist(driftFile1); - em.persist(driftFile2); - em.persist(changeSet0); - em.persist(driftSet); - changeSet0.setInitialDriftSet(driftSet); - em.merge(changeSet0); - - // setting the change set id on the template is the last and the - // most important step in making the template pinned - template.setChangeSetId(changeSet0.getId()); - em.merge(template); - } - }); - - // Create and persist a resource-level definition. - final DriftDefinition definition = template.createDefinition(); - definition.setTemplate(template); - - final AtomicBoolean agentInvoked = new AtomicBoolean(false); - - agentServiceContainer.driftService = new TestDefService() { - @Override - public void updateDriftDetection(int resourceId, DriftDefinition driftDef, DriftSnapshot snapshot) { - try { - HibernateDetachUtility.nullOutUninitializedFields(driftDef, - HibernateDetachUtility.SerializationType.SERIALIZATION); - HibernateDetachUtility.nullOutUninitializedFields(snapshot, - HibernateDetachUtility.SerializationType.SERIALIZATION); - agentInvoked.set(true); - assertNotNull("Expected snapshot drift instances collection to be non-null", - snapshot.getDriftInstances()); - assertEquals("Expected snapshot to contain two drift entries", 2, snapshot.getDriftInstances().size()); - } catch (Exception e) { - String msg = "Do not pass attached entites to agent since those entities are outside of " + - "Hibernate's control. The persistence context should be flushed and cleared to ensure that " + - "only detached objects are sent to the agent"; - throw new RuntimeException(msg, e); - } - } - }; - - driftMgr.updateDriftDefinition(getOverlord(), EntityContext.forResource(resource.getId()), definition); - - DriftDefinition newDef = loadDefinition(definition.getName()); - - // verify that the definition is marked as pinned - assertTrue("The drift definition should be marked as pinned", newDef.isPinned()); - - // verify that the initial change set is generated for the definition - JPADriftChangeSetCriteria criteria = new JPADriftChangeSetCriteria(); - criteria.addFilterDriftDefinitionId(definition.getId()); - criteria.addFilterCategory(COVERAGE); - criteria.fetchDrifts(true); - - PageList<? extends DriftChangeSet<?>> changeSets = driftMgr.findDriftChangeSetsByCriteria(getOverlord(), - criteria); - assertEquals("Expected to find one change set", 1, changeSets.size()); - - JPADriftChangeSet expectedChangeSet = new JPADriftChangeSet(resource, 1, COVERAGE, null); - List<? extends Drift> expectedDrifts = asList( - new JPADrift(expectedChangeSet, drift1.getPath(), FILE_ADDED, null, driftFile1), - new JPADrift(expectedChangeSet, drift2.getPath(), FILE_ADDED, null, driftFile2)); - - DriftChangeSet<?> actualChangeSet = changeSets.get(0); - List<? extends Drift> actualDrifts = new ArrayList(actualChangeSet.getDrifts()); - - assertCollectionMatchesNoOrder("Expected to find drifts from change sets 1 and 2 in the template change set", - (List<Drift>)expectedDrifts, (List<Drift>)actualDrifts, "id", "ctime", "changeSet", "newDriftFile"); - - // lastly verify that the agent is called - assertTrue("Failed to send drift definition along with snapshot to agent", agentInvoked.get()); - } - - private DriftDefinition loadDefinition(String name) { - DriftDefinitionCriteria criteria = new DriftDefinitionCriteria(); - criteria.addFilterResourceIds(resource.getId()); - criteria.addFilterName(name); - criteria.fetchConfiguration(true); - criteria.fetchResource(true); - criteria.fetchTemplate(true); - - PageList<DriftDefinition> driftDefs = driftMgr.findDriftDefinitionsByCriteria(getOverlord(), criteria); - assertEquals("Expected to find one drift definition", 1, driftDefs.size()); - - return driftDefs.get(0); - } -} diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/drift/ManageSnapshotsTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/drift/ManageSnapshotsTest.java deleted file mode 100644 index 190df2f..0000000 --- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/drift/ManageSnapshotsTest.java +++ /dev/null @@ -1,235 +0,0 @@ -/* - * RHQ Management Platform - * Copyright (C) 2011 Red Hat, Inc. - * All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation version 2 of the License. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -package org.rhq.enterprise.server.drift; - -import static java.util.Arrays.asList; -import static org.rhq.core.domain.drift.DriftCategory.FILE_ADDED; -import static org.rhq.core.domain.drift.DriftChangeSetCategory.COVERAGE; -import static org.rhq.core.domain.drift.DriftChangeSetCategory.DRIFT; -import static org.rhq.core.domain.drift.DriftConfigurationDefinition.BaseDirValueContext.fileSystem; -import static org.rhq.core.domain.drift.DriftConfigurationDefinition.DriftHandlingMode.normal; -import static org.rhq.enterprise.server.util.LookupUtil.getDriftManager; -import static org.rhq.enterprise.server.util.LookupUtil.getDriftTemplateManager; -import static org.rhq.test.AssertUtils.assertCollectionMatchesNoOrder; -import static org.rhq.test.AssertUtils.assertPropertiesMatch; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.ObjectOutputStream; -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.atomic.AtomicBoolean; - -import javax.persistence.EntityManager; - -import org.testng.annotations.BeforeClass; - -import org.rhq.core.domain.configuration.Configuration; -import org.rhq.core.domain.criteria.GenericDriftChangeSetCriteria; -import org.rhq.core.domain.drift.Drift; -import org.rhq.core.domain.drift.DriftChangeSet; -import org.rhq.core.domain.drift.DriftDefinition; -import org.rhq.core.domain.drift.DriftSnapshot; -import org.rhq.core.domain.drift.JPADrift; -import org.rhq.core.domain.drift.JPADriftChangeSet; -import org.rhq.core.domain.drift.JPADriftFile; -import org.rhq.core.domain.drift.JPADriftSet; -import org.rhq.core.domain.util.PageList; -import org.rhq.core.server.EntitySerializer; -import org.rhq.test.TransactionCallback; - -public class ManageSnapshotsTest extends DriftServerTest { - - private DriftManagerLocal driftMgr; - - private DriftTemplateManagerLocal templateMgr; - - @BeforeClass(inheritGroups = true) - public void initClass() throws Exception { - driftMgr = getDriftManager(); - templateMgr = getDriftTemplateManager(); - } - - public void pinningSnapshotShouldSetDriftDefAsPinned() { - final DriftDefinition driftDef = createAndPersistDriftDef("test::setPinnedFlag"); - - // create initial change set - final JPADriftChangeSet changeSet = new JPADriftChangeSet(resource, 0, COVERAGE, driftDef); - - final JPADriftFile driftFile1 = new JPADriftFile("a1b2c3"); - JPADrift drift = new JPADrift(changeSet, "drift.1", FILE_ADDED, null, driftFile1); - - final JPADriftSet driftSet = new JPADriftSet(); - driftSet.addDrift(drift); - - executeInTransaction(new TransactionCallback() { - @Override - public void execute() throws Exception { - EntityManager em = getEntityManager(); - em.persist(driftFile1); - em.persist(changeSet); - em.persist(driftSet); - changeSet.setInitialDriftSet(driftSet); - em.merge(changeSet); - } - }); - - driftMgr.pinSnapshot(getOverlord(), driftDef.getId(), 0); - DriftDefinition updatedDriftDef = driftMgr.getDriftDefinition(getOverlord(), driftDef.getId()); - - assertNotNull("Failed to get " + toString(driftDef), updatedDriftDef); - assertTrue("Failed to set pinned flag of " + toString(driftDef), updatedDriftDef.isPinned()); - } - - @SuppressWarnings("unchecked") - public void pinningSnapshotShouldMakeSnapshotTheInitialChangeSet() throws Exception { - final DriftDefinition driftDef = createAndPersistDriftDef("test::makeSnapshotVersionZero"); - - // create initial change set - final JPADriftChangeSet changeSet0 = new JPADriftChangeSet(resource, 0, COVERAGE, driftDef); - - final JPADriftFile driftFile1 = new JPADriftFile("a1b2c3"); - JPADrift drift1 = new JPADrift(changeSet0, "drift.1", FILE_ADDED, null, driftFile1); - - final JPADriftSet driftSet = new JPADriftSet(); - driftSet.addDrift(drift1); - - // create change set v1 - final JPADriftFile driftFile2 = new JPADriftFile("1a2b3c"); - final JPADriftChangeSet changeSet1 = new JPADriftChangeSet(resource, 1, DRIFT, driftDef); - final JPADrift drift2 = new JPADrift(changeSet1, "drift.2", FILE_ADDED, null, driftFile2); - - executeInTransaction(new TransactionCallback() { - @Override - public void execute() throws Exception { - EntityManager em = getEntityManager(); - em.persist(driftFile1); - em.persist(driftFile2); - em.persist(changeSet0); - em.persist(driftSet); - changeSet0.setInitialDriftSet(driftSet); - em.merge(changeSet0); - em.persist(changeSet1); - em.persist(drift2); - } - }); - - driftMgr.pinSnapshot(getOverlord(), driftDef.getId(), 1); - - // Verify that there is now only one change set for the drift def - GenericDriftChangeSetCriteria criteria = new GenericDriftChangeSetCriteria(); - criteria.addFilterDriftDefinitionId(driftDef.getId()); - - PageList<? extends DriftChangeSet<?>> changeSets = driftMgr.findDriftChangeSetsByCriteria(getOverlord(), - criteria); - assertEquals("All change sets except the change set representing the pinned snapshot should be removed", - 1, changeSets.size()); - DriftChangeSet<?> changeSet = changeSets.get(0); - - assertEquals("The pinned snapshot version should be reset to zero", 0, changeSet.getVersion()); - assertEquals("The change set category is wrong", COVERAGE, changeSet.getCategory()); - - JPADriftChangeSet expectedChangeSet = new JPADriftChangeSet(resource, 1, COVERAGE, driftDef); - List<? extends Drift> expectedDrifts = asList( - new JPADrift(expectedChangeSet, drift1.getPath(), FILE_ADDED, null, driftFile1), - new JPADrift(expectedChangeSet, drift2.getPath(), FILE_ADDED, null, driftFile2)); - - List<? extends Drift> actualDrifts = new ArrayList(changeSet.getDrifts()); - - assertCollectionMatchesNoOrder("Expected to find drifts from change sets 1 and 2 in the new initial change set", - (List<Drift>)expectedDrifts, (List<Drift>)actualDrifts, "id", "ctime", "changeSet", "newDriftFile"); - - // we need to compare the newDriftFile properties separately because - // assertCollectionMatchesNoOrder compares properties via equals() and JPADriftFile - // does not implement equals. - assertPropertiesMatch(drift1.getNewDriftFile(), findDriftByPath(actualDrifts, "drift.1").getNewDriftFile(), - "The newDriftFile property was not set correctly for " + drift1); - assertPropertiesMatch(drift2.getNewDriftFile(), findDriftByPath(actualDrifts, "drift.2").getNewDriftFile(), - "The newDriftFile property was not set correctly for " + drift1); - } - - public void pinningSnapshotShouldSendRequestToAgent() { - final DriftDefinition driftDef = createAndPersistDriftDef("test::setPinnedFlag"); - - // create initial change set - final JPADriftChangeSet changeSet = new JPADriftChangeSet(resource, 0, COVERAGE, driftDef); - - final JPADriftFile driftFile1 = new JPADriftFile("a1b2c3"); - JPADrift drift = new JPADrift(changeSet, "drift.1", FILE_ADDED, null, driftFile1); - - final JPADriftSet driftSet = new JPADriftSet(); - driftSet.addDrift(drift); - - executeInTransaction(new TransactionCallback() { - @Override - public void execute() throws Exception { - EntityManager em = getEntityManager(); - em.persist(driftFile1); - em.persist(changeSet); - em.persist(driftSet); - changeSet.setInitialDriftSet(driftSet); - em.merge(changeSet); - } - }); - - final AtomicBoolean agentInvoked = new AtomicBoolean(false); - agentServiceContainer.driftService = new TestDefService() { - @Override - public void pinSnapshot(int resourceId, String configName, DriftSnapshot snapshot) { - try { - agentInvoked.set(true); - // serialize the method arguments here to more closely simulate what - // happens during the call. We cannot send hibernate-proxied objects - // to the agent. This is an attempt to catch that. - ObjectOutputStream stream = new ObjectOutputStream(new ByteArrayOutputStream()); - EntitySerializer.writeExternalRemote(resourceId, stream); - EntitySerializer.writeExternalRemote(configName, stream); - EntitySerializer.writeExternalRemote(snapshot, stream); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - }; - - driftMgr.pinSnapshot(getOverlord(), driftDef.getId(), 0); - - assertTrue("Failed to send request to agent to pin snapshot", agentInvoked.get()); - } - - private DriftDefinition createAndPersistDriftDef(String name) { - final DriftDefinition driftDef = new DriftDefinition(new Configuration()); - driftDef.setName(name); - driftDef.setEnabled(true); - driftDef.setDriftHandlingMode(normal); - driftDef.setInterval(1800L); - driftDef.setBasedir(new DriftDefinition.BaseDirectory(fileSystem, "/foo/bar/test")); - - executeInTransaction(new TransactionCallback() { - @Override - public void execute() throws Exception { - driftDef.setResource(resource); - getEntityManager().persist(driftDef); - } - }); - - return driftDef; - } - -} diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3Test.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3Test.java index d84fa88..45bda40 100644 --- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3Test.java +++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/test/AbstractEJB3Test.java @@ -18,6 +18,10 @@ */ package org.rhq.enterprise.server.test;
+import static org.rhq.test.JPAUtils.clearDB; +import static org.rhq.test.JPAUtils.lookupEntityManager; +import static org.rhq.test.JPAUtils.lookupTransactionManager; + import java.sql.Connection; import java.sql.SQLException; import java.util.Hashtable; @@ -59,10 +63,6 @@ import org.rhq.enterprise.server.util.LookupUtil; import org.rhq.test.JPAUtils; import org.rhq.test.TransactionCallback;
-import static org.rhq.test.JPAUtils.clearDB; -import static org.rhq.test.JPAUtils.lookupEntityManager; -import static org.rhq.test.JPAUtils.lookupTransactionManager; - /** * This is the abstract test base for server jar tests. * @@ -91,6 +91,13 @@ public abstract class AbstractEJB3Test extends AssertJUnit { //@BeforeSuite(groups = {"integration.ejb3","PERF"}) // TODO investigate again @BeforeSuite(alwaysRun = true) public static void startupEmbeddedJboss() throws Exception { + // The embeddedDeployment property needs to be set for running tests + // with the embedded container. It is set in the surefire configuration + // in pom.xml but setting here makes it easier to run tests directly + // from your IDE. + // + // jsanda + System.setProperty("embeddedDeployment", "true");
// Setting content location to the tmp dir System.setProperty(ContentSourceManagerBean.FILESYSTEM_PROPERTY, System.getProperty("java.io.tmpdir")); diff --git a/modules/enterprise/server/pom.xml b/modules/enterprise/server/pom.xml index d71e1b5..08b43b1 100644 --- a/modules/enterprise/server/pom.xml +++ b/modules/enterprise/server/pom.xml @@ -40,6 +40,7 @@ <module>ear</module> <module>safe-invoker</module> <module>client-api</module> + <module>integration-tests</module> </modules> </profile>
@@ -57,6 +58,23 @@ </modules> </profile>
+ <profile> + <id>integration-tests</id> + <activation> + <property> + <name>rhq.itests</name> + </property> + </activation> + <modules> + <module>xml-schemas</module> + <module>jar</module> + <module>sars</module> + <module>plugins</module> + <module>client-api</module> + <module>integration-tests</module> + </modules> + </profile> + </profiles>
</project>