-
Notifications
You must be signed in to change notification settings - Fork 331
/
EasyDccSimulatorTrafficControllerTest.java
184 lines (152 loc) · 5.58 KB
/
EasyDccSimulatorTrafficControllerTest.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
package jmri.jmrix.easydcc.simulator;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
import java.util.Vector;
import jmri.util.JUnitUtil;
import jmri.jmrix.easydcc.EasyDccMessage;
import jmri.jmrix.easydcc.EasyDccListener;
import jmri.jmrix.easydcc.EasyDccReply;
import jmri.jmrix.easydcc.EasyDccPortController;
import jmri.jmrix.easydcc.EasyDccSystemConnectionMemo;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.Rule;
import jmri.util.junit.rules.RetryRule;
import org.junit.rules.Timeout;
/**
* JUnit tests for the EasyDccSimulatorTrafficController class
*
* @author Bob Jacobsen Copyright (C) 2003, 2007, 2015
*/
public class EasyDccSimulatorTrafficControllerTest extends jmri.jmrix.AbstractMRTrafficControllerTest {
@Rule
public Timeout globalTimeout = Timeout.seconds(90); // 90 second timeout for methods in this test class.
@Rule
public RetryRule retryRule = new RetryRule(3); // allow 3 retries
@Test
public void testSendThenRcvReply() throws Exception {
EasyDccSimulatorTrafficController c = new EasyDccSimulatorTrafficController(new EasyDccSystemConnectionMemo("E", "EasyDCC Test")){
@Override
protected void terminate(){
// do nothing, so we don't try to write to a closed pipe
// after this test
}
};
// connect to iostream via port controller
EasyDccPortControllerScaffold p = new EasyDccPortControllerScaffold();
c.connectPort(p);
// object to receive reply
EasyDccListener l = new EasyDccListenerScaffold();
c.addEasyDccListener(l);
// send a message
EasyDccMessage m = new EasyDccMessage(3);
m.setOpCode('0');
m.setElement(1, '1');
m.setElement(2, '2');
c.sendEasyDccMessage(m, l);
ostream.flush();
JUnitUtil.waitFor(()->{return tostream.available() == 4;}, "total length");
// test the result of sending
Assert.assertEquals("total length ", 4, tostream.available());
Assert.assertEquals("Char 0", '0', tostream.readByte());
Assert.assertEquals("Char 1", '1', tostream.readByte());
Assert.assertEquals("Char 2", '2', tostream.readByte());
Assert.assertEquals("EOM", 0x0d, tostream.readByte());
// now send reply
tistream.write('P');
tistream.write(0x0d);
// threading causes the traffic controller to handle the reply,
// so wait until that happens.
JUnitUtil.waitFor(()->{return rcvdReply != null;}, "reply received");
Assert.assertTrue("reply received ", rcvdReply != null);
Assert.assertEquals("first char of reply ", 'P', rcvdReply.getOpCode());
c.terminateThreads(); // stop any threads we might have created.
}
// internal class to simulate an EasyDccListener
class EasyDccListenerScaffold implements EasyDccListener {
public EasyDccListenerScaffold() {
rcvdReply = null;
rcvdMsg = null;
}
@Override
public void message(EasyDccMessage m) {
rcvdMsg = m;
}
@Override
public void reply(EasyDccReply r) {
rcvdReply = r;
}
}
EasyDccReply rcvdReply;
EasyDccMessage rcvdMsg;
// internal class to simulate an EasyDccPortController
class EasyDccPortControllerScaffold extends EasyDccPortController {
@Override
public Vector<String> getPortNames() {
return null;
}
@Override
public String openPort(String portName, String appName) {
return null;
}
@Override
public void configure() {
}
@Override
public String[] validBaudRates() {
return null;
}
//@Override
public int[] validBaudNumbers() {
return null;
}
protected EasyDccPortControllerScaffold() throws Exception {
super(new EasyDccSystemConnectionMemo());
PipedInputStream tempPipe;
tempPipe = new PipedInputStream();
tostream = new DataInputStream(tempPipe);
ostream = new DataOutputStream(new PipedOutputStream(tempPipe));
tempPipe = new PipedInputStream();
istream = new DataInputStream(tempPipe);
tistream = new DataOutputStream(new PipedOutputStream(tempPipe));
}
// returns the InputStream from the port
@Override
public DataInputStream getInputStream() {
return istream;
}
// returns the outputStream to the port
@Override
public DataOutputStream getOutputStream() {
return ostream;
}
// check that this object is ready to operate
@Override
public boolean status() {
return true;
}
}
DataOutputStream ostream; // Traffic controller writes to this
DataInputStream tostream; // so we can read it from this
DataOutputStream tistream; // tests write to this
DataInputStream istream; // so the traffic controller can read from this
// The minimal setup for log4J
@Override
@Before
public void setUp() {
jmri.util.JUnitUtil.setUp();
tc = new EasyDccSimulatorTrafficController(new EasyDccSystemConnectionMemo("E", "EasyDCC Test"));
}
@Override
@After
public void tearDown() {
if (tc!=null) {
tc.terminateThreads();
}
jmri.util.JUnitUtil.tearDown();
}
}