xref: /aosp_15_r20/external/scapy/test/pipetool.uts (revision 7dc08ffc4802948ccbc861daaf1e81c405c2c4bd)
1*7dc08ffcSJunyu Lai########################
2*7dc08ffcSJunyu Lai% Pipetool related tests
3*7dc08ffcSJunyu Lai########################
4*7dc08ffcSJunyu Lai
5*7dc08ffcSJunyu Lai+ Basic tests
6*7dc08ffcSJunyu Lai
7*7dc08ffcSJunyu Lai= Test default test case
8*7dc08ffcSJunyu Lai
9*7dc08ffcSJunyu Lais = PeriodicSource("hello", 1, name="src")
10*7dc08ffcSJunyu Laid1 = Drain(name="d1")
11*7dc08ffcSJunyu Laic = ConsoleSink(name="c")
12*7dc08ffcSJunyu Laitf = TransformDrain(lambda x: "Got %s" % x)
13*7dc08ffcSJunyu Lait = TermSink(name="PipeToolsPeriodicTest", keepterm=False)
14*7dc08ffcSJunyu Lais > d1 > c
15*7dc08ffcSJunyu Laid1 > tf > t
16*7dc08ffcSJunyu Lai
17*7dc08ffcSJunyu Laip = PipeEngine(s)
18*7dc08ffcSJunyu Laip.start()
19*7dc08ffcSJunyu Laitime.sleep(3)
20*7dc08ffcSJunyu Lais.msg = []
21*7dc08ffcSJunyu Laip.stop()
22*7dc08ffcSJunyu Lai
23*7dc08ffcSJunyu Laitry:
24*7dc08ffcSJunyu Lai    os.remove("test.png")
25*7dc08ffcSJunyu Laiexcept OSError:
26*7dc08ffcSJunyu Lai    pass
27*7dc08ffcSJunyu Lai
28*7dc08ffcSJunyu Lai= Test add_pipe
29*7dc08ffcSJunyu Lai
30*7dc08ffcSJunyu Lais = AutoSource()
31*7dc08ffcSJunyu Laip = PipeEngine(s)
32*7dc08ffcSJunyu Laip.add(Pipe())
33*7dc08ffcSJunyu Laiassert len(p.active_pipes) == 2
34*7dc08ffcSJunyu Lai
35*7dc08ffcSJunyu Laix = p.spawn_Pipe()
36*7dc08ffcSJunyu Laiassert len(p.active_pipes) == 3
37*7dc08ffcSJunyu Laiassert isinstance(x, Pipe)
38*7dc08ffcSJunyu Lai
39*7dc08ffcSJunyu Lai= Test exhausted source
40*7dc08ffcSJunyu Lai
41*7dc08ffcSJunyu Lais = AutoSource()
42*7dc08ffcSJunyu Lais._gen_data("hello")
43*7dc08ffcSJunyu Lais.is_exhausted = True
44*7dc08ffcSJunyu Laid1 = Drain(name="d1")
45*7dc08ffcSJunyu Laic = ConsoleSink(name="c")
46*7dc08ffcSJunyu Lais > d1 > c
47*7dc08ffcSJunyu Lai
48*7dc08ffcSJunyu Laip = PipeEngine(s)
49*7dc08ffcSJunyu Laip.start()
50*7dc08ffcSJunyu Laip.wait_and_stop()
51*7dc08ffcSJunyu Lai
52*7dc08ffcSJunyu Lai= Test add_pipe on running instance
53*7dc08ffcSJunyu Lai
54*7dc08ffcSJunyu Laip = PipeEngine()
55*7dc08ffcSJunyu Laip.start()
56*7dc08ffcSJunyu Lai
57*7dc08ffcSJunyu Lais = CLIFeeder()
58*7dc08ffcSJunyu Lai
59*7dc08ffcSJunyu Laid1 = Drain(name="d1")
60*7dc08ffcSJunyu Laic = QueueSink(name="c")
61*7dc08ffcSJunyu Lais > d1 > c
62*7dc08ffcSJunyu Lai
63*7dc08ffcSJunyu Laip.add(s)
64*7dc08ffcSJunyu Lai
65*7dc08ffcSJunyu Lais.send("hello")
66*7dc08ffcSJunyu Lais.send("hi")
67*7dc08ffcSJunyu Lai
68*7dc08ffcSJunyu Laiassert c.q.get(timeout=5) == "hello"
69*7dc08ffcSJunyu Laiassert c.q.get(timeout=5) == "hi"
70*7dc08ffcSJunyu Lai
71*7dc08ffcSJunyu Laip.stop()
72*7dc08ffcSJunyu Lai
73*7dc08ffcSJunyu Lai= Test Operators
74*7dc08ffcSJunyu Lai
75*7dc08ffcSJunyu Lais = AutoSource()
76*7dc08ffcSJunyu Laip = PipeEngine(s)
77*7dc08ffcSJunyu Laiassert p == p
78*7dc08ffcSJunyu Lai
79*7dc08ffcSJunyu Laia = AutoSource()
80*7dc08ffcSJunyu Laib = AutoSource()
81*7dc08ffcSJunyu Laia >> b
82*7dc08ffcSJunyu Laiassert len(a.high_sinks) == 1
83*7dc08ffcSJunyu Laiassert len(a.high_sources) == 0
84*7dc08ffcSJunyu Laiassert len(b.high_sinks) == 0
85*7dc08ffcSJunyu Laiassert len(b.high_sources) == 1
86*7dc08ffcSJunyu Laia
87*7dc08ffcSJunyu Laib
88*7dc08ffcSJunyu Lai
89*7dc08ffcSJunyu Laia = AutoSource()
90*7dc08ffcSJunyu Laib = AutoSource()
91*7dc08ffcSJunyu Laia << b
92*7dc08ffcSJunyu Laiassert len(a.high_sinks) == 0
93*7dc08ffcSJunyu Laiassert len(a.high_sources) == 1
94*7dc08ffcSJunyu Laiassert len(b.high_sinks) == 1
95*7dc08ffcSJunyu Laiassert len(b.high_sources) == 0
96*7dc08ffcSJunyu Laia
97*7dc08ffcSJunyu Laib
98*7dc08ffcSJunyu Lai
99*7dc08ffcSJunyu Laia = AutoSource()
100*7dc08ffcSJunyu Laib = AutoSource()
101*7dc08ffcSJunyu Laia == b
102*7dc08ffcSJunyu Laiassert len(a.sinks) == 1
103*7dc08ffcSJunyu Laiassert len(a.sources) == 1
104*7dc08ffcSJunyu Laiassert len(b.sinks) == 1
105*7dc08ffcSJunyu Laiassert len(b.sources) == 1
106*7dc08ffcSJunyu Lai
107*7dc08ffcSJunyu Laia = AutoSource()
108*7dc08ffcSJunyu Laib = AutoSource()
109*7dc08ffcSJunyu Laia//b
110*7dc08ffcSJunyu Laiassert len(a.high_sinks) == 1
111*7dc08ffcSJunyu Laiassert len(a.high_sources) == 1
112*7dc08ffcSJunyu Laiassert len(b.high_sinks) == 1
113*7dc08ffcSJunyu Laiassert len(b.high_sources) == 1
114*7dc08ffcSJunyu Lai
115*7dc08ffcSJunyu Laia = AutoSource()
116*7dc08ffcSJunyu Laib = AutoSource()
117*7dc08ffcSJunyu Laia^b
118*7dc08ffcSJunyu Laiassert len(b.trigger_sources) == 1
119*7dc08ffcSJunyu Laiassert len(a.trigger_sinks) == 1
120*7dc08ffcSJunyu Lai
121*7dc08ffcSJunyu Lai= Test doc
122*7dc08ffcSJunyu Lai
123*7dc08ffcSJunyu Lais = AutoSource()
124*7dc08ffcSJunyu Laip = PipeEngine(s)
125*7dc08ffcSJunyu Laip.list_pipes()
126*7dc08ffcSJunyu Laip.list_pipes_detailed()
127*7dc08ffcSJunyu Lai
128*7dc08ffcSJunyu Lai= Test RawConsoleSink with CLIFeeder
129*7dc08ffcSJunyu Lai
130*7dc08ffcSJunyu Laip = PipeEngine()
131*7dc08ffcSJunyu Lai
132*7dc08ffcSJunyu Lais = CLIFeeder()
133*7dc08ffcSJunyu Lais.send("hello")
134*7dc08ffcSJunyu Lais.is_exhausted = True
135*7dc08ffcSJunyu Lai
136*7dc08ffcSJunyu Lair, w = os.pipe()
137*7dc08ffcSJunyu Lai
138*7dc08ffcSJunyu Laid1 = Drain(name="d1")
139*7dc08ffcSJunyu Laic = RawConsoleSink(name="c")
140*7dc08ffcSJunyu Laic._write_pipe = w
141*7dc08ffcSJunyu Lais > d1 > c
142*7dc08ffcSJunyu Lai
143*7dc08ffcSJunyu Laip.add(s)
144*7dc08ffcSJunyu Laip.start()
145*7dc08ffcSJunyu Lai
146*7dc08ffcSJunyu Laiassert os.read(r, 20) == b"hello\n"
147*7dc08ffcSJunyu Laip.wait_and_stop()
148*7dc08ffcSJunyu Lai
149*7dc08ffcSJunyu Lai= Test QueueSink with CLIFeeder
150*7dc08ffcSJunyu Lai
151*7dc08ffcSJunyu Laip = PipeEngine()
152*7dc08ffcSJunyu Lai
153*7dc08ffcSJunyu Lais = CLIFeeder()
154*7dc08ffcSJunyu Lais.send("hello")
155*7dc08ffcSJunyu Lais.is_exhausted = True
156*7dc08ffcSJunyu Lai
157*7dc08ffcSJunyu Laid1 = Drain(name="d1")
158*7dc08ffcSJunyu Laic = QueueSink(name="c")
159*7dc08ffcSJunyu Lais > d1 > c
160*7dc08ffcSJunyu Lai
161*7dc08ffcSJunyu Laip.add(s)
162*7dc08ffcSJunyu Laip.start()
163*7dc08ffcSJunyu Lai
164*7dc08ffcSJunyu Laip.wait_and_stop()
165*7dc08ffcSJunyu Laiassert c.recv() == "hello"
166*7dc08ffcSJunyu Lai
167*7dc08ffcSJunyu Lai= Test UpDrain
168*7dc08ffcSJunyu Lai
169*7dc08ffcSJunyu Laitest_val = None
170*7dc08ffcSJunyu Lai
171*7dc08ffcSJunyu Laiclass TestSink(Sink):
172*7dc08ffcSJunyu Lai    def high_push(self, msg):
173*7dc08ffcSJunyu Lai        global test_val
174*7dc08ffcSJunyu Lai        test_val = msg
175*7dc08ffcSJunyu Lai
176*7dc08ffcSJunyu Laip = PipeEngine()
177*7dc08ffcSJunyu Lai
178*7dc08ffcSJunyu Lais = CLIFeeder()
179*7dc08ffcSJunyu Lais.send("hello")
180*7dc08ffcSJunyu Lais.is_exhausted = True
181*7dc08ffcSJunyu Lai
182*7dc08ffcSJunyu Laid1 = UpDrain(name="d1")
183*7dc08ffcSJunyu Laic = TestSink(name="c")
184*7dc08ffcSJunyu Lais > d1
185*7dc08ffcSJunyu Laid1 >> c
186*7dc08ffcSJunyu Lai
187*7dc08ffcSJunyu Laip.add(s)
188*7dc08ffcSJunyu Laip.start()
189*7dc08ffcSJunyu Lai
190*7dc08ffcSJunyu Laip.wait_and_stop()
191*7dc08ffcSJunyu Laiassert test_val == "hello"
192*7dc08ffcSJunyu Lai
193*7dc08ffcSJunyu Lai= Test DownDrain
194*7dc08ffcSJunyu Lai
195*7dc08ffcSJunyu Laitest_val = None
196*7dc08ffcSJunyu Lai
197*7dc08ffcSJunyu Laiclass TestSink(Sink):
198*7dc08ffcSJunyu Lai    def push(self, msg):
199*7dc08ffcSJunyu Lai        global test_val
200*7dc08ffcSJunyu Lai        test_val = msg
201*7dc08ffcSJunyu Lai
202*7dc08ffcSJunyu Laip = PipeEngine()
203*7dc08ffcSJunyu Lai
204*7dc08ffcSJunyu Lais = CLIHighFeeder()
205*7dc08ffcSJunyu Lais.send("hello")
206*7dc08ffcSJunyu Lais.is_exhausted = True
207*7dc08ffcSJunyu Lai
208*7dc08ffcSJunyu Laid1 = DownDrain(name="d1")
209*7dc08ffcSJunyu Laic = TestSink(name="c")
210*7dc08ffcSJunyu Lais >> d1
211*7dc08ffcSJunyu Laid1 > c
212*7dc08ffcSJunyu Lai
213*7dc08ffcSJunyu Laip.add(s)
214*7dc08ffcSJunyu Laip.start()
215*7dc08ffcSJunyu Lai
216*7dc08ffcSJunyu Laip.wait_and_stop()
217*7dc08ffcSJunyu Laiassert test_val == "hello"
218*7dc08ffcSJunyu Lai
219*7dc08ffcSJunyu Lai+ Advanced ScapyPipes pipetools tests
220*7dc08ffcSJunyu Lai
221*7dc08ffcSJunyu Lai= Test SniffSource
222*7dc08ffcSJunyu Lai~ netaccess
223*7dc08ffcSJunyu Lai
224*7dc08ffcSJunyu Laip = PipeEngine()
225*7dc08ffcSJunyu Lai
226*7dc08ffcSJunyu Lais = SniffSource()
227*7dc08ffcSJunyu Laid1 = Drain(name="d1")
228*7dc08ffcSJunyu Laic = QueueSink(name="c")
229*7dc08ffcSJunyu Lais > d1 > c
230*7dc08ffcSJunyu Lai
231*7dc08ffcSJunyu Laip.add(s)
232*7dc08ffcSJunyu Laip.start()
233*7dc08ffcSJunyu Laisniff(count=3)
234*7dc08ffcSJunyu Laip.stop()
235*7dc08ffcSJunyu Laiassert c.q.get()
236*7dc08ffcSJunyu Lai
237*7dc08ffcSJunyu Lai= Test exhausted AutoSource and SniffSource
238*7dc08ffcSJunyu Lai
239*7dc08ffcSJunyu Laiimport mock
240*7dc08ffcSJunyu Laifrom scapy.error import Scapy_Exception
241*7dc08ffcSJunyu Lai
242*7dc08ffcSJunyu Laidef _fail():
243*7dc08ffcSJunyu Lai    raise Scapy_Exception()
244*7dc08ffcSJunyu Lai
245*7dc08ffcSJunyu Laia = AutoSource()
246*7dc08ffcSJunyu Laia._send = mock.MagicMock(side_effect=_fail)
247*7dc08ffcSJunyu Laia._wake_up()
248*7dc08ffcSJunyu Laitry:
249*7dc08ffcSJunyu Lai    a.deliver()
250*7dc08ffcSJunyu Laiexcept:
251*7dc08ffcSJunyu Lai    pass
252*7dc08ffcSJunyu Lai
253*7dc08ffcSJunyu Lais = SniffSource()
254*7dc08ffcSJunyu Lais.s = mock.MagicMock()
255*7dc08ffcSJunyu Lais.s.recv = mock.MagicMock(side_effect=_fail)
256*7dc08ffcSJunyu Laitry:
257*7dc08ffcSJunyu Lai    s.deliver()
258*7dc08ffcSJunyu Laiexcept:
259*7dc08ffcSJunyu Lai    pass
260*7dc08ffcSJunyu Lai
261*7dc08ffcSJunyu Lai= Test RdpcapSource and WrpcapSink
262*7dc08ffcSJunyu Lai~ needs_root
263*7dc08ffcSJunyu Lai
264*7dc08ffcSJunyu Laireq = Ether()/IP()/ICMP()
265*7dc08ffcSJunyu Lairpy = Ether()/IP('E\x00\x00\x1c\x00\x00\x00\x004\x01\x1d\x04\xd8:\xd0\x83\xc0\xa8\x00w\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
266*7dc08ffcSJunyu Lai
267*7dc08ffcSJunyu Laiwrpcap("t.pcap", [req, rpy])
268*7dc08ffcSJunyu Lai
269*7dc08ffcSJunyu Laip = PipeEngine()
270*7dc08ffcSJunyu Lai
271*7dc08ffcSJunyu Lais = RdpcapSource("t.pcap")
272*7dc08ffcSJunyu Laid1 = Drain(name="d1")
273*7dc08ffcSJunyu Laic = WrpcapSink("t2.pcap", name="c")
274*7dc08ffcSJunyu Lais > d1 > c
275*7dc08ffcSJunyu Laip.add(s)
276*7dc08ffcSJunyu Laip.start()
277*7dc08ffcSJunyu Laip.wait_and_stop()
278*7dc08ffcSJunyu Lai
279*7dc08ffcSJunyu Lairesults = rdpcap("t2.pcap")
280*7dc08ffcSJunyu Lai
281*7dc08ffcSJunyu Laiassert raw(results[0]) == raw(req)
282*7dc08ffcSJunyu Laiassert raw(results[1]) == raw(rpy)
283*7dc08ffcSJunyu Lai
284*7dc08ffcSJunyu Laios.unlink("t.pcap")
285*7dc08ffcSJunyu Laios.unlink("t2.pcap")
286*7dc08ffcSJunyu Lai
287*7dc08ffcSJunyu Lai= Test InjectSink and Inject3Sink
288*7dc08ffcSJunyu Lai~ needs_root
289*7dc08ffcSJunyu Lai
290*7dc08ffcSJunyu Laiimport mock
291*7dc08ffcSJunyu Lai
292*7dc08ffcSJunyu Laia = IP(dst="192.168.0.1")/ICMP()
293*7dc08ffcSJunyu Laimsgs = []
294*7dc08ffcSJunyu Lai
295*7dc08ffcSJunyu Laiclass FakeSocket(object):
296*7dc08ffcSJunyu Lai    def __init__(self, *arg, **karg):
297*7dc08ffcSJunyu Lai        pass
298*7dc08ffcSJunyu Lai    def close(self):
299*7dc08ffcSJunyu Lai        pass
300*7dc08ffcSJunyu Lai    def send(self, msg):
301*7dc08ffcSJunyu Lai        global msgs
302*7dc08ffcSJunyu Lai        msgs.append(msg)
303*7dc08ffcSJunyu Lai
304*7dc08ffcSJunyu Lai@mock.patch("scapy.scapypipes.conf.L2socket", FakeSocket)
305*7dc08ffcSJunyu Lai@mock.patch("scapy.scapypipes.conf.L3socket", FakeSocket)
306*7dc08ffcSJunyu Laidef _inject_sink(i3):
307*7dc08ffcSJunyu Lai    s = CLIFeeder()
308*7dc08ffcSJunyu Lai    s.send(a)
309*7dc08ffcSJunyu Lai    s.is_exhausted = True
310*7dc08ffcSJunyu Lai    d1 = Drain(name="d1")
311*7dc08ffcSJunyu Lai    c = Inject3Sink() if i3 else InjectSink()
312*7dc08ffcSJunyu Lai    s > d1 > c
313*7dc08ffcSJunyu Lai    p = PipeEngine(s)
314*7dc08ffcSJunyu Lai    p.start()
315*7dc08ffcSJunyu Lai    p.wait_and_stop()
316*7dc08ffcSJunyu Lai
317*7dc08ffcSJunyu Lai_inject_sink(False) # InjectSink
318*7dc08ffcSJunyu Lai_inject_sink(True) # Inject3Sink
319*7dc08ffcSJunyu Lai
320*7dc08ffcSJunyu Laiassert msgs == [a,a]
321*7dc08ffcSJunyu Lai
322*7dc08ffcSJunyu Lai= TriggerDrain and TriggeredValve with CLIFeeder
323*7dc08ffcSJunyu Lai
324*7dc08ffcSJunyu Lais = CLIFeeder()
325*7dc08ffcSJunyu Laid1 = TriggerDrain(lambda x:x=="trigger")
326*7dc08ffcSJunyu Laid2 = TriggeredValve()
327*7dc08ffcSJunyu Laic = QueueSink()
328*7dc08ffcSJunyu Lai
329*7dc08ffcSJunyu Lais > d1 > d2 > c
330*7dc08ffcSJunyu Laid1 ^ d2
331*7dc08ffcSJunyu Lai
332*7dc08ffcSJunyu Laip = PipeEngine(s)
333*7dc08ffcSJunyu Laip.start()
334*7dc08ffcSJunyu Lai
335*7dc08ffcSJunyu Lais.send("hello")
336*7dc08ffcSJunyu Lais.send("trigger")
337*7dc08ffcSJunyu Lais.send("hello2")
338*7dc08ffcSJunyu Lais.send("trigger")
339*7dc08ffcSJunyu Lais.send("hello3")
340*7dc08ffcSJunyu Lai
341*7dc08ffcSJunyu Laiassert c.q.get(timeout=5) == "hello"
342*7dc08ffcSJunyu Laiassert c.q.get(timeout=5) == "trigger"
343*7dc08ffcSJunyu Laiassert c.q.get(timeout=5) == "hello3"
344*7dc08ffcSJunyu Lai
345*7dc08ffcSJunyu Laip.stop()
346*7dc08ffcSJunyu Lai
347*7dc08ffcSJunyu Lai= TriggerDrain and TriggeredValve with CLIHighFeeder
348*7dc08ffcSJunyu Lai
349*7dc08ffcSJunyu Lais = CLIHighFeeder()
350*7dc08ffcSJunyu Laid1 = TriggerDrain(lambda x:x=="trigger")
351*7dc08ffcSJunyu Laid2 = TriggeredValve()
352*7dc08ffcSJunyu Laic = QueueSink()
353*7dc08ffcSJunyu Lai
354*7dc08ffcSJunyu Lais >> d1
355*7dc08ffcSJunyu Laid1 >> d2
356*7dc08ffcSJunyu Laid2 >> c
357*7dc08ffcSJunyu Laid1 ^ d2
358*7dc08ffcSJunyu Lai
359*7dc08ffcSJunyu Laip = PipeEngine(s)
360*7dc08ffcSJunyu Laip.start()
361*7dc08ffcSJunyu Lai
362*7dc08ffcSJunyu Lais.send("hello")
363*7dc08ffcSJunyu Lais.send("trigger")
364*7dc08ffcSJunyu Lais.send("hello2")
365*7dc08ffcSJunyu Lais.send("trigger")
366*7dc08ffcSJunyu Lais.send("hello3")
367*7dc08ffcSJunyu Lai
368*7dc08ffcSJunyu Laiassert c.q.get(timeout=5) == "hello"
369*7dc08ffcSJunyu Laiassert c.q.get(timeout=5) == "trigger"
370*7dc08ffcSJunyu Laiassert c.q.get(timeout=5) == "hello3"
371*7dc08ffcSJunyu Lai
372*7dc08ffcSJunyu Laip.stop()
373*7dc08ffcSJunyu Lai
374*7dc08ffcSJunyu Lai= TriggerDrain and TriggeredQueueingValve with CLIFeeder
375*7dc08ffcSJunyu Lai
376*7dc08ffcSJunyu Lais = CLIFeeder()
377*7dc08ffcSJunyu Laid1 = TriggerDrain(lambda x:x=="trigger")
378*7dc08ffcSJunyu Laid2 = TriggeredValve()
379*7dc08ffcSJunyu Laic = QueueSink()
380*7dc08ffcSJunyu Lai
381*7dc08ffcSJunyu Lais > d1 > d2 > c
382*7dc08ffcSJunyu Laid1 ^ d2
383*7dc08ffcSJunyu Lai
384*7dc08ffcSJunyu Laip = PipeEngine(s)
385*7dc08ffcSJunyu Laip.start()
386*7dc08ffcSJunyu Lai
387*7dc08ffcSJunyu Lais.send("hello")
388*7dc08ffcSJunyu Lais.send("trigger")
389*7dc08ffcSJunyu Lais.send("hello2")
390*7dc08ffcSJunyu Lais.send("trigger")
391*7dc08ffcSJunyu Lais.send("hello3")
392*7dc08ffcSJunyu Lai
393*7dc08ffcSJunyu Laiassert c.q.get(timeout=5) == "hello"
394*7dc08ffcSJunyu Laiassert c.q.get(timeout=5) == "trigger"
395*7dc08ffcSJunyu Laiassert c.q.get(timeout=5) == "hello3"
396*7dc08ffcSJunyu Lai
397*7dc08ffcSJunyu Laip.stop()
398*7dc08ffcSJunyu Lai
399*7dc08ffcSJunyu Lai= TriggerDrain and TriggeredSwitch with CLIFeeder on high channel
400*7dc08ffcSJunyu Lai
401*7dc08ffcSJunyu Lais = CLIFeeder()
402*7dc08ffcSJunyu Laid1 = TriggerDrain(lambda x:x=="trigger")
403*7dc08ffcSJunyu Laid2 = TriggeredSwitch()
404*7dc08ffcSJunyu Laic = QueueSink()
405*7dc08ffcSJunyu Lai
406*7dc08ffcSJunyu Lais > d1 > d2
407*7dc08ffcSJunyu Laid2 >> c
408*7dc08ffcSJunyu Laid1 ^ d2
409*7dc08ffcSJunyu Lai
410*7dc08ffcSJunyu Laip = PipeEngine(s)
411*7dc08ffcSJunyu Laip.start()
412*7dc08ffcSJunyu Lai
413*7dc08ffcSJunyu Lais.send("hello")
414*7dc08ffcSJunyu Lais.send("trigger")
415*7dc08ffcSJunyu Lais.send("hello2")
416*7dc08ffcSJunyu Lais.send("trigger")
417*7dc08ffcSJunyu Lais.send("hello3")
418*7dc08ffcSJunyu Lai
419*7dc08ffcSJunyu Laiassert c.q.get(timeout=5) == "trigger"
420*7dc08ffcSJunyu Laiassert c.q.get(timeout=5) == "hello2"
421*7dc08ffcSJunyu Lai
422*7dc08ffcSJunyu Laip.stop()
423*7dc08ffcSJunyu Lai
424*7dc08ffcSJunyu Lai= TriggerDrain and TriggeredSwitch with CLIHighFeeder on low channel
425*7dc08ffcSJunyu Lai
426*7dc08ffcSJunyu Lais = CLIHighFeeder()
427*7dc08ffcSJunyu Laid1 = TriggerDrain(lambda x:x=="trigger")
428*7dc08ffcSJunyu Laid2 = TriggeredSwitch()
429*7dc08ffcSJunyu Laic = QueueSink()
430*7dc08ffcSJunyu Lai
431*7dc08ffcSJunyu Lais >> d1
432*7dc08ffcSJunyu Laid1 >> d2
433*7dc08ffcSJunyu Laid2 > c
434*7dc08ffcSJunyu Laid1 ^ d2
435*7dc08ffcSJunyu Lai
436*7dc08ffcSJunyu Laip = PipeEngine(s)
437*7dc08ffcSJunyu Laip.start()
438*7dc08ffcSJunyu Lai
439*7dc08ffcSJunyu Lais.send("hello")
440*7dc08ffcSJunyu Lais.send("trigger")
441*7dc08ffcSJunyu Lais.send("hello2")
442*7dc08ffcSJunyu Lais.send("trigger")
443*7dc08ffcSJunyu Lais.send("hello3")
444*7dc08ffcSJunyu Lai
445*7dc08ffcSJunyu Laiassert c.q.get(timeout=5) == "hello"
446*7dc08ffcSJunyu Laiassert c.q.get(timeout=5) == "trigger"
447*7dc08ffcSJunyu Laiassert c.q.get(timeout=5) == "hello3"
448*7dc08ffcSJunyu Lai
449*7dc08ffcSJunyu Laip.stop()
450*7dc08ffcSJunyu Lai
451*7dc08ffcSJunyu Lai= TriggerDrain and TriggeredMessage
452*7dc08ffcSJunyu Lai
453*7dc08ffcSJunyu Lais = CLIFeeder()
454*7dc08ffcSJunyu Laid1 = TriggerDrain(lambda x:x=="trigger")
455*7dc08ffcSJunyu Laid2 = TriggeredMessage("hello")
456*7dc08ffcSJunyu Laic = QueueSink()
457*7dc08ffcSJunyu Lai
458*7dc08ffcSJunyu Lais > d1 > d2 > c
459*7dc08ffcSJunyu Laid1 ^ d2
460*7dc08ffcSJunyu Lai
461*7dc08ffcSJunyu Laip = PipeEngine(s)
462*7dc08ffcSJunyu Laip.start()
463*7dc08ffcSJunyu Lai
464*7dc08ffcSJunyu Lais.send("trigger")
465*7dc08ffcSJunyu Lai
466*7dc08ffcSJunyu Lair = [c.q.get(timeout=5), c.q.get(timeout=5)]
467*7dc08ffcSJunyu Laiassert "hello" in r
468*7dc08ffcSJunyu Laiassert "trigger" in r
469*7dc08ffcSJunyu Lai
470*7dc08ffcSJunyu Laip.stop()
471*7dc08ffcSJunyu Lai
472*7dc08ffcSJunyu Lai= TriggerDrain and TriggeredQueueingValve on low channel
473*7dc08ffcSJunyu Lai
474*7dc08ffcSJunyu Laip = PipeEngine()
475*7dc08ffcSJunyu Lai
476*7dc08ffcSJunyu Lais = CLIFeeder()
477*7dc08ffcSJunyu Lair, w = os.pipe()
478*7dc08ffcSJunyu Lai
479*7dc08ffcSJunyu Laid1 = TriggerDrain(lambda x:x=="trigger")
480*7dc08ffcSJunyu Laid2 = TriggeredQueueingValve()
481*7dc08ffcSJunyu Laic = QueueSink(name="c")
482*7dc08ffcSJunyu Lais > d1 > d2 > c
483*7dc08ffcSJunyu Laid1 ^ d2
484*7dc08ffcSJunyu Lai
485*7dc08ffcSJunyu Laip.add(s)
486*7dc08ffcSJunyu Laip.start()
487*7dc08ffcSJunyu Lai
488*7dc08ffcSJunyu Lais.send("trigger")
489*7dc08ffcSJunyu Lais.send("hello")
490*7dc08ffcSJunyu Lais.send("trigger")
491*7dc08ffcSJunyu Laiassert c.q.get(timeout=3) == "trigger"
492*7dc08ffcSJunyu Laiassert c.q.get(timeout=3) in ['hello', 'trigger']
493*7dc08ffcSJunyu Laiassert c.q.get(timeout=3) in ['hello', 'trigger']
494*7dc08ffcSJunyu Laiassert d2.q.qsize() == 0
495*7dc08ffcSJunyu Lai
496*7dc08ffcSJunyu Laip.stop()
497*7dc08ffcSJunyu Lai
498*7dc08ffcSJunyu Lai= TriggerDrain and TriggeredQueueingValve on high channel
499*7dc08ffcSJunyu Lai
500*7dc08ffcSJunyu Laip = PipeEngine()
501*7dc08ffcSJunyu Lai
502*7dc08ffcSJunyu Lais = CLIHighFeeder()
503*7dc08ffcSJunyu Lair, w = os.pipe()
504*7dc08ffcSJunyu Lai
505*7dc08ffcSJunyu Laid1 = TriggerDrain(lambda x:x=="trigger")
506*7dc08ffcSJunyu Laid2 = TriggeredQueueingValve()
507*7dc08ffcSJunyu Laic = QueueSink(name="c")
508*7dc08ffcSJunyu Lais >> d1 >> d2 >> c
509*7dc08ffcSJunyu Laid1 ^ d2
510*7dc08ffcSJunyu Lai
511*7dc08ffcSJunyu Laip.add(s)
512*7dc08ffcSJunyu Laip.start()
513*7dc08ffcSJunyu Lai
514*7dc08ffcSJunyu Lais.send("trigger")
515*7dc08ffcSJunyu Lais.send("hello")
516*7dc08ffcSJunyu Lais.send("trigger")
517*7dc08ffcSJunyu Laiassert c.q.get(timeout=3) == "trigger"
518*7dc08ffcSJunyu Laiassert c.q.get(timeout=3) == "hello"
519*7dc08ffcSJunyu Laiassert d2.q.qsize() == 0
520*7dc08ffcSJunyu Lai
521*7dc08ffcSJunyu Laip.stop()
522*7dc08ffcSJunyu Lai
523*7dc08ffcSJunyu Lai= UDPDrain
524*7dc08ffcSJunyu Lai
525*7dc08ffcSJunyu Laip = PipeEngine()
526*7dc08ffcSJunyu Lai
527*7dc08ffcSJunyu Lais = CLIFeeder()
528*7dc08ffcSJunyu Lais2 = CLIHighFeeder()
529*7dc08ffcSJunyu Laid1 = UDPDrain()
530*7dc08ffcSJunyu Laic = QueueSink()
531*7dc08ffcSJunyu Lai
532*7dc08ffcSJunyu Lais > d1 > c
533*7dc08ffcSJunyu Lais2 >> d1 >> c
534*7dc08ffcSJunyu Lai
535*7dc08ffcSJunyu Laip.add(s)
536*7dc08ffcSJunyu Laip.add(s2)
537*7dc08ffcSJunyu Laip.start()
538*7dc08ffcSJunyu Lai
539*7dc08ffcSJunyu Lais.send(IP(src="127.0.0.1")/UDP()/DNS())
540*7dc08ffcSJunyu Lais2.send(DNS())
541*7dc08ffcSJunyu Lai
542*7dc08ffcSJunyu Laires = [c.q.get(timeout=2), c.q.get(timeout=2)]
543*7dc08ffcSJunyu Laiassert b'\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00' in res
544*7dc08ffcSJunyu Laires.remove(b'\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00')
545*7dc08ffcSJunyu Laiassert DNS in res[0] and res[0][UDP].sport == 1234
546*7dc08ffcSJunyu Lai
547*7dc08ffcSJunyu Laip.stop()
548*7dc08ffcSJunyu Lai
549*7dc08ffcSJunyu Lai= FDSourceSink on a Bunch object
550*7dc08ffcSJunyu Lai
551*7dc08ffcSJunyu Laiclass Bunch:
552*7dc08ffcSJunyu Lai    __init__ = lambda self, **kw: setattr(self, '__dict__', kw)
553*7dc08ffcSJunyu Lai
554*7dc08ffcSJunyu Laifd = Bunch(write=lambda x: None, read=lambda: "hello", fileno=lambda: None)
555*7dc08ffcSJunyu Lai
556*7dc08ffcSJunyu Lais = FDSourceSink(fd)
557*7dc08ffcSJunyu Laid = Drain()
558*7dc08ffcSJunyu Laic = QueueSink()
559*7dc08ffcSJunyu Lais > d > c
560*7dc08ffcSJunyu Lai
561*7dc08ffcSJunyu Laiassert s.fileno() == None
562*7dc08ffcSJunyu Lais.push("data")
563*7dc08ffcSJunyu Lais.deliver()
564*7dc08ffcSJunyu Laiassert c.q.get(timeout=1) == "hello"
565*7dc08ffcSJunyu Lai
566*7dc08ffcSJunyu Lai= TCPConnectPipe networking test
567*7dc08ffcSJunyu Lai~ networking needs_root
568*7dc08ffcSJunyu Lai
569*7dc08ffcSJunyu Laip = PipeEngine()
570*7dc08ffcSJunyu Lai
571*7dc08ffcSJunyu Lais = CLIFeeder()
572*7dc08ffcSJunyu Laid1 = TCPConnectPipe(addr="www.google.fr", port=80)
573*7dc08ffcSJunyu Laic = QueueSink()
574*7dc08ffcSJunyu Lai
575*7dc08ffcSJunyu Lais > d1 > c
576*7dc08ffcSJunyu Lai
577*7dc08ffcSJunyu Laip.add(s)
578*7dc08ffcSJunyu Laip.start()
579*7dc08ffcSJunyu Lai
580*7dc08ffcSJunyu Lais.send(b"GET http://www.google.fr/search?q=scapy&start=1&num=1\n")
581*7dc08ffcSJunyu Lairesult = c.q.get(timeout=10)
582*7dc08ffcSJunyu Laip.stop()
583*7dc08ffcSJunyu Lai
584*7dc08ffcSJunyu Laiassert result.startswith(b"HTTP/1.0 200 OK")
585