org.rhq.enterprise.server.drift.DriftServerTest.java Source code

Java tutorial

Introduction

Here is the source code for org.rhq.enterprise.server.drift.DriftServerTest.java

Source

/*
 * 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.ResourceTreeHelper;
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();

        String projectVersion = System.getProperty("projectVersion");

        File jpaDriftPlugin = new File(
                "../plugins/drift-rhq/target/rhq-serverplugin-drift-" + projectVersion + ".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();
        //already done by the above call
        //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();
            if (clazz.equals(Resource.class)) {
                ResourceTreeHelper.deleteResource(em, (Resource) entity);
            } else {
                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;
    }
}