a „oeÆ¡ã@s¦ddlZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl Z ddlZddlZddlZddlZddlmZmZmZzeWneyÊddlmZYn0Gdd„dejƒZGdd„dejƒZGdd „d ejƒZGd d „d ejƒZGd d „d ejƒZGdd„dejƒZ Gdd„dejƒZ!Gdd„dejƒZ"Gdd„dejƒZ#Gdd„dejƒZ$Gdd„dejƒZ%e&dkr¢eƒdS)éN)Ú TestSkippedÚ str2bytesÚtestmain)ÚSetc@s$eZdZdd„Zdd„Zdd„ZdS)ÚTestReadBuffercCst d¡}| t|ƒd¡dS©Né)Ú win32fileÚAllocateReadBufferÚ assertEqualÚlen©ÚselfÚbuffer©rú:C:\Program Files\Certbot\pkgs\win32\test\test_win32file.pyÚtestLens zTestReadBuffer.testLencCs&t d¡}d|d<| |dd¡dS)Nréÿr)r r r r rrrÚtestSimpleIndex!s zTestReadBuffer.testSimpleIndexcCs6t d¡}tdƒ}||dd…<| |dd…|¡dS)Nézr)r r rr )rrÚvalrrrÚtestSimpleSlice&s  zTestReadBuffer.testSimpleSliceN)Ú__name__Ú __module__Ú __qualname__rrrrrrrrsrc@s4eZdZdd„Zdd„Zdd„Zdd„Zd d „Zd S) Ú TestSimpleOpscCsðt ¡\}}t |¡t |¡t |tjddtj dd¡}t dƒ}zzt  ||¡|  ¡t |tj ddtjdd¡}t |d¡\}}| ||¡W|  ¡zt |¡WqìtjyºYqì0n.|  ¡zt |¡WntjyèYn00dS)Nrz Hellothereé)ÚtempfileÚmkstempÚosÚcloseÚunlinkr Ú CreateFileÚ GENERIC_WRITEÚwin32conZ CREATE_NEWrÚ WriteFileÚCloseÚ GENERIC_READÚ OPEN_EXISTINGÚReadFiler Úerror)rÚfdÚfilenameÚhandleZ test_dataÚrcÚdatarrrÚtestSimpleFiles.s>   ÿ ù üzTestSimpleOps.testSimpleFilesc Csdtj t ¡d¡}tjtjB}tj}t  ||tj dtj |d¡}t dƒd}t  ||¡| t |¡t|ƒkd¡t |dtj¡t |t|ƒd¡\}}| |dkd|¡| ||kd¡t|ƒd }t ||tj¡t |¡| t |¡|¡| t |¡t |¡¡t |¡\} } } } } | | |kd ¡| | t |¡kd ¡d}| tj |¡ d ¡dS) Núwin32filetest.datrÚzizRWARNING: Written file does not have the same size as the length of the data in it!é zReadfile returned %dzRead data is not what we wrote!rzEExpected GetFileAttributesEx to return the same size as GetFileSize()zOExpected GetFileAttributesEx to return the same attributes as GetFileAttributesz(After closing the file, it still exists!)rÚpathÚjoinÚwin32apiÚ GetTempPathr r'r#ZFILE_FLAG_DELETE_ON_CLOSEr"ÚFILE_SHARE_READÚ CREATE_ALWAYSrr%Ú assertTrueZ GetFileSizer ÚSetFilePointerÚ FILE_BEGINr)Z SetEndOfFiler ZGetFileAttributesExZGetFileAttributesExWÚGetFileAttributesÚisfile)rÚtestNameÚ desiredAccessZ fileFlagsÚhr/ÚhrZ read_dataZnewSizeÚattrÚctÚatÚwtÚsizerrrÚ testMoreFilesMsZ ù  þ ÿ  þþ þÿzTestSimpleOps.testMoreFilesc Cstj t ¡d¡}t |tjtjBddtj tj d¡}zÂt dƒ}t  ||¡\}}|  |¡| |t|ƒ¡t |dtj¡t |t|ƒ¡\}}|  |¡| ||¡t |t|ƒ tj¡t |t|ƒ¡\}}|  |¡| ||¡W| ¡t |¡n| ¡t |¡0dS)Nr1rz Some data)rr4r5r6r7r r"r'r#r9ÚFILE_ATTRIBUTE_NORMALrr%Ú assertFalser r r;r<r)ZFILE_ENDr&r!)rr,Úfr/ÚresZwrittenÚsrrrÚtestFilePointerŒs6 ù      ÿzTestSimpleOps.testFilePointerc Cst d¡}t ¡jdd}| tj ¡¡}t  |tj tj Bddtj dd¡}zžt  ||||¡t |¡\}}}| ||¡| ||¡| ||¡t  ||||¡t |¡\}}}| ||¡| ||¡| ||¡W| ¡t |¡n| ¡t |¡0dS)Nú-testFileTimesr©Z microsecond)rÚmktempÚ win32timezoneZutcnowÚreplaceZ astimezoneÚ TimeZoneInfoÚlocalr r"r'r#r9Ú SetFileTimeÚ GetFileTimer r rr!)rr,Znow_utcZ now_localrArDrErFrrrÚtestFileTimesTimezones´s6  ù       ÿz$TestSimpleOps.testFileTimesTimezonesc Cs~ddlm}tjj| ¡djdd}|tjdd}|tjdd}t d¡}t |d ƒ  ¡t   |t j t jBddtjdd¡}zæt  |¡\}}} | ||kd ||f¡| ||ko¾|kn||f¡| | |kd || f¡| || koú|kn|| f¡t j||||d d t  |¡\}}} | ||¡| ||¡| | |¡W| ¡t |¡n| ¡t |¡0dS)Nr)rT)ZtzrPr)ZsecondséxrOÚwz1File was created in the past - now=%s, created=%sz2File was written-to in the past now=%s, written=%sT)ZUTCTimes)rRrTÚdatetimeÚnowZutcrSZ timedeltarrQÚopenr r r"r'r#r$r(rWr:rVr r&rr!) rrTr\ZnowishZlaterr,rKrDrErFrrrÚ testFileTimesÓsH   ù  þ$ þ$   ÿzTestSimpleOps.testFileTimesN)rrrr0rHrNrXr^rrrrr-s ?(rc@s,eZdZdZZdd„Zdd„Zdd„ZdS)ÚTestGetFileInfoByHandleExNcCst ¡\}|_t |¡dS©N)rrÚ$_TestGetFileInfoByHandleEx__filenamerr )rr+rrrÚsetUpszTestGetFileInfoByHandleEx.setUpcCsR|jdur|j ¡|jdurBzt |j¡Wnty@Yn0d|_|_dSr`)Ú"_TestGetFileInfoByHandleEx__handler&rarr!ÚOSError©rrrrÚtearDown s    z"TestGetFileInfoByHandleEx.tearDownc Cst |j¡}t |jtjddtjdd¡}||_t |¡\}}}t  |tj ¡}|  ||d¡|  ||d¡|  ||d¡|  ||d¡dS)NrZ CreationTimeZLastAccessTimeZ LastWriteTimeZFileAttributes) r r=rar"r'r$r(rcrWZGetFileInformationByHandleExZ FileBasicInfor )rrCrKrDrErFZ basic_inforrrÚtestFileBasicInfos" ù z+TestGetFileInfoByHandleEx.testFileBasicInfo)rrrrcrarbrfrgrrrrr_s r_c@sVeZdZdd„Zdd„Zdd„Zdd„Zdd d „Zd d „Zdd„Z dd„Z dd„Z dS)ÚTestOverlappedc Csrddl}tj t ¡d¡}tj}t  ¡}|  dddd¡}||_ t  ||ddtj dd¡}tdƒd}d}|t|ƒ} t|ƒD]2} t |||¡| |j |j¡|jt|ƒ|_qz| ¡t  ¡}|  dddd¡}||_ tj}t  ||ddtjdd¡}t d¡} zJt || |¡\} } | |j |j¡|jt| ƒ|_| | urD| d¡WqütjybYqfYqü0qü| ¡dS)Nrr1r2i€éiÿÿzHUnexpected result from ReadFile - should be the same buffer we passed it)Ú win32eventrr4r5r6r7r r#Ú pywintypesÚ OVERLAPPEDÚ CreateEventÚhEventr"r9rr Úranger%ÚWaitForSingleObjectÚINFINITEZOffsetr&r'r(r r)Úfailr*)rrjr?r@Ú overlappedZevtrAZ chunk_dataZ num_loopsZ expected_sizeÚirrBr/rrrÚtestSimpleOverlapped.sHÿ   ÿ  ÿz#TestOverlapped.testSimpleOverlappedc Csþt tjddd¡}g}tddƒD]h}t tjtj¡}| tjtj d¡|  d|f¡|  d¡|  |¡t |  ¡||d¡}||us J‚q |D] }| ¡qŽt|ƒ}d}}zt |¡tdƒ‚Wn6tjyø}z| |jtj¡WYd}~n d}~00dS)Nri£#i¥#rÚzExpected close to fail!)r ÚCreateIoCompletionPortZINVALID_HANDLE_VALUEroÚsocketÚAF_INETÚ SOCK_STREAMZ setsockoptZ SOL_SOCKETZ SO_REUSEADDRÚbindÚlistenÚappendÚfilenor ÚintZ CloseHandleÚ RuntimeErrorr*r ÚwinerrorZERROR_INVALID_HANDLE) rZioportZsocksZPORTZsockÚnewrMZhvÚdetailsrrrÚtestCompletionPortsMultipleYs* ÿ     z*TestOverlapped.testCompletionPortsMultiplecCsvGdd„dƒ}t dddd¡}t ¡}|ƒ|_t |dd|¡t |tj¡\}}}}|  |d¡|  t |j|ƒ¡dS)Nc@s eZdZdS)z5TestOverlapped.testCompletionPortsQueued..FooN)rrrrrrrÚFoousr…éÿÿÿÿréc) r rwrkrlÚobjectZPostQueuedCompletionStatusÚGetQueuedCompletionStatusrjrqr r:Ú isinstance)rr…Z io_req_portrsZerrCodeÚbytesÚkeyrrrÚtestCompletionPortsQueuedtsÿ  z(TestOverlapped.testCompletionPortsQueuedcCsŒt ¡}t ||¡|rJd}z| ttj|d¡W| ¡n | ¡0dSt |d¡}|d}|  ||u¡t  |d¡d}t  ||¡dS)Nr†rir) rkrlÚ win32pipeZConnectNamedPipeÚ assertRaisesr€r r‰r&r:r)r%)rr-ÚportZdrop_overlapped_referencersÚresultZol2r/rrrÚ_IOCPServerThread‚s  ÿ z TestOverlapped._IOCPServerThreadrc Csd}d}t |tjtjBtjtjBtjBd||tjd¡}t  dddd¡}t  ||dd¡t j |j |||fd}|  d¡| ¡zht d¡zt dtd ƒ|d¡Wntjy¾|sº‚Yn0W|sÎ| ¡| d ¡| | ¡d ¡n(|sö| ¡| d ¡| | ¡d ¡0dS) Nriz\\.\pipe\pywin32_test_piperr†r©ÚtargetÚargsTçš™™™™™¹?z Hello thereézthread didn't finish)rŽZCreateNamedPipeZPIPE_ACCESS_DUPLEXr ÚFILE_FLAG_OVERLAPPEDZPIPE_TYPE_MESSAGEZPIPE_READMODE_MESSAGEZ PIPE_WAITZNMPWAIT_WAIT_FOREVERrwÚ threadingÚThreadr’Ú setDaemonÚstartÚtimeÚsleepZ CallNamedPiperr*r&r5rJÚis_alive)rZtest_overlapped_deathÚBUFSIZEZ pipe_namer-rÚtrrrÚtestCompletionPortsNonQueuedšsP ÿþö  ÿ   ÿ  ý z+TestOverlapped.testCompletionPortsNonQueuedcCs| d¡dS)NT)r¢rerrrÚ(testCompletionPortsNonQueuedBadReferenceÇsz7TestOverlapped.testCompletionPortsNonQueuedBadReferencecCs(t ¡}i}d||<| ||d¡dS)NÚhello)rkrlr )rrsÚdrrrÚ testHashableÊszTestOverlapped.testHashablecCs4t ¡}| ||¡| ||k¡| ||k¡dSr`)rkrlr r:rJ)rrsrrrÚtestComparableÐs zTestOverlapped.testComparablecCsjt ¡}t ¡}| ||¡| ||k¡| ||k¡d|_| ||¡| ||k¡| ||k¡dSr)rkrlr r:rJrnZassertNotEqual)rZ overlapped1Z overlapped2rrrÚtestComparable2×s  zTestOverlapped.testComparable2N)r) rrrrur„rr’r¢r£r¦r§r¨rrrrrh-s+ -rhc@seZdZdd„Zdd„ZdS)ÚTestSocketExtensionsc Csît tjtj¡}| d|f¡| d¡t tjtj¡}t ¡}t dddd¡|_ d}|  t t j ||||¡t  d¡}t   ||||¡}| |tj¡| ¡t |j d¡}|tjkr¾| d¡t  | ¡|d¡} | |d| …¡| ¡dS) NrvéÈra réÐú"timed out waiting for a connectionF)rxryrzr{r|rkrlrjrmrnrÚ TypeErrorr ÚAcceptExr r rZERROR_IO_PENDINGÚsetrpÚ WAIT_TIMEOUTrrÚGetOverlappedResultr~Úsend) rrZ running_eventZ stopped_eventÚlistenerÚaccepterrsrr.ÚnbytesrrrÚ acceptWorkerès( ÿ   z!TestSocketExtensions.acceptWorkerc Csd}t ¡}t ¡}tj|j|||fd}| ¡| d¡| ¡sN| d¡t tj tj ¡}|  d|f¡t   |tdƒd¡t ¡}t dddd¡|_d}| tt j|||¡t  d ¡}t  |||¡t  | ¡|d ¡}|d|…} | | tdƒ¡| d¡| ¡s| d ¡dS) NiHr“rz&AcceptEx Worker thread failed to startú 127.0.0.1r¤rz r3Tz2AcceptEx Worker thread failed to successfully stop)r™ÚEventršr¶rœÚwaitÚisSetrrrxryrzÚconnectr ZWSASendrrkrlrjrmrnrr­ÚWSARecvr r±r~r ) rrZrunningÚstoppedr¡rMrsrrµÚgotrrrÚ testAcceptEx s.      z!TestSocketExtensions.testAcceptExN)rrrr¶r¿rrrrr©çs"r©c@s,eZdZdd„Zdd„Zdd„Zdd„Zd S) Ú TestFindFilescCsptj t ¡d¡}t |¡}tƒ}| |¡tƒ}t |¡D]}|  |¡qtj t ¡d¡}d}t |¡D] }|d7}q | d|¡dS)Nz *.foo_barrr)rr4r5rÃr rÅr )rÚspecÚnumrtrrrÚ testEmptySpec7s  zTestFindFiles.testEmptySpecc Cs’tj t ¡d¡}zt |¡Wntjy4Yn0t |¡z@d}t  tj |d¡¡D] }|d7}qZ|  d|¡Wt |¡n t |¡0dS)NZwin32file_test_directoryrrÁrr) rr4r5r6r7Úrmdirr*Úmkdirr rÅr )rZ test_pathrÍrtrrrÚ testEmptyDir>s  zTestFindFiles.testEmptyDirN)rrrrÊrËrÎrÑrrrrrÀ's rÀc@sHeZdZdZdd„Zdd„Zdd„Zdd „Zd d „Zd d „Z dd„Z dS)ÚTestDirectoryChangesrc Csºg|_g|_g|_g|_t|jƒD]’}t d|¡}t  |¡|j  |¡t   |t jtjdtjtjtjBd¡}|j  |¡g}tj|j|||fd}| ¡|j  |¡|j  |¡q"dS)Nz-test-directory-changes-%dr“)Úwatcher_threadsÚwatcher_thread_changesÚ dir_namesÚ dir_handlesroÚ num_test_dirsrrQrrÐr}r r"Ú ntsecurityconZFILE_LIST_DIRECTORYr$r8r(ZFILE_FLAG_BACKUP_SEMANTICSr˜r™ršÚ_watcherThreadOverlappedrœ)rrtZtdZhdirÚchangesr¡rrrrbUs2   ù  ÿ zTestDirectoryChanges.setUpcCsNtj}z(td|ƒt |dd|¡}td|ƒWn‚Yn0| |¡qdS)NZwaitingé Fr¾)r$ÚFILE_NOTIFY_CHANGE_FILE_NAMEÚprintr ÚReadDirectoryChangesWÚextend)rÚdnÚdhrÚÚflagsrrrÚ_watcherThreadqs  ÿz#TestDirectoryChanges._watcherThreadc Cs–tj}t d¡}t ¡}t dddd¡|_t  ||d||¡t  |jd¡}|tj kr„t  ||d¡}|r~t  ||¡} | | ¡qdSq*tdƒdSq*dS)NrÛrFiˆTz ERROR: Watcher thread timed-out!)r$rÜr r rkrlrjrmrnrÞrpÚ WAIT_OBJECT_0r±ZFILE_NOTIFY_INFORMATIONrßrÝ) rràrárÚrâÚbufrsr.rµÚbitsrrrrÙ‡s   ÿ   z-TestDirectoryChanges._watcherThreadOverlappedc Csv|jD] }| ¡q|jD]0}zt |¡WqtyHtd|ƒYq0q|jD]}| d¡|  ¡rRtdƒqRdS)NzFAILED to remove directoryrÂz%FAILED to wait for thread termination) rÖr&rÕÚshutilÚrmtreerdrÝrÓr5rŸ)rrAràr¡rrrrf¤s      zTestDirectoryChanges.tearDowncCst d¡dS)Nçà?)rržrerrrÚstablize·szTestDirectoryChanges.stablizecCsT| ¡|jD] }tj |d¡}t|dƒ ¡q| ¡|jd}| |dg¡dS)NÚ test_filerZr)rrë© rêrÕrr4r5r]r rÔr ©rràÚfnrÚrrrÚ testSimpleºs  zTestDirectoryChanges.testSimplecCsT| ¡|jD] }tj |d¡}t|dƒ ¡q| ¡|jd}| |dg¡dS)NÚxrZr)rrðrìrírrrÚ testSmallÄs  zTestDirectoryChanges.testSmallN) rrrr×rbrãrÙrfrêrïrñrrrrrÒRs rÒc@seZdZdd„ZdS)Ú TestEncryptc CsÄt d¡}t|dƒ}| tdƒ¡| ¡d}ztzt |¡Wn<tjyz}z"|j t j kr^‚t dƒWYd}~n d}~00t  |¡W|dur˜| ¡t  |¡n|dur´| ¡t  |¡0dS)NZwin32file_testÚwbr¤z2It appears this is not NTFS - cant encrypt/decrypt)rrQr]Úwriterr r Z EncryptFiler*rZERROR_ACCESS_DENIEDrÝZ DecryptFilerr!)rÚfnamerKrƒrrrÚ testEncryptÐs&     þzTestEncrypt.testEncryptN)rrrrörrrrròÏsròc@s$eZdZdd„Zdd„Zdd„ZdS)Ú TestConnectc Csøt ¡}dt dd¡f|_| |j¡| d¡t tjtj¡}t  ¡}t   dddd¡|_ |rdd}n t  |¡}t  |¡}t  ||||¡||j f}t  |dd¡} | t jkr´| d ¡| t jkrÂdSt  | ¡|d¡} |ræ|d| …|_| td ƒ¡dS) NÚ localhosté'éúrrrFr«r¬úsome expected response)rxÚrandomÚrandintÚaddrr{r|ryrzrkrlrjrmrnr ZCalculateSocketEndPointSizer r®ZWaitForMultipleObjectsr°rrrär±r~Úrequestr²r) rZexpect_payloadÚ giveup_eventr³r´rsZbuf_sizerÚeventsr.rµrrrÚconnect_thread_runnerås,        z!TestConnect.connect_thread_runnerc Cs”t dddd¡}tj|jd|fd}| ¡t d¡t ¡}t   ¡}|  d¡zt   ||j|tdƒ¡WnDt jy®}z*t |¡|jdkr˜tdƒ‚‚WYd}~n d}~00zt  | ¡|d ¡WnHt jy}z,t |¡|jtjkrøtd ƒ‚‚WYd}~n d}~00t   ¡}t  d ¡}t  |||d¡t  | ¡|d ¡}|d|…|_| |jtd ƒ¡| |jtdƒ¡| d ¡| | ¡d¡dS)NrTr“r–©z0.0.0.0rzsome expected requesté&'ú+ConnectEx is not available on this platformrú.Assuming ERROR_CONNECTION_REFUSED is transientrrûrÂúworker thread didn't terminate)rjrmr™ršrrœrržrxrkrlr{r Ú ConnectExrþrr*ÚSetEventrrr±r~ÚERROR_CONNECTION_REFUSEDr r¼Úresponser rÿr5rJrŸ©rrr¡Ús2ÚolÚexcZbuffÚlengthrrrÚtest_connect_with_payload s@ ÿ        z%TestConnect.test_connect_with_payloadc Cs|t dddd¡}tj|jd|fd}| ¡t d¡t ¡}t   ¡}|  d¡zt   ||j|¡WnDt jy¨}z*t |¡|jdkr’tdƒ‚‚WYd}~n d}~00zt  | ¡|d¡WnHt jy}z,t |¡|jtjkròtd ƒ‚‚WYd}~n d}~00t   ¡}t  d ¡}t  |||d¡t  | ¡|d¡}|d|…|_| |jtd ƒ¡| d ¡| | ¡d ¡dS)NrFr“r–rrrrrrrûrÂr)rjrmr™ršrrœrržrxrkrlr{r rrþr*r rrr±r~r r r¼r r rr5rJrŸr rrrÚtest_connect_without_payload.s> ÿ        z(TestConnect.test_connect_without_payloadN)rrrrrrrrrrr÷äs&#r÷c@seZdZdd„ZdS)Ú TestTransmitc s„ddl}t d¡}| |¡}t|ƒ}t ¡}| |¡‡fdd„}tj |d}|  ¡t   d¡t   ¡}| ˆj¡d} tdƒ} tdƒ} td ƒ} td ƒ} td ƒ}t ¡}| d¡t |t | ¡¡|d|d¡| t | ¡|d ¡7} t ¡}| d¡t |t | ¡¡|d|d| | ¡| t | ¡|d ¡7} t ¡}| d¡t |t | ¡¡|d|d||¡| t | ¡|d ¡7} t ¡}| d¡t |t | ¡¡|d|dd| ¡| t | ¡|d ¡7} t ¡}| d¡t |t | ¡¡|d|d| ¡| t | ¡|d ¡7} | ¡| ¡td ƒ ˆj¡}ˆ | t|ƒ¡|| || ||| | |}ˆ t|ƒt|ƒ¡ˆ ||¡dS) Nric sÈt ¡}tdƒD]n}dt dd¡fˆ_z| ˆj¡WqˆWqtjy|}z&|jdkrZ‚t dˆjdƒWYd}~qd}~00qt dƒ‚|  d ¡|  ¡\}}d }gˆ_ |rÄ| d ¡}ˆj  |¡q¨dS) NrÂrørùrúi'zFailed to use portztrying another random onez,Failed to find an available port to bind to.ri)rxrorürýrþr{rr*rrÝr€r|ÚacceptrÿÚrecvr})Ús1rtrZclirþrårerrÚrunner\s$    &   z*TestTransmit.test_transmit..runner)r”réz[AAA]z[BBB]z[CCC]z[DDD]rvr)ÚbinasciirÚurandomZhexlifyr rZ TemporaryFilerôr™ršrœrržrxr»rþrrkrlÚseekr Z TransmitFileÚ_get_osfhandler~r±r r5rÿr Útype)rrr‹rZ val_lengthrKrÚthr rZaaaZbbbZcccZdddÚemptyrråZexpectedrrerÚ test_transmitSsn        ÿ ÿ ÿ ÿ ÿ$zTestTransmit.test_transmitN)rrrrrrrrrRsrc@seZdZdd„Zdd„ZdS)ÚTestWSAEnumNetworkEventsc Csft ¡}t dddd¡}t ||d¡| t |¡i¡| t ||¡i¡| ttj||d¡| ttj|d¡| ttjd|¡| ttjd¡t dƒ}t  |  ¡¡}| tj tj|¡| tj tj||¡zt |¡Wn8tj y}z| |j tj¡WYd}~n d}~00zt ||¡Wn8tj y`}z| |j tj¡WYd}~n d}~00dS)Nrrr—ZspamÚNUL)rxrjrmr ÚWSAEventSelectr ÚWSAEnumNetworkEventsrr­r]rr~r*rZ WSAENOTSOCK)rrMÚerKrArrrÚ test_basics®s*&z$TestWSAEnumNetworkEvents.test_basicsc Cs^t ¡}| d¡t dddd¡}t ||tjtjB¡| d¡|  d¡t ¡}| d¡t dddd¡}t ||tj tj Btj BtjB¡|  | ¡¡}| |tj¡t |d¡}| |tj¡t ||¡}| |tjdi¡| ¡\}} | d¡t dddd¡} t || tj tj BtjB¡t | d¡}| |tj¡t || ¡}| |tj di¡t |d¡}| |tj¡t ||¡}| |tj dtj di¡d} tdƒdd} | d krFz| | | ¡7} Wnttjy@} zX| jdtjkrWYd} ~ q°n*| jdtjtjfvr*WYd} ~ qPn‚WYd} ~ n d} ~ 00q°| d ¡t |¡}| |i¡t | d¡}| |tj¡t || ¡}| |tj di¡d}|| krz|t| d ¡ƒ7}WnRtjy} z6| jdtjtjfvrþWYd} ~ q¢n‚WYd} ~ n d} ~ 00q¢| || ¡t |¡}| |i¡t |d¡}| |tj¡t ||¡}| |tj di¡| tj¡t | d¡}| |tj¡t d ƒD](}t || ¡}|r¾qÔt! "d ¡q¢t#dƒ‚| |tjdi¡t |¡}| |i¡| $¡t |d¡}| |tj¡t ||¡}| |tjdi¡| $¡t |¡}| |i¡dS)Nr)r·rr3ièrrðériz"could not find socket buffer limiti@rÂédzfailed to get events)%rxZ setblockingrjrmr r"Z FD_ACCEPTZFD_CLOSEr{r|Z FD_CONNECTZFD_READZFD_WRITEZ connect_exZ getsocknamer ZWSAEWOULDBLOCKrprär#rrr²r*r•ZWSAEINTRZ WSAENOBUFSrrr rZshutdownZSHUT_WRror6ZSleepÚAssertionErrorr )rrZ port_eventZclientZ client_eventÚerrrLrZserverrþZ server_eventÚsentr/r$ZreceivedrtrrrÚtest_functionalÇs ÿ   ÿþýý    ý                         z(TestWSAEnumNetworkEvents.test_functionalN)rrrr%r+rrrrr ­sr Ú__main__)'r[rrürçrxrr™rZunittestrØrkr6r$rjr rŽrRrZpywin32_testutilrrrr¯Ú NameErrorZsetsrZTestCaserrr_rhr©rÀrÒròr÷rr rrrrrÚsL Y(;@+}n[