| <?xml version="1.0"?>
|
| <!-- |
| Copyright 2002-2004 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. |
| --> |
| <test:suite xmlns="jelly:core" xmlns:test="jelly:junit" xmlns:threads="jelly:threads">
|
| <test:case name="testBasic">
|
| <set var="result" value=""/>
|
|
|
| <threads:thread var="thread1">
|
| <threads:sleep for="700"/>
|
| <set var="result" value="${result}1"/>
|
| <test:assertEquals expected="4321" actual="${result}"/>
|
| </threads:thread>
|
|
|
| <threads:thread>
|
| <threads:sleep for="400"/>
|
| <set var="result" value="${result}2"/>
|
| </threads:thread>
|
|
|
| <threads:thread>
|
| <threads:sleep for="100"/>
|
| <set var="result" value="${result}3"/>
|
| </threads:thread>
|
|
|
| <threads:thread>
|
| <set var="result" value="${result}4"/>
|
| </threads:thread>
|
| </test:case>
|
|
|
| <test:case name="testSync">
|
| <set var="result" value=""/>
|
| <threads:mutex var="mutex"/>
|
|
|
| <threads:thread var="thread1">
|
| <threads:synchronize mutex="${mutex}">
|
| <set var="cnt1" value="0"/>
|
| <while test="${cnt1 != 5}">
|
| <set var="result" value="${result}${cnt1}"/>
|
| <set var="cnt1" value="${cnt1 + 1}"/>
|
| <threads:interrupt/>
|
| </while>
|
| </threads:synchronize>
|
| </threads:thread>
|
|
|
| <threads:thread var="thread2">
|
| <!-- let the other thread start -->
|
| <threads:sleep for="100"/>
|
| <threads:synchronize mutex="${mutex}">
|
| <set var="cnt2" value="5"/>
|
| <while test="${cnt2 != 10}">
|
| <set var="result" value="${result}${cnt2}"/>
|
| <set var="cnt2" value="${cnt2 + 1}"/>
|
| <threads:interrupt/>
|
| </while>
|
| </threads:synchronize>
|
| </threads:thread>
|
|
|
| <threads:join thread="${thread1}"/>
|
| <threads:join thread="${thread2}"/>
|
| <test:assertEquals expected="0123456789" actual="${result}"/>
|
| </test:case>
|
|
|
| <test:case name="testWaitNotify">
|
| <set var="result" value=""/>
|
| <threads:mutex var="mutex"/>
|
|
|
| <threads:thread var="thread1">
|
| <threads:synchronize mutex="${mutex}">
|
| <set var="cnt1" value="0"/>
|
| <while test="${cnt1 != 5}">
|
| <set var="result" value="${result}${cnt1}"/>
|
| <set var="cnt1" value="${cnt1 + 1}"/>
|
| <!-- let the other thread go -->
|
| <threads:notify mutex="${mutex}"/>
|
| <threads:wait mutex="${mutex}"/>
|
| </while>
|
| <!-- one last notify -->
|
| <threads:notify mutex="${mutex}"/>
|
| </threads:synchronize>
|
| </threads:thread>
|
|
|
| <threads:thread var="thread2">
|
| <!-- let the other thread start -->
|
| <threads:sleep for="100"/>
|
| <threads:synchronize mutex="${mutex}">
|
| <set var="cnt2" value="0"/>
|
| <while test="${cnt2 != 5}">
|
| <set var="result" value="${result}${cnt2}"/>
|
| <set var="cnt2" value="${cnt2 + 1}"/>
|
| <!-- let the other thread go -->
|
| <threads:notify mutex="${mutex}"/>
|
| <threads:wait mutex="${mutex}"/>
|
| </while>
|
| <!-- one last notify -->
|
| <threads:notify mutex="${mutex}"/>
|
| </threads:synchronize>
|
| </threads:thread>
|
|
|
| <threads:join thread="${thread1}"/>
|
| <threads:join thread="${thread2}"/>
|
| <test:assertEquals expected="0011223344" actual="${result}"/>
|
| </test:case>
|
|
|
| <test:case name="testWaitFor">
|
| <set var="result" value=""/>
|
|
|
| <threads:thread var="thread1">
|
| <set var="cnt1" value="0"/>
|
| <while test="${cnt1 != 5}">
|
| <set var="result" value="${result}${cnt1}"/>
|
| <set var="cnt1" value="${cnt1 + 1}"/>
|
| <!-- force an interrupt, shouldn't matter -->
|
| <threads:interrupt/>
|
| </while>
|
| </threads:thread>
|
|
|
| <threads:thread var="thread2">
|
| <threads:waitfor thread="${thread1}"/>
|
| <set var="cnt2" value="5"/>
|
| <while test="${cnt2 != 10}">
|
| <set var="result" value="${result}${cnt2}"/>
|
| <set var="cnt2" value="${cnt2 + 1}"/>
|
| </while>
|
| </threads:thread>
|
|
|
| <threads:join thread="${thread1}"/>
|
| <threads:join thread="${thread2}"/>
|
| <test:assertEquals expected="0123456789" actual="${result}"/>
|
| </test:case>
|
|
|
| <test:case name="testWaitForTimeout">
|
| <set var="result" value=""/>
|
|
|
| <threads:thread var="thread1">
|
| <set var="cnt1" value="0"/>
|
| <while test="${cnt1 != 5}">
|
| <set var="result" value="${result}${cnt1}"/>
|
| <set var="cnt1" value="${cnt1 + 1}"/>
|
| <!-- force an interrupt, shouldn't matter -->
|
| <threads:sleep for="500"/>
|
| </while>
|
| </threads:thread>
|
|
|
| <threads:thread var="thread2">
|
| <!-- this will fail since thread 1 is sleeping -->
|
| <threads:waitfor thread="${thread1}" onlyWait="100"/>
|
| <set var="cnt2" value="5"/>
|
| <while test="${cnt2 != 10}">
|
| <set var="result" value="${result}${cnt2}"/>
|
| <set var="cnt2" value="${cnt2 + 1}"/>
|
| </while>
|
| </threads:thread>
|
|
|
| <threads:thread var="thread3">
|
| <threads:waitfor thread="${thread1}"/>
|
| <!-- thread2 will have been avoided -->
|
| <threads:waitfor thread="${thread2}" status="AVOIDED"/>
|
| <set var="cnt2" value="10"/>
|
| <while test="${cnt2 != 15}">
|
| <set var="result" value="${result}${cnt2}"/>
|
| <set var="cnt2" value="${cnt2 + 1}"/>
|
| </while>
|
| </threads:thread>
|
|
|
| <threads:join thread="${thread1}"/>
|
| <threads:join thread="${thread2}"/>
|
| <threads:join thread="${thread3}"/>
|
| <test:assertEquals expected="012341011121314" actual="${result}"/>
|
| </test:case>
|
|
|
| <test:case name="testWaitForFailure">
|
| <set var="result" value=""/>
|
|
|
| <threads:thread var="thread1">
|
| THROW AN EXCEPTION
|
| <new var="bogus" className="java.lang.System"/>
|
| </threads:thread>
|
|
|
| <threads:thread var="thread2">
|
| <!-- this will fail since thread 1 is sleeping -->
|
| <threads:waitfor thread="${thread1}" status="SUCCESS"/>
|
| <set var="cnt2" value="5"/>
|
| <while test="${cnt2 != 10}">
|
| <set var="result" value="${result}${cnt2}"/>
|
| <set var="cnt2" value="${cnt2 + 1}"/>
|
| </while>
|
| </threads:thread>
|
|
|
| <threads:thread var="thread3">
|
| <!-- this will fail since thread 1 is sleeping -->
|
| <threads:waitfor thread="${thread1}" status="FAILURE"/>
|
| <set var="cnt2" value="10"/>
|
| <while test="${cnt2 != 15}">
|
| <set var="result" value="${result}${cnt2}"/>
|
| <set var="cnt2" value="${cnt2 + 1}"/>
|
| </while>
|
| </threads:thread>
|
|
|
| <threads:join thread="${thread1}"/>
|
| <threads:join thread="${thread2}"/>
|
| <threads:join thread="${thread3}"/>
|
| <test:assertEquals expected="1011121314" actual="${result}"/>
|
| </test:case>
|
|
|
| <test:case name="testThreadGroup">
|
| <set var="result" value=""/>
|
|
|
| <threads:group var="group1">
|
| <threads:thread var="thread1">
|
| <!-- let thread 3 try and go -->
|
| <threads:sleep for="100"/>
|
| <set var="result" value="${result}1"/>
|
| </threads:thread>
|
|
|
| <threads:thread>
|
| <threads:waitFor thread="${thread1}"/>
|
| <!-- let thread 3 try and go -->
|
| <threads:sleep for="100"/>
|
| <set var="result" value="${result}2"/>
|
| </threads:thread>
|
| </threads:group>
|
|
|
| <threads:thread>
|
| <!-- wait for the thread group to complete -->
|
| <threads:waitFor group="${group1}"/>
|
| <set var="result" value="${result}3"/>
|
| <test:assertEquals expected="123" actual="${result}"/>
|
| </threads:thread>
|
| </test:case>
|
|
|
| </test:suite>
|