/modules/core/plugin-container/src/test/java/org/rhq/core/pc/configuration/UpdateResourceConfigurationRunnerTest.java

https://github.com/ccrouch/rhq · Java · 308 lines · 194 code · 92 blank · 22 comment · 0 complexity · 8beff6f42dbab6e82bb1bdc9e224e867 MD5 · raw file

  1. /*
  2. * RHQ Management Platform
  3. * Copyright (C) 2005-2008 Red Hat, Inc.
  4. * All rights reserved.
  5. *
  6. * This program is free software; you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License, version 2, as
  8. * published by the Free Software Foundation, and/or the GNU Lesser
  9. * General Public License, version 2.1, also as published by the Free
  10. * Software Foundation.
  11. *
  12. * This program is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. * GNU General Public License and the GNU Lesser General Public License
  16. * for more details.
  17. *
  18. * You should have received a copy of the GNU General Public License
  19. * and the GNU Lesser General Public License along with this program;
  20. * if not, write to the Free Software Foundation, Inc.,
  21. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  22. */
  23. package org.rhq.core.pc.configuration;
  24. import org.hamcrest.Description;
  25. import org.hamcrest.Matcher;
  26. import org.jmock.Expectations;
  27. import org.jmock.api.Action;
  28. import org.jmock.api.Invocation;
  29. import org.rhq.core.clientapi.agent.configuration.ConfigurationUpdateRequest;
  30. import org.rhq.core.clientapi.server.configuration.ConfigurationServerService;
  31. import org.rhq.core.clientapi.server.configuration.ConfigurationUpdateResponse;
  32. import org.rhq.core.domain.configuration.Configuration;
  33. import org.rhq.core.domain.configuration.ConfigurationUpdateStatus;
  34. import org.rhq.core.pluginapi.configuration.ConfigurationUpdateReport;
  35. import org.rhq.test.jmock.PropertyMatcher;
  36. import org.testng.annotations.BeforeMethod;
  37. import org.testng.annotations.Test;
  38. import static org.rhq.core.domain.configuration.ConfigurationUpdateStatus.FAILURE;
  39. import static org.rhq.core.domain.configuration.ConfigurationUpdateStatus.SUCCESS;
  40. public class UpdateResourceConfigurationRunnerTest extends ConfigManagementTest {
  41. ConfigManagement configMgmt;
  42. ConfigurationServerService configServerService;
  43. @BeforeMethod
  44. public void setup() throws Exception {
  45. configMgmt = context.mock(ConfigManagement.class);
  46. configServerService = context.mock(ConfigurationServerService.class);
  47. }
  48. @Test
  49. public void successfulUpdateShouldSendSuccessResponseToServer() throws Exception {
  50. final Configuration config = createStructuredConfig();
  51. int configUpdateId = -1;
  52. ConfigurationUpdateRequest updateRequest = new ConfigurationUpdateRequest(configUpdateId, config, resourceId);
  53. UpdateResourceConfigurationRunner updateRunner = new UpdateResourceConfigurationRunner(configServerService,
  54. resourceType, configMgmt, updateRequest);
  55. updateRunner.setConfigUtilService(configUtilityService);
  56. final ConfigurationUpdateResponse successResponse = new ConfigurationUpdateResponse(configUpdateId, null,
  57. SUCCESS, null);
  58. context.checking(new Expectations() {{
  59. oneOf(configMgmt).executeUpdate(resourceId, config);
  60. oneOf(configUtilityService).normalizeConfiguration(config, resourceType.getResourceConfigurationDefinition());
  61. oneOf(configUtilityService).validateConfiguration(config, resourceType.getResourceConfigurationDefinition());
  62. oneOf(configServerService).completeConfigurationUpdate(with(matchingResponse(successResponse)));
  63. }});
  64. ConfigurationUpdateResponse actualResponse = updateRunner.call();
  65. assertConfigurationUpdateResponseMatches(successResponse, actualResponse, "Expected a success response");
  66. }
  67. @Test
  68. public void successfulUpdateShouldReturnSuccessResponseInEmbeddedMode() throws Exception {
  69. final Configuration config = createStructuredConfig();
  70. int configUpdateId = -1;
  71. ConfigurationUpdateRequest updateRequest = new ConfigurationUpdateRequest(configUpdateId, config, resourceId);
  72. UpdateResourceConfigurationRunner updateRunner = new UpdateResourceConfigurationRunner(null, resourceType,
  73. configMgmt, updateRequest);
  74. updateRunner.setConfigUtilService(configUtilityService);
  75. final ConfigurationUpdateResponse successResponse = new ConfigurationUpdateResponse(configUpdateId, null,
  76. SUCCESS, null);
  77. context.checking(new Expectations() {{
  78. oneOf(configMgmt).executeUpdate(resourceId, config);
  79. oneOf(configUtilityService).normalizeConfiguration(config, resourceType.getResourceConfigurationDefinition());
  80. oneOf(configUtilityService).validateConfiguration(config, resourceType.getResourceConfigurationDefinition());
  81. }});
  82. ConfigurationUpdateResponse actualResponse = updateRunner.call();
  83. assertConfigurationUpdateResponseMatches(successResponse, actualResponse, "Expected a success response");
  84. }
  85. @Test
  86. public void inProgressUpdateShouldSendFailureResponseToServer() throws Exception {
  87. final Configuration config = createStructuredConfig();
  88. int configUpdateId = -1;
  89. ConfigurationUpdateRequest updateRequest = new ConfigurationUpdateRequest(configUpdateId, config, resourceId);
  90. UpdateResourceConfigurationRunner updateRunner = new UpdateResourceConfigurationRunner(configServerService,
  91. resourceType, configMgmt, updateRequest);
  92. updateRunner.setConfigUtilService(configUtilityService);
  93. String errorMsg = "Configuration facet did not indicate success or failure - assuming failure.";
  94. final ConfigurationUpdateResponse failureResponse = new ConfigurationUpdateResponse(configUpdateId, config,
  95. FAILURE, errorMsg);
  96. context.checking(new Expectations() {{
  97. oneOf(configMgmt).executeUpdate(resourceId, config); will(throwException(new UpdateInProgressException()));
  98. oneOf(configUtilityService).normalizeConfiguration(config, resourceType.getResourceConfigurationDefinition());
  99. oneOf(configUtilityService).validateConfiguration(config, resourceType.getResourceConfigurationDefinition());
  100. oneOf(configServerService).completeConfigurationUpdate(with(matchingResponse(failureResponse)));
  101. }});
  102. ConfigurationUpdateResponse actualResponse = updateRunner.call();
  103. assertConfigurationUpdateResponseMatches(failureResponse, actualResponse, "Expected a failure response");
  104. }
  105. @Test
  106. public void failedUpdateShouldSendFailureResponseToServer() throws Exception {
  107. final Configuration config = createStructuredConfig();
  108. final int configUpdateId = -1;
  109. ConfigurationUpdateRequest updateRequest = new ConfigurationUpdateRequest(configUpdateId, config, resourceId);
  110. UpdateResourceConfigurationRunner updateRunner = new UpdateResourceConfigurationRunner(configServerService,
  111. resourceType, configMgmt, updateRequest);
  112. updateRunner.setConfigUtilService(configUtilityService);
  113. String errorMsg = "Configuration update failed.";
  114. final ConfigurationUpdateException exception = new ConfigurationUpdateException(errorMsg);
  115. final ConfigurationUpdateResponse failureResponse = new ConfigurationUpdateResponse(configUpdateId, config,
  116. FAILURE, errorMsg);
  117. context.checking(new Expectations() {{
  118. oneOf(configMgmt).executeUpdate(resourceId, config); will(throwExceptionFromFacet(exception));
  119. oneOf(configUtilityService).normalizeConfiguration(config, resourceType.getResourceConfigurationDefinition());
  120. oneOf(configUtilityService).validateConfiguration(config, resourceType.getResourceConfigurationDefinition());
  121. oneOf(configServerService).completeConfigurationUpdate(with(matchingResponse(failureResponse)));
  122. }});
  123. ConfigurationUpdateResponse actualResponse = updateRunner.call();
  124. assertConfigurationUpdateResponseMatches(failureResponse, actualResponse, "Expected a failure response");
  125. }
  126. @Test
  127. public void failedUpdateShouldReturnFailureResponseInEmbeddedMode() throws Exception {
  128. final Configuration config = createStructuredConfig();
  129. int configUpdateId = -1;
  130. ConfigurationUpdateRequest updateRequest = new ConfigurationUpdateRequest(configUpdateId, config, resourceId);
  131. UpdateResourceConfigurationRunner updateRunner = new UpdateResourceConfigurationRunner(null, resourceType,
  132. configMgmt, updateRequest);
  133. updateRunner.setConfigUtilService(configUtilityService);
  134. String errorMsg = "Configuration update failed.";
  135. final ConfigurationUpdateException exception = new ConfigurationUpdateException(errorMsg);
  136. final ConfigurationUpdateResponse failureResponse = new ConfigurationUpdateResponse(configUpdateId, config,
  137. FAILURE, errorMsg);
  138. context.checking(new Expectations() {{
  139. oneOf(configMgmt).executeUpdate(resourceId, config); will(throwExceptionFromFacet(exception));
  140. oneOf(configUtilityService).normalizeConfiguration(config, resourceType.getResourceConfigurationDefinition());
  141. oneOf(configUtilityService).validateConfiguration(config, resourceType.getResourceConfigurationDefinition());
  142. }});
  143. ConfigurationUpdateResponse actualResponse = updateRunner.call();
  144. assertConfigurationUpdateResponseMatches(failureResponse, actualResponse, "Expected a failure response");
  145. }
  146. @Test
  147. public void failureResponseShouldBeSentToServerWhenUnexpectedExceptionThrown() throws Exception {
  148. final Configuration config = createStructuredConfig();
  149. int configUpdateId = -1;
  150. ConfigurationUpdateRequest updateRequest = new ConfigurationUpdateRequest(configUpdateId, config, resourceId);
  151. UpdateResourceConfigurationRunner updateRunner = new UpdateResourceConfigurationRunner(configServerService,
  152. resourceType, configMgmt, updateRequest);
  153. final NullPointerException exception = new NullPointerException("Unexpected error during update");
  154. final ConfigurationUpdateResponse failureResponse = new ConfigurationUpdateResponse(configUpdateId, config,
  155. exception);
  156. context.checking(new Expectations() {{
  157. oneOf(configMgmt).executeUpdate(resourceId, config); will(throwExceptionFromFacet(exception));
  158. oneOf(configServerService).completeConfigurationUpdate(with(matchingResponse(failureResponse)));
  159. }});
  160. ConfigurationUpdateResponse actualResponse = updateRunner.call();
  161. assertConfigurationUpdateResponseMatches(failureResponse, actualResponse, "Expected a failure response");
  162. }
  163. @Test
  164. public void failureResponseShouldBeReturnedWhenUnexpectedExceptionThrownInEmbeddedMode() throws Exception {
  165. final Configuration config = createStructuredConfig();
  166. int configUpdateId = -1;
  167. ConfigurationUpdateRequest updateRequest = new ConfigurationUpdateRequest(configUpdateId, config, resourceId);
  168. UpdateResourceConfigurationRunner updateRunner = new UpdateResourceConfigurationRunner(null, resourceType,
  169. configMgmt, updateRequest);
  170. final NullPointerException exception = new NullPointerException("Unexpected error during update");
  171. final ConfigurationUpdateResponse failureResponse = new ConfigurationUpdateResponse(configUpdateId, config,
  172. exception);
  173. context.checking(new Expectations() {{
  174. oneOf(configMgmt).executeUpdate(resourceId, config);
  175. will(throwExceptionFromFacet(exception));
  176. }});
  177. ConfigurationUpdateResponse actualResponse = updateRunner.call();
  178. assertConfigurationUpdateResponseMatches(failureResponse, actualResponse, "Expected a failure response");
  179. }
  180. public static Matcher<ConfigurationUpdateResponse> matchingResponse(ConfigurationUpdateResponse expected) {
  181. return new PropertyMatcher<ConfigurationUpdateResponse>(expected);
  182. }
  183. public static Action updateReportTo(ConfigurationUpdateStatus status) {
  184. return new UpdateResourceConfigurationAction(status);
  185. }
  186. public static Action throwExceptionFromFacet(Throwable t) {
  187. return new ThrowFacetExceptionAction(t);
  188. }
  189. static class UpdateResourceConfigurationAction implements Action {
  190. ConfigurationUpdateStatus status;
  191. public UpdateResourceConfigurationAction(ConfigurationUpdateStatus status) {
  192. this.status = status;
  193. }
  194. public void describeTo(Description description) {
  195. description.appendText("Updating status of " + ConfigurationUpdateReport.class.getSimpleName() + " to " +
  196. status);
  197. }
  198. public Object invoke(Invocation invocation) throws Throwable {
  199. ConfigurationUpdateReport report = (ConfigurationUpdateReport) invocation.getParameter(0);
  200. report.setStatus(status);
  201. return null;
  202. }
  203. }
  204. static class ThrowFacetExceptionAction implements Action {
  205. Throwable throwable;
  206. public ThrowFacetExceptionAction(Throwable t) {
  207. throwable = t;
  208. }
  209. public void describeTo(Description description) {
  210. description.appendText("throws <" + throwable.getClass().getName() + ">: " + throwable.getMessage());
  211. }
  212. public Object invoke(Invocation invocation) throws Throwable {
  213. throw throwable;
  214. }
  215. }
  216. }