From 23989a1c92f7b44337882198fa3b7e618c05fa4b Mon Sep 17 00:00:00 2001 From: Andrei Fokau Date: Wed, 25 Oct 2017 18:56:17 +0200 Subject: [PATCH 1/7] Support running tests via setup.py; install PyCrypto for testing. --- run_tests.py | 24 ++++++++++++++++++++---- setup.py | 2 ++ 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/run_tests.py b/run_tests.py index d99cfb56..627550fc 100755 --- a/run_tests.py +++ b/run_tests.py @@ -1,14 +1,22 @@ #!/usr/bin/env python3 +import argparse +import logging import unittest -if __name__ == '__main__': +logging.basicConfig(level=logging.DEBUG) +__log__ = logging.getLogger(__name__) + + +def test_suite(skip_network=False): from telethon_tests import \ CryptoTests, ParserTests, TLTests, UtilsTests, NetworkTests test_classes = [CryptoTests, ParserTests, TLTests, UtilsTests] - network = input('Run network tests (y/n)?: ').lower() == 'y' - if network: + if skip_network: + __log__.warning("Skipping network tests") + else: + __log__.info("Running with network tests") test_classes.append(NetworkTests) loader = unittest.TestLoader() @@ -18,7 +26,15 @@ if __name__ == '__main__': suite = loader.loadTestsFromTestCase(test_class) suites_list.append(suite) - big_suite = unittest.TestSuite(suites_list) + return unittest.TestSuite(suites_list) + +if __name__ == '__main__': + parser = argparse.ArgumentParser() + parser.add_argument('-n,--skip-network', dest='skip_network', + action='store_true') + args = parser.parse_args() + + big_suite = test_suite(skip_network=args.skip_network) runner = unittest.TextTestRunner() results = runner.run(big_suite) diff --git a/setup.py b/setup.py index 3f8ee7a6..4885d5ae 100755 --- a/setup.py +++ b/setup.py @@ -133,6 +133,8 @@ def main(): 'telethon_generator', 'telethon_tests', 'run_tests.py', 'try_telethon.py' ]), + test_suite='run_tests.test_suite', + tests_require=['PyCrypto'], install_requires=['pyaes', 'rsa'] ) From f4a5343040a7983efce1357477fc0b39dcae5761 Mon Sep 17 00:00:00 2001 From: Andrei Fokau Date: Wed, 25 Oct 2017 17:35:32 +0000 Subject: [PATCH 2/7] Add tox, coverage, flake8 and Travis config. --- .travis.yml | 34 ++++++++++++++++++++++++++++++++++ setup.cfg | 19 +++++++++++++++++++ tox.ini | 26 ++++++++++++++++++++++++++ 3 files changed, 79 insertions(+) create mode 100644 .travis.yml create mode 100644 setup.cfg create mode 100644 tox.ini diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 00000000..116ccd19 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,34 @@ +sudo: false +language: python + +cache: pip + +# Tox cannot install pythons, so we set 3.5 as default, use 3.4 already +# available in container and then include 3.6 in matrix. +python: + - 3.5 + +env: + - TOXENV=py34 + - TOXENV=py35 + +matrix: + include: + - python: 3.6 + env: TOXENV=py36 + - python: 3.4 # i.e. skip installing 3.5 + env: TOXENV=lint + - python: 3.4 + env: TOXENV=coverage + +install: + - pip install tox + +script: + - tox + +after_success: + - if [[ $TOXENV =~ coverage ]]; then + pip install --quiet python-coveralls; + coveralls --ignore-errors; + fi diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 00000000..4bd241ef --- /dev/null +++ b/setup.cfg @@ -0,0 +1,19 @@ +[flake8] +exclude = .eggs,.tox,.git +max-line-length = 100 +max-complexity = 14 + +[coverage:run] +source = telethon +#branch = True +parallel = True + +[coverage:report] +ignore_errors = True +skip_covered = True +show_missing = True + +# Regex expressions for lines excluded from report +exclude_lines = + pragma: no cover + if __name__ == .__main__.: diff --git a/tox.ini b/tox.ini new file mode 100644 index 00000000..40e162a3 --- /dev/null +++ b/tox.ini @@ -0,0 +1,26 @@ +[tox] +envlist = py34,py35,py36 + +[testenv] +recreate = True +commands = coverage run setup.py test +install_command = + pip install {opts} {packages} +deps = coverage + +[testenv:coverage] +basepython = python3.4 +skip_install = true +commands = + coverage combine + coverage report +deps = + coverage + +[testenv:lint] +basepython = python3.4 +skip_install = true +commands = + flake8 +deps = + flake8 From 826643c699d31f1dbc235e406628947d2cfc89d6 Mon Sep 17 00:00:00 2001 From: Andrei Fokau Date: Thu, 26 Oct 2017 09:51:51 +0200 Subject: [PATCH 3/7] Don't use magic name; run own test runner. --- run_tests.py | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/run_tests.py b/run_tests.py index 627550fc..adf7a44d 100755 --- a/run_tests.py +++ b/run_tests.py @@ -1,10 +1,11 @@ #!/usr/bin/env python3 import argparse import logging +import sys import unittest logging.basicConfig(level=logging.DEBUG) -__log__ = logging.getLogger(__name__) +log = logging.getLogger(__name__) def test_suite(skip_network=False): @@ -14,9 +15,9 @@ def test_suite(skip_network=False): test_classes = [CryptoTests, ParserTests, TLTests, UtilsTests] if skip_network: - __log__.warning("Skipping network tests") + log.warning("Skipping network tests") else: - __log__.info("Running with network tests") + log.info("Running with network tests") test_classes.append(NetworkTests) loader = unittest.TestLoader() @@ -29,12 +30,17 @@ def test_suite(skip_network=False): return unittest.TestSuite(suites_list) +def main(skip_network=False): + big_suite = test_suite(skip_network=skip_network) + runner = unittest.TextTestRunner() + failures = runner.run(big_suite) + sys.exit(1 if failures else 0) + + if __name__ == '__main__': parser = argparse.ArgumentParser() parser.add_argument('-n,--skip-network', dest='skip_network', action='store_true') args = parser.parse_args() - big_suite = test_suite(skip_network=args.skip_network) - runner = unittest.TextTestRunner() - results = runner.run(big_suite) + main(skip_network=args.skip_network) From 55846c7ac9f60dc2f5cc5cf8d83233d361e173f6 Mon Sep 17 00:00:00 2001 From: Andrei Fokau Date: Sat, 28 Oct 2017 11:00:35 +0000 Subject: [PATCH 4/7] Generate tl before tests; fix coverage. --- .travis.yml | 4 ++-- tox.ini | 19 ++++++++++++++++++- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 116ccd19..d02c9173 100644 --- a/.travis.yml +++ b/.travis.yml @@ -19,7 +19,7 @@ matrix: - python: 3.4 # i.e. skip installing 3.5 env: TOXENV=lint - python: 3.4 - env: TOXENV=coverage + env: TOXENV=coverage34 install: - pip install tox @@ -28,7 +28,7 @@ script: - tox after_success: - - if [[ $TOXENV =~ coverage ]]; then + - if [[ $TOXENV =~ coverage34 ]]; then pip install --quiet python-coveralls; coveralls --ignore-errors; fi diff --git a/tox.ini b/tox.ini index 40e162a3..4cdbf7b2 100644 --- a/tox.ini +++ b/tox.ini @@ -3,9 +3,12 @@ envlist = py34,py35,py36 [testenv] recreate = True -commands = coverage run setup.py test install_command = pip install {opts} {packages} +commands = + python setup.py clean_tl + python setup.py gen_tl + coverage run setup.py test deps = coverage [testenv:coverage] @@ -17,6 +20,20 @@ commands = deps = coverage +[testenv:coverage34] +basepython = python3.4 +install_command = + pip install {opts} {packages} +ignore_errors = True +commands = + python setup.py clean_tl + python setup.py gen_tl + coverage run setup.py test + coverage combine + coverage report +deps = + coverage + [testenv:lint] basepython = python3.4 skip_install = true From 35ade37d74483667a4073e2759c907878a0fa958 Mon Sep 17 00:00:00 2001 From: Andrei Fokau Date: Sat, 28 Oct 2017 13:51:14 +0200 Subject: [PATCH 5/7] Fix fingerprint test; add a similar test for rsa lib. --- telethon_tests/crypto_test.py | 39 ++++++++++++++++++++++------------- 1 file changed, 25 insertions(+), 14 deletions(-) diff --git a/telethon_tests/crypto_test.py b/telethon_tests/crypto_test.py index e11704a4..43a97b5a 100644 --- a/telethon_tests/crypto_test.py +++ b/telethon_tests/crypto_test.py @@ -1,11 +1,24 @@ +import hashlib +import struct import unittest -from hashlib import sha1 import telethon.helpers as utils from telethon.crypto import AES, Factorization from telethon.crypto import rsa from Crypto.PublicKey import RSA as PyCryptoRSA +TEST_RSA_KEY = ''' +-----BEGIN RSA PUBLIC KEY----- +MIIBCgKCAQEAwVACPi9w23mF3tBkdZz+zwrzKOaaQdr01vAbU4E1pvkfj4sqDsm6 +lyDONS789sVoD/xCS9Y0hkkC3gtL1tSfTlgCMOOul9lcixlEKzwKENj1Yz/s7daS +an9tqw3bfUV/nqgbhGX81v/+7RFAEd+RwFnK7a+XYl9sluzHRyVVaTTveB2GazTw +Efzk2DWgkBluml8OREmvfraX3bkHZJTKX4EQSjBbbdJ2ZXIsRrYOXfaA+xayEGB+ +8hdlLmAjbCVfaigxX0CDqWeR1yFL9kwd9P0NsZRPsmoqVwMbMu7mStFai6aIhc3n +Slv8kg9qv1m6XHVQY3PnEw+QQtqSIXklHwIDAQAB +-----END RSA PUBLIC KEY----- +'''.strip() +TEST_RSA_KEY_FINGERPRINT = b'!k\xe8l\x02+\xb4\xc3' + class CryptoTests(unittest.TestCase): def setUp(self): @@ -26,7 +39,7 @@ class CryptoTests(unittest.TestCase): def test_sha1(): string = 'Example string' - hash_sum = sha1(string.encode('utf-8')).digest() + hash_sum = hashlib.sha1(string.encode('utf-8')).digest() expected = b'\nT\x92|\x8d\x06:)\x99\x04\x8e\xf8j?\xc4\x8e\xd3}m9' assert hash_sum == expected, 'Invalid sha1 hash_sum representation (should be {}, but is {})'\ @@ -119,18 +132,16 @@ class CryptoTests(unittest.TestCase): assert iv == expected_iv, 'IV ("{}") does not equal expected ("{}")'.format( iv, expected_iv) - @staticmethod - def test_fingerprint_from_key(): - assert rsa._compute_fingerprint(PyCryptoRSA.importKey( - '-----BEGIN RSA PUBLIC KEY-----\n' - 'MIIBCgKCAQEAwVACPi9w23mF3tBkdZz+zwrzKOaaQdr01vAbU4E1pvkfj4sqDsm6\n' - 'lyDONS789sVoD/xCS9Y0hkkC3gtL1tSfTlgCMOOul9lcixlEKzwKENj1Yz/s7daS\n' - 'an9tqw3bfUV/nqgbhGX81v/+7RFAEd+RwFnK7a+XYl9sluzHRyVVaTTveB2GazTw\n' - 'Efzk2DWgkBluml8OREmvfraX3bkHZJTKX4EQSjBbbdJ2ZXIsRrYOXfaA+xayEGB+\n' - '8hdlLmAjbCVfaigxX0CDqWeR1yFL9kwd9P0NsZRPsmoqVwMbMu7mStFai6aIhc3n\n' - 'Slv8kg9qv1m6XHVQY3PnEw+QQtqSIXklHwIDAQAB\n' - '-----END RSA PUBLIC KEY-----' - )) == b'!k\xe8l\x02+\xb4\xc3', 'Wrong fingerprint calculated' + def test_fingerprint_from_key_pycrypto(self): + key = PyCryptoRSA.importKey(TEST_RSA_KEY) + fp = rsa._compute_fingerprint(key) + self.assertEqual(fp, struct.unpack(' Date: Sat, 28 Oct 2017 13:57:58 +0200 Subject: [PATCH 6/7] Fix network test. --- telethon_tests/network_test.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/telethon_tests/network_test.py b/telethon_tests/network_test.py index 559eab45..1c27cc89 100644 --- a/telethon_tests/network_test.py +++ b/telethon_tests/network_test.py @@ -7,6 +7,9 @@ import telethon.network.authenticator as authenticator from telethon.extensions import TcpClient from telethon.network import Connection +TEST_SERVER_IP = '149.154.167.40' +TEST_SERVER_PORT = 443 + def run_server_echo_thread(port): def server_thread(): @@ -38,6 +41,7 @@ class NetworkTests(unittest.TestCase): @staticmethod def test_authenticator(): - transport = Connection('149.154.167.91', 443) + transport = Connection() + transport.connect(TEST_SERVER_IP, TEST_SERVER_PORT) authenticator.do_authentication(transport) transport.close() From d72ed4619be513ab1fb1977678d210d59693fa1b Mon Sep 17 00:00:00 2001 From: Andrei Fokau Date: Sat, 28 Oct 2017 13:38:16 +0000 Subject: [PATCH 7/7] Allow lint failures for now; use py35 for lint and coverage. --- .travis.yml | 15 ++++++++------- tox.ini | 22 +++++++++++----------- 2 files changed, 19 insertions(+), 18 deletions(-) diff --git a/.travis.yml b/.travis.yml index d02c9173..49f249c4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,22 +4,23 @@ language: python cache: pip # Tox cannot install pythons, so we set 3.5 as default, use 3.4 already -# available in container and then include 3.6 in matrix. +# available in container, and then include 3.6 in matrix. python: - 3.5 env: - - TOXENV=py34 - - TOXENV=py35 + matrix: + - TOXENV=py34 + - TOXENV=py35 matrix: include: - python: 3.6 env: TOXENV=py36 - - python: 3.4 # i.e. skip installing 3.5 - env: TOXENV=lint - - python: 3.4 - env: TOXENV=coverage34 + - env: TOXENV=coverage + - env: TOXENV=lint + allow_failures: + - env: TOXENV=lint install: - pip install tox diff --git a/tox.ini b/tox.ini index 4cdbf7b2..2300ec91 100644 --- a/tox.ini +++ b/tox.ini @@ -12,16 +12,7 @@ commands = deps = coverage [testenv:coverage] -basepython = python3.4 -skip_install = true -commands = - coverage combine - coverage report -deps = - coverage - -[testenv:coverage34] -basepython = python3.4 +basepython = python3.5 install_command = pip install {opts} {packages} ignore_errors = True @@ -34,8 +25,17 @@ commands = deps = coverage +[testenv:combine_coverage] +basepython = python3.5 +skip_install = true +commands = + coverage combine + coverage report +deps = + coverage + [testenv:lint] -basepython = python3.4 +basepython = python3.5 skip_install = true commands = flake8