import unittest
from unittest import mock
import socket
import struct
from asyncio import DatagramTransport
from aioupnp.protocols.multicast import MulticastProtocol


class TestMulticast(unittest.TestCase):
    def test_multicast(self):
        _ttl = None
        mock_socket = mock.MagicMock(spec=socket.socket)
        def getsockopt(*_):
            return _ttl

        def setsockopt(a, b, ttl: bytes):
            nonlocal _ttl
            _ttl, = struct.unpack('b', ttl)

        mock_socket.getsockopt = getsockopt
        mock_socket.setsockopt = setsockopt

        protocol = MulticastProtocol('1.2.3.4', '1.2.3.4')
        transport = DatagramTransport()
        transport._extra = {'socket': mock_socket}
        self.assertIsNone(protocol.set_ttl(1))
        self.assertEqual(0, protocol.get_ttl())
        protocol.connection_made(transport)
        self.assertIsNone(protocol.set_ttl(1))
        self.assertEqual(1, protocol.get_ttl())