/* * 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.core.pc.configuration; import org.testng.annotations.Test; import org.testng.annotations.BeforeMethod; import static org.testng.Assert.assertNull; import org.rhq.core.pluginapi.configuration.ConfigurationFacet; import org.rhq.core.pluginapi.configuration.ConfigurationUpdateReport; import org.rhq.core.domain.configuration.Configuration; import org.rhq.core.domain.configuration.PropertySimple; import org.rhq.core.domain.configuration.ConfigurationUpdateStatus; import static org.rhq.core.domain.configuration.ConfigurationUpdateStatus.*; import org.rhq.core.pc.util.FacetLockType; import org.rhq.test.jmock.PropertyMatcher; import org.jmock.Expectations; import org.jmock.api.Action; import org.jmock.api.Invocation; import org.hamcrest.Matcher; import org.hamcrest.Description; public class LegacyConfigManagementTest extends ConfigManagementTest { ConfigurationFacet facet; LegacyConfigManagement configMgmt; @BeforeMethod public void setup() { facet = context.mock(ConfigurationFacet.class); configMgmt = new LegacyConfigManagement(); configMgmt.setComponentService(componentService); configMgmt.setConfigurationUtilityService(configUtilityService); } @Test public void structuredConfigShouldGetLoaded() throws Exception { final Configuration config = new Configuration(); config.put(new PropertySimple("x", "1")); config.put(new PropertySimple("y", "2")); addDefaultExpectationsForLoad(config); Configuration loadedConfig = configMgmt.executeLoad(resourceId); assertStructuredLoaded(config, loadedConfig); } @Test public void theConfigNotesShouldGetSet() throws Exception { final Configuration config = new Configuration(); config.setNotes(null); addDefaultExpectationsForLoad(config); Configuration loadedConfig = configMgmt.executeLoad(resourceId); assertNotesSetToDefault(loadedConfig); } @Test public void nullShouldBeReturnedWhenStructuredIsNull() throws Exception { final Configuration config = null; context.checking(new Expectations() {{ atLeast(1).of(componentService).getComponent(resourceId, ConfigurationFacet.class, FacetLockType.READ, ConfigManagement.FACET_METHOD_TIMEOUT, daemonThread, onlyIfStarted); will(returnValue(facet)); allowing(componentService).getResourceType(resourceId); will(returnValue(resourceType)); atLeast(1).of(facet).loadResourceConfiguration(); will(returnValue(null)); }}); Configuration loadedConfig = configMgmt.executeLoad(resourceId); assertNull(loadedConfig, "Expected null to be returned when facet returns null for structured."); } private void addDefaultExpectationsForLoad(final Configuration config) throws Exception { context.checking(new Expectations() {{ atLeast(1).of(componentService).getComponent(resourceId, ConfigurationFacet.class, FacetLockType.READ, ConfigManagement.FACET_METHOD_TIMEOUT, daemonThread, onlyIfStarted); will(returnValue(facet)); allowing(componentService).getResourceType(resourceId); will(returnValue(resourceType)); atLeast(1).of(facet).loadResourceConfiguration(); will(returnValue(config)); atLeast(1).of(configUtilityService).normalizeConfiguration(config, getResourceConfigDefinition()); atLeast(1).of(configUtilityService).validateConfiguration(config, getResourceConfigDefinition()); }}); } @Test public void facetShouldBeCalledToUpdateStructured() throws Exception { final Configuration config = new Configuration(); final ConfigurationUpdateReport updateReport = new ConfigurationUpdateReport(config); final boolean isDaemonThread = false; context.checking(new Expectations() {{ atLeast(1).of(componentService).getComponent(resourceId, ConfigurationFacet.class, FacetLockType.WRITE, ConfigManagement.FACET_METHOD_TIMEOUT, isDaemonThread, onlyIfStarted); will(returnValue(facet)); oneOf(facet).updateResourceConfiguration(with(matchingUpdateReport(updateReport))); will(updateReportTo(SUCCESS)); }}); configMgmt.executeUpdate(resourceId, config); } @Test(expectedExceptions = UpdateInProgressException.class) public void exceptionShouldBeThrownWhenUpdateDoesNotComplete() throws Exception { final Configuration config = new Configuration(); final ConfigurationUpdateReport updateReport = new ConfigurationUpdateReport(config); final boolean isDaemonThread = false; context.checking(new Expectations() {{ atLeast(1).of(componentService).getComponent(resourceId, ConfigurationFacet.class, FacetLockType.WRITE, ConfigManagement.FACET_METHOD_TIMEOUT, isDaemonThread, onlyIfStarted); will(returnValue(facet)); oneOf(facet).updateResourceConfiguration(with(matchingUpdateReport(updateReport))); will(updateReportTo(INPROGRESS)); }}); configMgmt.executeUpdate(resourceId, config); } @Test(expectedExceptions = ConfigurationUpdateException.class) public void exceptionShouldBeThrownWhenUpdateFails() throws Exception { final Configuration config = new Configuration(); final ConfigurationUpdateReport updateReport = new ConfigurationUpdateReport(config); final boolean isDaemonThread = false; context.checking(new Expectations() {{ atLeast(1).of(componentService).getComponent(resourceId, ConfigurationFacet.class, FacetLockType.WRITE, ConfigManagement.FACET_METHOD_TIMEOUT, isDaemonThread, onlyIfStarted); will(returnValue(facet)); oneOf(facet).updateResourceConfiguration(with(matchingUpdateReport(updateReport))); will(updateReportTo(FAILURE)); }}); configMgmt.executeUpdate(resourceId, config); } public static Matcher<ConfigurationUpdateReport> matchingUpdateReport(ConfigurationUpdateReport expected) { return new PropertyMatcher<ConfigurationUpdateReport>(expected); } public static Action updateReportTo(final ConfigurationUpdateStatus status) { return new Action() { public void describeTo(Description description) { description.appendText("Updates " + ConfigurationUpdateReport.class.getSimpleName() + " to " + status); } public Object invoke(Invocation invocation) throws Throwable { ConfigurationUpdateReport report = (ConfigurationUpdateReport) invocation.getParameter(0); report.setStatus(status); return null; } }; } }