class SyslogMonitorConnectTest(SyslogMonitorTestCase):
    @classmethod
    def setUpClass(cls):
        # clear the syslog disk logger
        try:
            os.remove("agent_syslog.log")
        except OSError:
            pass

    def setUp(self):
        self.monitor = None
        self.sockets = []

        # capture log output
        scalyr_logging.set_log_destination(use_stdout=True)
        scalyr_logging.set_log_level(scalyr_logging.DEBUG_LEVEL_0)
        self.logger = logging.getLogger("scalyr_agent.builtin_monitors.syslog_monitor.syslog")
        self.logger.setLevel(logging.INFO)
        self.stream = StringIO()
        self.handler = logging.StreamHandler(self.stream)
        self.logger.addHandler(self.handler)

        # hide stdout
        self.old = sys.stdout
        sys.stdout = StringIO()

    def tearDown(self):
        # close any open sockets
        for s in self.sockets:
            s.close()

        # stop any running monitors - this might be open if an exception was thrown before a test called monitor.stop()
        if self.monitor != None:
            self.monitor.stop(wait_on_join=False)

        self.logger.removeHandler(self.handler)
        self.handler.close()

        # restore stdout
        sys.stdout.close()
        sys.stdout = self.old

    def connect(self, socket, addr, max_tries=3):
        connected = False
        tries = 0
        while not connected and tries < max_tries:
            try:
                socket.connect(addr)
                connected = True
            except:
                time.sleep(0.1)
            tries += 1

        return connected

    def test_run_tcp_server(self):
        config = {
            'module': 'scalyr_agent.builtin_monitors.syslog_monitor',
            'protocols': 'tcp:8514',
        }

        self.monitor = SyslogMonitor(config, self.logger)
        self.monitor.open_metric_log()

        self.monitor.start()
        time.sleep(0.05)

        s = socket.socket()
        self.sockets.append(s)

        expected = "TCP TestXX\n"
        self.connect(s, ('localhost', 8514))
        s.sendall(expected)
        time.sleep(1)

        self.monitor.stop(wait_on_join=False)
        self.monitor = None

        f = open('agent_syslog.log')
        actual = f.read().strip()

        expected = expected.strip()

        self.assertTrue(expected in actual, "Unable to find '%s' in output:\n\t %s" % (expected, actual))

    def test_run_udp_server(self):
        config = {
            'module': 'scalyr_agent.builtin_monitors.syslog_monitor',
            'protocols': 'udp:5514',
        }
        self.monitor = SyslogMonitor(config, scalyr_logging.getLogger("syslog_monitor[test]"))
        self.monitor.open_metric_log()
        self.monitor.start()

        time.sleep(0.1)

        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        self.sockets.append(s)

        expected = "UDP Test %s" % (uuid.uuid4())
        s.sendto(expected, ('localhost', 5514))
        time.sleep(1)
        self.monitor.stop(wait_on_join=False)
        self.monitor = None
        f = open('agent_syslog.log')
        actual = f.read().strip()
        self.assertTrue(
            expected in actual,
            "Unable to find '%s' in output:\n\t %s" % (expected, actual)
        )

    def test_run_multiple_servers(self):
        config = {
            'module': 'scalyr_agent.builtin_monitors.syslog_monitor',
            'protocols': 'udp:8000, tcp:8001, udp:8002, tcp:8003',
        }
        self.monitor = SyslogMonitor(config, scalyr_logging.getLogger("syslog_monitor[test]"))
        self.monitor.open_metric_log()

        self.monitor.start()

        time.sleep(0.05)

        udp = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        self.sockets.append(udp)

        tcp1 = socket.socket()
        self.sockets.append(tcp1)

        tcp2 = socket.socket()
        self.sockets.append(tcp2)

        self.connect(tcp1, ('localhost', 8001))
        self.connect(tcp2, ('localhost', 8003))

        expected_udp1 = "UDP Test"
        udp.sendto(expected_udp1, ('localhost', 8000))

        expected_udp2 = "UDP2 Test"
        udp.sendto(expected_udp2, ('localhost', 8002))

        expected_tcp1 = "TCP Test\n"
        tcp1.sendall(expected_tcp1)

        expected_tcp2 = "TCP2 Test\n"
        tcp2.sendall(expected_tcp2)

        time.sleep(1)

        self.monitor.stop(wait_on_join=False)
        self.monitor = None

        f = open('agent_syslog.log')
        actual = f.read().strip()

        expected_tcp1 = expected_tcp1.strip()
        expected_tcp2 = expected_tcp2.strip()

        self.assertTrue(expected_udp1 in actual, "Unable to find '%s' in output:\n\t %s" % (expected_udp1, actual))
        self.assertTrue(expected_udp2 in actual, "Unable to find '%s' in output:\n\t %s" % (expected_udp2, actual))
        self.assertTrue(expected_tcp1 in actual, "Unable to find '%s' in output:\n\t %s" % (expected_tcp1, actual))
        self.assertTrue(expected_tcp2 in actual, "Unable to find '%s' in output:\n\t %s" % (expected_tcp2, actual))
class SyslogMonitorConnectTest(SyslogMonitorTestCase):
    @classmethod
    def setUpClass(cls):
        # clear the syslog disk logger
        try:
            os.remove("agent_syslog.log")
        except OSError:
            pass

    def setUp(self):
        self.monitor = None
        self.sockets = []

        # capture log output
        scalyr_logging.set_log_destination(use_stdout=True)
        scalyr_logging.set_log_level(scalyr_logging.DEBUG_LEVEL_0)
        self.logger = logging.getLogger("scalyr_agent.builtin_monitors.syslog_monitor.syslog")
        self.logger.setLevel(logging.INFO)
        self.stream = StringIO()
        self.handler = logging.StreamHandler(self.stream)
        self.logger.addHandler(self.handler)

        # hide stdout
        self.old = sys.stdout
        sys.stdout = StringIO()

    def tearDown(self):
        # close any open sockets
        for s in self.sockets:
            s.close()

        # stop any running monitors - this might be open if an exception was thrown before a test called monitor.stop()
        if self.monitor != None:
            self.monitor.stop(wait_on_join=False)

        self.logger.removeHandler(self.handler)
        self.handler.close()

        # restore stdout
        sys.stdout.close()
        sys.stdout = self.old

    def connect(self, socket, addr, max_tries=3):
        connected = False
        tries = 0
        while not connected and tries < max_tries:
            try:
                socket.connect(addr)
                connected = True
            except:
                time.sleep(0.1)
            tries += 1

        return connected

    def test_run_tcp_server(self):
        config = {
            'module': 'scalyr_agent.builtin_monitors.syslog_monitor',
            'protocols': 'tcp:8514',
        }

        self.monitor = SyslogMonitor(config, self.logger)
        self.monitor.open_metric_log()

        self.monitor.start()
        time.sleep(0.05)

        s = socket.socket()
        self.sockets.append(s)

        expected = "TCP TestXX\n"
        self.connect(s, ('localhost', 8514))
        s.sendall(expected)
        time.sleep(1)

        self.monitor.stop(wait_on_join=False)
        self.monitor = None

        f = open('agent_syslog.log')
        actual = f.read().strip()

        expected = expected.strip()

        self.assertTrue(expected in actual, "Unable to find '%s' in output:\n\t %s" % (expected, actual))

    def test_run_udp_server(self):
        config = {
            'module': 'scalyr_agent.builtin_monitors.syslog_monitor',
            'protocols': 'udp:5514',
        }
        self.monitor = SyslogMonitor(config, scalyr_logging.getLogger("syslog_monitor[test]"))
        self.monitor.open_metric_log()
        self.monitor.start()

        time.sleep(0.1)

        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        self.sockets.append(s)

        expected = "UDP Test {}".format(uuid.uuid4())
        s.sendto(expected, ('localhost', 5514))
        time.sleep(1)
        self.monitor.stop(wait_on_join=False)
        self.monitor = None
        f = open('agent_syslog.log')
        actual = f.read().strip()
        self.assertTrue(
            expected in actual,
            "Unable to find '%s' in output:\n\t %s" % (expected, actual)
        )

    def test_run_multiple_servers(self):
        config = {
            'module': 'scalyr_agent.builtin_monitors.syslog_monitor',
            'protocols': 'udp:8000, tcp:8001, udp:8002, tcp:8003',
        }
        self.monitor = SyslogMonitor(config, scalyr_logging.getLogger("syslog_monitor[test]"))
        self.monitor.open_metric_log()

        self.monitor.start()

        time.sleep(0.05)

        udp = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        self.sockets.append(udp)

        tcp1 = socket.socket()
        self.sockets.append(tcp1)

        tcp2 = socket.socket()
        self.sockets.append(tcp2)

        self.connect(tcp1, ('localhost', 8001))
        self.connect(tcp2, ('localhost', 8003))

        expected_udp1 = "UDP Test"
        udp.sendto(expected_udp1, ('localhost', 8000))

        expected_udp2 = "UDP2 Test"
        udp.sendto(expected_udp2, ('localhost', 8002))

        expected_tcp1 = "TCP Test\n"
        tcp1.sendall(expected_tcp1)

        expected_tcp2 = "TCP2 Test\n"
        tcp2.sendall(expected_tcp2)

        time.sleep(1)

        self.monitor.stop(wait_on_join=False)
        self.monitor = None

        f = open('agent_syslog.log')
        actual = f.read().strip()

        expected_tcp1 = expected_tcp1.strip()
        expected_tcp2 = expected_tcp2.strip()

        self.assertTrue(expected_udp1 in actual, "Unable to find '%s' in output:\n\t %s" % (expected_udp1, actual))
        self.assertTrue(expected_udp2 in actual, "Unable to find '%s' in output:\n\t %s" % (expected_udp2, actual))
        self.assertTrue(expected_tcp1 in actual, "Unable to find '%s' in output:\n\t %s" % (expected_tcp1, actual))
        self.assertTrue(expected_tcp2 in actual, "Unable to find '%s' in output:\n\t %s" % (expected_tcp2, actual))