
    Yf1                        d Z 	 ddlZn# e$ r dZY nw xY wddlmZ ddlmZ ddlmZ ddl	m
Z
 ddlmZ ddlmZmZ  G d	 d
          Z G d de
          Z e                                e                                           dS )z6
Tests for implementations of L{IReactorWin32Events}.
    N)verifyObject)Deferred)IReactorWin32Events)ReactorBuilder)Failure)getThreadIDisInIOThreadc                   F    e Zd ZdZdZdxZxZZd Zd Z	d Z
d Zd Zd	 ZdS )
Listenera  
    L{Listener} is an object that can be added to a L{IReactorWin32Events}
    reactor to receive callback notification when a Windows event is set.  It
    records what thread its callback is invoked in and fires a Deferred.

    @ivar success: A flag which is set to C{True} when the event callback is
        called.

    @ivar logThreadID: The id of the thread in which the C{logPrefix} method is
        called.

    @ivar eventThreadID: The id of the thread in which the event callback is
        called.

    @ivar connLostThreadID: The id of the thread in which the C{connectionLost}
        method is called.

    @ivar _finished: The L{Deferred} which will be fired when the event callback
        is called.
    FNc                     || _         d S N)	_finished)selffinisheds     X/var/www/html/env/lib/python3.11/site-packages/twisted/internet/test/test_win32events.py__init__zListener.__init__/   s    !    c                 ,    t                      | _        dS )Nr   )r   logThreadIDr   s    r   	logPrefixzListener.logPrefix2   s    &==zr   c                 n    d| _         t                      | _        | j                            d            d S )NT)successr   eventThreadIDr   callbackr   s    r   occurredzListener.occurred6   s1    (]]%%%%%r   c                      t          d          )NzSome problem)RuntimeErrorr   s    r   brokenOccurredzListener.brokenOccurred;   s    >***r   c                      t          d          S )NzEntirely different problem)EnvironmentErrorr   s    r   returnValueOccurredzListener.returnValueOccurred>   s     <===r   c                 `    t                      | _        | j                            |           d S r   )r   connLostThreadIDr   errback)r   reasons     r   connectionLostzListener.connectionLostA   s*     +v&&&&&r   )__name__
__module____qualname____doc__r   r   r   r$   r   r   r   r   r"   r'    r   r   r   r      s         * G599K9-"2" " "  & & &
+ + +> > >' ' ' ' 'r   r   c                   <    e Zd ZdZegZd Zd Zd Zd Z	d Z
d ZdS )	Win32EventsTestsBuilderzD
    Builder defining tests relating to L{IReactorWin32Events}.
    c                 X    |                                  }t          t          |           dS )zn
        An instance of the reactor has all of the methods defined on
        L{IReactorWin32Events}.
        N)buildReactorr   r   )r   reactors     r   test_interfacez&Win32EventsTestsBuilder.test_interfaceM   s,    
 ##%%('22222r   c                    t                      }|                                 t          j        dddd          }t	                      }|                    fd           t          |          }                    ||d                               t          j	        |           | 
                               |                     |j                   |                     ||j                   |                     ||j                   dS )z
        When an event which has been added to the reactor is set, the action
        associated with the event is invoked in the reactor thread.
        NFc                 ,                                     S r   stopignoredr1   s    r   <lambda>z7Win32EventsTestsBuilder.test_addEvent.<locals>.<lambda>^   s    W\\^^ r   r   )r   r0   
win32eventCreateEventr   addCallbackr   addEventcallWhenRunningSetEvent
runReactor
assertTruer   assertEqualr   r   )r   reactorThreadIDeventr   listenerr1   s        @r   test_addEventz%Win32EventsTestsBuilder.test_addEventU   s    
 &--##%%&tUE4@@::;;;;<<<H%%*555
 3U;;;   ()))(*>???(*@AAAAAr   c                    g fd}|                                  t          j        dddd          }t                      }t	          |          }|                    |                               ||d                               t          j        |           | 	                               | 
                    |j                   |                     dg           dS )z{
        Using L{IReactorWin32Events.addEvent} does not change which thread is
        reported as the I/O thread.
        c                 r                         t                                                                  d S r   )appendr	   r6   )r8   r1   resultss    r   checkzAWin32EventsTestsBuilder.test_ioThreadDoesNotChange.<locals>.checkn   s*    NN<>>***LLNNNNNr   NFr   T)r0   r:   r;   r   r   r<   r=   r>   r?   r@   rA   r   rB   )r   rK   rD   r   rE   r1   rJ   s        @@r   test_ioThreadDoesNotChangez2Win32EventsTestsBuilder.test_ioThreadDoesNotChangeg   s    
 	 	 	 	 	 	 ##%%&tUE4@@::H%%U###*555
 3U;;;   ()))$)))))r   c                    t                      }|                                 t          j        dddd          }g }t	                      }|                    |j                   |                    fd           t          |          }                    ||d           	                    t          j
        |           |                                |                     |d         t                     |d                             t                     |                     ||j                   |                     dt%          |                     t                                         dS )z
        If the event handler raises an exception, the event is removed from the
        reactor and the handler's C{connectionLost} method is called in the I/O
        thread and the exception is logged.
        NFc                 ,                                     S r   r5   r7   s    r   r9   zBWin32EventsTestsBuilder.test_disconnectedOnError.<locals>.<lambda>        r   r   r      )r   r0   r:   r;   r   addBothrI   r   r=   r>   r?   r@   assertIsInstancer   trapr   rB   r$   lenflushLoggedErrorsr   rC   rD   resultr   rE   r1   s         @r   test_disconnectedOnErrorz0Win32EventsTestsBuilder.test_disconnectedOnError}   sC    &--##%%&tUE4@@::'''7777888H%%*:;;;
 3U;;;   fQi111q	|$$$(*CDDDC 6 6| D DEEFFFFFr   c                 l   t                      }|                                 t          j        dddd          }g }t	                      }|                    |j                   |                    fd           t          |          }                    ||d           	                    t          j
        |           |                                |                     |d         t                     |d                             t                     |                     ||j                   dS )z
        If the event handler returns a value, the event is removed from the
        reactor and the handler's C{connectionLost} method is called in the I/O
        thread.
        NFc                 ,                                     S r   r5   r7   s    r   r9   zFWin32EventsTestsBuilder.test_disconnectOnReturnValue.<locals>.<lambda>   rO   r   r"   r   )r   r0   r:   r;   r   rQ   rI   r   r=   r>   r?   r@   rR   r   rS   r!   rB   r$   rV   s         @r   test_disconnectOnReturnValuez4Win32EventsTestsBuilder.test_disconnectOnReturnValue   s    &--##%%&tUE4@@::'''7777888H%%*?@@@
 3U;;;   fQi111q	'((((*CDDDDDr   c                 V   |                                  }t          j        dddd          }t                      }t	          |          }|                    ||d           |                    |j                   |                     |           | 	                    |j
                   dS )z
        Event handlers added with L{IReactorWin32Events.addEvent} do not have
        C{connectionLost} called on them if they are still active when the
        reactor shuts down.
        NFr   )r0   r:   r;   r   r   r=   r>   r6   r@   assertIsNoner$   )r   r1   rD   r   rE   s        r   test_notDisconnectedOnShutdownz6Win32EventsTestsBuilder.test_notDisconnectedOnShutdown   s     ##%%&tUE4@@::H%%*555---   (344444r   N)r(   r)   r*   r+   r   requiredInterfacesr2   rF   rL   rX   r[   r^   r,   r   r   r.   r.   F   s          ..3 3 3B B B$* * *,G G G4E E E25 5 5 5 5r   r.   )r+   r:   ImportErrorzope.interface.verifyr   twisted.internet.deferr   twisted.internet.interfacesr   #twisted.internet.test.reactormixinsr   twisted.python.failurer   twisted.python.threadabler   r	   r   r.   globalsupdatemakeTestCaseClassesr,   r   r   <module>rj      sF      JJJ / . . . . . + + + + + + ; ; ; ; ; ; > > > > > > * * * * * * ? ? ? ? ? ? ? ?-' -' -' -' -' -' -' -'`w5 w5 w5 w5 w5n w5 w5 w5t 		  (<<>> ? ? ? ? ?s   	 