core/tests/components/sensor/test_hddtemp.py

217 lines
7.6 KiB
Python

"""The tests for the hddtemp platform."""
import socket
import unittest
from unittest.mock import patch
from homeassistant.setup import setup_component
from tests.common import get_test_home_assistant
VALID_CONFIG_MINIMAL = {
'sensor': {
'platform': 'hddtemp',
}
}
VALID_CONFIG_NAME = {
'sensor': {
'platform': 'hddtemp',
'name': 'FooBar',
}
}
VALID_CONFIG_ONE_DISK = {
'sensor': {
'platform': 'hddtemp',
'disks': [
'/dev/sdd1',
],
}
}
VALID_CONFIG_WRONG_DISK = {
'sensor': {
'platform': 'hddtemp',
'disks': [
'/dev/sdx1',
],
}
}
VALID_CONFIG_MULTIPLE_DISKS = {
'sensor': {
'platform': 'hddtemp',
'host': 'foobar.local',
'disks': [
'/dev/sda1',
'/dev/sdb1',
'/dev/sdc1',
],
}
}
VALID_CONFIG_HOST = {
'sensor': {
'platform': 'hddtemp',
'host': 'alice.local',
}
}
VALID_CONFIG_HOST_UNREACHABLE = {
'sensor': {
'platform': 'hddtemp',
'host': 'bob.local',
}
}
class TelnetMock():
"""Mock class for the telnetlib.Telnet object."""
def __init__(self, host, port, timeout=0):
"""Initialize Telnet object."""
self.host = host
self.port = port
self.timeout = timeout
self.sample_data = bytes('|/dev/sda1|WDC WD30EZRX-12DC0B0|29|C|' +
'|/dev/sdb1|WDC WD15EADS-11P7B2|32|C|' +
'|/dev/sdc1|WDC WD20EARX-22MMMB0|29|C|' +
'|/dev/sdd1|WDC WD15EARS-00Z5B1|89|F|',
'ascii')
def read_all(self):
"""Return sample values."""
if self.host == 'alice.local':
raise ConnectionRefusedError
elif self.host == 'bob.local':
raise socket.gaierror
else:
return self.sample_data
return None
class TestHDDTempSensor(unittest.TestCase):
"""Test the hddtemp sensor."""
def setUp(self):
"""Set up things to run when tests begin."""
self.hass = get_test_home_assistant()
self.config = VALID_CONFIG_ONE_DISK
self.reference = {'/dev/sda1': {'device': '/dev/sda1',
'temperature': '29',
'unit_of_measurement': '°C',
'model': 'WDC WD30EZRX-12DC0B0', },
'/dev/sdb1': {'device': '/dev/sdb1',
'temperature': '32',
'unit_of_measurement': '°C',
'model': 'WDC WD15EADS-11P7B2', },
'/dev/sdc1': {'device': '/dev/sdc1',
'temperature': '29',
'unit_of_measurement': '°C',
'model': 'WDC WD20EARX-22MMMB0', },
'/dev/sdd1': {'device': '/dev/sdd1',
'temperature': '32',
'unit_of_measurement': '°C',
'model': 'WDC WD15EARS-00Z5B1', }, }
def tearDown(self):
"""Stop everything that was started."""
self.hass.stop()
@patch('telnetlib.Telnet', new=TelnetMock)
def test_hddtemp_min_config(self):
"""Test minimal hddtemp configuration."""
assert setup_component(self.hass, 'sensor', VALID_CONFIG_MINIMAL)
entity = self.hass.states.all()[0].entity_id
state = self.hass.states.get(entity)
reference = self.reference[state.attributes.get('device')]
self.assertEqual(state.state, reference['temperature'])
self.assertEqual(state.attributes.get('device'), reference['device'])
self.assertEqual(state.attributes.get('model'), reference['model'])
self.assertEqual(state.attributes.get('unit_of_measurement'),
reference['unit_of_measurement'])
self.assertEqual(state.attributes.get('friendly_name'),
'HD Temperature ' + reference['device'])
@patch('telnetlib.Telnet', new=TelnetMock)
def test_hddtemp_rename_config(self):
"""Test hddtemp configuration with different name."""
assert setup_component(self.hass, 'sensor', VALID_CONFIG_NAME)
entity = self.hass.states.all()[0].entity_id
state = self.hass.states.get(entity)
reference = self.reference[state.attributes.get('device')]
self.assertEqual(state.attributes.get('friendly_name'),
'FooBar ' + reference['device'])
@patch('telnetlib.Telnet', new=TelnetMock)
def test_hddtemp_one_disk(self):
"""Test hddtemp one disk configuration."""
assert setup_component(self.hass, 'sensor', VALID_CONFIG_ONE_DISK)
state = self.hass.states.get('sensor.hd_temperature_devsdd1')
reference = self.reference[state.attributes.get('device')]
self.assertEqual(state.state, reference['temperature'])
self.assertEqual(state.attributes.get('device'), reference['device'])
self.assertEqual(state.attributes.get('model'), reference['model'])
self.assertEqual(state.attributes.get('unit_of_measurement'),
reference['unit_of_measurement'])
self.assertEqual(state.attributes.get('friendly_name'),
'HD Temperature ' + reference['device'])
@patch('telnetlib.Telnet', new=TelnetMock)
def test_hddtemp_wrong_disk(self):
"""Test hddtemp wrong disk configuration."""
assert setup_component(self.hass, 'sensor', VALID_CONFIG_WRONG_DISK)
self.assertEqual(len(self.hass.states.all()), 1)
state = self.hass.states.get('sensor.hd_temperature_devsdx1')
self.assertEqual(state.attributes.get('friendly_name'),
'HD Temperature ' + '/dev/sdx1')
@patch('telnetlib.Telnet', new=TelnetMock)
def test_hddtemp_multiple_disks(self):
"""Test hddtemp multiple disk configuration."""
assert setup_component(self.hass,
'sensor', VALID_CONFIG_MULTIPLE_DISKS)
for sensor in ['sensor.hd_temperature_devsda1',
'sensor.hd_temperature_devsdb1',
'sensor.hd_temperature_devsdc1']:
state = self.hass.states.get(sensor)
reference = self.reference[state.attributes.get('device')]
self.assertEqual(state.state,
reference['temperature'])
self.assertEqual(state.attributes.get('device'),
reference['device'])
self.assertEqual(state.attributes.get('model'),
reference['model'])
self.assertEqual(state.attributes.get('unit_of_measurement'),
reference['unit_of_measurement'])
self.assertEqual(state.attributes.get('friendly_name'),
'HD Temperature ' + reference['device'])
@patch('telnetlib.Telnet', new=TelnetMock)
def test_hddtemp_host_refused(self):
"""Test hddtemp if host unreachable."""
assert setup_component(self.hass, 'sensor', VALID_CONFIG_HOST)
self.assertEqual(len(self.hass.states.all()), 0)
@patch('telnetlib.Telnet', new=TelnetMock)
def test_hddtemp_host_unreachable(self):
"""Test hddtemp if host unreachable."""
assert setup_component(self.hass, 'sensor',
VALID_CONFIG_HOST_UNREACHABLE)
self.assertEqual(len(self.hass.states.all()), 0)