test_socket.py 249 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711
  1. import unittest
  2. from test import support
  3. from test.support import os_helper
  4. from test.support import socket_helper
  5. from test.support import threading_helper
  6. import errno
  7. import io
  8. import itertools
  9. import socket
  10. import select
  11. import tempfile
  12. import time
  13. import traceback
  14. import queue
  15. import sys
  16. import os
  17. import platform
  18. import array
  19. import contextlib
  20. from weakref import proxy
  21. import signal
  22. import math
  23. import pickle
  24. import struct
  25. import random
  26. import shutil
  27. import string
  28. import _thread as thread
  29. import threading
  30. try:
  31. import multiprocessing
  32. except ImportError:
  33. multiprocessing = False
  34. try:
  35. import fcntl
  36. except ImportError:
  37. fcntl = None
  38. support.requires_working_socket(module=True)
  39. HOST = socket_helper.HOST
  40. # test unicode string and carriage return
  41. MSG = 'Michael Gilfix was here\u1234\r\n'.encode('utf-8')
  42. VSOCKPORT = 1234
  43. AIX = platform.system() == "AIX"
  44. try:
  45. import _socket
  46. except ImportError:
  47. _socket = None
  48. def get_cid():
  49. if fcntl is None:
  50. return None
  51. if not hasattr(socket, 'IOCTL_VM_SOCKETS_GET_LOCAL_CID'):
  52. return None
  53. try:
  54. with open("/dev/vsock", "rb") as f:
  55. r = fcntl.ioctl(f, socket.IOCTL_VM_SOCKETS_GET_LOCAL_CID, " ")
  56. except OSError:
  57. return None
  58. else:
  59. return struct.unpack("I", r)[0]
  60. def _have_socket_can():
  61. """Check whether CAN sockets are supported on this host."""
  62. try:
  63. s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
  64. except (AttributeError, OSError):
  65. return False
  66. else:
  67. s.close()
  68. return True
  69. def _have_socket_can_isotp():
  70. """Check whether CAN ISOTP sockets are supported on this host."""
  71. try:
  72. s = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP)
  73. except (AttributeError, OSError):
  74. return False
  75. else:
  76. s.close()
  77. return True
  78. def _have_socket_can_j1939():
  79. """Check whether CAN J1939 sockets are supported on this host."""
  80. try:
  81. s = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_J1939)
  82. except (AttributeError, OSError):
  83. return False
  84. else:
  85. s.close()
  86. return True
  87. def _have_socket_rds():
  88. """Check whether RDS sockets are supported on this host."""
  89. try:
  90. s = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
  91. except (AttributeError, OSError):
  92. return False
  93. else:
  94. s.close()
  95. return True
  96. def _have_socket_alg():
  97. """Check whether AF_ALG sockets are supported on this host."""
  98. try:
  99. s = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
  100. except (AttributeError, OSError):
  101. return False
  102. else:
  103. s.close()
  104. return True
  105. def _have_socket_qipcrtr():
  106. """Check whether AF_QIPCRTR sockets are supported on this host."""
  107. try:
  108. s = socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM, 0)
  109. except (AttributeError, OSError):
  110. return False
  111. else:
  112. s.close()
  113. return True
  114. def _have_socket_vsock():
  115. """Check whether AF_VSOCK sockets are supported on this host."""
  116. ret = get_cid() is not None
  117. return ret
  118. def _have_socket_bluetooth():
  119. """Check whether AF_BLUETOOTH sockets are supported on this host."""
  120. try:
  121. # RFCOMM is supported by all platforms with bluetooth support. Windows
  122. # does not support omitting the protocol.
  123. s = socket.socket(socket.AF_BLUETOOTH, socket.SOCK_STREAM, socket.BTPROTO_RFCOMM)
  124. except (AttributeError, OSError):
  125. return False
  126. else:
  127. s.close()
  128. return True
  129. @contextlib.contextmanager
  130. def socket_setdefaulttimeout(timeout):
  131. old_timeout = socket.getdefaulttimeout()
  132. try:
  133. socket.setdefaulttimeout(timeout)
  134. yield
  135. finally:
  136. socket.setdefaulttimeout(old_timeout)
  137. HAVE_SOCKET_CAN = _have_socket_can()
  138. HAVE_SOCKET_CAN_ISOTP = _have_socket_can_isotp()
  139. HAVE_SOCKET_CAN_J1939 = _have_socket_can_j1939()
  140. HAVE_SOCKET_RDS = _have_socket_rds()
  141. HAVE_SOCKET_ALG = _have_socket_alg()
  142. HAVE_SOCKET_QIPCRTR = _have_socket_qipcrtr()
  143. HAVE_SOCKET_VSOCK = _have_socket_vsock()
  144. HAVE_SOCKET_UDPLITE = hasattr(socket, "IPPROTO_UDPLITE")
  145. HAVE_SOCKET_BLUETOOTH = _have_socket_bluetooth()
  146. # Size in bytes of the int type
  147. SIZEOF_INT = array.array("i").itemsize
  148. class SocketTCPTest(unittest.TestCase):
  149. def setUp(self):
  150. self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  151. self.port = socket_helper.bind_port(self.serv)
  152. self.serv.listen()
  153. def tearDown(self):
  154. self.serv.close()
  155. self.serv = None
  156. class SocketUDPTest(unittest.TestCase):
  157. def setUp(self):
  158. self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  159. self.port = socket_helper.bind_port(self.serv)
  160. def tearDown(self):
  161. self.serv.close()
  162. self.serv = None
  163. class SocketUDPLITETest(SocketUDPTest):
  164. def setUp(self):
  165. self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDPLITE)
  166. self.port = socket_helper.bind_port(self.serv)
  167. class ThreadSafeCleanupTestCase:
  168. """Subclass of unittest.TestCase with thread-safe cleanup methods.
  169. This subclass protects the addCleanup() and doCleanups() methods
  170. with a recursive lock.
  171. """
  172. def __init__(self, *args, **kwargs):
  173. super().__init__(*args, **kwargs)
  174. self._cleanup_lock = threading.RLock()
  175. def addCleanup(self, *args, **kwargs):
  176. with self._cleanup_lock:
  177. return super().addCleanup(*args, **kwargs)
  178. def doCleanups(self, *args, **kwargs):
  179. with self._cleanup_lock:
  180. return super().doCleanups(*args, **kwargs)
  181. class SocketCANTest(unittest.TestCase):
  182. """To be able to run this test, a `vcan0` CAN interface can be created with
  183. the following commands:
  184. # modprobe vcan
  185. # ip link add dev vcan0 type vcan
  186. # ip link set up vcan0
  187. """
  188. interface = 'vcan0'
  189. bufsize = 128
  190. """The CAN frame structure is defined in <linux/can.h>:
  191. struct can_frame {
  192. canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */
  193. __u8 can_dlc; /* data length code: 0 .. 8 */
  194. __u8 data[8] __attribute__((aligned(8)));
  195. };
  196. """
  197. can_frame_fmt = "=IB3x8s"
  198. can_frame_size = struct.calcsize(can_frame_fmt)
  199. """The Broadcast Management Command frame structure is defined
  200. in <linux/can/bcm.h>:
  201. struct bcm_msg_head {
  202. __u32 opcode;
  203. __u32 flags;
  204. __u32 count;
  205. struct timeval ival1, ival2;
  206. canid_t can_id;
  207. __u32 nframes;
  208. struct can_frame frames[0];
  209. }
  210. `bcm_msg_head` must be 8 bytes aligned because of the `frames` member (see
  211. `struct can_frame` definition). Must use native not standard types for packing.
  212. """
  213. bcm_cmd_msg_fmt = "@3I4l2I"
  214. bcm_cmd_msg_fmt += "x" * (struct.calcsize(bcm_cmd_msg_fmt) % 8)
  215. def setUp(self):
  216. self.s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
  217. self.addCleanup(self.s.close)
  218. try:
  219. self.s.bind((self.interface,))
  220. except OSError:
  221. self.skipTest('network interface `%s` does not exist' %
  222. self.interface)
  223. class SocketRDSTest(unittest.TestCase):
  224. """To be able to run this test, the `rds` kernel module must be loaded:
  225. # modprobe rds
  226. """
  227. bufsize = 8192
  228. def setUp(self):
  229. self.serv = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
  230. self.addCleanup(self.serv.close)
  231. try:
  232. self.port = socket_helper.bind_port(self.serv)
  233. except OSError:
  234. self.skipTest('unable to bind RDS socket')
  235. class ThreadableTest:
  236. """Threadable Test class
  237. The ThreadableTest class makes it easy to create a threaded
  238. client/server pair from an existing unit test. To create a
  239. new threaded class from an existing unit test, use multiple
  240. inheritance:
  241. class NewClass (OldClass, ThreadableTest):
  242. pass
  243. This class defines two new fixture functions with obvious
  244. purposes for overriding:
  245. clientSetUp ()
  246. clientTearDown ()
  247. Any new test functions within the class must then define
  248. tests in pairs, where the test name is preceded with a
  249. '_' to indicate the client portion of the test. Ex:
  250. def testFoo(self):
  251. # Server portion
  252. def _testFoo(self):
  253. # Client portion
  254. Any exceptions raised by the clients during their tests
  255. are caught and transferred to the main thread to alert
  256. the testing framework.
  257. Note, the server setup function cannot call any blocking
  258. functions that rely on the client thread during setup,
  259. unless serverExplicitReady() is called just before
  260. the blocking call (such as in setting up a client/server
  261. connection and performing the accept() in setUp().
  262. """
  263. def __init__(self):
  264. # Swap the true setup function
  265. self.__setUp = self.setUp
  266. self.setUp = self._setUp
  267. def serverExplicitReady(self):
  268. """This method allows the server to explicitly indicate that
  269. it wants the client thread to proceed. This is useful if the
  270. server is about to execute a blocking routine that is
  271. dependent upon the client thread during its setup routine."""
  272. self.server_ready.set()
  273. def _setUp(self):
  274. self.enterContext(threading_helper.wait_threads_exit())
  275. self.server_ready = threading.Event()
  276. self.client_ready = threading.Event()
  277. self.done = threading.Event()
  278. self.queue = queue.Queue(1)
  279. self.server_crashed = False
  280. def raise_queued_exception():
  281. if self.queue.qsize():
  282. raise self.queue.get()
  283. self.addCleanup(raise_queued_exception)
  284. # Do some munging to start the client test.
  285. methodname = self.id()
  286. i = methodname.rfind('.')
  287. methodname = methodname[i+1:]
  288. test_method = getattr(self, '_' + methodname)
  289. self.client_thread = thread.start_new_thread(
  290. self.clientRun, (test_method,))
  291. try:
  292. self.__setUp()
  293. except:
  294. self.server_crashed = True
  295. raise
  296. finally:
  297. self.server_ready.set()
  298. self.client_ready.wait()
  299. self.addCleanup(self.done.wait)
  300. def clientRun(self, test_func):
  301. self.server_ready.wait()
  302. try:
  303. self.clientSetUp()
  304. except BaseException as e:
  305. self.queue.put(e)
  306. self.clientTearDown()
  307. return
  308. finally:
  309. self.client_ready.set()
  310. if self.server_crashed:
  311. self.clientTearDown()
  312. return
  313. if not hasattr(test_func, '__call__'):
  314. raise TypeError("test_func must be a callable function")
  315. try:
  316. test_func()
  317. except BaseException as e:
  318. self.queue.put(e)
  319. finally:
  320. self.clientTearDown()
  321. def clientSetUp(self):
  322. raise NotImplementedError("clientSetUp must be implemented.")
  323. def clientTearDown(self):
  324. self.done.set()
  325. thread.exit()
  326. class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
  327. def __init__(self, methodName='runTest'):
  328. SocketTCPTest.__init__(self, methodName=methodName)
  329. ThreadableTest.__init__(self)
  330. def clientSetUp(self):
  331. self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  332. def clientTearDown(self):
  333. self.cli.close()
  334. self.cli = None
  335. ThreadableTest.clientTearDown(self)
  336. class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
  337. def __init__(self, methodName='runTest'):
  338. SocketUDPTest.__init__(self, methodName=methodName)
  339. ThreadableTest.__init__(self)
  340. def clientSetUp(self):
  341. self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  342. def clientTearDown(self):
  343. self.cli.close()
  344. self.cli = None
  345. ThreadableTest.clientTearDown(self)
  346. @unittest.skipUnless(HAVE_SOCKET_UDPLITE,
  347. 'UDPLITE sockets required for this test.')
  348. class ThreadedUDPLITESocketTest(SocketUDPLITETest, ThreadableTest):
  349. def __init__(self, methodName='runTest'):
  350. SocketUDPLITETest.__init__(self, methodName=methodName)
  351. ThreadableTest.__init__(self)
  352. def clientSetUp(self):
  353. self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDPLITE)
  354. def clientTearDown(self):
  355. self.cli.close()
  356. self.cli = None
  357. ThreadableTest.clientTearDown(self)
  358. class ThreadedCANSocketTest(SocketCANTest, ThreadableTest):
  359. def __init__(self, methodName='runTest'):
  360. SocketCANTest.__init__(self, methodName=methodName)
  361. ThreadableTest.__init__(self)
  362. def clientSetUp(self):
  363. self.cli = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
  364. try:
  365. self.cli.bind((self.interface,))
  366. except OSError:
  367. # skipTest should not be called here, and will be called in the
  368. # server instead
  369. pass
  370. def clientTearDown(self):
  371. self.cli.close()
  372. self.cli = None
  373. ThreadableTest.clientTearDown(self)
  374. class ThreadedRDSSocketTest(SocketRDSTest, ThreadableTest):
  375. def __init__(self, methodName='runTest'):
  376. SocketRDSTest.__init__(self, methodName=methodName)
  377. ThreadableTest.__init__(self)
  378. def clientSetUp(self):
  379. self.cli = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
  380. try:
  381. # RDS sockets must be bound explicitly to send or receive data
  382. self.cli.bind((HOST, 0))
  383. self.cli_addr = self.cli.getsockname()
  384. except OSError:
  385. # skipTest should not be called here, and will be called in the
  386. # server instead
  387. pass
  388. def clientTearDown(self):
  389. self.cli.close()
  390. self.cli = None
  391. ThreadableTest.clientTearDown(self)
  392. @unittest.skipIf(fcntl is None, "need fcntl")
  393. @unittest.skipUnless(HAVE_SOCKET_VSOCK,
  394. 'VSOCK sockets required for this test.')
  395. @unittest.skipUnless(get_cid() != 2,
  396. "This test can only be run on a virtual guest.")
  397. class ThreadedVSOCKSocketStreamTest(unittest.TestCase, ThreadableTest):
  398. def __init__(self, methodName='runTest'):
  399. unittest.TestCase.__init__(self, methodName=methodName)
  400. ThreadableTest.__init__(self)
  401. def setUp(self):
  402. self.serv = socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM)
  403. self.addCleanup(self.serv.close)
  404. self.serv.bind((socket.VMADDR_CID_ANY, VSOCKPORT))
  405. self.serv.listen()
  406. self.serverExplicitReady()
  407. self.conn, self.connaddr = self.serv.accept()
  408. self.addCleanup(self.conn.close)
  409. def clientSetUp(self):
  410. time.sleep(0.1)
  411. self.cli = socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM)
  412. self.addCleanup(self.cli.close)
  413. cid = get_cid()
  414. self.cli.connect((cid, VSOCKPORT))
  415. def testStream(self):
  416. msg = self.conn.recv(1024)
  417. self.assertEqual(msg, MSG)
  418. def _testStream(self):
  419. self.cli.send(MSG)
  420. self.cli.close()
  421. class SocketConnectedTest(ThreadedTCPSocketTest):
  422. """Socket tests for client-server connection.
  423. self.cli_conn is a client socket connected to the server. The
  424. setUp() method guarantees that it is connected to the server.
  425. """
  426. def __init__(self, methodName='runTest'):
  427. ThreadedTCPSocketTest.__init__(self, methodName=methodName)
  428. def setUp(self):
  429. ThreadedTCPSocketTest.setUp(self)
  430. # Indicate explicitly we're ready for the client thread to
  431. # proceed and then perform the blocking call to accept
  432. self.serverExplicitReady()
  433. conn, addr = self.serv.accept()
  434. self.cli_conn = conn
  435. def tearDown(self):
  436. self.cli_conn.close()
  437. self.cli_conn = None
  438. ThreadedTCPSocketTest.tearDown(self)
  439. def clientSetUp(self):
  440. ThreadedTCPSocketTest.clientSetUp(self)
  441. self.cli.connect((HOST, self.port))
  442. self.serv_conn = self.cli
  443. def clientTearDown(self):
  444. self.serv_conn.close()
  445. self.serv_conn = None
  446. ThreadedTCPSocketTest.clientTearDown(self)
  447. class SocketPairTest(unittest.TestCase, ThreadableTest):
  448. def __init__(self, methodName='runTest'):
  449. unittest.TestCase.__init__(self, methodName=methodName)
  450. ThreadableTest.__init__(self)
  451. def setUp(self):
  452. self.serv, self.cli = socket.socketpair()
  453. def tearDown(self):
  454. self.serv.close()
  455. self.serv = None
  456. def clientSetUp(self):
  457. pass
  458. def clientTearDown(self):
  459. self.cli.close()
  460. self.cli = None
  461. ThreadableTest.clientTearDown(self)
  462. # The following classes are used by the sendmsg()/recvmsg() tests.
  463. # Combining, for instance, ConnectedStreamTestMixin and TCPTestBase
  464. # gives a drop-in replacement for SocketConnectedTest, but different
  465. # address families can be used, and the attributes serv_addr and
  466. # cli_addr will be set to the addresses of the endpoints.
  467. class SocketTestBase(unittest.TestCase):
  468. """A base class for socket tests.
  469. Subclasses must provide methods newSocket() to return a new socket
  470. and bindSock(sock) to bind it to an unused address.
  471. Creates a socket self.serv and sets self.serv_addr to its address.
  472. """
  473. def setUp(self):
  474. self.serv = self.newSocket()
  475. self.bindServer()
  476. def bindServer(self):
  477. """Bind server socket and set self.serv_addr to its address."""
  478. self.bindSock(self.serv)
  479. self.serv_addr = self.serv.getsockname()
  480. def tearDown(self):
  481. self.serv.close()
  482. self.serv = None
  483. class SocketListeningTestMixin(SocketTestBase):
  484. """Mixin to listen on the server socket."""
  485. def setUp(self):
  486. super().setUp()
  487. self.serv.listen()
  488. class ThreadedSocketTestMixin(ThreadSafeCleanupTestCase, SocketTestBase,
  489. ThreadableTest):
  490. """Mixin to add client socket and allow client/server tests.
  491. Client socket is self.cli and its address is self.cli_addr. See
  492. ThreadableTest for usage information.
  493. """
  494. def __init__(self, *args, **kwargs):
  495. super().__init__(*args, **kwargs)
  496. ThreadableTest.__init__(self)
  497. def clientSetUp(self):
  498. self.cli = self.newClientSocket()
  499. self.bindClient()
  500. def newClientSocket(self):
  501. """Return a new socket for use as client."""
  502. return self.newSocket()
  503. def bindClient(self):
  504. """Bind client socket and set self.cli_addr to its address."""
  505. self.bindSock(self.cli)
  506. self.cli_addr = self.cli.getsockname()
  507. def clientTearDown(self):
  508. self.cli.close()
  509. self.cli = None
  510. ThreadableTest.clientTearDown(self)
  511. class ConnectedStreamTestMixin(SocketListeningTestMixin,
  512. ThreadedSocketTestMixin):
  513. """Mixin to allow client/server stream tests with connected client.
  514. Server's socket representing connection to client is self.cli_conn
  515. and client's connection to server is self.serv_conn. (Based on
  516. SocketConnectedTest.)
  517. """
  518. def setUp(self):
  519. super().setUp()
  520. # Indicate explicitly we're ready for the client thread to
  521. # proceed and then perform the blocking call to accept
  522. self.serverExplicitReady()
  523. conn, addr = self.serv.accept()
  524. self.cli_conn = conn
  525. def tearDown(self):
  526. self.cli_conn.close()
  527. self.cli_conn = None
  528. super().tearDown()
  529. def clientSetUp(self):
  530. super().clientSetUp()
  531. self.cli.connect(self.serv_addr)
  532. self.serv_conn = self.cli
  533. def clientTearDown(self):
  534. try:
  535. self.serv_conn.close()
  536. self.serv_conn = None
  537. except AttributeError:
  538. pass
  539. super().clientTearDown()
  540. class UnixSocketTestBase(SocketTestBase):
  541. """Base class for Unix-domain socket tests."""
  542. # This class is used for file descriptor passing tests, so we
  543. # create the sockets in a private directory so that other users
  544. # can't send anything that might be problematic for a privileged
  545. # user running the tests.
  546. def setUp(self):
  547. self.dir_path = tempfile.mkdtemp()
  548. self.addCleanup(os.rmdir, self.dir_path)
  549. super().setUp()
  550. def bindSock(self, sock):
  551. path = tempfile.mktemp(dir=self.dir_path)
  552. socket_helper.bind_unix_socket(sock, path)
  553. self.addCleanup(os_helper.unlink, path)
  554. class UnixStreamBase(UnixSocketTestBase):
  555. """Base class for Unix-domain SOCK_STREAM tests."""
  556. def newSocket(self):
  557. return socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
  558. class InetTestBase(SocketTestBase):
  559. """Base class for IPv4 socket tests."""
  560. host = HOST
  561. def setUp(self):
  562. super().setUp()
  563. self.port = self.serv_addr[1]
  564. def bindSock(self, sock):
  565. socket_helper.bind_port(sock, host=self.host)
  566. class TCPTestBase(InetTestBase):
  567. """Base class for TCP-over-IPv4 tests."""
  568. def newSocket(self):
  569. return socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  570. class UDPTestBase(InetTestBase):
  571. """Base class for UDP-over-IPv4 tests."""
  572. def newSocket(self):
  573. return socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  574. class UDPLITETestBase(InetTestBase):
  575. """Base class for UDPLITE-over-IPv4 tests."""
  576. def newSocket(self):
  577. return socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDPLITE)
  578. class SCTPStreamBase(InetTestBase):
  579. """Base class for SCTP tests in one-to-one (SOCK_STREAM) mode."""
  580. def newSocket(self):
  581. return socket.socket(socket.AF_INET, socket.SOCK_STREAM,
  582. socket.IPPROTO_SCTP)
  583. class Inet6TestBase(InetTestBase):
  584. """Base class for IPv6 socket tests."""
  585. host = socket_helper.HOSTv6
  586. class UDP6TestBase(Inet6TestBase):
  587. """Base class for UDP-over-IPv6 tests."""
  588. def newSocket(self):
  589. return socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
  590. class UDPLITE6TestBase(Inet6TestBase):
  591. """Base class for UDPLITE-over-IPv6 tests."""
  592. def newSocket(self):
  593. return socket.socket(socket.AF_INET6, socket.SOCK_DGRAM, socket.IPPROTO_UDPLITE)
  594. # Test-skipping decorators for use with ThreadableTest.
  595. def skipWithClientIf(condition, reason):
  596. """Skip decorated test if condition is true, add client_skip decorator.
  597. If the decorated object is not a class, sets its attribute
  598. "client_skip" to a decorator which will return an empty function
  599. if the test is to be skipped, or the original function if it is
  600. not. This can be used to avoid running the client part of a
  601. skipped test when using ThreadableTest.
  602. """
  603. def client_pass(*args, **kwargs):
  604. pass
  605. def skipdec(obj):
  606. retval = unittest.skip(reason)(obj)
  607. if not isinstance(obj, type):
  608. retval.client_skip = lambda f: client_pass
  609. return retval
  610. def noskipdec(obj):
  611. if not (isinstance(obj, type) or hasattr(obj, "client_skip")):
  612. obj.client_skip = lambda f: f
  613. return obj
  614. return skipdec if condition else noskipdec
  615. def requireAttrs(obj, *attributes):
  616. """Skip decorated test if obj is missing any of the given attributes.
  617. Sets client_skip attribute as skipWithClientIf() does.
  618. """
  619. missing = [name for name in attributes if not hasattr(obj, name)]
  620. return skipWithClientIf(
  621. missing, "don't have " + ", ".join(name for name in missing))
  622. def requireSocket(*args):
  623. """Skip decorated test if a socket cannot be created with given arguments.
  624. When an argument is given as a string, will use the value of that
  625. attribute of the socket module, or skip the test if it doesn't
  626. exist. Sets client_skip attribute as skipWithClientIf() does.
  627. """
  628. err = None
  629. missing = [obj for obj in args if
  630. isinstance(obj, str) and not hasattr(socket, obj)]
  631. if missing:
  632. err = "don't have " + ", ".join(name for name in missing)
  633. else:
  634. callargs = [getattr(socket, obj) if isinstance(obj, str) else obj
  635. for obj in args]
  636. try:
  637. s = socket.socket(*callargs)
  638. except OSError as e:
  639. # XXX: check errno?
  640. err = str(e)
  641. else:
  642. s.close()
  643. return skipWithClientIf(
  644. err is not None,
  645. "can't create socket({0}): {1}".format(
  646. ", ".join(str(o) for o in args), err))
  647. #######################################################################
  648. ## Begin Tests
  649. class GeneralModuleTests(unittest.TestCase):
  650. def test_SocketType_is_socketobject(self):
  651. import _socket
  652. self.assertTrue(socket.SocketType is _socket.socket)
  653. s = socket.socket()
  654. self.assertIsInstance(s, socket.SocketType)
  655. s.close()
  656. def test_repr(self):
  657. s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  658. with s:
  659. self.assertIn('fd=%i' % s.fileno(), repr(s))
  660. self.assertIn('family=%s' % socket.AF_INET, repr(s))
  661. self.assertIn('type=%s' % socket.SOCK_STREAM, repr(s))
  662. self.assertIn('proto=0', repr(s))
  663. self.assertNotIn('raddr', repr(s))
  664. s.bind(('127.0.0.1', 0))
  665. self.assertIn('laddr', repr(s))
  666. self.assertIn(str(s.getsockname()), repr(s))
  667. self.assertIn('[closed]', repr(s))
  668. self.assertNotIn('laddr', repr(s))
  669. @unittest.skipUnless(_socket is not None, 'need _socket module')
  670. def test_csocket_repr(self):
  671. s = _socket.socket(_socket.AF_INET, _socket.SOCK_STREAM)
  672. try:
  673. expected = ('<socket object, fd=%s, family=%s, type=%s, proto=%s>'
  674. % (s.fileno(), s.family, s.type, s.proto))
  675. self.assertEqual(repr(s), expected)
  676. finally:
  677. s.close()
  678. expected = ('<socket object, fd=-1, family=%s, type=%s, proto=%s>'
  679. % (s.family, s.type, s.proto))
  680. self.assertEqual(repr(s), expected)
  681. def test_weakref(self):
  682. with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
  683. p = proxy(s)
  684. self.assertEqual(p.fileno(), s.fileno())
  685. s = None
  686. support.gc_collect() # For PyPy or other GCs.
  687. try:
  688. p.fileno()
  689. except ReferenceError:
  690. pass
  691. else:
  692. self.fail('Socket proxy still exists')
  693. def testSocketError(self):
  694. # Testing socket module exceptions
  695. msg = "Error raising socket exception (%s)."
  696. with self.assertRaises(OSError, msg=msg % 'OSError'):
  697. raise OSError
  698. with self.assertRaises(OSError, msg=msg % 'socket.herror'):
  699. raise socket.herror
  700. with self.assertRaises(OSError, msg=msg % 'socket.gaierror'):
  701. raise socket.gaierror
  702. def testSendtoErrors(self):
  703. # Testing that sendto doesn't mask failures. See #10169.
  704. s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  705. self.addCleanup(s.close)
  706. s.bind(('', 0))
  707. sockname = s.getsockname()
  708. # 2 args
  709. with self.assertRaises(TypeError) as cm:
  710. s.sendto('\u2620', sockname)
  711. self.assertEqual(str(cm.exception),
  712. "a bytes-like object is required, not 'str'")
  713. with self.assertRaises(TypeError) as cm:
  714. s.sendto(5j, sockname)
  715. self.assertEqual(str(cm.exception),
  716. "a bytes-like object is required, not 'complex'")
  717. with self.assertRaises(TypeError) as cm:
  718. s.sendto(b'foo', None)
  719. self.assertIn('not NoneType',str(cm.exception))
  720. # 3 args
  721. with self.assertRaises(TypeError) as cm:
  722. s.sendto('\u2620', 0, sockname)
  723. self.assertEqual(str(cm.exception),
  724. "a bytes-like object is required, not 'str'")
  725. with self.assertRaises(TypeError) as cm:
  726. s.sendto(5j, 0, sockname)
  727. self.assertEqual(str(cm.exception),
  728. "a bytes-like object is required, not 'complex'")
  729. with self.assertRaises(TypeError) as cm:
  730. s.sendto(b'foo', 0, None)
  731. self.assertIn('not NoneType', str(cm.exception))
  732. with self.assertRaises(TypeError) as cm:
  733. s.sendto(b'foo', 'bar', sockname)
  734. with self.assertRaises(TypeError) as cm:
  735. s.sendto(b'foo', None, None)
  736. # wrong number of args
  737. with self.assertRaises(TypeError) as cm:
  738. s.sendto(b'foo')
  739. self.assertIn('(1 given)', str(cm.exception))
  740. with self.assertRaises(TypeError) as cm:
  741. s.sendto(b'foo', 0, sockname, 4)
  742. self.assertIn('(4 given)', str(cm.exception))
  743. def testCrucialConstants(self):
  744. # Testing for mission critical constants
  745. socket.AF_INET
  746. if socket.has_ipv6:
  747. socket.AF_INET6
  748. socket.SOCK_STREAM
  749. socket.SOCK_DGRAM
  750. socket.SOCK_RAW
  751. socket.SOCK_RDM
  752. socket.SOCK_SEQPACKET
  753. socket.SOL_SOCKET
  754. socket.SO_REUSEADDR
  755. def testCrucialIpProtoConstants(self):
  756. socket.IPPROTO_TCP
  757. socket.IPPROTO_UDP
  758. if socket.has_ipv6:
  759. socket.IPPROTO_IPV6
  760. @unittest.skipUnless(os.name == "nt", "Windows specific")
  761. def testWindowsSpecificConstants(self):
  762. socket.IPPROTO_ICLFXBM
  763. socket.IPPROTO_ST
  764. socket.IPPROTO_CBT
  765. socket.IPPROTO_IGP
  766. socket.IPPROTO_RDP
  767. socket.IPPROTO_PGM
  768. socket.IPPROTO_L2TP
  769. socket.IPPROTO_SCTP
  770. @unittest.skipIf(support.is_wasi, "WASI is missing these methods")
  771. def test_socket_methods(self):
  772. # socket methods that depend on a configure HAVE_ check. They should
  773. # be present on all platforms except WASI.
  774. names = [
  775. "_accept", "bind", "connect", "connect_ex", "getpeername",
  776. "getsockname", "listen", "recvfrom", "recvfrom_into", "sendto",
  777. "setsockopt", "shutdown"
  778. ]
  779. for name in names:
  780. if not hasattr(socket.socket, name):
  781. self.fail(f"socket method {name} is missing")
  782. @unittest.skipUnless(sys.platform == 'darwin', 'macOS specific test')
  783. @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test')
  784. def test3542SocketOptions(self):
  785. # Ref. issue #35569 and https://tools.ietf.org/html/rfc3542
  786. opts = {
  787. 'IPV6_CHECKSUM',
  788. 'IPV6_DONTFRAG',
  789. 'IPV6_DSTOPTS',
  790. 'IPV6_HOPLIMIT',
  791. 'IPV6_HOPOPTS',
  792. 'IPV6_NEXTHOP',
  793. 'IPV6_PATHMTU',
  794. 'IPV6_PKTINFO',
  795. 'IPV6_RECVDSTOPTS',
  796. 'IPV6_RECVHOPLIMIT',
  797. 'IPV6_RECVHOPOPTS',
  798. 'IPV6_RECVPATHMTU',
  799. 'IPV6_RECVPKTINFO',
  800. 'IPV6_RECVRTHDR',
  801. 'IPV6_RECVTCLASS',
  802. 'IPV6_RTHDR',
  803. 'IPV6_RTHDRDSTOPTS',
  804. 'IPV6_RTHDR_TYPE_0',
  805. 'IPV6_TCLASS',
  806. 'IPV6_USE_MIN_MTU',
  807. }
  808. for opt in opts:
  809. self.assertTrue(
  810. hasattr(socket, opt), f"Missing RFC3542 socket option '{opt}'"
  811. )
  812. def testHostnameRes(self):
  813. # Testing hostname resolution mechanisms
  814. hostname = socket.gethostname()
  815. try:
  816. ip = socket.gethostbyname(hostname)
  817. except OSError:
  818. # Probably name lookup wasn't set up right; skip this test
  819. self.skipTest('name lookup failure')
  820. self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
  821. try:
  822. hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
  823. except OSError:
  824. # Probably a similar problem as above; skip this test
  825. self.skipTest('name lookup failure')
  826. all_host_names = [hostname, hname] + aliases
  827. fqhn = socket.getfqdn(ip)
  828. if not fqhn in all_host_names:
  829. self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
  830. def test_host_resolution(self):
  831. for addr in [socket_helper.HOSTv4, '10.0.0.1', '255.255.255.255']:
  832. self.assertEqual(socket.gethostbyname(addr), addr)
  833. # we don't test socket_helper.HOSTv6 because there's a chance it doesn't have
  834. # a matching name entry (e.g. 'ip6-localhost')
  835. for host in [socket_helper.HOSTv4]:
  836. self.assertIn(host, socket.gethostbyaddr(host)[2])
  837. def test_host_resolution_bad_address(self):
  838. # These are all malformed IP addresses and expected not to resolve to
  839. # any result. But some ISPs, e.g. AWS and AT&T, may successfully
  840. # resolve these IPs. In particular, AT&T's DNS Error Assist service
  841. # will break this test. See https://bugs.python.org/issue42092 for a
  842. # workaround.
  843. explanation = (
  844. "resolving an invalid IP address did not raise OSError; "
  845. "can be caused by a broken DNS server"
  846. )
  847. for addr in ['0.1.1.~1', '1+.1.1.1', '::1q', '::1::2',
  848. '1:1:1:1:1:1:1:1:1']:
  849. with self.assertRaises(OSError, msg=addr):
  850. socket.gethostbyname(addr)
  851. with self.assertRaises(OSError, msg=explanation):
  852. socket.gethostbyaddr(addr)
  853. @unittest.skipUnless(hasattr(socket, 'sethostname'), "test needs socket.sethostname()")
  854. @unittest.skipUnless(hasattr(socket, 'gethostname'), "test needs socket.gethostname()")
  855. def test_sethostname(self):
  856. oldhn = socket.gethostname()
  857. try:
  858. socket.sethostname('new')
  859. except OSError as e:
  860. if e.errno == errno.EPERM:
  861. self.skipTest("test should be run as root")
  862. else:
  863. raise
  864. try:
  865. # running test as root!
  866. self.assertEqual(socket.gethostname(), 'new')
  867. # Should work with bytes objects too
  868. socket.sethostname(b'bar')
  869. self.assertEqual(socket.gethostname(), 'bar')
  870. finally:
  871. socket.sethostname(oldhn)
  872. @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
  873. 'socket.if_nameindex() not available.')
  874. def testInterfaceNameIndex(self):
  875. interfaces = socket.if_nameindex()
  876. for index, name in interfaces:
  877. self.assertIsInstance(index, int)
  878. self.assertIsInstance(name, str)
  879. # interface indices are non-zero integers
  880. self.assertGreater(index, 0)
  881. _index = socket.if_nametoindex(name)
  882. self.assertIsInstance(_index, int)
  883. self.assertEqual(index, _index)
  884. _name = socket.if_indextoname(index)
  885. self.assertIsInstance(_name, str)
  886. self.assertEqual(name, _name)
  887. @unittest.skipUnless(hasattr(socket, 'if_indextoname'),
  888. 'socket.if_indextoname() not available.')
  889. def testInvalidInterfaceIndexToName(self):
  890. self.assertRaises(OSError, socket.if_indextoname, 0)
  891. self.assertRaises(TypeError, socket.if_indextoname, '_DEADBEEF')
  892. @unittest.skipUnless(hasattr(socket, 'if_nametoindex'),
  893. 'socket.if_nametoindex() not available.')
  894. def testInvalidInterfaceNameToIndex(self):
  895. self.assertRaises(TypeError, socket.if_nametoindex, 0)
  896. self.assertRaises(OSError, socket.if_nametoindex, '_DEADBEEF')
  897. @unittest.skipUnless(hasattr(sys, 'getrefcount'),
  898. 'test needs sys.getrefcount()')
  899. def testRefCountGetNameInfo(self):
  900. # Testing reference count for getnameinfo
  901. try:
  902. # On some versions, this loses a reference
  903. orig = sys.getrefcount(__name__)
  904. socket.getnameinfo(__name__,0)
  905. except TypeError:
  906. if sys.getrefcount(__name__) != orig:
  907. self.fail("socket.getnameinfo loses a reference")
  908. def testInterpreterCrash(self):
  909. # Making sure getnameinfo doesn't crash the interpreter
  910. try:
  911. # On some versions, this crashes the interpreter.
  912. socket.getnameinfo(('x', 0, 0, 0), 0)
  913. except OSError:
  914. pass
  915. def testNtoH(self):
  916. # This just checks that htons etc. are their own inverse,
  917. # when looking at the lower 16 or 32 bits.
  918. sizes = {socket.htonl: 32, socket.ntohl: 32,
  919. socket.htons: 16, socket.ntohs: 16}
  920. for func, size in sizes.items():
  921. mask = (1<<size) - 1
  922. for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
  923. self.assertEqual(i & mask, func(func(i&mask)) & mask)
  924. swapped = func(mask)
  925. self.assertEqual(swapped & mask, mask)
  926. self.assertRaises(OverflowError, func, 1<<34)
  927. @support.cpython_only
  928. def testNtoHErrors(self):
  929. import _testcapi
  930. s_good_values = [0, 1, 2, 0xffff]
  931. l_good_values = s_good_values + [0xffffffff]
  932. l_bad_values = [-1, -2, 1<<32, 1<<1000]
  933. s_bad_values = (
  934. l_bad_values +
  935. [_testcapi.INT_MIN-1, _testcapi.INT_MAX+1] +
  936. [1 << 16, _testcapi.INT_MAX]
  937. )
  938. for k in s_good_values:
  939. socket.ntohs(k)
  940. socket.htons(k)
  941. for k in l_good_values:
  942. socket.ntohl(k)
  943. socket.htonl(k)
  944. for k in s_bad_values:
  945. self.assertRaises(OverflowError, socket.ntohs, k)
  946. self.assertRaises(OverflowError, socket.htons, k)
  947. for k in l_bad_values:
  948. self.assertRaises(OverflowError, socket.ntohl, k)
  949. self.assertRaises(OverflowError, socket.htonl, k)
  950. def testGetServBy(self):
  951. eq = self.assertEqual
  952. # Find one service that exists, then check all the related interfaces.
  953. # I've ordered this by protocols that have both a tcp and udp
  954. # protocol, at least for modern Linuxes.
  955. if (sys.platform.startswith(('freebsd', 'netbsd', 'gnukfreebsd'))
  956. or sys.platform in ('linux', 'darwin')):
  957. # avoid the 'echo' service on this platform, as there is an
  958. # assumption breaking non-standard port/protocol entry
  959. services = ('daytime', 'qotd', 'domain')
  960. else:
  961. services = ('echo', 'daytime', 'domain')
  962. for service in services:
  963. try:
  964. port = socket.getservbyname(service, 'tcp')
  965. break
  966. except OSError:
  967. pass
  968. else:
  969. raise OSError
  970. # Try same call with optional protocol omitted
  971. # Issue #26936: Android getservbyname() was broken before API 23.
  972. if (not hasattr(sys, 'getandroidapilevel') or
  973. sys.getandroidapilevel() >= 23):
  974. port2 = socket.getservbyname(service)
  975. eq(port, port2)
  976. # Try udp, but don't barf if it doesn't exist
  977. try:
  978. udpport = socket.getservbyname(service, 'udp')
  979. except OSError:
  980. udpport = None
  981. else:
  982. eq(udpport, port)
  983. # Now make sure the lookup by port returns the same service name
  984. # Issue #26936: Android getservbyport() is broken.
  985. if not support.is_android:
  986. eq(socket.getservbyport(port2), service)
  987. eq(socket.getservbyport(port, 'tcp'), service)
  988. if udpport is not None:
  989. eq(socket.getservbyport(udpport, 'udp'), service)
  990. # Make sure getservbyport does not accept out of range ports.
  991. self.assertRaises(OverflowError, socket.getservbyport, -1)
  992. self.assertRaises(OverflowError, socket.getservbyport, 65536)
  993. def testDefaultTimeout(self):
  994. # Testing default timeout
  995. # The default timeout should initially be None
  996. self.assertEqual(socket.getdefaulttimeout(), None)
  997. with socket.socket() as s:
  998. self.assertEqual(s.gettimeout(), None)
  999. # Set the default timeout to 10, and see if it propagates
  1000. with socket_setdefaulttimeout(10):
  1001. self.assertEqual(socket.getdefaulttimeout(), 10)
  1002. with socket.socket() as sock:
  1003. self.assertEqual(sock.gettimeout(), 10)
  1004. # Reset the default timeout to None, and see if it propagates
  1005. socket.setdefaulttimeout(None)
  1006. self.assertEqual(socket.getdefaulttimeout(), None)
  1007. with socket.socket() as sock:
  1008. self.assertEqual(sock.gettimeout(), None)
  1009. # Check that setting it to an invalid value raises ValueError
  1010. self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
  1011. # Check that setting it to an invalid type raises TypeError
  1012. self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
  1013. @unittest.skipUnless(hasattr(socket, 'inet_aton'),
  1014. 'test needs socket.inet_aton()')
  1015. def testIPv4_inet_aton_fourbytes(self):
  1016. # Test that issue1008086 and issue767150 are fixed.
  1017. # It must return 4 bytes.
  1018. self.assertEqual(b'\x00'*4, socket.inet_aton('0.0.0.0'))
  1019. self.assertEqual(b'\xff'*4, socket.inet_aton('255.255.255.255'))
  1020. @unittest.skipUnless(hasattr(socket, 'inet_pton'),
  1021. 'test needs socket.inet_pton()')
  1022. def testIPv4toString(self):
  1023. from socket import inet_aton as f, inet_pton, AF_INET
  1024. g = lambda a: inet_pton(AF_INET, a)
  1025. assertInvalid = lambda func,a: self.assertRaises(
  1026. (OSError, ValueError), func, a
  1027. )
  1028. self.assertEqual(b'\x00\x00\x00\x00', f('0.0.0.0'))
  1029. self.assertEqual(b'\xff\x00\xff\x00', f('255.0.255.0'))
  1030. self.assertEqual(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
  1031. self.assertEqual(b'\x01\x02\x03\x04', f('1.2.3.4'))
  1032. self.assertEqual(b'\xff\xff\xff\xff', f('255.255.255.255'))
  1033. # bpo-29972: inet_pton() doesn't fail on AIX
  1034. if not AIX:
  1035. assertInvalid(f, '0.0.0.')
  1036. assertInvalid(f, '300.0.0.0')
  1037. assertInvalid(f, 'a.0.0.0')
  1038. assertInvalid(f, '1.2.3.4.5')
  1039. assertInvalid(f, '::1')
  1040. self.assertEqual(b'\x00\x00\x00\x00', g('0.0.0.0'))
  1041. self.assertEqual(b'\xff\x00\xff\x00', g('255.0.255.0'))
  1042. self.assertEqual(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
  1043. self.assertEqual(b'\xff\xff\xff\xff', g('255.255.255.255'))
  1044. assertInvalid(g, '0.0.0.')
  1045. assertInvalid(g, '300.0.0.0')
  1046. assertInvalid(g, 'a.0.0.0')
  1047. assertInvalid(g, '1.2.3.4.5')
  1048. assertInvalid(g, '::1')
  1049. @unittest.skipUnless(hasattr(socket, 'inet_pton'),
  1050. 'test needs socket.inet_pton()')
  1051. def testIPv6toString(self):
  1052. try:
  1053. from socket import inet_pton, AF_INET6, has_ipv6
  1054. if not has_ipv6:
  1055. self.skipTest('IPv6 not available')
  1056. except ImportError:
  1057. self.skipTest('could not import needed symbols from socket')
  1058. if sys.platform == "win32":
  1059. try:
  1060. inet_pton(AF_INET6, '::')
  1061. except OSError as e:
  1062. if e.winerror == 10022:
  1063. self.skipTest('IPv6 might not be supported')
  1064. f = lambda a: inet_pton(AF_INET6, a)
  1065. assertInvalid = lambda a: self.assertRaises(
  1066. (OSError, ValueError), f, a
  1067. )
  1068. self.assertEqual(b'\x00' * 16, f('::'))
  1069. self.assertEqual(b'\x00' * 16, f('0::0'))
  1070. self.assertEqual(b'\x00\x01' + b'\x00' * 14, f('1::'))
  1071. self.assertEqual(
  1072. b'\x45\xef\x76\xcb\x00\x1a\x56\xef\xaf\xeb\x0b\xac\x19\x24\xae\xae',
  1073. f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
  1074. )
  1075. self.assertEqual(
  1076. b'\xad\x42\x0a\xbc' + b'\x00' * 4 + b'\x01\x27\x00\x00\x02\x54\x00\x02',
  1077. f('ad42:abc::127:0:254:2')
  1078. )
  1079. self.assertEqual(b'\x00\x12\x00\x0a' + b'\x00' * 12, f('12:a::'))
  1080. assertInvalid('0x20::')
  1081. assertInvalid(':::')
  1082. assertInvalid('::0::')
  1083. assertInvalid('1::abc::')
  1084. assertInvalid('1::abc::def')
  1085. assertInvalid('1:2:3:4:5:6')
  1086. assertInvalid('1:2:3:4:5:6:')
  1087. assertInvalid('1:2:3:4:5:6:7:8:0')
  1088. # bpo-29972: inet_pton() doesn't fail on AIX
  1089. if not AIX:
  1090. assertInvalid('1:2:3:4:5:6:7:8:')
  1091. self.assertEqual(b'\x00' * 12 + b'\xfe\x2a\x17\x40',
  1092. f('::254.42.23.64')
  1093. )
  1094. self.assertEqual(
  1095. b'\x00\x42' + b'\x00' * 8 + b'\xa2\x9b\xfe\x2a\x17\x40',
  1096. f('42::a29b:254.42.23.64')
  1097. )
  1098. self.assertEqual(
  1099. b'\x00\x42\xa8\xb9\x00\x00\x00\x02\xff\xff\xa2\x9b\xfe\x2a\x17\x40',
  1100. f('42:a8b9:0:2:ffff:a29b:254.42.23.64')
  1101. )
  1102. assertInvalid('255.254.253.252')
  1103. assertInvalid('1::260.2.3.0')
  1104. assertInvalid('1::0.be.e.0')
  1105. assertInvalid('1:2:3:4:5:6:7:1.2.3.4')
  1106. assertInvalid('::1.2.3.4:0')
  1107. assertInvalid('0.100.200.0:3:4:5:6:7:8')
  1108. @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
  1109. 'test needs socket.inet_ntop()')
  1110. def testStringToIPv4(self):
  1111. from socket import inet_ntoa as f, inet_ntop, AF_INET
  1112. g = lambda a: inet_ntop(AF_INET, a)
  1113. assertInvalid = lambda func,a: self.assertRaises(
  1114. (OSError, ValueError), func, a
  1115. )
  1116. self.assertEqual('1.0.1.0', f(b'\x01\x00\x01\x00'))
  1117. self.assertEqual('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
  1118. self.assertEqual('255.255.255.255', f(b'\xff\xff\xff\xff'))
  1119. self.assertEqual('1.2.3.4', f(b'\x01\x02\x03\x04'))
  1120. assertInvalid(f, b'\x00' * 3)
  1121. assertInvalid(f, b'\x00' * 5)
  1122. assertInvalid(f, b'\x00' * 16)
  1123. self.assertEqual('170.85.170.85', f(bytearray(b'\xaa\x55\xaa\x55')))
  1124. self.assertEqual('1.0.1.0', g(b'\x01\x00\x01\x00'))
  1125. self.assertEqual('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
  1126. self.assertEqual('255.255.255.255', g(b'\xff\xff\xff\xff'))
  1127. assertInvalid(g, b'\x00' * 3)
  1128. assertInvalid(g, b'\x00' * 5)
  1129. assertInvalid(g, b'\x00' * 16)
  1130. self.assertEqual('170.85.170.85', g(bytearray(b'\xaa\x55\xaa\x55')))
  1131. @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
  1132. 'test needs socket.inet_ntop()')
  1133. def testStringToIPv6(self):
  1134. try:
  1135. from socket import inet_ntop, AF_INET6, has_ipv6
  1136. if not has_ipv6:
  1137. self.skipTest('IPv6 not available')
  1138. except ImportError:
  1139. self.skipTest('could not import needed symbols from socket')
  1140. if sys.platform == "win32":
  1141. try:
  1142. inet_ntop(AF_INET6, b'\x00' * 16)
  1143. except OSError as e:
  1144. if e.winerror == 10022:
  1145. self.skipTest('IPv6 might not be supported')
  1146. f = lambda a: inet_ntop(AF_INET6, a)
  1147. assertInvalid = lambda a: self.assertRaises(
  1148. (OSError, ValueError), f, a
  1149. )
  1150. self.assertEqual('::', f(b'\x00' * 16))
  1151. self.assertEqual('::1', f(b'\x00' * 15 + b'\x01'))
  1152. self.assertEqual(
  1153. 'aef:b01:506:1001:ffff:9997:55:170',
  1154. f(b'\x0a\xef\x0b\x01\x05\x06\x10\x01\xff\xff\x99\x97\x00\x55\x01\x70')
  1155. )
  1156. self.assertEqual('::1', f(bytearray(b'\x00' * 15 + b'\x01')))
  1157. assertInvalid(b'\x12' * 15)
  1158. assertInvalid(b'\x12' * 17)
  1159. assertInvalid(b'\x12' * 4)
  1160. # XXX The following don't test module-level functionality...
  1161. def testSockName(self):
  1162. # Testing getsockname()
  1163. sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  1164. self.addCleanup(sock.close)
  1165. # Since find_unused_port() is inherently subject to race conditions, we
  1166. # call it a couple times if necessary.
  1167. for i in itertools.count():
  1168. port = socket_helper.find_unused_port()
  1169. try:
  1170. sock.bind(("0.0.0.0", port))
  1171. except OSError as e:
  1172. if e.errno != errno.EADDRINUSE or i == 5:
  1173. raise
  1174. else:
  1175. break
  1176. name = sock.getsockname()
  1177. # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
  1178. # it reasonable to get the host's addr in addition to 0.0.0.0.
  1179. # At least for eCos. This is required for the S/390 to pass.
  1180. try:
  1181. my_ip_addr = socket.gethostbyname(socket.gethostname())
  1182. except OSError:
  1183. # Probably name lookup wasn't set up right; skip this test
  1184. self.skipTest('name lookup failure')
  1185. self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
  1186. self.assertEqual(name[1], port)
  1187. def testGetSockOpt(self):
  1188. # Testing getsockopt()
  1189. # We know a socket should start without reuse==0
  1190. sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  1191. self.addCleanup(sock.close)
  1192. reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
  1193. self.assertFalse(reuse != 0, "initial mode is reuse")
  1194. def testSetSockOpt(self):
  1195. # Testing setsockopt()
  1196. sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  1197. self.addCleanup(sock.close)
  1198. sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  1199. reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
  1200. self.assertFalse(reuse == 0, "failed to set reuse mode")
  1201. def testSendAfterClose(self):
  1202. # testing send() after close() with timeout
  1203. with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
  1204. sock.settimeout(1)
  1205. self.assertRaises(OSError, sock.send, b"spam")
  1206. def testCloseException(self):
  1207. sock = socket.socket()
  1208. sock.bind((socket._LOCALHOST, 0))
  1209. socket.socket(fileno=sock.fileno()).close()
  1210. try:
  1211. sock.close()
  1212. except OSError as err:
  1213. # Winsock apparently raises ENOTSOCK
  1214. self.assertIn(err.errno, (errno.EBADF, errno.ENOTSOCK))
  1215. else:
  1216. self.fail("close() should raise EBADF/ENOTSOCK")
  1217. def testNewAttributes(self):
  1218. # testing .family, .type and .protocol
  1219. with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
  1220. self.assertEqual(sock.family, socket.AF_INET)
  1221. if hasattr(socket, 'SOCK_CLOEXEC'):
  1222. self.assertIn(sock.type,
  1223. (socket.SOCK_STREAM | socket.SOCK_CLOEXEC,
  1224. socket.SOCK_STREAM))
  1225. else:
  1226. self.assertEqual(sock.type, socket.SOCK_STREAM)
  1227. self.assertEqual(sock.proto, 0)
  1228. def test_getsockaddrarg(self):
  1229. sock = socket.socket()
  1230. self.addCleanup(sock.close)
  1231. port = socket_helper.find_unused_port()
  1232. big_port = port + 65536
  1233. neg_port = port - 65536
  1234. self.assertRaises(OverflowError, sock.bind, (HOST, big_port))
  1235. self.assertRaises(OverflowError, sock.bind, (HOST, neg_port))
  1236. # Since find_unused_port() is inherently subject to race conditions, we
  1237. # call it a couple times if necessary.
  1238. for i in itertools.count():
  1239. port = socket_helper.find_unused_port()
  1240. try:
  1241. sock.bind((HOST, port))
  1242. except OSError as e:
  1243. if e.errno != errno.EADDRINUSE or i == 5:
  1244. raise
  1245. else:
  1246. break
  1247. @unittest.skipUnless(os.name == "nt", "Windows specific")
  1248. def test_sock_ioctl(self):
  1249. self.assertTrue(hasattr(socket.socket, 'ioctl'))
  1250. self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
  1251. self.assertTrue(hasattr(socket, 'RCVALL_ON'))
  1252. self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
  1253. self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
  1254. s = socket.socket()
  1255. self.addCleanup(s.close)
  1256. self.assertRaises(ValueError, s.ioctl, -1, None)
  1257. s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
  1258. @unittest.skipUnless(os.name == "nt", "Windows specific")
  1259. @unittest.skipUnless(hasattr(socket, 'SIO_LOOPBACK_FAST_PATH'),
  1260. 'Loopback fast path support required for this test')
  1261. def test_sio_loopback_fast_path(self):
  1262. s = socket.socket()
  1263. self.addCleanup(s.close)
  1264. try:
  1265. s.ioctl(socket.SIO_LOOPBACK_FAST_PATH, True)
  1266. except OSError as exc:
  1267. WSAEOPNOTSUPP = 10045
  1268. if exc.winerror == WSAEOPNOTSUPP:
  1269. self.skipTest("SIO_LOOPBACK_FAST_PATH is defined but "
  1270. "doesn't implemented in this Windows version")
  1271. raise
  1272. self.assertRaises(TypeError, s.ioctl, socket.SIO_LOOPBACK_FAST_PATH, None)
  1273. def testGetaddrinfo(self):
  1274. try:
  1275. socket.getaddrinfo('localhost', 80)
  1276. except socket.gaierror as err:
  1277. if err.errno == socket.EAI_SERVICE:
  1278. # see http://bugs.python.org/issue1282647
  1279. self.skipTest("buggy libc version")
  1280. raise
  1281. # len of every sequence is supposed to be == 5
  1282. for info in socket.getaddrinfo(HOST, None):
  1283. self.assertEqual(len(info), 5)
  1284. # host can be a domain name, a string representation of an
  1285. # IPv4/v6 address or None
  1286. socket.getaddrinfo('localhost', 80)
  1287. socket.getaddrinfo('127.0.0.1', 80)
  1288. socket.getaddrinfo(None, 80)
  1289. if socket_helper.IPV6_ENABLED:
  1290. socket.getaddrinfo('::1', 80)
  1291. # port can be a string service name such as "http", a numeric
  1292. # port number or None
  1293. # Issue #26936: Android getaddrinfo() was broken before API level 23.
  1294. if (not hasattr(sys, 'getandroidapilevel') or
  1295. sys.getandroidapilevel() >= 23):
  1296. socket.getaddrinfo(HOST, "http")
  1297. socket.getaddrinfo(HOST, 80)
  1298. socket.getaddrinfo(HOST, None)
  1299. # test family and socktype filters
  1300. infos = socket.getaddrinfo(HOST, 80, socket.AF_INET, socket.SOCK_STREAM)
  1301. for family, type, _, _, _ in infos:
  1302. self.assertEqual(family, socket.AF_INET)
  1303. self.assertEqual(repr(family), '<AddressFamily.AF_INET: %r>' % family.value)
  1304. self.assertEqual(str(family), str(family.value))
  1305. self.assertEqual(type, socket.SOCK_STREAM)
  1306. self.assertEqual(repr(type), '<SocketKind.SOCK_STREAM: %r>' % type.value)
  1307. self.assertEqual(str(type), str(type.value))
  1308. infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
  1309. for _, socktype, _, _, _ in infos:
  1310. self.assertEqual(socktype, socket.SOCK_STREAM)
  1311. # test proto and flags arguments
  1312. socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
  1313. socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
  1314. # a server willing to support both IPv4 and IPv6 will
  1315. # usually do this
  1316. socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
  1317. socket.AI_PASSIVE)
  1318. # test keyword arguments
  1319. a = socket.getaddrinfo(HOST, None)
  1320. b = socket.getaddrinfo(host=HOST, port=None)
  1321. self.assertEqual(a, b)
  1322. a = socket.getaddrinfo(HOST, None, socket.AF_INET)
  1323. b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
  1324. self.assertEqual(a, b)
  1325. a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
  1326. b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
  1327. self.assertEqual(a, b)
  1328. a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
  1329. b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
  1330. self.assertEqual(a, b)
  1331. a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
  1332. b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
  1333. self.assertEqual(a, b)
  1334. a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
  1335. socket.AI_PASSIVE)
  1336. b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
  1337. type=socket.SOCK_STREAM, proto=0,
  1338. flags=socket.AI_PASSIVE)
  1339. self.assertEqual(a, b)
  1340. # Issue #6697.
  1341. self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
  1342. # Issue 17269: test workaround for OS X platform bug segfault
  1343. if hasattr(socket, 'AI_NUMERICSERV'):
  1344. try:
  1345. # The arguments here are undefined and the call may succeed
  1346. # or fail. All we care here is that it doesn't segfault.
  1347. socket.getaddrinfo("localhost", None, 0, 0, 0,
  1348. socket.AI_NUMERICSERV)
  1349. except socket.gaierror:
  1350. pass
  1351. def test_getnameinfo(self):
  1352. # only IP addresses are allowed
  1353. self.assertRaises(OSError, socket.getnameinfo, ('mail.python.org',0), 0)
  1354. @unittest.skipUnless(support.is_resource_enabled('network'),
  1355. 'network is not enabled')
  1356. def test_idna(self):
  1357. # Check for internet access before running test
  1358. # (issue #12804, issue #25138).
  1359. with socket_helper.transient_internet('python.org'):
  1360. socket.gethostbyname('python.org')
  1361. # these should all be successful
  1362. domain = 'испытание.pythontest.net'
  1363. socket.gethostbyname(domain)
  1364. socket.gethostbyname_ex(domain)
  1365. socket.getaddrinfo(domain,0,socket.AF_UNSPEC,socket.SOCK_STREAM)
  1366. # this may not work if the forward lookup chooses the IPv6 address, as that doesn't
  1367. # have a reverse entry yet
  1368. # socket.gethostbyaddr('испытание.python.org')
  1369. def check_sendall_interrupted(self, with_timeout):
  1370. # socketpair() is not strictly required, but it makes things easier.
  1371. if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
  1372. self.skipTest("signal.alarm and socket.socketpair required for this test")
  1373. # Our signal handlers clobber the C errno by calling a math function
  1374. # with an invalid domain value.
  1375. def ok_handler(*args):
  1376. self.assertRaises(ValueError, math.acosh, 0)
  1377. def raising_handler(*args):
  1378. self.assertRaises(ValueError, math.acosh, 0)
  1379. 1 // 0
  1380. c, s = socket.socketpair()
  1381. old_alarm = signal.signal(signal.SIGALRM, raising_handler)
  1382. try:
  1383. if with_timeout:
  1384. # Just above the one second minimum for signal.alarm
  1385. c.settimeout(1.5)
  1386. with self.assertRaises(ZeroDivisionError):
  1387. signal.alarm(1)
  1388. c.sendall(b"x" * support.SOCK_MAX_SIZE)
  1389. if with_timeout:
  1390. signal.signal(signal.SIGALRM, ok_handler)
  1391. signal.alarm(1)
  1392. self.assertRaises(TimeoutError, c.sendall,
  1393. b"x" * support.SOCK_MAX_SIZE)
  1394. finally:
  1395. signal.alarm(0)
  1396. signal.signal(signal.SIGALRM, old_alarm)
  1397. c.close()
  1398. s.close()
  1399. def test_sendall_interrupted(self):
  1400. self.check_sendall_interrupted(False)
  1401. def test_sendall_interrupted_with_timeout(self):
  1402. self.check_sendall_interrupted(True)
  1403. def test_dealloc_warn(self):
  1404. sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  1405. r = repr(sock)
  1406. with self.assertWarns(ResourceWarning) as cm:
  1407. sock = None
  1408. support.gc_collect()
  1409. self.assertIn(r, str(cm.warning.args[0]))
  1410. # An open socket file object gets dereferenced after the socket
  1411. sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  1412. f = sock.makefile('rb')
  1413. r = repr(sock)
  1414. sock = None
  1415. support.gc_collect()
  1416. with self.assertWarns(ResourceWarning):
  1417. f = None
  1418. support.gc_collect()
  1419. def test_name_closed_socketio(self):
  1420. with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
  1421. fp = sock.makefile("rb")
  1422. fp.close()
  1423. self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
  1424. def test_unusable_closed_socketio(self):
  1425. with socket.socket() as sock:
  1426. fp = sock.makefile("rb", buffering=0)
  1427. self.assertTrue(fp.readable())
  1428. self.assertFalse(fp.writable())
  1429. self.assertFalse(fp.seekable())
  1430. fp.close()
  1431. self.assertRaises(ValueError, fp.readable)
  1432. self.assertRaises(ValueError, fp.writable)
  1433. self.assertRaises(ValueError, fp.seekable)
  1434. def test_socket_close(self):
  1435. sock = socket.socket()
  1436. try:
  1437. sock.bind((HOST, 0))
  1438. socket.close(sock.fileno())
  1439. with self.assertRaises(OSError):
  1440. sock.listen(1)
  1441. finally:
  1442. with self.assertRaises(OSError):
  1443. # sock.close() fails with EBADF
  1444. sock.close()
  1445. with self.assertRaises(TypeError):
  1446. socket.close(None)
  1447. with self.assertRaises(OSError):
  1448. socket.close(-1)
  1449. def test_makefile_mode(self):
  1450. for mode in 'r', 'rb', 'rw', 'w', 'wb':
  1451. with self.subTest(mode=mode):
  1452. with socket.socket() as sock:
  1453. encoding = None if "b" in mode else "utf-8"
  1454. with sock.makefile(mode, encoding=encoding) as fp:
  1455. self.assertEqual(fp.mode, mode)
  1456. def test_makefile_invalid_mode(self):
  1457. for mode in 'rt', 'x', '+', 'a':
  1458. with self.subTest(mode=mode):
  1459. with socket.socket() as sock:
  1460. with self.assertRaisesRegex(ValueError, 'invalid mode'):
  1461. sock.makefile(mode)
  1462. def test_pickle(self):
  1463. sock = socket.socket()
  1464. with sock:
  1465. for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
  1466. self.assertRaises(TypeError, pickle.dumps, sock, protocol)
  1467. for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
  1468. family = pickle.loads(pickle.dumps(socket.AF_INET, protocol))
  1469. self.assertEqual(family, socket.AF_INET)
  1470. type = pickle.loads(pickle.dumps(socket.SOCK_STREAM, protocol))
  1471. self.assertEqual(type, socket.SOCK_STREAM)
  1472. def test_listen_backlog(self):
  1473. for backlog in 0, -1:
  1474. with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
  1475. srv.bind((HOST, 0))
  1476. srv.listen(backlog)
  1477. with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
  1478. srv.bind((HOST, 0))
  1479. srv.listen()
  1480. @support.cpython_only
  1481. def test_listen_backlog_overflow(self):
  1482. # Issue 15989
  1483. import _testcapi
  1484. with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
  1485. srv.bind((HOST, 0))
  1486. self.assertRaises(OverflowError, srv.listen, _testcapi.INT_MAX + 1)
  1487. @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
  1488. def test_flowinfo(self):
  1489. self.assertRaises(OverflowError, socket.getnameinfo,
  1490. (socket_helper.HOSTv6, 0, 0xffffffff), 0)
  1491. with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as s:
  1492. self.assertRaises(OverflowError, s.bind, (socket_helper.HOSTv6, 0, -10))
  1493. @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
  1494. def test_getaddrinfo_ipv6_basic(self):
  1495. ((*_, sockaddr),) = socket.getaddrinfo(
  1496. 'ff02::1de:c0:face:8D', # Note capital letter `D`.
  1497. 1234, socket.AF_INET6,
  1498. socket.SOCK_DGRAM,
  1499. socket.IPPROTO_UDP
  1500. )
  1501. self.assertEqual(sockaddr, ('ff02::1de:c0:face:8d', 1234, 0, 0))
  1502. def test_getfqdn_filter_localhost(self):
  1503. self.assertEqual(socket.getfqdn(), socket.getfqdn("0.0.0.0"))
  1504. self.assertEqual(socket.getfqdn(), socket.getfqdn("::"))
  1505. @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
  1506. @unittest.skipIf(sys.platform == 'win32', 'does not work on Windows')
  1507. @unittest.skipIf(AIX, 'Symbolic scope id does not work')
  1508. @unittest.skipUnless(hasattr(socket, 'if_nameindex'), "test needs socket.if_nameindex()")
  1509. def test_getaddrinfo_ipv6_scopeid_symbolic(self):
  1510. # Just pick up any network interface (Linux, Mac OS X)
  1511. (ifindex, test_interface) = socket.if_nameindex()[0]
  1512. ((*_, sockaddr),) = socket.getaddrinfo(
  1513. 'ff02::1de:c0:face:8D%' + test_interface,
  1514. 1234, socket.AF_INET6,
  1515. socket.SOCK_DGRAM,
  1516. socket.IPPROTO_UDP
  1517. )
  1518. # Note missing interface name part in IPv6 address
  1519. self.assertEqual(sockaddr, ('ff02::1de:c0:face:8d', 1234, 0, ifindex))
  1520. @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
  1521. @unittest.skipUnless(
  1522. sys.platform == 'win32',
  1523. 'Numeric scope id does not work or undocumented')
  1524. def test_getaddrinfo_ipv6_scopeid_numeric(self):
  1525. # Also works on Linux and Mac OS X, but is not documented (?)
  1526. # Windows, Linux and Max OS X allow nonexistent interface numbers here.
  1527. ifindex = 42
  1528. ((*_, sockaddr),) = socket.getaddrinfo(
  1529. 'ff02::1de:c0:face:8D%' + str(ifindex),
  1530. 1234, socket.AF_INET6,
  1531. socket.SOCK_DGRAM,
  1532. socket.IPPROTO_UDP
  1533. )
  1534. # Note missing interface name part in IPv6 address
  1535. self.assertEqual(sockaddr, ('ff02::1de:c0:face:8d', 1234, 0, ifindex))
  1536. @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
  1537. @unittest.skipIf(sys.platform == 'win32', 'does not work on Windows')
  1538. @unittest.skipIf(AIX, 'Symbolic scope id does not work')
  1539. @unittest.skipUnless(hasattr(socket, 'if_nameindex'), "test needs socket.if_nameindex()")
  1540. def test_getnameinfo_ipv6_scopeid_symbolic(self):
  1541. # Just pick up any network interface.
  1542. (ifindex, test_interface) = socket.if_nameindex()[0]
  1543. sockaddr = ('ff02::1de:c0:face:8D', 1234, 0, ifindex) # Note capital letter `D`.
  1544. nameinfo = socket.getnameinfo(sockaddr, socket.NI_NUMERICHOST | socket.NI_NUMERICSERV)
  1545. self.assertEqual(nameinfo, ('ff02::1de:c0:face:8d%' + test_interface, '1234'))
  1546. @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
  1547. @unittest.skipUnless( sys.platform == 'win32',
  1548. 'Numeric scope id does not work or undocumented')
  1549. def test_getnameinfo_ipv6_scopeid_numeric(self):
  1550. # Also works on Linux (undocumented), but does not work on Mac OS X
  1551. # Windows and Linux allow nonexistent interface numbers here.
  1552. ifindex = 42
  1553. sockaddr = ('ff02::1de:c0:face:8D', 1234, 0, ifindex) # Note capital letter `D`.
  1554. nameinfo = socket.getnameinfo(sockaddr, socket.NI_NUMERICHOST | socket.NI_NUMERICSERV)
  1555. self.assertEqual(nameinfo, ('ff02::1de:c0:face:8d%' + str(ifindex), '1234'))
  1556. def test_str_for_enums(self):
  1557. # Make sure that the AF_* and SOCK_* constants have enum-like string
  1558. # reprs.
  1559. with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
  1560. self.assertEqual(repr(s.family), '<AddressFamily.AF_INET: %r>' % s.family.value)
  1561. self.assertEqual(repr(s.type), '<SocketKind.SOCK_STREAM: %r>' % s.type.value)
  1562. self.assertEqual(str(s.family), str(s.family.value))
  1563. self.assertEqual(str(s.type), str(s.type.value))
  1564. def test_socket_consistent_sock_type(self):
  1565. SOCK_NONBLOCK = getattr(socket, 'SOCK_NONBLOCK', 0)
  1566. SOCK_CLOEXEC = getattr(socket, 'SOCK_CLOEXEC', 0)
  1567. sock_type = socket.SOCK_STREAM | SOCK_NONBLOCK | SOCK_CLOEXEC
  1568. with socket.socket(socket.AF_INET, sock_type) as s:
  1569. self.assertEqual(s.type, socket.SOCK_STREAM)
  1570. s.settimeout(1)
  1571. self.assertEqual(s.type, socket.SOCK_STREAM)
  1572. s.settimeout(0)
  1573. self.assertEqual(s.type, socket.SOCK_STREAM)
  1574. s.setblocking(True)
  1575. self.assertEqual(s.type, socket.SOCK_STREAM)
  1576. s.setblocking(False)
  1577. self.assertEqual(s.type, socket.SOCK_STREAM)
  1578. def test_unknown_socket_family_repr(self):
  1579. # Test that when created with a family that's not one of the known
  1580. # AF_*/SOCK_* constants, socket.family just returns the number.
  1581. #
  1582. # To do this we fool socket.socket into believing it already has an
  1583. # open fd because on this path it doesn't actually verify the family and
  1584. # type and populates the socket object.
  1585. sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  1586. fd = sock.detach()
  1587. unknown_family = max(socket.AddressFamily.__members__.values()) + 1
  1588. unknown_type = max(
  1589. kind
  1590. for name, kind in socket.SocketKind.__members__.items()
  1591. if name not in {'SOCK_NONBLOCK', 'SOCK_CLOEXEC'}
  1592. ) + 1
  1593. with socket.socket(
  1594. family=unknown_family, type=unknown_type, proto=23,
  1595. fileno=fd) as s:
  1596. self.assertEqual(s.family, unknown_family)
  1597. self.assertEqual(s.type, unknown_type)
  1598. # some OS like macOS ignore proto
  1599. self.assertIn(s.proto, {0, 23})
  1600. @unittest.skipUnless(hasattr(os, 'sendfile'), 'test needs os.sendfile()')
  1601. def test__sendfile_use_sendfile(self):
  1602. class File:
  1603. def __init__(self, fd):
  1604. self.fd = fd
  1605. def fileno(self):
  1606. return self.fd
  1607. with socket.socket() as sock:
  1608. fd = os.open(os.curdir, os.O_RDONLY)
  1609. os.close(fd)
  1610. with self.assertRaises(socket._GiveupOnSendfile):
  1611. sock._sendfile_use_sendfile(File(fd))
  1612. with self.assertRaises(OverflowError):
  1613. sock._sendfile_use_sendfile(File(2**1000))
  1614. with self.assertRaises(TypeError):
  1615. sock._sendfile_use_sendfile(File(None))
  1616. def _test_socket_fileno(self, s, family, stype):
  1617. self.assertEqual(s.family, family)
  1618. self.assertEqual(s.type, stype)
  1619. fd = s.fileno()
  1620. s2 = socket.socket(fileno=fd)
  1621. self.addCleanup(s2.close)
  1622. # detach old fd to avoid double close
  1623. s.detach()
  1624. self.assertEqual(s2.family, family)
  1625. self.assertEqual(s2.type, stype)
  1626. self.assertEqual(s2.fileno(), fd)
  1627. def test_socket_fileno(self):
  1628. s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  1629. self.addCleanup(s.close)
  1630. s.bind((socket_helper.HOST, 0))
  1631. self._test_socket_fileno(s, socket.AF_INET, socket.SOCK_STREAM)
  1632. if hasattr(socket, "SOCK_DGRAM"):
  1633. s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  1634. self.addCleanup(s.close)
  1635. s.bind((socket_helper.HOST, 0))
  1636. self._test_socket_fileno(s, socket.AF_INET, socket.SOCK_DGRAM)
  1637. if socket_helper.IPV6_ENABLED:
  1638. s = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
  1639. self.addCleanup(s.close)
  1640. s.bind((socket_helper.HOSTv6, 0, 0, 0))
  1641. self._test_socket_fileno(s, socket.AF_INET6, socket.SOCK_STREAM)
  1642. if hasattr(socket, "AF_UNIX"):
  1643. tmpdir = tempfile.mkdtemp()
  1644. self.addCleanup(shutil.rmtree, tmpdir)
  1645. s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
  1646. self.addCleanup(s.close)
  1647. try:
  1648. s.bind(os.path.join(tmpdir, 'socket'))
  1649. except PermissionError:
  1650. pass
  1651. else:
  1652. self._test_socket_fileno(s, socket.AF_UNIX,
  1653. socket.SOCK_STREAM)
  1654. def test_socket_fileno_rejects_float(self):
  1655. with self.assertRaises(TypeError):
  1656. socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=42.5)
  1657. def test_socket_fileno_rejects_other_types(self):
  1658. with self.assertRaises(TypeError):
  1659. socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno="foo")
  1660. def test_socket_fileno_rejects_invalid_socket(self):
  1661. with self.assertRaisesRegex(ValueError, "negative file descriptor"):
  1662. socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=-1)
  1663. @unittest.skipIf(os.name == "nt", "Windows disallows -1 only")
  1664. def test_socket_fileno_rejects_negative(self):
  1665. with self.assertRaisesRegex(ValueError, "negative file descriptor"):
  1666. socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=-42)
  1667. def test_socket_fileno_requires_valid_fd(self):
  1668. WSAENOTSOCK = 10038
  1669. with self.assertRaises(OSError) as cm:
  1670. socket.socket(fileno=os_helper.make_bad_fd())
  1671. self.assertIn(cm.exception.errno, (errno.EBADF, WSAENOTSOCK))
  1672. with self.assertRaises(OSError) as cm:
  1673. socket.socket(
  1674. socket.AF_INET,
  1675. socket.SOCK_STREAM,
  1676. fileno=os_helper.make_bad_fd())
  1677. self.assertIn(cm.exception.errno, (errno.EBADF, WSAENOTSOCK))
  1678. def test_socket_fileno_requires_socket_fd(self):
  1679. with tempfile.NamedTemporaryFile() as afile:
  1680. with self.assertRaises(OSError):
  1681. socket.socket(fileno=afile.fileno())
  1682. with self.assertRaises(OSError) as cm:
  1683. socket.socket(
  1684. socket.AF_INET,
  1685. socket.SOCK_STREAM,
  1686. fileno=afile.fileno())
  1687. self.assertEqual(cm.exception.errno, errno.ENOTSOCK)
  1688. def test_addressfamily_enum(self):
  1689. import _socket, enum
  1690. CheckedAddressFamily = enum._old_convert_(
  1691. enum.IntEnum, 'AddressFamily', 'socket',
  1692. lambda C: C.isupper() and C.startswith('AF_'),
  1693. source=_socket,
  1694. )
  1695. enum._test_simple_enum(CheckedAddressFamily, socket.AddressFamily)
  1696. def test_socketkind_enum(self):
  1697. import _socket, enum
  1698. CheckedSocketKind = enum._old_convert_(
  1699. enum.IntEnum, 'SocketKind', 'socket',
  1700. lambda C: C.isupper() and C.startswith('SOCK_'),
  1701. source=_socket,
  1702. )
  1703. enum._test_simple_enum(CheckedSocketKind, socket.SocketKind)
  1704. def test_msgflag_enum(self):
  1705. import _socket, enum
  1706. CheckedMsgFlag = enum._old_convert_(
  1707. enum.IntFlag, 'MsgFlag', 'socket',
  1708. lambda C: C.isupper() and C.startswith('MSG_'),
  1709. source=_socket,
  1710. )
  1711. enum._test_simple_enum(CheckedMsgFlag, socket.MsgFlag)
  1712. def test_addressinfo_enum(self):
  1713. import _socket, enum
  1714. CheckedAddressInfo = enum._old_convert_(
  1715. enum.IntFlag, 'AddressInfo', 'socket',
  1716. lambda C: C.isupper() and C.startswith('AI_'),
  1717. source=_socket)
  1718. enum._test_simple_enum(CheckedAddressInfo, socket.AddressInfo)
  1719. @unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
  1720. class BasicCANTest(unittest.TestCase):
  1721. def testCrucialConstants(self):
  1722. socket.AF_CAN
  1723. socket.PF_CAN
  1724. socket.CAN_RAW
  1725. @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
  1726. 'socket.CAN_BCM required for this test.')
  1727. def testBCMConstants(self):
  1728. socket.CAN_BCM
  1729. # opcodes
  1730. socket.CAN_BCM_TX_SETUP # create (cyclic) transmission task
  1731. socket.CAN_BCM_TX_DELETE # remove (cyclic) transmission task
  1732. socket.CAN_BCM_TX_READ # read properties of (cyclic) transmission task
  1733. socket.CAN_BCM_TX_SEND # send one CAN frame
  1734. socket.CAN_BCM_RX_SETUP # create RX content filter subscription
  1735. socket.CAN_BCM_RX_DELETE # remove RX content filter subscription
  1736. socket.CAN_BCM_RX_READ # read properties of RX content filter subscription
  1737. socket.CAN_BCM_TX_STATUS # reply to TX_READ request
  1738. socket.CAN_BCM_TX_EXPIRED # notification on performed transmissions (count=0)
  1739. socket.CAN_BCM_RX_STATUS # reply to RX_READ request
  1740. socket.CAN_BCM_RX_TIMEOUT # cyclic message is absent
  1741. socket.CAN_BCM_RX_CHANGED # updated CAN frame (detected content change)
  1742. # flags
  1743. socket.CAN_BCM_SETTIMER
  1744. socket.CAN_BCM_STARTTIMER
  1745. socket.CAN_BCM_TX_COUNTEVT
  1746. socket.CAN_BCM_TX_ANNOUNCE
  1747. socket.CAN_BCM_TX_CP_CAN_ID
  1748. socket.CAN_BCM_RX_FILTER_ID
  1749. socket.CAN_BCM_RX_CHECK_DLC
  1750. socket.CAN_BCM_RX_NO_AUTOTIMER
  1751. socket.CAN_BCM_RX_ANNOUNCE_RESUME
  1752. socket.CAN_BCM_TX_RESET_MULTI_IDX
  1753. socket.CAN_BCM_RX_RTR_FRAME
  1754. def testCreateSocket(self):
  1755. with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
  1756. pass
  1757. @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
  1758. 'socket.CAN_BCM required for this test.')
  1759. def testCreateBCMSocket(self):
  1760. with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM) as s:
  1761. pass
  1762. def testBindAny(self):
  1763. with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
  1764. address = ('', )
  1765. s.bind(address)
  1766. self.assertEqual(s.getsockname(), address)
  1767. def testTooLongInterfaceName(self):
  1768. # most systems limit IFNAMSIZ to 16, take 1024 to be sure
  1769. with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
  1770. self.assertRaisesRegex(OSError, 'interface name too long',
  1771. s.bind, ('x' * 1024,))
  1772. @unittest.skipUnless(hasattr(socket, "CAN_RAW_LOOPBACK"),
  1773. 'socket.CAN_RAW_LOOPBACK required for this test.')
  1774. def testLoopback(self):
  1775. with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
  1776. for loopback in (0, 1):
  1777. s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK,
  1778. loopback)
  1779. self.assertEqual(loopback,
  1780. s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK))
  1781. @unittest.skipUnless(hasattr(socket, "CAN_RAW_FILTER"),
  1782. 'socket.CAN_RAW_FILTER required for this test.')
  1783. def testFilter(self):
  1784. can_id, can_mask = 0x200, 0x700
  1785. can_filter = struct.pack("=II", can_id, can_mask)
  1786. with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
  1787. s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, can_filter)
  1788. self.assertEqual(can_filter,
  1789. s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, 8))
  1790. s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, bytearray(can_filter))
  1791. @unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
  1792. class CANTest(ThreadedCANSocketTest):
  1793. def __init__(self, methodName='runTest'):
  1794. ThreadedCANSocketTest.__init__(self, methodName=methodName)
  1795. @classmethod
  1796. def build_can_frame(cls, can_id, data):
  1797. """Build a CAN frame."""
  1798. can_dlc = len(data)
  1799. data = data.ljust(8, b'\x00')
  1800. return struct.pack(cls.can_frame_fmt, can_id, can_dlc, data)
  1801. @classmethod
  1802. def dissect_can_frame(cls, frame):
  1803. """Dissect a CAN frame."""
  1804. can_id, can_dlc, data = struct.unpack(cls.can_frame_fmt, frame)
  1805. return (can_id, can_dlc, data[:can_dlc])
  1806. def testSendFrame(self):
  1807. cf, addr = self.s.recvfrom(self.bufsize)
  1808. self.assertEqual(self.cf, cf)
  1809. self.assertEqual(addr[0], self.interface)
  1810. def _testSendFrame(self):
  1811. self.cf = self.build_can_frame(0x00, b'\x01\x02\x03\x04\x05')
  1812. self.cli.send(self.cf)
  1813. def testSendMaxFrame(self):
  1814. cf, addr = self.s.recvfrom(self.bufsize)
  1815. self.assertEqual(self.cf, cf)
  1816. def _testSendMaxFrame(self):
  1817. self.cf = self.build_can_frame(0x00, b'\x07' * 8)
  1818. self.cli.send(self.cf)
  1819. def testSendMultiFrames(self):
  1820. cf, addr = self.s.recvfrom(self.bufsize)
  1821. self.assertEqual(self.cf1, cf)
  1822. cf, addr = self.s.recvfrom(self.bufsize)
  1823. self.assertEqual(self.cf2, cf)
  1824. def _testSendMultiFrames(self):
  1825. self.cf1 = self.build_can_frame(0x07, b'\x44\x33\x22\x11')
  1826. self.cli.send(self.cf1)
  1827. self.cf2 = self.build_can_frame(0x12, b'\x99\x22\x33')
  1828. self.cli.send(self.cf2)
  1829. @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
  1830. 'socket.CAN_BCM required for this test.')
  1831. def _testBCM(self):
  1832. cf, addr = self.cli.recvfrom(self.bufsize)
  1833. self.assertEqual(self.cf, cf)
  1834. can_id, can_dlc, data = self.dissect_can_frame(cf)
  1835. self.assertEqual(self.can_id, can_id)
  1836. self.assertEqual(self.data, data)
  1837. @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
  1838. 'socket.CAN_BCM required for this test.')
  1839. def testBCM(self):
  1840. bcm = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)
  1841. self.addCleanup(bcm.close)
  1842. bcm.connect((self.interface,))
  1843. self.can_id = 0x123
  1844. self.data = bytes([0xc0, 0xff, 0xee])
  1845. self.cf = self.build_can_frame(self.can_id, self.data)
  1846. opcode = socket.CAN_BCM_TX_SEND
  1847. flags = 0
  1848. count = 0
  1849. ival1_seconds = ival1_usec = ival2_seconds = ival2_usec = 0
  1850. bcm_can_id = 0x0222
  1851. nframes = 1
  1852. assert len(self.cf) == 16
  1853. header = struct.pack(self.bcm_cmd_msg_fmt,
  1854. opcode,
  1855. flags,
  1856. count,
  1857. ival1_seconds,
  1858. ival1_usec,
  1859. ival2_seconds,
  1860. ival2_usec,
  1861. bcm_can_id,
  1862. nframes,
  1863. )
  1864. header_plus_frame = header + self.cf
  1865. bytes_sent = bcm.send(header_plus_frame)
  1866. self.assertEqual(bytes_sent, len(header_plus_frame))
  1867. @unittest.skipUnless(HAVE_SOCKET_CAN_ISOTP, 'CAN ISOTP required for this test.')
  1868. class ISOTPTest(unittest.TestCase):
  1869. def __init__(self, *args, **kwargs):
  1870. super().__init__(*args, **kwargs)
  1871. self.interface = "vcan0"
  1872. def testCrucialConstants(self):
  1873. socket.AF_CAN
  1874. socket.PF_CAN
  1875. socket.CAN_ISOTP
  1876. socket.SOCK_DGRAM
  1877. def testCreateSocket(self):
  1878. with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
  1879. pass
  1880. @unittest.skipUnless(hasattr(socket, "CAN_ISOTP"),
  1881. 'socket.CAN_ISOTP required for this test.')
  1882. def testCreateISOTPSocket(self):
  1883. with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
  1884. pass
  1885. def testTooLongInterfaceName(self):
  1886. # most systems limit IFNAMSIZ to 16, take 1024 to be sure
  1887. with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
  1888. with self.assertRaisesRegex(OSError, 'interface name too long'):
  1889. s.bind(('x' * 1024, 1, 2))
  1890. def testBind(self):
  1891. try:
  1892. with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
  1893. addr = self.interface, 0x123, 0x456
  1894. s.bind(addr)
  1895. self.assertEqual(s.getsockname(), addr)
  1896. except OSError as e:
  1897. if e.errno == errno.ENODEV:
  1898. self.skipTest('network interface `%s` does not exist' %
  1899. self.interface)
  1900. else:
  1901. raise
  1902. @unittest.skipUnless(HAVE_SOCKET_CAN_J1939, 'CAN J1939 required for this test.')
  1903. class J1939Test(unittest.TestCase):
  1904. def __init__(self, *args, **kwargs):
  1905. super().__init__(*args, **kwargs)
  1906. self.interface = "vcan0"
  1907. @unittest.skipUnless(hasattr(socket, "CAN_J1939"),
  1908. 'socket.CAN_J1939 required for this test.')
  1909. def testJ1939Constants(self):
  1910. socket.CAN_J1939
  1911. socket.J1939_MAX_UNICAST_ADDR
  1912. socket.J1939_IDLE_ADDR
  1913. socket.J1939_NO_ADDR
  1914. socket.J1939_NO_NAME
  1915. socket.J1939_PGN_REQUEST
  1916. socket.J1939_PGN_ADDRESS_CLAIMED
  1917. socket.J1939_PGN_ADDRESS_COMMANDED
  1918. socket.J1939_PGN_PDU1_MAX
  1919. socket.J1939_PGN_MAX
  1920. socket.J1939_NO_PGN
  1921. # J1939 socket options
  1922. socket.SO_J1939_FILTER
  1923. socket.SO_J1939_PROMISC
  1924. socket.SO_J1939_SEND_PRIO
  1925. socket.SO_J1939_ERRQUEUE
  1926. socket.SCM_J1939_DEST_ADDR
  1927. socket.SCM_J1939_DEST_NAME
  1928. socket.SCM_J1939_PRIO
  1929. socket.SCM_J1939_ERRQUEUE
  1930. socket.J1939_NLA_PAD
  1931. socket.J1939_NLA_BYTES_ACKED
  1932. socket.J1939_EE_INFO_NONE
  1933. socket.J1939_EE_INFO_TX_ABORT
  1934. socket.J1939_FILTER_MAX
  1935. @unittest.skipUnless(hasattr(socket, "CAN_J1939"),
  1936. 'socket.CAN_J1939 required for this test.')
  1937. def testCreateJ1939Socket(self):
  1938. with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_J1939) as s:
  1939. pass
  1940. def testBind(self):
  1941. try:
  1942. with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_J1939) as s:
  1943. addr = self.interface, socket.J1939_NO_NAME, socket.J1939_NO_PGN, socket.J1939_NO_ADDR
  1944. s.bind(addr)
  1945. self.assertEqual(s.getsockname(), addr)
  1946. except OSError as e:
  1947. if e.errno == errno.ENODEV:
  1948. self.skipTest('network interface `%s` does not exist' %
  1949. self.interface)
  1950. else:
  1951. raise
  1952. @unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
  1953. class BasicRDSTest(unittest.TestCase):
  1954. def testCrucialConstants(self):
  1955. socket.AF_RDS
  1956. socket.PF_RDS
  1957. def testCreateSocket(self):
  1958. with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
  1959. pass
  1960. def testSocketBufferSize(self):
  1961. bufsize = 16384
  1962. with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
  1963. s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufsize)
  1964. s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, bufsize)
  1965. @unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
  1966. class RDSTest(ThreadedRDSSocketTest):
  1967. def __init__(self, methodName='runTest'):
  1968. ThreadedRDSSocketTest.__init__(self, methodName=methodName)
  1969. def setUp(self):
  1970. super().setUp()
  1971. self.evt = threading.Event()
  1972. def testSendAndRecv(self):
  1973. data, addr = self.serv.recvfrom(self.bufsize)
  1974. self.assertEqual(self.data, data)
  1975. self.assertEqual(self.cli_addr, addr)
  1976. def _testSendAndRecv(self):
  1977. self.data = b'spam'
  1978. self.cli.sendto(self.data, 0, (HOST, self.port))
  1979. def testPeek(self):
  1980. data, addr = self.serv.recvfrom(self.bufsize, socket.MSG_PEEK)
  1981. self.assertEqual(self.data, data)
  1982. data, addr = self.serv.recvfrom(self.bufsize)
  1983. self.assertEqual(self.data, data)
  1984. def _testPeek(self):
  1985. self.data = b'spam'
  1986. self.cli.sendto(self.data, 0, (HOST, self.port))
  1987. @requireAttrs(socket.socket, 'recvmsg')
  1988. def testSendAndRecvMsg(self):
  1989. data, ancdata, msg_flags, addr = self.serv.recvmsg(self.bufsize)
  1990. self.assertEqual(self.data, data)
  1991. @requireAttrs(socket.socket, 'sendmsg')
  1992. def _testSendAndRecvMsg(self):
  1993. self.data = b'hello ' * 10
  1994. self.cli.sendmsg([self.data], (), 0, (HOST, self.port))
  1995. def testSendAndRecvMulti(self):
  1996. data, addr = self.serv.recvfrom(self.bufsize)
  1997. self.assertEqual(self.data1, data)
  1998. data, addr = self.serv.recvfrom(self.bufsize)
  1999. self.assertEqual(self.data2, data)
  2000. def _testSendAndRecvMulti(self):
  2001. self.data1 = b'bacon'
  2002. self.cli.sendto(self.data1, 0, (HOST, self.port))
  2003. self.data2 = b'egg'
  2004. self.cli.sendto(self.data2, 0, (HOST, self.port))
  2005. def testSelect(self):
  2006. r, w, x = select.select([self.serv], [], [], 3.0)
  2007. self.assertIn(self.serv, r)
  2008. data, addr = self.serv.recvfrom(self.bufsize)
  2009. self.assertEqual(self.data, data)
  2010. def _testSelect(self):
  2011. self.data = b'select'
  2012. self.cli.sendto(self.data, 0, (HOST, self.port))
  2013. @unittest.skipUnless(HAVE_SOCKET_QIPCRTR,
  2014. 'QIPCRTR sockets required for this test.')
  2015. class BasicQIPCRTRTest(unittest.TestCase):
  2016. def testCrucialConstants(self):
  2017. socket.AF_QIPCRTR
  2018. def testCreateSocket(self):
  2019. with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
  2020. pass
  2021. def testUnbound(self):
  2022. with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
  2023. self.assertEqual(s.getsockname()[1], 0)
  2024. def testBindSock(self):
  2025. with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
  2026. socket_helper.bind_port(s, host=s.getsockname()[0])
  2027. self.assertNotEqual(s.getsockname()[1], 0)
  2028. def testInvalidBindSock(self):
  2029. with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
  2030. self.assertRaises(OSError, socket_helper.bind_port, s, host=-2)
  2031. def testAutoBindSock(self):
  2032. with socket.socket(socket.AF_QIPCRTR, socket.SOCK_DGRAM) as s:
  2033. s.connect((123, 123))
  2034. self.assertNotEqual(s.getsockname()[1], 0)
  2035. @unittest.skipIf(fcntl is None, "need fcntl")
  2036. @unittest.skipUnless(HAVE_SOCKET_VSOCK,
  2037. 'VSOCK sockets required for this test.')
  2038. class BasicVSOCKTest(unittest.TestCase):
  2039. def testCrucialConstants(self):
  2040. socket.AF_VSOCK
  2041. def testVSOCKConstants(self):
  2042. socket.SO_VM_SOCKETS_BUFFER_SIZE
  2043. socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE
  2044. socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE
  2045. socket.VMADDR_CID_ANY
  2046. socket.VMADDR_PORT_ANY
  2047. socket.VMADDR_CID_HOST
  2048. socket.VM_SOCKETS_INVALID_VERSION
  2049. socket.IOCTL_VM_SOCKETS_GET_LOCAL_CID
  2050. def testCreateSocket(self):
  2051. with socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM) as s:
  2052. pass
  2053. def testSocketBufferSize(self):
  2054. with socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM) as s:
  2055. orig_max = s.getsockopt(socket.AF_VSOCK,
  2056. socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE)
  2057. orig = s.getsockopt(socket.AF_VSOCK,
  2058. socket.SO_VM_SOCKETS_BUFFER_SIZE)
  2059. orig_min = s.getsockopt(socket.AF_VSOCK,
  2060. socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE)
  2061. s.setsockopt(socket.AF_VSOCK,
  2062. socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE, orig_max * 2)
  2063. s.setsockopt(socket.AF_VSOCK,
  2064. socket.SO_VM_SOCKETS_BUFFER_SIZE, orig * 2)
  2065. s.setsockopt(socket.AF_VSOCK,
  2066. socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE, orig_min * 2)
  2067. self.assertEqual(orig_max * 2,
  2068. s.getsockopt(socket.AF_VSOCK,
  2069. socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE))
  2070. self.assertEqual(orig * 2,
  2071. s.getsockopt(socket.AF_VSOCK,
  2072. socket.SO_VM_SOCKETS_BUFFER_SIZE))
  2073. self.assertEqual(orig_min * 2,
  2074. s.getsockopt(socket.AF_VSOCK,
  2075. socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE))
  2076. @unittest.skipUnless(HAVE_SOCKET_BLUETOOTH,
  2077. 'Bluetooth sockets required for this test.')
  2078. class BasicBluetoothTest(unittest.TestCase):
  2079. def testBluetoothConstants(self):
  2080. socket.BDADDR_ANY
  2081. socket.BDADDR_LOCAL
  2082. socket.AF_BLUETOOTH
  2083. socket.BTPROTO_RFCOMM
  2084. if sys.platform != "win32":
  2085. socket.BTPROTO_HCI
  2086. socket.SOL_HCI
  2087. socket.BTPROTO_L2CAP
  2088. if not sys.platform.startswith("freebsd"):
  2089. socket.BTPROTO_SCO
  2090. def testCreateRfcommSocket(self):
  2091. with socket.socket(socket.AF_BLUETOOTH, socket.SOCK_STREAM, socket.BTPROTO_RFCOMM) as s:
  2092. pass
  2093. @unittest.skipIf(sys.platform == "win32", "windows does not support L2CAP sockets")
  2094. def testCreateL2capSocket(self):
  2095. with socket.socket(socket.AF_BLUETOOTH, socket.SOCK_SEQPACKET, socket.BTPROTO_L2CAP) as s:
  2096. pass
  2097. @unittest.skipIf(sys.platform == "win32", "windows does not support HCI sockets")
  2098. def testCreateHciSocket(self):
  2099. with socket.socket(socket.AF_BLUETOOTH, socket.SOCK_RAW, socket.BTPROTO_HCI) as s:
  2100. pass
  2101. @unittest.skipIf(sys.platform == "win32" or sys.platform.startswith("freebsd"),
  2102. "windows and freebsd do not support SCO sockets")
  2103. def testCreateScoSocket(self):
  2104. with socket.socket(socket.AF_BLUETOOTH, socket.SOCK_SEQPACKET, socket.BTPROTO_SCO) as s:
  2105. pass
  2106. class BasicTCPTest(SocketConnectedTest):
  2107. def __init__(self, methodName='runTest'):
  2108. SocketConnectedTest.__init__(self, methodName=methodName)
  2109. def testRecv(self):
  2110. # Testing large receive over TCP
  2111. msg = self.cli_conn.recv(1024)
  2112. self.assertEqual(msg, MSG)
  2113. def _testRecv(self):
  2114. self.serv_conn.send(MSG)
  2115. def testOverFlowRecv(self):
  2116. # Testing receive in chunks over TCP
  2117. seg1 = self.cli_conn.recv(len(MSG) - 3)
  2118. seg2 = self.cli_conn.recv(1024)
  2119. msg = seg1 + seg2
  2120. self.assertEqual(msg, MSG)
  2121. def _testOverFlowRecv(self):
  2122. self.serv_conn.send(MSG)
  2123. def testRecvFrom(self):
  2124. # Testing large recvfrom() over TCP
  2125. msg, addr = self.cli_conn.recvfrom(1024)
  2126. self.assertEqual(msg, MSG)
  2127. def _testRecvFrom(self):
  2128. self.serv_conn.send(MSG)
  2129. def testOverFlowRecvFrom(self):
  2130. # Testing recvfrom() in chunks over TCP
  2131. seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
  2132. seg2, addr = self.cli_conn.recvfrom(1024)
  2133. msg = seg1 + seg2
  2134. self.assertEqual(msg, MSG)
  2135. def _testOverFlowRecvFrom(self):
  2136. self.serv_conn.send(MSG)
  2137. def testSendAll(self):
  2138. # Testing sendall() with a 2048 byte string over TCP
  2139. msg = b''
  2140. while 1:
  2141. read = self.cli_conn.recv(1024)
  2142. if not read:
  2143. break
  2144. msg += read
  2145. self.assertEqual(msg, b'f' * 2048)
  2146. def _testSendAll(self):
  2147. big_chunk = b'f' * 2048
  2148. self.serv_conn.sendall(big_chunk)
  2149. def testFromFd(self):
  2150. # Testing fromfd()
  2151. fd = self.cli_conn.fileno()
  2152. sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
  2153. self.addCleanup(sock.close)
  2154. self.assertIsInstance(sock, socket.socket)
  2155. msg = sock.recv(1024)
  2156. self.assertEqual(msg, MSG)
  2157. def _testFromFd(self):
  2158. self.serv_conn.send(MSG)
  2159. def testDup(self):
  2160. # Testing dup()
  2161. sock = self.cli_conn.dup()
  2162. self.addCleanup(sock.close)
  2163. msg = sock.recv(1024)
  2164. self.assertEqual(msg, MSG)
  2165. def _testDup(self):
  2166. self.serv_conn.send(MSG)
  2167. def testShutdown(self):
  2168. # Testing shutdown()
  2169. msg = self.cli_conn.recv(1024)
  2170. self.assertEqual(msg, MSG)
  2171. # wait for _testShutdown to finish: on OS X, when the server
  2172. # closes the connection the client also becomes disconnected,
  2173. # and the client's shutdown call will fail. (Issue #4397.)
  2174. self.done.wait()
  2175. def _testShutdown(self):
  2176. self.serv_conn.send(MSG)
  2177. self.serv_conn.shutdown(2)
  2178. testShutdown_overflow = support.cpython_only(testShutdown)
  2179. @support.cpython_only
  2180. def _testShutdown_overflow(self):
  2181. import _testcapi
  2182. self.serv_conn.send(MSG)
  2183. # Issue 15989
  2184. self.assertRaises(OverflowError, self.serv_conn.shutdown,
  2185. _testcapi.INT_MAX + 1)
  2186. self.assertRaises(OverflowError, self.serv_conn.shutdown,
  2187. 2 + (_testcapi.UINT_MAX + 1))
  2188. self.serv_conn.shutdown(2)
  2189. def testDetach(self):
  2190. # Testing detach()
  2191. fileno = self.cli_conn.fileno()
  2192. f = self.cli_conn.detach()
  2193. self.assertEqual(f, fileno)
  2194. # cli_conn cannot be used anymore...
  2195. self.assertTrue(self.cli_conn._closed)
  2196. self.assertRaises(OSError, self.cli_conn.recv, 1024)
  2197. self.cli_conn.close()
  2198. # ...but we can create another socket using the (still open)
  2199. # file descriptor
  2200. sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
  2201. self.addCleanup(sock.close)
  2202. msg = sock.recv(1024)
  2203. self.assertEqual(msg, MSG)
  2204. def _testDetach(self):
  2205. self.serv_conn.send(MSG)
  2206. class BasicUDPTest(ThreadedUDPSocketTest):
  2207. def __init__(self, methodName='runTest'):
  2208. ThreadedUDPSocketTest.__init__(self, methodName=methodName)
  2209. def testSendtoAndRecv(self):
  2210. # Testing sendto() and Recv() over UDP
  2211. msg = self.serv.recv(len(MSG))
  2212. self.assertEqual(msg, MSG)
  2213. def _testSendtoAndRecv(self):
  2214. self.cli.sendto(MSG, 0, (HOST, self.port))
  2215. def testRecvFrom(self):
  2216. # Testing recvfrom() over UDP
  2217. msg, addr = self.serv.recvfrom(len(MSG))
  2218. self.assertEqual(msg, MSG)
  2219. def _testRecvFrom(self):
  2220. self.cli.sendto(MSG, 0, (HOST, self.port))
  2221. def testRecvFromNegative(self):
  2222. # Negative lengths passed to recvfrom should give ValueError.
  2223. self.assertRaises(ValueError, self.serv.recvfrom, -1)
  2224. def _testRecvFromNegative(self):
  2225. self.cli.sendto(MSG, 0, (HOST, self.port))
  2226. @unittest.skipUnless(HAVE_SOCKET_UDPLITE,
  2227. 'UDPLITE sockets required for this test.')
  2228. class BasicUDPLITETest(ThreadedUDPLITESocketTest):
  2229. def __init__(self, methodName='runTest'):
  2230. ThreadedUDPLITESocketTest.__init__(self, methodName=methodName)
  2231. def testSendtoAndRecv(self):
  2232. # Testing sendto() and Recv() over UDPLITE
  2233. msg = self.serv.recv(len(MSG))
  2234. self.assertEqual(msg, MSG)
  2235. def _testSendtoAndRecv(self):
  2236. self.cli.sendto(MSG, 0, (HOST, self.port))
  2237. def testRecvFrom(self):
  2238. # Testing recvfrom() over UDPLITE
  2239. msg, addr = self.serv.recvfrom(len(MSG))
  2240. self.assertEqual(msg, MSG)
  2241. def _testRecvFrom(self):
  2242. self.cli.sendto(MSG, 0, (HOST, self.port))
  2243. def testRecvFromNegative(self):
  2244. # Negative lengths passed to recvfrom should give ValueError.
  2245. self.assertRaises(ValueError, self.serv.recvfrom, -1)
  2246. def _testRecvFromNegative(self):
  2247. self.cli.sendto(MSG, 0, (HOST, self.port))
  2248. # Tests for the sendmsg()/recvmsg() interface. Where possible, the
  2249. # same test code is used with different families and types of socket
  2250. # (e.g. stream, datagram), and tests using recvmsg() are repeated
  2251. # using recvmsg_into().
  2252. #
  2253. # The generic test classes such as SendmsgTests and
  2254. # RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
  2255. # supplied with sockets cli_sock and serv_sock representing the
  2256. # client's and the server's end of the connection respectively, and
  2257. # attributes cli_addr and serv_addr holding their (numeric where
  2258. # appropriate) addresses.
  2259. #
  2260. # The final concrete test classes combine these with subclasses of
  2261. # SocketTestBase which set up client and server sockets of a specific
  2262. # type, and with subclasses of SendrecvmsgBase such as
  2263. # SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
  2264. # sockets to cli_sock and serv_sock and override the methods and
  2265. # attributes of SendrecvmsgBase to fill in destination addresses if
  2266. # needed when sending, check for specific flags in msg_flags, etc.
  2267. #
  2268. # RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
  2269. # recvmsg_into().
  2270. # XXX: like the other datagram (UDP) tests in this module, the code
  2271. # here assumes that datagram delivery on the local machine will be
  2272. # reliable.
  2273. class SendrecvmsgBase(ThreadSafeCleanupTestCase):
  2274. # Base class for sendmsg()/recvmsg() tests.
  2275. # Time in seconds to wait before considering a test failed, or
  2276. # None for no timeout. Not all tests actually set a timeout.
  2277. fail_timeout = support.LOOPBACK_TIMEOUT
  2278. def setUp(self):
  2279. self.misc_event = threading.Event()
  2280. super().setUp()
  2281. def sendToServer(self, msg):
  2282. # Send msg to the server.
  2283. return self.cli_sock.send(msg)
  2284. # Tuple of alternative default arguments for sendmsg() when called
  2285. # via sendmsgToServer() (e.g. to include a destination address).
  2286. sendmsg_to_server_defaults = ()
  2287. def sendmsgToServer(self, *args):
  2288. # Call sendmsg() on self.cli_sock with the given arguments,
  2289. # filling in any arguments which are not supplied with the
  2290. # corresponding items of self.sendmsg_to_server_defaults, if
  2291. # any.
  2292. return self.cli_sock.sendmsg(
  2293. *(args + self.sendmsg_to_server_defaults[len(args):]))
  2294. def doRecvmsg(self, sock, bufsize, *args):
  2295. # Call recvmsg() on sock with given arguments and return its
  2296. # result. Should be used for tests which can use either
  2297. # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
  2298. # this method with one which emulates it using recvmsg_into(),
  2299. # thus allowing the same test to be used for both methods.
  2300. result = sock.recvmsg(bufsize, *args)
  2301. self.registerRecvmsgResult(result)
  2302. return result
  2303. def registerRecvmsgResult(self, result):
  2304. # Called by doRecvmsg() with the return value of recvmsg() or
  2305. # recvmsg_into(). Can be overridden to arrange cleanup based
  2306. # on the returned ancillary data, for instance.
  2307. pass
  2308. def checkRecvmsgAddress(self, addr1, addr2):
  2309. # Called to compare the received address with the address of
  2310. # the peer.
  2311. self.assertEqual(addr1, addr2)
  2312. # Flags that are normally unset in msg_flags
  2313. msg_flags_common_unset = 0
  2314. for name in ("MSG_CTRUNC", "MSG_OOB"):
  2315. msg_flags_common_unset |= getattr(socket, name, 0)
  2316. # Flags that are normally set
  2317. msg_flags_common_set = 0
  2318. # Flags set when a complete record has been received (e.g. MSG_EOR
  2319. # for SCTP)
  2320. msg_flags_eor_indicator = 0
  2321. # Flags set when a complete record has not been received
  2322. # (e.g. MSG_TRUNC for datagram sockets)
  2323. msg_flags_non_eor_indicator = 0
  2324. def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
  2325. # Method to check the value of msg_flags returned by recvmsg[_into]().
  2326. #
  2327. # Checks that all bits in msg_flags_common_set attribute are
  2328. # set in "flags" and all bits in msg_flags_common_unset are
  2329. # unset.
  2330. #
  2331. # The "eor" argument specifies whether the flags should
  2332. # indicate that a full record (or datagram) has been received.
  2333. # If "eor" is None, no checks are done; otherwise, checks
  2334. # that:
  2335. #
  2336. # * if "eor" is true, all bits in msg_flags_eor_indicator are
  2337. # set and all bits in msg_flags_non_eor_indicator are unset
  2338. #
  2339. # * if "eor" is false, all bits in msg_flags_non_eor_indicator
  2340. # are set and all bits in msg_flags_eor_indicator are unset
  2341. #
  2342. # If "checkset" and/or "checkunset" are supplied, they require
  2343. # the given bits to be set or unset respectively, overriding
  2344. # what the attributes require for those bits.
  2345. #
  2346. # If any bits are set in "ignore", they will not be checked,
  2347. # regardless of the other inputs.
  2348. #
  2349. # Will raise Exception if the inputs require a bit to be both
  2350. # set and unset, and it is not ignored.
  2351. defaultset = self.msg_flags_common_set
  2352. defaultunset = self.msg_flags_common_unset
  2353. if eor:
  2354. defaultset |= self.msg_flags_eor_indicator
  2355. defaultunset |= self.msg_flags_non_eor_indicator
  2356. elif eor is not None:
  2357. defaultset |= self.msg_flags_non_eor_indicator
  2358. defaultunset |= self.msg_flags_eor_indicator
  2359. # Function arguments override defaults
  2360. defaultset &= ~checkunset
  2361. defaultunset &= ~checkset
  2362. # Merge arguments with remaining defaults, and check for conflicts
  2363. checkset |= defaultset
  2364. checkunset |= defaultunset
  2365. inboth = checkset & checkunset & ~ignore
  2366. if inboth:
  2367. raise Exception("contradictory set, unset requirements for flags "
  2368. "{0:#x}".format(inboth))
  2369. # Compare with given msg_flags value
  2370. mask = (checkset | checkunset) & ~ignore
  2371. self.assertEqual(flags & mask, checkset & mask)
  2372. class RecvmsgIntoMixin(SendrecvmsgBase):
  2373. # Mixin to implement doRecvmsg() using recvmsg_into().
  2374. def doRecvmsg(self, sock, bufsize, *args):
  2375. buf = bytearray(bufsize)
  2376. result = sock.recvmsg_into([buf], *args)
  2377. self.registerRecvmsgResult(result)
  2378. self.assertGreaterEqual(result[0], 0)
  2379. self.assertLessEqual(result[0], bufsize)
  2380. return (bytes(buf[:result[0]]),) + result[1:]
  2381. class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
  2382. # Defines flags to be checked in msg_flags for datagram sockets.
  2383. @property
  2384. def msg_flags_non_eor_indicator(self):
  2385. return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
  2386. class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
  2387. # Defines flags to be checked in msg_flags for SCTP sockets.
  2388. @property
  2389. def msg_flags_eor_indicator(self):
  2390. return super().msg_flags_eor_indicator | socket.MSG_EOR
  2391. class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
  2392. # Base class for tests on connectionless-mode sockets. Users must
  2393. # supply sockets on attributes cli and serv to be mapped to
  2394. # cli_sock and serv_sock respectively.
  2395. @property
  2396. def serv_sock(self):
  2397. return self.serv
  2398. @property
  2399. def cli_sock(self):
  2400. return self.cli
  2401. @property
  2402. def sendmsg_to_server_defaults(self):
  2403. return ([], [], 0, self.serv_addr)
  2404. def sendToServer(self, msg):
  2405. return self.cli_sock.sendto(msg, self.serv_addr)
  2406. class SendrecvmsgConnectedBase(SendrecvmsgBase):
  2407. # Base class for tests on connected sockets. Users must supply
  2408. # sockets on attributes serv_conn and cli_conn (representing the
  2409. # connections *to* the server and the client), to be mapped to
  2410. # cli_sock and serv_sock respectively.
  2411. @property
  2412. def serv_sock(self):
  2413. return self.cli_conn
  2414. @property
  2415. def cli_sock(self):
  2416. return self.serv_conn
  2417. def checkRecvmsgAddress(self, addr1, addr2):
  2418. # Address is currently "unspecified" for a connected socket,
  2419. # so we don't examine it
  2420. pass
  2421. class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
  2422. # Base class to set a timeout on server's socket.
  2423. def setUp(self):
  2424. super().setUp()
  2425. self.serv_sock.settimeout(self.fail_timeout)
  2426. class SendmsgTests(SendrecvmsgServerTimeoutBase):
  2427. # Tests for sendmsg() which can use any socket type and do not
  2428. # involve recvmsg() or recvmsg_into().
  2429. def testSendmsg(self):
  2430. # Send a simple message with sendmsg().
  2431. self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
  2432. def _testSendmsg(self):
  2433. self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
  2434. def testSendmsgDataGenerator(self):
  2435. # Send from buffer obtained from a generator (not a sequence).
  2436. self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
  2437. def _testSendmsgDataGenerator(self):
  2438. self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
  2439. len(MSG))
  2440. def testSendmsgAncillaryGenerator(self):
  2441. # Gather (empty) ancillary data from a generator.
  2442. self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
  2443. def _testSendmsgAncillaryGenerator(self):
  2444. self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
  2445. len(MSG))
  2446. def testSendmsgArray(self):
  2447. # Send data from an array instead of the usual bytes object.
  2448. self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
  2449. def _testSendmsgArray(self):
  2450. self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
  2451. len(MSG))
  2452. def testSendmsgGather(self):
  2453. # Send message data from more than one buffer (gather write).
  2454. self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
  2455. def _testSendmsgGather(self):
  2456. self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
  2457. def testSendmsgBadArgs(self):
  2458. # Check that sendmsg() rejects invalid arguments.
  2459. self.assertEqual(self.serv_sock.recv(1000), b"done")
  2460. def _testSendmsgBadArgs(self):
  2461. self.assertRaises(TypeError, self.cli_sock.sendmsg)
  2462. self.assertRaises(TypeError, self.sendmsgToServer,
  2463. b"not in an iterable")
  2464. self.assertRaises(TypeError, self.sendmsgToServer,
  2465. object())
  2466. self.assertRaises(TypeError, self.sendmsgToServer,
  2467. [object()])
  2468. self.assertRaises(TypeError, self.sendmsgToServer,
  2469. [MSG, object()])
  2470. self.assertRaises(TypeError, self.sendmsgToServer,
  2471. [MSG], object())
  2472. self.assertRaises(TypeError, self.sendmsgToServer,
  2473. [MSG], [], object())
  2474. self.assertRaises(TypeError, self.sendmsgToServer,
  2475. [MSG], [], 0, object())
  2476. self.sendToServer(b"done")
  2477. def testSendmsgBadCmsg(self):
  2478. # Check that invalid ancillary data items are rejected.
  2479. self.assertEqual(self.serv_sock.recv(1000), b"done")
  2480. def _testSendmsgBadCmsg(self):
  2481. self.assertRaises(TypeError, self.sendmsgToServer,
  2482. [MSG], [object()])
  2483. self.assertRaises(TypeError, self.sendmsgToServer,
  2484. [MSG], [(object(), 0, b"data")])
  2485. self.assertRaises(TypeError, self.sendmsgToServer,
  2486. [MSG], [(0, object(), b"data")])
  2487. self.assertRaises(TypeError, self.sendmsgToServer,
  2488. [MSG], [(0, 0, object())])
  2489. self.assertRaises(TypeError, self.sendmsgToServer,
  2490. [MSG], [(0, 0)])
  2491. self.assertRaises(TypeError, self.sendmsgToServer,
  2492. [MSG], [(0, 0, b"data", 42)])
  2493. self.sendToServer(b"done")
  2494. @requireAttrs(socket, "CMSG_SPACE")
  2495. def testSendmsgBadMultiCmsg(self):
  2496. # Check that invalid ancillary data items are rejected when
  2497. # more than one item is present.
  2498. self.assertEqual(self.serv_sock.recv(1000), b"done")
  2499. @testSendmsgBadMultiCmsg.client_skip
  2500. def _testSendmsgBadMultiCmsg(self):
  2501. self.assertRaises(TypeError, self.sendmsgToServer,
  2502. [MSG], [0, 0, b""])
  2503. self.assertRaises(TypeError, self.sendmsgToServer,
  2504. [MSG], [(0, 0, b""), object()])
  2505. self.sendToServer(b"done")
  2506. def testSendmsgExcessCmsgReject(self):
  2507. # Check that sendmsg() rejects excess ancillary data items
  2508. # when the number that can be sent is limited.
  2509. self.assertEqual(self.serv_sock.recv(1000), b"done")
  2510. def _testSendmsgExcessCmsgReject(self):
  2511. if not hasattr(socket, "CMSG_SPACE"):
  2512. # Can only send one item
  2513. with self.assertRaises(OSError) as cm:
  2514. self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
  2515. self.assertIsNone(cm.exception.errno)
  2516. self.sendToServer(b"done")
  2517. def testSendmsgAfterClose(self):
  2518. # Check that sendmsg() fails on a closed socket.
  2519. pass
  2520. def _testSendmsgAfterClose(self):
  2521. self.cli_sock.close()
  2522. self.assertRaises(OSError, self.sendmsgToServer, [MSG])
  2523. class SendmsgStreamTests(SendmsgTests):
  2524. # Tests for sendmsg() which require a stream socket and do not
  2525. # involve recvmsg() or recvmsg_into().
  2526. def testSendmsgExplicitNoneAddr(self):
  2527. # Check that peer address can be specified as None.
  2528. self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
  2529. def _testSendmsgExplicitNoneAddr(self):
  2530. self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
  2531. def testSendmsgTimeout(self):
  2532. # Check that timeout works with sendmsg().
  2533. self.assertEqual(self.serv_sock.recv(512), b"a"*512)
  2534. self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
  2535. def _testSendmsgTimeout(self):
  2536. try:
  2537. self.cli_sock.settimeout(0.03)
  2538. try:
  2539. while True:
  2540. self.sendmsgToServer([b"a"*512])
  2541. except TimeoutError:
  2542. pass
  2543. except OSError as exc:
  2544. if exc.errno != errno.ENOMEM:
  2545. raise
  2546. # bpo-33937 the test randomly fails on Travis CI with
  2547. # "OSError: [Errno 12] Cannot allocate memory"
  2548. else:
  2549. self.fail("TimeoutError not raised")
  2550. finally:
  2551. self.misc_event.set()
  2552. # XXX: would be nice to have more tests for sendmsg flags argument.
  2553. # Linux supports MSG_DONTWAIT when sending, but in general, it
  2554. # only works when receiving. Could add other platforms if they
  2555. # support it too.
  2556. @skipWithClientIf(sys.platform not in {"linux"},
  2557. "MSG_DONTWAIT not known to work on this platform when "
  2558. "sending")
  2559. def testSendmsgDontWait(self):
  2560. # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
  2561. self.assertEqual(self.serv_sock.recv(512), b"a"*512)
  2562. self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
  2563. @testSendmsgDontWait.client_skip
  2564. def _testSendmsgDontWait(self):
  2565. try:
  2566. with self.assertRaises(OSError) as cm:
  2567. while True:
  2568. self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
  2569. # bpo-33937: catch also ENOMEM, the test randomly fails on Travis CI
  2570. # with "OSError: [Errno 12] Cannot allocate memory"
  2571. self.assertIn(cm.exception.errno,
  2572. (errno.EAGAIN, errno.EWOULDBLOCK, errno.ENOMEM))
  2573. finally:
  2574. self.misc_event.set()
  2575. class SendmsgConnectionlessTests(SendmsgTests):
  2576. # Tests for sendmsg() which require a connectionless-mode
  2577. # (e.g. datagram) socket, and do not involve recvmsg() or
  2578. # recvmsg_into().
  2579. def testSendmsgNoDestAddr(self):
  2580. # Check that sendmsg() fails when no destination address is
  2581. # given for unconnected socket.
  2582. pass
  2583. def _testSendmsgNoDestAddr(self):
  2584. self.assertRaises(OSError, self.cli_sock.sendmsg,
  2585. [MSG])
  2586. self.assertRaises(OSError, self.cli_sock.sendmsg,
  2587. [MSG], [], 0, None)
  2588. class RecvmsgGenericTests(SendrecvmsgBase):
  2589. # Tests for recvmsg() which can also be emulated using
  2590. # recvmsg_into(), and can use any socket type.
  2591. def testRecvmsg(self):
  2592. # Receive a simple message with recvmsg[_into]().
  2593. msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
  2594. self.assertEqual(msg, MSG)
  2595. self.checkRecvmsgAddress(addr, self.cli_addr)
  2596. self.assertEqual(ancdata, [])
  2597. self.checkFlags(flags, eor=True)
  2598. def _testRecvmsg(self):
  2599. self.sendToServer(MSG)
  2600. def testRecvmsgExplicitDefaults(self):
  2601. # Test recvmsg[_into]() with default arguments provided explicitly.
  2602. msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
  2603. len(MSG), 0, 0)
  2604. self.assertEqual(msg, MSG)
  2605. self.checkRecvmsgAddress(addr, self.cli_addr)
  2606. self.assertEqual(ancdata, [])
  2607. self.checkFlags(flags, eor=True)
  2608. def _testRecvmsgExplicitDefaults(self):
  2609. self.sendToServer(MSG)
  2610. def testRecvmsgShorter(self):
  2611. # Receive a message smaller than buffer.
  2612. msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
  2613. len(MSG) + 42)
  2614. self.assertEqual(msg, MSG)
  2615. self.checkRecvmsgAddress(addr, self.cli_addr)
  2616. self.assertEqual(ancdata, [])
  2617. self.checkFlags(flags, eor=True)
  2618. def _testRecvmsgShorter(self):
  2619. self.sendToServer(MSG)
  2620. def testRecvmsgTrunc(self):
  2621. # Receive part of message, check for truncation indicators.
  2622. msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
  2623. len(MSG) - 3)
  2624. self.assertEqual(msg, MSG[:-3])
  2625. self.checkRecvmsgAddress(addr, self.cli_addr)
  2626. self.assertEqual(ancdata, [])
  2627. self.checkFlags(flags, eor=False)
  2628. def _testRecvmsgTrunc(self):
  2629. self.sendToServer(MSG)
  2630. def testRecvmsgShortAncillaryBuf(self):
  2631. # Test ancillary data buffer too small to hold any ancillary data.
  2632. msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
  2633. len(MSG), 1)
  2634. self.assertEqual(msg, MSG)
  2635. self.checkRecvmsgAddress(addr, self.cli_addr)
  2636. self.assertEqual(ancdata, [])
  2637. self.checkFlags(flags, eor=True)
  2638. def _testRecvmsgShortAncillaryBuf(self):
  2639. self.sendToServer(MSG)
  2640. def testRecvmsgLongAncillaryBuf(self):
  2641. # Test large ancillary data buffer.
  2642. msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
  2643. len(MSG), 10240)
  2644. self.assertEqual(msg, MSG)
  2645. self.checkRecvmsgAddress(addr, self.cli_addr)
  2646. self.assertEqual(ancdata, [])
  2647. self.checkFlags(flags, eor=True)
  2648. def _testRecvmsgLongAncillaryBuf(self):
  2649. self.sendToServer(MSG)
  2650. def testRecvmsgAfterClose(self):
  2651. # Check that recvmsg[_into]() fails on a closed socket.
  2652. self.serv_sock.close()
  2653. self.assertRaises(OSError, self.doRecvmsg, self.serv_sock, 1024)
  2654. def _testRecvmsgAfterClose(self):
  2655. pass
  2656. def testRecvmsgTimeout(self):
  2657. # Check that timeout works.
  2658. try:
  2659. self.serv_sock.settimeout(0.03)
  2660. self.assertRaises(TimeoutError,
  2661. self.doRecvmsg, self.serv_sock, len(MSG))
  2662. finally:
  2663. self.misc_event.set()
  2664. def _testRecvmsgTimeout(self):
  2665. self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
  2666. @requireAttrs(socket, "MSG_PEEK")
  2667. def testRecvmsgPeek(self):
  2668. # Check that MSG_PEEK in flags enables examination of pending
  2669. # data without consuming it.
  2670. # Receive part of data with MSG_PEEK.
  2671. msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
  2672. len(MSG) - 3, 0,
  2673. socket.MSG_PEEK)
  2674. self.assertEqual(msg, MSG[:-3])
  2675. self.checkRecvmsgAddress(addr, self.cli_addr)
  2676. self.assertEqual(ancdata, [])
  2677. # Ignoring MSG_TRUNC here (so this test is the same for stream
  2678. # and datagram sockets). Some wording in POSIX seems to
  2679. # suggest that it needn't be set when peeking, but that may
  2680. # just be a slip.
  2681. self.checkFlags(flags, eor=False,
  2682. ignore=getattr(socket, "MSG_TRUNC", 0))
  2683. # Receive all data with MSG_PEEK.
  2684. msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
  2685. len(MSG), 0,
  2686. socket.MSG_PEEK)
  2687. self.assertEqual(msg, MSG)
  2688. self.checkRecvmsgAddress(addr, self.cli_addr)
  2689. self.assertEqual(ancdata, [])
  2690. self.checkFlags(flags, eor=True)
  2691. # Check that the same data can still be received normally.
  2692. msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
  2693. self.assertEqual(msg, MSG)
  2694. self.checkRecvmsgAddress(addr, self.cli_addr)
  2695. self.assertEqual(ancdata, [])
  2696. self.checkFlags(flags, eor=True)
  2697. @testRecvmsgPeek.client_skip
  2698. def _testRecvmsgPeek(self):
  2699. self.sendToServer(MSG)
  2700. @requireAttrs(socket.socket, "sendmsg")
  2701. def testRecvmsgFromSendmsg(self):
  2702. # Test receiving with recvmsg[_into]() when message is sent
  2703. # using sendmsg().
  2704. self.serv_sock.settimeout(self.fail_timeout)
  2705. msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
  2706. self.assertEqual(msg, MSG)
  2707. self.checkRecvmsgAddress(addr, self.cli_addr)
  2708. self.assertEqual(ancdata, [])
  2709. self.checkFlags(flags, eor=True)
  2710. @testRecvmsgFromSendmsg.client_skip
  2711. def _testRecvmsgFromSendmsg(self):
  2712. self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
  2713. class RecvmsgGenericStreamTests(RecvmsgGenericTests):
  2714. # Tests which require a stream socket and can use either recvmsg()
  2715. # or recvmsg_into().
  2716. def testRecvmsgEOF(self):
  2717. # Receive end-of-stream indicator (b"", peer socket closed).
  2718. msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
  2719. self.assertEqual(msg, b"")
  2720. self.checkRecvmsgAddress(addr, self.cli_addr)
  2721. self.assertEqual(ancdata, [])
  2722. self.checkFlags(flags, eor=None) # Might not have end-of-record marker
  2723. def _testRecvmsgEOF(self):
  2724. self.cli_sock.close()
  2725. def testRecvmsgOverflow(self):
  2726. # Receive a message in more than one chunk.
  2727. seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
  2728. len(MSG) - 3)
  2729. self.checkRecvmsgAddress(addr, self.cli_addr)
  2730. self.assertEqual(ancdata, [])
  2731. self.checkFlags(flags, eor=False)
  2732. seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
  2733. self.checkRecvmsgAddress(addr, self.cli_addr)
  2734. self.assertEqual(ancdata, [])
  2735. self.checkFlags(flags, eor=True)
  2736. msg = seg1 + seg2
  2737. self.assertEqual(msg, MSG)
  2738. def _testRecvmsgOverflow(self):
  2739. self.sendToServer(MSG)
  2740. class RecvmsgTests(RecvmsgGenericTests):
  2741. # Tests for recvmsg() which can use any socket type.
  2742. def testRecvmsgBadArgs(self):
  2743. # Check that recvmsg() rejects invalid arguments.
  2744. self.assertRaises(TypeError, self.serv_sock.recvmsg)
  2745. self.assertRaises(ValueError, self.serv_sock.recvmsg,
  2746. -1, 0, 0)
  2747. self.assertRaises(ValueError, self.serv_sock.recvmsg,
  2748. len(MSG), -1, 0)
  2749. self.assertRaises(TypeError, self.serv_sock.recvmsg,
  2750. [bytearray(10)], 0, 0)
  2751. self.assertRaises(TypeError, self.serv_sock.recvmsg,
  2752. object(), 0, 0)
  2753. self.assertRaises(TypeError, self.serv_sock.recvmsg,
  2754. len(MSG), object(), 0)
  2755. self.assertRaises(TypeError, self.serv_sock.recvmsg,
  2756. len(MSG), 0, object())
  2757. msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
  2758. self.assertEqual(msg, MSG)
  2759. self.checkRecvmsgAddress(addr, self.cli_addr)
  2760. self.assertEqual(ancdata, [])
  2761. self.checkFlags(flags, eor=True)
  2762. def _testRecvmsgBadArgs(self):
  2763. self.sendToServer(MSG)
  2764. class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
  2765. # Tests for recvmsg_into() which can use any socket type.
  2766. def testRecvmsgIntoBadArgs(self):
  2767. # Check that recvmsg_into() rejects invalid arguments.
  2768. buf = bytearray(len(MSG))
  2769. self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
  2770. self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
  2771. len(MSG), 0, 0)
  2772. self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
  2773. buf, 0, 0)
  2774. self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
  2775. [object()], 0, 0)
  2776. self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
  2777. [b"I'm not writable"], 0, 0)
  2778. self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
  2779. [buf, object()], 0, 0)
  2780. self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
  2781. [buf], -1, 0)
  2782. self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
  2783. [buf], object(), 0)
  2784. self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
  2785. [buf], 0, object())
  2786. nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
  2787. self.assertEqual(nbytes, len(MSG))
  2788. self.assertEqual(buf, bytearray(MSG))
  2789. self.checkRecvmsgAddress(addr, self.cli_addr)
  2790. self.assertEqual(ancdata, [])
  2791. self.checkFlags(flags, eor=True)
  2792. def _testRecvmsgIntoBadArgs(self):
  2793. self.sendToServer(MSG)
  2794. def testRecvmsgIntoGenerator(self):
  2795. # Receive into buffer obtained from a generator (not a sequence).
  2796. buf = bytearray(len(MSG))
  2797. nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
  2798. (o for o in [buf]))
  2799. self.assertEqual(nbytes, len(MSG))
  2800. self.assertEqual(buf, bytearray(MSG))
  2801. self.checkRecvmsgAddress(addr, self.cli_addr)
  2802. self.assertEqual(ancdata, [])
  2803. self.checkFlags(flags, eor=True)
  2804. def _testRecvmsgIntoGenerator(self):
  2805. self.sendToServer(MSG)
  2806. def testRecvmsgIntoArray(self):
  2807. # Receive into an array rather than the usual bytearray.
  2808. buf = array.array("B", [0] * len(MSG))
  2809. nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
  2810. self.assertEqual(nbytes, len(MSG))
  2811. self.assertEqual(buf.tobytes(), MSG)
  2812. self.checkRecvmsgAddress(addr, self.cli_addr)
  2813. self.assertEqual(ancdata, [])
  2814. self.checkFlags(flags, eor=True)
  2815. def _testRecvmsgIntoArray(self):
  2816. self.sendToServer(MSG)
  2817. def testRecvmsgIntoScatter(self):
  2818. # Receive into multiple buffers (scatter write).
  2819. b1 = bytearray(b"----")
  2820. b2 = bytearray(b"0123456789")
  2821. b3 = bytearray(b"--------------")
  2822. nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
  2823. [b1, memoryview(b2)[2:9], b3])
  2824. self.assertEqual(nbytes, len(b"Mary had a little lamb"))
  2825. self.assertEqual(b1, bytearray(b"Mary"))
  2826. self.assertEqual(b2, bytearray(b"01 had a 9"))
  2827. self.assertEqual(b3, bytearray(b"little lamb---"))
  2828. self.checkRecvmsgAddress(addr, self.cli_addr)
  2829. self.assertEqual(ancdata, [])
  2830. self.checkFlags(flags, eor=True)
  2831. def _testRecvmsgIntoScatter(self):
  2832. self.sendToServer(b"Mary had a little lamb")
  2833. class CmsgMacroTests(unittest.TestCase):
  2834. # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
  2835. # assumptions used by sendmsg() and recvmsg[_into](), which share
  2836. # code with these functions.
  2837. # Match the definition in socketmodule.c
  2838. try:
  2839. import _testcapi
  2840. except ImportError:
  2841. socklen_t_limit = 0x7fffffff
  2842. else:
  2843. socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
  2844. @requireAttrs(socket, "CMSG_LEN")
  2845. def testCMSG_LEN(self):
  2846. # Test CMSG_LEN() with various valid and invalid values,
  2847. # checking the assumptions used by recvmsg() and sendmsg().
  2848. toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
  2849. values = list(range(257)) + list(range(toobig - 257, toobig))
  2850. # struct cmsghdr has at least three members, two of which are ints
  2851. self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
  2852. for n in values:
  2853. ret = socket.CMSG_LEN(n)
  2854. # This is how recvmsg() calculates the data size
  2855. self.assertEqual(ret - socket.CMSG_LEN(0), n)
  2856. self.assertLessEqual(ret, self.socklen_t_limit)
  2857. self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
  2858. # sendmsg() shares code with these functions, and requires
  2859. # that it reject values over the limit.
  2860. self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
  2861. self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
  2862. @requireAttrs(socket, "CMSG_SPACE")
  2863. def testCMSG_SPACE(self):
  2864. # Test CMSG_SPACE() with various valid and invalid values,
  2865. # checking the assumptions used by sendmsg().
  2866. toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
  2867. values = list(range(257)) + list(range(toobig - 257, toobig))
  2868. last = socket.CMSG_SPACE(0)
  2869. # struct cmsghdr has at least three members, two of which are ints
  2870. self.assertGreater(last, array.array("i").itemsize * 2)
  2871. for n in values:
  2872. ret = socket.CMSG_SPACE(n)
  2873. self.assertGreaterEqual(ret, last)
  2874. self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
  2875. self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
  2876. self.assertLessEqual(ret, self.socklen_t_limit)
  2877. last = ret
  2878. self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
  2879. # sendmsg() shares code with these functions, and requires
  2880. # that it reject values over the limit.
  2881. self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
  2882. self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
  2883. class SCMRightsTest(SendrecvmsgServerTimeoutBase):
  2884. # Tests for file descriptor passing on Unix-domain sockets.
  2885. # Invalid file descriptor value that's unlikely to evaluate to a
  2886. # real FD even if one of its bytes is replaced with a different
  2887. # value (which shouldn't actually happen).
  2888. badfd = -0x5555
  2889. def newFDs(self, n):
  2890. # Return a list of n file descriptors for newly-created files
  2891. # containing their list indices as ASCII numbers.
  2892. fds = []
  2893. for i in range(n):
  2894. fd, path = tempfile.mkstemp()
  2895. self.addCleanup(os.unlink, path)
  2896. self.addCleanup(os.close, fd)
  2897. os.write(fd, str(i).encode())
  2898. fds.append(fd)
  2899. return fds
  2900. def checkFDs(self, fds):
  2901. # Check that the file descriptors in the given list contain
  2902. # their correct list indices as ASCII numbers.
  2903. for n, fd in enumerate(fds):
  2904. os.lseek(fd, 0, os.SEEK_SET)
  2905. self.assertEqual(os.read(fd, 1024), str(n).encode())
  2906. def registerRecvmsgResult(self, result):
  2907. self.addCleanup(self.closeRecvmsgFDs, result)
  2908. def closeRecvmsgFDs(self, recvmsg_result):
  2909. # Close all file descriptors specified in the ancillary data
  2910. # of the given return value from recvmsg() or recvmsg_into().
  2911. for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
  2912. if (cmsg_level == socket.SOL_SOCKET and
  2913. cmsg_type == socket.SCM_RIGHTS):
  2914. fds = array.array("i")
  2915. fds.frombytes(cmsg_data[:
  2916. len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
  2917. for fd in fds:
  2918. os.close(fd)
  2919. def createAndSendFDs(self, n):
  2920. # Send n new file descriptors created by newFDs() to the
  2921. # server, with the constant MSG as the non-ancillary data.
  2922. self.assertEqual(
  2923. self.sendmsgToServer([MSG],
  2924. [(socket.SOL_SOCKET,
  2925. socket.SCM_RIGHTS,
  2926. array.array("i", self.newFDs(n)))]),
  2927. len(MSG))
  2928. def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
  2929. # Check that constant MSG was received with numfds file
  2930. # descriptors in a maximum of maxcmsgs control messages (which
  2931. # must contain only complete integers). By default, check
  2932. # that MSG_CTRUNC is unset, but ignore any flags in
  2933. # ignoreflags.
  2934. msg, ancdata, flags, addr = result
  2935. self.assertEqual(msg, MSG)
  2936. self.checkRecvmsgAddress(addr, self.cli_addr)
  2937. self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
  2938. ignore=ignoreflags)
  2939. self.assertIsInstance(ancdata, list)
  2940. self.assertLessEqual(len(ancdata), maxcmsgs)
  2941. fds = array.array("i")
  2942. for item in ancdata:
  2943. self.assertIsInstance(item, tuple)
  2944. cmsg_level, cmsg_type, cmsg_data = item
  2945. self.assertEqual(cmsg_level, socket.SOL_SOCKET)
  2946. self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
  2947. self.assertIsInstance(cmsg_data, bytes)
  2948. self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
  2949. fds.frombytes(cmsg_data)
  2950. self.assertEqual(len(fds), numfds)
  2951. self.checkFDs(fds)
  2952. def testFDPassSimple(self):
  2953. # Pass a single FD (array read from bytes object).
  2954. self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
  2955. len(MSG), 10240))
  2956. def _testFDPassSimple(self):
  2957. self.assertEqual(
  2958. self.sendmsgToServer(
  2959. [MSG],
  2960. [(socket.SOL_SOCKET,
  2961. socket.SCM_RIGHTS,
  2962. array.array("i", self.newFDs(1)).tobytes())]),
  2963. len(MSG))
  2964. def testMultipleFDPass(self):
  2965. # Pass multiple FDs in a single array.
  2966. self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
  2967. len(MSG), 10240))
  2968. def _testMultipleFDPass(self):
  2969. self.createAndSendFDs(4)
  2970. @requireAttrs(socket, "CMSG_SPACE")
  2971. def testFDPassCMSG_SPACE(self):
  2972. # Test using CMSG_SPACE() to calculate ancillary buffer size.
  2973. self.checkRecvmsgFDs(
  2974. 4, self.doRecvmsg(self.serv_sock, len(MSG),
  2975. socket.CMSG_SPACE(4 * SIZEOF_INT)))
  2976. @testFDPassCMSG_SPACE.client_skip
  2977. def _testFDPassCMSG_SPACE(self):
  2978. self.createAndSendFDs(4)
  2979. def testFDPassCMSG_LEN(self):
  2980. # Test using CMSG_LEN() to calculate ancillary buffer size.
  2981. self.checkRecvmsgFDs(1,
  2982. self.doRecvmsg(self.serv_sock, len(MSG),
  2983. socket.CMSG_LEN(4 * SIZEOF_INT)),
  2984. # RFC 3542 says implementations may set
  2985. # MSG_CTRUNC if there isn't enough space
  2986. # for trailing padding.
  2987. ignoreflags=socket.MSG_CTRUNC)
  2988. def _testFDPassCMSG_LEN(self):
  2989. self.createAndSendFDs(1)
  2990. @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
  2991. @unittest.skipIf(AIX, "skipping, see issue #22397")
  2992. @requireAttrs(socket, "CMSG_SPACE")
  2993. def testFDPassSeparate(self):
  2994. # Pass two FDs in two separate arrays. Arrays may be combined
  2995. # into a single control message by the OS.
  2996. self.checkRecvmsgFDs(2,
  2997. self.doRecvmsg(self.serv_sock, len(MSG), 10240),
  2998. maxcmsgs=2)
  2999. @testFDPassSeparate.client_skip
  3000. @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
  3001. @unittest.skipIf(AIX, "skipping, see issue #22397")
  3002. def _testFDPassSeparate(self):
  3003. fd0, fd1 = self.newFDs(2)
  3004. self.assertEqual(
  3005. self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
  3006. socket.SCM_RIGHTS,
  3007. array.array("i", [fd0])),
  3008. (socket.SOL_SOCKET,
  3009. socket.SCM_RIGHTS,
  3010. array.array("i", [fd1]))]),
  3011. len(MSG))
  3012. @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
  3013. @unittest.skipIf(AIX, "skipping, see issue #22397")
  3014. @requireAttrs(socket, "CMSG_SPACE")
  3015. def testFDPassSeparateMinSpace(self):
  3016. # Pass two FDs in two separate arrays, receiving them into the
  3017. # minimum space for two arrays.
  3018. num_fds = 2
  3019. self.checkRecvmsgFDs(num_fds,
  3020. self.doRecvmsg(self.serv_sock, len(MSG),
  3021. socket.CMSG_SPACE(SIZEOF_INT) +
  3022. socket.CMSG_LEN(SIZEOF_INT * num_fds)),
  3023. maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
  3024. @testFDPassSeparateMinSpace.client_skip
  3025. @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
  3026. @unittest.skipIf(AIX, "skipping, see issue #22397")
  3027. def _testFDPassSeparateMinSpace(self):
  3028. fd0, fd1 = self.newFDs(2)
  3029. self.assertEqual(
  3030. self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
  3031. socket.SCM_RIGHTS,
  3032. array.array("i", [fd0])),
  3033. (socket.SOL_SOCKET,
  3034. socket.SCM_RIGHTS,
  3035. array.array("i", [fd1]))]),
  3036. len(MSG))
  3037. def sendAncillaryIfPossible(self, msg, ancdata):
  3038. # Try to send msg and ancdata to server, but if the system
  3039. # call fails, just send msg with no ancillary data.
  3040. try:
  3041. nbytes = self.sendmsgToServer([msg], ancdata)
  3042. except OSError as e:
  3043. # Check that it was the system call that failed
  3044. self.assertIsInstance(e.errno, int)
  3045. nbytes = self.sendmsgToServer([msg])
  3046. self.assertEqual(nbytes, len(msg))
  3047. @unittest.skipIf(sys.platform == "darwin", "see issue #24725")
  3048. def testFDPassEmpty(self):
  3049. # Try to pass an empty FD array. Can receive either no array
  3050. # or an empty array.
  3051. self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
  3052. len(MSG), 10240),
  3053. ignoreflags=socket.MSG_CTRUNC)
  3054. def _testFDPassEmpty(self):
  3055. self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
  3056. socket.SCM_RIGHTS,
  3057. b"")])
  3058. def testFDPassPartialInt(self):
  3059. # Try to pass a truncated FD array.
  3060. msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
  3061. len(MSG), 10240)
  3062. self.assertEqual(msg, MSG)
  3063. self.checkRecvmsgAddress(addr, self.cli_addr)
  3064. self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
  3065. self.assertLessEqual(len(ancdata), 1)
  3066. for cmsg_level, cmsg_type, cmsg_data in ancdata:
  3067. self.assertEqual(cmsg_level, socket.SOL_SOCKET)
  3068. self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
  3069. self.assertLess(len(cmsg_data), SIZEOF_INT)
  3070. def _testFDPassPartialInt(self):
  3071. self.sendAncillaryIfPossible(
  3072. MSG,
  3073. [(socket.SOL_SOCKET,
  3074. socket.SCM_RIGHTS,
  3075. array.array("i", [self.badfd]).tobytes()[:-1])])
  3076. @requireAttrs(socket, "CMSG_SPACE")
  3077. def testFDPassPartialIntInMiddle(self):
  3078. # Try to pass two FD arrays, the first of which is truncated.
  3079. msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
  3080. len(MSG), 10240)
  3081. self.assertEqual(msg, MSG)
  3082. self.checkRecvmsgAddress(addr, self.cli_addr)
  3083. self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
  3084. self.assertLessEqual(len(ancdata), 2)
  3085. fds = array.array("i")
  3086. # Arrays may have been combined in a single control message
  3087. for cmsg_level, cmsg_type, cmsg_data in ancdata:
  3088. self.assertEqual(cmsg_level, socket.SOL_SOCKET)
  3089. self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
  3090. fds.frombytes(cmsg_data[:
  3091. len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
  3092. self.assertLessEqual(len(fds), 2)
  3093. self.checkFDs(fds)
  3094. @testFDPassPartialIntInMiddle.client_skip
  3095. def _testFDPassPartialIntInMiddle(self):
  3096. fd0, fd1 = self.newFDs(2)
  3097. self.sendAncillaryIfPossible(
  3098. MSG,
  3099. [(socket.SOL_SOCKET,
  3100. socket.SCM_RIGHTS,
  3101. array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
  3102. (socket.SOL_SOCKET,
  3103. socket.SCM_RIGHTS,
  3104. array.array("i", [fd1]))])
  3105. def checkTruncatedHeader(self, result, ignoreflags=0):
  3106. # Check that no ancillary data items are returned when data is
  3107. # truncated inside the cmsghdr structure.
  3108. msg, ancdata, flags, addr = result
  3109. self.assertEqual(msg, MSG)
  3110. self.checkRecvmsgAddress(addr, self.cli_addr)
  3111. self.assertEqual(ancdata, [])
  3112. self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
  3113. ignore=ignoreflags)
  3114. def testCmsgTruncNoBufSize(self):
  3115. # Check that no ancillary data is received when no buffer size
  3116. # is specified.
  3117. self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
  3118. # BSD seems to set MSG_CTRUNC only
  3119. # if an item has been partially
  3120. # received.
  3121. ignoreflags=socket.MSG_CTRUNC)
  3122. def _testCmsgTruncNoBufSize(self):
  3123. self.createAndSendFDs(1)
  3124. def testCmsgTrunc0(self):
  3125. # Check that no ancillary data is received when buffer size is 0.
  3126. self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
  3127. ignoreflags=socket.MSG_CTRUNC)
  3128. def _testCmsgTrunc0(self):
  3129. self.createAndSendFDs(1)
  3130. # Check that no ancillary data is returned for various non-zero
  3131. # (but still too small) buffer sizes.
  3132. def testCmsgTrunc1(self):
  3133. self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
  3134. def _testCmsgTrunc1(self):
  3135. self.createAndSendFDs(1)
  3136. def testCmsgTrunc2Int(self):
  3137. # The cmsghdr structure has at least three members, two of
  3138. # which are ints, so we still shouldn't see any ancillary
  3139. # data.
  3140. self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
  3141. SIZEOF_INT * 2))
  3142. def _testCmsgTrunc2Int(self):
  3143. self.createAndSendFDs(1)
  3144. def testCmsgTruncLen0Minus1(self):
  3145. self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
  3146. socket.CMSG_LEN(0) - 1))
  3147. def _testCmsgTruncLen0Minus1(self):
  3148. self.createAndSendFDs(1)
  3149. # The following tests try to truncate the control message in the
  3150. # middle of the FD array.
  3151. def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
  3152. # Check that file descriptor data is truncated to between
  3153. # mindata and maxdata bytes when received with buffer size
  3154. # ancbuf, and that any complete file descriptor numbers are
  3155. # valid.
  3156. msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
  3157. len(MSG), ancbuf)
  3158. self.assertEqual(msg, MSG)
  3159. self.checkRecvmsgAddress(addr, self.cli_addr)
  3160. self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
  3161. if mindata == 0 and ancdata == []:
  3162. return
  3163. self.assertEqual(len(ancdata), 1)
  3164. cmsg_level, cmsg_type, cmsg_data = ancdata[0]
  3165. self.assertEqual(cmsg_level, socket.SOL_SOCKET)
  3166. self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
  3167. self.assertGreaterEqual(len(cmsg_data), mindata)
  3168. self.assertLessEqual(len(cmsg_data), maxdata)
  3169. fds = array.array("i")
  3170. fds.frombytes(cmsg_data[:
  3171. len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
  3172. self.checkFDs(fds)
  3173. def testCmsgTruncLen0(self):
  3174. self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
  3175. def _testCmsgTruncLen0(self):
  3176. self.createAndSendFDs(1)
  3177. def testCmsgTruncLen0Plus1(self):
  3178. self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
  3179. def _testCmsgTruncLen0Plus1(self):
  3180. self.createAndSendFDs(2)
  3181. def testCmsgTruncLen1(self):
  3182. self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
  3183. maxdata=SIZEOF_INT)
  3184. def _testCmsgTruncLen1(self):
  3185. self.createAndSendFDs(2)
  3186. def testCmsgTruncLen2Minus1(self):
  3187. self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
  3188. maxdata=(2 * SIZEOF_INT) - 1)
  3189. def _testCmsgTruncLen2Minus1(self):
  3190. self.createAndSendFDs(2)
  3191. class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
  3192. # Test sendmsg() and recvmsg[_into]() using the ancillary data
  3193. # features of the RFC 3542 Advanced Sockets API for IPv6.
  3194. # Currently we can only handle certain data items (e.g. traffic
  3195. # class, hop limit, MTU discovery and fragmentation settings)
  3196. # without resorting to unportable means such as the struct module,
  3197. # but the tests here are aimed at testing the ancillary data
  3198. # handling in sendmsg() and recvmsg() rather than the IPv6 API
  3199. # itself.
  3200. # Test value to use when setting hop limit of packet
  3201. hop_limit = 2
  3202. # Test value to use when setting traffic class of packet.
  3203. # -1 means "use kernel default".
  3204. traffic_class = -1
  3205. def ancillaryMapping(self, ancdata):
  3206. # Given ancillary data list ancdata, return a mapping from
  3207. # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
  3208. # Check that no (level, type) pair appears more than once.
  3209. d = {}
  3210. for cmsg_level, cmsg_type, cmsg_data in ancdata:
  3211. self.assertNotIn((cmsg_level, cmsg_type), d)
  3212. d[(cmsg_level, cmsg_type)] = cmsg_data
  3213. return d
  3214. def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
  3215. # Receive hop limit into ancbufsize bytes of ancillary data
  3216. # space. Check that data is MSG, ancillary data is not
  3217. # truncated (but ignore any flags in ignoreflags), and hop
  3218. # limit is between 0 and maxhop inclusive.
  3219. self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
  3220. socket.IPV6_RECVHOPLIMIT, 1)
  3221. self.misc_event.set()
  3222. msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
  3223. len(MSG), ancbufsize)
  3224. self.assertEqual(msg, MSG)
  3225. self.checkRecvmsgAddress(addr, self.cli_addr)
  3226. self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
  3227. ignore=ignoreflags)
  3228. self.assertEqual(len(ancdata), 1)
  3229. self.assertIsInstance(ancdata[0], tuple)
  3230. cmsg_level, cmsg_type, cmsg_data = ancdata[0]
  3231. self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
  3232. self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
  3233. self.assertIsInstance(cmsg_data, bytes)
  3234. self.assertEqual(len(cmsg_data), SIZEOF_INT)
  3235. a = array.array("i")
  3236. a.frombytes(cmsg_data)
  3237. self.assertGreaterEqual(a[0], 0)
  3238. self.assertLessEqual(a[0], maxhop)
  3239. @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
  3240. def testRecvHopLimit(self):
  3241. # Test receiving the packet hop limit as ancillary data.
  3242. self.checkHopLimit(ancbufsize=10240)
  3243. @testRecvHopLimit.client_skip
  3244. def _testRecvHopLimit(self):
  3245. # Need to wait until server has asked to receive ancillary
  3246. # data, as implementations are not required to buffer it
  3247. # otherwise.
  3248. self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
  3249. self.sendToServer(MSG)
  3250. @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
  3251. def testRecvHopLimitCMSG_SPACE(self):
  3252. # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
  3253. self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
  3254. @testRecvHopLimitCMSG_SPACE.client_skip
  3255. def _testRecvHopLimitCMSG_SPACE(self):
  3256. self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
  3257. self.sendToServer(MSG)
  3258. # Could test receiving into buffer sized using CMSG_LEN, but RFC
  3259. # 3542 says portable applications must provide space for trailing
  3260. # padding. Implementations may set MSG_CTRUNC if there isn't
  3261. # enough space for the padding.
  3262. @requireAttrs(socket.socket, "sendmsg")
  3263. @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
  3264. def testSetHopLimit(self):
  3265. # Test setting hop limit on outgoing packet and receiving it
  3266. # at the other end.
  3267. self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
  3268. @testSetHopLimit.client_skip
  3269. def _testSetHopLimit(self):
  3270. self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
  3271. self.assertEqual(
  3272. self.sendmsgToServer([MSG],
  3273. [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
  3274. array.array("i", [self.hop_limit]))]),
  3275. len(MSG))
  3276. def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
  3277. ignoreflags=0):
  3278. # Receive traffic class and hop limit into ancbufsize bytes of
  3279. # ancillary data space. Check that data is MSG, ancillary
  3280. # data is not truncated (but ignore any flags in ignoreflags),
  3281. # and traffic class and hop limit are in range (hop limit no
  3282. # more than maxhop).
  3283. self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
  3284. socket.IPV6_RECVHOPLIMIT, 1)
  3285. self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
  3286. socket.IPV6_RECVTCLASS, 1)
  3287. self.misc_event.set()
  3288. msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
  3289. len(MSG), ancbufsize)
  3290. self.assertEqual(msg, MSG)
  3291. self.checkRecvmsgAddress(addr, self.cli_addr)
  3292. self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
  3293. ignore=ignoreflags)
  3294. self.assertEqual(len(ancdata), 2)
  3295. ancmap = self.ancillaryMapping(ancdata)
  3296. tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
  3297. self.assertEqual(len(tcdata), SIZEOF_INT)
  3298. a = array.array("i")
  3299. a.frombytes(tcdata)
  3300. self.assertGreaterEqual(a[0], 0)
  3301. self.assertLessEqual(a[0], 255)
  3302. hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
  3303. self.assertEqual(len(hldata), SIZEOF_INT)
  3304. a = array.array("i")
  3305. a.frombytes(hldata)
  3306. self.assertGreaterEqual(a[0], 0)
  3307. self.assertLessEqual(a[0], maxhop)
  3308. @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
  3309. "IPV6_RECVTCLASS", "IPV6_TCLASS")
  3310. def testRecvTrafficClassAndHopLimit(self):
  3311. # Test receiving traffic class and hop limit as ancillary data.
  3312. self.checkTrafficClassAndHopLimit(ancbufsize=10240)
  3313. @testRecvTrafficClassAndHopLimit.client_skip
  3314. def _testRecvTrafficClassAndHopLimit(self):
  3315. self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
  3316. self.sendToServer(MSG)
  3317. @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
  3318. "IPV6_RECVTCLASS", "IPV6_TCLASS")
  3319. def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
  3320. # Test receiving traffic class and hop limit, using
  3321. # CMSG_SPACE() to calculate buffer size.
  3322. self.checkTrafficClassAndHopLimit(
  3323. ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
  3324. @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
  3325. def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
  3326. self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
  3327. self.sendToServer(MSG)
  3328. @requireAttrs(socket.socket, "sendmsg")
  3329. @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
  3330. "IPV6_RECVTCLASS", "IPV6_TCLASS")
  3331. def testSetTrafficClassAndHopLimit(self):
  3332. # Test setting traffic class and hop limit on outgoing packet,
  3333. # and receiving them at the other end.
  3334. self.checkTrafficClassAndHopLimit(ancbufsize=10240,
  3335. maxhop=self.hop_limit)
  3336. @testSetTrafficClassAndHopLimit.client_skip
  3337. def _testSetTrafficClassAndHopLimit(self):
  3338. self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
  3339. self.assertEqual(
  3340. self.sendmsgToServer([MSG],
  3341. [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
  3342. array.array("i", [self.traffic_class])),
  3343. (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
  3344. array.array("i", [self.hop_limit]))]),
  3345. len(MSG))
  3346. @requireAttrs(socket.socket, "sendmsg")
  3347. @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
  3348. "IPV6_RECVTCLASS", "IPV6_TCLASS")
  3349. def testOddCmsgSize(self):
  3350. # Try to send ancillary data with first item one byte too
  3351. # long. Fall back to sending with correct size if this fails,
  3352. # and check that second item was handled correctly.
  3353. self.checkTrafficClassAndHopLimit(ancbufsize=10240,
  3354. maxhop=self.hop_limit)
  3355. @testOddCmsgSize.client_skip
  3356. def _testOddCmsgSize(self):
  3357. self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
  3358. try:
  3359. nbytes = self.sendmsgToServer(
  3360. [MSG],
  3361. [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
  3362. array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
  3363. (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
  3364. array.array("i", [self.hop_limit]))])
  3365. except OSError as e:
  3366. self.assertIsInstance(e.errno, int)
  3367. nbytes = self.sendmsgToServer(
  3368. [MSG],
  3369. [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
  3370. array.array("i", [self.traffic_class])),
  3371. (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
  3372. array.array("i", [self.hop_limit]))])
  3373. self.assertEqual(nbytes, len(MSG))
  3374. # Tests for proper handling of truncated ancillary data
  3375. def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
  3376. # Receive hop limit into ancbufsize bytes of ancillary data
  3377. # space, which should be too small to contain the ancillary
  3378. # data header (if ancbufsize is None, pass no second argument
  3379. # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
  3380. # (unless included in ignoreflags), and no ancillary data is
  3381. # returned.
  3382. self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
  3383. socket.IPV6_RECVHOPLIMIT, 1)
  3384. self.misc_event.set()
  3385. args = () if ancbufsize is None else (ancbufsize,)
  3386. msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
  3387. len(MSG), *args)
  3388. self.assertEqual(msg, MSG)
  3389. self.checkRecvmsgAddress(addr, self.cli_addr)
  3390. self.assertEqual(ancdata, [])
  3391. self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
  3392. ignore=ignoreflags)
  3393. @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
  3394. def testCmsgTruncNoBufSize(self):
  3395. # Check that no ancillary data is received when no ancillary
  3396. # buffer size is provided.
  3397. self.checkHopLimitTruncatedHeader(ancbufsize=None,
  3398. # BSD seems to set
  3399. # MSG_CTRUNC only if an item
  3400. # has been partially
  3401. # received.
  3402. ignoreflags=socket.MSG_CTRUNC)
  3403. @testCmsgTruncNoBufSize.client_skip
  3404. def _testCmsgTruncNoBufSize(self):
  3405. self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
  3406. self.sendToServer(MSG)
  3407. @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
  3408. def testSingleCmsgTrunc0(self):
  3409. # Check that no ancillary data is received when ancillary
  3410. # buffer size is zero.
  3411. self.checkHopLimitTruncatedHeader(ancbufsize=0,
  3412. ignoreflags=socket.MSG_CTRUNC)
  3413. @testSingleCmsgTrunc0.client_skip
  3414. def _testSingleCmsgTrunc0(self):
  3415. self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
  3416. self.sendToServer(MSG)
  3417. # Check that no ancillary data is returned for various non-zero
  3418. # (but still too small) buffer sizes.
  3419. @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
  3420. def testSingleCmsgTrunc1(self):
  3421. self.checkHopLimitTruncatedHeader(ancbufsize=1)
  3422. @testSingleCmsgTrunc1.client_skip
  3423. def _testSingleCmsgTrunc1(self):
  3424. self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
  3425. self.sendToServer(MSG)
  3426. @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
  3427. def testSingleCmsgTrunc2Int(self):
  3428. self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
  3429. @testSingleCmsgTrunc2Int.client_skip
  3430. def _testSingleCmsgTrunc2Int(self):
  3431. self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
  3432. self.sendToServer(MSG)
  3433. @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
  3434. def testSingleCmsgTruncLen0Minus1(self):
  3435. self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
  3436. @testSingleCmsgTruncLen0Minus1.client_skip
  3437. def _testSingleCmsgTruncLen0Minus1(self):
  3438. self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
  3439. self.sendToServer(MSG)
  3440. @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
  3441. def testSingleCmsgTruncInData(self):
  3442. # Test truncation of a control message inside its associated
  3443. # data. The message may be returned with its data truncated,
  3444. # or not returned at all.
  3445. self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
  3446. socket.IPV6_RECVHOPLIMIT, 1)
  3447. self.misc_event.set()
  3448. msg, ancdata, flags, addr = self.doRecvmsg(
  3449. self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
  3450. self.assertEqual(msg, MSG)
  3451. self.checkRecvmsgAddress(addr, self.cli_addr)
  3452. self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
  3453. self.assertLessEqual(len(ancdata), 1)
  3454. if ancdata:
  3455. cmsg_level, cmsg_type, cmsg_data = ancdata[0]
  3456. self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
  3457. self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
  3458. self.assertLess(len(cmsg_data), SIZEOF_INT)
  3459. @testSingleCmsgTruncInData.client_skip
  3460. def _testSingleCmsgTruncInData(self):
  3461. self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
  3462. self.sendToServer(MSG)
  3463. def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
  3464. # Receive traffic class and hop limit into ancbufsize bytes of
  3465. # ancillary data space, which should be large enough to
  3466. # contain the first item, but too small to contain the header
  3467. # of the second. Check that data is MSG, MSG_CTRUNC is set
  3468. # (unless included in ignoreflags), and only one ancillary
  3469. # data item is returned.
  3470. self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
  3471. socket.IPV6_RECVHOPLIMIT, 1)
  3472. self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
  3473. socket.IPV6_RECVTCLASS, 1)
  3474. self.misc_event.set()
  3475. msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
  3476. len(MSG), ancbufsize)
  3477. self.assertEqual(msg, MSG)
  3478. self.checkRecvmsgAddress(addr, self.cli_addr)
  3479. self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
  3480. ignore=ignoreflags)
  3481. self.assertEqual(len(ancdata), 1)
  3482. cmsg_level, cmsg_type, cmsg_data = ancdata[0]
  3483. self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
  3484. self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
  3485. self.assertEqual(len(cmsg_data), SIZEOF_INT)
  3486. a = array.array("i")
  3487. a.frombytes(cmsg_data)
  3488. self.assertGreaterEqual(a[0], 0)
  3489. self.assertLessEqual(a[0], 255)
  3490. # Try the above test with various buffer sizes.
  3491. @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
  3492. "IPV6_RECVTCLASS", "IPV6_TCLASS")
  3493. def testSecondCmsgTrunc0(self):
  3494. self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
  3495. ignoreflags=socket.MSG_CTRUNC)
  3496. @testSecondCmsgTrunc0.client_skip
  3497. def _testSecondCmsgTrunc0(self):
  3498. self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
  3499. self.sendToServer(MSG)
  3500. @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
  3501. "IPV6_RECVTCLASS", "IPV6_TCLASS")
  3502. def testSecondCmsgTrunc1(self):
  3503. self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
  3504. @testSecondCmsgTrunc1.client_skip
  3505. def _testSecondCmsgTrunc1(self):
  3506. self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
  3507. self.sendToServer(MSG)
  3508. @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
  3509. "IPV6_RECVTCLASS", "IPV6_TCLASS")
  3510. def testSecondCmsgTrunc2Int(self):
  3511. self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
  3512. 2 * SIZEOF_INT)
  3513. @testSecondCmsgTrunc2Int.client_skip
  3514. def _testSecondCmsgTrunc2Int(self):
  3515. self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
  3516. self.sendToServer(MSG)
  3517. @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
  3518. "IPV6_RECVTCLASS", "IPV6_TCLASS")
  3519. def testSecondCmsgTruncLen0Minus1(self):
  3520. self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
  3521. socket.CMSG_LEN(0) - 1)
  3522. @testSecondCmsgTruncLen0Minus1.client_skip
  3523. def _testSecondCmsgTruncLen0Minus1(self):
  3524. self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
  3525. self.sendToServer(MSG)
  3526. @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
  3527. "IPV6_RECVTCLASS", "IPV6_TCLASS")
  3528. def testSecondCmsgTruncInData(self):
  3529. # Test truncation of the second of two control messages inside
  3530. # its associated data.
  3531. self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
  3532. socket.IPV6_RECVHOPLIMIT, 1)
  3533. self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
  3534. socket.IPV6_RECVTCLASS, 1)
  3535. self.misc_event.set()
  3536. msg, ancdata, flags, addr = self.doRecvmsg(
  3537. self.serv_sock, len(MSG),
  3538. socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
  3539. self.assertEqual(msg, MSG)
  3540. self.checkRecvmsgAddress(addr, self.cli_addr)
  3541. self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
  3542. cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
  3543. cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
  3544. self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
  3545. cmsg_types.remove(cmsg_type)
  3546. self.assertEqual(len(cmsg_data), SIZEOF_INT)
  3547. a = array.array("i")
  3548. a.frombytes(cmsg_data)
  3549. self.assertGreaterEqual(a[0], 0)
  3550. self.assertLessEqual(a[0], 255)
  3551. if ancdata:
  3552. cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
  3553. self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
  3554. cmsg_types.remove(cmsg_type)
  3555. self.assertLess(len(cmsg_data), SIZEOF_INT)
  3556. self.assertEqual(ancdata, [])
  3557. @testSecondCmsgTruncInData.client_skip
  3558. def _testSecondCmsgTruncInData(self):
  3559. self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
  3560. self.sendToServer(MSG)
  3561. # Derive concrete test classes for different socket types.
  3562. class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
  3563. SendrecvmsgConnectionlessBase,
  3564. ThreadedSocketTestMixin, UDPTestBase):
  3565. pass
  3566. @requireAttrs(socket.socket, "sendmsg")
  3567. class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
  3568. pass
  3569. @requireAttrs(socket.socket, "recvmsg")
  3570. class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
  3571. pass
  3572. @requireAttrs(socket.socket, "recvmsg_into")
  3573. class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
  3574. pass
  3575. class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
  3576. SendrecvmsgConnectionlessBase,
  3577. ThreadedSocketTestMixin, UDP6TestBase):
  3578. def checkRecvmsgAddress(self, addr1, addr2):
  3579. # Called to compare the received address with the address of
  3580. # the peer, ignoring scope ID
  3581. self.assertEqual(addr1[:-1], addr2[:-1])
  3582. @requireAttrs(socket.socket, "sendmsg")
  3583. @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
  3584. @requireSocket("AF_INET6", "SOCK_DGRAM")
  3585. class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
  3586. pass
  3587. @requireAttrs(socket.socket, "recvmsg")
  3588. @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
  3589. @requireSocket("AF_INET6", "SOCK_DGRAM")
  3590. class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
  3591. pass
  3592. @requireAttrs(socket.socket, "recvmsg_into")
  3593. @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
  3594. @requireSocket("AF_INET6", "SOCK_DGRAM")
  3595. class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
  3596. pass
  3597. @requireAttrs(socket.socket, "recvmsg")
  3598. @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
  3599. @requireAttrs(socket, "IPPROTO_IPV6")
  3600. @requireSocket("AF_INET6", "SOCK_DGRAM")
  3601. class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
  3602. SendrecvmsgUDP6TestBase):
  3603. pass
  3604. @requireAttrs(socket.socket, "recvmsg_into")
  3605. @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
  3606. @requireAttrs(socket, "IPPROTO_IPV6")
  3607. @requireSocket("AF_INET6", "SOCK_DGRAM")
  3608. class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
  3609. RFC3542AncillaryTest,
  3610. SendrecvmsgUDP6TestBase):
  3611. pass
  3612. @unittest.skipUnless(HAVE_SOCKET_UDPLITE,
  3613. 'UDPLITE sockets required for this test.')
  3614. class SendrecvmsgUDPLITETestBase(SendrecvmsgDgramFlagsBase,
  3615. SendrecvmsgConnectionlessBase,
  3616. ThreadedSocketTestMixin, UDPLITETestBase):
  3617. pass
  3618. @unittest.skipUnless(HAVE_SOCKET_UDPLITE,
  3619. 'UDPLITE sockets required for this test.')
  3620. @requireAttrs(socket.socket, "sendmsg")
  3621. class SendmsgUDPLITETest(SendmsgConnectionlessTests, SendrecvmsgUDPLITETestBase):
  3622. pass
  3623. @unittest.skipUnless(HAVE_SOCKET_UDPLITE,
  3624. 'UDPLITE sockets required for this test.')
  3625. @requireAttrs(socket.socket, "recvmsg")
  3626. class RecvmsgUDPLITETest(RecvmsgTests, SendrecvmsgUDPLITETestBase):
  3627. pass
  3628. @unittest.skipUnless(HAVE_SOCKET_UDPLITE,
  3629. 'UDPLITE sockets required for this test.')
  3630. @requireAttrs(socket.socket, "recvmsg_into")
  3631. class RecvmsgIntoUDPLITETest(RecvmsgIntoTests, SendrecvmsgUDPLITETestBase):
  3632. pass
  3633. @unittest.skipUnless(HAVE_SOCKET_UDPLITE,
  3634. 'UDPLITE sockets required for this test.')
  3635. class SendrecvmsgUDPLITE6TestBase(SendrecvmsgDgramFlagsBase,
  3636. SendrecvmsgConnectionlessBase,
  3637. ThreadedSocketTestMixin, UDPLITE6TestBase):
  3638. def checkRecvmsgAddress(self, addr1, addr2):
  3639. # Called to compare the received address with the address of
  3640. # the peer, ignoring scope ID
  3641. self.assertEqual(addr1[:-1], addr2[:-1])
  3642. @requireAttrs(socket.socket, "sendmsg")
  3643. @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
  3644. @unittest.skipUnless(HAVE_SOCKET_UDPLITE,
  3645. 'UDPLITE sockets required for this test.')
  3646. @requireSocket("AF_INET6", "SOCK_DGRAM")
  3647. class SendmsgUDPLITE6Test(SendmsgConnectionlessTests, SendrecvmsgUDPLITE6TestBase):
  3648. pass
  3649. @requireAttrs(socket.socket, "recvmsg")
  3650. @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
  3651. @unittest.skipUnless(HAVE_SOCKET_UDPLITE,
  3652. 'UDPLITE sockets required for this test.')
  3653. @requireSocket("AF_INET6", "SOCK_DGRAM")
  3654. class RecvmsgUDPLITE6Test(RecvmsgTests, SendrecvmsgUDPLITE6TestBase):
  3655. pass
  3656. @requireAttrs(socket.socket, "recvmsg_into")
  3657. @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
  3658. @unittest.skipUnless(HAVE_SOCKET_UDPLITE,
  3659. 'UDPLITE sockets required for this test.')
  3660. @requireSocket("AF_INET6", "SOCK_DGRAM")
  3661. class RecvmsgIntoUDPLITE6Test(RecvmsgIntoTests, SendrecvmsgUDPLITE6TestBase):
  3662. pass
  3663. @requireAttrs(socket.socket, "recvmsg")
  3664. @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
  3665. @unittest.skipUnless(HAVE_SOCKET_UDPLITE,
  3666. 'UDPLITE sockets required for this test.')
  3667. @requireAttrs(socket, "IPPROTO_IPV6")
  3668. @requireSocket("AF_INET6", "SOCK_DGRAM")
  3669. class RecvmsgRFC3542AncillaryUDPLITE6Test(RFC3542AncillaryTest,
  3670. SendrecvmsgUDPLITE6TestBase):
  3671. pass
  3672. @requireAttrs(socket.socket, "recvmsg_into")
  3673. @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test.')
  3674. @unittest.skipUnless(HAVE_SOCKET_UDPLITE,
  3675. 'UDPLITE sockets required for this test.')
  3676. @requireAttrs(socket, "IPPROTO_IPV6")
  3677. @requireSocket("AF_INET6", "SOCK_DGRAM")
  3678. class RecvmsgIntoRFC3542AncillaryUDPLITE6Test(RecvmsgIntoMixin,
  3679. RFC3542AncillaryTest,
  3680. SendrecvmsgUDPLITE6TestBase):
  3681. pass
  3682. class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
  3683. ConnectedStreamTestMixin, TCPTestBase):
  3684. pass
  3685. @requireAttrs(socket.socket, "sendmsg")
  3686. class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
  3687. pass
  3688. @requireAttrs(socket.socket, "recvmsg")
  3689. class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
  3690. SendrecvmsgTCPTestBase):
  3691. pass
  3692. @requireAttrs(socket.socket, "recvmsg_into")
  3693. class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
  3694. SendrecvmsgTCPTestBase):
  3695. pass
  3696. class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
  3697. SendrecvmsgConnectedBase,
  3698. ConnectedStreamTestMixin, SCTPStreamBase):
  3699. pass
  3700. @requireAttrs(socket.socket, "sendmsg")
  3701. @unittest.skipIf(AIX, "IPPROTO_SCTP: [Errno 62] Protocol not supported on AIX")
  3702. @requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
  3703. class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
  3704. pass
  3705. @requireAttrs(socket.socket, "recvmsg")
  3706. @unittest.skipIf(AIX, "IPPROTO_SCTP: [Errno 62] Protocol not supported on AIX")
  3707. @requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
  3708. class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
  3709. SendrecvmsgSCTPStreamTestBase):
  3710. def testRecvmsgEOF(self):
  3711. try:
  3712. super(RecvmsgSCTPStreamTest, self).testRecvmsgEOF()
  3713. except OSError as e:
  3714. if e.errno != errno.ENOTCONN:
  3715. raise
  3716. self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
  3717. @requireAttrs(socket.socket, "recvmsg_into")
  3718. @unittest.skipIf(AIX, "IPPROTO_SCTP: [Errno 62] Protocol not supported on AIX")
  3719. @requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
  3720. class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
  3721. SendrecvmsgSCTPStreamTestBase):
  3722. def testRecvmsgEOF(self):
  3723. try:
  3724. super(RecvmsgIntoSCTPStreamTest, self).testRecvmsgEOF()
  3725. except OSError as e:
  3726. if e.errno != errno.ENOTCONN:
  3727. raise
  3728. self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
  3729. class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
  3730. ConnectedStreamTestMixin, UnixStreamBase):
  3731. pass
  3732. @requireAttrs(socket.socket, "sendmsg")
  3733. @requireAttrs(socket, "AF_UNIX")
  3734. class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
  3735. pass
  3736. @requireAttrs(socket.socket, "recvmsg")
  3737. @requireAttrs(socket, "AF_UNIX")
  3738. class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
  3739. SendrecvmsgUnixStreamTestBase):
  3740. pass
  3741. @requireAttrs(socket.socket, "recvmsg_into")
  3742. @requireAttrs(socket, "AF_UNIX")
  3743. class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
  3744. SendrecvmsgUnixStreamTestBase):
  3745. pass
  3746. @requireAttrs(socket.socket, "sendmsg", "recvmsg")
  3747. @requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
  3748. class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
  3749. pass
  3750. @requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
  3751. @requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
  3752. class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
  3753. SendrecvmsgUnixStreamTestBase):
  3754. pass
  3755. # Test interrupting the interruptible send/receive methods with a
  3756. # signal when a timeout is set. These tests avoid having multiple
  3757. # threads alive during the test so that the OS cannot deliver the
  3758. # signal to the wrong one.
  3759. class InterruptedTimeoutBase:
  3760. # Base class for interrupted send/receive tests. Installs an
  3761. # empty handler for SIGALRM and removes it on teardown, along with
  3762. # any scheduled alarms.
  3763. def setUp(self):
  3764. super().setUp()
  3765. orig_alrm_handler = signal.signal(signal.SIGALRM,
  3766. lambda signum, frame: 1 / 0)
  3767. self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
  3768. # Timeout for socket operations
  3769. timeout = support.LOOPBACK_TIMEOUT
  3770. # Provide setAlarm() method to schedule delivery of SIGALRM after
  3771. # given number of seconds, or cancel it if zero, and an
  3772. # appropriate time value to use. Use setitimer() if available.
  3773. if hasattr(signal, "setitimer"):
  3774. alarm_time = 0.05
  3775. def setAlarm(self, seconds):
  3776. signal.setitimer(signal.ITIMER_REAL, seconds)
  3777. else:
  3778. # Old systems may deliver the alarm up to one second early
  3779. alarm_time = 2
  3780. def setAlarm(self, seconds):
  3781. signal.alarm(seconds)
  3782. # Require siginterrupt() in order to ensure that system calls are
  3783. # interrupted by default.
  3784. @requireAttrs(signal, "siginterrupt")
  3785. @unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
  3786. "Don't have signal.alarm or signal.setitimer")
  3787. class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
  3788. # Test interrupting the recv*() methods with signals when a
  3789. # timeout is set.
  3790. def setUp(self):
  3791. super().setUp()
  3792. self.serv.settimeout(self.timeout)
  3793. def checkInterruptedRecv(self, func, *args, **kwargs):
  3794. # Check that func(*args, **kwargs) raises
  3795. # errno of EINTR when interrupted by a signal.
  3796. try:
  3797. self.setAlarm(self.alarm_time)
  3798. with self.assertRaises(ZeroDivisionError) as cm:
  3799. func(*args, **kwargs)
  3800. finally:
  3801. self.setAlarm(0)
  3802. def testInterruptedRecvTimeout(self):
  3803. self.checkInterruptedRecv(self.serv.recv, 1024)
  3804. def testInterruptedRecvIntoTimeout(self):
  3805. self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
  3806. def testInterruptedRecvfromTimeout(self):
  3807. self.checkInterruptedRecv(self.serv.recvfrom, 1024)
  3808. def testInterruptedRecvfromIntoTimeout(self):
  3809. self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
  3810. @requireAttrs(socket.socket, "recvmsg")
  3811. def testInterruptedRecvmsgTimeout(self):
  3812. self.checkInterruptedRecv(self.serv.recvmsg, 1024)
  3813. @requireAttrs(socket.socket, "recvmsg_into")
  3814. def testInterruptedRecvmsgIntoTimeout(self):
  3815. self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
  3816. # Require siginterrupt() in order to ensure that system calls are
  3817. # interrupted by default.
  3818. @requireAttrs(signal, "siginterrupt")
  3819. @unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
  3820. "Don't have signal.alarm or signal.setitimer")
  3821. class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
  3822. ThreadSafeCleanupTestCase,
  3823. SocketListeningTestMixin, TCPTestBase):
  3824. # Test interrupting the interruptible send*() methods with signals
  3825. # when a timeout is set.
  3826. def setUp(self):
  3827. super().setUp()
  3828. self.serv_conn = self.newSocket()
  3829. self.addCleanup(self.serv_conn.close)
  3830. # Use a thread to complete the connection, but wait for it to
  3831. # terminate before running the test, so that there is only one
  3832. # thread to accept the signal.
  3833. cli_thread = threading.Thread(target=self.doConnect)
  3834. cli_thread.start()
  3835. self.cli_conn, addr = self.serv.accept()
  3836. self.addCleanup(self.cli_conn.close)
  3837. cli_thread.join()
  3838. self.serv_conn.settimeout(self.timeout)
  3839. def doConnect(self):
  3840. self.serv_conn.connect(self.serv_addr)
  3841. def checkInterruptedSend(self, func, *args, **kwargs):
  3842. # Check that func(*args, **kwargs), run in a loop, raises
  3843. # OSError with an errno of EINTR when interrupted by a
  3844. # signal.
  3845. try:
  3846. with self.assertRaises(ZeroDivisionError) as cm:
  3847. while True:
  3848. self.setAlarm(self.alarm_time)
  3849. func(*args, **kwargs)
  3850. finally:
  3851. self.setAlarm(0)
  3852. # Issue #12958: The following tests have problems on OS X prior to 10.7
  3853. @support.requires_mac_ver(10, 7)
  3854. def testInterruptedSendTimeout(self):
  3855. self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
  3856. @support.requires_mac_ver(10, 7)
  3857. def testInterruptedSendtoTimeout(self):
  3858. # Passing an actual address here as Python's wrapper for
  3859. # sendto() doesn't allow passing a zero-length one; POSIX
  3860. # requires that the address is ignored since the socket is
  3861. # connection-mode, however.
  3862. self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
  3863. self.serv_addr)
  3864. @support.requires_mac_ver(10, 7)
  3865. @requireAttrs(socket.socket, "sendmsg")
  3866. def testInterruptedSendmsgTimeout(self):
  3867. self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
  3868. class TCPCloserTest(ThreadedTCPSocketTest):
  3869. def testClose(self):
  3870. conn, addr = self.serv.accept()
  3871. conn.close()
  3872. sd = self.cli
  3873. read, write, err = select.select([sd], [], [], 1.0)
  3874. self.assertEqual(read, [sd])
  3875. self.assertEqual(sd.recv(1), b'')
  3876. # Calling close() many times should be safe.
  3877. conn.close()
  3878. conn.close()
  3879. def _testClose(self):
  3880. self.cli.connect((HOST, self.port))
  3881. time.sleep(1.0)
  3882. class BasicSocketPairTest(SocketPairTest):
  3883. def __init__(self, methodName='runTest'):
  3884. SocketPairTest.__init__(self, methodName=methodName)
  3885. def _check_defaults(self, sock):
  3886. self.assertIsInstance(sock, socket.socket)
  3887. if hasattr(socket, 'AF_UNIX'):
  3888. self.assertEqual(sock.family, socket.AF_UNIX)
  3889. else:
  3890. self.assertEqual(sock.family, socket.AF_INET)
  3891. self.assertEqual(sock.type, socket.SOCK_STREAM)
  3892. self.assertEqual(sock.proto, 0)
  3893. def _testDefaults(self):
  3894. self._check_defaults(self.cli)
  3895. def testDefaults(self):
  3896. self._check_defaults(self.serv)
  3897. def testRecv(self):
  3898. msg = self.serv.recv(1024)
  3899. self.assertEqual(msg, MSG)
  3900. def _testRecv(self):
  3901. self.cli.send(MSG)
  3902. def testSend(self):
  3903. self.serv.send(MSG)
  3904. def _testSend(self):
  3905. msg = self.cli.recv(1024)
  3906. self.assertEqual(msg, MSG)
  3907. class NonBlockingTCPTests(ThreadedTCPSocketTest):
  3908. def __init__(self, methodName='runTest'):
  3909. self.event = threading.Event()
  3910. ThreadedTCPSocketTest.__init__(self, methodName=methodName)
  3911. def assert_sock_timeout(self, sock, timeout):
  3912. self.assertEqual(self.serv.gettimeout(), timeout)
  3913. blocking = (timeout != 0.0)
  3914. self.assertEqual(sock.getblocking(), blocking)
  3915. if fcntl is not None:
  3916. # When a Python socket has a non-zero timeout, it's switched
  3917. # internally to a non-blocking mode. Later, sock.sendall(),
  3918. # sock.recv(), and other socket operations use a select() call and
  3919. # handle EWOULDBLOCK/EGAIN on all socket operations. That's how
  3920. # timeouts are enforced.
  3921. fd_blocking = (timeout is None)
  3922. flag = fcntl.fcntl(sock, fcntl.F_GETFL, os.O_NONBLOCK)
  3923. self.assertEqual(not bool(flag & os.O_NONBLOCK), fd_blocking)
  3924. def testSetBlocking(self):
  3925. # Test setblocking() and settimeout() methods
  3926. self.serv.setblocking(True)
  3927. self.assert_sock_timeout(self.serv, None)
  3928. self.serv.setblocking(False)
  3929. self.assert_sock_timeout(self.serv, 0.0)
  3930. self.serv.settimeout(None)
  3931. self.assert_sock_timeout(self.serv, None)
  3932. self.serv.settimeout(0)
  3933. self.assert_sock_timeout(self.serv, 0)
  3934. self.serv.settimeout(10)
  3935. self.assert_sock_timeout(self.serv, 10)
  3936. self.serv.settimeout(0)
  3937. self.assert_sock_timeout(self.serv, 0)
  3938. def _testSetBlocking(self):
  3939. pass
  3940. @support.cpython_only
  3941. def testSetBlocking_overflow(self):
  3942. # Issue 15989
  3943. import _testcapi
  3944. if _testcapi.UINT_MAX >= _testcapi.ULONG_MAX:
  3945. self.skipTest('needs UINT_MAX < ULONG_MAX')
  3946. self.serv.setblocking(False)
  3947. self.assertEqual(self.serv.gettimeout(), 0.0)
  3948. self.serv.setblocking(_testcapi.UINT_MAX + 1)
  3949. self.assertIsNone(self.serv.gettimeout())
  3950. _testSetBlocking_overflow = support.cpython_only(_testSetBlocking)
  3951. @unittest.skipUnless(hasattr(socket, 'SOCK_NONBLOCK'),
  3952. 'test needs socket.SOCK_NONBLOCK')
  3953. @support.requires_linux_version(2, 6, 28)
  3954. def testInitNonBlocking(self):
  3955. # create a socket with SOCK_NONBLOCK
  3956. self.serv.close()
  3957. self.serv = socket.socket(socket.AF_INET,
  3958. socket.SOCK_STREAM | socket.SOCK_NONBLOCK)
  3959. self.assert_sock_timeout(self.serv, 0)
  3960. def _testInitNonBlocking(self):
  3961. pass
  3962. def testInheritFlagsBlocking(self):
  3963. # bpo-7995: accept() on a listening socket with a timeout and the
  3964. # default timeout is None, the resulting socket must be blocking.
  3965. with socket_setdefaulttimeout(None):
  3966. self.serv.settimeout(10)
  3967. conn, addr = self.serv.accept()
  3968. self.addCleanup(conn.close)
  3969. self.assertIsNone(conn.gettimeout())
  3970. def _testInheritFlagsBlocking(self):
  3971. self.cli.connect((HOST, self.port))
  3972. def testInheritFlagsTimeout(self):
  3973. # bpo-7995: accept() on a listening socket with a timeout and the
  3974. # default timeout is None, the resulting socket must inherit
  3975. # the default timeout.
  3976. default_timeout = 20.0
  3977. with socket_setdefaulttimeout(default_timeout):
  3978. self.serv.settimeout(10)
  3979. conn, addr = self.serv.accept()
  3980. self.addCleanup(conn.close)
  3981. self.assertEqual(conn.gettimeout(), default_timeout)
  3982. def _testInheritFlagsTimeout(self):
  3983. self.cli.connect((HOST, self.port))
  3984. def testAccept(self):
  3985. # Testing non-blocking accept
  3986. self.serv.setblocking(False)
  3987. # connect() didn't start: non-blocking accept() fails
  3988. start_time = time.monotonic()
  3989. with self.assertRaises(BlockingIOError):
  3990. conn, addr = self.serv.accept()
  3991. dt = time.monotonic() - start_time
  3992. self.assertLess(dt, 1.0)
  3993. self.event.set()
  3994. read, write, err = select.select([self.serv], [], [], support.LONG_TIMEOUT)
  3995. if self.serv not in read:
  3996. self.fail("Error trying to do accept after select.")
  3997. # connect() completed: non-blocking accept() doesn't block
  3998. conn, addr = self.serv.accept()
  3999. self.addCleanup(conn.close)
  4000. self.assertIsNone(conn.gettimeout())
  4001. def _testAccept(self):
  4002. # don't connect before event is set to check
  4003. # that non-blocking accept() raises BlockingIOError
  4004. self.event.wait()
  4005. self.cli.connect((HOST, self.port))
  4006. def testRecv(self):
  4007. # Testing non-blocking recv
  4008. conn, addr = self.serv.accept()
  4009. self.addCleanup(conn.close)
  4010. conn.setblocking(False)
  4011. # the server didn't send data yet: non-blocking recv() fails
  4012. with self.assertRaises(BlockingIOError):
  4013. msg = conn.recv(len(MSG))
  4014. self.event.set()
  4015. read, write, err = select.select([conn], [], [], support.LONG_TIMEOUT)
  4016. if conn not in read:
  4017. self.fail("Error during select call to non-blocking socket.")
  4018. # the server sent data yet: non-blocking recv() doesn't block
  4019. msg = conn.recv(len(MSG))
  4020. self.assertEqual(msg, MSG)
  4021. def _testRecv(self):
  4022. self.cli.connect((HOST, self.port))
  4023. # don't send anything before event is set to check
  4024. # that non-blocking recv() raises BlockingIOError
  4025. self.event.wait()
  4026. # send data: recv() will no longer block
  4027. self.cli.sendall(MSG)
  4028. class FileObjectClassTestCase(SocketConnectedTest):
  4029. """Unit tests for the object returned by socket.makefile()
  4030. self.read_file is the io object returned by makefile() on
  4031. the client connection. You can read from this file to
  4032. get output from the server.
  4033. self.write_file is the io object returned by makefile() on the
  4034. server connection. You can write to this file to send output
  4035. to the client.
  4036. """
  4037. bufsize = -1 # Use default buffer size
  4038. encoding = 'utf-8'
  4039. errors = 'strict'
  4040. newline = None
  4041. read_mode = 'rb'
  4042. read_msg = MSG
  4043. write_mode = 'wb'
  4044. write_msg = MSG
  4045. def __init__(self, methodName='runTest'):
  4046. SocketConnectedTest.__init__(self, methodName=methodName)
  4047. def setUp(self):
  4048. self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
  4049. threading.Event() for i in range(4)]
  4050. SocketConnectedTest.setUp(self)
  4051. self.read_file = self.cli_conn.makefile(
  4052. self.read_mode, self.bufsize,
  4053. encoding = self.encoding,
  4054. errors = self.errors,
  4055. newline = self.newline)
  4056. def tearDown(self):
  4057. self.serv_finished.set()
  4058. self.read_file.close()
  4059. self.assertTrue(self.read_file.closed)
  4060. self.read_file = None
  4061. SocketConnectedTest.tearDown(self)
  4062. def clientSetUp(self):
  4063. SocketConnectedTest.clientSetUp(self)
  4064. self.write_file = self.serv_conn.makefile(
  4065. self.write_mode, self.bufsize,
  4066. encoding = self.encoding,
  4067. errors = self.errors,
  4068. newline = self.newline)
  4069. def clientTearDown(self):
  4070. self.cli_finished.set()
  4071. self.write_file.close()
  4072. self.assertTrue(self.write_file.closed)
  4073. self.write_file = None
  4074. SocketConnectedTest.clientTearDown(self)
  4075. def testReadAfterTimeout(self):
  4076. # Issue #7322: A file object must disallow further reads
  4077. # after a timeout has occurred.
  4078. self.cli_conn.settimeout(1)
  4079. self.read_file.read(3)
  4080. # First read raises a timeout
  4081. self.assertRaises(TimeoutError, self.read_file.read, 1)
  4082. # Second read is disallowed
  4083. with self.assertRaises(OSError) as ctx:
  4084. self.read_file.read(1)
  4085. self.assertIn("cannot read from timed out object", str(ctx.exception))
  4086. def _testReadAfterTimeout(self):
  4087. self.write_file.write(self.write_msg[0:3])
  4088. self.write_file.flush()
  4089. self.serv_finished.wait()
  4090. def testSmallRead(self):
  4091. # Performing small file read test
  4092. first_seg = self.read_file.read(len(self.read_msg)-3)
  4093. second_seg = self.read_file.read(3)
  4094. msg = first_seg + second_seg
  4095. self.assertEqual(msg, self.read_msg)
  4096. def _testSmallRead(self):
  4097. self.write_file.write(self.write_msg)
  4098. self.write_file.flush()
  4099. def testFullRead(self):
  4100. # read until EOF
  4101. msg = self.read_file.read()
  4102. self.assertEqual(msg, self.read_msg)
  4103. def _testFullRead(self):
  4104. self.write_file.write(self.write_msg)
  4105. self.write_file.close()
  4106. def testUnbufferedRead(self):
  4107. # Performing unbuffered file read test
  4108. buf = type(self.read_msg)()
  4109. while 1:
  4110. char = self.read_file.read(1)
  4111. if not char:
  4112. break
  4113. buf += char
  4114. self.assertEqual(buf, self.read_msg)
  4115. def _testUnbufferedRead(self):
  4116. self.write_file.write(self.write_msg)
  4117. self.write_file.flush()
  4118. def testReadline(self):
  4119. # Performing file readline test
  4120. line = self.read_file.readline()
  4121. self.assertEqual(line, self.read_msg)
  4122. def _testReadline(self):
  4123. self.write_file.write(self.write_msg)
  4124. self.write_file.flush()
  4125. def testCloseAfterMakefile(self):
  4126. # The file returned by makefile should keep the socket open.
  4127. self.cli_conn.close()
  4128. # read until EOF
  4129. msg = self.read_file.read()
  4130. self.assertEqual(msg, self.read_msg)
  4131. def _testCloseAfterMakefile(self):
  4132. self.write_file.write(self.write_msg)
  4133. self.write_file.flush()
  4134. def testMakefileAfterMakefileClose(self):
  4135. self.read_file.close()
  4136. msg = self.cli_conn.recv(len(MSG))
  4137. if isinstance(self.read_msg, str):
  4138. msg = msg.decode()
  4139. self.assertEqual(msg, self.read_msg)
  4140. def _testMakefileAfterMakefileClose(self):
  4141. self.write_file.write(self.write_msg)
  4142. self.write_file.flush()
  4143. def testClosedAttr(self):
  4144. self.assertTrue(not self.read_file.closed)
  4145. def _testClosedAttr(self):
  4146. self.assertTrue(not self.write_file.closed)
  4147. def testAttributes(self):
  4148. self.assertEqual(self.read_file.mode, self.read_mode)
  4149. self.assertEqual(self.read_file.name, self.cli_conn.fileno())
  4150. def _testAttributes(self):
  4151. self.assertEqual(self.write_file.mode, self.write_mode)
  4152. self.assertEqual(self.write_file.name, self.serv_conn.fileno())
  4153. def testRealClose(self):
  4154. self.read_file.close()
  4155. self.assertRaises(ValueError, self.read_file.fileno)
  4156. self.cli_conn.close()
  4157. self.assertRaises(OSError, self.cli_conn.getsockname)
  4158. def _testRealClose(self):
  4159. pass
  4160. class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
  4161. """Repeat the tests from FileObjectClassTestCase with bufsize==0.
  4162. In this case (and in this case only), it should be possible to
  4163. create a file object, read a line from it, create another file
  4164. object, read another line from it, without loss of data in the
  4165. first file object's buffer. Note that http.client relies on this
  4166. when reading multiple requests from the same socket."""
  4167. bufsize = 0 # Use unbuffered mode
  4168. def testUnbufferedReadline(self):
  4169. # Read a line, create a new file object, read another line with it
  4170. line = self.read_file.readline() # first line
  4171. self.assertEqual(line, b"A. " + self.write_msg) # first line
  4172. self.read_file = self.cli_conn.makefile('rb', 0)
  4173. line = self.read_file.readline() # second line
  4174. self.assertEqual(line, b"B. " + self.write_msg) # second line
  4175. def _testUnbufferedReadline(self):
  4176. self.write_file.write(b"A. " + self.write_msg)
  4177. self.write_file.write(b"B. " + self.write_msg)
  4178. self.write_file.flush()
  4179. def testMakefileClose(self):
  4180. # The file returned by makefile should keep the socket open...
  4181. self.cli_conn.close()
  4182. msg = self.cli_conn.recv(1024)
  4183. self.assertEqual(msg, self.read_msg)
  4184. # ...until the file is itself closed
  4185. self.read_file.close()
  4186. self.assertRaises(OSError, self.cli_conn.recv, 1024)
  4187. def _testMakefileClose(self):
  4188. self.write_file.write(self.write_msg)
  4189. self.write_file.flush()
  4190. def testMakefileCloseSocketDestroy(self):
  4191. refcount_before = sys.getrefcount(self.cli_conn)
  4192. self.read_file.close()
  4193. refcount_after = sys.getrefcount(self.cli_conn)
  4194. self.assertEqual(refcount_before - 1, refcount_after)
  4195. def _testMakefileCloseSocketDestroy(self):
  4196. pass
  4197. # Non-blocking ops
  4198. # NOTE: to set `read_file` as non-blocking, we must call
  4199. # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
  4200. def testSmallReadNonBlocking(self):
  4201. self.cli_conn.setblocking(False)
  4202. self.assertEqual(self.read_file.readinto(bytearray(10)), None)
  4203. self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
  4204. self.evt1.set()
  4205. self.evt2.wait(1.0)
  4206. first_seg = self.read_file.read(len(self.read_msg) - 3)
  4207. if first_seg is None:
  4208. # Data not arrived (can happen under Windows), wait a bit
  4209. time.sleep(0.5)
  4210. first_seg = self.read_file.read(len(self.read_msg) - 3)
  4211. buf = bytearray(10)
  4212. n = self.read_file.readinto(buf)
  4213. self.assertEqual(n, 3)
  4214. msg = first_seg + buf[:n]
  4215. self.assertEqual(msg, self.read_msg)
  4216. self.assertEqual(self.read_file.readinto(bytearray(16)), None)
  4217. self.assertEqual(self.read_file.read(1), None)
  4218. def _testSmallReadNonBlocking(self):
  4219. self.evt1.wait(1.0)
  4220. self.write_file.write(self.write_msg)
  4221. self.write_file.flush()
  4222. self.evt2.set()
  4223. # Avoid closing the socket before the server test has finished,
  4224. # otherwise system recv() will return 0 instead of EWOULDBLOCK.
  4225. self.serv_finished.wait(5.0)
  4226. def testWriteNonBlocking(self):
  4227. self.cli_finished.wait(5.0)
  4228. # The client thread can't skip directly - the SkipTest exception
  4229. # would appear as a failure.
  4230. if self.serv_skipped:
  4231. self.skipTest(self.serv_skipped)
  4232. def _testWriteNonBlocking(self):
  4233. self.serv_skipped = None
  4234. self.serv_conn.setblocking(False)
  4235. # Try to saturate the socket buffer pipe with repeated large writes.
  4236. BIG = b"x" * support.SOCK_MAX_SIZE
  4237. LIMIT = 10
  4238. # The first write() succeeds since a chunk of data can be buffered
  4239. n = self.write_file.write(BIG)
  4240. self.assertGreater(n, 0)
  4241. for i in range(LIMIT):
  4242. n = self.write_file.write(BIG)
  4243. if n is None:
  4244. # Succeeded
  4245. break
  4246. self.assertGreater(n, 0)
  4247. else:
  4248. # Let us know that this test didn't manage to establish
  4249. # the expected conditions. This is not a failure in itself but,
  4250. # if it happens repeatedly, the test should be fixed.
  4251. self.serv_skipped = "failed to saturate the socket buffer"
  4252. class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
  4253. bufsize = 1 # Default-buffered for reading; line-buffered for writing
  4254. class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
  4255. bufsize = 2 # Exercise the buffering code
  4256. class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
  4257. """Tests for socket.makefile() in text mode (rather than binary)"""
  4258. read_mode = 'r'
  4259. read_msg = MSG.decode('utf-8')
  4260. write_mode = 'wb'
  4261. write_msg = MSG
  4262. newline = ''
  4263. class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
  4264. """Tests for socket.makefile() in text mode (rather than binary)"""
  4265. read_mode = 'rb'
  4266. read_msg = MSG
  4267. write_mode = 'w'
  4268. write_msg = MSG.decode('utf-8')
  4269. newline = ''
  4270. class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
  4271. """Tests for socket.makefile() in text mode (rather than binary)"""
  4272. read_mode = 'r'
  4273. read_msg = MSG.decode('utf-8')
  4274. write_mode = 'w'
  4275. write_msg = MSG.decode('utf-8')
  4276. newline = ''
  4277. class NetworkConnectionTest(object):
  4278. """Prove network connection."""
  4279. def clientSetUp(self):
  4280. # We're inherited below by BasicTCPTest2, which also inherits
  4281. # BasicTCPTest, which defines self.port referenced below.
  4282. self.cli = socket.create_connection((HOST, self.port))
  4283. self.serv_conn = self.cli
  4284. class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
  4285. """Tests that NetworkConnection does not break existing TCP functionality.
  4286. """
  4287. class NetworkConnectionNoServer(unittest.TestCase):
  4288. class MockSocket(socket.socket):
  4289. def connect(self, *args):
  4290. raise TimeoutError('timed out')
  4291. @contextlib.contextmanager
  4292. def mocked_socket_module(self):
  4293. """Return a socket which times out on connect"""
  4294. old_socket = socket.socket
  4295. socket.socket = self.MockSocket
  4296. try:
  4297. yield
  4298. finally:
  4299. socket.socket = old_socket
  4300. def test_connect(self):
  4301. port = socket_helper.find_unused_port()
  4302. cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  4303. self.addCleanup(cli.close)
  4304. with self.assertRaises(OSError) as cm:
  4305. cli.connect((HOST, port))
  4306. self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
  4307. def test_create_connection(self):
  4308. # Issue #9792: errors raised by create_connection() should have
  4309. # a proper errno attribute.
  4310. port = socket_helper.find_unused_port()
  4311. with self.assertRaises(OSError) as cm:
  4312. socket.create_connection((HOST, port))
  4313. # Issue #16257: create_connection() calls getaddrinfo() against
  4314. # 'localhost'. This may result in an IPV6 addr being returned
  4315. # as well as an IPV4 one:
  4316. # >>> socket.getaddrinfo('localhost', port, 0, SOCK_STREAM)
  4317. # >>> [(2, 2, 0, '', ('127.0.0.1', 41230)),
  4318. # (26, 2, 0, '', ('::1', 41230, 0, 0))]
  4319. #
  4320. # create_connection() enumerates through all the addresses returned
  4321. # and if it doesn't successfully bind to any of them, it propagates
  4322. # the last exception it encountered.
  4323. #
  4324. # On Solaris, ENETUNREACH is returned in this circumstance instead
  4325. # of ECONNREFUSED. So, if that errno exists, add it to our list of
  4326. # expected errnos.
  4327. expected_errnos = socket_helper.get_socket_conn_refused_errs()
  4328. self.assertIn(cm.exception.errno, expected_errnos)
  4329. def test_create_connection_all_errors(self):
  4330. port = socket_helper.find_unused_port()
  4331. try:
  4332. socket.create_connection((HOST, port), all_errors=True)
  4333. except ExceptionGroup as e:
  4334. eg = e
  4335. else:
  4336. self.fail('expected connection to fail')
  4337. self.assertIsInstance(eg, ExceptionGroup)
  4338. for e in eg.exceptions:
  4339. self.assertIsInstance(e, OSError)
  4340. addresses = socket.getaddrinfo(
  4341. 'localhost', port, 0, socket.SOCK_STREAM)
  4342. # assert that we got an exception for each address
  4343. self.assertEqual(len(addresses), len(eg.exceptions))
  4344. def test_create_connection_timeout(self):
  4345. # Issue #9792: create_connection() should not recast timeout errors
  4346. # as generic socket errors.
  4347. with self.mocked_socket_module():
  4348. try:
  4349. socket.create_connection((HOST, 1234))
  4350. except TimeoutError:
  4351. pass
  4352. except OSError as exc:
  4353. if socket_helper.IPV6_ENABLED or exc.errno != errno.EAFNOSUPPORT:
  4354. raise
  4355. else:
  4356. self.fail('TimeoutError not raised')
  4357. class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
  4358. def __init__(self, methodName='runTest'):
  4359. SocketTCPTest.__init__(self, methodName=methodName)
  4360. ThreadableTest.__init__(self)
  4361. def clientSetUp(self):
  4362. self.source_port = socket_helper.find_unused_port()
  4363. def clientTearDown(self):
  4364. self.cli.close()
  4365. self.cli = None
  4366. ThreadableTest.clientTearDown(self)
  4367. def _justAccept(self):
  4368. conn, addr = self.serv.accept()
  4369. conn.close()
  4370. testFamily = _justAccept
  4371. def _testFamily(self):
  4372. self.cli = socket.create_connection((HOST, self.port),
  4373. timeout=support.LOOPBACK_TIMEOUT)
  4374. self.addCleanup(self.cli.close)
  4375. self.assertEqual(self.cli.family, 2)
  4376. testSourceAddress = _justAccept
  4377. def _testSourceAddress(self):
  4378. self.cli = socket.create_connection((HOST, self.port),
  4379. timeout=support.LOOPBACK_TIMEOUT,
  4380. source_address=('', self.source_port))
  4381. self.addCleanup(self.cli.close)
  4382. self.assertEqual(self.cli.getsockname()[1], self.source_port)
  4383. # The port number being used is sufficient to show that the bind()
  4384. # call happened.
  4385. testTimeoutDefault = _justAccept
  4386. def _testTimeoutDefault(self):
  4387. # passing no explicit timeout uses socket's global default
  4388. self.assertTrue(socket.getdefaulttimeout() is None)
  4389. socket.setdefaulttimeout(42)
  4390. try:
  4391. self.cli = socket.create_connection((HOST, self.port))
  4392. self.addCleanup(self.cli.close)
  4393. finally:
  4394. socket.setdefaulttimeout(None)
  4395. self.assertEqual(self.cli.gettimeout(), 42)
  4396. testTimeoutNone = _justAccept
  4397. def _testTimeoutNone(self):
  4398. # None timeout means the same as sock.settimeout(None)
  4399. self.assertTrue(socket.getdefaulttimeout() is None)
  4400. socket.setdefaulttimeout(30)
  4401. try:
  4402. self.cli = socket.create_connection((HOST, self.port), timeout=None)
  4403. self.addCleanup(self.cli.close)
  4404. finally:
  4405. socket.setdefaulttimeout(None)
  4406. self.assertEqual(self.cli.gettimeout(), None)
  4407. testTimeoutValueNamed = _justAccept
  4408. def _testTimeoutValueNamed(self):
  4409. self.cli = socket.create_connection((HOST, self.port), timeout=30)
  4410. self.assertEqual(self.cli.gettimeout(), 30)
  4411. testTimeoutValueNonamed = _justAccept
  4412. def _testTimeoutValueNonamed(self):
  4413. self.cli = socket.create_connection((HOST, self.port), 30)
  4414. self.addCleanup(self.cli.close)
  4415. self.assertEqual(self.cli.gettimeout(), 30)
  4416. class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
  4417. def __init__(self, methodName='runTest'):
  4418. SocketTCPTest.__init__(self, methodName=methodName)
  4419. ThreadableTest.__init__(self)
  4420. def clientSetUp(self):
  4421. pass
  4422. def clientTearDown(self):
  4423. self.cli.close()
  4424. self.cli = None
  4425. ThreadableTest.clientTearDown(self)
  4426. def testInsideTimeout(self):
  4427. conn, addr = self.serv.accept()
  4428. self.addCleanup(conn.close)
  4429. time.sleep(3)
  4430. conn.send(b"done!")
  4431. testOutsideTimeout = testInsideTimeout
  4432. def _testInsideTimeout(self):
  4433. self.cli = sock = socket.create_connection((HOST, self.port))
  4434. data = sock.recv(5)
  4435. self.assertEqual(data, b"done!")
  4436. def _testOutsideTimeout(self):
  4437. self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
  4438. self.assertRaises(TimeoutError, lambda: sock.recv(5))
  4439. class TCPTimeoutTest(SocketTCPTest):
  4440. def testTCPTimeout(self):
  4441. def raise_timeout(*args, **kwargs):
  4442. self.serv.settimeout(1.0)
  4443. self.serv.accept()
  4444. self.assertRaises(TimeoutError, raise_timeout,
  4445. "Error generating a timeout exception (TCP)")
  4446. def testTimeoutZero(self):
  4447. ok = False
  4448. try:
  4449. self.serv.settimeout(0.0)
  4450. foo = self.serv.accept()
  4451. except TimeoutError:
  4452. self.fail("caught timeout instead of error (TCP)")
  4453. except OSError:
  4454. ok = True
  4455. except:
  4456. self.fail("caught unexpected exception (TCP)")
  4457. if not ok:
  4458. self.fail("accept() returned success when we did not expect it")
  4459. @unittest.skipUnless(hasattr(signal, 'alarm'),
  4460. 'test needs signal.alarm()')
  4461. def testInterruptedTimeout(self):
  4462. # XXX I don't know how to do this test on MSWindows or any other
  4463. # platform that doesn't support signal.alarm() or os.kill(), though
  4464. # the bug should have existed on all platforms.
  4465. self.serv.settimeout(5.0) # must be longer than alarm
  4466. class Alarm(Exception):
  4467. pass
  4468. def alarm_handler(signal, frame):
  4469. raise Alarm
  4470. old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
  4471. try:
  4472. try:
  4473. signal.alarm(2) # POSIX allows alarm to be up to 1 second early
  4474. foo = self.serv.accept()
  4475. except TimeoutError:
  4476. self.fail("caught timeout instead of Alarm")
  4477. except Alarm:
  4478. pass
  4479. except:
  4480. self.fail("caught other exception instead of Alarm:"
  4481. " %s(%s):\n%s" %
  4482. (sys.exc_info()[:2] + (traceback.format_exc(),)))
  4483. else:
  4484. self.fail("nothing caught")
  4485. finally:
  4486. signal.alarm(0) # shut off alarm
  4487. except Alarm:
  4488. self.fail("got Alarm in wrong place")
  4489. finally:
  4490. # no alarm can be pending. Safe to restore old handler.
  4491. signal.signal(signal.SIGALRM, old_alarm)
  4492. class UDPTimeoutTest(SocketUDPTest):
  4493. def testUDPTimeout(self):
  4494. def raise_timeout(*args, **kwargs):
  4495. self.serv.settimeout(1.0)
  4496. self.serv.recv(1024)
  4497. self.assertRaises(TimeoutError, raise_timeout,
  4498. "Error generating a timeout exception (UDP)")
  4499. def testTimeoutZero(self):
  4500. ok = False
  4501. try:
  4502. self.serv.settimeout(0.0)
  4503. foo = self.serv.recv(1024)
  4504. except TimeoutError:
  4505. self.fail("caught timeout instead of error (UDP)")
  4506. except OSError:
  4507. ok = True
  4508. except:
  4509. self.fail("caught unexpected exception (UDP)")
  4510. if not ok:
  4511. self.fail("recv() returned success when we did not expect it")
  4512. @unittest.skipUnless(HAVE_SOCKET_UDPLITE,
  4513. 'UDPLITE sockets required for this test.')
  4514. class UDPLITETimeoutTest(SocketUDPLITETest):
  4515. def testUDPLITETimeout(self):
  4516. def raise_timeout(*args, **kwargs):
  4517. self.serv.settimeout(1.0)
  4518. self.serv.recv(1024)
  4519. self.assertRaises(TimeoutError, raise_timeout,
  4520. "Error generating a timeout exception (UDPLITE)")
  4521. def testTimeoutZero(self):
  4522. ok = False
  4523. try:
  4524. self.serv.settimeout(0.0)
  4525. foo = self.serv.recv(1024)
  4526. except TimeoutError:
  4527. self.fail("caught timeout instead of error (UDPLITE)")
  4528. except OSError:
  4529. ok = True
  4530. except:
  4531. self.fail("caught unexpected exception (UDPLITE)")
  4532. if not ok:
  4533. self.fail("recv() returned success when we did not expect it")
  4534. class TestExceptions(unittest.TestCase):
  4535. def testExceptionTree(self):
  4536. self.assertTrue(issubclass(OSError, Exception))
  4537. self.assertTrue(issubclass(socket.herror, OSError))
  4538. self.assertTrue(issubclass(socket.gaierror, OSError))
  4539. self.assertTrue(issubclass(socket.timeout, OSError))
  4540. self.assertIs(socket.error, OSError)
  4541. self.assertIs(socket.timeout, TimeoutError)
  4542. def test_setblocking_invalidfd(self):
  4543. # Regression test for issue #28471
  4544. sock0 = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
  4545. sock = socket.socket(
  4546. socket.AF_INET, socket.SOCK_STREAM, 0, sock0.fileno())
  4547. sock0.close()
  4548. self.addCleanup(sock.detach)
  4549. with self.assertRaises(OSError):
  4550. sock.setblocking(False)
  4551. @unittest.skipUnless(sys.platform == 'linux', 'Linux specific test')
  4552. class TestLinuxAbstractNamespace(unittest.TestCase):
  4553. UNIX_PATH_MAX = 108
  4554. def testLinuxAbstractNamespace(self):
  4555. address = b"\x00python-test-hello\x00\xff"
  4556. with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
  4557. s1.bind(address)
  4558. s1.listen()
  4559. with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
  4560. s2.connect(s1.getsockname())
  4561. with s1.accept()[0] as s3:
  4562. self.assertEqual(s1.getsockname(), address)
  4563. self.assertEqual(s2.getpeername(), address)
  4564. def testMaxName(self):
  4565. address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
  4566. with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
  4567. s.bind(address)
  4568. self.assertEqual(s.getsockname(), address)
  4569. def testNameOverflow(self):
  4570. address = "\x00" + "h" * self.UNIX_PATH_MAX
  4571. with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
  4572. self.assertRaises(OSError, s.bind, address)
  4573. def testStrName(self):
  4574. # Check that an abstract name can be passed as a string.
  4575. s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
  4576. try:
  4577. s.bind("\x00python\x00test\x00")
  4578. self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
  4579. finally:
  4580. s.close()
  4581. def testBytearrayName(self):
  4582. # Check that an abstract name can be passed as a bytearray.
  4583. with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
  4584. s.bind(bytearray(b"\x00python\x00test\x00"))
  4585. self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
  4586. def testAutobind(self):
  4587. # Check that binding to an empty string binds to an available address
  4588. # in the abstract namespace as specified in unix(7) "Autobind feature".
  4589. abstract_address = b"^\0[0-9a-f]{5}"
  4590. with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
  4591. s1.bind("")
  4592. self.assertRegex(s1.getsockname(), abstract_address)
  4593. # Each socket is bound to a different abstract address.
  4594. with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
  4595. s2.bind("")
  4596. self.assertRegex(s2.getsockname(), abstract_address)
  4597. self.assertNotEqual(s1.getsockname(), s2.getsockname())
  4598. @unittest.skipUnless(hasattr(socket, 'AF_UNIX'), 'test needs socket.AF_UNIX')
  4599. class TestUnixDomain(unittest.TestCase):
  4600. def setUp(self):
  4601. self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
  4602. def tearDown(self):
  4603. self.sock.close()
  4604. def encoded(self, path):
  4605. # Return the given path encoded in the file system encoding,
  4606. # or skip the test if this is not possible.
  4607. try:
  4608. return os.fsencode(path)
  4609. except UnicodeEncodeError:
  4610. self.skipTest(
  4611. "Pathname {0!a} cannot be represented in file "
  4612. "system encoding {1!r}".format(
  4613. path, sys.getfilesystemencoding()))
  4614. def bind(self, sock, path):
  4615. # Bind the socket
  4616. try:
  4617. socket_helper.bind_unix_socket(sock, path)
  4618. except OSError as e:
  4619. if str(e) == "AF_UNIX path too long":
  4620. self.skipTest(
  4621. "Pathname {0!a} is too long to serve as an AF_UNIX path"
  4622. .format(path))
  4623. else:
  4624. raise
  4625. def testUnbound(self):
  4626. # Issue #30205 (note getsockname() can return None on OS X)
  4627. self.assertIn(self.sock.getsockname(), ('', None))
  4628. def testStrAddr(self):
  4629. # Test binding to and retrieving a normal string pathname.
  4630. path = os.path.abspath(os_helper.TESTFN)
  4631. self.bind(self.sock, path)
  4632. self.addCleanup(os_helper.unlink, path)
  4633. self.assertEqual(self.sock.getsockname(), path)
  4634. def testBytesAddr(self):
  4635. # Test binding to a bytes pathname.
  4636. path = os.path.abspath(os_helper.TESTFN)
  4637. self.bind(self.sock, self.encoded(path))
  4638. self.addCleanup(os_helper.unlink, path)
  4639. self.assertEqual(self.sock.getsockname(), path)
  4640. def testSurrogateescapeBind(self):
  4641. # Test binding to a valid non-ASCII pathname, with the
  4642. # non-ASCII bytes supplied using surrogateescape encoding.
  4643. path = os.path.abspath(os_helper.TESTFN_UNICODE)
  4644. b = self.encoded(path)
  4645. self.bind(self.sock, b.decode("ascii", "surrogateescape"))
  4646. self.addCleanup(os_helper.unlink, path)
  4647. self.assertEqual(self.sock.getsockname(), path)
  4648. def testUnencodableAddr(self):
  4649. # Test binding to a pathname that cannot be encoded in the
  4650. # file system encoding.
  4651. if os_helper.TESTFN_UNENCODABLE is None:
  4652. self.skipTest("No unencodable filename available")
  4653. path = os.path.abspath(os_helper.TESTFN_UNENCODABLE)
  4654. self.bind(self.sock, path)
  4655. self.addCleanup(os_helper.unlink, path)
  4656. self.assertEqual(self.sock.getsockname(), path)
  4657. @unittest.skipIf(sys.platform == 'linux', 'Linux specific test')
  4658. def testEmptyAddress(self):
  4659. # Test that binding empty address fails.
  4660. self.assertRaises(OSError, self.sock.bind, "")
  4661. class BufferIOTest(SocketConnectedTest):
  4662. """
  4663. Test the buffer versions of socket.recv() and socket.send().
  4664. """
  4665. def __init__(self, methodName='runTest'):
  4666. SocketConnectedTest.__init__(self, methodName=methodName)
  4667. def testRecvIntoArray(self):
  4668. buf = array.array("B", [0] * len(MSG))
  4669. nbytes = self.cli_conn.recv_into(buf)
  4670. self.assertEqual(nbytes, len(MSG))
  4671. buf = buf.tobytes()
  4672. msg = buf[:len(MSG)]
  4673. self.assertEqual(msg, MSG)
  4674. def _testRecvIntoArray(self):
  4675. buf = bytes(MSG)
  4676. self.serv_conn.send(buf)
  4677. def testRecvIntoBytearray(self):
  4678. buf = bytearray(1024)
  4679. nbytes = self.cli_conn.recv_into(buf)
  4680. self.assertEqual(nbytes, len(MSG))
  4681. msg = buf[:len(MSG)]
  4682. self.assertEqual(msg, MSG)
  4683. _testRecvIntoBytearray = _testRecvIntoArray
  4684. def testRecvIntoMemoryview(self):
  4685. buf = bytearray(1024)
  4686. nbytes = self.cli_conn.recv_into(memoryview(buf))
  4687. self.assertEqual(nbytes, len(MSG))
  4688. msg = buf[:len(MSG)]
  4689. self.assertEqual(msg, MSG)
  4690. _testRecvIntoMemoryview = _testRecvIntoArray
  4691. def testRecvFromIntoArray(self):
  4692. buf = array.array("B", [0] * len(MSG))
  4693. nbytes, addr = self.cli_conn.recvfrom_into(buf)
  4694. self.assertEqual(nbytes, len(MSG))
  4695. buf = buf.tobytes()
  4696. msg = buf[:len(MSG)]
  4697. self.assertEqual(msg, MSG)
  4698. def _testRecvFromIntoArray(self):
  4699. buf = bytes(MSG)
  4700. self.serv_conn.send(buf)
  4701. def testRecvFromIntoBytearray(self):
  4702. buf = bytearray(1024)
  4703. nbytes, addr = self.cli_conn.recvfrom_into(buf)
  4704. self.assertEqual(nbytes, len(MSG))
  4705. msg = buf[:len(MSG)]
  4706. self.assertEqual(msg, MSG)
  4707. _testRecvFromIntoBytearray = _testRecvFromIntoArray
  4708. def testRecvFromIntoMemoryview(self):
  4709. buf = bytearray(1024)
  4710. nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
  4711. self.assertEqual(nbytes, len(MSG))
  4712. msg = buf[:len(MSG)]
  4713. self.assertEqual(msg, MSG)
  4714. _testRecvFromIntoMemoryview = _testRecvFromIntoArray
  4715. def testRecvFromIntoSmallBuffer(self):
  4716. # See issue #20246.
  4717. buf = bytearray(8)
  4718. self.assertRaises(ValueError, self.cli_conn.recvfrom_into, buf, 1024)
  4719. def _testRecvFromIntoSmallBuffer(self):
  4720. self.serv_conn.send(MSG)
  4721. def testRecvFromIntoEmptyBuffer(self):
  4722. buf = bytearray()
  4723. self.cli_conn.recvfrom_into(buf)
  4724. self.cli_conn.recvfrom_into(buf, 0)
  4725. _testRecvFromIntoEmptyBuffer = _testRecvFromIntoArray
  4726. TIPC_STYPE = 2000
  4727. TIPC_LOWER = 200
  4728. TIPC_UPPER = 210
  4729. def isTipcAvailable():
  4730. """Check if the TIPC module is loaded
  4731. The TIPC module is not loaded automatically on Ubuntu and probably
  4732. other Linux distros.
  4733. """
  4734. if not hasattr(socket, "AF_TIPC"):
  4735. return False
  4736. try:
  4737. f = open("/proc/modules", encoding="utf-8")
  4738. except (FileNotFoundError, IsADirectoryError, PermissionError):
  4739. # It's ok if the file does not exist, is a directory or if we
  4740. # have not the permission to read it.
  4741. return False
  4742. with f:
  4743. for line in f:
  4744. if line.startswith("tipc "):
  4745. return True
  4746. return False
  4747. @unittest.skipUnless(isTipcAvailable(),
  4748. "TIPC module is not loaded, please 'sudo modprobe tipc'")
  4749. class TIPCTest(unittest.TestCase):
  4750. def testRDM(self):
  4751. srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
  4752. cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
  4753. self.addCleanup(srv.close)
  4754. self.addCleanup(cli.close)
  4755. srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  4756. srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
  4757. TIPC_LOWER, TIPC_UPPER)
  4758. srv.bind(srvaddr)
  4759. sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
  4760. TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
  4761. cli.sendto(MSG, sendaddr)
  4762. msg, recvaddr = srv.recvfrom(1024)
  4763. self.assertEqual(cli.getsockname(), recvaddr)
  4764. self.assertEqual(msg, MSG)
  4765. @unittest.skipUnless(isTipcAvailable(),
  4766. "TIPC module is not loaded, please 'sudo modprobe tipc'")
  4767. class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
  4768. def __init__(self, methodName = 'runTest'):
  4769. unittest.TestCase.__init__(self, methodName = methodName)
  4770. ThreadableTest.__init__(self)
  4771. def setUp(self):
  4772. self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
  4773. self.addCleanup(self.srv.close)
  4774. self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  4775. srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
  4776. TIPC_LOWER, TIPC_UPPER)
  4777. self.srv.bind(srvaddr)
  4778. self.srv.listen()
  4779. self.serverExplicitReady()
  4780. self.conn, self.connaddr = self.srv.accept()
  4781. self.addCleanup(self.conn.close)
  4782. def clientSetUp(self):
  4783. # There is a hittable race between serverExplicitReady() and the
  4784. # accept() call; sleep a little while to avoid it, otherwise
  4785. # we could get an exception
  4786. time.sleep(0.1)
  4787. self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
  4788. self.addCleanup(self.cli.close)
  4789. addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
  4790. TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
  4791. self.cli.connect(addr)
  4792. self.cliaddr = self.cli.getsockname()
  4793. def testStream(self):
  4794. msg = self.conn.recv(1024)
  4795. self.assertEqual(msg, MSG)
  4796. self.assertEqual(self.cliaddr, self.connaddr)
  4797. def _testStream(self):
  4798. self.cli.send(MSG)
  4799. self.cli.close()
  4800. class ContextManagersTest(ThreadedTCPSocketTest):
  4801. def _testSocketClass(self):
  4802. # base test
  4803. with socket.socket() as sock:
  4804. self.assertFalse(sock._closed)
  4805. self.assertTrue(sock._closed)
  4806. # close inside with block
  4807. with socket.socket() as sock:
  4808. sock.close()
  4809. self.assertTrue(sock._closed)
  4810. # exception inside with block
  4811. with socket.socket() as sock:
  4812. self.assertRaises(OSError, sock.sendall, b'foo')
  4813. self.assertTrue(sock._closed)
  4814. def testCreateConnectionBase(self):
  4815. conn, addr = self.serv.accept()
  4816. self.addCleanup(conn.close)
  4817. data = conn.recv(1024)
  4818. conn.sendall(data)
  4819. def _testCreateConnectionBase(self):
  4820. address = self.serv.getsockname()
  4821. with socket.create_connection(address) as sock:
  4822. self.assertFalse(sock._closed)
  4823. sock.sendall(b'foo')
  4824. self.assertEqual(sock.recv(1024), b'foo')
  4825. self.assertTrue(sock._closed)
  4826. def testCreateConnectionClose(self):
  4827. conn, addr = self.serv.accept()
  4828. self.addCleanup(conn.close)
  4829. data = conn.recv(1024)
  4830. conn.sendall(data)
  4831. def _testCreateConnectionClose(self):
  4832. address = self.serv.getsockname()
  4833. with socket.create_connection(address) as sock:
  4834. sock.close()
  4835. self.assertTrue(sock._closed)
  4836. self.assertRaises(OSError, sock.sendall, b'foo')
  4837. class InheritanceTest(unittest.TestCase):
  4838. @unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
  4839. "SOCK_CLOEXEC not defined")
  4840. @support.requires_linux_version(2, 6, 28)
  4841. def test_SOCK_CLOEXEC(self):
  4842. with socket.socket(socket.AF_INET,
  4843. socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
  4844. self.assertEqual(s.type, socket.SOCK_STREAM)
  4845. self.assertFalse(s.get_inheritable())
  4846. def test_default_inheritable(self):
  4847. sock = socket.socket()
  4848. with sock:
  4849. self.assertEqual(sock.get_inheritable(), False)
  4850. def test_dup(self):
  4851. sock = socket.socket()
  4852. with sock:
  4853. newsock = sock.dup()
  4854. sock.close()
  4855. with newsock:
  4856. self.assertEqual(newsock.get_inheritable(), False)
  4857. def test_set_inheritable(self):
  4858. sock = socket.socket()
  4859. with sock:
  4860. sock.set_inheritable(True)
  4861. self.assertEqual(sock.get_inheritable(), True)
  4862. sock.set_inheritable(False)
  4863. self.assertEqual(sock.get_inheritable(), False)
  4864. @unittest.skipIf(fcntl is None, "need fcntl")
  4865. def test_get_inheritable_cloexec(self):
  4866. sock = socket.socket()
  4867. with sock:
  4868. fd = sock.fileno()
  4869. self.assertEqual(sock.get_inheritable(), False)
  4870. # clear FD_CLOEXEC flag
  4871. flags = fcntl.fcntl(fd, fcntl.F_GETFD)
  4872. flags &= ~fcntl.FD_CLOEXEC
  4873. fcntl.fcntl(fd, fcntl.F_SETFD, flags)
  4874. self.assertEqual(sock.get_inheritable(), True)
  4875. @unittest.skipIf(fcntl is None, "need fcntl")
  4876. def test_set_inheritable_cloexec(self):
  4877. sock = socket.socket()
  4878. with sock:
  4879. fd = sock.fileno()
  4880. self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
  4881. fcntl.FD_CLOEXEC)
  4882. sock.set_inheritable(True)
  4883. self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
  4884. 0)
  4885. def test_socketpair(self):
  4886. s1, s2 = socket.socketpair()
  4887. self.addCleanup(s1.close)
  4888. self.addCleanup(s2.close)
  4889. self.assertEqual(s1.get_inheritable(), False)
  4890. self.assertEqual(s2.get_inheritable(), False)
  4891. @unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
  4892. "SOCK_NONBLOCK not defined")
  4893. class NonblockConstantTest(unittest.TestCase):
  4894. def checkNonblock(self, s, nonblock=True, timeout=0.0):
  4895. if nonblock:
  4896. self.assertEqual(s.type, socket.SOCK_STREAM)
  4897. self.assertEqual(s.gettimeout(), timeout)
  4898. self.assertTrue(
  4899. fcntl.fcntl(s, fcntl.F_GETFL, os.O_NONBLOCK) & os.O_NONBLOCK)
  4900. if timeout == 0:
  4901. # timeout == 0: means that getblocking() must be False.
  4902. self.assertFalse(s.getblocking())
  4903. else:
  4904. # If timeout > 0, the socket will be in a "blocking" mode
  4905. # from the standpoint of the Python API. For Python socket
  4906. # object, "blocking" means that operations like 'sock.recv()'
  4907. # will block. Internally, file descriptors for
  4908. # "blocking" Python sockets *with timeouts* are in a
  4909. # *non-blocking* mode, and 'sock.recv()' uses 'select()'
  4910. # and handles EWOULDBLOCK/EAGAIN to enforce the timeout.
  4911. self.assertTrue(s.getblocking())
  4912. else:
  4913. self.assertEqual(s.type, socket.SOCK_STREAM)
  4914. self.assertEqual(s.gettimeout(), None)
  4915. self.assertFalse(
  4916. fcntl.fcntl(s, fcntl.F_GETFL, os.O_NONBLOCK) & os.O_NONBLOCK)
  4917. self.assertTrue(s.getblocking())
  4918. @support.requires_linux_version(2, 6, 28)
  4919. def test_SOCK_NONBLOCK(self):
  4920. # a lot of it seems silly and redundant, but I wanted to test that
  4921. # changing back and forth worked ok
  4922. with socket.socket(socket.AF_INET,
  4923. socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
  4924. self.checkNonblock(s)
  4925. s.setblocking(True)
  4926. self.checkNonblock(s, nonblock=False)
  4927. s.setblocking(False)
  4928. self.checkNonblock(s)
  4929. s.settimeout(None)
  4930. self.checkNonblock(s, nonblock=False)
  4931. s.settimeout(2.0)
  4932. self.checkNonblock(s, timeout=2.0)
  4933. s.setblocking(True)
  4934. self.checkNonblock(s, nonblock=False)
  4935. # defaulttimeout
  4936. t = socket.getdefaulttimeout()
  4937. socket.setdefaulttimeout(0.0)
  4938. with socket.socket() as s:
  4939. self.checkNonblock(s)
  4940. socket.setdefaulttimeout(None)
  4941. with socket.socket() as s:
  4942. self.checkNonblock(s, False)
  4943. socket.setdefaulttimeout(2.0)
  4944. with socket.socket() as s:
  4945. self.checkNonblock(s, timeout=2.0)
  4946. socket.setdefaulttimeout(None)
  4947. with socket.socket() as s:
  4948. self.checkNonblock(s, False)
  4949. socket.setdefaulttimeout(t)
  4950. @unittest.skipUnless(os.name == "nt", "Windows specific")
  4951. @unittest.skipUnless(multiprocessing, "need multiprocessing")
  4952. class TestSocketSharing(SocketTCPTest):
  4953. # This must be classmethod and not staticmethod or multiprocessing
  4954. # won't be able to bootstrap it.
  4955. @classmethod
  4956. def remoteProcessServer(cls, q):
  4957. # Recreate socket from shared data
  4958. sdata = q.get()
  4959. message = q.get()
  4960. s = socket.fromshare(sdata)
  4961. s2, c = s.accept()
  4962. # Send the message
  4963. s2.sendall(message)
  4964. s2.close()
  4965. s.close()
  4966. def testShare(self):
  4967. # Transfer the listening server socket to another process
  4968. # and service it from there.
  4969. # Create process:
  4970. q = multiprocessing.Queue()
  4971. p = multiprocessing.Process(target=self.remoteProcessServer, args=(q,))
  4972. p.start()
  4973. # Get the shared socket data
  4974. data = self.serv.share(p.pid)
  4975. # Pass the shared socket to the other process
  4976. addr = self.serv.getsockname()
  4977. self.serv.close()
  4978. q.put(data)
  4979. # The data that the server will send us
  4980. message = b"slapmahfro"
  4981. q.put(message)
  4982. # Connect
  4983. s = socket.create_connection(addr)
  4984. # listen for the data
  4985. m = []
  4986. while True:
  4987. data = s.recv(100)
  4988. if not data:
  4989. break
  4990. m.append(data)
  4991. s.close()
  4992. received = b"".join(m)
  4993. self.assertEqual(received, message)
  4994. p.join()
  4995. def testShareLength(self):
  4996. data = self.serv.share(os.getpid())
  4997. self.assertRaises(ValueError, socket.fromshare, data[:-1])
  4998. self.assertRaises(ValueError, socket.fromshare, data+b"foo")
  4999. def compareSockets(self, org, other):
  5000. # socket sharing is expected to work only for blocking socket
  5001. # since the internal python timeout value isn't transferred.
  5002. self.assertEqual(org.gettimeout(), None)
  5003. self.assertEqual(org.gettimeout(), other.gettimeout())
  5004. self.assertEqual(org.family, other.family)
  5005. self.assertEqual(org.type, other.type)
  5006. # If the user specified "0" for proto, then
  5007. # internally windows will have picked the correct value.
  5008. # Python introspection on the socket however will still return
  5009. # 0. For the shared socket, the python value is recreated
  5010. # from the actual value, so it may not compare correctly.
  5011. if org.proto != 0:
  5012. self.assertEqual(org.proto, other.proto)
  5013. def testShareLocal(self):
  5014. data = self.serv.share(os.getpid())
  5015. s = socket.fromshare(data)
  5016. try:
  5017. self.compareSockets(self.serv, s)
  5018. finally:
  5019. s.close()
  5020. def testTypes(self):
  5021. families = [socket.AF_INET, socket.AF_INET6]
  5022. types = [socket.SOCK_STREAM, socket.SOCK_DGRAM]
  5023. for f in families:
  5024. for t in types:
  5025. try:
  5026. source = socket.socket(f, t)
  5027. except OSError:
  5028. continue # This combination is not supported
  5029. try:
  5030. data = source.share(os.getpid())
  5031. shared = socket.fromshare(data)
  5032. try:
  5033. self.compareSockets(source, shared)
  5034. finally:
  5035. shared.close()
  5036. finally:
  5037. source.close()
  5038. class SendfileUsingSendTest(ThreadedTCPSocketTest):
  5039. """
  5040. Test the send() implementation of socket.sendfile().
  5041. """
  5042. FILESIZE = (10 * 1024 * 1024) # 10 MiB
  5043. BUFSIZE = 8192
  5044. FILEDATA = b""
  5045. TIMEOUT = support.LOOPBACK_TIMEOUT
  5046. @classmethod
  5047. def setUpClass(cls):
  5048. def chunks(total, step):
  5049. assert total >= step
  5050. while total > step:
  5051. yield step
  5052. total -= step
  5053. if total:
  5054. yield total
  5055. chunk = b"".join([random.choice(string.ascii_letters).encode()
  5056. for i in range(cls.BUFSIZE)])
  5057. with open(os_helper.TESTFN, 'wb') as f:
  5058. for csize in chunks(cls.FILESIZE, cls.BUFSIZE):
  5059. f.write(chunk)
  5060. with open(os_helper.TESTFN, 'rb') as f:
  5061. cls.FILEDATA = f.read()
  5062. assert len(cls.FILEDATA) == cls.FILESIZE
  5063. @classmethod
  5064. def tearDownClass(cls):
  5065. os_helper.unlink(os_helper.TESTFN)
  5066. def accept_conn(self):
  5067. self.serv.settimeout(support.LONG_TIMEOUT)
  5068. conn, addr = self.serv.accept()
  5069. conn.settimeout(self.TIMEOUT)
  5070. self.addCleanup(conn.close)
  5071. return conn
  5072. def recv_data(self, conn):
  5073. received = []
  5074. while True:
  5075. chunk = conn.recv(self.BUFSIZE)
  5076. if not chunk:
  5077. break
  5078. received.append(chunk)
  5079. return b''.join(received)
  5080. def meth_from_sock(self, sock):
  5081. # Depending on the mixin class being run return either send()
  5082. # or sendfile() method implementation.
  5083. return getattr(sock, "_sendfile_use_send")
  5084. # regular file
  5085. def _testRegularFile(self):
  5086. address = self.serv.getsockname()
  5087. file = open(os_helper.TESTFN, 'rb')
  5088. with socket.create_connection(address) as sock, file as file:
  5089. meth = self.meth_from_sock(sock)
  5090. sent = meth(file)
  5091. self.assertEqual(sent, self.FILESIZE)
  5092. self.assertEqual(file.tell(), self.FILESIZE)
  5093. def testRegularFile(self):
  5094. conn = self.accept_conn()
  5095. data = self.recv_data(conn)
  5096. self.assertEqual(len(data), self.FILESIZE)
  5097. self.assertEqual(data, self.FILEDATA)
  5098. # non regular file
  5099. def _testNonRegularFile(self):
  5100. address = self.serv.getsockname()
  5101. file = io.BytesIO(self.FILEDATA)
  5102. with socket.create_connection(address) as sock, file as file:
  5103. sent = sock.sendfile(file)
  5104. self.assertEqual(sent, self.FILESIZE)
  5105. self.assertEqual(file.tell(), self.FILESIZE)
  5106. self.assertRaises(socket._GiveupOnSendfile,
  5107. sock._sendfile_use_sendfile, file)
  5108. def testNonRegularFile(self):
  5109. conn = self.accept_conn()
  5110. data = self.recv_data(conn)
  5111. self.assertEqual(len(data), self.FILESIZE)
  5112. self.assertEqual(data, self.FILEDATA)
  5113. # empty file
  5114. def _testEmptyFileSend(self):
  5115. address = self.serv.getsockname()
  5116. filename = os_helper.TESTFN + "2"
  5117. with open(filename, 'wb'):
  5118. self.addCleanup(os_helper.unlink, filename)
  5119. file = open(filename, 'rb')
  5120. with socket.create_connection(address) as sock, file as file:
  5121. meth = self.meth_from_sock(sock)
  5122. sent = meth(file)
  5123. self.assertEqual(sent, 0)
  5124. self.assertEqual(file.tell(), 0)
  5125. def testEmptyFileSend(self):
  5126. conn = self.accept_conn()
  5127. data = self.recv_data(conn)
  5128. self.assertEqual(data, b"")
  5129. # offset
  5130. def _testOffset(self):
  5131. address = self.serv.getsockname()
  5132. file = open(os_helper.TESTFN, 'rb')
  5133. with socket.create_connection(address) as sock, file as file:
  5134. meth = self.meth_from_sock(sock)
  5135. sent = meth(file, offset=5000)
  5136. self.assertEqual(sent, self.FILESIZE - 5000)
  5137. self.assertEqual(file.tell(), self.FILESIZE)
  5138. def testOffset(self):
  5139. conn = self.accept_conn()
  5140. data = self.recv_data(conn)
  5141. self.assertEqual(len(data), self.FILESIZE - 5000)
  5142. self.assertEqual(data, self.FILEDATA[5000:])
  5143. # count
  5144. def _testCount(self):
  5145. address = self.serv.getsockname()
  5146. file = open(os_helper.TESTFN, 'rb')
  5147. sock = socket.create_connection(address,
  5148. timeout=support.LOOPBACK_TIMEOUT)
  5149. with sock, file:
  5150. count = 5000007
  5151. meth = self.meth_from_sock(sock)
  5152. sent = meth(file, count=count)
  5153. self.assertEqual(sent, count)
  5154. self.assertEqual(file.tell(), count)
  5155. def testCount(self):
  5156. count = 5000007
  5157. conn = self.accept_conn()
  5158. data = self.recv_data(conn)
  5159. self.assertEqual(len(data), count)
  5160. self.assertEqual(data, self.FILEDATA[:count])
  5161. # count small
  5162. def _testCountSmall(self):
  5163. address = self.serv.getsockname()
  5164. file = open(os_helper.TESTFN, 'rb')
  5165. sock = socket.create_connection(address,
  5166. timeout=support.LOOPBACK_TIMEOUT)
  5167. with sock, file:
  5168. count = 1
  5169. meth = self.meth_from_sock(sock)
  5170. sent = meth(file, count=count)
  5171. self.assertEqual(sent, count)
  5172. self.assertEqual(file.tell(), count)
  5173. def testCountSmall(self):
  5174. count = 1
  5175. conn = self.accept_conn()
  5176. data = self.recv_data(conn)
  5177. self.assertEqual(len(data), count)
  5178. self.assertEqual(data, self.FILEDATA[:count])
  5179. # count + offset
  5180. def _testCountWithOffset(self):
  5181. address = self.serv.getsockname()
  5182. file = open(os_helper.TESTFN, 'rb')
  5183. with socket.create_connection(address, timeout=2) as sock, file as file:
  5184. count = 100007
  5185. meth = self.meth_from_sock(sock)
  5186. sent = meth(file, offset=2007, count=count)
  5187. self.assertEqual(sent, count)
  5188. self.assertEqual(file.tell(), count + 2007)
  5189. def testCountWithOffset(self):
  5190. count = 100007
  5191. conn = self.accept_conn()
  5192. data = self.recv_data(conn)
  5193. self.assertEqual(len(data), count)
  5194. self.assertEqual(data, self.FILEDATA[2007:count+2007])
  5195. # non blocking sockets are not supposed to work
  5196. def _testNonBlocking(self):
  5197. address = self.serv.getsockname()
  5198. file = open(os_helper.TESTFN, 'rb')
  5199. with socket.create_connection(address) as sock, file as file:
  5200. sock.setblocking(False)
  5201. meth = self.meth_from_sock(sock)
  5202. self.assertRaises(ValueError, meth, file)
  5203. self.assertRaises(ValueError, sock.sendfile, file)
  5204. def testNonBlocking(self):
  5205. conn = self.accept_conn()
  5206. if conn.recv(8192):
  5207. self.fail('was not supposed to receive any data')
  5208. # timeout (non-triggered)
  5209. def _testWithTimeout(self):
  5210. address = self.serv.getsockname()
  5211. file = open(os_helper.TESTFN, 'rb')
  5212. sock = socket.create_connection(address,
  5213. timeout=support.LOOPBACK_TIMEOUT)
  5214. with sock, file:
  5215. meth = self.meth_from_sock(sock)
  5216. sent = meth(file)
  5217. self.assertEqual(sent, self.FILESIZE)
  5218. def testWithTimeout(self):
  5219. conn = self.accept_conn()
  5220. data = self.recv_data(conn)
  5221. self.assertEqual(len(data), self.FILESIZE)
  5222. self.assertEqual(data, self.FILEDATA)
  5223. # timeout (triggered)
  5224. def _testWithTimeoutTriggeredSend(self):
  5225. address = self.serv.getsockname()
  5226. with open(os_helper.TESTFN, 'rb') as file:
  5227. with socket.create_connection(address) as sock:
  5228. sock.settimeout(0.01)
  5229. meth = self.meth_from_sock(sock)
  5230. self.assertRaises(TimeoutError, meth, file)
  5231. def testWithTimeoutTriggeredSend(self):
  5232. conn = self.accept_conn()
  5233. conn.recv(88192)
  5234. # bpo-45212: the wait here needs to be longer than the client-side timeout (0.01s)
  5235. time.sleep(1)
  5236. # errors
  5237. def _test_errors(self):
  5238. pass
  5239. def test_errors(self):
  5240. with open(os_helper.TESTFN, 'rb') as file:
  5241. with socket.socket(type=socket.SOCK_DGRAM) as s:
  5242. meth = self.meth_from_sock(s)
  5243. self.assertRaisesRegex(
  5244. ValueError, "SOCK_STREAM", meth, file)
  5245. with open(os_helper.TESTFN, encoding="utf-8") as file:
  5246. with socket.socket() as s:
  5247. meth = self.meth_from_sock(s)
  5248. self.assertRaisesRegex(
  5249. ValueError, "binary mode", meth, file)
  5250. with open(os_helper.TESTFN, 'rb') as file:
  5251. with socket.socket() as s:
  5252. meth = self.meth_from_sock(s)
  5253. self.assertRaisesRegex(TypeError, "positive integer",
  5254. meth, file, count='2')
  5255. self.assertRaisesRegex(TypeError, "positive integer",
  5256. meth, file, count=0.1)
  5257. self.assertRaisesRegex(ValueError, "positive integer",
  5258. meth, file, count=0)
  5259. self.assertRaisesRegex(ValueError, "positive integer",
  5260. meth, file, count=-1)
  5261. @unittest.skipUnless(hasattr(os, "sendfile"),
  5262. 'os.sendfile() required for this test.')
  5263. class SendfileUsingSendfileTest(SendfileUsingSendTest):
  5264. """
  5265. Test the sendfile() implementation of socket.sendfile().
  5266. """
  5267. def meth_from_sock(self, sock):
  5268. return getattr(sock, "_sendfile_use_sendfile")
  5269. @unittest.skipUnless(HAVE_SOCKET_ALG, 'AF_ALG required')
  5270. class LinuxKernelCryptoAPI(unittest.TestCase):
  5271. # tests for AF_ALG
  5272. def create_alg(self, typ, name):
  5273. sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
  5274. try:
  5275. sock.bind((typ, name))
  5276. except FileNotFoundError as e:
  5277. # type / algorithm is not available
  5278. sock.close()
  5279. raise unittest.SkipTest(str(e), typ, name)
  5280. else:
  5281. return sock
  5282. # bpo-31705: On kernel older than 4.5, sendto() failed with ENOKEY,
  5283. # at least on ppc64le architecture
  5284. @support.requires_linux_version(4, 5)
  5285. def test_sha256(self):
  5286. expected = bytes.fromhex("ba7816bf8f01cfea414140de5dae2223b00361a396"
  5287. "177a9cb410ff61f20015ad")
  5288. with self.create_alg('hash', 'sha256') as algo:
  5289. op, _ = algo.accept()
  5290. with op:
  5291. op.sendall(b"abc")
  5292. self.assertEqual(op.recv(512), expected)
  5293. op, _ = algo.accept()
  5294. with op:
  5295. op.send(b'a', socket.MSG_MORE)
  5296. op.send(b'b', socket.MSG_MORE)
  5297. op.send(b'c', socket.MSG_MORE)
  5298. op.send(b'')
  5299. self.assertEqual(op.recv(512), expected)
  5300. def test_hmac_sha1(self):
  5301. expected = bytes.fromhex("effcdf6ae5eb2fa2d27416d5f184df9c259a7c79")
  5302. with self.create_alg('hash', 'hmac(sha1)') as algo:
  5303. algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, b"Jefe")
  5304. op, _ = algo.accept()
  5305. with op:
  5306. op.sendall(b"what do ya want for nothing?")
  5307. self.assertEqual(op.recv(512), expected)
  5308. # Although it should work with 3.19 and newer the test blocks on
  5309. # Ubuntu 15.10 with Kernel 4.2.0-19.
  5310. @support.requires_linux_version(4, 3)
  5311. def test_aes_cbc(self):
  5312. key = bytes.fromhex('06a9214036b8a15b512e03d534120006')
  5313. iv = bytes.fromhex('3dafba429d9eb430b422da802c9fac41')
  5314. msg = b"Single block msg"
  5315. ciphertext = bytes.fromhex('e353779c1079aeb82708942dbe77181a')
  5316. msglen = len(msg)
  5317. with self.create_alg('skcipher', 'cbc(aes)') as algo:
  5318. algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
  5319. op, _ = algo.accept()
  5320. with op:
  5321. op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
  5322. flags=socket.MSG_MORE)
  5323. op.sendall(msg)
  5324. self.assertEqual(op.recv(msglen), ciphertext)
  5325. op, _ = algo.accept()
  5326. with op:
  5327. op.sendmsg_afalg([ciphertext],
  5328. op=socket.ALG_OP_DECRYPT, iv=iv)
  5329. self.assertEqual(op.recv(msglen), msg)
  5330. # long message
  5331. multiplier = 1024
  5332. longmsg = [msg] * multiplier
  5333. op, _ = algo.accept()
  5334. with op:
  5335. op.sendmsg_afalg(longmsg,
  5336. op=socket.ALG_OP_ENCRYPT, iv=iv)
  5337. enc = op.recv(msglen * multiplier)
  5338. self.assertEqual(len(enc), msglen * multiplier)
  5339. self.assertEqual(enc[:msglen], ciphertext)
  5340. op, _ = algo.accept()
  5341. with op:
  5342. op.sendmsg_afalg([enc],
  5343. op=socket.ALG_OP_DECRYPT, iv=iv)
  5344. dec = op.recv(msglen * multiplier)
  5345. self.assertEqual(len(dec), msglen * multiplier)
  5346. self.assertEqual(dec, msg * multiplier)
  5347. @support.requires_linux_version(4, 9) # see issue29324
  5348. def test_aead_aes_gcm(self):
  5349. key = bytes.fromhex('c939cc13397c1d37de6ae0e1cb7c423c')
  5350. iv = bytes.fromhex('b3d8cc017cbb89b39e0f67e2')
  5351. plain = bytes.fromhex('c3b3c41f113a31b73d9a5cd432103069')
  5352. assoc = bytes.fromhex('24825602bd12a984e0092d3e448eda5f')
  5353. expected_ct = bytes.fromhex('93fe7d9e9bfd10348a5606e5cafa7354')
  5354. expected_tag = bytes.fromhex('0032a1dc85f1c9786925a2e71d8272dd')
  5355. taglen = len(expected_tag)
  5356. assoclen = len(assoc)
  5357. with self.create_alg('aead', 'gcm(aes)') as algo:
  5358. algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
  5359. algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_AEAD_AUTHSIZE,
  5360. None, taglen)
  5361. # send assoc, plain and tag buffer in separate steps
  5362. op, _ = algo.accept()
  5363. with op:
  5364. op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
  5365. assoclen=assoclen, flags=socket.MSG_MORE)
  5366. op.sendall(assoc, socket.MSG_MORE)
  5367. op.sendall(plain)
  5368. res = op.recv(assoclen + len(plain) + taglen)
  5369. self.assertEqual(expected_ct, res[assoclen:-taglen])
  5370. self.assertEqual(expected_tag, res[-taglen:])
  5371. # now with msg
  5372. op, _ = algo.accept()
  5373. with op:
  5374. msg = assoc + plain
  5375. op.sendmsg_afalg([msg], op=socket.ALG_OP_ENCRYPT, iv=iv,
  5376. assoclen=assoclen)
  5377. res = op.recv(assoclen + len(plain) + taglen)
  5378. self.assertEqual(expected_ct, res[assoclen:-taglen])
  5379. self.assertEqual(expected_tag, res[-taglen:])
  5380. # create anc data manually
  5381. pack_uint32 = struct.Struct('I').pack
  5382. op, _ = algo.accept()
  5383. with op:
  5384. msg = assoc + plain
  5385. op.sendmsg(
  5386. [msg],
  5387. ([socket.SOL_ALG, socket.ALG_SET_OP, pack_uint32(socket.ALG_OP_ENCRYPT)],
  5388. [socket.SOL_ALG, socket.ALG_SET_IV, pack_uint32(len(iv)) + iv],
  5389. [socket.SOL_ALG, socket.ALG_SET_AEAD_ASSOCLEN, pack_uint32(assoclen)],
  5390. )
  5391. )
  5392. res = op.recv(len(msg) + taglen)
  5393. self.assertEqual(expected_ct, res[assoclen:-taglen])
  5394. self.assertEqual(expected_tag, res[-taglen:])
  5395. # decrypt and verify
  5396. op, _ = algo.accept()
  5397. with op:
  5398. msg = assoc + expected_ct + expected_tag
  5399. op.sendmsg_afalg([msg], op=socket.ALG_OP_DECRYPT, iv=iv,
  5400. assoclen=assoclen)
  5401. res = op.recv(len(msg) - taglen)
  5402. self.assertEqual(plain, res[assoclen:])
  5403. @support.requires_linux_version(4, 3) # see test_aes_cbc
  5404. def test_drbg_pr_sha256(self):
  5405. # deterministic random bit generator, prediction resistance, sha256
  5406. with self.create_alg('rng', 'drbg_pr_sha256') as algo:
  5407. extra_seed = os.urandom(32)
  5408. algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, extra_seed)
  5409. op, _ = algo.accept()
  5410. with op:
  5411. rn = op.recv(32)
  5412. self.assertEqual(len(rn), 32)
  5413. def test_sendmsg_afalg_args(self):
  5414. sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
  5415. with sock:
  5416. with self.assertRaises(TypeError):
  5417. sock.sendmsg_afalg()
  5418. with self.assertRaises(TypeError):
  5419. sock.sendmsg_afalg(op=None)
  5420. with self.assertRaises(TypeError):
  5421. sock.sendmsg_afalg(1)
  5422. with self.assertRaises(TypeError):
  5423. sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=None)
  5424. with self.assertRaises(TypeError):
  5425. sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=-1)
  5426. def test_length_restriction(self):
  5427. # bpo-35050, off-by-one error in length check
  5428. sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
  5429. self.addCleanup(sock.close)
  5430. # salg_type[14]
  5431. with self.assertRaises(FileNotFoundError):
  5432. sock.bind(("t" * 13, "name"))
  5433. with self.assertRaisesRegex(ValueError, "type too long"):
  5434. sock.bind(("t" * 14, "name"))
  5435. # salg_name[64]
  5436. with self.assertRaises(FileNotFoundError):
  5437. sock.bind(("type", "n" * 63))
  5438. with self.assertRaisesRegex(ValueError, "name too long"):
  5439. sock.bind(("type", "n" * 64))
  5440. @unittest.skipUnless(sys.platform == 'darwin', 'macOS specific test')
  5441. class TestMacOSTCPFlags(unittest.TestCase):
  5442. def test_tcp_keepalive(self):
  5443. self.assertTrue(socket.TCP_KEEPALIVE)
  5444. @unittest.skipUnless(sys.platform.startswith("win"), "requires Windows")
  5445. class TestMSWindowsTCPFlags(unittest.TestCase):
  5446. knownTCPFlags = {
  5447. # available since long time ago
  5448. 'TCP_MAXSEG',
  5449. 'TCP_NODELAY',
  5450. # available starting with Windows 10 1607
  5451. 'TCP_FASTOPEN',
  5452. # available starting with Windows 10 1703
  5453. 'TCP_KEEPCNT',
  5454. # available starting with Windows 10 1709
  5455. 'TCP_KEEPIDLE',
  5456. 'TCP_KEEPINTVL'
  5457. }
  5458. def test_new_tcp_flags(self):
  5459. provided = [s for s in dir(socket) if s.startswith('TCP')]
  5460. unknown = [s for s in provided if s not in self.knownTCPFlags]
  5461. self.assertEqual([], unknown,
  5462. "New TCP flags were discovered. See bpo-32394 for more information")
  5463. class CreateServerTest(unittest.TestCase):
  5464. def test_address(self):
  5465. port = socket_helper.find_unused_port()
  5466. with socket.create_server(("127.0.0.1", port)) as sock:
  5467. self.assertEqual(sock.getsockname()[0], "127.0.0.1")
  5468. self.assertEqual(sock.getsockname()[1], port)
  5469. if socket_helper.IPV6_ENABLED:
  5470. with socket.create_server(("::1", port),
  5471. family=socket.AF_INET6) as sock:
  5472. self.assertEqual(sock.getsockname()[0], "::1")
  5473. self.assertEqual(sock.getsockname()[1], port)
  5474. def test_family_and_type(self):
  5475. with socket.create_server(("127.0.0.1", 0)) as sock:
  5476. self.assertEqual(sock.family, socket.AF_INET)
  5477. self.assertEqual(sock.type, socket.SOCK_STREAM)
  5478. if socket_helper.IPV6_ENABLED:
  5479. with socket.create_server(("::1", 0), family=socket.AF_INET6) as s:
  5480. self.assertEqual(s.family, socket.AF_INET6)
  5481. self.assertEqual(sock.type, socket.SOCK_STREAM)
  5482. def test_reuse_port(self):
  5483. if not hasattr(socket, "SO_REUSEPORT"):
  5484. with self.assertRaises(ValueError):
  5485. socket.create_server(("localhost", 0), reuse_port=True)
  5486. else:
  5487. with socket.create_server(("localhost", 0)) as sock:
  5488. opt = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT)
  5489. self.assertEqual(opt, 0)
  5490. with socket.create_server(("localhost", 0), reuse_port=True) as sock:
  5491. opt = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT)
  5492. self.assertNotEqual(opt, 0)
  5493. @unittest.skipIf(not hasattr(_socket, 'IPPROTO_IPV6') or
  5494. not hasattr(_socket, 'IPV6_V6ONLY'),
  5495. "IPV6_V6ONLY option not supported")
  5496. @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test')
  5497. def test_ipv6_only_default(self):
  5498. with socket.create_server(("::1", 0), family=socket.AF_INET6) as sock:
  5499. assert sock.getsockopt(socket.IPPROTO_IPV6, socket.IPV6_V6ONLY)
  5500. @unittest.skipIf(not socket.has_dualstack_ipv6(),
  5501. "dualstack_ipv6 not supported")
  5502. @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test')
  5503. def test_dualstack_ipv6_family(self):
  5504. with socket.create_server(("::1", 0), family=socket.AF_INET6,
  5505. dualstack_ipv6=True) as sock:
  5506. self.assertEqual(sock.family, socket.AF_INET6)
  5507. class CreateServerFunctionalTest(unittest.TestCase):
  5508. timeout = support.LOOPBACK_TIMEOUT
  5509. def echo_server(self, sock):
  5510. def run(sock):
  5511. with sock:
  5512. conn, _ = sock.accept()
  5513. with conn:
  5514. event.wait(self.timeout)
  5515. msg = conn.recv(1024)
  5516. if not msg:
  5517. return
  5518. conn.sendall(msg)
  5519. event = threading.Event()
  5520. sock.settimeout(self.timeout)
  5521. thread = threading.Thread(target=run, args=(sock, ))
  5522. thread.start()
  5523. self.addCleanup(thread.join, self.timeout)
  5524. event.set()
  5525. def echo_client(self, addr, family):
  5526. with socket.socket(family=family) as sock:
  5527. sock.settimeout(self.timeout)
  5528. sock.connect(addr)
  5529. sock.sendall(b'foo')
  5530. self.assertEqual(sock.recv(1024), b'foo')
  5531. def test_tcp4(self):
  5532. port = socket_helper.find_unused_port()
  5533. with socket.create_server(("", port)) as sock:
  5534. self.echo_server(sock)
  5535. self.echo_client(("127.0.0.1", port), socket.AF_INET)
  5536. @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test')
  5537. def test_tcp6(self):
  5538. port = socket_helper.find_unused_port()
  5539. with socket.create_server(("", port),
  5540. family=socket.AF_INET6) as sock:
  5541. self.echo_server(sock)
  5542. self.echo_client(("::1", port), socket.AF_INET6)
  5543. # --- dual stack tests
  5544. @unittest.skipIf(not socket.has_dualstack_ipv6(),
  5545. "dualstack_ipv6 not supported")
  5546. @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test')
  5547. def test_dual_stack_client_v4(self):
  5548. port = socket_helper.find_unused_port()
  5549. with socket.create_server(("", port), family=socket.AF_INET6,
  5550. dualstack_ipv6=True) as sock:
  5551. self.echo_server(sock)
  5552. self.echo_client(("127.0.0.1", port), socket.AF_INET)
  5553. @unittest.skipIf(not socket.has_dualstack_ipv6(),
  5554. "dualstack_ipv6 not supported")
  5555. @unittest.skipUnless(socket_helper.IPV6_ENABLED, 'IPv6 required for this test')
  5556. def test_dual_stack_client_v6(self):
  5557. port = socket_helper.find_unused_port()
  5558. with socket.create_server(("", port), family=socket.AF_INET6,
  5559. dualstack_ipv6=True) as sock:
  5560. self.echo_server(sock)
  5561. self.echo_client(("::1", port), socket.AF_INET6)
  5562. @requireAttrs(socket, "send_fds")
  5563. @requireAttrs(socket, "recv_fds")
  5564. @requireAttrs(socket, "AF_UNIX")
  5565. class SendRecvFdsTests(unittest.TestCase):
  5566. def testSendAndRecvFds(self):
  5567. def close_pipes(pipes):
  5568. for fd1, fd2 in pipes:
  5569. os.close(fd1)
  5570. os.close(fd2)
  5571. def close_fds(fds):
  5572. for fd in fds:
  5573. os.close(fd)
  5574. # send 10 file descriptors
  5575. pipes = [os.pipe() for _ in range(10)]
  5576. self.addCleanup(close_pipes, pipes)
  5577. fds = [rfd for rfd, wfd in pipes]
  5578. # use a UNIX socket pair to exchange file descriptors locally
  5579. sock1, sock2 = socket.socketpair(socket.AF_UNIX, socket.SOCK_STREAM)
  5580. with sock1, sock2:
  5581. socket.send_fds(sock1, [MSG], fds)
  5582. # request more data and file descriptors than expected
  5583. msg, fds2, flags, addr = socket.recv_fds(sock2, len(MSG) * 2, len(fds) * 2)
  5584. self.addCleanup(close_fds, fds2)
  5585. self.assertEqual(msg, MSG)
  5586. self.assertEqual(len(fds2), len(fds))
  5587. self.assertEqual(flags, 0)
  5588. # don't test addr
  5589. # test that file descriptors are connected
  5590. for index, fds in enumerate(pipes):
  5591. rfd, wfd = fds
  5592. os.write(wfd, str(index).encode())
  5593. for index, rfd in enumerate(fds2):
  5594. data = os.read(rfd, 100)
  5595. self.assertEqual(data, str(index).encode())
  5596. def setUpModule():
  5597. thread_info = threading_helper.threading_setup()
  5598. unittest.addModuleCleanup(threading_helper.threading_cleanup, *thread_info)
  5599. if __name__ == "__main__":
  5600. unittest.main()