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