1 changed files with 91 additions and 0 deletions
@ -0,0 +1,91 @@ |
|||
import unittest |
|||
from mock import patch |
|||
import gevent |
|||
import gevent.queue |
|||
|
|||
from steam.core.cm import CMClient |
|||
|
|||
class CMClient_Scenarios(unittest.TestCase): |
|||
test_channel_key = b'SESSION KEY LOL' |
|||
|
|||
def setUp(self): |
|||
# mock out crypto |
|||
patcher = patch('steam.core.crypto.generate_session_key') |
|||
self.addCleanup(patcher.stop) |
|||
self.gen_skey = patcher.start() |
|||
self.gen_skey.return_value = (self.test_channel_key, b'PUBKEY ENCRYPTED SESSION KEY') |
|||
|
|||
patcher = patch('steam.core.crypto.symmetric_encrypt') |
|||
self.addCleanup(patcher.stop) |
|||
self.s_enc = patcher.start() |
|||
self.s_enc.side_effect = lambda m, k: m |
|||
patcher = patch('steam.core.crypto.symmetric_encrypt_HMAC') |
|||
self.addCleanup(patcher.stop) |
|||
self.s_enc_hmac = patcher.start() |
|||
self.s_enc_hmac.side_effect = lambda m, k, mac: m |
|||
|
|||
patcher = patch('steam.core.crypto.symmetric_decrypt') |
|||
self.addCleanup(patcher.stop) |
|||
self.s_dec = patcher.start() |
|||
self.s_dec.side_effect = lambda c, k: c |
|||
patcher = patch('steam.core.crypto.symmetric_decrypt_HMAC') |
|||
self.addCleanup(patcher.stop) |
|||
self.s_dec_hmac = patcher.start() |
|||
self.s_dec_hmac.side_effect = lambda c, k, mac: c |
|||
|
|||
# mock out TCPConnection |
|||
patcher = patch('steam.core.cm.TCPConnection', autospec=True) |
|||
self.addCleanup(patcher.stop) |
|||
self.conn = patcher.start().return_value |
|||
|
|||
self.conn_in = gevent.queue.Queue() |
|||
self.conn.__iter__.return_value = self.conn_in |
|||
|
|||
# mock out CMServerList |
|||
patcher = patch('steam.core.cm.CMServerList', autospec=True) |
|||
self.addCleanup(patcher.stop) |
|||
self.server_list = patcher.start().return_value |
|||
|
|||
self.server_list.__iter__.return_value = [(127001, i+1) for i in range(10)] |
|||
|
|||
@patch.object(CMClient, 'emit') |
|||
@patch.object(CMClient, '_recv_messages') |
|||
def test_connect(self, mock_recv, mock_emit): |
|||
# setup |
|||
self.conn.connect.return_value = True |
|||
|
|||
# run |
|||
cm = CMClient() |
|||
|
|||
with gevent.Timeout(2, False): |
|||
cm.connect() |
|||
|
|||
gevent.idle() |
|||
|
|||
# verify |
|||
self.conn.connect.assert_called_once_with((127001, 1)) |
|||
mock_emit.assert_called_once_with('connected') |
|||
mock_recv.assert_called_once_with() |
|||
|
|||
|
|||
def test_channel_encrypt_sequence(self): |
|||
# setup |
|||
self.conn.connect.return_value = True |
|||
|
|||
# run ------------ |
|||
cm = CMClient() |
|||
cm.connected = True |
|||
gevent.spawn(cm._recv_messages) |
|||
|
|||
# recieve ChannelEncryptRequest |
|||
self.conn_in.put(b'\x17\x05\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01\x00\x00\x00\x01\x00\x00\x00') |
|||
gevent.idle(); gevent.idle(); gevent.idle(); gevent.idle() |
|||
|
|||
self.conn.put_message.assert_called_once_with(b'\x18\x05\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01\x00\x00\x00\x80\x00\x00\x00PUBKEY ENCRYPTED SESSION KEY\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00h-\xc4@\x00\x00\x00\x00') |
|||
|
|||
# recieve ChannelEncryptResult (OK) |
|||
self.conn_in.put(b'\x19\x05\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01\x00\x00\x00') |
|||
|
|||
cm.wait_event('channel_secured', timeout=2, raises=True) |
|||
|
|||
|
Loading…
Reference in new issue