def test_new_node(): serialized = Message.new_node('1234') assert serialized == Message.serialize({ 'type': 'new', 'uid': '1234', 'dst': 'all' }) serialized = Message.new_node('1234', '5678') assert serialized == Message.serialize({ 'type': 'new', 'uid': '1234', 'dst': '5678' })
def test_update_node(value): serialized = Message.update_node('1234', 'test', 'value') assert serialized == Message.serialize({ 'type': 'update', 'uid': '1234', 'endpoint': 'test', 'data': 'value', 'dst': 'all' }) serialized = Message.update_node('1234', 'test', value, '5678') assert serialized == Message.serialize({ 'type': 'update', 'uid': '1234', 'endpoint': 'test', 'data': value, 'dst': '5678' })
def on_gateway_message(self, ws, message): """Handle a message received from a gateway. This method redirect messages from gateways to the right destinations: - for freshly new information initiated by nodes => broadcast - for replies to new client connection => only send to this client """ logger.debug( "Handling message '{}' received from gateway.".format(message)) if message['type'] == "new": # Received when notifying clients of a new node available if not message['uid'] in self.gateways[ws]: self.gateways[ws].append(message['uid']) if message['dst'] == "all": # Occurs when an unknown new node arrived self.broadcast(Message.serialize(message)) elif message['dst'] in self.clients.keys(): # Occurs when a single client has just connected self.send_to_client(message['dst'], Message.serialize(message)) elif (message['type'] == "out" and message['uid'] in self.gateways[ws]): # Node disparition are always broadcasted to clients self.gateways[ws].remove(message['uid']) self.broadcast(Message.serialize(message)) elif (message['type'] == "update" and message['uid'] in self.gateways[ws]): if message['dst'] == "all": # Occurs when a new update was pushed by a node: # require broadcast self.broadcast(Message.serialize(message)) elif message['dst'] in self.clients.keys(): # Occurs when a new client has just connected: # Only the cached information of a node are pushed to this # specific client self.send_to_client(message['dst'], Message.serialize(message))
def on_client_message(self, ws, message): """Handle a message received from a client.""" logger.debug("Handling message '{}' received from client websocket." .format(message)) if message['type'] == "new": logger.info("New client connected: {}".format(ws.uid)) if ws.uid not in self.clients.keys(): self.clients.update({ws.uid: ws}) elif message['type'] == "update": logger.debug("New message from client: {}".format(ws.uid)) # Simply forward this message to satellite gateways logger.debug("Forwarding message {} to gateways".format(message)) for gw in self.gateways: gw.write_message(Message.serialize(message))
def test_serialize(message): serialized = Message.serialize(message) assert serialized == json.dumps(message, ensure_ascii=False)
def test_discover_node(): serialized = Message.discover_node() assert serialized == Message.serialize({'request': 'discover'})
def test_reset_node(): serialized = Message.reset_node('1234') assert serialized == Message.serialize({'type': 'reset', 'uid': '1234'})
def test_out_node(): serialized = Message.out_node('1234') assert serialized == Message.serialize({'type': 'out', 'uid': '1234'})