You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by dr...@apache.org on 2017/05/29 14:42:07 UTC
[1/2] brooklyn-server git commit: Adds WindowsYamlTest (unit test)
Repository: brooklyn-server
Updated Branches:
refs/heads/master 7f11b4b3c -> e7cd82357
Adds WindowsYamlTest (unit test)
Project: http://git-wip-us.apache.org/repos/asf/brooklyn-server/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-server/commit/7f3eda61
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-server/tree/7f3eda61
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-server/diff/7f3eda61
Branch: refs/heads/master
Commit: 7f3eda61b3e58b0675bb0074ecd23bd7d127e38a
Parents: 0fe535e
Author: Aled Sage <al...@gmail.com>
Authored: Fri May 26 12:14:40 2017 +0100
Committer: Aled Sage <al...@gmail.com>
Committed: Mon May 29 11:55:16 2017 +0100
----------------------------------------------------------------------
.../camp/brooklyn/AbstractWindowsYamlTest.java | 138 ++++++++++++
.../camp/brooklyn/WindowsYamlLiveTest.java | 89 +-------
.../brooklyn/camp/brooklyn/WindowsYamlTest.java | 222 +++++++++++++++++++
.../core/internal/winrm/ExecCmdAsserts.java | 120 ++++++++++
4 files changed, 481 insertions(+), 88 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/7f3eda61/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/AbstractWindowsYamlTest.java
----------------------------------------------------------------------
diff --git a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/AbstractWindowsYamlTest.java b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/AbstractWindowsYamlTest.java
new file mode 100644
index 0000000..f23bec4
--- /dev/null
+++ b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/AbstractWindowsYamlTest.java
@@ -0,0 +1,138 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.brooklyn.camp.brooklyn;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertTrue;
+import static org.testng.Assert.fail;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.brooklyn.api.mgmt.HasTaskChildren;
+import org.apache.brooklyn.api.mgmt.Task;
+import org.apache.brooklyn.core.mgmt.BrooklynTaskTags;
+import org.apache.brooklyn.core.mgmt.internal.ManagementContextInternal;
+import org.apache.brooklyn.entity.software.base.SoftwareProcess;
+import org.apache.brooklyn.util.core.task.TaskPredicates;
+import org.apache.brooklyn.util.text.StringPredicates;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.base.Optional;
+import com.google.common.base.Predicate;
+import com.google.common.collect.Lists;
+
+/**
+ * Tests Windows YAML blueprint features.
+ */
+public abstract class AbstractWindowsYamlTest extends AbstractYamlTest {
+
+ // TODO Remove duplication of assertStreams and VanillaWindowsProcessWinrmStreamsLiveTest.assertStreams
+
+ private static final Logger log = LoggerFactory.getLogger(AbstractWindowsYamlTest.class);
+
+ @Override
+ protected ManagementContextInternal mgmt() {
+ return (ManagementContextInternal) super.mgmt();
+ }
+
+ protected void assertStreams(SoftwareProcess entity, Map<String, List<String>> stdouts) {
+ Set<Task<?>> tasks = BrooklynTaskTags.getTasksInEntityContext(mgmt().getExecutionManager(), entity);
+
+ for (Map.Entry<String, List<String>> entry : stdouts.entrySet()) {
+ String taskNameRegex = entry.getKey();
+ List<String> expectedOuts = entry.getValue();
+
+ Task<?> subTask = findTaskOrSubTask(tasks, TaskPredicates.displayNameSatisfies(StringPredicates.matchesRegex(taskNameRegex))).get();
+
+ String stdin = getStreamOrFail(subTask, BrooklynTaskTags.STREAM_STDIN);
+ String stdout = getStreamOrFail(subTask, BrooklynTaskTags.STREAM_STDOUT);
+ String stderr = getStreamOrFail(subTask, BrooklynTaskTags.STREAM_STDERR);
+ String env = getStream(subTask, BrooklynTaskTags.STREAM_ENV);
+ String msg = "stdin="+stdin+"; stdout="+stdout+"; stderr="+stderr+"; env="+env;
+
+ for (String expectedOut : expectedOuts) {
+ assertTrue(stdout.contains(expectedOut), msg);
+ }
+ }
+ }
+
+ protected void assertSubTaskFailures(SoftwareProcess entity, Map<String, Predicate<CharSequence>> taskErrs) throws Exception {
+ Set<Task<?>> tasks = BrooklynTaskTags.getTasksInEntityContext(mgmt().getExecutionManager(), entity);
+
+ for (Map.Entry<String, Predicate<CharSequence>> entry : taskErrs.entrySet()) {
+ String taskNameRegex = entry.getKey();
+ Predicate<? super String> errChecker = entry.getValue();
+ Task<?> subTask = findTaskOrSubTask(tasks, TaskPredicates.displayNameSatisfies(StringPredicates.matchesRegex(taskNameRegex))).get();
+ String msg = "regex="+taskNameRegex+"; task="+subTask;
+ assertNotNull(subTask, msg);
+ assertTrue(subTask.isDone(), msg);
+ assertTrue(subTask.isError(), msg);
+ try {
+ subTask.get();
+ fail();
+ } catch (Exception e) {
+ if (!errChecker.apply(e.toString())) {
+ throw e;
+ }
+ }
+ }
+ }
+
+ public static String getStreamOrFail(Task<?> task, String streamType) {
+ String msg = "task="+task+"; stream="+streamType;
+ BrooklynTaskTags.WrappedStream stream = checkNotNull(BrooklynTaskTags.stream(task, streamType), "Stream null: " + msg);
+ return checkNotNull(stream.streamContents.get(), "Contents null: "+msg);
+ }
+
+ public static String getStream(Task<?> task, String streamType) {
+ BrooklynTaskTags.WrappedStream stream = BrooklynTaskTags.stream(task, streamType);
+ return (stream != null) ? stream.streamContents.get() : null;
+ }
+
+ protected Optional<Task<?>> findTaskOrSubTask(Iterable<? extends Task<?>> tasks, Predicate<? super Task<?>> matcher) {
+ List<String> taskNames = Lists.newArrayList();
+ Optional<Task<?>> result = findTaskOrSubTaskImpl(tasks, matcher, taskNames);
+ if (!result.isPresent() && log.isDebugEnabled()) {
+ log.debug("Task not found matching "+matcher+"; contender names were "+taskNames);
+ }
+ return result;
+ }
+
+ protected Optional<Task<?>> findTaskOrSubTaskImpl(Iterable<? extends Task<?>> tasks, Predicate<? super Task<?>> matcher, List<String> taskNames) {
+ for (Task<?> task : tasks) {
+ if (matcher.apply(task)) return Optional.<Task<?>>of(task);
+
+ if (task instanceof HasTaskChildren) {
+ Optional<Task<?>> subResult = findTaskOrSubTask(((HasTaskChildren) task).getChildren(), matcher);
+ if (subResult.isPresent()) return subResult;
+ }
+ }
+
+ return Optional.<Task<?>>absent();
+ }
+
+ @Override
+ protected Logger getLogger() {
+ return log;
+ }
+}
http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/7f3eda61/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/WindowsYamlLiveTest.java
----------------------------------------------------------------------
diff --git a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/WindowsYamlLiveTest.java b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/WindowsYamlLiveTest.java
index cba6a61..6a34738 100644
--- a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/WindowsYamlLiveTest.java
+++ b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/WindowsYamlLiveTest.java
@@ -18,29 +18,20 @@
*/
package org.apache.brooklyn.camp.brooklyn;
-import static com.google.common.base.Preconditions.checkNotNull;
-import static org.testng.Assert.assertNotNull;
-import static org.testng.Assert.assertTrue;
import static org.testng.Assert.fail;
import java.util.List;
import java.util.Map;
-import java.util.Set;
import org.apache.brooklyn.api.entity.Entity;
import org.apache.brooklyn.api.location.MachineProvisioningLocation;
-import org.apache.brooklyn.api.mgmt.HasTaskChildren;
-import org.apache.brooklyn.api.mgmt.Task;
import org.apache.brooklyn.core.entity.Attributes;
import org.apache.brooklyn.core.entity.Entities;
import org.apache.brooklyn.core.entity.EntityAsserts;
-import org.apache.brooklyn.core.mgmt.BrooklynTaskTags;
import org.apache.brooklyn.core.mgmt.internal.ManagementContextInternal;
-import org.apache.brooklyn.entity.software.base.SoftwareProcess;
import org.apache.brooklyn.entity.software.base.VanillaWindowsProcess;
import org.apache.brooklyn.entity.software.base.test.location.WindowsTestFixture;
import org.apache.brooklyn.location.winrm.WinRmMachineLocation;
-import org.apache.brooklyn.util.core.task.TaskPredicates;
import org.apache.brooklyn.util.text.StringPredicates;
import org.apache.brooklyn.util.text.Strings;
import org.slf4j.Logger;
@@ -52,8 +43,6 @@ import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import com.google.common.base.Joiner;
-import com.google.common.base.Optional;
-import com.google.common.base.Predicate;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Lists;
@@ -62,7 +51,7 @@ import com.google.common.collect.Lists;
* Tests Windows YAML blueprint features.
*/
@Test
-public class WindowsYamlLiveTest extends AbstractYamlTest {
+public class WindowsYamlLiveTest extends AbstractWindowsYamlTest {
// TODO Remove duplication of assertStreams and VanillaWindowsProcessWinrmStreamsLiveTest.assertStreams
@@ -328,82 +317,6 @@ public class WindowsYamlLiveTest extends AbstractYamlTest {
}
}
- protected void assertStreams(SoftwareProcess entity, Map<String, List<String>> stdouts) {
- Set<Task<?>> tasks = BrooklynTaskTags.getTasksInEntityContext(mgmt().getExecutionManager(), entity);
-
- for (Map.Entry<String, List<String>> entry : stdouts.entrySet()) {
- String taskNameRegex = entry.getKey();
- List<String> expectedOuts = entry.getValue();
-
- Task<?> subTask = findTaskOrSubTask(tasks, TaskPredicates.displayNameSatisfies(StringPredicates.matchesRegex(taskNameRegex))).get();
-
- String stdin = getStreamOrFail(subTask, BrooklynTaskTags.STREAM_STDIN);
- String stdout = getStreamOrFail(subTask, BrooklynTaskTags.STREAM_STDOUT);
- String stderr = getStreamOrFail(subTask, BrooklynTaskTags.STREAM_STDERR);
- String env = getStream(subTask, BrooklynTaskTags.STREAM_ENV);
- String msg = "stdin="+stdin+"; stdout="+stdout+"; stderr="+stderr+"; env="+env;
-
- for (String expectedOut : expectedOuts) {
- assertTrue(stdout.contains(expectedOut), msg);
- }
- }
- }
-
- protected void assertSubTaskFailures(SoftwareProcess entity, Map<String, Predicate<CharSequence>> taskErrs) throws Exception {
- Set<Task<?>> tasks = BrooklynTaskTags.getTasksInEntityContext(mgmt().getExecutionManager(), entity);
-
- for (Map.Entry<String, Predicate<CharSequence>> entry : taskErrs.entrySet()) {
- String taskNameRegex = entry.getKey();
- Predicate<? super String> errChecker = entry.getValue();
- Task<?> subTask = findTaskOrSubTask(tasks, TaskPredicates.displayNameSatisfies(StringPredicates.matchesRegex(taskNameRegex))).get();
- String msg = "regex="+taskNameRegex+"; task="+subTask;
- assertNotNull(subTask, msg);
- assertTrue(subTask.isDone(), msg);
- assertTrue(subTask.isError(), msg);
- try {
- subTask.get();
- fail();
- } catch (Exception e) {
- if (!errChecker.apply(e.toString())) {
- throw e;
- }
- }
- }
- }
-
- public static String getStreamOrFail(Task<?> task, String streamType) {
- String msg = "task="+task+"; stream="+streamType;
- BrooklynTaskTags.WrappedStream stream = checkNotNull(BrooklynTaskTags.stream(task, streamType), "Stream null: " + msg);
- return checkNotNull(stream.streamContents.get(), "Contents null: "+msg);
- }
-
- public static String getStream(Task<?> task, String streamType) {
- BrooklynTaskTags.WrappedStream stream = BrooklynTaskTags.stream(task, streamType);
- return (stream != null) ? stream.streamContents.get() : null;
- }
-
- protected Optional<Task<?>> findTaskOrSubTask(Iterable<? extends Task<?>> tasks, Predicate<? super Task<?>> matcher) {
- List<String> taskNames = Lists.newArrayList();
- Optional<Task<?>> result = findTaskOrSubTaskImpl(tasks, matcher, taskNames);
- if (!result.isPresent() && log.isDebugEnabled()) {
- log.debug("Task not found matching "+matcher+"; contender names were "+taskNames);
- }
- return result;
- }
-
- protected Optional<Task<?>> findTaskOrSubTaskImpl(Iterable<? extends Task<?>> tasks, Predicate<? super Task<?>> matcher, List<String> taskNames) {
- for (Task<?> task : tasks) {
- if (matcher.apply(task)) return Optional.<Task<?>>of(task);
-
- if (task instanceof HasTaskChildren) {
- Optional<Task<?>> subResult = findTaskOrSubTask(((HasTaskChildren) task).getChildren(), matcher);
- if (subResult.isPresent()) return subResult;
- }
- }
-
- return Optional.<Task<?>>absent();
- }
-
@Override
protected Logger getLogger() {
return log;
http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/7f3eda61/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/WindowsYamlTest.java
----------------------------------------------------------------------
diff --git a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/WindowsYamlTest.java b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/WindowsYamlTest.java
new file mode 100644
index 0000000..5b573ae
--- /dev/null
+++ b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/WindowsYamlTest.java
@@ -0,0 +1,222 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.brooklyn.camp.brooklyn;
+
+import static org.testng.Assert.assertEquals;
+
+import java.util.List;
+import java.util.Map;
+
+import org.apache.brooklyn.api.entity.Entity;
+import org.apache.brooklyn.core.entity.Entities;
+import org.apache.brooklyn.entity.software.base.VanillaWindowsProcess;
+import org.apache.brooklyn.util.core.internal.winrm.ExecCmdAsserts;
+import org.apache.brooklyn.util.core.internal.winrm.RecordingWinRmTool;
+import org.apache.brooklyn.util.core.internal.winrm.RecordingWinRmTool.CustomResponse;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Iterables;
+
+/**
+ * Tests Windows YAML blueprint features.
+ */
+@Test
+public class WindowsYamlTest extends AbstractWindowsYamlTest {
+
+ private static final Logger log = LoggerFactory.getLogger(WindowsYamlTest.class);
+
+ private static final String LOCATION_CATALOG_ID = "byonWindowsLoc";
+
+ protected Entity app;
+ protected VanillaWindowsProcess entity;
+
+ protected boolean useDefaultProperties() {
+ return true;
+ }
+
+ @BeforeMethod(alwaysRun = true)
+ public void setUpClass() throws Exception {
+ super.setUp();
+
+ RecordingWinRmTool.clear();
+
+ addCatalogItems(
+ "brooklyn.catalog:",
+ " id: " + LOCATION_CATALOG_ID,
+ " version: 1.0.0",
+ " itemType: location",
+ " item:",
+ " type: byon",
+ " brooklyn.config:",
+ " hosts:",
+ " - winrm: 1.2.3.4",
+ " user: admin",
+ " brooklyn.winrm.config.winrmToolClass: "+RecordingWinRmTool.class.getName(),
+ " password: pa55w0rd",
+ " osFamily: windows");
+ }
+
+ @AfterMethod(alwaysRun = true)
+ @Override
+ public void tearDown() throws Exception {
+ try {
+ super.tearDown();
+ } catch (Throwable t) {
+ RecordingWinRmTool.clear();
+ }
+ }
+
+ @Test
+ public void testPassesThroughUseHttps() throws Exception {
+ super.createAndStartApplication(
+ "location: "+LOCATION_CATALOG_ID,
+ "services:",
+ "- type: "+VanillaWindowsProcess.class.getName(),
+ " brooklyn.config:",
+ " launch.powershell.command: myLaunch",
+ " checkRunning.powershell.command: myCheckRunning",
+ " provisioning.properties:",
+ " winrm.useHttps: true");
+
+ Map<?, ?> constructorProps = RecordingWinRmTool.getLastConstructorProps();
+ assertEquals(constructorProps.get("winrm.useHttps"), Boolean.TRUE, "props="+constructorProps);
+ }
+
+ @Test
+ public void testPowershellMinimal() throws Exception {
+ createAndStartApplication(
+ "location: "+LOCATION_CATALOG_ID,
+ "services:",
+ "- type: "+VanillaWindowsProcess.class.getName(),
+ " brooklyn.config:",
+ " launch.powershell.command: myLaunch",
+ " checkRunning.powershell.command: myCheckRunning");
+
+ RecordingWinRmTool.getExecs();
+ ExecCmdAsserts.assertExecHasOnlyOnce(RecordingWinRmTool.getExecs(), "myLaunch");
+ ExecCmdAsserts.assertExecContains(RecordingWinRmTool.getLastExec(), "myCheckRunning");
+ }
+
+ @Test
+ public void testPowershell() throws Exception {
+ RecordingWinRmTool.setCustomResponse("myPreInstall", new CustomResponse(0, "myPreInstallStdout", ""));
+ RecordingWinRmTool.setCustomResponse("myInstall", new CustomResponse(0, "myInstallStdout", ""));
+ RecordingWinRmTool.setCustomResponse("myPostInstall", new CustomResponse(0, "myPostInstallStdout", ""));
+ RecordingWinRmTool.setCustomResponse("myCustomize", new CustomResponse(0, "myCustomizeStdout", ""));
+ RecordingWinRmTool.setCustomResponse("myPreLaunch", new CustomResponse(0, "myPreLaunchStdout", ""));
+ RecordingWinRmTool.setCustomResponse("myLaunch", new CustomResponse(0, "myLaunchStdout", ""));
+ RecordingWinRmTool.setCustomResponse("myPostLaunch", new CustomResponse(0, "myPostLaunchStdout", ""));
+ RecordingWinRmTool.setCustomResponse("myStop", new CustomResponse(0, "myStopStdout", ""));
+
+ app = createAndStartApplication(
+ "location: "+LOCATION_CATALOG_ID,
+ "services:",
+ "- type: "+VanillaWindowsProcess.class.getName(),
+ " brooklyn.config:",
+ " pre.install.powershell.command: myPreInstall",
+ " install.powershell.command: myInstall",
+ " post.install.powershell.command: myPostInstall",
+ " customize.powershell.command: myCustomize",
+ " pre.launch.powershell.command: myPreLaunch",
+ " launch.powershell.command: myLaunch",
+ " post.launch.powershell.command: myPostLaunch",
+ " checkRunning.powershell.command: myCheckRunning",
+ " stop.powershell.command: myStop");
+ entity = Iterables.getOnlyElement(Entities.descendantsAndSelf(app, VanillaWindowsProcess.class));
+
+ Map<String, List<String>> stdouts = ImmutableMap.<String, List<String>>builder()
+ .put("winrm: pre-install.*", ImmutableList.of("myPreInstallStdout"))
+ .put("winrm: install.*", ImmutableList.of("myInstallStdout"))
+ .put("winrm: post-install.*", ImmutableList.of("myPostInstallStdout"))
+ .put("winrm: customize.*", ImmutableList.of("myCustomizeStdout"))
+ .put("winrm: pre-launch.*", ImmutableList.of("myPreLaunchStdout"))
+ .put("winrm: launch.*", ImmutableList.of("myLaunchStdout"))
+ .put("winrm: post-launch.*", ImmutableList.of("myPostLaunchStdout"))
+ .build();
+
+ assertStreams(entity, stdouts);
+
+ entity.stop();
+
+ Map<String, List<String>> stopStdouts = ImmutableMap.<String, List<String>>builder()
+ .put("winrm: stop.*", ImmutableList.of("myStopStdout"))
+ .build();
+
+ assertStreams(entity, stopStdouts);
+ }
+
+ @Test
+ public void testCommands() throws Exception {
+ RecordingWinRmTool.setCustomResponse("myPreInstall", new CustomResponse(0, "myPreInstallStdout", ""));
+ RecordingWinRmTool.setCustomResponse("myInstall", new CustomResponse(0, "myInstallStdout", ""));
+ RecordingWinRmTool.setCustomResponse("myPostInstall", new CustomResponse(0, "myPostInstallStdout", ""));
+ RecordingWinRmTool.setCustomResponse("myCustomize", new CustomResponse(0, "myCustomizeStdout", ""));
+ RecordingWinRmTool.setCustomResponse("myPreLaunch", new CustomResponse(0, "myPreLaunchStdout", ""));
+ RecordingWinRmTool.setCustomResponse("myLaunch", new CustomResponse(0, "myLaunchStdout", ""));
+ RecordingWinRmTool.setCustomResponse("myPostLaunch", new CustomResponse(0, "myPostLaunchStdout", ""));
+ RecordingWinRmTool.setCustomResponse("myStop", new CustomResponse(0, "myStopStdout", ""));
+
+ app = createAndStartApplication(
+ "location: "+LOCATION_CATALOG_ID,
+ "services:",
+ "- type: "+VanillaWindowsProcess.class.getName(),
+ " brooklyn.config:",
+ " pre.install.command: myPreInstall",
+ " install.command: myInstall",
+ " post.install.command: myPostInstall",
+ " customize.command: myCustomize",
+ " pre.launch.command: myPreLaunch",
+ " launch.command: myLaunch",
+ " post.launch.command: myPostLaunch",
+ " checkRunning.command: myCheckRunning",
+ " stop.command: myStop");
+ entity = Iterables.getOnlyElement(Entities.descendantsAndSelf(app, VanillaWindowsProcess.class));
+
+ Map<String, List<String>> stdouts = ImmutableMap.<String, List<String>>builder()
+ .put("winrm: pre-install.*", ImmutableList.of("myPreInstallStdout"))
+ .put("winrm: install.*", ImmutableList.of("myInstallStdout"))
+ .put("winrm: post-install.*", ImmutableList.of("myPostInstallStdout"))
+ .put("winrm: customize.*", ImmutableList.of("myCustomizeStdout"))
+ .put("winrm: pre-launch.*", ImmutableList.of("myPreLaunchStdout"))
+ .put("winrm: launch.*", ImmutableList.of("myLaunchStdout"))
+ .put("winrm: post-launch.*", ImmutableList.of("myPostLaunchStdout"))
+ .build();
+
+ assertStreams(entity, stdouts);
+
+ entity.stop();
+
+ Map<String, List<String>> stopStdouts = ImmutableMap.<String, List<String>>builder()
+ .put("winrm: stop.*", ImmutableList.of("myStopStdout"))
+ .build();
+
+ assertStreams(entity, stopStdouts);
+ }
+
+ @Override
+ protected Logger getLogger() {
+ return log;
+ }
+}
http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/7f3eda61/software/winrm/src/test/java/org/apache/brooklyn/util/core/internal/winrm/ExecCmdAsserts.java
----------------------------------------------------------------------
diff --git a/software/winrm/src/test/java/org/apache/brooklyn/util/core/internal/winrm/ExecCmdAsserts.java b/software/winrm/src/test/java/org/apache/brooklyn/util/core/internal/winrm/ExecCmdAsserts.java
new file mode 100644
index 0000000..730f36c
--- /dev/null
+++ b/software/winrm/src/test/java/org/apache/brooklyn/util/core/internal/winrm/ExecCmdAsserts.java
@@ -0,0 +1,120 @@
+/*
+ * Copyright 2016 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.brooklyn.util.core.internal.winrm;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertTrue;
+import static org.testng.Assert.fail;
+
+import java.util.List;
+
+import org.apache.brooklyn.util.core.internal.winrm.RecordingWinRmTool.ExecParams;
+
+import com.google.common.annotations.Beta;
+import com.google.common.base.Predicate;
+
+@Beta
+public class ExecCmdAsserts {
+
+ public static void assertExecsContain(List<ExecParams> actuals, List<String> expectedCmds) {
+ String errMsg = "actuals="+actuals+"; expected="+expectedCmds;
+ assertTrue(actuals.size() >= expectedCmds.size(), "actualSize="+actuals.size()+"; expectedSize="+expectedCmds.size()+"; "+errMsg);
+ for (int i = 0; i < expectedCmds.size(); i++) {
+ assertExecContains(actuals.get(i), expectedCmds.get(i), errMsg);
+ }
+ }
+
+ public static void assertExecContains(ExecParams actual, String expectedCmdRegex) {
+ assertExecContains(actual, expectedCmdRegex, null);
+ }
+
+ public static void assertExecContains(ExecParams actual, String expectedCmdRegex, String errMsg) {
+ for (String cmd : actual.commands) {
+ if (cmd.matches(expectedCmdRegex)) {
+ return;
+ }
+ }
+ fail(expectedCmdRegex + " not matched by any commands in " + actual+(errMsg != null ? "; "+errMsg : ""));
+ }
+
+ public static void assertExecsNotContains(List<? extends ExecParams> actuals, List<String> expectedNotCmdRegexs) {
+ for (ExecParams actual : actuals) {
+ assertExecNotContains(actual, expectedNotCmdRegexs);
+ }
+ }
+
+ public static void assertExecNotContains(ExecParams actual, List<String> expectedNotCmdRegexs) {
+ for (String cmdRegex : expectedNotCmdRegexs) {
+ for (String subActual : actual.commands) {
+ if (subActual.matches(cmdRegex)) {
+ fail("Exec should not contain " + cmdRegex + ", but matched by " + actual);
+ }
+ }
+ }
+ }
+
+ public static void assertExecsSatisfy(List<ExecParams> actuals, List<? extends Predicate<? super ExecParams>> expectedCmds) {
+ String errMsg = "actuals="+actuals+"; expected="+expectedCmds;
+ assertTrue(actuals.size() >= expectedCmds.size(), "actualSize="+actuals.size()+"; expectedSize="+expectedCmds.size()+"; "+errMsg);
+ for (int i = 0; i < expectedCmds.size(); i++) {
+ assertExecSatisfies(actuals.get(i), expectedCmds.get(i), errMsg);
+ }
+ }
+
+ public static void assertExecSatisfies(ExecParams actual, Predicate<? super ExecParams> expected) {
+ assertExecSatisfies(actual, expected, null);
+ }
+
+ public static void assertExecSatisfies(ExecParams actual, Predicate<? super ExecParams> expected, String errMsg) {
+ if (!expected.apply(actual)) {
+ fail(expected + " not matched by " + actual + (errMsg != null ? "; "+errMsg : ""));
+ }
+ }
+
+ public static void assertExecHasNever(List<ExecParams> actuals, String expectedCmd) {
+ assertExecHasExactly(actuals, expectedCmd, 0);
+ }
+
+ public static void assertExecHasOnlyOnce(List<ExecParams> actuals, String expectedCmd) {
+ assertExecHasExactly(actuals, expectedCmd, 1);
+ }
+
+ public static void assertExecHasExactly(List<ExecParams> actuals, String expectedCmd, int expectedCount) {
+ String errMsg = "actuals="+actuals+"; expected="+expectedCmd;
+ int count = 0;
+ for (ExecParams actual : actuals) {
+ for (String subActual : actual.commands) {
+ if (subActual.matches(expectedCmd)) {
+ count++;
+ break;
+ }
+ }
+ }
+ assertEquals(count, expectedCount, errMsg);
+ }
+
+ public static ExecParams findExecContaining(List<ExecParams> actuals, String cmdRegex) {
+ for (ExecParams actual : actuals) {
+ for (String subActual : actual.commands) {
+ if (subActual.matches(cmdRegex)) {
+ return actual;
+ }
+ }
+ }
+ fail("No match for '"+cmdRegex+"' in "+actuals);
+ throw new IllegalStateException("unreachable code");
+ }
+}
[2/2] brooklyn-server git commit: This closes #704
Posted by dr...@apache.org.
This closes #704
Project: http://git-wip-us.apache.org/repos/asf/brooklyn-server/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-server/commit/e7cd8235
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-server/tree/e7cd8235
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-server/diff/e7cd8235
Branch: refs/heads/master
Commit: e7cd82357d22872b58a97613a314163d07f2b517
Parents: 7f11b4b 7f3eda6
Author: Duncan Godwin <dr...@googlemail.com>
Authored: Mon May 29 15:41:57 2017 +0100
Committer: Duncan Godwin <dr...@googlemail.com>
Committed: Mon May 29 15:41:57 2017 +0100
----------------------------------------------------------------------
.../camp/brooklyn/AbstractWindowsYamlTest.java | 138 ++++++++++++
.../camp/brooklyn/WindowsYamlLiveTest.java | 89 +-------
.../brooklyn/camp/brooklyn/WindowsYamlTest.java | 222 +++++++++++++++++++
.../core/internal/winrm/ExecCmdAsserts.java | 120 ++++++++++
4 files changed, 481 insertions(+), 88 deletions(-)
----------------------------------------------------------------------