From 50c07034249a07f25172230b689c4c6da1b63c2d Mon Sep 17 00:00:00 2001 From: Matthew Shao Date: Fri, 19 May 2017 09:45:30 +0800 Subject: [web] Add _tflow.js generator in test_app.py --- test/mitmproxy/tools/web/test_app.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/test/mitmproxy/tools/web/test_app.py b/test/mitmproxy/tools/web/test_app.py index 2b6181d3..dc5fe733 100644 --- a/test/mitmproxy/tools/web/test_app.py +++ b/test/mitmproxy/tools/web/test_app.py @@ -1,5 +1,6 @@ import json as _json from unittest import mock +import os import tornado.testing from tornado import httpclient @@ -12,7 +13,6 @@ from mitmproxy.test import tflow from mitmproxy.tools.web import app from mitmproxy.tools.web import master as webmaster - def json(resp: httpclient.HTTPResponse): return _json.loads(resp.body.decode()) @@ -275,3 +275,13 @@ class TestApp(tornado.testing.AsyncHTTPTestCase): # trigger on_close by opening a second connection. ws_client2 = yield websocket.websocket_connect(ws_url) ws_client2.close() + + def test_generate_tflow_js(self): + tflow_json = _json.dumps( + app.flow_to_json(tflow.tflow(resp=True, err=True)), indent=4, sort_keys=True + ) + web_root = os.path.join(os.getcwd(), 'web') + tflow_path = os.path.join(web_root, 'src/js/__tests__/ducks/_tflow.js') + content = """export default function(){{\n return {tflow_json}\n}}""".format(tflow_json=tflow_json) + with open(tflow_path, 'w') as f: + f.write(content) -- cgit v1.2.3 From 5df0ddf358367dcd37c934798464ad91f3c7bdf8 Mon Sep 17 00:00:00 2001 From: Matthew Shao Date: Fri, 19 May 2017 09:49:10 +0800 Subject: [web] Updates test to use the new _tflow.js. --- .../components/FlowTable/FlowColumnsSpec.js | 50 +++++++++++----------- .../__snapshots__/FlowColumnsSpec.js.snap | 16 +++---- web/src/js/__tests__/ducks/tutils.js | 27 ------------ 3 files changed, 30 insertions(+), 63 deletions(-) diff --git a/web/src/js/__tests__/components/FlowTable/FlowColumnsSpec.js b/web/src/js/__tests__/components/FlowTable/FlowColumnsSpec.js index 576838f4..7f30b809 100644 --- a/web/src/js/__tests__/components/FlowTable/FlowColumnsSpec.js +++ b/web/src/js/__tests__/components/FlowTable/FlowColumnsSpec.js @@ -1,101 +1,101 @@ import React from 'react' import renderer from 'react-test-renderer' import * as Columns from '../../../components/FlowTable/FlowColumns' -import { TFlow } from '../../ducks/tutils' +import _tflow from '../../ducks/_tflow' describe('FlowColumns Components', () => { - let tFlow = new TFlow() + let tflow = _tflow() it('should render TLSColumn', () => { - let tlsColumn = renderer.create(), + let tlsColumn = renderer.create(), tree = tlsColumn.toJSON() expect(tree).toMatchSnapshot() }) it('should render IconColumn', () => { - let iconColumn = renderer.create(), + let iconColumn = renderer.create(), tree = iconColumn.toJSON() // plain expect(tree).toMatchSnapshot() // not modified - tFlow.response.status_code = 304 - iconColumn = renderer.create() + tflow.response.status_code = 304 + iconColumn = renderer.create() tree = iconColumn.toJSON() expect(tree).toMatchSnapshot() // redirect - tFlow.response.status_code = 302 - iconColumn = renderer.create() + tflow.response.status_code = 302 + iconColumn = renderer.create() tree = iconColumn.toJSON() expect(tree).toMatchSnapshot() // image - let imageFlow = new TFlow() + let imageFlow = _tflow() imageFlow.response.headers = [['Content-Type', 'image/jpeg']] iconColumn = renderer.create() tree = iconColumn.toJSON() expect(tree).toMatchSnapshot() // javascript - let jsFlow = new TFlow() + let jsFlow = _tflow() jsFlow.response.headers = [['Content-Type', 'application/x-javascript']] iconColumn = renderer.create() tree = iconColumn.toJSON() expect(tree).toMatchSnapshot() // css - let cssFlow = new TFlow() + let cssFlow = _tflow() cssFlow.response.headers = [['Content-Type', 'text/css']] iconColumn = renderer.create() tree = iconColumn.toJSON() expect(tree).toMatchSnapshot() // default - let fooFlow = new TFlow() + let fooFlow = _tflow() fooFlow.response.headers = [['Content-Type', 'foo']] iconColumn = renderer.create() tree = iconColumn.toJSON() expect(tree).toMatchSnapshot() // no response - tFlow.response = null - iconColumn = renderer.create() + tflow.response = null + iconColumn = renderer.create() tree = iconColumn.toJSON() expect(tree).toMatchSnapshot() }) it('should render pathColumn', () => { - let pathColumn = renderer.create(), + let pathColumn = renderer.create(), tree = pathColumn.toJSON() expect(tree).toMatchSnapshot() - tFlow.error.msg = 'Connection killed' - tFlow.intercepted = true - pathColumn = renderer.create() + tflow.error.msg = 'Connection killed' + tflow.intercepted = true + pathColumn = renderer.create() tree = pathColumn.toJSON() expect(tree).toMatchSnapshot() }) it('should render MethodColumn', () => { - let methodColumn =renderer.create(), + let methodColumn =renderer.create(), tree = methodColumn.toJSON() expect(tree).toMatchSnapshot() }) it('should render StatusColumn', () => { - let statusColumn = renderer.create(), + let statusColumn = renderer.create(), tree = statusColumn.toJSON() expect(tree).toMatchSnapshot() }) it('should render SizeColumn', () => { - tFlow = new TFlow() - let sizeColumn = renderer.create(), + tflow = _tflow() + let sizeColumn = renderer.create(), tree = sizeColumn.toJSON() expect(tree).toMatchSnapshot() }) it('should render TimeColumn', () => { - let timeColumn = renderer.create(), + let timeColumn = renderer.create(), tree = timeColumn.toJSON() expect(tree).toMatchSnapshot() - tFlow.response = null - timeColumn = renderer.create(), + tflow.response = null + timeColumn = renderer.create(), tree = timeColumn.toJSON() expect(tree).toMatchSnapshot() }) diff --git a/web/src/js/__tests__/components/FlowTable/__snapshots__/FlowColumnsSpec.js.snap b/web/src/js/__tests__/components/FlowTable/__snapshots__/FlowColumnsSpec.js.snap index ec260e1e..c74f686e 100644 --- a/web/src/js/__tests__/components/FlowTable/__snapshots__/FlowColumnsSpec.js.snap +++ b/web/src/js/__tests__/components/FlowTable/__snapshots__/FlowColumnsSpec.js.snap @@ -5,7 +5,7 @@ exports[`FlowColumns Components should render IconColumn 1`] = ` className="col-icon" >
`; @@ -92,7 +92,7 @@ exports[`FlowColumns Components should render SizeColumn 1`] = ` - 100b + 14b `; @@ -112,7 +112,7 @@ exports[`FlowColumns Components should render TimeColumn 1`] = ` - 2min + 415322h `; @@ -128,13 +128,10 @@ exports[`FlowColumns Components should render pathColumn 1`] = ` - - http://undefined:undefinedundefined + http://address:22/path `; @@ -142,15 +139,12 @@ exports[`FlowColumns Components should render pathColumn 2`] = ` - - http://undefined:undefinedundefined + http://address:22/path `; diff --git a/web/src/js/__tests__/ducks/tutils.js b/web/src/js/__tests__/ducks/tutils.js index f140222d..6ae7f080 100644 --- a/web/src/js/__tests__/ducks/tutils.js +++ b/web/src/js/__tests__/ducks/tutils.js @@ -7,30 +7,3 @@ export function createStore(parts) { applyMiddleware(...[thunk]) ) } - -export function TFlow(intercepted=false, marked=false, modified=false) { - return { - intercepted , - marked, - modified, - id: "foo", - request: { - scheme: 'http', - is_replay: true, - method: 'GET', - contentLength: 100 - }, - response: { - status_code: 200, - headers: [["Content-Type", 'text/html']], - timestamp_end: 200 - }, - error: { - msg: '' - }, - server_conn: { - timestamp_start: 100 - }, - type: 'http' - } -} -- cgit v1.2.3 From 369e1f1eeebf94951c592ac712f84086e0bc7b41 Mon Sep 17 00:00:00 2001 From: Matthew Shao Date: Fri, 19 May 2017 09:56:52 +0800 Subject: [web] Fix minior lint problem. --- test/mitmproxy/tools/web/test_app.py | 1 + 1 file changed, 1 insertion(+) diff --git a/test/mitmproxy/tools/web/test_app.py b/test/mitmproxy/tools/web/test_app.py index dc5fe733..8a81e0e0 100644 --- a/test/mitmproxy/tools/web/test_app.py +++ b/test/mitmproxy/tools/web/test_app.py @@ -13,6 +13,7 @@ from mitmproxy.test import tflow from mitmproxy.tools.web import app from mitmproxy.tools.web import master as webmaster + def json(resp: httpclient.HTTPResponse): return _json.loads(resp.body.decode()) -- cgit v1.2.3 From 55a58c4c6f46e7bbe78d20c31b1ede4a1357ec82 Mon Sep 17 00:00:00 2001 From: Matthew Shao Date: Fri, 19 May 2017 10:17:06 +0800 Subject: [web] Add js/__tests__/ducks/_tflow.js --- web/src/js/__tests__/ducks/_tflow.js | 97 ++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 web/src/js/__tests__/ducks/_tflow.js diff --git a/web/src/js/__tests__/ducks/_tflow.js b/web/src/js/__tests__/ducks/_tflow.js new file mode 100644 index 00000000..8ff8c96c --- /dev/null +++ b/web/src/js/__tests__/ducks/_tflow.js @@ -0,0 +1,97 @@ +export default function(){ + return { + "client_conn": { + "address": [ + "address", + 22 + ], + "alpn_proto_negotiated": "http/1.1", + "cipher_name": "cipher", + "clientcert": null, + "id": "75bfd3cd-a084-4d84-a063-b0804dc91342", + "sni": "address", + "ssl_established": false, + "timestamp_end": 3.0, + "timestamp_ssl_setup": 2.0, + "timestamp_start": 1.0, + "tls_version": "TLSv1.2" + }, + "error": { + "msg": "error", + "timestamp": 1495158272.596447 + }, + "id": "8035b342-c916-44f7-93fa-293b40a7d3ad", + "intercepted": false, + "marked": false, + "modified": false, + "request": { + "contentHash": "ed7002b439e9ac845f22357d822bac1444730fbdb6016d3ec9432297b9ec9f73", + "contentLength": 7, + "headers": [ + [ + "header", + "qvalue" + ], + [ + "content-length", + "7" + ] + ], + "host": "address", + "http_version": "HTTP/1.1", + "is_replay": false, + "method": "GET", + "path": "/path", + "port": 22, + "pretty_host": "address", + "scheme": "http", + "timestamp_end": null, + "timestamp_start": null + }, + "response": { + "contentHash": "ab530a13e45914982b79f9b7e3fba994cfd1f3fb22f71cea1afbf02b460c6d1d", + "contentLength": 7, + "headers": [ + [ + "header-response", + "svalue" + ], + [ + "content-length", + "7" + ] + ], + "http_version": "HTTP/1.1", + "is_replay": false, + "reason": "OK", + "status_code": 200, + "timestamp_end": 1495158272.5964308, + "timestamp_start": 1495158272.5964305 + }, + "server_conn": { + "address": [ + "address", + 22 + ], + "alpn_proto_negotiated": null, + "id": "9a5d01d7-ede8-4409-b064-230305bfa29d", + "ip_address": [ + "192.168.0.1", + 22 + ], + "sni": "address", + "source_address": [ + "address", + 22 + ], + "ssl_established": false, + "timestamp_end": 4.0, + "timestamp_ssl_setup": 3.0, + "timestamp_start": 1.0, + "timestamp_tcp_setup": 2.0, + "tls_version": "TLSv1.2", + "via": null + }, + "type": "http" +} +} \ No newline at end of file -- cgit v1.2.3 From 2c38fddea5eae0fe60822ee2fcf2565889f258b9 Mon Sep 17 00:00:00 2001 From: Matthew Shao Date: Sun, 21 May 2017 20:59:19 +0800 Subject: [web] TFlow minor improved. --- test/mitmproxy/tools/web/test_app.py | 3 ++- .../js/__tests__/components/FlowTable/FlowColumnsSpec.js | 14 +++++++------- .../FlowTable/__snapshots__/FlowColumnsSpec.js.snap | 2 +- web/src/js/__tests__/ducks/_tflow.js | 12 ++++++------ web/src/js/__tests__/ducks/tutils.js | 2 ++ 5 files changed, 18 insertions(+), 15 deletions(-) diff --git a/test/mitmproxy/tools/web/test_app.py b/test/mitmproxy/tools/web/test_app.py index 8a81e0e0..f6072efb 100644 --- a/test/mitmproxy/tools/web/test_app.py +++ b/test/mitmproxy/tools/web/test_app.py @@ -281,7 +281,8 @@ class TestApp(tornado.testing.AsyncHTTPTestCase): tflow_json = _json.dumps( app.flow_to_json(tflow.tflow(resp=True, err=True)), indent=4, sort_keys=True ) - web_root = os.path.join(os.getcwd(), 'web') + here = os.path.abspath(os.path.dirname(__file__)) + web_root = os.path.join(here, os.pardir, os.pardir, os.pardir, os.pardir, 'web') tflow_path = os.path.join(web_root, 'src/js/__tests__/ducks/_tflow.js') content = """export default function(){{\n return {tflow_json}\n}}""".format(tflow_json=tflow_json) with open(tflow_path, 'w') as f: diff --git a/web/src/js/__tests__/components/FlowTable/FlowColumnsSpec.js b/web/src/js/__tests__/components/FlowTable/FlowColumnsSpec.js index 7f30b809..1427cb1b 100644 --- a/web/src/js/__tests__/components/FlowTable/FlowColumnsSpec.js +++ b/web/src/js/__tests__/components/FlowTable/FlowColumnsSpec.js @@ -1,11 +1,11 @@ import React from 'react' import renderer from 'react-test-renderer' import * as Columns from '../../../components/FlowTable/FlowColumns' -import _tflow from '../../ducks/_tflow' +import { TFlow } from '../../ducks/tutils' describe('FlowColumns Components', () => { - let tflow = _tflow() + let tflow = TFlow() it('should render TLSColumn', () => { let tlsColumn = renderer.create(), tree = tlsColumn.toJSON() @@ -28,25 +28,25 @@ describe('FlowColumns Components', () => { tree = iconColumn.toJSON() expect(tree).toMatchSnapshot() // image - let imageFlow = _tflow() + let imageFlow = TFlow() imageFlow.response.headers = [['Content-Type', 'image/jpeg']] iconColumn = renderer.create() tree = iconColumn.toJSON() expect(tree).toMatchSnapshot() // javascript - let jsFlow = _tflow() + let jsFlow = TFlow() jsFlow.response.headers = [['Content-Type', 'application/x-javascript']] iconColumn = renderer.create() tree = iconColumn.toJSON() expect(tree).toMatchSnapshot() // css - let cssFlow = _tflow() + let cssFlow = TFlow() cssFlow.response.headers = [['Content-Type', 'text/css']] iconColumn = renderer.create() tree = iconColumn.toJSON() expect(tree).toMatchSnapshot() // default - let fooFlow = _tflow() + let fooFlow = TFlow() fooFlow.response.headers = [['Content-Type', 'foo']] iconColumn = renderer.create() tree = iconColumn.toJSON() @@ -83,7 +83,7 @@ describe('FlowColumns Components', () => { }) it('should render SizeColumn', () => { - tflow = _tflow() + tflow = TFlow() let sizeColumn = renderer.create(), tree = sizeColumn.toJSON() expect(tree).toMatchSnapshot() diff --git a/web/src/js/__tests__/components/FlowTable/__snapshots__/FlowColumnsSpec.js.snap b/web/src/js/__tests__/components/FlowTable/__snapshots__/FlowColumnsSpec.js.snap index c74f686e..9c7cec86 100644 --- a/web/src/js/__tests__/components/FlowTable/__snapshots__/FlowColumnsSpec.js.snap +++ b/web/src/js/__tests__/components/FlowTable/__snapshots__/FlowColumnsSpec.js.snap @@ -112,7 +112,7 @@ exports[`FlowColumns Components should render TimeColumn 1`] = ` - 415322h + 415381h `; diff --git a/web/src/js/__tests__/ducks/_tflow.js b/web/src/js/__tests__/ducks/_tflow.js index 8ff8c96c..f6a382bd 100644 --- a/web/src/js/__tests__/ducks/_tflow.js +++ b/web/src/js/__tests__/ducks/_tflow.js @@ -8,7 +8,7 @@ export default function(){ "alpn_proto_negotiated": "http/1.1", "cipher_name": "cipher", "clientcert": null, - "id": "75bfd3cd-a084-4d84-a063-b0804dc91342", + "id": "4a18d1a0-50a1-48dd-9aa6-d45d74282939", "sni": "address", "ssl_established": false, "timestamp_end": 3.0, @@ -18,9 +18,9 @@ export default function(){ }, "error": { "msg": "error", - "timestamp": 1495158272.596447 + "timestamp": 1495370312.4814785 }, - "id": "8035b342-c916-44f7-93fa-293b40a7d3ad", + "id": "d91165be-ca1f-4612-88a9-c0f8696f3e29", "intercepted": false, "marked": false, "modified": false, @@ -65,8 +65,8 @@ export default function(){ "is_replay": false, "reason": "OK", "status_code": 200, - "timestamp_end": 1495158272.5964308, - "timestamp_start": 1495158272.5964305 + "timestamp_end": 1495370312.4814625, + "timestamp_start": 1495370312.481462 }, "server_conn": { "address": [ @@ -74,7 +74,7 @@ export default function(){ 22 ], "alpn_proto_negotiated": null, - "id": "9a5d01d7-ede8-4409-b064-230305bfa29d", + "id": "f087e7b2-6d0a-41a8-a8f0-e1a4761395f8", "ip_address": [ "192.168.0.1", 22 diff --git a/web/src/js/__tests__/ducks/tutils.js b/web/src/js/__tests__/ducks/tutils.js index 6ae7f080..211b61e3 100644 --- a/web/src/js/__tests__/ducks/tutils.js +++ b/web/src/js/__tests__/ducks/tutils.js @@ -7,3 +7,5 @@ export function createStore(parts) { applyMiddleware(...[thunk]) ) } + +export { default as TFlow } from './_tflow' -- cgit v1.2.3 From 2935ff5f3ac01124b8c4c3d2688964ddaba12f4d Mon Sep 17 00:00:00 2001 From: Matthew Shao Date: Mon, 22 May 2017 08:53:59 +0800 Subject: [web] Set some value as constant, so _tflow.js would not change. --- test/mitmproxy/tools/web/test_app.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/test/mitmproxy/tools/web/test_app.py b/test/mitmproxy/tools/web/test_app.py index f6072efb..5427b995 100644 --- a/test/mitmproxy/tools/web/test_app.py +++ b/test/mitmproxy/tools/web/test_app.py @@ -278,9 +278,15 @@ class TestApp(tornado.testing.AsyncHTTPTestCase): ws_client2.close() def test_generate_tflow_js(self): - tflow_json = _json.dumps( - app.flow_to_json(tflow.tflow(resp=True, err=True)), indent=4, sort_keys=True - ) + _tflow = app.flow_to_json(tflow.tflow(resp=True, err=True)) + # Set some value as constant, so that _tflow.js would not change every time. + _tflow['client_conn']['id'] = "4a18d1a0-50a1-48dd-9aa6-d45d74282939" + _tflow['id'] = "d91165be-ca1f-4612-88a9-c0f8696f3e29" + _tflow['error']['timestamp'] = 1495370312.4814785 + _tflow['response']['timestamp_end'] = 1495370312.4814625 + _tflow['response']['timestamp_start'] = 1495370312.481462 + _tflow['server_conn']['id'] = "f087e7b2-6d0a-41a8-a8f0-e1a4761395f8" + tflow_json = _json.dumps(_tflow, indent=4, sort_keys=True) here = os.path.abspath(os.path.dirname(__file__)) web_root = os.path.join(here, os.pardir, os.pardir, os.pardir, os.pardir, 'web') tflow_path = os.path.join(web_root, 'src/js/__tests__/ducks/_tflow.js') -- cgit v1.2.3 From 546bac68d471d23bee70b549a5179a775fded4fc Mon Sep 17 00:00:00 2001 From: Matthew Shao Date: Mon, 22 May 2017 10:46:03 +0800 Subject: [web] Fix 100% coverage for js/components/FlowTable/FlowColumns.js --- web/src/js/__tests__/components/FlowTable/FlowColumnsSpec.js | 6 ++++++ .../FlowTable/__snapshots__/FlowColumnsSpec.js.snap | 12 +++++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/web/src/js/__tests__/components/FlowTable/FlowColumnsSpec.js b/web/src/js/__tests__/components/FlowTable/FlowColumnsSpec.js index 1427cb1b..f3373c02 100644 --- a/web/src/js/__tests__/components/FlowTable/FlowColumnsSpec.js +++ b/web/src/js/__tests__/components/FlowTable/FlowColumnsSpec.js @@ -45,6 +45,12 @@ describe('FlowColumns Components', () => { iconColumn = renderer.create() tree = iconColumn.toJSON() expect(tree).toMatchSnapshot() + // html + let htmlFlow = TFlow() + htmlFlow.response.headers = [['Content-Type', 'text/html']] + iconColumn = renderer.create() + tree = iconColumn.toJSON() + expect(tree).toMatchSnapshot() // default let fooFlow = TFlow() fooFlow.response.headers = [['Content-Type', 'foo']] diff --git a/web/src/js/__tests__/components/FlowTable/__snapshots__/FlowColumnsSpec.js.snap b/web/src/js/__tests__/components/FlowTable/__snapshots__/FlowColumnsSpec.js.snap index 9c7cec86..d6946507 100644 --- a/web/src/js/__tests__/components/FlowTable/__snapshots__/FlowColumnsSpec.js.snap +++ b/web/src/js/__tests__/components/FlowTable/__snapshots__/FlowColumnsSpec.js.snap @@ -65,7 +65,7 @@ exports[`FlowColumns Components should render IconColumn 7`] = ` className="col-icon" >
`; @@ -80,6 +80,16 @@ exports[`FlowColumns Components should render IconColumn 8`] = ` `; +exports[`FlowColumns Components should render IconColumn 9`] = ` + +
+ +`; + exports[`FlowColumns Components should render MethodColumn 1`] = `