def test2_new_device_fail_invalid_product(self): id = str(uuid.uuid4()) msg = json.dumps({ "message_type" : "new_device_request", "id" : id, "device_id" : "0xa123123412349999", "vendor" : "Good Company", "product_name" : "Nice Product", "refresh_time" : 30, "module_types" : [ { "type" : "pressure", "attributes" : [ {"attribute" : "inner"} ] } ] }) self.ws.send(msg) response = json.loads(self.ws.recv()) self.assertEqual("generic_response", response["message_type"]) self.assertEqual(id, response["id"]) self.assertEqual(2, response["status"]) assureNotClosed(self, self.ws) event = self.zmq.pop_data() self.assertEqual("on-refused-new-device", event["event"]) self.assertEqual("0xa123123412349999", event["device_id"]) self.assertEqual(config.gateway_id, event["gateway_id"])
def test1_register_success(self): ws = websocket.WebSocket() ws.connect(config.gws_ws_uri) msg = json.dumps({ "gateway_id": config.gateway_id, "ip_address": "192.168.1.1", "message_type": "gateway_register", "version": "v1.0" }) ws.send(msg) msg = json.loads(ws.recv()) self.assertEqual("gateway_accepted", msg["message_type"]) assureNotClosed(self, ws) event = self.zmq.pop_data() self.assertEqual("on-connected", event["event"]) self.assertEqual(config.gateway_id, event["gateway_id"]) ws.close() event = self.zmq.pop_data() self.assertEqual("on-disconnected", event["event"]) self.assertEqual(config.gateway_id, event["gateway_id"])
def test2_export_fails_due_to_unexisting_device(self): id = str(uuid.uuid4()) msg = json.dumps({ "message_type": "sensor_data_export", "id": id, "data": [{ "device_id": "0xa32d275555555555", "timestamp": 0, "values": [{ "module_id": "5", "value": -1230.0, "valid": "true" }, { "module_id": "22", "valid": "false" }, { "module_id": "89", "value": 3460.132, "valid": "true" }] }] }) self.ws.send(msg) msg = json.loads(self.ws.recv()) self.assertEqual("sensor_data_confirm", msg["message_type"]) self.assertEqual(id, msg["id"]) assureNotClosed(self, self.ws)
def test2_notice_with_custom_key(self): id = str(uuid.uuid4()) req = GET(config.ui_host, config.ui_port, "/gateways/" + config.gateway_id + "/messages") req.authorize(self.session) response, content = req() self.assertEqual(200, response.status) messages_count = len(json.loads(content)["data"]) msg = json.dumps({ "id": id, "message_type": "notice_request", "at": 1546363722909123, "severity": "info", "key": "some_message", "context": { "reason": "unknown", "attempt": 1, "valid": True } }) self.ws.send(msg) response = json.loads(self.ws.recv()) self.assertEqual("generic_response", response["message_type"]) self.assertEqual(id, response["id"]) assureNotClosed(self, self.ws) req = GET(config.ui_host, config.ui_port, "/gateways/" + config.gateway_id + "/messages") req.authorize(self.session) response, content = req() self.assertEqual(200, response.status) messages = json.loads(content)["data"] self.assertEqual(messages_count + 1, len(messages)) message = None for m in messages: if m["at"] == 1546363722909: message = m self.assertIsNotNone(message) self.assertEqual("info", message["severity"]) self.assertEqual("gateway.some_message", message["key"]) self.assertEqual("unknown", message["context"]["reason"]) self.assertEqual(1, message["context"]["attempt"]) self.assertEqual(True, message["context"]["valid"])
def test2_last_value_fail(self): id = str(uuid.uuid4()) msg = json.dumps({ "message_type": "last_value_request", "id": id, "device_id": "0xa32d27aa5e94ecfd", "module_id": 1 }) self.ws.send(msg) msg = json.loads(self.ws.recv()) self.assertEqual("last_value_response", msg["message_type"]) self.assertEqual(id, msg["id"]) self.assertEqual(2, msg["status"]) assureNotClosed(self, self.ws)
def test1_device_list_success_3_virtual(self): id = str(uuid.uuid4()) msg = json.dumps({ "message_type": "device_list_request", "id": id, "device_prefix": "VirtualDevice" }) self.ws.send(msg) self.ws.settimeout( 5) # this can take more time, suboptimal implementation msg = json.loads(self.ws.recv()) self.assertEqual("device_list_response", msg["message_type"]) self.assertEqual(id, msg["id"]) self.assertEqual(1, msg["status"]) self.assertEqual(3, len(msg["devices"])) self.assertEqual("0xa32d27aa5e94ecfd", msg["devices"][0]["device_id"]) self.assertEqual("0xa335d00019f5234e", msg["devices"][1]["device_id"]) self.assertEqual("0xa37e0f7f0302324d", msg["devices"][2]["device_id"]) self.assertEqual(2, len(msg["values"])) self.assertIn("0xa32d27aa5e94ecfd", msg["values"]) self.assertIn("0", msg["values"]["0xa32d27aa5e94ecfd"]) self.assertNotIn("1", msg["values"]["0xa32d27aa5e94ecfd"]) self.assertEqual(20, msg["values"]["0xa32d27aa5e94ecfd"]["0"]) self.assertIn("0xa335d00019f5234e", msg["values"]) self.assertIn("0", msg["values"]["0xa335d00019f5234e"]) self.assertIn("1", msg["values"]["0xa335d00019f5234e"]) self.assertIn("2", msg["values"]["0xa335d00019f5234e"]) self.assertNotIn("3", msg["values"]["0xa335d00019f5234e"]) self.assertEqual(19.5, msg["values"]["0xa335d00019f5234e"]["0"]) self.assertEqual(0, msg["values"]["0xa335d00019f5234e"]["1"]) # 0xa335d00019f5234e[2] is a random value and cannot be easily tested self.assertEqual("10.0.0.1", msg["config"]["0xa32d27aa5e94ecfd"]["ip-address"]) self.assertEqual("super-secret", msg["config"]["0xa32d27aa5e94ecfd"]["password"]) self.assertEqual("v1.0-6453", msg["config"]["0xa335d00019f5234e"]["firmware"]) assureNotClosed(self, self.ws)
def test2_device_list_success_0_jablotron(self): id = str(uuid.uuid4()) msg = json.dumps({ "message_type": "device_list_request", "id": id, "device_prefix": "Jablotron" }) self.ws.send(msg) msg = json.loads(self.ws.recv()) self.assertEqual("device_list_response", msg["message_type"]) self.assertEqual(id, msg["id"]) self.assertEqual(1, msg["status"]) self.assertEqual(0, len(msg["devices"])) self.assertNotIn("values", msg) assureNotClosed(self, self.ws)
def test1_export_successful(self): id = str(uuid.uuid4()) timestamp = int(time.time() * 1000000) msg = json.dumps({ "message_type": "sensor_data_export", "id": id, "data": [{ "device_id": "0xa32d27aa5e94ecfd", "timestamp": timestamp, "values": [{ "module_id": "0", "value": 30.0, "valid": "true" }, { "module_id": "1", "valid": "false" }, { "module_id": "2", "value": 60.0, "valid": "true" }] }] }) self.ws.send(msg) msg = json.loads(self.ws.recv()) self.assertEqual("sensor_data_confirm", msg["message_type"]) self.assertEqual(id, msg["id"]) assureNotClosed(self, self.ws) event = self.zmq.pop_data() self.assertEqual("on-sensor-data", event["event"]) self.assertEqual(config.gateway_id, event["gateway_id"]) self.assertEqual("0xa32d27aa5e94ecfd", event["device_id"]) self.assertEqual(timestamp, event["timestamp"]) self.assertEqual(30, event["data"]["0"]) self.assertIsNone(event["data"]["1"]) self.assertEqual(60, event["data"]["2"])
def test1_notice_valid(self): id = str(uuid.uuid4()) req = GET(config.ui_host, config.ui_port, "/gateways/" + config.gateway_id + "/messages") req.authorize(self.session) response, content = req() self.assertEqual(200, response.status) messages_count = len(json.loads(content)["data"]) msg = json.dumps({ "id": id, "message_type": "notice_request", "at": 1546363722908213, "severity": "error", "key": "pair_device_failed", "context": { "gateway_id": config.gateway_id, "device_id": "0xa701020311223344" } }) self.ws.send(msg) response = json.loads(self.ws.recv()) self.assertEqual("generic_response", response["message_type"]) self.assertEqual(id, response["id"]) assureNotClosed(self, self.ws) req = GET(config.ui_host, config.ui_port, "/gateways/" + config.gateway_id + "/messages") req.authorize(self.session) response, content = req() self.assertEqual(200, response.status) messages = json.loads(content)["data"] self.assertEqual(messages_count + 1, len(messages)) self.assertEqual(1546363722908, messages[0]["at"]) self.assertEqual("error", messages[0]["severity"]) self.assertEqual("gateway.pair_device_failed", messages[0]["key"]) self.assertEqual(config.gateway_id, messages[0]["context"]["gateway_id"]) self.assertEqual("0xa701020311223344", messages[0]["context"]["device_id"])
def test7_new_device_with_unknown_modules(self): id = str(uuid.uuid4()) msg1 = json.dumps({ "message_type" : "new_device_request", "id" : id, "device_id" : "0xa123123412355431", "vendor" : "Unknown sensors producer", "product_name" : "Device with unknown sensors", "refresh_time" : 30, "module_types" : [ { "type" : "unknown", "attributes" : [] }, { "type" : "unknown", "attributes" : [ {"attribute": "controllable"} ] } ] }) self.ws.send(msg1) response = json.loads(self.ws.recv()) self.assertEqual("generic_response", response["message_type"]) self.assertEqual(id, response["id"]) self.assertEqual(1, response["status"]) assureNotClosed(self, self.ws) event = self.zmq.pop_data() self.assertEqual("on-new-device", event["event"]) self.assertEqual("0xa123123412355431", event["device_id"]) self.assertEqual("Device with unknown sensors", event["device_name"]) self.assertEqual(2, len(event["modules"])) self.assertEqual("temperature", event["modules"][0]["type"]) self.assertEqual(0, event["modules"][0]["controllable"]) self.assertEqual("temperature", event["modules"][1]["type"]) self.assertEqual(1, event["modules"][1]["controllable"]) self.assertEqual(config.gateway_id, event["gateway_id"])
def test4_new_device_group_fail_invalid_module(self): id = str(uuid.uuid4()) msg = json.dumps({ "message_type": "new_device_group_request", "id": id, "group_name": "Group", "vendor": "BeeeOn", "devices": [{ "device_id": "0xa100998877665544", "product_name": "Internal Pressure v1.0", "refresh_time": 30, "module_types": [{ "type": "humidity", "attributes": [{ "attribute": "inner" }] }] }] }) self.ws.send(msg) msg = json.loads(self.ws.recv()) self.assertEqual("generic_response", msg["message_type"]) self.assertEqual(id, msg["id"]) self.assertEqual(2, msg["status"]) assureNotClosed(self, self.ws) event = self.zmq.pop_data() self.assertEqual("on-refused-new-device", event["event"]) self.assertEqual("0xa100998877665544", event["device_id"]) self.assertEqual(config.gateway_id, event["gateway_id"])
def test4_register_success_repeatedly(self): ws0 = websocket.WebSocket() ws1 = websocket.WebSocket() msg = json.dumps({ "gateway_id": config.gateway_id, "ip_address": "192.168.1.1", "message_type": "gateway_register", "version": "v1.0" }) ws0.connect(config.gws_ws_uri) ws0.send(msg) response = json.loads(ws0.recv()) self.assertEqual("gateway_accepted", response["message_type"]) assureNotClosed(self, ws0) event = self.zmq.pop_data() self.assertEqual("on-connected", event["event"]) self.assertEqual(config.gateway_id, event["gateway_id"]) ws1.connect(config.gws_ws_uri) ws1.send(msg) response = json.loads(ws1.recv()) self.assertEqual("gateway_accepted", response["message_type"]) assureIsClosed(self, ws0) assureNotClosed(self, ws1) event = self.zmq.pop_data() self.assertEqual("on-reconnected", event["event"]) self.assertEqual(config.gateway_id, event["gateway_id"]) ws1.close() event = self.zmq.pop_data() self.assertEqual("on-disconnected", event["event"]) self.assertEqual(config.gateway_id, event["gateway_id"])
def test1_new_device_success(self): id = str(uuid.uuid4()) msg = json.dumps({ "message_type" : "new_device_request", "id" : id, "device_id" : "0xa123123412341234", "vendor" : "BeeeOn", "product_name" : "Internal Pressure v1.0", "refresh_time" : 30, "module_types" : [ { "type" : "pressure", "attributes" : [ {"attribute" : "inner"} ] } ], "ip_address" : "10.0.0.1", "mac_address": "00:11:22:33:44:55", "firmware": "v1.0" }) self.ws.send(msg) response = json.loads(self.ws.recv()) self.assertEqual("generic_response", response["message_type"]) self.assertEqual(id, response["id"]) self.assertEqual(1, response["status"]) assureNotClosed(self, self.ws) event = self.zmq.pop_data() self.assertEqual("on-new-device", event["event"]) self.assertEqual("0xa123123412341234", event["device_id"]) self.assertEqual("Internal Pressure v1.0", event["device_name"]) self.assertEqual(1, len(event["modules"])) self.assertEqual("pressure", event["modules"][0]["type"]) self.assertEqual(config.gateway_id, event["gateway_id"])
def test5_new_device_fail_too_many_modules(self): id = str(uuid.uuid4()) msg = json.dumps({ "message_type" : "new_device_request", "id" : id, "device_id" : "0xa123123412342222", "vendor" : "BeeeOn", "product_name" : "Internal Pressure v1.0", "refresh_time" : 30, "module_types" : [ { "type" : "pressure", "attributes" : [ {"attribute" : "inner"} ] }, { "type" : "humidity", "attributes" : [] } ] }) self.ws.send(msg) response = json.loads(self.ws.recv()) self.assertEqual("generic_response", response["message_type"]) self.assertEqual(id, response["id"]) self.assertEqual(2, response["status"]) assureNotClosed(self, self.ws) event = self.zmq.pop_data() self.assertEqual("on-refused-new-device", event["event"]) self.assertEqual("0xa123123412342222", event["device_id"]) self.assertEqual(config.gateway_id, event["gateway_id"])
def test1_new_device_group_success(self): id = str(uuid.uuid4()) msg = json.dumps({ "message_type": "new_device_group_request", "id": id, "group_name": "BeeeOn Group", "vendor": "BeeeOn", "devices": [{ "device_id": "0xa100998877665511", "product_name": "Internal Pressure v1.0", "refresh_time": 30, "module_types": [{ "type": "pressure", "attributes": [{ "attribute": "inner" }] }] }, { "device_id": "0xa100998877665522", "product_name": "Temperature Humidity v1.0", "refresh_time": 30, "module_types": [{ "type": "temperature", "attributes": [{ "attribute": "inner" }] }, { "type": "temperature", "attributes": [{ "attribute": "outer" }] }, { "type": "humidity", "attributes": [{ "attribute": "inner" }] }, { "type": "battery", "attributes": [] }, { "type": "rssi", "attributes": [] }] }] }) self.ws.send(msg) msg = json.loads(self.ws.recv()) self.assertEqual("generic_response", msg["message_type"]) self.assertEqual(id, msg["id"]) self.assertEqual(1, msg["status"]) assureNotClosed(self, self.ws) event = self.zmq.pop_data() self.assertEqual("on-new-device", event["event"]) self.assertEqual("0xa100998877665511", event["device_id"]) self.assertEqual(config.gateway_id, event["gateway_id"]) event = self.zmq.pop_data() self.assertEqual("on-new-device", event["event"]) self.assertEqual("0xa100998877665522", event["device_id"]) self.assertEqual(config.gateway_id, event["gateway_id"])
def test6_new_device_and_update(self): id = str(uuid.uuid4()) msg1 = json.dumps({ "message_type" : "new_device_request", "id" : id, "device_id" : "0xa123123412343333", "vendor" : "Availability", "product_name" : "", "refresh_time" : 30, "module_types" : [ { "type" : "availability", "attributes" : [] } ], "serial_number": "122342341231" }) self.ws.send(msg1) response = json.loads(self.ws.recv()) self.assertEqual("generic_response", response["message_type"]) self.assertEqual(id, response["id"]) self.assertEqual(1, response["status"]) assureNotClosed(self, self.ws) notification = self.zmq.pop_data() self.assertEqual("on-new-device", notification["event"]) self.assertEqual("0xa123123412343333", notification["device_id"]) self.assertNotIn("device_name", notification) self.assertEqual(1, len(notification["modules"])) self.assertEqual("availability", notification["modules"][0]["type"]) self.assertEqual(config.gateway_id, notification["gateway_id"]) msg2 = json.dumps({ "message_type" : "new_device_request", "id" : id, "device_id" : "0xa123123412343333", "vendor" : "Availability", "name": "Super device", "product_name" : "", "refresh_time" : 30, "module_types" : [ { "type" : "availability", "attributes" : [] } ], "serial_number": "122342341231" }) self.ws.send(msg2) response = json.loads(self.ws.recv()) self.assertEqual("generic_response", response["message_type"]) self.assertEqual(id, response["id"]) self.assertEqual(1, response["status"]) assureNotClosed(self, self.ws) notification = self.zmq.pop_data() self.assertEqual("on-new-device", notification["event"]) self.assertEqual("0xa123123412343333", notification["device_id"]) self.assertEqual("Super device", notification["device_name"]) self.assertEqual(1, len(notification["modules"])) self.assertEqual("availability", notification["modules"][0]["type"]) self.assertEqual(config.gateway_id, notification["gateway_id"])