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
import argparse
import logging
import sys
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 +27,20 @@ if __name__ == '__main__':
suite = loader.loadTestsFromTestCase(test_class)
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()
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',
'try_telethon.py'
]),
test_suite='run_tests.test_suite',
tests_require=['PyCrypto'],
install_requires=['pyaes', 'rsa']
)

View File

@ -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 {})'\
@ -113,18 +126,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('<q', TEST_RSA_KEY_FINGERPRINT)[0])
def test_fingerprint_from_key_rsa(self):
import rsa as rsalib
key = rsalib.PublicKey.load_pkcs1(TEST_RSA_KEY)
fp = rsa._compute_fingerprint(key)
self.assertEqual(fp, struct.unpack('<q', TEST_RSA_KEY_FINGERPRINT)[0])
@staticmethod
def test_factorize():

View File

@ -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()

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