From b51a96081ac4440a8f3bf16884a0561043ef1611 Mon Sep 17 00:00:00 2001 From: Aldo Cortesi Date: Fri, 4 Nov 2016 08:55:01 +1300 Subject: addons.view: test suite to 100% This takes coverage for all of /addons to 100% --- mitmproxy/addons/view.py | 26 +++++++------- test/mitmproxy/addons/test_view.py | 70 ++++++++++++++++++++++++++++++-------- 2 files changed, 68 insertions(+), 28 deletions(-) diff --git a/mitmproxy/addons/view.py b/mitmproxy/addons/view.py index f4c56883..15d842e4 100644 --- a/mitmproxy/addons/view.py +++ b/mitmproxy/addons/view.py @@ -51,13 +51,16 @@ class _OrderKey: return "_order_%s" % id(self) def __call__(self, f): - k = self._key() - s = self.view.settings[f] - if k in s: - return s[k] - val = self.generate(f) - s[k] = val - return val + if f.id in self.view._store: + k = self._key() + s = self.view.settings[f] + if k in s: + return s[k] + val = self.generate(f) + s[k] = val + return val + else: + return self.generate(f) class OrderRequestStart(_OrderKey): @@ -159,11 +162,8 @@ class View(collections.Sequence): # Reflect some methods to the efficient underlying implementation - def bisect(self, f: mitmproxy.flow.Flow) -> int: - v = self._view.bisect(f) - # Bisect returns an item to the RIGHT of the existing entries. - if v == 0: - return v + def _bisect(self, f: mitmproxy.flow.Flow) -> int: + v = self._view.bisect_right(f) return self._rev(v - 1) + 1 def index(self, f: mitmproxy.flow.Flow, start: int = 0, stop: typing.Optional[int] = None) -> int: @@ -349,7 +349,7 @@ class Focus: self.flow = self.view[idx] def _nearest(self, f, v): - return min(v.bisect(f), len(v) - 1) + return min(v._bisect(f), len(v) - 1) def _sig_remove(self, view, flow): if len(view) == 0: diff --git a/test/mitmproxy/addons/test_view.py b/test/mitmproxy/addons/test_view.py index 5243e9d4..37a8d866 100644 --- a/test/mitmproxy/addons/test_view.py +++ b/test/mitmproxy/addons/test_view.py @@ -7,6 +7,13 @@ from mitmproxy import options from mitmproxy.test import taddons +def tft(*, method="get", start=0): + f = tflow.tflow() + f.request.method = method + f.request.timestamp_start = start + return f + + class Options(options.Options): def __init__( self, @@ -62,18 +69,24 @@ def test_order_generators(): def test_simple(): v = view.View() - f = tflow.tflow() + f = tft(start=1) assert v.store_count() == 0 - f.request.timestamp_start = 1 v.request(f) assert list(v) == [f] + + # These all just call udpate + v.error(f) + v.response(f) + v.intercept(f) + v.resume(f) + assert list(v) == [f] + v.request(f) assert list(v) == [f] assert len(v._store) == 1 assert v.store_count() == 1 - f2 = tflow.tflow() - f2.request.timestamp_start = 3 + f2 = tft(start=3) v.request(f2) assert list(v) == [f, f2] v.request(f2) @@ -84,8 +97,7 @@ def test_simple(): assert not v.inbounds(-1) assert not v.inbounds(100) - f3 = tflow.tflow() - f3.request.timestamp_start = 2 + f3 = tft(start=2) v.request(f3) assert list(v) == [f, f3, f2] v.request(f3) @@ -97,13 +109,6 @@ def test_simple(): assert len(v._store) == 0 -def tft(*, method="get", start=0): - f = tflow.tflow() - f.request.method = method - f.request.timestamp_start = start - return f - - def test_filter(): v = view.View() f = flowfilter.parse("~m get") @@ -160,8 +165,8 @@ def test_reversed(): tutils.raises(IndexError, v.__getitem__, 5) tutils.raises(IndexError, v.__getitem__, -5) - assert v.bisect(v[0]) == 1 - assert v.bisect(v[2]) == 3 + assert v._bisect(v[0]) == 1 + assert v._bisect(v[2]) == 3 def test_update(): @@ -255,6 +260,33 @@ def test_signals(): assert not any([rec_add, rec_update, rec_remove, rec_refresh]) +def test_focus_follow(): + v = view.View() + with taddons.context(options=Options()) as tctx: + tctx.configure(v, focus_follow=True, filter="~m get") + + v.add(tft(start=5)) + assert v.focus.index == 0 + + v.add(tft(start=4)) + assert v.focus.index == 0 + assert v.focus.flow.request.timestamp_start == 4 + + v.add(tft(start=7)) + assert v.focus.index == 2 + assert v.focus.flow.request.timestamp_start == 7 + + mod = tft(method="put", start=6) + v.add(mod) + assert v.focus.index == 2 + assert v.focus.flow.request.timestamp_start == 7 + + mod.request.method = "GET" + v.update(mod) + assert v.focus.index == 2 + assert v.focus.flow.request.timestamp_start == 6 + + def test_focus(): # Special case - initialising with a view that already contains data v = view.View() @@ -273,6 +305,10 @@ def test_focus(): assert f.index == 0 assert f.flow is v[0] + # Try to set to something not in view + tutils.raises(ValueError, f.__setattr__, "flow", tft()) + tutils.raises(ValueError, f.__setattr__, "index", 99) + v.add(tft(start=0)) assert f.index == 1 assert f.flow is v[1] @@ -281,6 +317,10 @@ def test_focus(): assert f.index == 1 assert f.flow is v[1] + f.index = 0 + assert f.index == 0 + f.index = 1 + v.remove(v[1]) assert f.index == 1 assert f.flow is v[1] -- cgit v1.2.3