From 4b8bc90d162feb1c6d6d02ef1b7e3a6359840705 Mon Sep 17 00:00:00 2001
From: Paulus Schoutsen <paulus@paulusschoutsen.nl>
Date: Wed, 28 Sep 2016 00:05:38 -0700
Subject: [PATCH] Limit worker pool to 10 threads (#3560)

* Limit worker pool to 10 threads

* Comment evdev in requirements

* Allow skipping RFXtrx tests locally

* Fix worker pool size tests

* lol whut
---
 homeassistant/bootstrap.py                    | 3 ++-
 homeassistant/components/switch/rfxtrx.py     | 1 -
 requirements_all.txt                          | 2 +-
 script/gen_requirements_all.py                | 1 +
 tests/components/camera/test_uvc.py           | 5 +++++
 tests/components/cover/test_rfxtrx.py         | 3 +++
 tests/components/light/test_rfxtrx.py         | 3 +++
 tests/components/rollershutter/test_rfxtrx.py | 3 +++
 tests/components/sensor/test_rfxtrx.py        | 3 +++
 tests/components/switch/test_rfxtrx.py        | 3 +++
 tests/components/test_influxdb.py             | 1 +
 tests/components/test_logentries.py           | 3 +++
 tests/components/test_logger.py               | 8 ++++++--
 tests/components/test_splunk.py               | 3 +++
 tests/components/test_statsd.py               | 4 ++++
 15 files changed, 41 insertions(+), 5 deletions(-)

diff --git a/homeassistant/bootstrap.py b/homeassistant/bootstrap.py
index b2c1d256c4a..21c56f55bad 100644
--- a/homeassistant/bootstrap.py
+++ b/homeassistant/bootstrap.py
@@ -118,7 +118,8 @@ def _setup_component(hass: core.HomeAssistant, domain: str, config) -> bool:
 
         # Assumption: if a component does not depend on groups
         # it communicates with devices
-        if 'group' not in getattr(component, 'DEPENDENCIES', []):
+        if 'group' not in getattr(component, 'DEPENDENCIES', []) and \
+           hass.pool.worker_count <= 10:
             hass.pool.add_worker()
 
         hass.bus.fire(
diff --git a/homeassistant/components/switch/rfxtrx.py b/homeassistant/components/switch/rfxtrx.py
index 43f2fe6a86f..959bab5fe40 100644
--- a/homeassistant/components/switch/rfxtrx.py
+++ b/homeassistant/components/switch/rfxtrx.py
@@ -6,7 +6,6 @@ https://home-assistant.io/components/switch.rfxtrx/
 """
 import logging
 
-
 import homeassistant.components.rfxtrx as rfxtrx
 from homeassistant.components.switch import SwitchDevice
 
diff --git a/requirements_all.txt b/requirements_all.txt
index ba021d93cb0..083865f8db2 100644
--- a/requirements_all.txt
+++ b/requirements_all.txt
@@ -81,7 +81,7 @@ eliqonline==1.0.12
 enocean==0.31
 
 # homeassistant.components.keyboard_remote
-evdev==0.6.1
+# evdev==0.6.1
 
 # homeassistant.components.climate.honeywell
 # homeassistant.components.thermostat.honeywell
diff --git a/script/gen_requirements_all.py b/script/gen_requirements_all.py
index 65ffa26116a..a5a25e7bab4 100755
--- a/script/gen_requirements_all.py
+++ b/script/gen_requirements_all.py
@@ -16,6 +16,7 @@ COMMENT_REQUIREMENTS = (
     'python-lirc',
     'gattlib',
     'pyuserinput',
+    'evdev',
 )
 
 IGNORE_PACKAGES = (
diff --git a/tests/components/camera/test_uvc.py b/tests/components/camera/test_uvc.py
index 10b5cf832f3..01ce1cec518 100644
--- a/tests/components/camera/test_uvc.py
+++ b/tests/components/camera/test_uvc.py
@@ -38,6 +38,7 @@ class TestUVCSetup(unittest.TestCase):
                 return {'model': 'UVC'}
 
         hass = mock.MagicMock()
+        hass.pool.worker_count = 2
         hass.config.components = ['http']
         mock_remote.return_value.index.return_value = fake_cameras
         mock_remote.return_value.get_camera.side_effect = fake_get_camera
@@ -65,6 +66,7 @@ class TestUVCSetup(unittest.TestCase):
             {'uuid': 'two', 'name': 'Back', 'id': 'id2'},
         ]
         hass = mock.MagicMock()
+        hass.pool.worker_count = 2
         hass.config.components = ['http']
         mock_remote.return_value.index.return_value = fake_cameras
         mock_remote.return_value.get_camera.return_value = {'model': 'UVC'}
@@ -92,6 +94,7 @@ class TestUVCSetup(unittest.TestCase):
             {'uuid': 'two', 'name': 'Back', 'id': 'id2'},
         ]
         hass = mock.MagicMock()
+        hass.pool.worker_count = 2
         hass.config.components = ['http']
         mock_remote.return_value.index.return_value = fake_cameras
         mock_remote.return_value.get_camera.return_value = {'model': 'UVC'}
@@ -109,6 +112,7 @@ class TestUVCSetup(unittest.TestCase):
     def test_setup_incomplete_config(self, mock_uvc):
         """"Test the setup with incomplete configuration."""
         hass = mock.MagicMock()
+        hass.pool.worker_count = 2
         hass.config.components = ['http']
 
         assert setup_component(
@@ -133,6 +137,7 @@ class TestUVCSetup(unittest.TestCase):
             'key': 'secret',
         }
         hass = mock.MagicMock()
+        hass.pool.worker_count = 2
         hass.config.components = ['http']
 
         for error in errors:
diff --git a/tests/components/cover/test_rfxtrx.py b/tests/components/cover/test_rfxtrx.py
index 96fecff2ee2..a73a2b978dc 100644
--- a/tests/components/cover/test_rfxtrx.py
+++ b/tests/components/cover/test_rfxtrx.py
@@ -1,12 +1,15 @@
 """The tests for the Rfxtrx cover platform."""
 import unittest
 
+import pytest
+
 from homeassistant.bootstrap import _setup_component
 from homeassistant.components import rfxtrx as rfxtrx_core
 
 from tests.common import get_test_home_assistant
 
 
+@pytest.mark.skipif("os.environ.get('RFXTRX') == 'SKIP'")
 class TestCoverRfxtrx(unittest.TestCase):
     """Test the Rfxtrx cover platform."""
 
diff --git a/tests/components/light/test_rfxtrx.py b/tests/components/light/test_rfxtrx.py
index cd4cecd8505..80014dfd1c1 100644
--- a/tests/components/light/test_rfxtrx.py
+++ b/tests/components/light/test_rfxtrx.py
@@ -1,12 +1,15 @@
 """The tests for the Rfxtrx light platform."""
 import unittest
 
+import pytest
+
 from homeassistant.bootstrap import _setup_component
 from homeassistant.components import rfxtrx as rfxtrx_core
 
 from tests.common import get_test_home_assistant
 
 
+@pytest.mark.skipif("os.environ.get('RFXTRX') == 'SKIP'")
 class TestLightRfxtrx(unittest.TestCase):
     """Test the Rfxtrx light platform."""
 
diff --git a/tests/components/rollershutter/test_rfxtrx.py b/tests/components/rollershutter/test_rfxtrx.py
index 704fa9310e6..1218ab37a59 100644
--- a/tests/components/rollershutter/test_rfxtrx.py
+++ b/tests/components/rollershutter/test_rfxtrx.py
@@ -1,12 +1,15 @@
 """The tests for the Rfxtrx roller shutter platform."""
 import unittest
 
+import pytest
+
 from homeassistant.bootstrap import _setup_component
 from homeassistant.components import rfxtrx as rfxtrx_core
 
 from tests.common import get_test_home_assistant
 
 
+@pytest.mark.skipif("os.environ.get('RFXTRX') == 'SKIP'")
 class TestRollershutterRfxtrx(unittest.TestCase):
     """Test the Rfxtrx roller shutter platform."""
 
diff --git a/tests/components/sensor/test_rfxtrx.py b/tests/components/sensor/test_rfxtrx.py
index 2d38de5eab5..e42aaea7e04 100644
--- a/tests/components/sensor/test_rfxtrx.py
+++ b/tests/components/sensor/test_rfxtrx.py
@@ -1,6 +1,8 @@
 """The tests for the Rfxtrx sensor platform."""
 import unittest
 
+import pytest
+
 from homeassistant.bootstrap import _setup_component
 from homeassistant.components import rfxtrx as rfxtrx_core
 from homeassistant.const import TEMP_CELSIUS
@@ -8,6 +10,7 @@ from homeassistant.const import TEMP_CELSIUS
 from tests.common import get_test_home_assistant
 
 
+@pytest.mark.skipif("os.environ.get('RFXTRX') == 'SKIP'")
 class TestSensorRfxtrx(unittest.TestCase):
     """Test the Rfxtrx sensor platform."""
 
diff --git a/tests/components/switch/test_rfxtrx.py b/tests/components/switch/test_rfxtrx.py
index 72c13bd0ba4..729abf6db06 100644
--- a/tests/components/switch/test_rfxtrx.py
+++ b/tests/components/switch/test_rfxtrx.py
@@ -1,12 +1,15 @@
 """The tests for the Rfxtrx switch platform."""
 import unittest
 
+import pytest
+
 from homeassistant.bootstrap import _setup_component
 from homeassistant.components import rfxtrx as rfxtrx_core
 
 from tests.common import get_test_home_assistant
 
 
+@pytest.mark.skipif("os.environ.get('RFXTRX') == 'SKIP'")
 class TestSwitchRfxtrx(unittest.TestCase):
     """Test the Rfxtrx switch platform."""
 
diff --git a/tests/components/test_influxdb.py b/tests/components/test_influxdb.py
index 7aa4fd616a9..3210bf0db9f 100644
--- a/tests/components/test_influxdb.py
+++ b/tests/components/test_influxdb.py
@@ -17,6 +17,7 @@ class TestInfluxDB(unittest.TestCase):
     def setUp(self):
         """Setup things to be run when tests are started."""
         self.hass = mock.MagicMock()
+        self.hass.pool.worker_count = 2
         self.handler_method = None
 
     def test_setup_config_full(self, mock_client):
diff --git a/tests/components/test_logentries.py b/tests/components/test_logentries.py
index 8642c4aa9a2..94097fba32c 100644
--- a/tests/components/test_logentries.py
+++ b/tests/components/test_logentries.py
@@ -19,6 +19,7 @@ class TestLogentries(unittest.TestCase):
             }
         }
         hass = mock.MagicMock()
+        hass.pool.worker_count = 2
         self.assertTrue(setup_component(hass, logentries.DOMAIN, config))
         self.assertTrue(hass.bus.listen.called)
         self.assertEqual(EVENT_STATE_CHANGED,
@@ -32,6 +33,7 @@ class TestLogentries(unittest.TestCase):
             }
         }
         hass = mock.MagicMock()
+        hass.pool.worker_count = 2
         self.assertTrue(setup_component(hass, logentries.DOMAIN, config))
         self.assertTrue(hass.bus.listen.called)
         self.assertEqual(EVENT_STATE_CHANGED,
@@ -48,6 +50,7 @@ class TestLogentries(unittest.TestCase):
             }
         }
         self.hass = mock.MagicMock()
+        self.hass.pool.worker_count = 2
         setup_component(self.hass, logentries.DOMAIN, config)
         self.handler_method = self.hass.bus.listen.call_args_list[0][0][1]
 
diff --git a/tests/components/test_logger.py b/tests/components/test_logger.py
index 89577d8535d..e0243335dfa 100644
--- a/tests/components/test_logger.py
+++ b/tests/components/test_logger.py
@@ -24,7 +24,9 @@ class TestUpdater(unittest.TestCase):
 
     def test_logger_setup(self):
         """Use logger to create a logging filter."""
-        setup_component(MagicMock(), logger.DOMAIN, self.log_config)
+        hass = MagicMock()
+        hass.pool.worker_count = 2
+        setup_component(hass, logger.DOMAIN, self.log_config)
 
         self.assertTrue(len(logging.root.handlers) > 0)
         handler = logging.root.handlers[-1]
@@ -37,7 +39,9 @@ class TestUpdater(unittest.TestCase):
 
     def test_logger_test_filters(self):
         """Test resulting filter operation."""
-        setup_component(MagicMock(), logger.DOMAIN, self.log_config)
+        hass = MagicMock()
+        hass.pool.worker_count = 2
+        setup_component(hass, logger.DOMAIN, self.log_config)
 
         log_filter = logging.root.handlers[-1].filters[0]
 
diff --git a/tests/components/test_splunk.py b/tests/components/test_splunk.py
index 7dcc3ca5f5c..84dc4dfaac5 100644
--- a/tests/components/test_splunk.py
+++ b/tests/components/test_splunk.py
@@ -22,6 +22,7 @@ class TestSplunk(unittest.TestCase):
         }
 
         hass = mock.MagicMock()
+        hass.pool.worker_count = 2
         self.assertTrue(setup_component(hass, splunk.DOMAIN, config))
         self.assertTrue(hass.bus.listen.called)
         self.assertEqual(EVENT_STATE_CHANGED,
@@ -37,6 +38,7 @@ class TestSplunk(unittest.TestCase):
         }
 
         hass = mock.MagicMock()
+        hass.pool.worker_count = 2
         self.assertTrue(setup_component(hass, splunk.DOMAIN, config))
         self.assertTrue(hass.bus.listen.called)
         self.assertEqual(EVENT_STATE_CHANGED,
@@ -56,6 +58,7 @@ class TestSplunk(unittest.TestCase):
         }
 
         self.hass = mock.MagicMock()
+        self.hass.pool.worker_count = 2
         setup_component(self.hass, splunk.DOMAIN, config)
         self.handler_method = self.hass.bus.listen.call_args_list[0][0][1]
 
diff --git a/tests/components/test_statsd.py b/tests/components/test_statsd.py
index ff3647674fd..6cbb26b7416 100644
--- a/tests/components/test_statsd.py
+++ b/tests/components/test_statsd.py
@@ -38,6 +38,7 @@ class TestStatsd(unittest.TestCase):
             }
         }
         hass = mock.MagicMock()
+        hass.pool.worker_count = 2
         self.assertTrue(setup_component(hass, statsd.DOMAIN, config))
         mock_connection.assert_called_once_with(
             host='host',
@@ -61,6 +62,7 @@ class TestStatsd(unittest.TestCase):
         config['statsd'][statsd.CONF_PREFIX] = statsd.DEFAULT_PREFIX
 
         hass = mock.MagicMock()
+        hass.pool.worker_count = 2
         self.assertTrue(setup_component(hass, statsd.DOMAIN, config))
         mock_connection.assert_called_once_with(
             host='host',
@@ -80,6 +82,7 @@ class TestStatsd(unittest.TestCase):
         config['statsd'][statsd.CONF_RATE] = statsd.DEFAULT_RATE
 
         hass = mock.MagicMock()
+        hass.pool.worker_count = 2
         setup_component(hass, statsd.DOMAIN, config)
         self.assertTrue(hass.bus.listen.called)
         handler_method = hass.bus.listen.call_args_list[0][0][1]
@@ -121,6 +124,7 @@ class TestStatsd(unittest.TestCase):
         config['statsd'][statsd.CONF_RATE] = statsd.DEFAULT_RATE
 
         hass = mock.MagicMock()
+        hass.pool.worker_count = 2
         setup_component(hass, statsd.DOMAIN, config)
         self.assertTrue(hass.bus.listen.called)
         handler_method = hass.bus.listen.call_args_list[0][0][1]
-- 
GitLab