def test_running_stop_during_wait(self): checker = check.DirectioChecker(self.loop, "/path", self.complete) self.loop.call_soon_threadsafe(checker.start) self.assertTrue(self.completed.wait(1.0)) self.loop.call_soon_threadsafe(checker.stop) self.assertTrue(checker.wait(1.0)) self.assertFalse(checker.is_running())
def test_block_warnings(self, monkeypatch, fake_dd): monkeypatch.setattr(check, "_log", FakeLogger(logging.WARNING)) # Expected events: # +0.0 start checker # +0.2 fail with timeout # +0.4 log warning # +0.5 checker stopped # +0.6 dd completes, result ignored # +0.7 loop stopped def complete(result): self.results.append(result) self.loop.call_later(0.3, checker.stop) self.loop.call_later(0.4, self.loop.stop) fake_dd.configure(delay=0.6) checker = check.DirectioChecker(self.loop, "/path", complete, interval=0.2) checker.start() self.loop.run_forever() assert len(check._log.messages) == 1 # Matching time value is too fragile r = re.compile(r"Checker '/path' is blocked for .+ seconds") msg = check._log.messages[0][1] assert re.match(r, msg)
def test_running_start_raises(self): checker = check.DirectioChecker(self.loop, "/path", self.complete) checker.start() try: self.assertRaises(RuntimeError, checker.start) finally: self.loop.run_forever()
def test_block_warnings(self): # Expected events: # +0.0 start checker # +0.2 fail with timeout # +0.4 log warning # +0.5 checker stopped # +0.6 dd completes, result ignored # +0.7 loop stopped def complete(result): self.results.append(result) self.loop.call_later(0.3, checker.stop) self.loop.call_later(0.4, self.loop.stop) with fake_dd(0.6): checker = check.DirectioChecker(self.loop, "/path", complete, interval=0.2) checker.start() self.loop.run_forever() self.assertEqual(len(check._log.messages), 1) # Matching time value is too fragile r = re.compile(r"Checker '/path' is blocked for .+ seconds") msg = check._log.messages[0][1] self.assertRegexpMatches(msg, r)
def test_running_repr(self): checker = check.DirectioChecker(self.loop, "/path", self.complete) checker.start() print(checker) self.assertIn("/path", str(checker)) self.assertIn(check.RUNNING, str(checker)) self.assertIn("next_check=", str(checker))
def test_idle_stop_ignored(self): self.checks = 1 checker = check.DirectioChecker(self.loop, "/path", self.complete) checker.stop() # Will be ignored checker.start() self.loop.run_forever() self.assertTrue(checker.is_running())
def test_stopping_timeout(self, fake_dd): fake_dd.configure(delay=0.2) checker = check.DirectioChecker(self.loop, "/path", self.complete) self.loop.call_soon_threadsafe(checker.start) self.loop.call_soon_threadsafe(checker.stop) assert not checker.wait(0.1) assert checker.is_running()
def test_stopping_timeout(self): with fake_dd(0.2): checker = check.DirectioChecker(self.loop, "/path", self.complete) self.loop.call_soon_threadsafe(checker.start) self.loop.call_soon_threadsafe(checker.stop) self.assertFalse(checker.wait(0.1)) self.assertTrue(checker.is_running())
def test_running_stop_during_check(self, fake_dd): fake_dd.configure(delay=0.2) checker = check.DirectioChecker(self.loop, "/path", self.complete) self.loop.call_soon_threadsafe(checker.start) self.loop.call_soon_threadsafe(checker.stop) assert checker.wait(1.0) assert not self.completed.is_set() assert not checker.is_running()
def test_stopping_repr(self): checker = check.DirectioChecker(self.loop, "/path", self.complete) checker.start() checker.stop() print(checker) self.assertIn("/path", str(checker)) self.assertIn(check.STOPPING, str(checker)) self.assertNotIn("next_check=", str(checker))
def test_path_missing(self): self.checks = 1 checker = check.DirectioChecker(self.loop, "/no/such/path", self.complete) checker.start() self.loop.run_forever() pprint.pprint(self.results) result = self.results[0] self.assertRaises(exception.MiscFileReadException, result.delay)
def test_taskset_missing(self): self.checks = 1 with temporaryPath(data=b"blah") as path: checker = check.DirectioChecker(self.loop, path, self.complete) checker.start() self.loop.run_forever() pprint.pprint(self.results) result = self.results[0] self.assertRaises(exception.MiscFileReadException, result.delay)
def test_stopping_start_raises(self): checker = check.DirectioChecker(self.loop, "/path", self.complete) checker.start() try: checker.stop() self.assertRaises(RuntimeError, checker.start) finally: start_thread(self.wait_for_checker, checker) self.loop.run_forever()
def test_stopping_stop_ignored(self): checker = check.DirectioChecker(self.loop, "/path", self.complete) checker.start() try: checker.stop() checker.stop() # Will be ignored self.assertTrue(checker.is_running()) finally: start_thread(self.wait_for_checker, checker) self.loop.run_forever()
def test_running_repr(self): checker = check.DirectioChecker(self.loop, "/path", self.complete) checker.start() try: print(checker) assert "/path" in str(checker) assert check.RUNNING in str(checker) assert "next_check=" in str(checker) finally: self.loop.run_forever()
def test_path_ok(self): self.checks = 1 with temporaryPath(data=b"blah") as path: checker = check.DirectioChecker(self.loop, path, self.complete) checker.start() self.loop.run_forever() pprint.pprint(self.results) result = self.results[0] delay = result.delay() print("delay:", delay) self.assertEqual(type(delay), float)
def test_taskset_missing(self, monkeypatch): monkeypatch.setattr(constants, "EXT_TASKSET", "/no/such/executable") self.checks = 1 with temporaryPath(data=b"blah") as path: checker = check.DirectioChecker(self.loop, path, self.complete) checker.start() self.loop.run_forever() pprint.pprint(self.results) result = self.results[0] with pytest.raises(exception.MiscFileReadException): result.delay()
def test_path_missing_leak(self): fds_before = set(os.listdir("/proc/self/fd")) self.checks = 10 checker = check.DirectioChecker(self.loop, "/no/such/path", self.complete, interval=0.1) checker.start() self.loop.run_forever() pprint.pprint(self.results) fds_after = set(os.listdir("/proc/self/fd")) assert fds_before == fds_after
def test_stopping_repr(self): checker = check.DirectioChecker(self.loop, "/path", self.complete) checker.start() try: checker.stop() print(checker) self.assertIn("/path", str(checker)) self.assertIn(check.STOPPING, str(checker)) self.assertNotIn("next_check=", str(checker)) finally: start_thread(self.wait_for_checker, checker) self.loop.run_forever()
def test_path_ok_leak(self): fds_before = set(os.listdir("/proc/self/fd")) self.checks = 10 with temporaryPath(data=b"blah") as path: checker = check.DirectioChecker(self.loop, path, self.complete, interval=0.1) checker.start() self.loop.run_forever() pprint.pprint(self.results) fds_after = set(os.listdir("/proc/self/fd")) assert fds_before == fds_after
def test_block_warnings(self): self.checks = 1 with fake_dd(0.3): checker = check.DirectioChecker(self.loop, "/path", self.complete, interval=0.2) checker.start() self.loop.run_forever() msg = check._log.messages[0][1] # Matching time value is too fragile r = re.compile(r"Checker '/path' is blocked for .+ seconds") self.assertRegexpMatches(msg, r)
def test_path_missing(self, checkers): self.checkers = checkers start = time.time() for i in range(checkers): checker = check.DirectioChecker(self.loop, "/no/such/path", self.complete) checker.start() self.loop.run_forever() elapsed = time.time() - start self.assertEqual(len(self.results), self.checkers) print("%d checkers: %f seconds" % (checkers, elapsed)) # Make sure all failed for res in self.results: self.assertRaises(exception.MiscFileReadException, res.delay)
def test_path_ok(self, checkers): self.checkers = checkers with temporaryPath(data=b"blah") as path: start = time.time() for i in range(checkers): checker = check.DirectioChecker(self.loop, path, self.complete) checker.start() self.loop.run_forever() elapsed = time.time() - start self.assertEqual(len(self.results), self.checkers) print("%d checkers: %f seconds" % (checkers, elapsed)) # Make sure all succeeded for res in self.results: res.delay()
def test_interval(self, interval, delay, expected): self.checks = 5 clock_res = 0.01 with fake_dd(delay): checker = check.DirectioChecker(self.loop, "/path", self.complete, interval=interval) checker.start() self.loop.run_forever() pprint.pprint(self.results) for i in range(self.checks - 1): r1 = self.results[i] r2 = self.results[i + 1] actual = r2.time - r1.time self.assertAlmostEqual(actual, expected, delta=clock_res)
def test_interval(self, fake_dd, interval, delay, expected): self.checks = 5 clock_res = 0.01 fake_dd.configure(delay=delay) checker = check.DirectioChecker(self.loop, "/path", self.complete, interval=interval) checker.start() self.loop.run_forever() pprint.pprint(self.results) for i in range(self.checks - 1): r1 = self.results[i] r2 = self.results[i + 1] actual = r2.time - r1.time assert actual == pytest.approx(expected, abs=clock_res)
def test_timeout(self, fake_dd): # Expected events: # +0.0 start checker # +0.3 fail with timeout # +0.4 dd commpletes, result ignored # +0.5 loop stopped def complete(result): self.results.append(result) self.loop.call_later(0.2, self.loop.stop) fake_dd.configure(delay=0.4) checker = check.DirectioChecker(self.loop, "/path", complete, interval=0.3) checker.start() self.loop.run_forever() assert len(self.results) == 1 with pytest.raises(exception.MiscFileReadException) as e: self.results[0].delay() assert "Read timeout" in str(e.value)
def test_timeout(self): # Expected events: # +0.0 start checker # +0.3 fail with timeout # +0.4 dd commpletes, result ignored # +0.5 loop stopped def complete(result): self.results.append(result) self.loop.call_later(0.2, self.loop.stop) with fake_dd(0.4): checker = check.DirectioChecker(self.loop, "/path", complete, interval=0.3) checker.start() self.loop.run_forever() self.assertEqual(len(self.results), 1) with self.assertRaises(exception.MiscFileReadException) as e: self.results[0].delay() self.assertIn("Read timeout", str(e.exception))
def test_idle_repr(self): checker = check.DirectioChecker(self.loop, "/path", self.complete) print(checker) assert "/path" in str(checker) assert check.IDLE in str(checker) assert "next_check=" not in str(checker)
def test_idle_stop_ignored(self): checker = check.DirectioChecker(self.loop, "/path", self.complete) checker.stop() # Will be ignored self.assertFalse(checker.is_running())
def test_idle_repr(self): checker = check.DirectioChecker(self.loop, "/path", self.complete) print(checker) self.assertIn("/path", str(checker)) self.assertIn(check.IDLE, str(checker)) self.assertNotIn("next_check=", str(checker))