001: /********************************************************************************
002: * CruiseControl, a Continuous Integration Toolkit
003: * Copyright (c) 2001-2003, ThoughtWorks, Inc.
004: * 200 E. Randolph, 25th Floor
005: * Chicago, IL 60601 USA
006: * All rights reserved.
007: *
008: * Redistribution and use in source and binary forms, with or without
009: * modification, are permitted provided that the following conditions
010: * are met:
011: *
012: * + Redistributions of source code must retain the above copyright
013: * notice, this list of conditions and the following disclaimer.
014: *
015: * + Redistributions in binary form must reproduce the above
016: * copyright notice, this list of conditions and the following
017: * disclaimer in the documentation and/or other materials provided
018: * with the distribution.
019: *
020: * + Neither the name of ThoughtWorks, Inc., CruiseControl, nor the
021: * names of its contributors may be used to endorse or promote
022: * products derived from this software without specific prior
023: * written permission.
024: *
025: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
026: * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
027: * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
028: * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR
029: * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
030: * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
031: * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
032: * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
033: * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
034: * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
035: * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
036: ********************************************************************************/package net.sourceforge.cruisecontrol.util;
037:
038: import junit.framework.Assert;
039:
040: import java.io.InputStream;
041: import java.io.OutputStream;
042: import java.util.Arrays;
043:
044: /**
045: * Mocks Commandline objects.
046: *
047: * @author jerome@coffeebreaks.org
048: */
049: public class MockCommandline extends Commandline {
050:
051: // private static final Logger LOG = Logger.getLogger(Commandline.class);
052:
053: private String[] expectedCommandline;
054: private String expectedWorkingDirectory;
055: private InputStream processErrorStream = null;
056: private InputStream processInputStream = null;
057: private OutputStream processOutputStream = null;
058: private boolean assertCorrectCommandline = true;
059:
060: public MockCommandline() {
061: }
062:
063: /**
064: * @param expectedCommandline The expectedCommandline to set.
065: */
066: public void setExpectedCommandline(String[] expectedCommandline) {
067: this .expectedCommandline = expectedCommandline;
068: }
069:
070: /**
071: * @param expectedWorkingDirectory The expectedWorkingDirectory to set.
072: */
073: public void setExpectedWorkingDirectory(
074: String expectedWorkingDirectory) {
075: this .expectedWorkingDirectory = expectedWorkingDirectory;
076: }
077:
078: /**
079: * @param processErrorStream The processErrorStream to set.
080: */
081: public void setProcessErrorStream(InputStream processErrorStream) {
082: this .processErrorStream = processErrorStream;
083: }
084:
085: /**
086: * @param processInputStream The processInputStream to set.
087: */
088: public void setProcessInputStream(InputStream processInputStream) {
089: this .processInputStream = processInputStream;
090: }
091:
092: /**
093: * @param processOutputStream The processOutputStream to set.
094: */
095: public void setProcessOutputStream(OutputStream processOutputStream) {
096: this .processOutputStream = processOutputStream;
097: }
098:
099: /**
100: * Do not perform assertions.
101: * @param assertCorrectCommandline
102: */
103: public void setAssertCorrectCommandline(
104: boolean assertCorrectCommandline) {
105: this .assertCorrectCommandline = assertCorrectCommandline;
106: }
107:
108: public void ensureCommandline() {
109: if (!Arrays.equals(expectedCommandline, getCommandline())) {
110: Assert.fail("Command line error expected: "
111: + buildString(expectedCommandline) + " - got: "
112: + buildString(getCommandline()));
113: }
114: }
115:
116: public void ensureWorkingDirectory() {
117: Assert.assertEquals("WorkingDirectory error",
118: expectedWorkingDirectory, getWorkingDirectory());
119: }
120:
121: private static final String buildString(String[] array) {
122: if (array == null) {
123: return "null";
124: }
125: StringBuffer sb = new StringBuffer();
126: for (int i = 0; i < array.length; i++) {
127: sb.append(array[i]).append(" ");
128: }
129: return sb.toString();
130: }
131:
132: /**
133: * Fakes the execution of the command.
134: * Checks that the command line and the working directory are correctly set / computed.
135: *
136: * @return a MockProcess that uses the streams registered with that instance.
137: */
138: public Process execute() {
139:
140: if (assertCorrectCommandline) {
141: ensureCommandline();
142: ensureWorkingDirectory();
143: }
144:
145: MockProcess process = getMockProcess();
146: process.setErrorStream(processErrorStream);
147: process.setInputStream(processInputStream);
148: process.setOutputStream(processOutputStream);
149:
150: return process;
151: }
152:
153: protected MockProcess getMockProcess() {
154: return new MockProcess();
155: }
156:
157: }
|