/*
* 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, version 2, as
* published by the Free Software Foundation, and/or the GNU Lesser
* General Public License, version 2.1, also as published by the Free
* Software Foundation.
*
* 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 and the GNU Lesser General Public License
* for more details.
*
* You should have received a copy of the GNU General Public License
* and the GNU Lesser General Public License along with this program;
* if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package org.rhq.core.pc.configuration;
import org.hamcrest.Description;
import org.hamcrest.Matcher;
import org.jmock.Expectations;
import org.jmock.api.Action;
import org.jmock.api.Invocation;
import org.rhq.core.clientapi.agent.configuration.ConfigurationUpdateRequest;
import org.rhq.core.clientapi.server.configuration.ConfigurationServerService;
import org.rhq.core.clientapi.server.configuration.ConfigurationUpdateResponse;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.ConfigurationUpdateStatus;
import org.rhq.core.pluginapi.configuration.ConfigurationUpdateReport;
import org.rhq.test.jmock.PropertyMatcher;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import static org.rhq.core.domain.configuration.ConfigurationUpdateStatus.FAILURE;
import static org.rhq.core.domain.configuration.ConfigurationUpdateStatus.SUCCESS;
public class UpdateResourceConfigurationRunnerTest extends ConfigManagementTest {
ConfigManagement configMgmt;
ConfigurationServerService configServerService;
@BeforeMethod
public void setup() throws Exception {
configMgmt = context.mock(ConfigManagement.class);
configServerService = context.mock(ConfigurationServerService.class);
}
@Test
public void successfulUpdateShouldSendSuccessResponseToServer() throws Exception {
final Configuration config = createStructuredConfig();
int configUpdateId = -1;
ConfigurationUpdateRequest updateRequest = new ConfigurationUpdateRequest(configUpdateId, config, resourceId);
UpdateResourceConfigurationRunner updateRunner = new UpdateResourceConfigurationRunner(configServerService,
resourceType, configMgmt, updateRequest);
updateRunner.setConfigUtilService(configUtilityService);
final ConfigurationUpdateResponse successResponse = new ConfigurationUpdateResponse(configUpdateId, null,
SUCCESS, null);
context.checking(new Expectations() {{
oneOf(configMgmt).executeUpdate(resourceId, config);
oneOf(configUtilityService).normalizeConfiguration(config, resourceType.getResourceConfigurationDefinition());
oneOf(configUtilityService).validateConfiguration(config, resourceType.getResourceConfigurationDefinition());
oneOf(configServerService).completeConfigurationUpdate(with(matchingResponse(successResponse)));
}});
ConfigurationUpdateResponse actualResponse = updateRunner.call();
assertConfigurationUpdateResponseMatches(successResponse, actualResponse, "Expected a success response");
}
@Test
public void successfulUpdateShouldReturnSuccessResponseInEmbeddedMode() throws Exception {
final Configuration config = createStructuredConfig();
int configUpdateId = -1;
ConfigurationUpdateRequest updateRequest = new ConfigurationUpdateRequest(configUpdateId, config, resourceId);
UpdateResourceConfigurationRunner updateRunner = new UpdateResourceConfigurationRunner(null, resourceType,
configMgmt, updateRequest);
updateRunner.setConfigUtilService(configUtilityService);
final ConfigurationUpdateResponse successResponse = new ConfigurationUpdateResponse(configUpdateId, null,
SUCCESS, null);
context.checking(new Expectations() {{
oneOf(configMgmt).executeUpdate(resourceId, config);
oneOf(configUtilityService).normalizeConfiguration(config, resourceType.getResourceConfigurationDefinition());
oneOf(configUtilityService).validateConfiguration(config, resourceType.getResourceConfigurationDefinition());
}});
ConfigurationUpdateResponse actualResponse = updateRunner.call();
assertConfigurationUpdateResponseMatches(successResponse, actualResponse, "Expected a success response");
}
@Test
public void inProgressUpdateShouldSendFailureResponseToServer() throws Exception {
final Configuration config = createStructuredConfig();
int configUpdateId = -1;
ConfigurationUpdateRequest updateRequest = new ConfigurationUpdateRequest(configUpdateId, config, resourceId);
UpdateResourceConfigurationRunner updateRunner = new UpdateResourceConfigurationRunner(configServerService,
resourceType, configMgmt, updateRequest);
updateRunner.setConfigUtilService(configUtilityService);
String errorMsg = "Configuration facet did not indicate success or failure - assuming failure.";
final ConfigurationUpdateResponse failureResponse = new ConfigurationUpdateResponse(configUpdateId, config,
FAILURE, errorMsg);
context.checking(new Expectations() {{
oneOf(configMgmt).executeUpdate(resourceId, config); will(throwException(new UpdateInProgressException()));
oneOf(configUtilityService).normalizeConfiguration(config, resourceType.getResourceConfigurationDefinition());
oneOf(configUtilityService).validateConfiguration(config, resourceType.getResourceConfigurationDefinition());
oneOf(configServerService).completeConfigurationUpdate(with(matchingResponse(failureResponse)));
}});
ConfigurationUpdateResponse actualResponse = updateRunner.call();
assertConfigurationUpdateResponseMatches(failureResponse, actualResponse, "Expected a failure response");
}
@Test
public void failedUpdateShouldSendFailureResponseToServer() throws Exception {
final Configuration config = createStructuredConfig();
final int configUpdateId = -1;
ConfigurationUpdateRequest updateRequest = new ConfigurationUpdateRequest(configUpdateId, config, resourceId);
UpdateResourceConfigurationRunner updateRunner = new UpdateResourceConfigurationRunner(configServerService,
resourceType, configMgmt, updateRequest);
updateRunner.setConfigUtilService(configUtilityService);
String errorMsg = "Configuration update failed.";
final ConfigurationUpdateException exception = new ConfigurationUpdateException(errorMsg);
final ConfigurationUpdateResponse failureResponse = new ConfigurationUpdateResponse(configUpdateId, config,
FAILURE, errorMsg);
context.checking(new Expectations() {{
oneOf(configMgmt).executeUpdate(resourceId, config); will(throwExceptionFromFacet(exception));
oneOf(configUtilityService).normalizeConfiguration(config, resourceType.getResourceConfigurationDefinition());
oneOf(configUtilityService).validateConfiguration(config, resourceType.getResourceConfigurationDefinition());
oneOf(configServerService).completeConfigurationUpdate(with(matchingResponse(failureResponse)));
}});
ConfigurationUpdateResponse actualResponse = updateRunner.call();
assertConfigurationUpdateResponseMatches(failureResponse, actualResponse, "Expected a failure response");
}
@Test
public void failedUpdateShouldReturnFailureResponseInEmbeddedMode() throws Exception {
final Configuration config = createStructuredConfig();
int configUpdateId = -1;
ConfigurationUpdateRequest updateRequest = new ConfigurationUpdateRequest(configUpdateId, config, resourceId);
UpdateResourceConfigurationRunner updateRunner = new UpdateResourceConfigurationRunner(null, resourceType,
configMgmt, updateRequest);
updateRunner.setConfigUtilService(configUtilityService);
String errorMsg = "Configuration update failed.";
final ConfigurationUpdateException exception = new ConfigurationUpdateException(errorMsg);
final ConfigurationUpdateResponse failureResponse = new ConfigurationUpdateResponse(configUpdateId, config,
FAILURE, errorMsg);
context.checking(new Expectations() {{
oneOf(configMgmt).executeUpdate(resourceId, config); will(throwExceptionFromFacet(exception));
oneOf(configUtilityService).normalizeConfiguration(config, resourceType.getResourceConfigurationDefinition());
oneOf(configUtilityService).validateConfiguration(config, resourceType.getResourceConfigurationDefinition());
}});
ConfigurationUpdateResponse actualResponse = updateRunner.call();
assertConfigurationUpdateResponseMatches(failureResponse, actualResponse, "Expected a failure response");
}
@Test
public void failureResponseShouldBeSentToServerWhenUnexpectedExceptionThrown() throws Exception {
final Configuration config = createStructuredConfig();
int configUpdateId = -1;
ConfigurationUpdateRequest updateRequest = new ConfigurationUpdateRequest(configUpdateId, config, resourceId);
UpdateResourceConfigurationRunner updateRunner = new UpdateResourceConfigurationRunner(configServerService,
resourceType, configMgmt, updateRequest);
final NullPointerException exception = new NullPointerException("Unexpected error during update");
final ConfigurationUpdateResponse failureResponse = new ConfigurationUpdateResponse(configUpdateId, config,
exception);
context.checking(new Expectations() {{
oneOf(configMgmt).executeUpdate(resourceId, config); will(throwExceptionFromFacet(exception));
oneOf(configServerService).completeConfigurationUpdate(with(matchingResponse(failureResponse)));
}});
ConfigurationUpdateResponse actualResponse = updateRunner.call();
assertConfigurationUpdateResponseMatches(failureResponse, actualResponse, "Expected a failure response");
}
@Test
public void failureResponseShouldBeReturnedWhenUnexpectedExceptionThrownInEmbeddedMode() throws Exception {
final Configuration config = createStructuredConfig();
int configUpdateId = -1;
ConfigurationUpdateRequest updateRequest = new ConfigurationUpdateRequest(configUpdateId, config, resourceId);
UpdateResourceConfigurationRunner updateRunner = new UpdateResourceConfigurationRunner(null, resourceType,
configMgmt, updateRequest);
final NullPointerException exception = new NullPointerException("Unexpected error during update");
final ConfigurationUpdateResponse failureResponse = new ConfigurationUpdateResponse(configUpdateId, config,
exception);
context.checking(new Expectations() {{
oneOf(configMgmt).executeUpdate(resourceId, config);
will(throwExceptionFromFacet(exception));
}});
ConfigurationUpdateResponse actualResponse = updateRunner.call();
assertConfigurationUpdateResponseMatches(failureResponse, actualResponse, "Expected a failure response");
}
public static Matcher<ConfigurationUpdateResponse> matchingResponse(ConfigurationUpdateResponse expected) {
return new PropertyMatcher<ConfigurationUpdateResponse>(expected);
}
public static Action updateReportTo(ConfigurationUpdateStatus status) {
return new UpdateResourceConfigurationAction(status);
}
public static Action throwExceptionFromFacet(Throwable t) {
return new ThrowFacetExceptionAction(t);
}
static class UpdateResourceConfigurationAction implements Action {
ConfigurationUpdateStatus status;
public UpdateResourceConfigurationAction(ConfigurationUpdateStatus status) {
this.status = status;
}
public void describeTo(Description description) {
description.appendText("Updating status of " + ConfigurationUpdateReport.class.getSimpleName() + " to " +
status);
}
public Object invoke(Invocation invocation) throws Throwable {
ConfigurationUpdateReport report = (ConfigurationUpdateReport) invocation.getParameter(0);
report.setStatus(status);
return null;
}
}
static class ThrowFacetExceptionAction implements Action {
Throwable throwable;
public ThrowFacetExceptionAction(Throwable t) {
throwable = t;
}
public void describeTo(Description description) {
description.appendText("throws <" + throwable.getClass().getName() + ">: " + throwable.getMessage());
}
public Object invoke(Invocation invocation) throws Throwable {
throw throwable;
}
}
}