/* * RHQ Management Platform * Copyright (C) 2005-2008 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.resource.metadata.test; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.Map; import java.util.Random; import java.util.Set; import javax.transaction.Status; import org.testng.annotations.Test; import org.rhq.core.domain.event.Event; import org.rhq.core.domain.event.EventDefinition; import org.rhq.core.domain.event.EventSeverity; import org.rhq.core.domain.event.EventSource; import org.rhq.core.domain.resource.Resource; import org.rhq.core.domain.resource.ResourceType; import org.rhq.enterprise.server.event.EventManagerLocal; import org.rhq.enterprise.server.util.LookupUtil; /** * Note, plugins are registered in new transactions. for tests, this means * you can't do everything in a trans and roll back at the end. You must clean up manually. */ public class UpdateEventsSubsystemTest extends UpdatePluginMetadataTestBase { static final boolean ENABLED = true; @Override protected String getSubsystemDirectory() { return "events"; } @Test(enabled = ENABLED) public void testCreateDeleteEvent() throws Exception { System.out.println("= testCreateDeleteEvent"); try { registerPlugin("event1-1.xml"); ResourceType platform = getResourceType("events"); assert platform != null; getTransactionManager().begin(); platform = em.find(ResourceType.class, platform.getId()); Set<EventDefinition> eDefs = platform.getEventDefinitions(); assert eDefs != null; assert eDefs.size() == 1; EventDefinition hugo = eDefs.iterator().next(); assert hugo.getDescription().equals("One"); assert hugo.getDisplayName().equals("HugoOne"); getTransactionManager().rollback(); System.out.println("==> Done with v1"); registerPlugin("event1-2.xml"); platform = getResourceType("events"); getTransactionManager().begin(); em = getEntityManager(); platform = em.find(ResourceType.class, platform.getId()); eDefs = platform.getEventDefinitions(); assert eDefs != null; assert eDefs.size() == 2 : "Did not find 2 EventDefinitions, but " + eDefs.size(); Iterator<EventDefinition> eIter = eDefs.iterator(); while (eIter.hasNext()) { EventDefinition def = eIter.next(); if (def.getName().equals("hugo")) { assert def.getDescription().equals("Two") : "Expected 'Two', but got : " + def.getDescription(); assert def.getDisplayName().equals("HugoTwo"); } } getTransactionManager().rollback(); System.out.println("==> Done with v2"); registerPlugin("event1-1.xml", "3.0"); platform = getResourceType("events"); getTransactionManager().begin(); em = getEntityManager(); platform = em.find(ResourceType.class, platform.getId()); eDefs = platform.getEventDefinitions(); assert eDefs != null; assert eDefs.size() == 1 : "Did not find 1 EventDefinition, but " + eDefs.size(); hugo = eDefs.iterator().next(); assert hugo.getDescription().equals("One"); assert hugo.getDisplayName().equals("HugoOne"); System.out.println("==> Done with v1"); } finally { if (Status.STATUS_NO_TRANSACTION != getTransactionManager().getStatus()) { getTransactionManager().rollback(); } } } /** * Simulate just redeploying the plugin with no change in descriptor. * @throws Exception */ @Test(enabled = ENABLED) public void testNoOpChange() throws Exception { System.out.println("= testNoOpChange"); try { registerPlugin("event1-1.xml"); ResourceType platform = getResourceType("events"); assert platform != null; getTransactionManager().begin(); platform = em.find(ResourceType.class, platform.getId()); Set<EventDefinition> eDefs = platform.getEventDefinitions(); assert eDefs != null; assert eDefs.size() == 1; EventDefinition hugo = eDefs.iterator().next(); assert hugo.getDescription().equals("One"); assert hugo.getDisplayName().equals("HugoOne"); getTransactionManager().rollback(); System.out.println("==> Done with v1"); registerPlugin("event1-1.xml", "2.0"); platform = getResourceType("events"); assert platform != null; getTransactionManager().begin(); em = getEntityManager(); platform = em.find(ResourceType.class, platform.getId()); eDefs = platform.getEventDefinitions(); assert eDefs != null; assert eDefs.size() == 1; hugo = eDefs.iterator().next(); assert hugo.getDescription().equals("One"); assert hugo.getDisplayName().equals("HugoOne"); System.out.println("==> Done with v2"); } finally { if (Status.STATUS_NO_TRANSACTION != getTransactionManager().getStatus()) { getTransactionManager().rollback(); } } } @Test(enabled = ENABLED) public void testDeleteEventStuff() throws Exception { System.out.println("= testDeleteEvent"); EventManagerLocal eventManager = LookupUtil.getEventManager(); ResourceType platform = null; Resource testResource = null; // prepare basic stuff try { registerPlugin("event1-2.xml"); getTransactionManager().begin(); platform = getResourceType("events"); testResource = new Resource("-test-", "-test resource", platform); testResource.setUuid("" + new Random().nextInt()); em.persist(testResource); setUpAgent(testResource); getTransactionManager().commit(); getTransactionManager().begin(); platform = em.find(ResourceType.class, platform.getId()); testResource = em.find(Resource.class, testResource.getId()); Set<EventDefinition> eDefs = platform.getEventDefinitions(); assert eDefs.size() == 2 : "Did not find the expected 2 eventDefinitions, but " + eDefs.size(); Iterator<EventDefinition> eIter = eDefs.iterator(); boolean found = false; Map<EventSource, Set<Event>> events = new HashMap<EventSource, Set<Event>>(1); while (eIter.hasNext()) { EventDefinition def = eIter.next(); if (def.getName().equals("hans")) { found = true; // We got the definition that will vanish later, so attach some stuff to it EventSource source = new EventSource("test location", def, testResource); em.persist(source); Event ev = new Event(def.getName(), source.getLocation(), System.currentTimeMillis(), EventSeverity.INFO, "This is a test"); Set<Event> evSet = new HashSet<Event>(1); evSet.add(ev); events.put(source, evSet); } } assert found : "Hans was not found"; getTransactionManager().commit(); eventManager.addEventData(events); /* * --- done with the setup --- * Now check that the event source + events are gone. */ registerPlugin("event1-1.xml", "3.0"); platform = getResourceType("events"); getTransactionManager().begin(); platform = em.find(ResourceType.class, platform.getId()); eDefs = platform.getEventDefinitions(); assert eDefs != null; assert eDefs.size() == 1 : "Did not find 1 EventDefinition, but " + eDefs.size(); EventDefinition hugo = eDefs.iterator().next(); assert hugo.getDescription().equals("One"); assert hugo.getDisplayName().equals("HugoOne"); } finally { if (Status.STATUS_NO_TRANSACTION != getTransactionManager().getStatus()) { getTransactionManager().rollback(); } } } }