KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > apache > tools > ant > taskdefs > ParallelTest


1 /*
2  * Copyright 2002-2004 The Apache Software Foundation
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *
16  */

17 package org.apache.tools.ant.taskdefs;
18 import java.io.PrintStream JavaDoc;
19 import junit.framework.AssertionFailedError;
20 import org.apache.tools.ant.BuildException;
21
22 import org.apache.tools.ant.BuildFileTest;
23 import org.apache.tools.ant.DemuxOutputStream;
24 import org.apache.tools.ant.Project;
25 import org.apache.tools.ant.Task;
26
27 /**
28  * Test of the parallel TaskContainer
29  *
30  * @created 21 February 2002
31  */

32 public class ParallelTest extends BuildFileTest {
33     /** Standard property value for the basic test */
34     public final static String JavaDoc DIRECT_MESSAGE = "direct";
35     /** Standard property value for the basic and fail test */
36     public final static String JavaDoc DELAYED_MESSAGE = "delayed";
37     /** Standard property value for the fail test */
38     public final static String JavaDoc FAILURE_MESSAGE = "failure";
39
40     /** the build fiel associated with this test */
41     public final static String JavaDoc TEST_BUILD_FILE
42          = "src/etc/testcases/taskdefs/parallel.xml";
43
44     /**
45      * Constructor for the ParallelTest object
46      *
47      * @param name name of the test
48      */

49     public ParallelTest(String JavaDoc name) {
50         super(name);
51     }
52
53     /** The JUnit setup method */
54     public void setUp() {
55         configureProject(TEST_BUILD_FILE);
56     }
57
58     /** tests basic operation of the parallel task */
59     public void testBasic() {
60         // should get no output at all
61
Project project = getProject();
62         project.setUserProperty("test.direct", DIRECT_MESSAGE);
63         project.setUserProperty("test.delayed", DELAYED_MESSAGE);
64         expectOutputAndError("testBasic", "", "");
65         String JavaDoc log = getLog();
66         assertEquals("parallel tasks didn't output correct data", log,
67             DIRECT_MESSAGE + DELAYED_MESSAGE);
68
69     }
70
71     /** tests basic operation of the parallel task */
72     public void testThreadCount() {
73         // should get no output at all
74
Project project = getProject();
75         project.setUserProperty("test.direct", DIRECT_MESSAGE);
76         project.setUserProperty("test.delayed", DELAYED_MESSAGE);
77         expectOutputAndError("testThreadCount", "", "");
78         String JavaDoc log = getLog();
79         int pos = 0;
80         while (pos > -1) {
81             pos = countThreads(log, pos);
82         }
83     }
84
85     /**
86      * the test result string should match the regex
87      * <code>^(\|\d+\/(+-)*)+\|$</code> for someting like
88      * <code>|3/++--+-|5/+++++-----|</code>
89      *
90      *@returns -1 no more tests
91      * # start pos of next test
92      *@throws AssertionFailedException when a constraint is invalid
93      */

94     static int countThreads(String JavaDoc s, int start) {
95         int firstPipe = s.indexOf('|', start);
96         int beginSlash = s.indexOf('/', firstPipe);
97         int lastPipe = s.indexOf('|', beginSlash);
98         if ((firstPipe == -1) || (beginSlash == -1) || (lastPipe == -1)) {
99             return -1;
100         }
101
102         int max = Integer.parseInt(s.substring(firstPipe + 1, beginSlash));
103         int current = 0;
104         int pos = beginSlash + 1;
105         while (pos < lastPipe) {
106             switch (s.charAt(pos++)) {
107                 case '+':
108                     current++;
109                     break;
110                 case '-':
111                     current--;
112                     break;
113                 default:
114                     throw new AssertionFailedError("Only expect '+-' in result count, found "
115                         + s.charAt(--pos) + " at position " + pos);
116             }
117             if (current > max) {
118                 throw new AssertionFailedError("Number of executing threads exceeded number allowed: "
119                     + current + " > " + max);
120             }
121         }
122         return lastPipe;
123     }
124
125
126     /** tests the failure of a task within a parallel construction */
127     public void testFail() {
128         // should get no output at all
129
Project project = getProject();
130         project.setUserProperty("test.failure", FAILURE_MESSAGE);
131         project.setUserProperty("test.delayed", DELAYED_MESSAGE);
132         expectBuildExceptionContaining("testFail",
133             "fail task in one parallel branch", FAILURE_MESSAGE);
134     }
135
136     /** tests the demuxing of output streams in a multithreaded situation */
137     public void testDemux() {
138         Project project = getProject();
139         project.addTaskDefinition("demuxtest", DemuxOutputTask.class);
140         PrintStream JavaDoc out = System.out;
141         PrintStream JavaDoc err = System.err;
142         System.setOut(new PrintStream JavaDoc(new DemuxOutputStream(project, false)));
143         System.setErr(new PrintStream JavaDoc(new DemuxOutputStream(project, true)));
144
145         try {
146             project.executeTarget("testDemux");
147         } finally {
148             System.setOut(out);
149             System.setErr(err);
150         }
151     }
152
153 }
154
155
Popular Tags