def test_get_initial_sleep_delay_jitter_disabled(self):
        logger = mock.Mock()

        # 1. Default value is used
        monitor_config = MonitorConfig(
            {"module": "test_module"}, monitor_module="test_monitor"
        )
        global_config = mock.Mock()
        global_config.global_monitor_sample_interval_enable_jitter = False
        monitor = ScalyrMonitor(
            monitor_config=monitor_config,
            logger=logger,
            sample_interval_secs=None,
            global_config=global_config,
        )

        sleep_delay = monitor._get_initial_sleep_delay()
        self.assertEqual(sleep_delay, 0)

        # 2. Value is overridden on per monitor basis
        monitor_config = MonitorConfig(
            {"module": "test_module", "sample_interval": 10},
            monitor_module="test_monitor",
        )
        global_config = mock.Mock()
        global_config.global_monitor_sample_interval_enable_jitter = False
        monitor = ScalyrMonitor(
            monitor_config=monitor_config,
            logger=logger,
            sample_interval_secs=None,
            global_config=global_config,
        )

        sleep_delay = monitor._get_initial_sleep_delay()
        self.assertEqual(sleep_delay, 0)
    def test_get_initial_sleep_delay_with_random_jitter_enabled(self):
        logger = mock.Mock()

        # 1. Default value is used
        monitor_sample_interval = ScalyrMonitor.DEFAULT_SAMPLE_INTERVAL_SECS
        monitor_config = MonitorConfig(
            {"module": "test_module"}, monitor_module="test_monitor"
        )
        global_config = mock.Mock()
        global_config.global_monitor_sample_interval_enable_jitter = True
        monitor = ScalyrMonitor(
            monitor_config=monitor_config,
            logger=logger,
            sample_interval_secs=None,
            global_config=global_config,
        )

        for i in range(0, 100):
            sleep_delay = monitor._get_initial_sleep_delay()

            min_jitter = round(monitor_sample_interval / 10) * 2
            max_jitter = round(monitor_sample_interval / 10) * 8

            self.assertFalse(sleep_delay == monitor_sample_interval)
            self.assertTrue(sleep_delay >= min_jitter and sleep_delay <= max_jitter)

        # 2. Value is overridden on per monitor basis
        monitor_sample_interval = 10
        monitor_config = MonitorConfig(
            {"module": "test_module", "sample_interval": 10},
            monitor_module="test_monitor",
        )
        global_config = mock.Mock()
        global_config.global_monitor_sample_interval_enable_jitter = True
        monitor = ScalyrMonitor(
            monitor_config=monitor_config,
            logger=logger,
            sample_interval_secs=None,
            global_config=global_config,
        )

        for i in range(0, 100):
            sleep_delay = monitor._get_initial_sleep_delay()

            min_jitter = round(monitor_sample_interval / 10) * 2
            max_jitter = round(monitor_sample_interval / 10) * 8

            self.assertFalse(sleep_delay == monitor_sample_interval)
            self.assertTrue(sleep_delay >= min_jitter and sleep_delay <= max_jitter)

        # 3. Verify there is an upper bound of 40 seconds
        monitor_sample_interval = 1000
        monitor_config = MonitorConfig(
            {"module": "test_module", "sample_interval": 1000},
            monitor_module="test_monitor",
        )
        global_config = mock.Mock()
        global_config.global_monitor_sample_interval_enable_jitter = True
        monitor = ScalyrMonitor(
            monitor_config=monitor_config,
            logger=logger,
            sample_interval_secs=None,
            global_config=global_config,
        )

        for i in range(0, 100):
            sleep_delay = monitor._get_initial_sleep_delay()
            min_jitter = MIN_INITIAL_GATHER_SAMPLE_SLEEP_SECS
            max_jitter = MAX_INITIAL_GATHER_SAMPLE_SLEEP_SECS

            self.assertTrue(sleep_delay >= min_jitter and sleep_delay <= max_jitter)