Skip to content

Commit

Permalink
flowfilter: coverage++
Browse files Browse the repository at this point in the history
  • Loading branch information
Kriechi committed Feb 24, 2017
1 parent 83f1e2e commit d17309e
Show file tree
Hide file tree
Showing 6 changed files with 105 additions and 4 deletions.
1 change: 1 addition & 0 deletions mitmproxy/flowfilter.py
Original file line number Diff line number Diff line change
Expand Up @@ -431,6 +431,7 @@ def __call__(self, f):
FReq,
FResp,
FTCP,
FWebSocket,
]
filter_rex = [
FBod,
Expand Down
3 changes: 2 additions & 1 deletion mitmproxy/test/tflow.py
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,8 @@ def twebsocketflow(client_conn=True, server_conn=True, messages=True, err=None,
if messages is True:
messages = [
websocket.WebSocketMessage(websockets.OPCODE.BINARY, True, b"hello binary"),
websocket.WebSocketMessage(websockets.OPCODE.TEXT, False, "hello text".encode()),
websocket.WebSocketMessage(websockets.OPCODE.TEXT, True, "hello text".encode()),
websocket.WebSocketMessage(websockets.OPCODE.TEXT, False, "it's me".encode()),
]
if err is True:
err = terr()
Expand Down
2 changes: 0 additions & 2 deletions setup.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,6 @@ exclude =
mitmproxy/controller.py
mitmproxy/export.py
mitmproxy/flow.py
mitmproxy/flowfilter.py
mitmproxy/http.py
mitmproxy/io_compat.py
mitmproxy/master.py
Expand All @@ -64,7 +63,6 @@ exclude =
mitmproxy/exceptions.py
mitmproxy/export.py
mitmproxy/flow.py
mitmproxy/flowfilter.py
mitmproxy/http.py
mitmproxy/io.py
mitmproxy/io_compat.py
Expand Down
2 changes: 1 addition & 1 deletion test/mitmproxy/addons/test_dumper.py
Original file line number Diff line number Diff line change
Expand Up @@ -176,7 +176,7 @@ def test_websocket():
ctx.configure(d, flow_detail=3, showhost=True)
f = tflow.twebsocketflow()
d.websocket_message(f)
assert "hello text" in sio.getvalue()
assert "it's me" in sio.getvalue()
sio.truncate(0)

d.websocket_end(f)
Expand Down
2 changes: 2 additions & 0 deletions test/mitmproxy/test_eventsequence.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@ def test_websocket_flow(err):
assert len(f.messages) == 1
assert next(i) == ("websocket_message", f)
assert len(f.messages) == 2
assert next(i) == ("websocket_message", f)
assert len(f.messages) == 3
if err:
assert next(i) == ("websocket_error", f)
assert next(i) == ("websocket_end", f)
Expand Down
99 changes: 99 additions & 0 deletions test/mitmproxy/test_flowfilter.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import io
import pytest
from unittest.mock import patch

from mitmproxy.test import tflow
Expand Down Expand Up @@ -134,6 +135,12 @@ def test_ferr(self):
e = self.err()
assert self.q("~e", e)

def test_fmarked(self):
q = self.req()
assert not self.q("~marked", q)
q.marked = True
assert self.q("~marked", q)

def test_head(self):
q = self.req()
s = self.resp()
Expand Down Expand Up @@ -279,6 +286,7 @@ def test_tcp(self):
f = self.flow()
assert self.q("~tcp", f)
assert not self.q("~http", f)
assert not self.q("~websocket", f)

def test_ferr(self):
e = self.err()
Expand Down Expand Up @@ -388,6 +396,87 @@ def test_url(self):
assert not self.q("~u whatever", f)


class TestMatchingWebSocketFlow:

def flow(self):
return tflow.twebsocketflow()

def err(self):
return tflow.twebsocketflow(err=True)

def q(self, q, o):
return flowfilter.parse(q)(o)

def test_websocket(self):
f = self.flow()
assert self.q("~websocket", f)
assert not self.q("~tcp", f)
assert not self.q("~http", f)

def test_ferr(self):
e = self.err()
assert self.q("~e", e)

def test_body(self):
f = self.flow()

# Messages sent by client or server
assert self.q("~b hello", f)
assert self.q("~b me", f)
assert not self.q("~b nonexistent", f)

# Messages sent by client
assert self.q("~bq hello", f)
assert not self.q("~bq me", f)
assert not self.q("~bq nonexistent", f)

# Messages sent by server
assert self.q("~bs me", f)
assert not self.q("~bs hello", f)
assert not self.q("~bs nonexistent", f)

def test_src(self):
f = self.flow()
assert self.q("~src address", f)
assert not self.q("~src foobar", f)
assert self.q("~src :22", f)
assert not self.q("~src :99", f)
assert self.q("~src address:22", f)

def test_dst(self):
f = self.flow()
f.server_conn = tflow.tserver_conn()
assert self.q("~dst address", f)
assert not self.q("~dst foobar", f)
assert self.q("~dst :22", f)
assert not self.q("~dst :99", f)
assert self.q("~dst address:22", f)

def test_and(self):
f = self.flow()
f.server_conn = tflow.tserver_conn()
assert self.q("~b hello & ~b me", f)
assert not self.q("~src wrongaddress & ~b hello", f)
assert self.q("(~src :22 & ~dst :22) & ~b hello", f)
assert not self.q("(~src address:22 & ~dst :22) & ~b nonexistent", f)
assert not self.q("(~src address:22 & ~dst :99) & ~b hello", f)

def test_or(self):
f = self.flow()
f.server_conn = tflow.tserver_conn()
assert self.q("~b hello | ~b me", f)
assert self.q("~src :22 | ~b me", f)
assert not self.q("~src :99 | ~dst :99", f)
assert self.q("(~src :22 | ~dst :22) | ~b me", f)

def test_not(self):
f = self.flow()
assert not self.q("! ~src :22", f)
assert self.q("! ~src :99", f)
assert self.q("!~src :99 !~src :99", f)
assert not self.q("!~src :99 !~src :22", f)


class TestMatchingDummyFlow:

def flow(self):
Expand Down Expand Up @@ -421,6 +510,8 @@ def test_filters(self):
assert not self.q("~e", f)

assert not self.q("~http", f)
assert not self.q("~tcp", f)
assert not self.q("~websocket", f)

assert not self.q("~h whatever", f)
assert not self.q("~hq whatever", f)
Expand Down Expand Up @@ -450,3 +541,11 @@ def test_pyparsing_bug(extract_tb):
# The text is a string with leading and trailing whitespace stripped; if the source is not available it is None.
extract_tb.return_value = [("", 1, "test", None)]
assert flowfilter.parse("test")


def test_match():
with pytest.raises(ValueError):
flowfilter.match('[foobar', None)

assert flowfilter.match(None, None)
assert not flowfilter.match('foobar', None)

0 comments on commit d17309e

Please sign in to comment.