mirror of
https://github.com/LonamiWebs/Telethon.git
synced 2025-08-06 21:20:22 +03:00
Merge d72ed4619b
into 08b9d7c4ef
This commit is contained in:
commit
f11d2bc290
35
.travis.yml
Normal file
35
.travis.yml
Normal 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
|
32
run_tests.py
32
run_tests.py
|
@ -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
19
setup.cfg
Normal 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__.:
|
2
setup.py
2
setup.py
|
@ -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']
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -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():
|
||||||
|
|
|
@ -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
43
tox.ini
Normal 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
|
Loading…
Reference in New Issue
Block a user