示例#1
0
 def test_req(self):
     """Test req message in case where value exists."""
     sensor = self._add_sensor(1)
     sensor.children[1] = my.ChildSensor(1, Presentation.S_POWER)
     sensor.set_child_value(1, SetReq.V_VAR1, 42)
     ret = self.gateway.logic('1;1;2;0;24;\n')
     self.assertEqual(ret.encode(), '1;1;1;0;24;42\n')
示例#2
0
 def _test_persistence_upgrade(self, filename, mock_save_json):
     """Test that all attributes are present after persistence upgrade."""
     # pylint: disable=protected-access
     mock_save_json.side_effect = self._save_json_upgrade
     sensor = self._add_sensor(1)
     sensor.children[0] = my.ChildSensor(
         0, self.gateway.const.Presentation.S_LIGHT_LEVEL)
     del self.gateway.sensors[1].__dict__['new_state']
     self.assertNotIn('new_state', self.gateway.sensors[1].__dict__)
     del self.gateway.sensors[1].__dict__['queue']
     self.assertNotIn('queue', self.gateway.sensors[1].__dict__)
     del self.gateway.sensors[1].__dict__['reboot']
     self.assertNotIn('reboot', self.gateway.sensors[1].__dict__)
     del self.gateway.sensors[1].children[0].__dict__['description']
     self.assertNotIn('description',
                      self.gateway.sensors[1].children[0].__dict__)
     with tempfile.TemporaryDirectory() as temp_dir:
         self.gateway.persistence_file = os.path.join(temp_dir, filename)
         self.gateway.persistence_bak = os.path.join(
             temp_dir, '{}.bak'.format(filename))
         self.gateway._save_sensors()
         del self.gateway.sensors[1]
         self.assertNotIn(1, self.gateway.sensors)
         self.gateway._safe_load_sensors()
         self.assertEqual(self.gateway.sensors[1].new_state, {})
         self.assertEqual(self.gateway.sensors[1].queue, deque())
         self.assertEqual(self.gateway.sensors[1].reboot, False)
         self.assertEqual(self.gateway.sensors[1].children[0].description,
                          '')
         self.assertEqual(self.gateway.sensors[1].children[0].id,
                          sensor.children[0].id)
         self.assertEqual(self.gateway.sensors[1].children[0].type,
                          sensor.children[0].type)
示例#3
0
 def test_start_stop_gateway(self):
     """Test start and stop of MQTT gateway."""
     self.assertFalse(self.gateway.is_alive())
     sensor = self._add_sensor(1)
     sensor.children[1] = my.ChildSensor(
         1, self.gateway.const.Presentation.S_HUM)
     sensor.children[1].values[self.gateway.const.SetReq.V_HUM] = '20'
     self.gateway.recv('/1/1/2/0/1', '', 0)
     self.gateway.recv('/1/1/1/0/1', '30', 0)
     self.gateway.recv('/1/1/2/0/1', '', 0)
     self.gateway.start()
     self.assertTrue(self.gateway.is_alive())
     calls = [
         mock.call('/+/+/0/+/+', self.gateway.recv, 0),
         mock.call('/+/+/3/+/+', self.gateway.recv, 0)
     ]
     self.mock_sub.assert_has_calls(calls)
     time.sleep(0.05)
     calls = [
         mock.call('/1/1/1/0/1', '20', 0, True),
         mock.call('/1/1/1/0/1', '30', 0, True)
     ]
     self.mock_pub.assert_has_calls(calls)
     self.gateway.stop()
     self.gateway.join(timeout=0.5)
     self.assertFalse(self.gateway.is_alive())
示例#4
0
    def test_mqtt_load_persistence(self):
        """Test load persistence file for MQTTGateway."""
        sensor = self._add_sensor(1)
        sensor.children[1] = my.ChildSensor(
            1, self.gateway.const.Presentation.S_HUM)
        sensor.children[1].values[self.gateway.const.SetReq.V_HUM] = '20'

        with tempfile.TemporaryDirectory() as temp_dir:
            self.gateway.persistence_file = os.path.join(temp_dir, 'file.json')
            # pylint: disable=protected-access
            self.gateway._save_sensors()
            del self.gateway.sensors[1]
            self.assertNotIn(1, self.gateway.sensors)
            self.gateway._safe_load_sensors()
        self.assertEqual(self.gateway.sensors[1].children[1].id,
                         sensor.children[1].id)
        self.assertEqual(self.gateway.sensors[1].children[1].type,
                         sensor.children[1].type)
        self.assertEqual(self.gateway.sensors[1].children[1].values,
                         sensor.children[1].values)
        calls = [
            mock.call('/1/1/1/+/+', self.gateway.recv, 0),
            mock.call('/1/1/2/+/+', self.gateway.recv, 0),
            mock.call('/1/+/4/+/+', self.gateway.recv, 0)
        ]
        self.mock_sub.assert_has_calls(calls)
示例#5
0
 def test_req_novalue(self):
     """Test req message for sensor with no value."""
     sensor = self._add_sensor(1)
     sensor.children[1] = my.ChildSensor(
         1, self.gateway.const.Presentation.S_POWER)
     ret = self.gateway.logic('1;1;2;0;24;\n')
     self.assertEqual(ret, None)
示例#6
0
 def test_set_humidity_level(self):
     """Test set humidity level."""
     sensor = self._add_sensor(1)
     sensor.children[1] = my.ChildSensor(
         1, self.gateway.const.Presentation.S_HUM)
     self.gateway.logic('1;1;1;0;1;75\n')
     self.assertEqual(
         sensor.children[1].values[self.gateway.const.SetReq.V_HUM], '75')
示例#7
0
 def test_set_and_reboot(self):
     """Test set message with reboot attribute true."""
     sensor = self._add_sensor(1)
     sensor.children[0] = my.ChildSensor(
         0, self.gateway.const.Presentation.S_LIGHT_LEVEL)
     sensor.reboot = True
     ret = self.gateway.logic('1;0;1;0;23;43\n')
     self.assertEqual(ret, '1;255;3;0;13;\n')
示例#8
0
 def test_req_zerovalue(self):
     """Test req message in case where value exists but is zero."""
     sensor = self._add_sensor(1)
     sensor.children[1] = my.ChildSensor(
         1, self.gateway.const.Presentation.S_POWER)
     sensor.set_child_value(1, self.gateway.const.SetReq.V_VAR1, 0)
     ret = self.gateway.logic('1;1;2;0;24;\n')
     self.assertEqual(ret, '1;1;1;0;24;0\n')
示例#9
0
 def test_recv_wrong_prefix(self):
     """Test recv method with wrong topic prefix. """
     sensor = self._add_sensor(1)
     sensor.children[1] = my.ChildSensor(
         1, self.gateway.const.Presentation.S_HUM)
     sensor.children[1].values[self.gateway.const.SetReq.V_HUM] = '20'
     self.gateway.recv('wrong/1/1/2/0/1', '', 0)
     ret = self.gateway.handle_queue()
     self.assertEqual(ret, None)
示例#10
0
 def test_set_light_level(self):
     """Test set of light level."""
     sensor = self._add_sensor(1)
     sensor.children[0] = my.ChildSensor(
         0, self.gateway.const.Presentation.S_LIGHT_LEVEL)
     self.gateway.logic('1;0;1;0;23;43\n')
     self.assertEqual(
         sensor.children[0].values[self.gateway.const.SetReq.V_LIGHT_LEVEL],
         '43')
示例#11
0
 def test_set_child_value_bad_ack(self):
     """Test Gateway method set_child_value with bad ack."""
     sensor = self._add_sensor(1)
     sensor.children[0] = my.ChildSensor(
         0, self.gateway.const.Presentation.S_LIGHT)
     self.gateway.set_child_value(1,
                                  0,
                                  self.gateway.const.SetReq.V_LIGHT,
                                  1,
                                  ack='one')
     ret = self.gateway.handle_queue()
     self.assertEqual(ret, None)
示例#12
0
 def test_set_with_new_state(self):
     """Test set message with populated new_state."""
     sensor = self._add_sensor(1)
     sensor.children[0] = my.ChildSensor(
         0, self.gateway.const.Presentation.S_LIGHT_LEVEL)
     self.gateway.logic('1;0;1;0;23;43\n')
     self.gateway.logic('1;255;3;0;22;\n')
     self.gateway.logic('1;0;1;0;23;57\n')
     self.assertEqual(
         sensor.children[0].values[self.gateway.const.SetReq.V_LIGHT_LEVEL],
         sensor.new_state[0].values[
             self.gateway.const.SetReq.V_LIGHT_LEVEL])
示例#13
0
 def test_set_child_no_children(self):
     """Test Gateway method set_child_value without child in children."""
     sensor = self._add_sensor(1)
     sensor.children[0] = my.ChildSensor(
         0, self.gateway.const.Presentation.S_LIGHT)
     self.gateway.set_child_value(1,
                                  0,
                                  self.gateway.const.SetReq.V_LIGHT,
                                  1,
                                  children={})
     ret = self.gateway.handle_queue()
     self.assertEqual(ret, None)
示例#14
0
 def test_recv(self):
     """Test recv method. """
     sensor = self._add_sensor(1)
     sensor.children[1] = my.ChildSensor(
         1, self.gateway.const.Presentation.S_HUM)
     sensor.children[1].values[self.gateway.const.SetReq.V_HUM] = '20'
     self.gateway.recv('/1/1/2/0/1', '', 0)
     ret = self.gateway.handle_queue()
     self.assertEqual(ret, '1;1;1;0;1;20\n')
     self.gateway.recv('/1/1/2/0/1', '', 1)
     ret = self.gateway.handle_queue()
     self.assertEqual(ret, '1;1;1;1;1;20\n')
示例#15
0
 def test_callback(self, mock_save_sensors):
     """Test gateway callback function."""
     self.gateway.event_callback = self._callback
     self.gateway.persistence = True
     self.gateway.test_callback_node_id = None
     self.gateway.test_callback_update = None
     sensor = self._add_sensor(1)
     sensor.children[0] = my.ChildSensor(
         0, self.gateway.const.Presentation.S_LIGHT_LEVEL)
     self.gateway.logic('1;0;1;0;23;43\n')
     self.assertEqual(1, self.gateway.test_callback_node_id)
     self.assertEqual('sensor_update', self.gateway.test_callback_update)
     assert mock_save_sensors.called
示例#16
0
 def test_set_child_value(self):
     """Test Gateway method set_child_value."""
     sensor = self._add_sensor(1)
     sensor.children[0] = my.ChildSensor(
         0, self.gateway.const.Presentation.S_LIGHT)
     self.gateway.set_child_value(1, 0, self.gateway.const.SetReq.V_LIGHT,
                                  '1')
     ret = self.gateway.handle_queue()
     self.assertEqual(ret, '1;0;1;0;2;1\n')
     # test integer value
     self.gateway.set_child_value(1, 0, self.gateway.const.SetReq.V_LIGHT,
                                  0)
     ret = self.gateway.handle_queue()
     self.assertEqual(ret, '1;0;1;0;2;0\n')
示例#17
0
    def _test_persistence(self, filename):
        """Test persistence."""
        sensor = self._add_sensor(1)
        sensor.children[0] = my.ChildSensor(
            0, self.gateway.const.Presentation.S_LIGHT_LEVEL, 'test')
        sensor.children[0].values[
            self.gateway.const.SetReq.V_LIGHT_LEVEL] = '43'
        self.gateway.sensors[
            1].type = self.gateway.const.Presentation.S_ARDUINO_NODE
        self.gateway.sensors[1].sketch_name = 'testsketch'
        self.gateway.sensors[1].sketch_version = '1.0'
        self.gateway.sensors[1].battery_level = 78
        self.gateway.sensors[1].protocol_version = '1.4.1'

        with tempfile.TemporaryDirectory() as temp_dir:
            self.gateway.persistence_file = os.path.join(temp_dir, filename)
            self.gateway.persistence_bak = os.path.join(
                temp_dir, '{}.bak'.format(filename))
            # pylint: disable=protected-access
            self.gateway._save_sensors()
            del self.gateway.sensors[1]
            self.assertNotIn(1, self.gateway.sensors)
            self.gateway._safe_load_sensors()
            self.assertEqual(self.gateway.sensors[1].sketch_name,
                             sensor.sketch_name)
            self.assertEqual(self.gateway.sensors[1].sketch_version,
                             sensor.sketch_version)
            self.assertEqual(self.gateway.sensors[1].battery_level,
                             sensor.battery_level)
            self.assertEqual(self.gateway.sensors[1].type, sensor.type)
            self.assertEqual(self.gateway.sensors[1].protocol_version,
                             sensor.protocol_version)
            self.assertEqual(self.gateway.sensors[1].children[0].id,
                             sensor.children[0].id)
            self.assertEqual(self.gateway.sensors[1].children[0].type,
                             sensor.children[0].type)
            self.assertEqual(self.gateway.sensors[1].children[0].description,
                             sensor.children[0].description)
            self.assertEqual(self.gateway.sensors[1].children[0].values,
                             sensor.children[0].values)
            self.gateway._save_sensors()
            del self.gateway.sensors[1]
            self.assertNotIn(1, self.gateway.sensors)
            self.gateway._safe_load_sensors()
            self.assertIn(1, self.gateway.sensors)
示例#18
0
    def test_json_persistence(self):
        sensor = self._add_sensor(1)
        sensor.children[0] = my.ChildSensor(0, Presentation.S_LIGHT_LEVEL)
        self.gw.sensors[1].type = Presentation.S_ARDUINO_NODE
        self.gw.sensors[1].sketch_name = "testsketch"
        self.gw.sensors[1].sketch_version = "1.0"
        self.gw.sensors[1].battery_level = 78

        sensor = self.gw.sensors[1]
        self.gw.persistence_file = "persistance.file.json"
        self.gw._save_sensors()
        del self.gw.sensors[1]
        self.gw._load_sensors()
        self.assertEqual(self.gw.sensors[1].sketch_name, sensor.sketch_name)
        self.assertEqual(self.gw.sensors[1].sketch_version,
                         sensor.sketch_version)
        self.assertEqual(self.gw.sensors[1].battery_level,
                         sensor.battery_level)
        self.assertEqual(self.gw.sensors[1].type, sensor.type)
示例#19
0
 def test_heartbeat(self):
     """Test heartbeat message."""
     sensor = self._add_sensor(1)
     sensor.children[0] = my.ChildSensor(
         0, self.gateway.const.Presentation.S_LIGHT_LEVEL)
     self.gateway.logic('1;0;1;0;23;43\n')
     ret = self.gateway.handle_queue()
     self.assertEqual(ret, None)
     # heartbeat
     self.gateway.logic('1;255;3;0;22;\n')
     ret = self.gateway.handle_queue()
     # nothing has changed
     self.assertEqual(ret, None)
     # change from controller side
     self.gateway.set_child_value(1, 0,
                                  self.gateway.const.SetReq.V_LIGHT_LEVEL,
                                  '57')
     ret = self.gateway.handle_queue()
     # no heartbeat
     self.assertEqual(ret, None)
     # heartbeat comes in
     self.gateway.logic('1;255;3;0;22;\n')
     ret = self.gateway.handle_queue()
     # instance responds with new values
     self.assertEqual(ret, '1;0;1;0;23;57\n')
     # request from node
     self.gateway.logic('1;0;2;0;23;\n')
     ret = self.gateway.handle_queue()
     # no heartbeat
     self.assertEqual(ret, None)
     # heartbeat
     self.gateway.logic('1;255;3;0;22;\n')
     ret = self.gateway.handle_queue()
     # instance responds to request with current value
     self.assertEqual(ret, '1;0;1;0;23;57\n')
     # heartbeat
     self.gateway.logic('1;255;3;0;22;\n')
     ret = self.gateway.handle_queue()
     # nothing has changed
     self.assertEqual(ret, None)
示例#20
0
    def test_json_persistence(self):
        """Test persistence using json."""
        sensor = self._add_sensor(1)
        sensor.children[0] = my.ChildSensor(0, Presentation.S_LIGHT_LEVEL)
        self.gateway.sensors[1].type = Presentation.S_ARDUINO_NODE
        self.gateway.sensors[1].sketch_name = 'testsketch'
        self.gateway.sensors[1].sketch_version = '1.0'
        self.gateway.sensors[1].battery_level = 78
        self.gateway.sensors[1].protocol_version = '1.4.1'

        sensor = self.gateway.sensors[1]
        self.gateway.persistence_file = 'persistence.file.json'
        self.gateway._save_sensors()  # pylint: disable=protected-access
        del self.gateway.sensors[1]
        self.gateway._load_sensors()  # pylint: disable=protected-access
        self.assertEqual(self.gateway.sensors[1].sketch_name,
                         sensor.sketch_name)
        self.assertEqual(self.gateway.sensors[1].sketch_version,
                         sensor.sketch_version)
        self.assertEqual(self.gateway.sensors[1].battery_level,
                         sensor.battery_level)
        self.assertEqual(self.gateway.sensors[1].type, sensor.type)
        self.assertEqual(self.gateway.sensors[1].protocol_version,
                         sensor.protocol_version)
示例#21
0
 def test_humidity_level(self):
     sensor = self._add_sensor(1)
     sensor.children[1] = my.ChildSensor(1, Presentation.S_HUM)
     self.gw.logic("1;1;1;0;1;75\n")
     self.assertEqual(sensor.children[1].values[SetReq.V_HUM], '75')
示例#22
0
 def test_set_light_level(self):
     sensor = self._add_sensor(1)
     sensor.children[0] = my.ChildSensor(0, Presentation.S_LIGHT_LEVEL)
     self.gw.logic("1;0;1;0;23;43\n")
     self.assertEqual(sensor.children[0].values[SetReq.V_LIGHT_LEVEL], '43')