This commit is contained in:
Andrei Fokau 2018-02-13 15:48:29 +00:00 committed by GitHub
commit f11d2bc290
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 156 additions and 20 deletions

35
.travis.yml Normal file
View File

@ -0,0 +1,35 @@
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:
matrix:
- TOXENV=py34
- TOXENV=py35
matrix:
include:
- python: 3.6
env: TOXENV=py36
- env: TOXENV=coverage
- env: TOXENV=lint
allow_failures:
- env: TOXENV=lint
install:
- pip install tox
script:
- tox
after_success:
- if [[ $TOXENV =~ coverage34 ]]; then
pip install --quiet python-coveralls;
coveralls --ignore-errors;
fi

View File

@ -1,14 +1,23 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
import argparse
import logging
import sys
import unittest import unittest
if __name__ == '__main__': logging.basicConfig(level=logging.DEBUG)
log = logging.getLogger(__name__)
def test_suite(skip_network=False):
from telethon_tests import \ from telethon_tests import \
CryptoTests, ParserTests, TLTests, UtilsTests, NetworkTests CryptoTests, ParserTests, TLTests, UtilsTests, NetworkTests
test_classes = [CryptoTests, ParserTests, TLTests, UtilsTests] test_classes = [CryptoTests, ParserTests, TLTests, UtilsTests]
network = input('Run network tests (y/n)?: ').lower() == 'y' if skip_network:
if network: log.warning("Skipping network tests")
else:
log.info("Running with network tests")
test_classes.append(NetworkTests) test_classes.append(NetworkTests)
loader = unittest.TestLoader() loader = unittest.TestLoader()
@ -18,7 +27,20 @@ if __name__ == '__main__':
suite = loader.loadTestsFromTestCase(test_class) suite = loader.loadTestsFromTestCase(test_class)
suites_list.append(suite) suites_list.append(suite)
big_suite = unittest.TestSuite(suites_list) return unittest.TestSuite(suites_list)
def main(skip_network=False):
big_suite = test_suite(skip_network=skip_network)
runner = unittest.TextTestRunner() runner = unittest.TextTestRunner()
results = runner.run(big_suite) 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()
main(skip_network=args.skip_network)

19
setup.cfg Normal file
View File

@ -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__.:

View File

@ -149,6 +149,8 @@ def main():
'telethon_generator', 'telethon_tests', 'run_tests.py', 'telethon_generator', 'telethon_tests', 'run_tests.py',
'try_telethon.py' 'try_telethon.py'
]), ]),
test_suite='run_tests.test_suite',
tests_require=['PyCrypto'],
install_requires=['pyaes', 'rsa'] install_requires=['pyaes', 'rsa']
) )

View File

@ -1,11 +1,24 @@
import hashlib
import struct
import unittest import unittest
from hashlib import sha1
import telethon.helpers as utils import telethon.helpers as utils
from telethon.crypto import AES, Factorization from telethon.crypto import AES, Factorization
from telethon.crypto import rsa from telethon.crypto import rsa
from Crypto.PublicKey import RSA as PyCryptoRSA 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): class CryptoTests(unittest.TestCase):
def setUp(self): def setUp(self):
@ -26,7 +39,7 @@ class CryptoTests(unittest.TestCase):
def test_sha1(): def test_sha1():
string = 'Example string' 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' 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 {})'\ assert hash_sum == expected, 'Invalid sha1 hash_sum representation (should be {}, but is {})'\
@ -113,18 +126,16 @@ class CryptoTests(unittest.TestCase):
assert iv == expected_iv, 'IV ("{}") does not equal expected ("{}")'.format( assert iv == expected_iv, 'IV ("{}") does not equal expected ("{}")'.format(
iv, expected_iv) iv, expected_iv)
@staticmethod def test_fingerprint_from_key_pycrypto(self):
def test_fingerprint_from_key(): key = PyCryptoRSA.importKey(TEST_RSA_KEY)
assert rsa._compute_fingerprint(PyCryptoRSA.importKey( fp = rsa._compute_fingerprint(key)
'-----BEGIN RSA PUBLIC KEY-----\n' self.assertEqual(fp, struct.unpack('<q', TEST_RSA_KEY_FINGERPRINT)[0])
'MIIBCgKCAQEAwVACPi9w23mF3tBkdZz+zwrzKOaaQdr01vAbU4E1pvkfj4sqDsm6\n'
'lyDONS789sVoD/xCS9Y0hkkC3gtL1tSfTlgCMOOul9lcixlEKzwKENj1Yz/s7daS\n' def test_fingerprint_from_key_rsa(self):
'an9tqw3bfUV/nqgbhGX81v/+7RFAEd+RwFnK7a+XYl9sluzHRyVVaTTveB2GazTw\n' import rsa as rsalib
'Efzk2DWgkBluml8OREmvfraX3bkHZJTKX4EQSjBbbdJ2ZXIsRrYOXfaA+xayEGB+\n' key = rsalib.PublicKey.load_pkcs1(TEST_RSA_KEY)
'8hdlLmAjbCVfaigxX0CDqWeR1yFL9kwd9P0NsZRPsmoqVwMbMu7mStFai6aIhc3n\n' fp = rsa._compute_fingerprint(key)
'Slv8kg9qv1m6XHVQY3PnEw+QQtqSIXklHwIDAQAB\n' self.assertEqual(fp, struct.unpack('<q', TEST_RSA_KEY_FINGERPRINT)[0])
'-----END RSA PUBLIC KEY-----'
)) == b'!k\xe8l\x02+\xb4\xc3', 'Wrong fingerprint calculated'
@staticmethod @staticmethod
def test_factorize(): def test_factorize():

View File

@ -7,6 +7,9 @@ import telethon.network.authenticator as authenticator
from telethon.extensions import TcpClient from telethon.extensions import TcpClient
from telethon.network import Connection from telethon.network import Connection
TEST_SERVER_IP = '149.154.167.40'
TEST_SERVER_PORT = 443
def run_server_echo_thread(port): def run_server_echo_thread(port):
def server_thread(): def server_thread():
@ -38,6 +41,7 @@ class NetworkTests(unittest.TestCase):
@staticmethod @staticmethod
def test_authenticator(): def test_authenticator():
transport = Connection('149.154.167.91', 443) transport = Connection()
transport.connect(TEST_SERVER_IP, TEST_SERVER_PORT)
authenticator.do_authentication(transport) authenticator.do_authentication(transport)
transport.close() transport.close()

43
tox.ini Normal file
View File

@ -0,0 +1,43 @@
[tox]
envlist = py34,py35,py36
[testenv]
recreate = True
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]
basepython = python3.5
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:combine_coverage]
basepython = python3.5
skip_install = true
commands =
coverage combine
coverage report
deps =
coverage
[testenv:lint]
basepython = python3.5
skip_install = true
commands =
flake8
deps =
flake8