def test_connectionMadeLost(self):
        """
        C{connectionMade} and C{connectionLost} are called on the protocol by
        the C{SerialPort}.
        """
        # Serial port that doesn't actually connect to anything:
        class DummySerialPort(serialport.SerialPort):
            _serialFactory = DoNothing

            def _finishPortSetup(self):
                pass # override default win32 actions

        events = []

        class SerialProtocol(Protocol):
            def connectionMade(self):
                events.append("connectionMade")

            def connectionLost(self, reason):
                events.append(("connectionLost", reason))

        # Creation of port should result in connectionMade call:
        port = DummySerialPort(SerialProtocol(), "", reactor=DoNothing())
        self.assertEqual(events, ["connectionMade"])

        # Simulate reactor calling connectionLost on the SerialPort:
        f = Failure(ConnectionDone())
        port.connectionLost(f)
        self.assertEqual(events, ["connectionMade", ("connectionLost", f)])

        C{connectionMade} and C{connectionLost} are called on the protocol by
        the C{SerialPort}.
        
stackoverflow/venv/lib/python3.6/site-packages/twisted/internet/test/test_serialport.py