# -*- coding: utf-8 -*-
import sys
import pytest
from blynklib import Protocol, BlynkError
class TestBlynkProtocol:
@pytest.fixture
def pb(self):
protocol = Protocol()
yield protocol
def test_get_msg_id(self, pb):
pb._msg_id = 4
msg_id = pb._get_msg_id()
assert msg_id == 5
def test_get_msg_id_before_loop(self, pb):
pb._msg_id = 0xFFFE
msg_id = pb._get_msg_id()
assert msg_id == 0xFFFF
def test_get_msg_id_after_loop(self, pb):
pb._msg_id = 0xFFFF
msg_id = pb._get_msg_id()
assert msg_id == 1
def test_get_msg_id_defined(self, pb):
pb._msg_id = 0xFFFF
msg_id = pb._get_msg_id(msg_id=17)
assert msg_id == 17
def test_pack_msg(self, pb):
msg_type = 20
args = ['test', 1234, 745, 'abcde']
result = pb._pack_msg(msg_type, *args)
assert result == b'\x14\x00\x01\x00\x13test\x001234\x00745\x00abcde'
def test_pack_msg_no_args(self, pb):
msg_type = 15
args = []
result = pb._pack_msg(msg_type, *args)
assert result == b'\x0f\x00\x01\x00\x00'
def test_pack_msg_unicode(self, pb):
if sys.version_info[0] == 2:
pytest.skip('Python2 unicode compatibility issue')
msg_type = 20
args = ['']
result = pb._pack_msg(msg_type, *args)
assert result == b'\x14\x00\x01\x00\x04\xd1\x91\xd0\xb6'
def test_parse_response_msg_hw(self, pb):
data = b'\x14\x00\x02\x00\x13test\x001234\x00745\x00abcde'
msg_buffer = 1024
result = pb.parse_response(data, msg_buffer)
assert result == (20, 2, 19, [u'test', u'1234', u'745', u'abcde'])
def test_parse_response_msg_id_0(self, pb):
data = b'\x14\x00\x00\x00\x13test\x001234\x00745\x00abcde'
msg_buffer = 100
with pytest.raises(BlynkError) as b_err:
pb.parse_response(data, msg_buffer)
assert 'invalid msg_id == 0' == str(b_err.value)
def test_parse_response_more_data_than_buffer(self, pb):
data = b'\x14\x00\x02\x00\x13test\x001234\x00745\x00abcde'
msg_buffer = 10
with pytest.raises(BlynkError) as b_err:
pb.parse_response(data, msg_buffer)
assert 'Command too long' in str(b_err.value)
def test_parse_response_msg_ping(self, pb):
data = b'\x06\x00\x04\x00\x13test\x001234\x00745\x00abcde'
msg_buffer = 100
result = pb.parse_response(data, msg_buffer)
assert result == (6, 4, 19, [])
def test_parse_response_corrupted_data(self, pb):
data = b'\xd1\x91\xd0\xb6'
msg_buffer = 100
with pytest.raises(Exception) as exc:
pb.parse_response(data, msg_buffer)
assert 'Message parse error:' in str(exc.value)
def test_parse_response_wrong_msg_type(self, pb):
data = b'\x86\x00\x04\x00\x13test\x001234\x00745\x00abcde'
msg_buffer = 100
with pytest.raises(BlynkError) as b_err:
pb.parse_response(data, msg_buffer)
assert "Unknown message type: '134'" in str(b_err.value)
def test_parse_response_msg_hw_unicode(self, pb):
data = b'\x14\x00\x02\x00\x04\xd1\x91\xd0\xb6'
msg_buffer = 1024
result = pb.parse_response(data, msg_buffer)
assert result == (20, 2, 4, [u''])
def test_heartbeat_msg(self, pb):
result = pb.heartbeat_msg(20, 2048)
assert result == b'\x11\x00\x01\x00+ver\x000.2.6\x00buff-in\x002048\x00h-beat\x0020\x00dev\x00python'
def test_login_msg(self, pb):
result = pb.login_msg('1234')
assert result == b'\x02\x00\x01\x00\x041234'
def test_ping_msg(self, pb):
result = pb.ping_msg()
assert result == b'\x06\x00\x01\x00\x00'
def test_response_msg(self, pb):
result = pb.response_msg(202)
assert result == b'\x00\x00\x01\x00\x03202'
def test_virtual_write_msg(self, pb):
result = pb.virtual_write_msg(127, 'abc', 123)
assert result == b'\x14\x00\x01\x00\x0evw\x00127\x00abc\x00123'
def test_virtual_sync_msg(self, pb):
result = pb.virtual_sync_msg(1, 24)
assert result == b'\x10\x00\x01\x00\x07vr\x001\x0024'
def test_email_msg(self, pb):
result = pb.email_msg('a@b.com', 'Test', 'MSG')
assert result == b'\r\x00\x01\x00\x10a@b.com\x00Test\x00MSG'
def test_tweet_msg(self, pb):
result = pb.tweet_msg('tweet_msg_test')
assert result == b'\x0c\x00\x01\x00\x0etweet_msg_test'
def test_notify_msg(self, pb):
result = pb.notify_msg('app_msg_test')
assert result == b'\x0e\x00\x01\x00\x0capp_msg_test'
def test_set_property_msg(self, pb):
result = pb.set_property_msg(10, 'color', '#FF00EE')
assert result == b'\x13\x00\x01\x00\x1010\x00color\x00#FF00EE'
def test_internal_msg(self, pb):
result = pb.internal_msg('rtc', 'sync')
assert result == b'\x11\x00\x01\x00\x08rtc\x00sync'