mirror of
https://github.com/LonamiWebs/Telethon.git
synced 2025-08-05 12:40: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
|
||||
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
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',
|
||||
'try_telethon.py'
|
||||
]),
|
||||
test_suite='run_tests.test_suite',
|
||||
tests_require=['PyCrypto'],
|
||||
install_requires=['pyaes', 'rsa']
|
||||
)
|
||||
|
||||
|
|
|
@ -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():
|
||||
|
|
|
@ -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
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