quic_stream_factory_test.cc 676 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746774777487749775077517752775377547755775677577758775977607761776277637764776577667767776877697770777177727773777477757776777777787779778077817782778377847785778677877788778977907791779277937794779577967797779877997800780178027803780478057806780778087809781078117812781378147815781678177818781978207821782278237824782578267827782878297830783178327833783478357836783778387839784078417842784378447845784678477848784978507851785278537854785578567857785878597860786178627863786478657866786778687869787078717872787378747875787678777878787978807881788278837884788578867887788878897890789178927893789478957896789778987899790079017902790379047905790679077908790979107911791279137914791579167917791879197920792179227923792479257926792779287929793079317932793379347935793679377938793979407941794279437944794579467947794879497950795179527953795479557956795779587959796079617962796379647965796679677968796979707971797279737974797579767977797879797980798179827983798479857986798779887989799079917992799379947995799679977998799980008001800280038004800580068007800880098010801180128013801480158016801780188019802080218022802380248025802680278028802980308031803280338034803580368037803880398040804180428043804480458046804780488049805080518052805380548055805680578058805980608061806280638064806580668067806880698070807180728073807480758076807780788079808080818082808380848085808680878088808980908091809280938094809580968097809880998100810181028103810481058106810781088109811081118112811381148115811681178118811981208121812281238124812581268127812881298130813181328133813481358136813781388139814081418142814381448145814681478148814981508151815281538154815581568157815881598160816181628163816481658166816781688169817081718172817381748175817681778178817981808181818281838184818581868187818881898190819181928193819481958196819781988199820082018202820382048205820682078208820982108211821282138214821582168217821882198220822182228223822482258226822782288229823082318232823382348235823682378238823982408241824282438244824582468247824882498250825182528253825482558256825782588259826082618262826382648265826682678268826982708271827282738274827582768277827882798280828182828283828482858286828782888289829082918292829382948295829682978298829983008301830283038304830583068307830883098310831183128313831483158316831783188319832083218322832383248325832683278328832983308331833283338334833583368337833883398340834183428343834483458346834783488349835083518352835383548355835683578358835983608361836283638364836583668367836883698370837183728373837483758376837783788379838083818382838383848385838683878388838983908391839283938394839583968397839883998400840184028403840484058406840784088409841084118412841384148415841684178418841984208421842284238424842584268427842884298430843184328433843484358436843784388439844084418442844384448445844684478448844984508451845284538454845584568457845884598460846184628463846484658466846784688469847084718472847384748475847684778478847984808481848284838484848584868487848884898490849184928493849484958496849784988499850085018502850385048505850685078508850985108511851285138514851585168517851885198520852185228523852485258526852785288529853085318532853385348535853685378538853985408541854285438544854585468547854885498550855185528553855485558556855785588559856085618562856385648565856685678568856985708571857285738574857585768577857885798580858185828583858485858586858785888589859085918592859385948595859685978598859986008601860286038604860586068607860886098610861186128613861486158616861786188619862086218622862386248625862686278628862986308631863286338634863586368637863886398640864186428643864486458646864786488649865086518652865386548655865686578658865986608661866286638664866586668667866886698670867186728673867486758676867786788679868086818682868386848685868686878688868986908691869286938694869586968697869886998700870187028703870487058706870787088709871087118712871387148715871687178718871987208721872287238724872587268727872887298730873187328733873487358736873787388739874087418742874387448745874687478748874987508751875287538754875587568757875887598760876187628763876487658766876787688769877087718772877387748775877687778778877987808781878287838784878587868787878887898790879187928793879487958796879787988799880088018802880388048805880688078808880988108811881288138814881588168817881888198820882188228823882488258826882788288829883088318832883388348835883688378838883988408841884288438844884588468847884888498850885188528853885488558856885788588859886088618862886388648865886688678868886988708871887288738874887588768877887888798880888188828883888488858886888788888889889088918892889388948895889688978898889989008901890289038904890589068907890889098910891189128913891489158916891789188919892089218922892389248925892689278928892989308931893289338934893589368937893889398940894189428943894489458946894789488949895089518952895389548955895689578958895989608961896289638964896589668967896889698970897189728973897489758976897789788979898089818982898389848985898689878988898989908991899289938994899589968997899889999000900190029003900490059006900790089009901090119012901390149015901690179018901990209021902290239024902590269027902890299030903190329033903490359036903790389039904090419042904390449045904690479048904990509051905290539054905590569057905890599060906190629063906490659066906790689069907090719072907390749075907690779078907990809081908290839084908590869087908890899090909190929093909490959096909790989099910091019102910391049105910691079108910991109111911291139114911591169117911891199120912191229123912491259126912791289129913091319132913391349135913691379138913991409141914291439144914591469147914891499150915191529153915491559156915791589159916091619162916391649165916691679168916991709171917291739174917591769177917891799180918191829183918491859186918791889189919091919192919391949195919691979198919992009201920292039204920592069207920892099210921192129213921492159216921792189219922092219222922392249225922692279228922992309231923292339234923592369237923892399240924192429243924492459246924792489249925092519252925392549255925692579258925992609261926292639264926592669267926892699270927192729273927492759276927792789279928092819282928392849285928692879288928992909291929292939294929592969297929892999300930193029303930493059306930793089309931093119312931393149315931693179318931993209321932293239324932593269327932893299330933193329333933493359336933793389339934093419342934393449345934693479348934993509351935293539354935593569357935893599360936193629363936493659366936793689369937093719372937393749375937693779378937993809381938293839384938593869387938893899390939193929393939493959396939793989399940094019402940394049405940694079408940994109411941294139414941594169417941894199420942194229423942494259426942794289429943094319432943394349435943694379438943994409441944294439444944594469447944894499450945194529453945494559456945794589459946094619462946394649465946694679468946994709471947294739474947594769477947894799480948194829483948494859486948794889489949094919492949394949495949694979498949995009501950295039504950595069507950895099510951195129513951495159516951795189519952095219522952395249525952695279528952995309531953295339534953595369537953895399540954195429543954495459546954795489549955095519552955395549555955695579558955995609561956295639564956595669567956895699570957195729573957495759576957795789579958095819582958395849585958695879588958995909591959295939594959595969597959895999600960196029603960496059606960796089609961096119612961396149615961696179618961996209621962296239624962596269627962896299630963196329633963496359636963796389639964096419642964396449645964696479648964996509651965296539654965596569657965896599660966196629663966496659666966796689669967096719672967396749675967696779678967996809681968296839684968596869687968896899690969196929693969496959696969796989699970097019702970397049705970697079708970997109711971297139714971597169717971897199720972197229723972497259726972797289729973097319732973397349735973697379738973997409741974297439744974597469747974897499750975197529753975497559756975797589759976097619762976397649765976697679768976997709771977297739774977597769777977897799780978197829783978497859786978797889789979097919792979397949795979697979798979998009801980298039804980598069807980898099810981198129813981498159816981798189819982098219822982398249825982698279828982998309831983298339834983598369837983898399840984198429843984498459846984798489849985098519852985398549855985698579858985998609861986298639864986598669867986898699870987198729873987498759876987798789879988098819882988398849885988698879888988998909891989298939894989598969897989898999900990199029903990499059906990799089909991099119912991399149915991699179918991999209921992299239924992599269927992899299930993199329933993499359936993799389939994099419942994399449945994699479948994999509951995299539954995599569957995899599960996199629963996499659966996799689969997099719972997399749975997699779978997999809981998299839984998599869987998899899990999199929993999499959996999799989999100001000110002100031000410005100061000710008100091001010011100121001310014100151001610017100181001910020100211002210023100241002510026100271002810029100301003110032100331003410035100361003710038100391004010041100421004310044100451004610047100481004910050100511005210053100541005510056100571005810059100601006110062100631006410065100661006710068100691007010071100721007310074100751007610077100781007910080100811008210083100841008510086100871008810089100901009110092100931009410095100961009710098100991010010101101021010310104101051010610107101081010910110101111011210113101141011510116101171011810119101201012110122101231012410125101261012710128101291013010131101321013310134101351013610137101381013910140101411014210143101441014510146101471014810149101501015110152101531015410155101561015710158101591016010161101621016310164101651016610167101681016910170101711017210173101741017510176101771017810179101801018110182101831018410185101861018710188101891019010191101921019310194101951019610197101981019910200102011020210203102041020510206102071020810209102101021110212102131021410215102161021710218102191022010221102221022310224102251022610227102281022910230102311023210233102341023510236102371023810239102401024110242102431024410245102461024710248102491025010251102521025310254102551025610257102581025910260102611026210263102641026510266102671026810269102701027110272102731027410275102761027710278102791028010281102821028310284102851028610287102881028910290102911029210293102941029510296102971029810299103001030110302103031030410305103061030710308103091031010311103121031310314103151031610317103181031910320103211032210323103241032510326103271032810329103301033110332103331033410335103361033710338103391034010341103421034310344103451034610347103481034910350103511035210353103541035510356103571035810359103601036110362103631036410365103661036710368103691037010371103721037310374103751037610377103781037910380103811038210383103841038510386103871038810389103901039110392103931039410395103961039710398103991040010401104021040310404104051040610407104081040910410104111041210413104141041510416104171041810419104201042110422104231042410425104261042710428104291043010431104321043310434104351043610437104381043910440104411044210443104441044510446104471044810449104501045110452104531045410455104561045710458104591046010461104621046310464104651046610467104681046910470104711047210473104741047510476104771047810479104801048110482104831048410485104861048710488104891049010491104921049310494104951049610497104981049910500105011050210503105041050510506105071050810509105101051110512105131051410515105161051710518105191052010521105221052310524105251052610527105281052910530105311053210533105341053510536105371053810539105401054110542105431054410545105461054710548105491055010551105521055310554105551055610557105581055910560105611056210563105641056510566105671056810569105701057110572105731057410575105761057710578105791058010581105821058310584105851058610587105881058910590105911059210593105941059510596105971059810599106001060110602106031060410605106061060710608106091061010611106121061310614106151061610617106181061910620106211062210623106241062510626106271062810629106301063110632106331063410635106361063710638106391064010641106421064310644106451064610647106481064910650106511065210653106541065510656106571065810659106601066110662106631066410665106661066710668106691067010671106721067310674106751067610677106781067910680106811068210683106841068510686106871068810689106901069110692106931069410695106961069710698106991070010701107021070310704107051070610707107081070910710107111071210713107141071510716107171071810719107201072110722107231072410725107261072710728107291073010731107321073310734107351073610737107381073910740107411074210743107441074510746107471074810749107501075110752107531075410755107561075710758107591076010761107621076310764107651076610767107681076910770107711077210773107741077510776107771077810779107801078110782107831078410785107861078710788107891079010791107921079310794107951079610797107981079910800108011080210803108041080510806108071080810809108101081110812108131081410815108161081710818108191082010821108221082310824108251082610827108281082910830108311083210833108341083510836108371083810839108401084110842108431084410845108461084710848108491085010851108521085310854108551085610857108581085910860108611086210863108641086510866108671086810869108701087110872108731087410875108761087710878108791088010881108821088310884108851088610887108881088910890108911089210893108941089510896108971089810899109001090110902109031090410905109061090710908109091091010911109121091310914109151091610917109181091910920109211092210923109241092510926109271092810929109301093110932109331093410935109361093710938109391094010941109421094310944109451094610947109481094910950109511095210953109541095510956109571095810959109601096110962109631096410965109661096710968109691097010971109721097310974109751097610977109781097910980109811098210983109841098510986109871098810989109901099110992109931099410995109961099710998109991100011001110021100311004110051100611007110081100911010110111101211013110141101511016110171101811019110201102111022110231102411025110261102711028110291103011031110321103311034110351103611037110381103911040110411104211043110441104511046110471104811049110501105111052110531105411055110561105711058110591106011061110621106311064110651106611067110681106911070110711107211073110741107511076110771107811079110801108111082110831108411085110861108711088110891109011091110921109311094110951109611097110981109911100111011110211103111041110511106111071110811109111101111111112111131111411115111161111711118111191112011121111221112311124111251112611127111281112911130111311113211133111341113511136111371113811139111401114111142111431114411145111461114711148111491115011151111521115311154111551115611157111581115911160111611116211163111641116511166111671116811169111701117111172111731117411175111761117711178111791118011181111821118311184111851118611187111881118911190111911119211193111941119511196111971119811199112001120111202112031120411205112061120711208112091121011211112121121311214112151121611217112181121911220112211122211223112241122511226112271122811229112301123111232112331123411235112361123711238112391124011241112421124311244112451124611247112481124911250112511125211253112541125511256112571125811259112601126111262112631126411265112661126711268112691127011271112721127311274112751127611277112781127911280112811128211283112841128511286112871128811289112901129111292112931129411295112961129711298112991130011301113021130311304113051130611307113081130911310113111131211313113141131511316113171131811319113201132111322113231132411325113261132711328113291133011331113321133311334113351133611337113381133911340113411134211343113441134511346113471134811349113501135111352113531135411355113561135711358113591136011361113621136311364113651136611367113681136911370113711137211373113741137511376113771137811379113801138111382113831138411385113861138711388113891139011391113921139311394113951139611397113981139911400114011140211403114041140511406114071140811409114101141111412114131141411415114161141711418114191142011421114221142311424114251142611427114281142911430114311143211433114341143511436114371143811439114401144111442114431144411445114461144711448114491145011451114521145311454114551145611457114581145911460114611146211463114641146511466114671146811469114701147111472114731147411475114761147711478114791148011481114821148311484114851148611487114881148911490114911149211493114941149511496114971149811499115001150111502115031150411505115061150711508115091151011511115121151311514115151151611517115181151911520115211152211523115241152511526115271152811529115301153111532115331153411535115361153711538115391154011541115421154311544115451154611547115481154911550115511155211553115541155511556115571155811559115601156111562115631156411565115661156711568115691157011571115721157311574115751157611577115781157911580115811158211583115841158511586115871158811589115901159111592115931159411595115961159711598115991160011601116021160311604116051160611607116081160911610116111161211613116141161511616116171161811619116201162111622116231162411625116261162711628116291163011631116321163311634116351163611637116381163911640116411164211643116441164511646116471164811649116501165111652116531165411655116561165711658116591166011661116621166311664116651166611667116681166911670116711167211673116741167511676116771167811679116801168111682116831168411685116861168711688116891169011691116921169311694116951169611697116981169911700117011170211703117041170511706117071170811709117101171111712117131171411715117161171711718117191172011721117221172311724117251172611727117281172911730117311173211733117341173511736117371173811739117401174111742117431174411745117461174711748117491175011751117521175311754117551175611757117581175911760117611176211763117641176511766117671176811769117701177111772117731177411775117761177711778117791178011781117821178311784117851178611787117881178911790117911179211793117941179511796117971179811799118001180111802118031180411805118061180711808118091181011811118121181311814118151181611817118181181911820118211182211823118241182511826118271182811829118301183111832118331183411835118361183711838118391184011841118421184311844118451184611847118481184911850118511185211853118541185511856118571185811859118601186111862118631186411865118661186711868118691187011871118721187311874118751187611877118781187911880118811188211883118841188511886118871188811889118901189111892118931189411895118961189711898118991190011901119021190311904119051190611907119081190911910119111191211913119141191511916119171191811919119201192111922119231192411925119261192711928119291193011931119321193311934119351193611937119381193911940119411194211943119441194511946119471194811949119501195111952119531195411955119561195711958119591196011961119621196311964119651196611967119681196911970119711197211973119741197511976119771197811979119801198111982119831198411985119861198711988119891199011991119921199311994119951199611997119981199912000120011200212003120041200512006120071200812009120101201112012120131201412015120161201712018120191202012021120221202312024120251202612027120281202912030120311203212033120341203512036120371203812039120401204112042120431204412045120461204712048120491205012051120521205312054120551205612057120581205912060120611206212063120641206512066120671206812069120701207112072120731207412075120761207712078120791208012081120821208312084120851208612087120881208912090120911209212093120941209512096120971209812099121001210112102121031210412105121061210712108121091211012111121121211312114121151211612117121181211912120121211212212123121241212512126121271212812129121301213112132121331213412135121361213712138121391214012141121421214312144121451214612147121481214912150121511215212153121541215512156121571215812159121601216112162121631216412165121661216712168121691217012171121721217312174121751217612177121781217912180121811218212183121841218512186121871218812189121901219112192121931219412195121961219712198121991220012201122021220312204122051220612207122081220912210122111221212213122141221512216122171221812219122201222112222122231222412225122261222712228122291223012231122321223312234122351223612237122381223912240122411224212243122441224512246122471224812249122501225112252122531225412255122561225712258122591226012261122621226312264122651226612267122681226912270122711227212273122741227512276122771227812279122801228112282122831228412285122861228712288122891229012291122921229312294122951229612297122981229912300123011230212303123041230512306123071230812309123101231112312123131231412315123161231712318123191232012321123221232312324123251232612327123281232912330123311233212333123341233512336123371233812339123401234112342123431234412345123461234712348123491235012351123521235312354123551235612357123581235912360123611236212363123641236512366123671236812369123701237112372123731237412375123761237712378123791238012381123821238312384123851238612387123881238912390123911239212393123941239512396123971239812399124001240112402124031240412405124061240712408124091241012411124121241312414124151241612417124181241912420124211242212423124241242512426124271242812429124301243112432124331243412435124361243712438124391244012441124421244312444124451244612447124481244912450124511245212453124541245512456124571245812459124601246112462124631246412465124661246712468124691247012471124721247312474124751247612477124781247912480124811248212483124841248512486124871248812489124901249112492124931249412495124961249712498124991250012501125021250312504125051250612507125081250912510125111251212513125141251512516125171251812519125201252112522125231252412525125261252712528125291253012531125321253312534125351253612537125381253912540125411254212543125441254512546125471254812549125501255112552125531255412555125561255712558125591256012561125621256312564125651256612567125681256912570125711257212573125741257512576125771257812579125801258112582125831258412585125861258712588125891259012591125921259312594125951259612597125981259912600126011260212603126041260512606126071260812609126101261112612126131261412615126161261712618126191262012621126221262312624126251262612627126281262912630126311263212633126341263512636126371263812639126401264112642126431264412645126461264712648126491265012651126521265312654126551265612657126581265912660126611266212663126641266512666126671266812669126701267112672126731267412675126761267712678126791268012681126821268312684126851268612687126881268912690126911269212693126941269512696126971269812699127001270112702127031270412705127061270712708127091271012711127121271312714127151271612717127181271912720127211272212723127241272512726127271272812729127301273112732127331273412735127361273712738127391274012741127421274312744127451274612747127481274912750127511275212753127541275512756127571275812759127601276112762127631276412765127661276712768127691277012771127721277312774127751277612777127781277912780127811278212783127841278512786127871278812789127901279112792127931279412795127961279712798127991280012801128021280312804128051280612807128081280912810128111281212813128141281512816128171281812819128201282112822128231282412825128261282712828128291283012831128321283312834128351283612837128381283912840128411284212843128441284512846128471284812849128501285112852128531285412855128561285712858128591286012861128621286312864128651286612867128681286912870128711287212873128741287512876128771287812879128801288112882128831288412885128861288712888128891289012891128921289312894128951289612897128981289912900129011290212903129041290512906129071290812909129101291112912129131291412915129161291712918129191292012921129221292312924129251292612927129281292912930129311293212933129341293512936129371293812939129401294112942129431294412945129461294712948129491295012951129521295312954129551295612957129581295912960129611296212963129641296512966129671296812969129701297112972129731297412975129761297712978129791298012981129821298312984129851298612987129881298912990129911299212993129941299512996129971299812999130001300113002130031300413005130061300713008130091301013011130121301313014130151301613017130181301913020130211302213023130241302513026130271302813029130301303113032130331303413035130361303713038130391304013041130421304313044130451304613047130481304913050130511305213053130541305513056130571305813059130601306113062130631306413065130661306713068130691307013071130721307313074130751307613077130781307913080130811308213083130841308513086130871308813089130901309113092130931309413095130961309713098130991310013101131021310313104131051310613107131081310913110131111311213113131141311513116131171311813119131201312113122131231312413125131261312713128131291313013131131321313313134131351313613137131381313913140131411314213143131441314513146131471314813149131501315113152131531315413155131561315713158131591316013161131621316313164131651316613167131681316913170131711317213173131741317513176131771317813179131801318113182131831318413185131861318713188131891319013191131921319313194131951319613197131981319913200132011320213203132041320513206132071320813209132101321113212132131321413215132161321713218132191322013221132221322313224132251322613227132281322913230132311323213233132341323513236132371323813239132401324113242132431324413245132461324713248132491325013251132521325313254132551325613257132581325913260132611326213263132641326513266132671326813269132701327113272132731327413275132761327713278132791328013281132821328313284132851328613287132881328913290132911329213293132941329513296132971329813299133001330113302133031330413305133061330713308133091331013311133121331313314133151331613317133181331913320133211332213323133241332513326133271332813329133301333113332133331333413335133361333713338133391334013341133421334313344133451334613347133481334913350133511335213353133541335513356133571335813359133601336113362133631336413365133661336713368133691337013371133721337313374133751337613377133781337913380133811338213383133841338513386133871338813389133901339113392133931339413395133961339713398133991340013401134021340313404134051340613407134081340913410134111341213413134141341513416134171341813419134201342113422134231342413425134261342713428134291343013431134321343313434134351343613437134381343913440134411344213443134441344513446134471344813449134501345113452134531345413455134561345713458134591346013461134621346313464134651346613467134681346913470134711347213473134741347513476134771347813479134801348113482134831348413485134861348713488134891349013491134921349313494134951349613497134981349913500135011350213503135041350513506135071350813509135101351113512135131351413515135161351713518135191352013521135221352313524135251352613527135281352913530135311353213533135341353513536135371353813539135401354113542135431354413545135461354713548135491355013551135521355313554135551355613557135581355913560135611356213563135641356513566135671356813569135701357113572135731357413575135761357713578135791358013581135821358313584135851358613587135881358913590135911359213593135941359513596135971359813599136001360113602136031360413605136061360713608136091361013611136121361313614136151361613617136181361913620136211362213623136241362513626136271362813629136301363113632136331363413635136361363713638136391364013641136421364313644136451364613647136481364913650136511365213653136541365513656136571365813659136601366113662136631366413665136661366713668136691367013671136721367313674136751367613677136781367913680136811368213683136841368513686136871368813689136901369113692136931369413695136961369713698136991370013701137021370313704137051370613707137081370913710137111371213713137141371513716137171371813719137201372113722137231372413725137261372713728137291373013731137321373313734137351373613737137381373913740137411374213743137441374513746137471374813749137501375113752137531375413755137561375713758137591376013761137621376313764137651376613767137681376913770137711377213773137741377513776137771377813779137801378113782137831378413785137861378713788137891379013791137921379313794137951379613797137981379913800138011380213803138041380513806138071380813809138101381113812138131381413815138161381713818138191382013821138221382313824138251382613827138281382913830138311383213833138341383513836138371383813839138401384113842138431384413845138461384713848138491385013851138521385313854138551385613857138581385913860138611386213863138641386513866138671386813869138701387113872138731387413875138761387713878138791388013881138821388313884138851388613887138881388913890138911389213893138941389513896138971389813899139001390113902139031390413905139061390713908139091391013911139121391313914139151391613917139181391913920139211392213923139241392513926139271392813929139301393113932139331393413935139361393713938139391394013941139421394313944139451394613947139481394913950139511395213953139541395513956139571395813959139601396113962139631396413965139661396713968139691397013971139721397313974139751397613977139781397913980139811398213983139841398513986139871398813989139901399113992139931399413995139961399713998139991400014001140021400314004140051400614007140081400914010140111401214013140141401514016140171401814019140201402114022140231402414025140261402714028140291403014031140321403314034140351403614037140381403914040140411404214043140441404514046140471404814049140501405114052140531405414055140561405714058140591406014061140621406314064140651406614067140681406914070140711407214073140741407514076140771407814079140801408114082140831408414085140861408714088140891409014091140921409314094140951409614097140981409914100141011410214103141041410514106141071410814109141101411114112141131411414115141161411714118141191412014121141221412314124141251412614127141281412914130141311413214133141341413514136141371413814139141401414114142141431414414145141461414714148141491415014151141521415314154141551415614157141581415914160141611416214163141641416514166141671416814169141701417114172141731417414175141761417714178141791418014181141821418314184141851418614187141881418914190141911419214193141941419514196141971419814199142001420114202142031420414205142061420714208142091421014211142121421314214142151421614217142181421914220142211422214223142241422514226142271422814229142301423114232142331423414235142361423714238142391424014241142421424314244142451424614247142481424914250142511425214253142541425514256142571425814259142601426114262142631426414265142661426714268142691427014271142721427314274142751427614277142781427914280142811428214283142841428514286142871428814289142901429114292142931429414295142961429714298142991430014301143021430314304143051430614307143081430914310143111431214313143141431514316143171431814319143201432114322143231432414325143261432714328143291433014331143321433314334143351433614337143381433914340143411434214343143441434514346143471434814349143501435114352143531435414355143561435714358143591436014361143621436314364143651436614367143681436914370143711437214373143741437514376143771437814379143801438114382143831438414385143861438714388143891439014391143921439314394143951439614397143981439914400144011440214403144041440514406144071440814409144101441114412144131441414415144161441714418144191442014421144221442314424144251442614427144281442914430144311443214433144341443514436144371443814439144401444114442144431444414445144461444714448144491445014451144521445314454144551445614457144581445914460144611446214463144641446514466144671446814469144701447114472144731447414475144761447714478144791448014481144821448314484144851448614487144881448914490144911449214493144941449514496144971449814499145001450114502145031450414505145061450714508145091451014511145121451314514145151451614517145181451914520145211452214523145241452514526145271452814529145301453114532145331453414535145361453714538145391454014541145421454314544145451454614547145481454914550145511455214553145541455514556145571455814559145601456114562145631456414565145661456714568145691457014571145721457314574145751457614577145781457914580145811458214583145841458514586145871458814589145901459114592145931459414595145961459714598145991460014601146021460314604146051460614607146081460914610146111461214613146141461514616146171461814619146201462114622146231462414625146261462714628146291463014631146321463314634146351463614637146381463914640146411464214643146441464514646146471464814649146501465114652146531465414655146561465714658146591466014661146621466314664146651466614667146681466914670146711467214673146741467514676146771467814679146801468114682146831468414685146861468714688146891469014691146921469314694146951469614697146981469914700147011470214703147041470514706147071470814709147101471114712147131471414715147161471714718147191472014721147221472314724147251472614727147281472914730147311473214733147341473514736147371473814739147401474114742147431474414745147461474714748147491475014751147521475314754147551475614757147581475914760147611476214763147641476514766147671476814769147701477114772147731477414775147761477714778147791478014781147821478314784147851478614787147881478914790147911479214793147941479514796147971479814799148001480114802148031480414805148061480714808148091481014811148121481314814148151481614817148181481914820148211482214823148241482514826148271482814829148301483114832148331483414835148361483714838148391484014841148421484314844148451484614847148481484914850148511485214853148541485514856148571485814859148601486114862148631486414865148661486714868148691487014871148721487314874148751487614877148781487914880148811488214883148841488514886148871488814889148901489114892148931489414895148961489714898148991490014901149021490314904149051490614907149081490914910149111491214913149141491514916149171491814919149201492114922149231492414925149261492714928149291493014931149321493314934149351493614937149381493914940149411494214943149441494514946149471494814949149501495114952149531495414955149561495714958149591496014961149621496314964149651496614967149681496914970149711497214973149741497514976149771497814979149801498114982149831498414985149861498714988149891499014991149921499314994149951499614997149981499915000150011500215003150041500515006150071500815009150101501115012150131501415015150161501715018150191502015021150221502315024150251502615027150281502915030150311503215033150341503515036150371503815039150401504115042150431504415045150461504715048150491505015051150521505315054150551505615057150581505915060150611506215063150641506515066150671506815069150701507115072150731507415075150761507715078150791508015081150821508315084150851508615087150881508915090150911509215093150941509515096150971509815099151001510115102151031510415105
  1. // Copyright (c) 2012 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "net/quic/quic_stream_factory.h"
  5. #include <memory>
  6. #include <ostream>
  7. #include <set>
  8. #include <utility>
  9. #include "base/bind.h"
  10. #include "base/callback.h"
  11. #include "base/memory/raw_ptr.h"
  12. #include "base/run_loop.h"
  13. #include "base/strings/strcat.h"
  14. #include "base/strings/string_number_conversions.h"
  15. #include "base/strings/string_util.h"
  16. #include "base/strings/stringprintf.h"
  17. #include "base/test/scoped_feature_list.h"
  18. #include "base/test/simple_test_tick_clock.h"
  19. #include "base/test/test_mock_time_task_runner.h"
  20. #include "base/time/time.h"
  21. #include "build/build_config.h"
  22. #include "net/base/features.h"
  23. #include "net/base/load_flags.h"
  24. #include "net/base/mock_network_change_notifier.h"
  25. #include "net/base/network_isolation_key.h"
  26. #include "net/base/schemeful_site.h"
  27. #include "net/cert/ct_policy_enforcer.h"
  28. #include "net/cert/mock_cert_verifier.h"
  29. #include "net/dns/mock_host_resolver.h"
  30. #include "net/dns/public/dns_query_type.h"
  31. #include "net/dns/public/host_resolver_source.h"
  32. #include "net/dns/public/secure_dns_policy.h"
  33. #include "net/http/http_response_headers.h"
  34. #include "net/http/http_response_info.h"
  35. #include "net/http/http_server_properties.h"
  36. #include "net/http/http_util.h"
  37. #include "net/http/transport_security_state.h"
  38. #include "net/http/transport_security_state_test_util.h"
  39. #include "net/quic/address_utils.h"
  40. #include "net/quic/crypto/proof_verifier_chromium.h"
  41. #include "net/quic/mock_crypto_client_stream_factory.h"
  42. #include "net/quic/mock_quic_context.h"
  43. #include "net/quic/mock_quic_data.h"
  44. #include "net/quic/properties_based_quic_server_info.h"
  45. #include "net/quic/quic_chromium_alarm_factory.h"
  46. #include "net/quic/quic_chromium_client_session_peer.h"
  47. #include "net/quic/quic_http_stream.h"
  48. #include "net/quic/quic_http_utils.h"
  49. #include "net/quic/quic_server_info.h"
  50. #include "net/quic/quic_stream_factory_peer.h"
  51. #include "net/quic/quic_test_packet_maker.h"
  52. #include "net/quic/quic_test_packet_printer.h"
  53. #include "net/quic/test_task_runner.h"
  54. #include "net/socket/next_proto.h"
  55. #include "net/socket/socket_test_util.h"
  56. #include "net/spdy/spdy_session_test_util.h"
  57. #include "net/spdy/spdy_test_util_common.h"
  58. #include "net/ssl/ssl_config_service_defaults.h"
  59. #include "net/test/cert_test_util.h"
  60. #include "net/test/gtest_util.h"
  61. #include "net/test/test_data_directory.h"
  62. #include "net/test/test_with_task_environment.h"
  63. #include "net/third_party/quiche/src/quiche/quic/core/crypto/crypto_handshake.h"
  64. #include "net/third_party/quiche/src/quiche/quic/core/crypto/quic_crypto_client_config.h"
  65. #include "net/third_party/quiche/src/quiche/quic/core/crypto/quic_decrypter.h"
  66. #include "net/third_party/quiche/src/quiche/quic/core/crypto/quic_encrypter.h"
  67. #include "net/third_party/quiche/src/quiche/quic/core/http/quic_client_promised_info.h"
  68. #include "net/third_party/quiche/src/quiche/quic/core/quic_constants.h"
  69. #include "net/third_party/quiche/src/quiche/quic/core/quic_utils.h"
  70. #include "net/third_party/quiche/src/quiche/quic/platform/api/quic_test.h"
  71. #include "net/third_party/quiche/src/quiche/quic/test_tools/mock_clock.h"
  72. #include "net/third_party/quiche/src/quiche/quic/test_tools/mock_random.h"
  73. #include "net/third_party/quiche/src/quiche/quic/test_tools/quic_config_peer.h"
  74. #include "net/third_party/quiche/src/quiche/quic/test_tools/quic_connection_peer.h"
  75. #include "net/third_party/quiche/src/quiche/quic/test_tools/quic_path_validator_peer.h"
  76. #include "net/third_party/quiche/src/quiche/quic/test_tools/quic_session_peer.h"
  77. #include "net/third_party/quiche/src/quiche/quic/test_tools/quic_spdy_session_peer.h"
  78. #include "net/third_party/quiche/src/quiche/quic/test_tools/quic_test_utils.h"
  79. #include "net/third_party/quiche/src/quiche/spdy/test_tools/spdy_test_utils.h"
  80. #include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
  81. #include "testing/gmock/include/gmock/gmock.h"
  82. #include "testing/gtest/include/gtest/gtest.h"
  83. #include "url/gurl.h"
  84. #include "url/scheme_host_port.h"
  85. #include "url/url_constants.h"
  86. using std::string;
  87. namespace net::test {
  88. class QuicHttpStreamPeer {
  89. public:
  90. static QuicChromiumClientSession::Handle* GetSessionHandle(
  91. HttpStream* stream) {
  92. return static_cast<QuicHttpStream*>(stream)->quic_session();
  93. }
  94. };
  95. namespace {
  96. const char kDefaultServerHostName[] = "www.example.org";
  97. const char kServer2HostName[] = "mail.example.org";
  98. const char kDifferentHostname[] = "different.example.com";
  99. const int kDefaultServerPort = 443;
  100. const char kDefaultUrl[] = "https://www.example.org/";
  101. const char kServer2Url[] = "https://mail.example.org/";
  102. const char kServer3Url[] = "https://docs.example.org/";
  103. const char kServer4Url[] = "https://images.example.org/";
  104. const int kDefaultRTTMilliSecs = 300;
  105. const size_t kMinRetryTimeForDefaultNetworkSecs = 1;
  106. const size_t kWaitTimeForNewNetworkSecs = 10;
  107. const char kCachedIPAddress[] = "192.168.0.2";
  108. const char kNonCachedIPAddress[] = "192.168.0.1";
  109. const quic::QuicConnectionId kNewCID = quic::test::TestConnectionId(12345678);
  110. // Run QuicStreamFactoryTest instances with all value combinations of version
  111. // and enable_connection_racting.
  112. struct TestParams {
  113. quic::ParsedQuicVersion version;
  114. bool client_headers_include_h2_stream_dependency;
  115. };
  116. // Used by ::testing::PrintToStringParamName().
  117. std::string PrintToString(const TestParams& p) {
  118. return base::StrCat(
  119. {ParsedQuicVersionToString(p.version), "_",
  120. (p.client_headers_include_h2_stream_dependency ? "" : "No"),
  121. "Dependency"});
  122. }
  123. std::vector<TestParams> GetTestParams() {
  124. std::vector<TestParams> params;
  125. quic::ParsedQuicVersionVector all_supported_versions =
  126. quic::AllSupportedVersions();
  127. for (const auto& version : all_supported_versions) {
  128. params.push_back(TestParams{version, false});
  129. params.push_back(TestParams{version, true});
  130. }
  131. return params;
  132. }
  133. } // namespace
  134. // TestConnectionMigrationSocketFactory will vend sockets with incremental fake
  135. // IPV4 address.
  136. class TestConnectionMigrationSocketFactory : public MockClientSocketFactory {
  137. public:
  138. TestConnectionMigrationSocketFactory() = default;
  139. TestConnectionMigrationSocketFactory(
  140. const TestConnectionMigrationSocketFactory&) = delete;
  141. TestConnectionMigrationSocketFactory& operator=(
  142. const TestConnectionMigrationSocketFactory&) = delete;
  143. ~TestConnectionMigrationSocketFactory() override = default;
  144. std::unique_ptr<DatagramClientSocket> CreateDatagramClientSocket(
  145. DatagramSocket::BindType bind_type,
  146. NetLog* net_log,
  147. const NetLogSource& source) override {
  148. SocketDataProvider* data_provider = mock_data().GetNext();
  149. auto socket = std::make_unique<MockUDPClientSocket>(data_provider, net_log);
  150. socket->set_source_host(IPAddress(192, 0, 2, next_source_host_num_++));
  151. return std::move(socket);
  152. }
  153. private:
  154. uint8_t next_source_host_num_ = 1u;
  155. };
  156. // TestPortMigrationSocketFactory will vend sockets with incremental port
  157. // number.
  158. class TestPortMigrationSocketFactory : public MockClientSocketFactory {
  159. public:
  160. TestPortMigrationSocketFactory() = default;
  161. TestPortMigrationSocketFactory(const TestPortMigrationSocketFactory&) =
  162. delete;
  163. TestPortMigrationSocketFactory& operator=(
  164. const TestPortMigrationSocketFactory&) = delete;
  165. ~TestPortMigrationSocketFactory() override = default;
  166. std::unique_ptr<DatagramClientSocket> CreateDatagramClientSocket(
  167. DatagramSocket::BindType bind_type,
  168. NetLog* net_log,
  169. const NetLogSource& source) override {
  170. SocketDataProvider* data_provider = mock_data().GetNext();
  171. auto socket = std::make_unique<MockUDPClientSocket>(data_provider, net_log);
  172. socket->set_source_port(next_source_port_num_++);
  173. return std::move(socket);
  174. }
  175. private:
  176. uint16_t next_source_port_num_ = 1u;
  177. };
  178. class QuicStreamFactoryTestBase : public WithTaskEnvironment {
  179. protected:
  180. QuicStreamFactoryTestBase(quic::ParsedQuicVersion version,
  181. bool client_headers_include_h2_stream_dependency)
  182. : host_resolver_(std::make_unique<MockHostResolver>(
  183. /*default_result=*/MockHostResolverBase::RuleResolver::
  184. GetLocalhostResult())),
  185. ssl_config_service_(std::make_unique<SSLConfigServiceDefaults>()),
  186. socket_factory_(std::make_unique<MockClientSocketFactory>()),
  187. runner_(base::MakeRefCounted<TestTaskRunner>(context_.mock_clock())),
  188. version_(version),
  189. client_maker_(version_,
  190. quic::QuicUtils::CreateRandomConnectionId(
  191. context_.random_generator()),
  192. context_.clock(),
  193. kDefaultServerHostName,
  194. quic::Perspective::IS_CLIENT,
  195. client_headers_include_h2_stream_dependency),
  196. server_maker_(version_,
  197. quic::QuicUtils::CreateRandomConnectionId(
  198. context_.random_generator()),
  199. context_.clock(),
  200. kDefaultServerHostName,
  201. quic::Perspective::IS_SERVER,
  202. false),
  203. http_server_properties_(std::make_unique<HttpServerProperties>()),
  204. cert_verifier_(std::make_unique<MockCertVerifier>()),
  205. scheme_host_port_(url::kHttpsScheme,
  206. kDefaultServerHostName,
  207. kDefaultServerPort),
  208. url_(kDefaultUrl),
  209. url2_(kServer2Url),
  210. url3_(kServer3Url),
  211. url4_(kServer4Url),
  212. failed_on_default_network_callback_(base::BindRepeating(
  213. &QuicStreamFactoryTestBase::OnFailedOnDefaultNetwork,
  214. base::Unretained(this))),
  215. quic_params_(context_.params()) {
  216. FLAGS_quic_enable_http3_grease_randomness = false;
  217. quic_params_->headers_include_h2_stream_dependency =
  218. client_headers_include_h2_stream_dependency;
  219. context_.AdvanceTime(quic::QuicTime::Delta::FromSeconds(1));
  220. }
  221. void Initialize() {
  222. DCHECK(!factory_);
  223. factory_ = std::make_unique<QuicStreamFactory>(
  224. net_log_.net_log(), host_resolver_.get(), ssl_config_service_.get(),
  225. socket_factory_.get(), http_server_properties_.get(),
  226. cert_verifier_.get(), &ct_policy_enforcer_, &transport_security_state_,
  227. /*sct_auditing_delegate=*/nullptr,
  228. /*SocketPerformanceWatcherFactory*/ nullptr,
  229. &crypto_client_stream_factory_, &context_);
  230. }
  231. void SetIetfConnectionMigrationFlagsAndConnectionOptions() {
  232. FLAGS_quic_reloadable_flag_quic_connection_migration_use_new_cid_v2 = true;
  233. }
  234. void InitializeConnectionMigrationV2Test(
  235. NetworkChangeNotifier::NetworkList connected_networks) {
  236. scoped_mock_network_change_notifier_ =
  237. std::make_unique<ScopedMockNetworkChangeNotifier>();
  238. MockNetworkChangeNotifier* mock_ncn =
  239. scoped_mock_network_change_notifier_->mock_network_change_notifier();
  240. mock_ncn->ForceNetworkHandlesSupported();
  241. mock_ncn->SetConnectedNetworksList(connected_networks);
  242. quic_params_->migrate_sessions_on_network_change_v2 = true;
  243. quic_params_->migrate_sessions_early_v2 = true;
  244. socket_factory_ = std::make_unique<TestConnectionMigrationSocketFactory>();
  245. SetIetfConnectionMigrationFlagsAndConnectionOptions();
  246. Initialize();
  247. }
  248. // For IETF QUIC, make a NEW_CONNECTION_ID frame available for client such
  249. // that connection migration can begin with a new connection ID. A side
  250. // effect of calling this function is that ACK_FRAME that should have been
  251. // sent for the first packet read might be skipped in the unit test. If the
  252. // order of ACKing is important for a test, use
  253. // QuicTestPacketMaker::MakeNewConnectionIdPacket instead.
  254. void MaybeMakeNewConnectionIdAvailableToSession(
  255. const quic::QuicConnectionId& new_cid,
  256. quic::QuicSession* session,
  257. uint64_t sequence_number = 1u) {
  258. if (version_.HasIetfQuicFrames()) {
  259. quic::QuicNewConnectionIdFrame new_cid_frame;
  260. new_cid_frame.connection_id = new_cid;
  261. new_cid_frame.sequence_number = sequence_number;
  262. new_cid_frame.retire_prior_to = 0u;
  263. new_cid_frame.stateless_reset_token =
  264. quic::QuicUtils::GenerateStatelessResetToken(
  265. new_cid_frame.connection_id);
  266. session->connection()->OnNewConnectionIdFrame(new_cid_frame);
  267. }
  268. }
  269. std::unique_ptr<HttpStream> CreateStream(QuicStreamRequest* request) {
  270. std::unique_ptr<QuicChromiumClientSession::Handle> session =
  271. request->ReleaseSessionHandle();
  272. if (!session || !session->IsConnected())
  273. return nullptr;
  274. std::set<std::string> dns_aliases =
  275. session->GetDnsAliasesForSessionKey(request->session_key());
  276. return std::make_unique<QuicHttpStream>(std::move(session),
  277. std::move(dns_aliases));
  278. }
  279. bool HasActiveSession(const url::SchemeHostPort& scheme_host_port,
  280. const NetworkIsolationKey& network_isolation_key =
  281. NetworkIsolationKey()) {
  282. quic::QuicServerId server_id(scheme_host_port.host(),
  283. scheme_host_port.port(), false);
  284. return QuicStreamFactoryPeer::HasActiveSession(factory_.get(), server_id,
  285. network_isolation_key);
  286. }
  287. bool HasLiveSession(const url::SchemeHostPort& scheme_host_port) {
  288. quic::QuicServerId server_id(scheme_host_port.host(),
  289. scheme_host_port.port(), false);
  290. return QuicStreamFactoryPeer::HasLiveSession(factory_.get(),
  291. scheme_host_port, server_id);
  292. }
  293. bool HasActiveJob(const url::SchemeHostPort& scheme_host_port,
  294. const PrivacyMode privacy_mode) {
  295. quic::QuicServerId server_id(scheme_host_port.host(),
  296. scheme_host_port.port(),
  297. privacy_mode == PRIVACY_MODE_ENABLED);
  298. return QuicStreamFactoryPeer::HasActiveJob(factory_.get(), server_id);
  299. }
  300. // Get the pending, not activated session, if there is only one session alive.
  301. QuicChromiumClientSession* GetPendingSession(
  302. const url::SchemeHostPort& scheme_host_port) {
  303. quic::QuicServerId server_id(scheme_host_port.host(),
  304. scheme_host_port.port(), false);
  305. return QuicStreamFactoryPeer::GetPendingSession(factory_.get(), server_id,
  306. scheme_host_port);
  307. }
  308. QuicChromiumClientSession* GetActiveSession(
  309. const url::SchemeHostPort& scheme_host_port,
  310. const NetworkIsolationKey& network_isolation_key =
  311. NetworkIsolationKey()) {
  312. quic::QuicServerId server_id(scheme_host_port.host(),
  313. scheme_host_port.port(), false);
  314. return QuicStreamFactoryPeer::GetActiveSession(factory_.get(), server_id,
  315. network_isolation_key);
  316. }
  317. int GetSourcePortForNewSession(const url::SchemeHostPort& destination) {
  318. return GetSourcePortForNewSessionInner(destination, false);
  319. }
  320. int GetSourcePortForNewSessionAndGoAway(
  321. const url::SchemeHostPort& destination) {
  322. return GetSourcePortForNewSessionInner(destination, true);
  323. }
  324. int GetSourcePortForNewSessionInner(const url::SchemeHostPort& destination,
  325. bool goaway_received) {
  326. // Should only be called if there is no active session for this destination.
  327. EXPECT_FALSE(HasActiveSession(destination));
  328. size_t socket_count = socket_factory_->udp_client_socket_ports().size();
  329. MockQuicData socket_data(version_);
  330. socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  331. if (VersionUsesHttp3(version_.transport_version))
  332. socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
  333. socket_data.AddSocketDataToFactory(socket_factory_.get());
  334. QuicStreamRequest request(factory_.get());
  335. GURL url("https://" + destination.host() + "/");
  336. EXPECT_EQ(ERR_IO_PENDING,
  337. request.Request(
  338. destination, version_, privacy_mode_, DEFAULT_PRIORITY,
  339. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  340. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  341. /*cert_verify_flags=*/0, url, net_log_, &net_error_details_,
  342. failed_on_default_network_callback_, callback_.callback()));
  343. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  344. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  345. EXPECT_TRUE(stream.get());
  346. stream.reset();
  347. QuicChromiumClientSession* session = GetActiveSession(destination);
  348. if (socket_count + 1 != socket_factory_->udp_client_socket_ports().size()) {
  349. ADD_FAILURE();
  350. return 0;
  351. }
  352. if (goaway_received) {
  353. quic::QuicGoAwayFrame goaway(quic::kInvalidControlFrameId,
  354. quic::QUIC_NO_ERROR, 1, "");
  355. session->connection()->OnGoAwayFrame(goaway);
  356. }
  357. factory_->OnSessionClosed(session);
  358. EXPECT_FALSE(HasActiveSession(destination));
  359. EXPECT_TRUE(socket_data.AllReadDataConsumed());
  360. EXPECT_TRUE(socket_data.AllWriteDataConsumed());
  361. return socket_factory_->udp_client_socket_ports()[socket_count];
  362. }
  363. std::unique_ptr<quic::QuicEncryptedPacket>
  364. ConstructClientConnectionClosePacket(uint64_t num) {
  365. return client_maker_.MakeConnectionClosePacket(
  366. num, false, quic::QUIC_CRYPTO_VERSION_NOT_SUPPORTED, "Time to panic!");
  367. }
  368. std::unique_ptr<quic::QuicEncryptedPacket> ConstructClientRstPacket(
  369. uint64_t packet_number,
  370. quic::QuicRstStreamErrorCode error_code) {
  371. quic::QuicStreamId stream_id =
  372. GetNthClientInitiatedBidirectionalStreamId(0);
  373. return client_maker_.MakeRstPacket(packet_number, true, stream_id,
  374. error_code);
  375. }
  376. static ProofVerifyDetailsChromium DefaultProofVerifyDetails() {
  377. // Load a certificate that is valid for *.example.org
  378. scoped_refptr<X509Certificate> test_cert(
  379. ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
  380. EXPECT_TRUE(test_cert.get());
  381. ProofVerifyDetailsChromium verify_details;
  382. verify_details.cert_verify_result.verified_cert = test_cert;
  383. verify_details.cert_verify_result.is_issued_by_known_root = true;
  384. return verify_details;
  385. }
  386. void NotifyIPAddressChanged() {
  387. NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
  388. // Spin the message loop so the notification is delivered.
  389. base::RunLoop().RunUntilIdle();
  390. }
  391. std::unique_ptr<quic::QuicEncryptedPacket> ConstructGetRequestPacket(
  392. uint64_t packet_number,
  393. quic::QuicStreamId stream_id,
  394. bool should_include_version,
  395. bool fin) {
  396. spdy::Http2HeaderBlock headers =
  397. client_maker_.GetRequestHeaders("GET", "https", "/");
  398. spdy::SpdyPriority priority =
  399. ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
  400. size_t spdy_headers_frame_len;
  401. return client_maker_.MakeRequestHeadersPacket(
  402. packet_number, stream_id, should_include_version, fin, priority,
  403. std::move(headers), 0, &spdy_headers_frame_len);
  404. }
  405. std::unique_ptr<quic::QuicEncryptedPacket> ConstructGetRequestPacket(
  406. uint64_t packet_number,
  407. quic::QuicStreamId stream_id,
  408. quic::QuicStreamId parent_stream_id,
  409. bool should_include_version,
  410. bool fin) {
  411. spdy::Http2HeaderBlock headers =
  412. client_maker_.GetRequestHeaders("GET", "https", "/");
  413. spdy::SpdyPriority priority =
  414. ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
  415. size_t spdy_headers_frame_len;
  416. return client_maker_.MakeRequestHeadersPacket(
  417. packet_number, stream_id, should_include_version, fin, priority,
  418. std::move(headers), parent_stream_id, &spdy_headers_frame_len);
  419. }
  420. std::unique_ptr<quic::QuicEncryptedPacket> ConstructOkResponsePacket(
  421. uint64_t packet_number,
  422. quic::QuicStreamId stream_id,
  423. bool should_include_version,
  424. bool fin) {
  425. spdy::Http2HeaderBlock headers = server_maker_.GetResponseHeaders("200");
  426. size_t spdy_headers_frame_len;
  427. return server_maker_.MakeResponseHeadersPacket(
  428. packet_number, stream_id, should_include_version, fin,
  429. std::move(headers), &spdy_headers_frame_len);
  430. }
  431. std::unique_ptr<quic::QuicReceivedPacket> ConstructInitialSettingsPacket() {
  432. return client_maker_.MakeInitialSettingsPacket(1);
  433. }
  434. std::unique_ptr<quic::QuicReceivedPacket> ConstructInitialSettingsPacket(
  435. uint64_t packet_number) {
  436. return client_maker_.MakeInitialSettingsPacket(packet_number);
  437. }
  438. // Helper method for server migration tests.
  439. void VerifyServerMigration(const quic::QuicConfig& config,
  440. IPEndPoint expected_address) {
  441. quic_params_->allow_server_migration = true;
  442. Initialize();
  443. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  444. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  445. crypto_client_stream_factory_.SetConfig(config);
  446. // Set up first socket data provider.
  447. MockQuicData socket_data1(version_);
  448. socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  449. socket_data1.AddSocketDataToFactory(socket_factory_.get());
  450. // Set up second socket data provider that is used after
  451. // migration.
  452. MockQuicData socket_data2(version_);
  453. if (VersionUsesHttp3(version_.transport_version)) {
  454. client_maker_.set_connection_id(kNewCID);
  455. }
  456. socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  457. int packet_num = 1;
  458. if (VersionUsesHttp3(version_.transport_version)) {
  459. socket_data2.AddWrite(SYNCHRONOUS,
  460. ConstructInitialSettingsPacket(packet_num++));
  461. }
  462. socket_data2.AddWrite(
  463. SYNCHRONOUS,
  464. client_maker_.MakePingPacket(packet_num++, /*include_version=*/true));
  465. if (VersionUsesHttp3(version_.transport_version)) {
  466. socket_data2.AddWrite(SYNCHRONOUS,
  467. client_maker_.MakeRetireConnectionIdPacket(
  468. packet_num++, /*include_version=*/false,
  469. /*sequence_number=*/0u));
  470. socket_data2.AddWrite(
  471. SYNCHRONOUS, client_maker_.MakeDataPacket(
  472. packet_num++, GetQpackDecoderStreamId(), true, false,
  473. StreamCancellationQpackDecoderInstruction(0)));
  474. }
  475. socket_data2.AddWrite(
  476. SYNCHRONOUS,
  477. client_maker_.MakeRstPacket(
  478. packet_num++, true, GetNthClientInitiatedBidirectionalStreamId(0),
  479. quic::QUIC_STREAM_CANCELLED));
  480. socket_data2.AddSocketDataToFactory(socket_factory_.get());
  481. // Create request and QuicHttpStream.
  482. QuicStreamRequest request(factory_.get());
  483. EXPECT_EQ(ERR_IO_PENDING,
  484. request.Request(
  485. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  486. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  487. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  488. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  489. failed_on_default_network_callback_, callback_.callback()));
  490. EXPECT_EQ(OK, callback_.WaitForResult());
  491. // Run QuicChromiumClientSession::WriteToNewSocket()
  492. // posted by QuicChromiumClientSession::MigrateToSocket().
  493. base::RunLoop().RunUntilIdle();
  494. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  495. EXPECT_TRUE(stream.get());
  496. // Cause QUIC stream to be created.
  497. HttpRequestInfo request_info;
  498. request_info.method = "GET";
  499. request_info.url = GURL("https://www.example.org/");
  500. request_info.traffic_annotation =
  501. MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
  502. stream->RegisterRequest(&request_info);
  503. EXPECT_EQ(OK, stream->InitializeStream(true, DEFAULT_PRIORITY, net_log_,
  504. CompletionOnceCallback()));
  505. // Ensure that session is alive and active.
  506. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  507. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  508. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  509. IPEndPoint actual_address;
  510. session->GetDefaultSocket()->GetPeerAddress(&actual_address);
  511. EXPECT_EQ(actual_address, expected_address);
  512. DVLOG(1) << "Socket connected to: " << actual_address.address().ToString()
  513. << " " << actual_address.port();
  514. DVLOG(1) << "Expected address: " << expected_address.address().ToString()
  515. << " " << expected_address.port();
  516. stream.reset();
  517. EXPECT_TRUE(socket_data1.AllReadDataConsumed());
  518. EXPECT_TRUE(socket_data2.AllReadDataConsumed());
  519. EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
  520. }
  521. // Verifies that the QUIC stream factory is initialized correctly.
  522. // If |vary_network_isolation_key| is true, stores data for two different
  523. // NetworkIsolationKeys, but the same server. If false, stores data for two
  524. // different servers, using the same NetworkIsolationKey.
  525. void VerifyInitialization(bool vary_network_isolation_key) {
  526. const SchemefulSite kSite1(GURL("https://foo.test/"));
  527. const SchemefulSite kSite2(GURL("https://bar.test/"));
  528. NetworkIsolationKey network_isolation_key1(kSite1, kSite1);
  529. quic::QuicServerId quic_server_id1(
  530. kDefaultServerHostName, kDefaultServerPort, PRIVACY_MODE_DISABLED);
  531. NetworkIsolationKey network_isolation_key2;
  532. quic::QuicServerId quic_server_id2;
  533. if (vary_network_isolation_key) {
  534. network_isolation_key2 = NetworkIsolationKey(kSite2, kSite2);
  535. quic_server_id2 = quic_server_id1;
  536. } else {
  537. network_isolation_key2 = network_isolation_key1;
  538. quic_server_id2 = quic::QuicServerId(kServer2HostName, kDefaultServerPort,
  539. PRIVACY_MODE_DISABLED);
  540. }
  541. quic_params_->max_server_configs_stored_in_properties = 1;
  542. quic_params_->idle_connection_timeout = base::Seconds(500);
  543. Initialize();
  544. factory_->set_is_quic_known_to_work_on_current_network(true);
  545. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  546. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  547. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  548. crypto_client_stream_factory_.set_handshake_mode(
  549. MockCryptoClientStream::ZERO_RTT);
  550. const quic::QuicConfig* config =
  551. QuicStreamFactoryPeer::GetConfig(factory_.get());
  552. EXPECT_EQ(500, config->IdleNetworkTimeout().ToSeconds());
  553. QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
  554. const AlternativeService alternative_service1(
  555. kProtoQUIC, scheme_host_port_.host(), scheme_host_port_.port());
  556. AlternativeServiceInfoVector alternative_service_info_vector;
  557. base::Time expiration = base::Time::Now() + base::Days(1);
  558. alternative_service_info_vector.push_back(
  559. AlternativeServiceInfo::CreateQuicAlternativeServiceInfo(
  560. alternative_service1, expiration, {version_}));
  561. http_server_properties_->SetAlternativeServices(
  562. url::SchemeHostPort("https", quic_server_id1.host(),
  563. quic_server_id1.port()),
  564. network_isolation_key1, alternative_service_info_vector);
  565. const AlternativeService alternative_service2(
  566. kProtoQUIC, quic_server_id2.host(), quic_server_id2.port());
  567. AlternativeServiceInfoVector alternative_service_info_vector2;
  568. alternative_service_info_vector2.push_back(
  569. AlternativeServiceInfo::CreateQuicAlternativeServiceInfo(
  570. alternative_service2, expiration, {version_}));
  571. http_server_properties_->SetAlternativeServices(
  572. url::SchemeHostPort("https", quic_server_id2.host(),
  573. quic_server_id2.port()),
  574. network_isolation_key2, alternative_service_info_vector2);
  575. // Verify that the properties of both QUIC servers are stored in the
  576. // HTTP properties map.
  577. EXPECT_EQ(2U,
  578. http_server_properties_->server_info_map_for_testing().size());
  579. http_server_properties_->SetMaxServerConfigsStoredInProperties(
  580. kDefaultMaxQuicServerEntries);
  581. std::unique_ptr<QuicServerInfo> quic_server_info =
  582. std::make_unique<PropertiesBasedQuicServerInfo>(
  583. quic_server_id1, network_isolation_key1,
  584. http_server_properties_.get());
  585. // Update quic_server_info's server_config and persist it.
  586. QuicServerInfo::State* state = quic_server_info->mutable_state();
  587. // Minimum SCFG that passes config validation checks.
  588. const char scfg[] = {// SCFG
  589. 0x53, 0x43, 0x46, 0x47,
  590. // num entries
  591. 0x01, 0x00,
  592. // padding
  593. 0x00, 0x00,
  594. // EXPY
  595. 0x45, 0x58, 0x50, 0x59,
  596. // EXPY end offset
  597. 0x08, 0x00, 0x00, 0x00,
  598. // Value
  599. '1', '2', '3', '4', '5', '6', '7', '8'};
  600. // Create temporary strings because Persist() clears string data in |state|.
  601. string server_config(reinterpret_cast<const char*>(&scfg), sizeof(scfg));
  602. string source_address_token("test_source_address_token");
  603. string cert_sct("test_cert_sct");
  604. string chlo_hash("test_chlo_hash");
  605. string signature("test_signature");
  606. string test_cert("test_cert");
  607. std::vector<string> certs;
  608. certs.push_back(test_cert);
  609. state->server_config = server_config;
  610. state->source_address_token = source_address_token;
  611. state->cert_sct = cert_sct;
  612. state->chlo_hash = chlo_hash;
  613. state->server_config_sig = signature;
  614. state->certs = certs;
  615. quic_server_info->Persist();
  616. std::unique_ptr<QuicServerInfo> quic_server_info2 =
  617. std::make_unique<PropertiesBasedQuicServerInfo>(
  618. quic_server_id2, network_isolation_key2,
  619. http_server_properties_.get());
  620. // Update quic_server_info2's server_config and persist it.
  621. QuicServerInfo::State* state2 = quic_server_info2->mutable_state();
  622. // Minimum SCFG that passes config validation checks.
  623. const char scfg2[] = {// SCFG
  624. 0x53, 0x43, 0x46, 0x47,
  625. // num entries
  626. 0x01, 0x00,
  627. // padding
  628. 0x00, 0x00,
  629. // EXPY
  630. 0x45, 0x58, 0x50, 0x59,
  631. // EXPY end offset
  632. 0x08, 0x00, 0x00, 0x00,
  633. // Value
  634. '8', '7', '3', '4', '5', '6', '2', '1'};
  635. // Create temporary strings because Persist() clears string data in
  636. // |state2|.
  637. string server_config2(reinterpret_cast<const char*>(&scfg2), sizeof(scfg2));
  638. string source_address_token2("test_source_address_token2");
  639. string cert_sct2("test_cert_sct2");
  640. string chlo_hash2("test_chlo_hash2");
  641. string signature2("test_signature2");
  642. string test_cert2("test_cert2");
  643. std::vector<string> certs2;
  644. certs2.push_back(test_cert2);
  645. state2->server_config = server_config2;
  646. state2->source_address_token = source_address_token2;
  647. state2->cert_sct = cert_sct2;
  648. state2->chlo_hash = chlo_hash2;
  649. state2->server_config_sig = signature2;
  650. state2->certs = certs2;
  651. quic_server_info2->Persist();
  652. // Verify the MRU order is maintained.
  653. const HttpServerProperties::QuicServerInfoMap& quic_server_info_map =
  654. http_server_properties_->quic_server_info_map();
  655. EXPECT_EQ(2u, quic_server_info_map.size());
  656. auto quic_server_info_map_it = quic_server_info_map.begin();
  657. EXPECT_EQ(quic_server_info_map_it->first.server_id, quic_server_id2);
  658. ++quic_server_info_map_it;
  659. EXPECT_EQ(quic_server_info_map_it->first.server_id, quic_server_id1);
  660. host_resolver_->rules()->AddIPLiteralRule(scheme_host_port_.host(),
  661. "192.168.0.1", "");
  662. // Create a session and verify that the cached state is loaded.
  663. MockQuicData socket_data(version_);
  664. socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  665. client_maker_.SetEncryptionLevel(quic::ENCRYPTION_ZERO_RTT);
  666. if (VersionUsesHttp3(version_.transport_version))
  667. socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
  668. socket_data.AddSocketDataToFactory(socket_factory_.get());
  669. QuicStreamRequest request(factory_.get());
  670. EXPECT_EQ(ERR_IO_PENDING,
  671. request.Request(
  672. url::SchemeHostPort(url::kHttpsScheme, quic_server_id1.host(),
  673. quic_server_id1.port()),
  674. version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
  675. network_isolation_key1, SecureDnsPolicy::kAllow,
  676. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  677. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  678. failed_on_default_network_callback_, callback_.callback()));
  679. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  680. EXPECT_FALSE(QuicStreamFactoryPeer::CryptoConfigCacheIsEmpty(
  681. factory_.get(), quic_server_id1, network_isolation_key1));
  682. std::unique_ptr<QuicCryptoClientConfigHandle> crypto_config_handle1 =
  683. QuicStreamFactoryPeer::GetCryptoConfig(factory_.get(),
  684. network_isolation_key1);
  685. quic::QuicCryptoClientConfig::CachedState* cached =
  686. crypto_config_handle1->GetConfig()->LookupOrCreate(quic_server_id1);
  687. EXPECT_FALSE(cached->server_config().empty());
  688. EXPECT_TRUE(cached->GetServerConfig());
  689. EXPECT_EQ(server_config, cached->server_config());
  690. EXPECT_EQ(source_address_token, cached->source_address_token());
  691. EXPECT_EQ(cert_sct, cached->cert_sct());
  692. EXPECT_EQ(chlo_hash, cached->chlo_hash());
  693. EXPECT_EQ(signature, cached->signature());
  694. ASSERT_EQ(1U, cached->certs().size());
  695. EXPECT_EQ(test_cert, cached->certs()[0]);
  696. EXPECT_TRUE(socket_data.AllWriteDataConsumed());
  697. // Create a session and verify that the cached state is loaded.
  698. MockQuicData socket_data2(version_);
  699. socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  700. client_maker_.Reset();
  701. if (VersionUsesHttp3(version_.transport_version))
  702. socket_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
  703. socket_data2.AddSocketDataToFactory(socket_factory_.get());
  704. host_resolver_->rules()->ClearRules();
  705. host_resolver_->rules()->AddIPLiteralRule(scheme_host_port_.host(),
  706. "192.168.0.2", "");
  707. QuicStreamRequest request2(factory_.get());
  708. EXPECT_EQ(
  709. ERR_IO_PENDING,
  710. request2.Request(
  711. url::SchemeHostPort(url::kHttpsScheme, quic_server_id2.host(),
  712. quic_server_id2.port()),
  713. version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
  714. network_isolation_key2, SecureDnsPolicy::kAllow,
  715. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  716. /*cert_verify_flags=*/0,
  717. vary_network_isolation_key ? url_
  718. : GURL("https://mail.example.org/"),
  719. net_log_, &net_error_details_, failed_on_default_network_callback_,
  720. callback_.callback()));
  721. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  722. EXPECT_FALSE(QuicStreamFactoryPeer::CryptoConfigCacheIsEmpty(
  723. factory_.get(), quic_server_id2, network_isolation_key2));
  724. std::unique_ptr<QuicCryptoClientConfigHandle> crypto_config_handle2 =
  725. QuicStreamFactoryPeer::GetCryptoConfig(factory_.get(),
  726. network_isolation_key2);
  727. quic::QuicCryptoClientConfig::CachedState* cached2 =
  728. crypto_config_handle2->GetConfig()->LookupOrCreate(quic_server_id2);
  729. EXPECT_FALSE(cached2->server_config().empty());
  730. EXPECT_TRUE(cached2->GetServerConfig());
  731. EXPECT_EQ(server_config2, cached2->server_config());
  732. EXPECT_EQ(source_address_token2, cached2->source_address_token());
  733. EXPECT_EQ(cert_sct2, cached2->cert_sct());
  734. EXPECT_EQ(chlo_hash2, cached2->chlo_hash());
  735. EXPECT_EQ(signature2, cached2->signature());
  736. ASSERT_EQ(1U, cached->certs().size());
  737. EXPECT_EQ(test_cert2, cached2->certs()[0]);
  738. }
  739. void RunTestLoopUntilIdle() {
  740. while (!runner_->GetPostedTasks().empty())
  741. runner_->RunNextTask();
  742. }
  743. quic::QuicStreamId GetNthClientInitiatedBidirectionalStreamId(int n) const {
  744. return quic::test::GetNthClientInitiatedBidirectionalStreamId(
  745. version_.transport_version, n);
  746. }
  747. quic::QuicStreamId GetQpackDecoderStreamId() const {
  748. return quic::test::GetNthClientInitiatedUnidirectionalStreamId(
  749. version_.transport_version, 1);
  750. }
  751. std::string StreamCancellationQpackDecoderInstruction(int n) const {
  752. return StreamCancellationQpackDecoderInstruction(n, true);
  753. }
  754. std::string StreamCancellationQpackDecoderInstruction(
  755. int n,
  756. bool create_stream) const {
  757. const quic::QuicStreamId cancelled_stream_id =
  758. GetNthClientInitiatedBidirectionalStreamId(n);
  759. EXPECT_LT(cancelled_stream_id, 63u);
  760. const char opcode = 0x40;
  761. if (create_stream) {
  762. return {0x03, static_cast<char>(opcode | cancelled_stream_id)};
  763. } else {
  764. return {static_cast<char>(opcode | cancelled_stream_id)};
  765. }
  766. }
  767. std::string ConstructDataHeader(size_t body_len) {
  768. if (!version_.HasIetfQuicFrames()) {
  769. return "";
  770. }
  771. quiche::QuicheBuffer buffer = quic::HttpEncoder::SerializeDataFrameHeader(
  772. body_len, quiche::SimpleBufferAllocator::Get());
  773. return std::string(buffer.data(), buffer.size());
  774. }
  775. std::unique_ptr<quic::QuicEncryptedPacket> ConstructServerDataPacket(
  776. uint64_t packet_number,
  777. quic::QuicStreamId stream_id,
  778. bool should_include_version,
  779. bool fin,
  780. absl::string_view data) {
  781. return server_maker_.MakeDataPacket(packet_number, stream_id,
  782. should_include_version, fin, data);
  783. }
  784. quic::QuicStreamId GetNthServerInitiatedUnidirectionalStreamId(int n) {
  785. return quic::test::GetNthServerInitiatedUnidirectionalStreamId(
  786. version_.transport_version, n);
  787. }
  788. void OnFailedOnDefaultNetwork(int rv) { failed_on_default_network_ = true; }
  789. // Helper methods for tests of connection migration on write error.
  790. void TestMigrationOnWriteErrorNonMigratableStream(IoMode write_error_mode,
  791. bool migrate_idle_sessions);
  792. // Migratable stream triggers write error.
  793. void TestMigrationOnWriteErrorMixedStreams(IoMode write_error_mode);
  794. // Non-migratable stream triggers write error.
  795. void TestMigrationOnWriteErrorMixedStreams2(IoMode write_error_mode);
  796. void TestMigrationOnWriteErrorMigrationDisabled(IoMode write_error_mode);
  797. void TestMigrationOnWriteError(IoMode write_error_mode);
  798. void TestMigrationOnWriteErrorWithMultipleRequests(IoMode write_error_mode);
  799. void TestMigrationOnWriteErrorNoNewNetwork(IoMode write_error_mode);
  800. void TestMigrationOnMultipleWriteErrors(
  801. IoMode write_error_mode_on_old_network,
  802. IoMode write_error_mode_on_new_network);
  803. void TestMigrationOnNetworkNotificationWithWriteErrorQueuedLater(
  804. bool disconnected);
  805. void TestMigrationOnWriteErrorWithNotificationQueuedLater(bool disconnected);
  806. void TestMigrationOnNetworkDisconnected(bool async_write_before);
  807. void TestMigrationOnNetworkMadeDefault(IoMode write_mode);
  808. void TestMigrationOnPathDegrading(bool async_write_before);
  809. void TestMigrateSessionWithDrainingStream(
  810. IoMode write_mode_for_queued_packet);
  811. void TestMigrationOnWriteErrorPauseBeforeConnected(IoMode write_error_mode);
  812. void TestMigrationOnWriteErrorWithMultipleNotifications(
  813. IoMode write_error_mode,
  814. bool disconnect_before_connect);
  815. void TestNoAlternateNetworkBeforeHandshake(quic::QuicErrorCode error);
  816. void TestNewConnectionOnAlternateNetworkBeforeHandshake(
  817. quic::QuicErrorCode error);
  818. void TestOnNetworkMadeDefaultNonMigratableStream(bool migrate_idle_sessions);
  819. void TestMigrateSessionEarlyNonMigratableStream(bool migrate_idle_sessions);
  820. void TestOnNetworkDisconnectedNoOpenStreams(bool migrate_idle_sessions);
  821. void TestOnNetworkMadeDefaultNoOpenStreams(bool migrate_idle_sessions);
  822. void TestOnNetworkDisconnectedNonMigratableStream(bool migrate_idle_sessions);
  823. // Port migrations.
  824. void TestSimplePortMigrationOnPathDegrading();
  825. // Tests for DNS HTTPS record with alpn.
  826. void TestRequireDnsHttpsAlpn(
  827. std::vector<HostResolverEndpointResult> endpoints,
  828. bool expect_success);
  829. quic::test::QuicFlagSaver flags_; // Save/restore all QUIC flag values.
  830. std::unique_ptr<MockHostResolverBase> host_resolver_;
  831. std::unique_ptr<SSLConfigService> ssl_config_service_;
  832. std::unique_ptr<MockClientSocketFactory> socket_factory_;
  833. MockCryptoClientStreamFactory crypto_client_stream_factory_;
  834. MockQuicContext context_;
  835. scoped_refptr<TestTaskRunner> runner_;
  836. const quic::ParsedQuicVersion version_;
  837. QuicTestPacketMaker client_maker_;
  838. QuicTestPacketMaker server_maker_;
  839. std::unique_ptr<HttpServerProperties> http_server_properties_;
  840. std::unique_ptr<CertVerifier> cert_verifier_;
  841. TransportSecurityState transport_security_state_;
  842. DefaultCTPolicyEnforcer ct_policy_enforcer_;
  843. std::unique_ptr<ScopedMockNetworkChangeNotifier>
  844. scoped_mock_network_change_notifier_;
  845. std::unique_ptr<QuicStreamFactory> factory_;
  846. url::SchemeHostPort scheme_host_port_;
  847. GURL url_;
  848. GURL url2_;
  849. GURL url3_;
  850. GURL url4_;
  851. PrivacyMode privacy_mode_ = PRIVACY_MODE_DISABLED;
  852. NetLogWithSource net_log_;
  853. TestCompletionCallback callback_;
  854. const CompletionRepeatingCallback failed_on_default_network_callback_;
  855. bool failed_on_default_network_ = false;
  856. NetErrorDetails net_error_details_;
  857. raw_ptr<QuicParams> quic_params_;
  858. };
  859. class QuicStreamFactoryTest : public QuicStreamFactoryTestBase,
  860. public ::testing::TestWithParam<TestParams> {
  861. protected:
  862. QuicStreamFactoryTest()
  863. : QuicStreamFactoryTestBase(
  864. GetParam().version,
  865. GetParam().client_headers_include_h2_stream_dependency) {}
  866. };
  867. INSTANTIATE_TEST_SUITE_P(VersionIncludeStreamDependencySequence,
  868. QuicStreamFactoryTest,
  869. ::testing::ValuesIn(GetTestParams()),
  870. ::testing::PrintToStringParamName());
  871. TEST_P(QuicStreamFactoryTest, Create) {
  872. Initialize();
  873. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  874. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  875. MockQuicData socket_data(version_);
  876. socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  877. if (VersionUsesHttp3(version_.transport_version))
  878. socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
  879. socket_data.AddSocketDataToFactory(socket_factory_.get());
  880. QuicStreamRequest request(factory_.get());
  881. EXPECT_EQ(ERR_IO_PENDING,
  882. request.Request(
  883. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  884. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  885. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  886. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  887. failed_on_default_network_callback_, callback_.callback()));
  888. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  889. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  890. EXPECT_TRUE(stream.get());
  891. EXPECT_EQ(DEFAULT_PRIORITY, host_resolver_->last_request_priority());
  892. QuicStreamRequest request2(factory_.get());
  893. EXPECT_EQ(OK,
  894. request2.Request(
  895. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  896. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  897. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  898. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  899. failed_on_default_network_callback_, callback_.callback()));
  900. // Will reset stream 3.
  901. stream = CreateStream(&request2);
  902. EXPECT_TRUE(stream.get());
  903. // TODO(rtenneti): We should probably have a tests that HTTP and HTTPS result
  904. // in streams on different sessions.
  905. QuicStreamRequest request3(factory_.get());
  906. EXPECT_EQ(OK,
  907. request3.Request(
  908. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  909. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  910. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  911. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  912. failed_on_default_network_callback_, callback_.callback()));
  913. stream = CreateStream(&request3); // Will reset stream 5.
  914. stream.reset(); // Will reset stream 7.
  915. EXPECT_TRUE(socket_data.AllReadDataConsumed());
  916. EXPECT_TRUE(socket_data.AllWriteDataConsumed());
  917. }
  918. TEST_P(QuicStreamFactoryTest, CreateZeroRtt) {
  919. Initialize();
  920. factory_->set_is_quic_known_to_work_on_current_network(true);
  921. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  922. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  923. MockQuicData socket_data(version_);
  924. socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  925. client_maker_.SetEncryptionLevel(quic::ENCRYPTION_ZERO_RTT);
  926. if (VersionUsesHttp3(version_.transport_version))
  927. socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
  928. socket_data.AddSocketDataToFactory(socket_factory_.get());
  929. crypto_client_stream_factory_.set_handshake_mode(
  930. MockCryptoClientStream::ZERO_RTT);
  931. host_resolver_->set_synchronous_mode(true);
  932. host_resolver_->rules()->AddIPLiteralRule(scheme_host_port_.host(),
  933. "192.168.0.1", "");
  934. QuicStreamRequest request(factory_.get());
  935. EXPECT_EQ(OK,
  936. request.Request(
  937. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  938. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  939. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  940. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  941. failed_on_default_network_callback_, callback_.callback()));
  942. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  943. EXPECT_TRUE(stream.get());
  944. EXPECT_TRUE(socket_data.AllReadDataConsumed());
  945. EXPECT_TRUE(socket_data.AllWriteDataConsumed());
  946. }
  947. // Regression test for crbug.com/1117331.
  948. TEST_P(QuicStreamFactoryTest, AsyncZeroRtt) {
  949. Initialize();
  950. if (!version_.UsesTls())
  951. return;
  952. factory_->set_is_quic_known_to_work_on_current_network(true);
  953. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  954. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  955. MockQuicData socket_data(version_);
  956. socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  957. client_maker_.SetEncryptionLevel(quic::ENCRYPTION_ZERO_RTT);
  958. if (VersionUsesHttp3(version_.transport_version))
  959. socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
  960. socket_data.AddSocketDataToFactory(socket_factory_.get());
  961. crypto_client_stream_factory_.set_handshake_mode(
  962. MockCryptoClientStream::ASYNC_ZERO_RTT);
  963. host_resolver_->set_synchronous_mode(true);
  964. host_resolver_->rules()->AddIPLiteralRule(scheme_host_port_.host(),
  965. "192.168.0.1", "");
  966. QuicStreamRequest request(factory_.get());
  967. EXPECT_EQ(ERR_IO_PENDING,
  968. request.Request(
  969. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  970. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  971. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  972. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  973. failed_on_default_network_callback_, callback_.callback()));
  974. EXPECT_FALSE(HasActiveSession(scheme_host_port_));
  975. EXPECT_EQ(nullptr, CreateStream(&request));
  976. crypto_client_stream_factory_.last_stream()->NotifySessionZeroRttComplete();
  977. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  978. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  979. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  980. EXPECT_TRUE(stream.get());
  981. EXPECT_TRUE(socket_data.AllReadDataConsumed());
  982. EXPECT_TRUE(socket_data.AllWriteDataConsumed());
  983. }
  984. TEST_P(QuicStreamFactoryTest, DefaultInitialRtt) {
  985. Initialize();
  986. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  987. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  988. MockQuicData socket_data(version_);
  989. socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  990. if (VersionUsesHttp3(version_.transport_version))
  991. socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
  992. socket_data.AddSocketDataToFactory(socket_factory_.get());
  993. QuicStreamRequest request(factory_.get());
  994. EXPECT_EQ(ERR_IO_PENDING,
  995. request.Request(
  996. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  997. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  998. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  999. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  1000. failed_on_default_network_callback_, callback_.callback()));
  1001. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  1002. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  1003. EXPECT_TRUE(stream.get());
  1004. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  1005. EXPECT_TRUE(session->require_confirmation());
  1006. EXPECT_EQ(100000u, session->connection()->GetStats().srtt_us);
  1007. ASSERT_FALSE(session->config()->HasInitialRoundTripTimeUsToSend());
  1008. }
  1009. TEST_P(QuicStreamFactoryTest, FactoryDestroyedWhenJobPending) {
  1010. Initialize();
  1011. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  1012. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  1013. MockQuicData socket_data(version_);
  1014. socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  1015. if (VersionUsesHttp3(version_.transport_version))
  1016. socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
  1017. socket_data.AddSocketDataToFactory(socket_factory_.get());
  1018. auto request = std::make_unique<QuicStreamRequest>(factory_.get());
  1019. EXPECT_EQ(ERR_IO_PENDING,
  1020. request->Request(
  1021. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  1022. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  1023. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  1024. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  1025. failed_on_default_network_callback_, callback_.callback()));
  1026. request.reset();
  1027. EXPECT_TRUE(HasActiveJob(scheme_host_port_, privacy_mode_));
  1028. // Tearing down a QuicStreamFactory with a pending Job should not cause any
  1029. // crash. crbug.com/768343.
  1030. factory_.reset();
  1031. }
  1032. TEST_P(QuicStreamFactoryTest, RequireConfirmation) {
  1033. crypto_client_stream_factory_.set_handshake_mode(
  1034. MockCryptoClientStream::ZERO_RTT);
  1035. host_resolver_->set_synchronous_mode(true);
  1036. host_resolver_->rules()->AddIPLiteralRule(scheme_host_port_.host(),
  1037. "192.168.0.1", "");
  1038. Initialize();
  1039. factory_->set_is_quic_known_to_work_on_current_network(false);
  1040. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  1041. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  1042. MockQuicData socket_data(version_);
  1043. socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  1044. client_maker_.SetEncryptionLevel(quic::ENCRYPTION_ZERO_RTT);
  1045. if (VersionUsesHttp3(version_.transport_version))
  1046. socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
  1047. socket_data.AddSocketDataToFactory(socket_factory_.get());
  1048. QuicStreamRequest request(factory_.get());
  1049. EXPECT_EQ(ERR_IO_PENDING,
  1050. request.Request(
  1051. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  1052. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  1053. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  1054. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  1055. failed_on_default_network_callback_, callback_.callback()));
  1056. EXPECT_FALSE(http_server_properties_->HasLastLocalAddressWhenQuicWorked());
  1057. crypto_client_stream_factory_.last_stream()
  1058. ->NotifySessionOneRttKeyAvailable();
  1059. EXPECT_TRUE(http_server_properties_->HasLastLocalAddressWhenQuicWorked());
  1060. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  1061. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  1062. EXPECT_TRUE(stream.get());
  1063. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  1064. EXPECT_TRUE(session->require_confirmation());
  1065. }
  1066. TEST_P(QuicStreamFactoryTest, DontRequireConfirmationFromSameIP) {
  1067. crypto_client_stream_factory_.set_handshake_mode(
  1068. MockCryptoClientStream::ZERO_RTT);
  1069. host_resolver_->set_synchronous_mode(true);
  1070. host_resolver_->rules()->AddIPLiteralRule(scheme_host_port_.host(),
  1071. "192.168.0.1", "");
  1072. Initialize();
  1073. factory_->set_is_quic_known_to_work_on_current_network(false);
  1074. http_server_properties_->SetLastLocalAddressWhenQuicWorked(
  1075. IPAddress(192, 0, 2, 33));
  1076. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  1077. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  1078. MockQuicData socket_data(version_);
  1079. socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  1080. client_maker_.SetEncryptionLevel(quic::ENCRYPTION_ZERO_RTT);
  1081. if (VersionUsesHttp3(version_.transport_version))
  1082. socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
  1083. socket_data.AddSocketDataToFactory(socket_factory_.get());
  1084. QuicStreamRequest request(factory_.get());
  1085. EXPECT_THAT(request.Request(
  1086. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  1087. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  1088. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  1089. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  1090. failed_on_default_network_callback_, callback_.callback()),
  1091. IsOk());
  1092. EXPECT_FALSE(http_server_properties_->HasLastLocalAddressWhenQuicWorked());
  1093. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  1094. EXPECT_TRUE(stream.get());
  1095. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  1096. EXPECT_FALSE(session->require_confirmation());
  1097. crypto_client_stream_factory_.last_stream()
  1098. ->NotifySessionOneRttKeyAvailable();
  1099. EXPECT_TRUE(http_server_properties_->HasLastLocalAddressWhenQuicWorked());
  1100. }
  1101. TEST_P(QuicStreamFactoryTest, CachedInitialRtt) {
  1102. ServerNetworkStats stats;
  1103. stats.srtt = base::Milliseconds(10);
  1104. http_server_properties_->SetServerNetworkStats(url::SchemeHostPort(url_),
  1105. NetworkIsolationKey(), stats);
  1106. quic_params_->estimate_initial_rtt = true;
  1107. Initialize();
  1108. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  1109. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  1110. MockQuicData socket_data(version_);
  1111. socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  1112. if (VersionUsesHttp3(version_.transport_version))
  1113. socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
  1114. socket_data.AddSocketDataToFactory(socket_factory_.get());
  1115. QuicStreamRequest request(factory_.get());
  1116. EXPECT_EQ(ERR_IO_PENDING,
  1117. request.Request(
  1118. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  1119. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  1120. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  1121. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  1122. failed_on_default_network_callback_, callback_.callback()));
  1123. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  1124. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  1125. EXPECT_TRUE(stream.get());
  1126. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  1127. EXPECT_EQ(10000u, session->connection()->GetStats().srtt_us);
  1128. ASSERT_TRUE(session->config()->HasInitialRoundTripTimeUsToSend());
  1129. EXPECT_EQ(10000u, session->config()->GetInitialRoundTripTimeUsToSend());
  1130. }
  1131. // Test that QUIC sessions use the cached RTT from HttpServerProperties for the
  1132. // correct NetworkIsolationKey.
  1133. TEST_P(QuicStreamFactoryTest, CachedInitialRttWithNetworkIsolationKey) {
  1134. const SchemefulSite kSite1(GURL("https://foo.test/"));
  1135. const SchemefulSite kSite2(GURL("https://bar.test/"));
  1136. const NetworkIsolationKey kNetworkIsolationKey1(kSite1, kSite1);
  1137. const NetworkIsolationKey kNetworkIsolationKey2(kSite2, kSite2);
  1138. base::test::ScopedFeatureList feature_list;
  1139. feature_list.InitWithFeatures(
  1140. // enabled_features
  1141. {features::kPartitionHttpServerPropertiesByNetworkIsolationKey,
  1142. // Need to partition connections by NetworkIsolationKey for
  1143. // QuicSessionAliasKey to include NetworkIsolationKeys.
  1144. features::kPartitionConnectionsByNetworkIsolationKey},
  1145. // disabled_features
  1146. {});
  1147. // Since HttpServerProperties caches the feature value, have to create a new
  1148. // one.
  1149. http_server_properties_ = std::make_unique<HttpServerProperties>();
  1150. ServerNetworkStats stats;
  1151. stats.srtt = base::Milliseconds(10);
  1152. http_server_properties_->SetServerNetworkStats(url::SchemeHostPort(url_),
  1153. kNetworkIsolationKey1, stats);
  1154. quic_params_->estimate_initial_rtt = true;
  1155. Initialize();
  1156. for (const auto& network_isolation_key :
  1157. {kNetworkIsolationKey1, kNetworkIsolationKey2, NetworkIsolationKey()}) {
  1158. SCOPED_TRACE(network_isolation_key.ToDebugString());
  1159. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  1160. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  1161. QuicTestPacketMaker packet_maker(
  1162. version_,
  1163. quic::QuicUtils::CreateRandomConnectionId(context_.random_generator()),
  1164. context_.clock(), kDefaultServerHostName, quic::Perspective::IS_CLIENT,
  1165. quic_params_->headers_include_h2_stream_dependency);
  1166. MockQuicData socket_data(version_);
  1167. socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  1168. if (VersionUsesHttp3(version_.transport_version)) {
  1169. socket_data.AddWrite(SYNCHRONOUS,
  1170. packet_maker.MakeInitialSettingsPacket(1));
  1171. }
  1172. socket_data.AddSocketDataToFactory(socket_factory_.get());
  1173. QuicStreamRequest request(factory_.get());
  1174. EXPECT_EQ(ERR_IO_PENDING,
  1175. request.Request(
  1176. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  1177. SocketTag(), network_isolation_key, SecureDnsPolicy::kAllow,
  1178. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  1179. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  1180. failed_on_default_network_callback_, callback_.callback()));
  1181. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  1182. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  1183. EXPECT_TRUE(stream.get());
  1184. QuicChromiumClientSession* session =
  1185. GetActiveSession(scheme_host_port_, network_isolation_key);
  1186. if (network_isolation_key == kNetworkIsolationKey1) {
  1187. EXPECT_EQ(10000, session->connection()->GetStats().srtt_us);
  1188. ASSERT_TRUE(session->config()->HasInitialRoundTripTimeUsToSend());
  1189. EXPECT_EQ(10000u, session->config()->GetInitialRoundTripTimeUsToSend());
  1190. } else {
  1191. EXPECT_EQ(quic::kInitialRttMs * 1000,
  1192. session->connection()->GetStats().srtt_us);
  1193. EXPECT_FALSE(session->config()->HasInitialRoundTripTimeUsToSend());
  1194. }
  1195. }
  1196. }
  1197. TEST_P(QuicStreamFactoryTest, 2gInitialRtt) {
  1198. ScopedMockNetworkChangeNotifier notifier;
  1199. notifier.mock_network_change_notifier()->SetConnectionType(
  1200. NetworkChangeNotifier::CONNECTION_2G);
  1201. quic_params_->estimate_initial_rtt = true;
  1202. Initialize();
  1203. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  1204. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  1205. MockQuicData socket_data(version_);
  1206. socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  1207. if (VersionUsesHttp3(version_.transport_version))
  1208. socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
  1209. socket_data.AddSocketDataToFactory(socket_factory_.get());
  1210. QuicStreamRequest request(factory_.get());
  1211. EXPECT_EQ(ERR_IO_PENDING,
  1212. request.Request(
  1213. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  1214. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  1215. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  1216. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  1217. failed_on_default_network_callback_, callback_.callback()));
  1218. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  1219. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  1220. EXPECT_TRUE(stream.get());
  1221. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  1222. EXPECT_EQ(1000000u, session->connection()->GetStats().srtt_us);
  1223. ASSERT_TRUE(session->config()->HasInitialRoundTripTimeUsToSend());
  1224. EXPECT_EQ(1200000u, session->config()->GetInitialRoundTripTimeUsToSend());
  1225. }
  1226. TEST_P(QuicStreamFactoryTest, 3gInitialRtt) {
  1227. ScopedMockNetworkChangeNotifier notifier;
  1228. notifier.mock_network_change_notifier()->SetConnectionType(
  1229. NetworkChangeNotifier::CONNECTION_3G);
  1230. quic_params_->estimate_initial_rtt = true;
  1231. Initialize();
  1232. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  1233. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  1234. MockQuicData socket_data(version_);
  1235. socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  1236. if (VersionUsesHttp3(version_.transport_version))
  1237. socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
  1238. socket_data.AddSocketDataToFactory(socket_factory_.get());
  1239. QuicStreamRequest request(factory_.get());
  1240. EXPECT_EQ(ERR_IO_PENDING,
  1241. request.Request(
  1242. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  1243. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  1244. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  1245. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  1246. failed_on_default_network_callback_, callback_.callback()));
  1247. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  1248. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  1249. EXPECT_TRUE(stream.get());
  1250. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  1251. EXPECT_EQ(400000u, session->connection()->GetStats().srtt_us);
  1252. ASSERT_TRUE(session->config()->HasInitialRoundTripTimeUsToSend());
  1253. EXPECT_EQ(400000u, session->config()->GetInitialRoundTripTimeUsToSend());
  1254. }
  1255. TEST_P(QuicStreamFactoryTest, GoAway) {
  1256. Initialize();
  1257. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  1258. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  1259. MockQuicData socket_data(version_);
  1260. socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  1261. if (VersionUsesHttp3(version_.transport_version))
  1262. socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
  1263. socket_data.AddSocketDataToFactory(socket_factory_.get());
  1264. QuicStreamRequest request(factory_.get());
  1265. EXPECT_EQ(ERR_IO_PENDING,
  1266. request.Request(
  1267. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  1268. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  1269. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  1270. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  1271. failed_on_default_network_callback_, callback_.callback()));
  1272. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  1273. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  1274. EXPECT_TRUE(stream.get());
  1275. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  1276. if (version_.UsesHttp3()) {
  1277. session->OnHttp3GoAway(0);
  1278. } else {
  1279. session->OnGoAway(quic::QuicGoAwayFrame());
  1280. }
  1281. EXPECT_FALSE(HasActiveSession(scheme_host_port_));
  1282. EXPECT_TRUE(socket_data.AllReadDataConsumed());
  1283. EXPECT_TRUE(socket_data.AllWriteDataConsumed());
  1284. }
  1285. TEST_P(QuicStreamFactoryTest, GoAwayForConnectionMigrationWithPortOnly) {
  1286. Initialize();
  1287. // GoAway in HTTP/3 doesn't contain error code. Thus the session can't do
  1288. // error code specific handling.
  1289. if (version_.UsesHttp3()) {
  1290. return;
  1291. }
  1292. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  1293. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  1294. MockQuicData socket_data(version_);
  1295. socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  1296. if (VersionUsesHttp3(version_.transport_version))
  1297. socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
  1298. socket_data.AddSocketDataToFactory(socket_factory_.get());
  1299. QuicStreamRequest request(factory_.get());
  1300. EXPECT_EQ(ERR_IO_PENDING,
  1301. request.Request(
  1302. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  1303. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  1304. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  1305. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  1306. failed_on_default_network_callback_, callback_.callback()));
  1307. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  1308. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  1309. EXPECT_TRUE(stream.get());
  1310. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  1311. session->OnGoAway(quic::QuicGoAwayFrame(
  1312. quic::kInvalidControlFrameId, quic::QUIC_ERROR_MIGRATING_PORT, 0,
  1313. "peer connection migration due to port change only"));
  1314. NetErrorDetails details;
  1315. EXPECT_FALSE(details.quic_port_migration_detected);
  1316. session->PopulateNetErrorDetails(&details);
  1317. EXPECT_TRUE(details.quic_port_migration_detected);
  1318. details.quic_port_migration_detected = false;
  1319. stream->PopulateNetErrorDetails(&details);
  1320. EXPECT_TRUE(details.quic_port_migration_detected);
  1321. EXPECT_FALSE(HasActiveSession(scheme_host_port_));
  1322. EXPECT_TRUE(socket_data.AllReadDataConsumed());
  1323. EXPECT_TRUE(socket_data.AllWriteDataConsumed());
  1324. }
  1325. // Makes sure that setting and clearing ServerNetworkStats respects the
  1326. // NetworkIsolationKey.
  1327. TEST_P(QuicStreamFactoryTest, ServerNetworkStatsWithNetworkIsolationKey) {
  1328. const SchemefulSite kSite1(GURL("https://foo.test/"));
  1329. const SchemefulSite kSite2(GURL("https://bar.test/"));
  1330. const NetworkIsolationKey kNetworkIsolationKey1(kSite1, kSite1);
  1331. const NetworkIsolationKey kNetworkIsolationKey2(kSite2, kSite2);
  1332. const NetworkIsolationKey kNetworkIsolationKeys[] = {
  1333. kNetworkIsolationKey1, kNetworkIsolationKey2, NetworkIsolationKey()};
  1334. base::test::ScopedFeatureList feature_list;
  1335. feature_list.InitWithFeatures(
  1336. // enabled_features
  1337. {features::kPartitionHttpServerPropertiesByNetworkIsolationKey,
  1338. // Need to partition connections by NetworkIsolationKey for
  1339. // QuicSessionAliasKey to include NetworkIsolationKeys.
  1340. features::kPartitionConnectionsByNetworkIsolationKey},
  1341. // disabled_features
  1342. {});
  1343. // Since HttpServerProperties caches the feature value, have to create a new
  1344. // one.
  1345. http_server_properties_ = std::make_unique<HttpServerProperties>();
  1346. Initialize();
  1347. // For each server, set up and tear down a QUIC session cleanly, and check
  1348. // that stats have been added to HttpServerProperties using the correct
  1349. // NetworkIsolationKey.
  1350. for (size_t i = 0; i < std::size(kNetworkIsolationKeys); ++i) {
  1351. SCOPED_TRACE(i);
  1352. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  1353. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  1354. QuicTestPacketMaker packet_maker(
  1355. version_,
  1356. quic::QuicUtils::CreateRandomConnectionId(context_.random_generator()),
  1357. context_.clock(), kDefaultServerHostName, quic::Perspective::IS_CLIENT,
  1358. quic_params_->headers_include_h2_stream_dependency);
  1359. MockQuicData socket_data(version_);
  1360. socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  1361. if (VersionUsesHttp3(version_.transport_version)) {
  1362. socket_data.AddWrite(SYNCHRONOUS,
  1363. packet_maker.MakeInitialSettingsPacket(1));
  1364. }
  1365. socket_data.AddSocketDataToFactory(socket_factory_.get());
  1366. QuicStreamRequest request(factory_.get());
  1367. EXPECT_EQ(
  1368. ERR_IO_PENDING,
  1369. request.Request(
  1370. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  1371. SocketTag(), kNetworkIsolationKeys[i], SecureDnsPolicy::kAllow,
  1372. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  1373. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  1374. failed_on_default_network_callback_, callback_.callback()));
  1375. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  1376. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  1377. EXPECT_TRUE(stream.get());
  1378. QuicChromiumClientSession* session =
  1379. GetActiveSession(scheme_host_port_, kNetworkIsolationKeys[i]);
  1380. if (version_.UsesHttp3()) {
  1381. session->OnHttp3GoAway(0);
  1382. } else {
  1383. session->OnGoAway(quic::QuicGoAwayFrame());
  1384. }
  1385. EXPECT_FALSE(HasActiveSession(scheme_host_port_, kNetworkIsolationKeys[i]));
  1386. EXPECT_TRUE(socket_data.AllReadDataConsumed());
  1387. EXPECT_TRUE(socket_data.AllWriteDataConsumed());
  1388. for (size_t j = 0; j < std::size(kNetworkIsolationKeys); ++j) {
  1389. // Stats up to kNetworkIsolationKeys[j] should have been populated, all
  1390. // others should remain empty.
  1391. if (j <= i) {
  1392. EXPECT_TRUE(http_server_properties_->GetServerNetworkStats(
  1393. url::SchemeHostPort(url_), kNetworkIsolationKeys[j]));
  1394. } else {
  1395. EXPECT_FALSE(http_server_properties_->GetServerNetworkStats(
  1396. url::SchemeHostPort(url_), kNetworkIsolationKeys[j]));
  1397. }
  1398. }
  1399. }
  1400. // Use unmocked crypto stream to do crypto connect, since crypto errors result
  1401. // in deleting network stats..
  1402. crypto_client_stream_factory_.set_handshake_mode(
  1403. MockCryptoClientStream::COLD_START_WITH_CHLO_SENT);
  1404. // For each server, simulate an error during session creation, and check that
  1405. // stats have been deleted from HttpServerProperties using the correct
  1406. // NetworkIsolationKey.
  1407. for (size_t i = 0; i < std::size(kNetworkIsolationKeys); ++i) {
  1408. SCOPED_TRACE(i);
  1409. MockQuicData socket_data(version_);
  1410. socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  1411. // Trigger PACKET_WRITE_ERROR when sending packets in crypto connect.
  1412. socket_data.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE);
  1413. socket_data.AddSocketDataToFactory(socket_factory_.get());
  1414. QuicStreamRequest request(factory_.get());
  1415. EXPECT_EQ(
  1416. ERR_IO_PENDING,
  1417. request.Request(
  1418. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  1419. SocketTag(), kNetworkIsolationKeys[i], SecureDnsPolicy::kAllow,
  1420. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  1421. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  1422. failed_on_default_network_callback_, callback_.callback()));
  1423. EXPECT_THAT(callback_.WaitForResult(), IsError(ERR_QUIC_HANDSHAKE_FAILED));
  1424. EXPECT_FALSE(HasActiveSession(scheme_host_port_, kNetworkIsolationKeys[i]));
  1425. for (size_t j = 0; j < std::size(kNetworkIsolationKeys); ++j) {
  1426. // Stats up to kNetworkIsolationKeys[j] should have been deleted, all
  1427. // others should still be populated.
  1428. if (j <= i) {
  1429. EXPECT_FALSE(http_server_properties_->GetServerNetworkStats(
  1430. url::SchemeHostPort(url_), kNetworkIsolationKeys[j]));
  1431. } else {
  1432. EXPECT_TRUE(http_server_properties_->GetServerNetworkStats(
  1433. url::SchemeHostPort(url_), kNetworkIsolationKeys[j]));
  1434. }
  1435. }
  1436. }
  1437. }
  1438. TEST_P(QuicStreamFactoryTest, Pooling) {
  1439. Initialize();
  1440. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  1441. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  1442. MockQuicData socket_data(version_);
  1443. socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  1444. if (VersionUsesHttp3(version_.transport_version))
  1445. socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
  1446. socket_data.AddSocketDataToFactory(socket_factory_.get());
  1447. url::SchemeHostPort server2(url::kHttpsScheme, kServer2HostName,
  1448. kDefaultServerPort);
  1449. host_resolver_->set_synchronous_mode(true);
  1450. host_resolver_->rules()->AddIPLiteralRule(scheme_host_port_.host(),
  1451. "192.168.0.1", "");
  1452. host_resolver_->rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
  1453. QuicStreamRequest request(factory_.get());
  1454. EXPECT_EQ(OK,
  1455. request.Request(
  1456. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  1457. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  1458. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  1459. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  1460. failed_on_default_network_callback_, callback_.callback()));
  1461. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  1462. EXPECT_TRUE(stream.get());
  1463. TestCompletionCallback callback;
  1464. QuicStreamRequest request2(factory_.get());
  1465. EXPECT_EQ(OK,
  1466. request2.Request(
  1467. server2, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
  1468. NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  1469. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  1470. /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_,
  1471. failed_on_default_network_callback_, callback.callback()));
  1472. std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
  1473. EXPECT_TRUE(stream2.get());
  1474. EXPECT_EQ(GetActiveSession(scheme_host_port_), GetActiveSession(server2));
  1475. EXPECT_TRUE(socket_data.AllReadDataConsumed());
  1476. EXPECT_TRUE(socket_data.AllWriteDataConsumed());
  1477. }
  1478. // Regression test for https://crbug.com/639916.
  1479. TEST_P(QuicStreamFactoryTest, PoolingWithServerMigration) {
  1480. // Set up session to migrate.
  1481. host_resolver_->rules()->AddIPLiteralRule(scheme_host_port_.host(),
  1482. "192.168.0.1", "");
  1483. IPEndPoint alt_address = IPEndPoint(IPAddress(1, 2, 3, 4), 443);
  1484. quic::QuicConfig config;
  1485. if (version_.UsesHttp3()) {
  1486. SetIetfConnectionMigrationFlagsAndConnectionOptions();
  1487. config.SetIPv4AlternateServerAddressToSend(
  1488. ToQuicSocketAddress(alt_address), kNewCID,
  1489. quic::QuicUtils::GenerateStatelessResetToken(kNewCID));
  1490. } else {
  1491. config.SetIPv4AlternateServerAddressToSend(
  1492. ToQuicSocketAddress(alt_address));
  1493. }
  1494. quic::QuicConnectionId cid_on_old_path =
  1495. quic::QuicUtils::CreateRandomConnectionId(context_.random_generator());
  1496. VerifyServerMigration(config, alt_address);
  1497. // Close server-migrated session.
  1498. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  1499. session->CloseSessionOnError(0u, quic::QUIC_NO_ERROR,
  1500. quic::ConnectionCloseBehavior::SILENT_CLOSE);
  1501. EXPECT_FALSE(HasActiveSession(scheme_host_port_));
  1502. client_maker_.Reset();
  1503. // Set up server IP, socket, proof, and config for new session.
  1504. url::SchemeHostPort server2(url::kHttpsScheme, kServer2HostName,
  1505. kDefaultServerPort);
  1506. host_resolver_->rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
  1507. MockQuicData socket_data1(version_);
  1508. socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  1509. if (VersionUsesHttp3(version_.transport_version)) {
  1510. client_maker_.set_connection_id(cid_on_old_path);
  1511. socket_data1.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
  1512. }
  1513. socket_data1.AddSocketDataToFactory(socket_factory_.get());
  1514. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  1515. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  1516. quic::QuicConfig config2;
  1517. crypto_client_stream_factory_.SetConfig(config2);
  1518. // Create new request to cause new session creation.
  1519. TestCompletionCallback callback;
  1520. QuicStreamRequest request2(factory_.get());
  1521. EXPECT_EQ(ERR_IO_PENDING,
  1522. request2.Request(
  1523. server2, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
  1524. NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  1525. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  1526. /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_,
  1527. failed_on_default_network_callback_, callback.callback()));
  1528. EXPECT_EQ(OK, callback.WaitForResult());
  1529. std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
  1530. EXPECT_TRUE(stream2.get());
  1531. EXPECT_TRUE(socket_data1.AllReadDataConsumed());
  1532. EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
  1533. EXPECT_TRUE(HasActiveSession(server2));
  1534. // No zombie entry in session map.
  1535. EXPECT_FALSE(HasActiveSession(scheme_host_port_));
  1536. }
  1537. TEST_P(QuicStreamFactoryTest, NoPoolingAfterGoAway) {
  1538. Initialize();
  1539. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  1540. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  1541. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  1542. MockQuicData socket_data1(version_);
  1543. socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  1544. if (VersionUsesHttp3(version_.transport_version))
  1545. socket_data1.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
  1546. socket_data1.AddSocketDataToFactory(socket_factory_.get());
  1547. client_maker_.Reset();
  1548. MockQuicData socket_data2(version_);
  1549. socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  1550. if (VersionUsesHttp3(version_.transport_version))
  1551. socket_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
  1552. socket_data2.AddSocketDataToFactory(socket_factory_.get());
  1553. url::SchemeHostPort server2(url::kHttpsScheme, kServer2HostName,
  1554. kDefaultServerPort);
  1555. host_resolver_->set_synchronous_mode(true);
  1556. host_resolver_->rules()->AddIPLiteralRule(scheme_host_port_.host(),
  1557. "192.168.0.1", "");
  1558. host_resolver_->rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
  1559. QuicStreamRequest request(factory_.get());
  1560. EXPECT_EQ(OK,
  1561. request.Request(
  1562. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  1563. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  1564. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  1565. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  1566. failed_on_default_network_callback_, callback_.callback()));
  1567. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  1568. EXPECT_TRUE(stream.get());
  1569. TestCompletionCallback callback;
  1570. QuicStreamRequest request2(factory_.get());
  1571. EXPECT_EQ(OK,
  1572. request2.Request(
  1573. server2, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
  1574. NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  1575. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  1576. /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_,
  1577. failed_on_default_network_callback_, callback.callback()));
  1578. std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
  1579. EXPECT_TRUE(stream2.get());
  1580. factory_->OnSessionGoingAway(GetActiveSession(scheme_host_port_));
  1581. EXPECT_FALSE(HasActiveSession(scheme_host_port_));
  1582. EXPECT_FALSE(HasActiveSession(server2));
  1583. TestCompletionCallback callback3;
  1584. QuicStreamRequest request3(factory_.get());
  1585. EXPECT_EQ(OK,
  1586. request3.Request(
  1587. server2, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
  1588. NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  1589. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  1590. /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_,
  1591. failed_on_default_network_callback_, callback3.callback()));
  1592. std::unique_ptr<HttpStream> stream3 = CreateStream(&request3);
  1593. EXPECT_TRUE(stream3.get());
  1594. EXPECT_TRUE(HasActiveSession(server2));
  1595. EXPECT_TRUE(socket_data1.AllReadDataConsumed());
  1596. EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
  1597. EXPECT_TRUE(socket_data2.AllReadDataConsumed());
  1598. EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
  1599. }
  1600. TEST_P(QuicStreamFactoryTest, HttpsPooling) {
  1601. Initialize();
  1602. MockQuicData socket_data(version_);
  1603. socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  1604. if (VersionUsesHttp3(version_.transport_version))
  1605. socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
  1606. socket_data.AddSocketDataToFactory(socket_factory_.get());
  1607. url::SchemeHostPort server1(url::kHttpsScheme, kDefaultServerHostName, 443);
  1608. url::SchemeHostPort server2(url::kHttpsScheme, kServer2HostName, 443);
  1609. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  1610. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  1611. host_resolver_->set_synchronous_mode(true);
  1612. host_resolver_->rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
  1613. host_resolver_->rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
  1614. QuicStreamRequest request(factory_.get());
  1615. EXPECT_EQ(OK,
  1616. request.Request(
  1617. server1, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
  1618. NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  1619. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  1620. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  1621. failed_on_default_network_callback_, callback_.callback()));
  1622. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  1623. EXPECT_TRUE(stream.get());
  1624. TestCompletionCallback callback;
  1625. QuicStreamRequest request2(factory_.get());
  1626. EXPECT_EQ(OK,
  1627. request2.Request(
  1628. server2, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
  1629. NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  1630. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  1631. /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_,
  1632. failed_on_default_network_callback_, callback_.callback()));
  1633. std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
  1634. EXPECT_TRUE(stream2.get());
  1635. EXPECT_EQ(GetActiveSession(server1), GetActiveSession(server2));
  1636. EXPECT_TRUE(socket_data.AllReadDataConsumed());
  1637. EXPECT_TRUE(socket_data.AllWriteDataConsumed());
  1638. }
  1639. TEST_P(QuicStreamFactoryTest, HttpsPoolingWithMatchingPins) {
  1640. Initialize();
  1641. MockQuicData socket_data(version_);
  1642. socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  1643. if (VersionUsesHttp3(version_.transport_version))
  1644. socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
  1645. socket_data.AddSocketDataToFactory(socket_factory_.get());
  1646. url::SchemeHostPort server1(url::kHttpsScheme, kDefaultServerHostName, 443);
  1647. url::SchemeHostPort server2(url::kHttpsScheme, kServer2HostName, 443);
  1648. transport_security_state_.EnableStaticPinsForTesting();
  1649. ScopedTransportSecurityStateSource scoped_security_state_source;
  1650. HashValue primary_pin(HASH_VALUE_SHA256);
  1651. EXPECT_TRUE(primary_pin.FromString(
  1652. "sha256/Nn8jk5By4Vkq6BeOVZ7R7AC6XUUBZsWmUbJR1f1Y5FY="));
  1653. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  1654. verify_details.cert_verify_result.public_key_hashes.push_back(primary_pin);
  1655. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  1656. host_resolver_->set_synchronous_mode(true);
  1657. host_resolver_->rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
  1658. host_resolver_->rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
  1659. QuicStreamRequest request(factory_.get());
  1660. EXPECT_EQ(OK,
  1661. request.Request(
  1662. server1, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
  1663. NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  1664. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  1665. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  1666. failed_on_default_network_callback_, callback_.callback()));
  1667. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  1668. EXPECT_TRUE(stream.get());
  1669. TestCompletionCallback callback;
  1670. QuicStreamRequest request2(factory_.get());
  1671. EXPECT_EQ(OK,
  1672. request2.Request(
  1673. server2, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
  1674. NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  1675. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  1676. /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_,
  1677. failed_on_default_network_callback_, callback_.callback()));
  1678. std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
  1679. EXPECT_TRUE(stream2.get());
  1680. EXPECT_EQ(GetActiveSession(server1), GetActiveSession(server2));
  1681. EXPECT_TRUE(socket_data.AllReadDataConsumed());
  1682. EXPECT_TRUE(socket_data.AllWriteDataConsumed());
  1683. }
  1684. TEST_P(QuicStreamFactoryTest, NoHttpsPoolingWithDifferentPins) {
  1685. base::test::ScopedFeatureList scoped_feature_list_;
  1686. scoped_feature_list_.InitAndEnableFeature(
  1687. net::features::kStaticKeyPinningEnforcement);
  1688. Initialize();
  1689. MockQuicData socket_data1(version_);
  1690. socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  1691. if (VersionUsesHttp3(version_.transport_version))
  1692. socket_data1.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
  1693. socket_data1.AddSocketDataToFactory(socket_factory_.get());
  1694. client_maker_.Reset();
  1695. MockQuicData socket_data2(version_);
  1696. socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  1697. if (VersionUsesHttp3(version_.transport_version))
  1698. socket_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
  1699. socket_data2.AddSocketDataToFactory(socket_factory_.get());
  1700. url::SchemeHostPort server1(url::kHttpsScheme, kDefaultServerHostName, 443);
  1701. url::SchemeHostPort server2(url::kHttpsScheme, kServer2HostName, 443);
  1702. transport_security_state_.EnableStaticPinsForTesting();
  1703. transport_security_state_.SetPinningListAlwaysTimelyForTesting(true);
  1704. ScopedTransportSecurityStateSource scoped_security_state_source;
  1705. ProofVerifyDetailsChromium verify_details1 = DefaultProofVerifyDetails();
  1706. uint8_t bad_pin = 3;
  1707. verify_details1.cert_verify_result.public_key_hashes.push_back(
  1708. test::GetTestHashValue(bad_pin));
  1709. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details1);
  1710. HashValue primary_pin(HASH_VALUE_SHA256);
  1711. EXPECT_TRUE(primary_pin.FromString(
  1712. "sha256/Nn8jk5By4Vkq6BeOVZ7R7AC6XUUBZsWmUbJR1f1Y5FY="));
  1713. ProofVerifyDetailsChromium verify_details2 = DefaultProofVerifyDetails();
  1714. verify_details2.cert_verify_result.public_key_hashes.push_back(primary_pin);
  1715. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details2);
  1716. host_resolver_->set_synchronous_mode(true);
  1717. host_resolver_->rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
  1718. host_resolver_->rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
  1719. QuicStreamRequest request(factory_.get());
  1720. EXPECT_EQ(OK,
  1721. request.Request(
  1722. server1, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
  1723. NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  1724. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  1725. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  1726. failed_on_default_network_callback_, callback_.callback()));
  1727. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  1728. EXPECT_TRUE(stream.get());
  1729. TestCompletionCallback callback;
  1730. QuicStreamRequest request2(factory_.get());
  1731. EXPECT_EQ(OK,
  1732. request2.Request(
  1733. server2, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
  1734. NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  1735. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  1736. /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_,
  1737. failed_on_default_network_callback_, callback_.callback()));
  1738. std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
  1739. EXPECT_TRUE(stream2.get());
  1740. EXPECT_NE(GetActiveSession(server1), GetActiveSession(server2));
  1741. EXPECT_TRUE(socket_data1.AllReadDataConsumed());
  1742. EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
  1743. EXPECT_TRUE(socket_data2.AllReadDataConsumed());
  1744. EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
  1745. }
  1746. TEST_P(QuicStreamFactoryTest, Goaway) {
  1747. Initialize();
  1748. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  1749. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  1750. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  1751. MockQuicData socket_data(version_);
  1752. socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  1753. if (VersionUsesHttp3(version_.transport_version))
  1754. socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
  1755. socket_data.AddSocketDataToFactory(socket_factory_.get());
  1756. client_maker_.Reset();
  1757. MockQuicData socket_data2(version_);
  1758. socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  1759. if (VersionUsesHttp3(version_.transport_version))
  1760. socket_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
  1761. socket_data2.AddSocketDataToFactory(socket_factory_.get());
  1762. QuicStreamRequest request(factory_.get());
  1763. EXPECT_EQ(ERR_IO_PENDING,
  1764. request.Request(
  1765. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  1766. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  1767. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  1768. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  1769. failed_on_default_network_callback_, callback_.callback()));
  1770. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  1771. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  1772. EXPECT_TRUE(stream.get());
  1773. // Mark the session as going away. Ensure that while it is still alive
  1774. // that it is no longer active.
  1775. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  1776. factory_->OnSessionGoingAway(session);
  1777. EXPECT_EQ(true,
  1778. QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  1779. EXPECT_FALSE(HasActiveSession(scheme_host_port_));
  1780. // Create a new request for the same destination and verify that a
  1781. // new session is created.
  1782. QuicStreamRequest request2(factory_.get());
  1783. EXPECT_EQ(ERR_IO_PENDING,
  1784. request2.Request(
  1785. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  1786. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  1787. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  1788. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  1789. failed_on_default_network_callback_, callback_.callback()));
  1790. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  1791. std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
  1792. EXPECT_TRUE(stream2.get());
  1793. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  1794. EXPECT_NE(session, GetActiveSession(scheme_host_port_));
  1795. EXPECT_EQ(true,
  1796. QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  1797. stream2.reset();
  1798. stream.reset();
  1799. EXPECT_TRUE(socket_data.AllReadDataConsumed());
  1800. EXPECT_TRUE(socket_data.AllWriteDataConsumed());
  1801. EXPECT_TRUE(socket_data2.AllReadDataConsumed());
  1802. EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
  1803. }
  1804. TEST_P(QuicStreamFactoryTest, MaxOpenStream) {
  1805. Initialize();
  1806. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  1807. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  1808. quic::QuicStreamId stream_id = GetNthClientInitiatedBidirectionalStreamId(0);
  1809. MockQuicData socket_data(version_);
  1810. if (version_.HasIetfQuicFrames()) {
  1811. int packet_num = 1;
  1812. socket_data.AddWrite(SYNCHRONOUS,
  1813. ConstructInitialSettingsPacket(packet_num++));
  1814. socket_data.AddWrite(SYNCHRONOUS, client_maker_.MakeStreamsBlockedPacket(
  1815. packet_num++, true, 50,
  1816. /*unidirectional=*/false));
  1817. socket_data.AddWrite(
  1818. SYNCHRONOUS, client_maker_.MakeDataPacket(
  1819. packet_num++, GetQpackDecoderStreamId(), true, false,
  1820. StreamCancellationQpackDecoderInstruction(0)));
  1821. socket_data.AddWrite(
  1822. SYNCHRONOUS, client_maker_.MakeRstPacket(packet_num++, true, stream_id,
  1823. quic::QUIC_STREAM_CANCELLED));
  1824. socket_data.AddRead(
  1825. ASYNC, server_maker_.MakeRstPacket(1, false, stream_id,
  1826. quic::QUIC_STREAM_CANCELLED));
  1827. socket_data.AddRead(
  1828. ASYNC, server_maker_.MakeMaxStreamsPacket(2, true, 52,
  1829. /*unidirectional=*/false));
  1830. socket_data.AddWrite(SYNCHRONOUS,
  1831. client_maker_.MakeAckPacket(packet_num++, 2, 1));
  1832. } else {
  1833. socket_data.AddWrite(
  1834. SYNCHRONOUS, client_maker_.MakeRstPacket(1, true, stream_id,
  1835. quic::QUIC_STREAM_CANCELLED));
  1836. socket_data.AddRead(
  1837. ASYNC, server_maker_.MakeRstPacket(1, false, stream_id,
  1838. quic::QUIC_STREAM_CANCELLED));
  1839. }
  1840. socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  1841. socket_data.AddSocketDataToFactory(socket_factory_.get());
  1842. HttpRequestInfo request_info;
  1843. request_info.traffic_annotation =
  1844. MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
  1845. std::vector<std::unique_ptr<HttpStream>> streams;
  1846. // The MockCryptoClientStream sets max_open_streams to be
  1847. // quic::kDefaultMaxStreamsPerConnection / 2.
  1848. for (size_t i = 0; i < quic::kDefaultMaxStreamsPerConnection / 2; i++) {
  1849. QuicStreamRequest request(factory_.get());
  1850. int rv = request.Request(
  1851. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  1852. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  1853. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  1854. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  1855. failed_on_default_network_callback_, callback_.callback());
  1856. if (i == 0) {
  1857. EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
  1858. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  1859. } else {
  1860. EXPECT_THAT(rv, IsOk());
  1861. }
  1862. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  1863. EXPECT_TRUE(stream);
  1864. stream->RegisterRequest(&request_info);
  1865. EXPECT_EQ(OK, stream->InitializeStream(false, DEFAULT_PRIORITY, net_log_,
  1866. CompletionOnceCallback()));
  1867. streams.push_back(std::move(stream));
  1868. }
  1869. QuicStreamRequest request(factory_.get());
  1870. EXPECT_EQ(OK,
  1871. request.Request(
  1872. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  1873. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  1874. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  1875. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  1876. failed_on_default_network_callback_, CompletionOnceCallback()));
  1877. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  1878. EXPECT_TRUE(stream);
  1879. stream->RegisterRequest(&request_info);
  1880. EXPECT_EQ(ERR_IO_PENDING,
  1881. stream->InitializeStream(false, DEFAULT_PRIORITY, net_log_,
  1882. callback_.callback()));
  1883. // Close the first stream.
  1884. streams.front()->Close(false);
  1885. // Trigger exchange of RSTs that in turn allow progress for the last
  1886. // stream.
  1887. base::RunLoop().RunUntilIdle();
  1888. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  1889. EXPECT_TRUE(socket_data.AllReadDataConsumed());
  1890. EXPECT_TRUE(socket_data.AllWriteDataConsumed());
  1891. // Force close of the connection to suppress the generation of RST
  1892. // packets when streams are torn down, which wouldn't be relevant to
  1893. // this test anyway.
  1894. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  1895. session->connection()->CloseConnection(
  1896. quic::QUIC_PUBLIC_RESET, "test",
  1897. quic::ConnectionCloseBehavior::SILENT_CLOSE);
  1898. }
  1899. TEST_P(QuicStreamFactoryTest, ResolutionErrorInCreate) {
  1900. Initialize();
  1901. MockQuicData socket_data(version_);
  1902. socket_data.AddSocketDataToFactory(socket_factory_.get());
  1903. host_resolver_->rules()->AddSimulatedFailure(kDefaultServerHostName);
  1904. QuicStreamRequest request(factory_.get());
  1905. EXPECT_EQ(ERR_IO_PENDING,
  1906. request.Request(
  1907. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  1908. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  1909. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  1910. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  1911. failed_on_default_network_callback_, callback_.callback()));
  1912. EXPECT_THAT(callback_.WaitForResult(), IsError(ERR_NAME_NOT_RESOLVED));
  1913. EXPECT_TRUE(socket_data.AllReadDataConsumed());
  1914. EXPECT_TRUE(socket_data.AllWriteDataConsumed());
  1915. }
  1916. TEST_P(QuicStreamFactoryTest, ConnectErrorInCreate) {
  1917. Initialize();
  1918. MockQuicData socket_data(version_);
  1919. socket_data.AddConnect(SYNCHRONOUS, ERR_ADDRESS_IN_USE);
  1920. socket_data.AddSocketDataToFactory(socket_factory_.get());
  1921. QuicStreamRequest request(factory_.get());
  1922. EXPECT_EQ(ERR_IO_PENDING,
  1923. request.Request(
  1924. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  1925. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  1926. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  1927. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  1928. failed_on_default_network_callback_, callback_.callback()));
  1929. EXPECT_THAT(callback_.WaitForResult(), IsError(ERR_ADDRESS_IN_USE));
  1930. EXPECT_TRUE(socket_data.AllReadDataConsumed());
  1931. EXPECT_TRUE(socket_data.AllWriteDataConsumed());
  1932. }
  1933. TEST_P(QuicStreamFactoryTest, CancelCreate) {
  1934. Initialize();
  1935. MockQuicData socket_data(version_);
  1936. socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  1937. if (VersionUsesHttp3(version_.transport_version))
  1938. socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
  1939. socket_data.AddSocketDataToFactory(socket_factory_.get());
  1940. {
  1941. QuicStreamRequest request(factory_.get());
  1942. EXPECT_EQ(ERR_IO_PENDING,
  1943. request.Request(
  1944. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  1945. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  1946. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  1947. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  1948. failed_on_default_network_callback_, callback_.callback()));
  1949. }
  1950. base::RunLoop().RunUntilIdle();
  1951. QuicStreamRequest request2(factory_.get());
  1952. EXPECT_EQ(OK,
  1953. request2.Request(
  1954. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  1955. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  1956. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  1957. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  1958. failed_on_default_network_callback_, callback_.callback()));
  1959. std::unique_ptr<HttpStream> stream = CreateStream(&request2);
  1960. EXPECT_TRUE(stream.get());
  1961. stream.reset();
  1962. EXPECT_TRUE(socket_data.AllReadDataConsumed());
  1963. EXPECT_TRUE(socket_data.AllWriteDataConsumed());
  1964. }
  1965. TEST_P(QuicStreamFactoryTest, CloseAllSessions) {
  1966. Initialize();
  1967. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  1968. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  1969. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  1970. MockQuicData socket_data(version_);
  1971. socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  1972. int packet_num = 1;
  1973. if (VersionUsesHttp3(version_.transport_version)) {
  1974. socket_data.AddWrite(SYNCHRONOUS,
  1975. ConstructInitialSettingsPacket(packet_num++));
  1976. }
  1977. socket_data.AddWrite(
  1978. SYNCHRONOUS,
  1979. client_maker_.MakeConnectionClosePacket(
  1980. packet_num++, true, quic::QUIC_PEER_GOING_AWAY, "net error"));
  1981. socket_data.AddSocketDataToFactory(socket_factory_.get());
  1982. client_maker_.Reset();
  1983. MockQuicData socket_data2(version_);
  1984. socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  1985. if (VersionUsesHttp3(version_.transport_version))
  1986. socket_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
  1987. socket_data2.AddSocketDataToFactory(socket_factory_.get());
  1988. QuicStreamRequest request(factory_.get());
  1989. EXPECT_EQ(ERR_IO_PENDING,
  1990. request.Request(
  1991. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  1992. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  1993. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  1994. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  1995. failed_on_default_network_callback_, callback_.callback()));
  1996. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  1997. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  1998. HttpRequestInfo request_info;
  1999. request_info.traffic_annotation =
  2000. MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
  2001. stream->RegisterRequest(&request_info);
  2002. EXPECT_EQ(OK, stream->InitializeStream(false, DEFAULT_PRIORITY, net_log_,
  2003. CompletionOnceCallback()));
  2004. // Close the session and verify that stream saw the error.
  2005. factory_->CloseAllSessions(ERR_INTERNET_DISCONNECTED,
  2006. quic::QUIC_PEER_GOING_AWAY);
  2007. EXPECT_EQ(ERR_INTERNET_DISCONNECTED,
  2008. stream->ReadResponseHeaders(callback_.callback()));
  2009. // Now attempting to request a stream to the same origin should create
  2010. // a new session.
  2011. QuicStreamRequest request2(factory_.get());
  2012. EXPECT_EQ(ERR_IO_PENDING,
  2013. request2.Request(
  2014. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  2015. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  2016. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  2017. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  2018. failed_on_default_network_callback_, callback_.callback()));
  2019. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  2020. stream = CreateStream(&request2);
  2021. stream.reset(); // Will reset stream 3.
  2022. EXPECT_TRUE(socket_data.AllReadDataConsumed());
  2023. EXPECT_TRUE(socket_data.AllWriteDataConsumed());
  2024. EXPECT_TRUE(socket_data2.AllReadDataConsumed());
  2025. EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
  2026. }
  2027. // Regression test for crbug.com/700617. Test a write error during the
  2028. // crypto handshake will not hang QuicStreamFactory::Job and should
  2029. // report QUIC_HANDSHAKE_FAILED to upper layers. Subsequent
  2030. // QuicStreamRequest should succeed without hanging.
  2031. TEST_P(QuicStreamFactoryTest,
  2032. WriteErrorInCryptoConnectWithAsyncHostResolution) {
  2033. Initialize();
  2034. // Use unmocked crypto stream to do crypto connect.
  2035. crypto_client_stream_factory_.set_handshake_mode(
  2036. MockCryptoClientStream::COLD_START_WITH_CHLO_SENT);
  2037. MockQuicData socket_data(version_);
  2038. socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  2039. // Trigger PACKET_WRITE_ERROR when sending packets in crypto connect.
  2040. socket_data.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE);
  2041. socket_data.AddSocketDataToFactory(socket_factory_.get());
  2042. // Create request, should fail after the write of the CHLO fails.
  2043. QuicStreamRequest request(factory_.get());
  2044. EXPECT_EQ(ERR_IO_PENDING,
  2045. request.Request(
  2046. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  2047. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  2048. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  2049. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  2050. failed_on_default_network_callback_, callback_.callback()));
  2051. EXPECT_EQ(ERR_QUIC_HANDSHAKE_FAILED, callback_.WaitForResult());
  2052. EXPECT_FALSE(HasActiveSession(scheme_host_port_));
  2053. EXPECT_FALSE(HasActiveJob(scheme_host_port_, privacy_mode_));
  2054. // Verify new requests can be sent normally without hanging.
  2055. crypto_client_stream_factory_.set_handshake_mode(
  2056. MockCryptoClientStream::COLD_START);
  2057. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  2058. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  2059. client_maker_.Reset();
  2060. MockQuicData socket_data2(version_);
  2061. socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  2062. if (VersionUsesHttp3(version_.transport_version))
  2063. socket_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
  2064. socket_data2.AddSocketDataToFactory(socket_factory_.get());
  2065. QuicStreamRequest request2(factory_.get());
  2066. EXPECT_EQ(ERR_IO_PENDING,
  2067. request2.Request(
  2068. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  2069. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  2070. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  2071. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  2072. failed_on_default_network_callback_, callback_.callback()));
  2073. EXPECT_FALSE(HasActiveSession(scheme_host_port_));
  2074. EXPECT_TRUE(HasActiveJob(scheme_host_port_, privacy_mode_));
  2075. // Run the message loop to complete host resolution.
  2076. base::RunLoop().RunUntilIdle();
  2077. // Complete handshake. QuicStreamFactory::Job should complete and succeed.
  2078. crypto_client_stream_factory_.last_stream()
  2079. ->NotifySessionOneRttKeyAvailable();
  2080. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  2081. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  2082. EXPECT_FALSE(HasActiveJob(scheme_host_port_, privacy_mode_));
  2083. // Create QuicHttpStream.
  2084. std::unique_ptr<HttpStream> stream = CreateStream(&request2);
  2085. EXPECT_TRUE(stream.get());
  2086. stream.reset();
  2087. EXPECT_TRUE(socket_data.AllReadDataConsumed());
  2088. EXPECT_TRUE(socket_data.AllWriteDataConsumed());
  2089. EXPECT_TRUE(socket_data2.AllReadDataConsumed());
  2090. EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
  2091. }
  2092. TEST_P(QuicStreamFactoryTest, WriteErrorInCryptoConnectWithSyncHostResolution) {
  2093. Initialize();
  2094. // Use unmocked crypto stream to do crypto connect.
  2095. crypto_client_stream_factory_.set_handshake_mode(
  2096. MockCryptoClientStream::COLD_START_WITH_CHLO_SENT);
  2097. host_resolver_->set_synchronous_mode(true);
  2098. host_resolver_->rules()->AddIPLiteralRule(scheme_host_port_.host(),
  2099. "192.168.0.1", "");
  2100. MockQuicData socket_data(version_);
  2101. socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  2102. // Trigger PACKET_WRITE_ERROR when sending packets in crypto connect.
  2103. socket_data.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE);
  2104. socket_data.AddSocketDataToFactory(socket_factory_.get());
  2105. // Create request, should fail immediately.
  2106. QuicStreamRequest request(factory_.get());
  2107. EXPECT_EQ(ERR_QUIC_HANDSHAKE_FAILED,
  2108. request.Request(
  2109. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  2110. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  2111. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  2112. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  2113. failed_on_default_network_callback_, callback_.callback()));
  2114. // Check no active session, or active jobs left for this server.
  2115. EXPECT_FALSE(HasActiveSession(scheme_host_port_));
  2116. EXPECT_FALSE(HasActiveJob(scheme_host_port_, privacy_mode_));
  2117. // Verify new requests can be sent normally without hanging.
  2118. crypto_client_stream_factory_.set_handshake_mode(
  2119. MockCryptoClientStream::COLD_START);
  2120. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  2121. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  2122. client_maker_.Reset();
  2123. MockQuicData socket_data2(version_);
  2124. socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  2125. if (VersionUsesHttp3(version_.transport_version))
  2126. socket_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
  2127. socket_data2.AddSocketDataToFactory(socket_factory_.get());
  2128. QuicStreamRequest request2(factory_.get());
  2129. EXPECT_EQ(ERR_IO_PENDING,
  2130. request2.Request(
  2131. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  2132. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  2133. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  2134. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  2135. failed_on_default_network_callback_, callback_.callback()));
  2136. EXPECT_FALSE(HasActiveSession(scheme_host_port_));
  2137. EXPECT_TRUE(HasActiveJob(scheme_host_port_, privacy_mode_));
  2138. // Complete handshake.
  2139. crypto_client_stream_factory_.last_stream()
  2140. ->NotifySessionOneRttKeyAvailable();
  2141. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  2142. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  2143. EXPECT_FALSE(HasActiveJob(scheme_host_port_, privacy_mode_));
  2144. // Create QuicHttpStream.
  2145. std::unique_ptr<HttpStream> stream = CreateStream(&request2);
  2146. EXPECT_TRUE(stream.get());
  2147. stream.reset();
  2148. EXPECT_TRUE(socket_data.AllReadDataConsumed());
  2149. EXPECT_TRUE(socket_data.AllWriteDataConsumed());
  2150. EXPECT_TRUE(socket_data2.AllReadDataConsumed());
  2151. EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
  2152. }
  2153. TEST_P(QuicStreamFactoryTest, CloseSessionsOnIPAddressChanged) {
  2154. quic_params_->close_sessions_on_ip_change = true;
  2155. Initialize();
  2156. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  2157. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  2158. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  2159. MockQuicData socket_data(version_);
  2160. socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  2161. int packet_num = 1;
  2162. if (VersionUsesHttp3(version_.transport_version)) {
  2163. socket_data.AddWrite(SYNCHRONOUS,
  2164. ConstructInitialSettingsPacket(packet_num++));
  2165. }
  2166. socket_data.AddWrite(
  2167. SYNCHRONOUS,
  2168. client_maker_.MakeConnectionClosePacket(
  2169. packet_num, true, quic::QUIC_IP_ADDRESS_CHANGED, "net error"));
  2170. socket_data.AddSocketDataToFactory(socket_factory_.get());
  2171. client_maker_.Reset();
  2172. MockQuicData socket_data2(version_);
  2173. socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  2174. if (VersionUsesHttp3(version_.transport_version))
  2175. socket_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
  2176. socket_data2.AddSocketDataToFactory(socket_factory_.get());
  2177. QuicStreamRequest request(factory_.get());
  2178. EXPECT_EQ(ERR_IO_PENDING,
  2179. request.Request(
  2180. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  2181. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  2182. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  2183. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  2184. failed_on_default_network_callback_, callback_.callback()));
  2185. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  2186. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  2187. HttpRequestInfo request_info;
  2188. request_info.traffic_annotation =
  2189. MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
  2190. stream->RegisterRequest(&request_info);
  2191. EXPECT_EQ(OK, stream->InitializeStream(false, DEFAULT_PRIORITY, net_log_,
  2192. CompletionOnceCallback()));
  2193. // Check an active session exists for the destination.
  2194. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  2195. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  2196. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  2197. EXPECT_TRUE(http_server_properties_->HasLastLocalAddressWhenQuicWorked());
  2198. // Change the IP address and verify that stream saw the error and the active
  2199. // session is closed.
  2200. NotifyIPAddressChanged();
  2201. EXPECT_EQ(ERR_NETWORK_CHANGED,
  2202. stream->ReadResponseHeaders(callback_.callback()));
  2203. EXPECT_FALSE(factory_->is_quic_known_to_work_on_current_network());
  2204. EXPECT_FALSE(http_server_properties_->HasLastLocalAddressWhenQuicWorked());
  2205. // Check no active session exists for the destination.
  2206. EXPECT_FALSE(HasActiveSession(scheme_host_port_));
  2207. // Now attempting to request a stream to the same origin should create
  2208. // a new session.
  2209. QuicStreamRequest request2(factory_.get());
  2210. EXPECT_EQ(ERR_IO_PENDING,
  2211. request2.Request(
  2212. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  2213. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  2214. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  2215. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  2216. failed_on_default_network_callback_, callback_.callback()));
  2217. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  2218. stream = CreateStream(&request2);
  2219. // Check a new active session exists for the destination and the old session
  2220. // is no longer live.
  2221. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  2222. QuicChromiumClientSession* session2 = GetActiveSession(scheme_host_port_);
  2223. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session2));
  2224. stream.reset(); // Will reset stream 3.
  2225. EXPECT_TRUE(socket_data.AllReadDataConsumed());
  2226. EXPECT_TRUE(socket_data.AllWriteDataConsumed());
  2227. EXPECT_TRUE(socket_data2.AllReadDataConsumed());
  2228. EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
  2229. }
  2230. // Test that if goaway_session_on_ip_change is set, old sessions will be marked
  2231. // as going away on IP address change instead of being closed. New requests will
  2232. // go to a new connection.
  2233. TEST_P(QuicStreamFactoryTest, GoAwaySessionsOnIPAddressChanged) {
  2234. quic_params_->goaway_sessions_on_ip_change = true;
  2235. Initialize();
  2236. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  2237. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  2238. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  2239. MockQuicData quic_data1(version_);
  2240. int packet_num = 1;
  2241. if (VersionUsesHttp3(version_.transport_version)) {
  2242. quic_data1.AddWrite(SYNCHRONOUS,
  2243. ConstructInitialSettingsPacket(packet_num++));
  2244. }
  2245. quic_data1.AddWrite(
  2246. SYNCHRONOUS,
  2247. ConstructGetRequestPacket(packet_num++,
  2248. GetNthClientInitiatedBidirectionalStreamId(0),
  2249. true, true));
  2250. quic_data1.AddRead(ASYNC, ERR_IO_PENDING); // Pause
  2251. quic_data1.AddRead(
  2252. ASYNC,
  2253. ConstructOkResponsePacket(
  2254. 1, GetNthClientInitiatedBidirectionalStreamId(0), false, true));
  2255. quic_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
  2256. quic_data1.AddSocketDataToFactory(socket_factory_.get());
  2257. client_maker_.Reset();
  2258. MockQuicData quic_data2(version_);
  2259. quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
  2260. if (VersionUsesHttp3(version_.transport_version))
  2261. quic_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket(1));
  2262. quic_data2.AddSocketDataToFactory(socket_factory_.get());
  2263. // Create request and QuicHttpStream.
  2264. QuicStreamRequest request(factory_.get());
  2265. EXPECT_EQ(ERR_IO_PENDING,
  2266. request.Request(
  2267. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  2268. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  2269. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  2270. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  2271. failed_on_default_network_callback_, callback_.callback()));
  2272. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  2273. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  2274. EXPECT_TRUE(stream.get());
  2275. // Cause QUIC stream to be created.
  2276. HttpRequestInfo request_info;
  2277. request_info.method = "GET";
  2278. request_info.url = url_;
  2279. request_info.traffic_annotation =
  2280. MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
  2281. stream->RegisterRequest(&request_info);
  2282. EXPECT_EQ(OK, stream->InitializeStream(true, DEFAULT_PRIORITY, net_log_,
  2283. CompletionOnceCallback()));
  2284. // Ensure that session is alive and active.
  2285. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  2286. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  2287. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  2288. // Send GET request on stream.
  2289. HttpResponseInfo response;
  2290. HttpRequestHeaders request_headers;
  2291. EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
  2292. callback_.callback()));
  2293. // Receive an IP address change notification.
  2294. NotifyIPAddressChanged();
  2295. // The connection should still be alive, but marked as going away.
  2296. EXPECT_FALSE(HasActiveSession(scheme_host_port_));
  2297. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  2298. EXPECT_EQ(1u, session->GetNumActiveStreams());
  2299. // Resume the data, response should be read from the original connection.
  2300. quic_data1.Resume();
  2301. EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
  2302. EXPECT_EQ(200, response.headers->response_code());
  2303. EXPECT_EQ(0u, session->GetNumActiveStreams());
  2304. // Second request should be sent on a new connection.
  2305. QuicStreamRequest request2(factory_.get());
  2306. EXPECT_EQ(ERR_IO_PENDING,
  2307. request2.Request(
  2308. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  2309. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  2310. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  2311. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  2312. failed_on_default_network_callback_, callback_.callback()));
  2313. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  2314. std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
  2315. EXPECT_TRUE(stream2.get());
  2316. // Check an active session exists for the destination.
  2317. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  2318. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  2319. QuicChromiumClientSession* session2 = GetActiveSession(scheme_host_port_);
  2320. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session2));
  2321. stream.reset();
  2322. stream2.reset();
  2323. EXPECT_TRUE(quic_data1.AllReadDataConsumed());
  2324. EXPECT_TRUE(quic_data1.AllWriteDataConsumed());
  2325. EXPECT_TRUE(quic_data2.AllReadDataConsumed());
  2326. EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
  2327. }
  2328. TEST_P(QuicStreamFactoryTest, OnIPAddressChangedWithConnectionMigration) {
  2329. if (!version_.UsesHttp3())
  2330. return;
  2331. InitializeConnectionMigrationV2Test(
  2332. {kDefaultNetworkForTests, kNewNetworkForTests});
  2333. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  2334. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  2335. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  2336. MockQuicData socket_data(version_);
  2337. socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  2338. int packet_num = 1;
  2339. socket_data.AddWrite(SYNCHRONOUS,
  2340. ConstructInitialSettingsPacket(packet_num++));
  2341. socket_data.AddWrite(SYNCHRONOUS,
  2342. client_maker_.MakeDataPacket(
  2343. packet_num++, GetQpackDecoderStreamId(), true, false,
  2344. StreamCancellationQpackDecoderInstruction(0)));
  2345. socket_data.AddWrite(
  2346. SYNCHRONOUS,
  2347. ConstructClientRstPacket(packet_num, quic::QUIC_STREAM_CANCELLED));
  2348. socket_data.AddSocketDataToFactory(socket_factory_.get());
  2349. QuicStreamRequest request(factory_.get());
  2350. EXPECT_EQ(ERR_IO_PENDING,
  2351. request.Request(
  2352. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  2353. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  2354. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  2355. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  2356. failed_on_default_network_callback_, callback_.callback()));
  2357. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  2358. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  2359. HttpRequestInfo request_info;
  2360. request_info.traffic_annotation =
  2361. MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
  2362. stream->RegisterRequest(&request_info);
  2363. EXPECT_EQ(OK, stream->InitializeStream(false, DEFAULT_PRIORITY, net_log_,
  2364. CompletionOnceCallback()));
  2365. EXPECT_TRUE(http_server_properties_->HasLastLocalAddressWhenQuicWorked());
  2366. // Change the IP address and verify that the connection is unaffected.
  2367. NotifyIPAddressChanged();
  2368. EXPECT_TRUE(factory_->is_quic_known_to_work_on_current_network());
  2369. EXPECT_TRUE(http_server_properties_->HasLastLocalAddressWhenQuicWorked());
  2370. // Attempting a new request to the same origin uses the same connection.
  2371. QuicStreamRequest request2(factory_.get());
  2372. EXPECT_EQ(OK,
  2373. request2.Request(
  2374. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  2375. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  2376. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  2377. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  2378. failed_on_default_network_callback_, callback_.callback()));
  2379. stream = CreateStream(&request2);
  2380. stream.reset();
  2381. EXPECT_TRUE(socket_data.AllReadDataConsumed());
  2382. EXPECT_TRUE(socket_data.AllWriteDataConsumed());
  2383. }
  2384. TEST_P(QuicStreamFactoryTest, MigrateOnNetworkMadeDefaultWithSynchronousWrite) {
  2385. TestMigrationOnNetworkMadeDefault(SYNCHRONOUS);
  2386. }
  2387. TEST_P(QuicStreamFactoryTest, MigrateOnNetworkMadeDefaultWithAsyncWrite) {
  2388. TestMigrationOnNetworkMadeDefault(ASYNC);
  2389. }
  2390. // Sets up a test which attempts connection migration successfully after probing
  2391. // when a new network is made as default and the old default is still available.
  2392. // |write_mode| specifies the write mode for the last write before
  2393. // OnNetworkMadeDefault is delivered to session.
  2394. void QuicStreamFactoryTestBase::TestMigrationOnNetworkMadeDefault(
  2395. IoMode write_mode) {
  2396. if (!version_.UsesHttp3())
  2397. return;
  2398. InitializeConnectionMigrationV2Test({kDefaultNetworkForTests});
  2399. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  2400. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  2401. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  2402. client_maker_.set_save_packet_frames(true);
  2403. // Using a testing task runner so that we can control time.
  2404. auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
  2405. QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
  2406. scoped_mock_network_change_notifier_->mock_network_change_notifier()
  2407. ->QueueNetworkMadeDefault(kDefaultNetworkForTests);
  2408. MockQuicData quic_data1(version_);
  2409. quic_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging Read.
  2410. int packet_num = 1;
  2411. quic_data1.AddWrite(SYNCHRONOUS,
  2412. ConstructInitialSettingsPacket(packet_num++));
  2413. quic_data1.AddWrite(
  2414. write_mode,
  2415. ConstructGetRequestPacket(packet_num++,
  2416. GetNthClientInitiatedBidirectionalStreamId(0),
  2417. true, true));
  2418. quic_data1.AddSocketDataToFactory(socket_factory_.get());
  2419. // Set up the second socket data provider that is used after migration.
  2420. // The response to the earlier request is read on the new socket.
  2421. quic::QuicConnectionId cid_on_new_path =
  2422. quic::test::TestConnectionId(12345678);
  2423. client_maker_.set_connection_id(cid_on_new_path);
  2424. MockQuicData quic_data2(version_);
  2425. // Connectivity probe to be sent on the new path.
  2426. quic_data2.AddWrite(SYNCHRONOUS, client_maker_.MakeConnectivityProbingPacket(
  2427. packet_num++, true));
  2428. quic_data2.AddRead(ASYNC, ERR_IO_PENDING); // Pause
  2429. // Connectivity probe to receive from the server.
  2430. quic_data2.AddRead(ASYNC,
  2431. server_maker_.MakeConnectivityProbingPacket(1, false));
  2432. // in-flight SETTINGS and requests will be retransmitted. Since data is
  2433. // already sent on the new address, ping will no longer be sent.
  2434. quic_data2.AddWrite(ASYNC,
  2435. client_maker_.MakeCombinedRetransmissionPacket(
  2436. /*original_packet_numbers=*/{1, 2}, packet_num++,
  2437. /*should_include_version=*/false));
  2438. quic_data2.AddRead(
  2439. ASYNC,
  2440. ConstructOkResponsePacket(
  2441. 2, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
  2442. quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  2443. quic_data2.AddWrite(SYNCHRONOUS,
  2444. client_maker_.MakeAckAndDataPacket(
  2445. packet_num++, false, GetQpackDecoderStreamId(), 2, 2,
  2446. false, StreamCancellationQpackDecoderInstruction(0)));
  2447. quic_data2.AddWrite(
  2448. SYNCHRONOUS,
  2449. client_maker_.MakeRstPacket(packet_num++, false,
  2450. GetNthClientInitiatedBidirectionalStreamId(0),
  2451. quic::QUIC_STREAM_CANCELLED));
  2452. quic_data2.AddSocketDataToFactory(socket_factory_.get());
  2453. // Create request and QuicHttpStream.
  2454. QuicStreamRequest request(factory_.get());
  2455. EXPECT_EQ(ERR_IO_PENDING,
  2456. request.Request(
  2457. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  2458. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  2459. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  2460. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  2461. failed_on_default_network_callback_, callback_.callback()));
  2462. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  2463. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  2464. EXPECT_TRUE(stream.get());
  2465. // Cause QUIC stream to be created.
  2466. HttpRequestInfo request_info;
  2467. request_info.method = "GET";
  2468. request_info.url = url_;
  2469. request_info.traffic_annotation =
  2470. MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
  2471. stream->RegisterRequest(&request_info);
  2472. EXPECT_EQ(OK, stream->InitializeStream(true, DEFAULT_PRIORITY, net_log_,
  2473. CompletionOnceCallback()));
  2474. // Ensure that session is alive and active.
  2475. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  2476. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  2477. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  2478. MaybeMakeNewConnectionIdAvailableToSession(cid_on_new_path, session);
  2479. // Send GET request on stream.
  2480. HttpResponseInfo response;
  2481. HttpRequestHeaders request_headers;
  2482. EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
  2483. callback_.callback()));
  2484. // Deliver a signal that a alternate network is connected now, this should
  2485. // cause the connection to start early migration on path degrading.
  2486. scoped_mock_network_change_notifier_->mock_network_change_notifier()
  2487. ->SetConnectedNetworksList(
  2488. {kDefaultNetworkForTests, kNewNetworkForTests});
  2489. scoped_mock_network_change_notifier_->mock_network_change_notifier()
  2490. ->NotifyNetworkConnected(kNewNetworkForTests);
  2491. // Cause the connection to report path degrading to the session.
  2492. // Due to lack of alternate network, session will not migrate connection.
  2493. scoped_mock_network_change_notifier_->mock_network_change_notifier()
  2494. ->NotifyNetworkMadeDefault(kNewNetworkForTests);
  2495. // A task was posted to migrate to the new default network. Execute that task.
  2496. task_runner->RunUntilIdle();
  2497. // The connection should still be alive, and not marked as going away.
  2498. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  2499. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  2500. EXPECT_EQ(1u, session->GetNumActiveStreams());
  2501. EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
  2502. // Resume quic data and a connectivity probe response will be read on the new
  2503. // socket, declare probing as successful. And a new task to WriteToNewSocket
  2504. // will be posted to complete migration.
  2505. quic_data2.Resume();
  2506. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  2507. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  2508. EXPECT_EQ(1u, session->GetNumActiveStreams());
  2509. // There should be a task that will complete the migration to the new network.
  2510. task_runner->RunUntilIdle();
  2511. // Response headers are received over the new network.
  2512. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  2513. EXPECT_EQ(200, response.headers->response_code());
  2514. // Verify that the session is still alive.
  2515. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  2516. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  2517. stream.reset();
  2518. EXPECT_TRUE(quic_data1.AllReadDataConsumed());
  2519. EXPECT_TRUE(quic_data1.AllWriteDataConsumed());
  2520. EXPECT_TRUE(quic_data2.AllReadDataConsumed());
  2521. EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
  2522. }
  2523. // Regression test for http://859674.
  2524. // This test veries that a writer will not attempt to write packets until being
  2525. // unblocked on both socket level and network level. In this test, a probing
  2526. // writer is used to send two connectivity probes to the peer: where the first
  2527. // one completes successfully, while a connectivity response is received before
  2528. // completes sending the second one. The connection migration attempt will
  2529. // proceed while the probing writer is blocked at the socket level, which will
  2530. // block the writer on the network level. Once connection migration completes
  2531. // successfully, the probing writer will be unblocked on the network level, it
  2532. // will not attempt to write new packets until the socket level is unblocked.
  2533. TEST_P(QuicStreamFactoryTest, MigratedToBlockedSocketAfterProbing) {
  2534. if (!version_.UsesHttp3())
  2535. return;
  2536. InitializeConnectionMigrationV2Test({kDefaultNetworkForTests});
  2537. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  2538. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  2539. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  2540. client_maker_.set_save_packet_frames(true);
  2541. // Using a testing task runner so that we can control time.
  2542. auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
  2543. QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
  2544. scoped_mock_network_change_notifier_->mock_network_change_notifier()
  2545. ->QueueNetworkMadeDefault(kDefaultNetworkForTests);
  2546. MockQuicData quic_data1(version_);
  2547. quic_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging Read.
  2548. int packet_num = 1;
  2549. quic_data1.AddWrite(SYNCHRONOUS,
  2550. ConstructInitialSettingsPacket(packet_num++));
  2551. quic_data1.AddWrite(
  2552. SYNCHRONOUS,
  2553. ConstructGetRequestPacket(packet_num++,
  2554. GetNthClientInitiatedBidirectionalStreamId(0),
  2555. true, true));
  2556. quic_data1.AddSocketDataToFactory(socket_factory_.get());
  2557. // Set up the second socket data provider that is used after migration.
  2558. // The response to the earlier request is read on the new socket.
  2559. quic::QuicConnectionId cid_on_new_path =
  2560. quic::test::TestConnectionId(12345678);
  2561. client_maker_.set_connection_id(cid_on_new_path);
  2562. MockQuicData quic_data2(version_);
  2563. // First connectivity probe to be sent on the new path.
  2564. quic_data2.AddWrite(SYNCHRONOUS, client_maker_.MakeConnectivityProbingPacket(
  2565. packet_num++, true));
  2566. quic_data2.AddRead(ASYNC,
  2567. ERR_IO_PENDING); // Pause so that we can control time.
  2568. // Connectivity probe to receive from the server.
  2569. quic_data2.AddRead(ASYNC,
  2570. server_maker_.MakeConnectivityProbingPacket(1, false));
  2571. // Second connectivity probe which will complete asynchronously.
  2572. quic_data2.AddWrite(
  2573. ASYNC, client_maker_.MakeConnectivityProbingPacket(packet_num++, true));
  2574. quic_data2.AddRead(
  2575. ASYNC,
  2576. ConstructOkResponsePacket(
  2577. 2, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
  2578. quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  2579. quic_data2.AddWrite(ASYNC,
  2580. client_maker_.MakeCombinedRetransmissionPacket(
  2581. /*original_packet_numbers=*/{1, 2}, packet_num++,
  2582. /*should_include_version=*/false));
  2583. quic_data2.AddWrite(SYNCHRONOUS,
  2584. client_maker_.MakeAckAndRetireConnectionIdPacket(
  2585. packet_num++, true, 2, 1, 0u));
  2586. quic_data2.AddWrite(SYNCHRONOUS,
  2587. client_maker_.MakeDataPacket(
  2588. packet_num++, GetQpackDecoderStreamId(), false, false,
  2589. StreamCancellationQpackDecoderInstruction(0)));
  2590. quic_data2.AddWrite(
  2591. SYNCHRONOUS,
  2592. client_maker_.MakeRstPacket(packet_num++, false,
  2593. GetNthClientInitiatedBidirectionalStreamId(0),
  2594. quic::QUIC_STREAM_CANCELLED));
  2595. quic_data2.AddSocketDataToFactory(socket_factory_.get());
  2596. // Create request and QuicHttpStream.
  2597. QuicStreamRequest request(factory_.get());
  2598. EXPECT_EQ(ERR_IO_PENDING,
  2599. request.Request(
  2600. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  2601. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  2602. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  2603. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  2604. failed_on_default_network_callback_, callback_.callback()));
  2605. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  2606. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  2607. EXPECT_TRUE(stream.get());
  2608. // Cause QUIC stream to be created.
  2609. HttpRequestInfo request_info;
  2610. request_info.method = "GET";
  2611. request_info.url = url_;
  2612. request_info.traffic_annotation =
  2613. MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
  2614. stream->RegisterRequest(&request_info);
  2615. EXPECT_EQ(OK, stream->InitializeStream(true, DEFAULT_PRIORITY, net_log_,
  2616. CompletionOnceCallback()));
  2617. // Ensure that session is alive and active.
  2618. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  2619. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  2620. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  2621. MaybeMakeNewConnectionIdAvailableToSession(cid_on_new_path, session);
  2622. // Send GET request on stream.
  2623. HttpResponseInfo response;
  2624. HttpRequestHeaders request_headers;
  2625. EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
  2626. callback_.callback()));
  2627. // Deliver a signal that a alternate network is connected now, this should
  2628. // cause the connection to start early migration on path degrading.
  2629. scoped_mock_network_change_notifier_->mock_network_change_notifier()
  2630. ->SetConnectedNetworksList(
  2631. {kDefaultNetworkForTests, kNewNetworkForTests});
  2632. scoped_mock_network_change_notifier_->mock_network_change_notifier()
  2633. ->NotifyNetworkConnected(kNewNetworkForTests);
  2634. // Cause the connection to report path degrading to the session.
  2635. // Due to lack of alternate network, session will not mgirate connection.
  2636. scoped_mock_network_change_notifier_->mock_network_change_notifier()
  2637. ->NotifyNetworkMadeDefault(kNewNetworkForTests);
  2638. // A task was posted to migrate to the new default network. Execute that task.
  2639. task_runner->RunUntilIdle();
  2640. // Manually trigger retransmission of PATH_CHALLENGE.
  2641. auto* path_validator =
  2642. quic::test::QuicConnectionPeer::path_validator(session->connection());
  2643. quic::test::QuicPathValidatorPeer::retry_timer(path_validator)->Cancel();
  2644. path_validator->OnRetryTimeout();
  2645. // Resume quic data and a connectivity probe response will be read on the new
  2646. // socket, declare probing as successful.
  2647. quic_data2.Resume();
  2648. // The connection should still be alive, and not marked as going away.
  2649. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  2650. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  2651. EXPECT_EQ(1u, session->GetNumActiveStreams());
  2652. EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
  2653. // There should be a task that will complete the migration to the new network.
  2654. task_runner->RunUntilIdle();
  2655. // Response headers are received over the new network.
  2656. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  2657. EXPECT_EQ(200, response.headers->response_code());
  2658. // Run the message loop to complete the asynchronous write of ack and ping.
  2659. base::RunLoop().RunUntilIdle();
  2660. // Verify that the session is still alive.
  2661. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  2662. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  2663. stream.reset();
  2664. EXPECT_TRUE(quic_data1.AllReadDataConsumed());
  2665. EXPECT_TRUE(quic_data1.AllWriteDataConsumed());
  2666. EXPECT_TRUE(quic_data2.AllReadDataConsumed());
  2667. EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
  2668. }
  2669. // This test verifies that session times out connection migration attempt
  2670. // with signals delivered in the following order (no alternate network is
  2671. // available):
  2672. // - default network disconnected is delivered: session attempts connection
  2673. // migration but found not alternate network. Session waits for a new network
  2674. // comes up in the next kWaitTimeForNewNetworkSecs seconds.
  2675. // - no new network is connected, migration times out. Session is closed.
  2676. TEST_P(QuicStreamFactoryTest, MigrationTimeoutWithNoNewNetwork) {
  2677. if (!version_.UsesHttp3())
  2678. return;
  2679. InitializeConnectionMigrationV2Test({kDefaultNetworkForTests});
  2680. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  2681. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  2682. // Using a testing task runner so that we can control time.
  2683. auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
  2684. QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
  2685. MockQuicData socket_data(version_);
  2686. socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  2687. socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
  2688. socket_data.AddSocketDataToFactory(socket_factory_.get());
  2689. // Create request and QuicHttpStream.
  2690. QuicStreamRequest request(factory_.get());
  2691. EXPECT_EQ(ERR_IO_PENDING,
  2692. request.Request(
  2693. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  2694. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  2695. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  2696. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  2697. failed_on_default_network_callback_, callback_.callback()));
  2698. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  2699. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  2700. EXPECT_TRUE(stream.get());
  2701. // Cause QUIC stream to be created.
  2702. HttpRequestInfo request_info;
  2703. request_info.traffic_annotation =
  2704. MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
  2705. stream->RegisterRequest(&request_info);
  2706. EXPECT_EQ(OK, stream->InitializeStream(false, DEFAULT_PRIORITY, net_log_,
  2707. CompletionOnceCallback()));
  2708. // Ensure that session is alive and active.
  2709. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  2710. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  2711. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  2712. // Trigger connection migration. Since there are no networks
  2713. // to migrate to, this should cause the session to wait for a new network.
  2714. scoped_mock_network_change_notifier_->mock_network_change_notifier()
  2715. ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
  2716. // The migration will not fail until the migration alarm timeout.
  2717. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  2718. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  2719. EXPECT_EQ(1u, session->GetNumActiveStreams());
  2720. EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
  2721. EXPECT_EQ(true, session->connection()->writer()->IsWriteBlocked());
  2722. // Migration will be timed out after kWaitTimeForNewNetwokSecs.
  2723. task_runner->FastForwardBy(base::Seconds(kWaitTimeForNewNetworkSecs));
  2724. // The connection should now be closed. A request for response
  2725. // headers should fail.
  2726. EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  2727. EXPECT_FALSE(HasActiveSession(scheme_host_port_));
  2728. EXPECT_EQ(ERR_INTERNET_DISCONNECTED, callback_.WaitForResult());
  2729. EXPECT_TRUE(socket_data.AllReadDataConsumed());
  2730. EXPECT_TRUE(socket_data.AllWriteDataConsumed());
  2731. }
  2732. // This test verifies that connectivity probes will be sent even if there is
  2733. // a non-migratable stream. However, when connection migrates to the
  2734. // successfully probed path, any non-migratable streams will be reset.
  2735. TEST_P(QuicStreamFactoryTest,
  2736. OnNetworkMadeDefaultNonMigratableStream_MigrateIdleSessions) {
  2737. TestOnNetworkMadeDefaultNonMigratableStream(true);
  2738. }
  2739. // This test verifies that connectivity probes will be sent even if there is
  2740. // a non-migratable stream. However, when connection migrates to the
  2741. // successfully probed path, any non-migratable stream will be reset. And if
  2742. // the connection becomes idle then, close the connection.
  2743. TEST_P(QuicStreamFactoryTest,
  2744. OnNetworkMadeDefaultNonMigratableStream_DoNotMigrateIdleSessions) {
  2745. TestOnNetworkMadeDefaultNonMigratableStream(false);
  2746. }
  2747. void QuicStreamFactoryTestBase::TestOnNetworkMadeDefaultNonMigratableStream(
  2748. bool migrate_idle_sessions) {
  2749. if (!version_.UsesHttp3())
  2750. return;
  2751. quic_params_->migrate_idle_sessions = migrate_idle_sessions;
  2752. InitializeConnectionMigrationV2Test(
  2753. {kDefaultNetworkForTests, kNewNetworkForTests});
  2754. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  2755. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  2756. client_maker_.set_save_packet_frames(true);
  2757. MockQuicData socket_data(version_);
  2758. socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  2759. int packet_num = 1;
  2760. socket_data.AddWrite(SYNCHRONOUS,
  2761. ConstructInitialSettingsPacket(packet_num++));
  2762. // Set up the second socket data provider that is used for probing.
  2763. quic::QuicConnectionId cid_on_old_path =
  2764. quic::QuicUtils::CreateRandomConnectionId(context_.random_generator());
  2765. quic::QuicConnectionId cid_on_new_path =
  2766. quic::test::TestConnectionId(12345678);
  2767. client_maker_.set_connection_id(cid_on_new_path);
  2768. MockQuicData quic_data1(version_);
  2769. // Connectivity probe to be sent on the new path.
  2770. quic_data1.AddWrite(SYNCHRONOUS, client_maker_.MakeConnectivityProbingPacket(
  2771. packet_num++, true));
  2772. quic_data1.AddRead(ASYNC, ERR_IO_PENDING); // Pause
  2773. // Connectivity probe to receive from the server.
  2774. quic_data1.AddRead(ASYNC,
  2775. server_maker_.MakeConnectivityProbingPacket(1, false));
  2776. if (migrate_idle_sessions) {
  2777. quic_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
  2778. // A RESET will be sent to the peer to cancel the non-migratable stream.
  2779. quic_data1.AddWrite(
  2780. SYNCHRONOUS,
  2781. client_maker_.MakeDataAndRstPacket(
  2782. packet_num++, /*include_version=*/false, GetQpackDecoderStreamId(),
  2783. StreamCancellationQpackDecoderInstruction(0),
  2784. GetNthClientInitiatedBidirectionalStreamId(0),
  2785. quic::QUIC_STREAM_CANCELLED));
  2786. quic_data1.AddWrite(SYNCHRONOUS, client_maker_.MakeRetransmissionPacket(
  2787. 1, packet_num++, false));
  2788. // Ping packet to send after migration is completed.
  2789. quic_data1.AddWrite(SYNCHRONOUS,
  2790. client_maker_.MakePingPacket(packet_num++, false));
  2791. quic_data1.AddWrite(SYNCHRONOUS, client_maker_.MakeRetireConnectionIdPacket(
  2792. packet_num++, false, 0u));
  2793. } else {
  2794. client_maker_.set_connection_id(cid_on_old_path);
  2795. socket_data.AddWrite(
  2796. SYNCHRONOUS, client_maker_.MakeDataRstAckAndConnectionClosePacket(
  2797. packet_num++, false, GetQpackDecoderStreamId(),
  2798. StreamCancellationQpackDecoderInstruction(0),
  2799. GetNthClientInitiatedBidirectionalStreamId(0),
  2800. quic::QUIC_STREAM_CANCELLED, 1, 1,
  2801. quic::QUIC_CONNECTION_MIGRATION_NO_MIGRATABLE_STREAMS,
  2802. "net error", /*path_response_frame*/ 0x1b));
  2803. }
  2804. socket_data.AddSocketDataToFactory(socket_factory_.get());
  2805. quic_data1.AddSocketDataToFactory(socket_factory_.get());
  2806. // Create request and QuicHttpStream.
  2807. QuicStreamRequest request(factory_.get());
  2808. EXPECT_EQ(ERR_IO_PENDING,
  2809. request.Request(
  2810. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  2811. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  2812. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  2813. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  2814. failed_on_default_network_callback_, callback_.callback()));
  2815. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  2816. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  2817. EXPECT_TRUE(stream.get());
  2818. // Cause QUIC stream to be created, but marked as non-migratable.
  2819. HttpRequestInfo request_info;
  2820. request_info.load_flags |= LOAD_DISABLE_CONNECTION_MIGRATION_TO_CELLULAR;
  2821. request_info.traffic_annotation =
  2822. MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
  2823. stream->RegisterRequest(&request_info);
  2824. EXPECT_EQ(OK, stream->InitializeStream(false, DEFAULT_PRIORITY, net_log_,
  2825. CompletionOnceCallback()));
  2826. // Ensure that session is alive and active.
  2827. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  2828. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  2829. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  2830. MaybeMakeNewConnectionIdAvailableToSession(cid_on_new_path, session);
  2831. // Trigger connection migration. Session will start to probe the alternative
  2832. // network. Although there is a non-migratable stream, session will still be
  2833. // active until probing is declared as successful.
  2834. scoped_mock_network_change_notifier_->mock_network_change_notifier()
  2835. ->NotifyNetworkMadeDefault(kNewNetworkForTests);
  2836. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  2837. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  2838. EXPECT_EQ(1u, session->GetNumActiveStreams());
  2839. // Resume data to read a connectivity probing response, which will cause
  2840. // non-migtable streams to be closed.
  2841. quic_data1.Resume();
  2842. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  2843. EXPECT_EQ(migrate_idle_sessions, HasActiveSession(scheme_host_port_));
  2844. EXPECT_EQ(0u, session->GetNumActiveStreams());
  2845. base::RunLoop().RunUntilIdle();
  2846. EXPECT_TRUE(quic_data1.AllReadDataConsumed());
  2847. EXPECT_TRUE(quic_data1.AllWriteDataConsumed());
  2848. EXPECT_TRUE(socket_data.AllReadDataConsumed());
  2849. EXPECT_TRUE(socket_data.AllWriteDataConsumed());
  2850. }
  2851. TEST_P(QuicStreamFactoryTest, OnNetworkMadeDefaultConnectionMigrationDisabled) {
  2852. if (!version_.UsesHttp3())
  2853. return;
  2854. InitializeConnectionMigrationV2Test(
  2855. {kDefaultNetworkForTests, kNewNetworkForTests});
  2856. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  2857. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  2858. MockQuicData socket_data(version_);
  2859. socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  2860. int packet_num = 1;
  2861. if (VersionUsesHttp3(version_.transport_version)) {
  2862. socket_data.AddWrite(SYNCHRONOUS,
  2863. ConstructInitialSettingsPacket(packet_num++));
  2864. socket_data.AddWrite(
  2865. SYNCHRONOUS, client_maker_.MakeDataPacket(
  2866. packet_num++, GetQpackDecoderStreamId(), true, false,
  2867. StreamCancellationQpackDecoderInstruction(0)));
  2868. }
  2869. socket_data.AddWrite(
  2870. SYNCHRONOUS,
  2871. client_maker_.MakeRstPacket(packet_num++, true,
  2872. GetNthClientInitiatedBidirectionalStreamId(0),
  2873. quic::QUIC_STREAM_CANCELLED));
  2874. socket_data.AddSocketDataToFactory(socket_factory_.get());
  2875. // Create request and QuicHttpStream.
  2876. QuicStreamRequest request(factory_.get());
  2877. EXPECT_EQ(ERR_IO_PENDING,
  2878. request.Request(
  2879. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  2880. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  2881. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  2882. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  2883. failed_on_default_network_callback_, callback_.callback()));
  2884. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  2885. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  2886. EXPECT_TRUE(stream.get());
  2887. // Cause QUIC stream to be created.
  2888. HttpRequestInfo request_info;
  2889. request_info.traffic_annotation =
  2890. MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
  2891. stream->RegisterRequest(&request_info);
  2892. EXPECT_EQ(OK, stream->InitializeStream(false, DEFAULT_PRIORITY, net_log_,
  2893. CompletionOnceCallback()));
  2894. // Ensure that session is alive and active.
  2895. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  2896. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  2897. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  2898. // Set session config to have connection migration disabled.
  2899. quic::test::QuicConfigPeer::SetReceivedDisableConnectionMigration(
  2900. session->config());
  2901. EXPECT_TRUE(session->config()->DisableConnectionMigration());
  2902. // Trigger connection migration. Since there is a non-migratable stream,
  2903. // this should cause session to continue but be marked as going away.
  2904. scoped_mock_network_change_notifier_->mock_network_change_notifier()
  2905. ->NotifyNetworkMadeDefault(kNewNetworkForTests);
  2906. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  2907. EXPECT_FALSE(HasActiveSession(scheme_host_port_));
  2908. EXPECT_EQ(1u, session->GetNumActiveStreams());
  2909. stream.reset();
  2910. EXPECT_TRUE(socket_data.AllReadDataConsumed());
  2911. EXPECT_TRUE(socket_data.AllWriteDataConsumed());
  2912. }
  2913. TEST_P(QuicStreamFactoryTest,
  2914. OnNetworkDisconnectedNonMigratableStream_DoNotMigrateIdleSessions) {
  2915. TestOnNetworkDisconnectedNonMigratableStream(false);
  2916. }
  2917. TEST_P(QuicStreamFactoryTest,
  2918. OnNetworkDisconnectedNonMigratableStream_MigrateIdleSessions) {
  2919. TestOnNetworkDisconnectedNonMigratableStream(true);
  2920. }
  2921. void QuicStreamFactoryTestBase::TestOnNetworkDisconnectedNonMigratableStream(
  2922. bool migrate_idle_sessions) {
  2923. if (!version_.UsesHttp3())
  2924. return;
  2925. quic_params_->migrate_idle_sessions = migrate_idle_sessions;
  2926. InitializeConnectionMigrationV2Test(
  2927. {kDefaultNetworkForTests, kNewNetworkForTests});
  2928. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  2929. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  2930. client_maker_.set_save_packet_frames(true);
  2931. MockQuicData failed_socket_data(version_);
  2932. quic::QuicConnectionId cid_on_old_path =
  2933. quic::QuicUtils::CreateRandomConnectionId(context_.random_generator());
  2934. quic::QuicConnectionId cid_on_new_path =
  2935. quic::test::TestConnectionId(12345678);
  2936. MockQuicData socket_data(version_);
  2937. if (migrate_idle_sessions) {
  2938. failed_socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  2939. int packet_num = 1;
  2940. failed_socket_data.AddWrite(SYNCHRONOUS,
  2941. ConstructInitialSettingsPacket(packet_num++));
  2942. // A RESET will be sent to the peer to cancel the non-migratable stream.
  2943. failed_socket_data.AddWrite(
  2944. SYNCHRONOUS, client_maker_.MakeDataPacket(
  2945. packet_num++, GetQpackDecoderStreamId(), true, false,
  2946. StreamCancellationQpackDecoderInstruction(0)));
  2947. failed_socket_data.AddWrite(
  2948. SYNCHRONOUS,
  2949. client_maker_.MakeRstPacket(
  2950. packet_num++, true, GetNthClientInitiatedBidirectionalStreamId(0),
  2951. quic::QUIC_STREAM_CANCELLED));
  2952. failed_socket_data.AddSocketDataToFactory(socket_factory_.get());
  2953. // Set up second socket data provider that is used after migration.
  2954. client_maker_.set_connection_id(cid_on_new_path);
  2955. socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
  2956. socket_data.AddWrite(SYNCHRONOUS,
  2957. client_maker_.MakeCombinedRetransmissionPacket(
  2958. {3, 1, 2}, packet_num++, true));
  2959. // Ping packet to send after migration.
  2960. socket_data.AddWrite(
  2961. SYNCHRONOUS, client_maker_.MakePingPacket(packet_num++,
  2962. /*include_version=*/false));
  2963. socket_data.AddWrite(SYNCHRONOUS,
  2964. client_maker_.MakeRetireConnectionIdPacket(
  2965. packet_num++, /*include_version=*/false, 0u));
  2966. socket_data.AddSocketDataToFactory(socket_factory_.get());
  2967. } else {
  2968. socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  2969. int packet_num = 1;
  2970. socket_data.AddWrite(SYNCHRONOUS,
  2971. ConstructInitialSettingsPacket(packet_num++));
  2972. socket_data.AddWrite(
  2973. SYNCHRONOUS, client_maker_.MakeDataPacket(
  2974. packet_num++, GetQpackDecoderStreamId(), true, false,
  2975. StreamCancellationQpackDecoderInstruction(0)));
  2976. socket_data.AddWrite(
  2977. SYNCHRONOUS,
  2978. client_maker_.MakeRstPacket(
  2979. packet_num++, true, GetNthClientInitiatedBidirectionalStreamId(0),
  2980. quic::QUIC_STREAM_CANCELLED));
  2981. socket_data.AddSocketDataToFactory(socket_factory_.get());
  2982. }
  2983. // Create request and QuicHttpStream.
  2984. QuicStreamRequest request(factory_.get());
  2985. EXPECT_EQ(ERR_IO_PENDING,
  2986. request.Request(
  2987. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  2988. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  2989. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  2990. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  2991. failed_on_default_network_callback_, callback_.callback()));
  2992. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  2993. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  2994. EXPECT_TRUE(stream.get());
  2995. // Cause QUIC stream to be created, but marked as non-migratable.
  2996. HttpRequestInfo request_info;
  2997. request_info.load_flags |= LOAD_DISABLE_CONNECTION_MIGRATION_TO_CELLULAR;
  2998. request_info.traffic_annotation =
  2999. MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
  3000. stream->RegisterRequest(&request_info);
  3001. EXPECT_EQ(OK, stream->InitializeStream(false, DEFAULT_PRIORITY, net_log_,
  3002. CompletionOnceCallback()));
  3003. // Ensure that session is alive and active.
  3004. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  3005. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  3006. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  3007. MaybeMakeNewConnectionIdAvailableToSession(cid_on_new_path, session);
  3008. // Trigger connection migration. Since there is a non-migratable stream,
  3009. // this should cause a RST_STREAM frame to be emitted with
  3010. // quic::QUIC_STREAM_CANCELLED error code.
  3011. // If migrate idle session, the connection will then be migrated to the
  3012. // alternate network. Otherwise, the connection will be closed.
  3013. scoped_mock_network_change_notifier_->mock_network_change_notifier()
  3014. ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
  3015. EXPECT_EQ(migrate_idle_sessions,
  3016. QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  3017. EXPECT_EQ(migrate_idle_sessions, HasActiveSession(scheme_host_port_));
  3018. if (migrate_idle_sessions) {
  3019. EXPECT_EQ(0u, session->GetNumActiveStreams());
  3020. base::RunLoop().RunUntilIdle();
  3021. EXPECT_TRUE(failed_socket_data.AllReadDataConsumed());
  3022. EXPECT_TRUE(failed_socket_data.AllWriteDataConsumed());
  3023. }
  3024. EXPECT_TRUE(socket_data.AllReadDataConsumed());
  3025. EXPECT_TRUE(socket_data.AllWriteDataConsumed());
  3026. }
  3027. TEST_P(QuicStreamFactoryTest,
  3028. OnNetworkDisconnectedConnectionMigrationDisabled) {
  3029. if (!version_.UsesHttp3())
  3030. return;
  3031. InitializeConnectionMigrationV2Test(
  3032. {kDefaultNetworkForTests, kNewNetworkForTests});
  3033. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  3034. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  3035. MockQuicData socket_data(version_);
  3036. socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  3037. int packet_num = 1;
  3038. if (VersionUsesHttp3(version_.transport_version)) {
  3039. socket_data.AddWrite(SYNCHRONOUS,
  3040. ConstructInitialSettingsPacket(packet_num++));
  3041. }
  3042. socket_data.AddSocketDataToFactory(socket_factory_.get());
  3043. // Create request and QuicHttpStream.
  3044. QuicStreamRequest request(factory_.get());
  3045. EXPECT_EQ(ERR_IO_PENDING,
  3046. request.Request(
  3047. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  3048. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  3049. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  3050. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  3051. failed_on_default_network_callback_, callback_.callback()));
  3052. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  3053. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  3054. EXPECT_TRUE(stream.get());
  3055. // Cause QUIC stream to be created.
  3056. HttpRequestInfo request_info;
  3057. request_info.traffic_annotation =
  3058. MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
  3059. stream->RegisterRequest(&request_info);
  3060. EXPECT_EQ(OK, stream->InitializeStream(false, DEFAULT_PRIORITY, net_log_,
  3061. CompletionOnceCallback()));
  3062. // Ensure that session is alive and active.
  3063. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  3064. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  3065. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  3066. // Set session config to have connection migration disabled.
  3067. quic::test::QuicConfigPeer::SetReceivedDisableConnectionMigration(
  3068. session->config());
  3069. EXPECT_TRUE(session->config()->DisableConnectionMigration());
  3070. // Trigger connection migration.
  3071. scoped_mock_network_change_notifier_->mock_network_change_notifier()
  3072. ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
  3073. EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  3074. EXPECT_FALSE(HasActiveSession(scheme_host_port_));
  3075. EXPECT_TRUE(socket_data.AllReadDataConsumed());
  3076. EXPECT_TRUE(socket_data.AllWriteDataConsumed());
  3077. }
  3078. TEST_P(QuicStreamFactoryTest,
  3079. OnNetworkMadeDefaultNoOpenStreams_DoNotMigrateIdleSessions) {
  3080. TestOnNetworkMadeDefaultNoOpenStreams(false);
  3081. }
  3082. TEST_P(QuicStreamFactoryTest,
  3083. OnNetworkMadeDefaultNoOpenStreams_MigrateIdleSessions) {
  3084. TestOnNetworkMadeDefaultNoOpenStreams(true);
  3085. }
  3086. void QuicStreamFactoryTestBase::TestOnNetworkMadeDefaultNoOpenStreams(
  3087. bool migrate_idle_sessions) {
  3088. if (!version_.UsesHttp3())
  3089. return;
  3090. quic_params_->migrate_idle_sessions = migrate_idle_sessions;
  3091. InitializeConnectionMigrationV2Test(
  3092. {kDefaultNetworkForTests, kNewNetworkForTests});
  3093. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  3094. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  3095. client_maker_.set_save_packet_frames(true);
  3096. MockQuicData socket_data(version_);
  3097. socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  3098. int packet_num = 1;
  3099. socket_data.AddWrite(SYNCHRONOUS,
  3100. ConstructInitialSettingsPacket(packet_num++));
  3101. if (!migrate_idle_sessions) {
  3102. socket_data.AddWrite(
  3103. SYNCHRONOUS, client_maker_.MakeConnectionClosePacket(
  3104. packet_num, true,
  3105. quic::QUIC_CONNECTION_MIGRATION_NO_MIGRATABLE_STREAMS,
  3106. "net error"));
  3107. }
  3108. socket_data.AddSocketDataToFactory(socket_factory_.get());
  3109. quic::QuicConnectionId cid_on_new_path =
  3110. quic::test::TestConnectionId(12345678);
  3111. MockQuicData quic_data1(version_);
  3112. if (migrate_idle_sessions) {
  3113. client_maker_.set_connection_id(cid_on_new_path);
  3114. // Set up the second socket data provider that is used for probing.
  3115. // Connectivity probe to be sent on the new path.
  3116. quic_data1.AddWrite(
  3117. SYNCHRONOUS,
  3118. client_maker_.MakeConnectivityProbingPacket(packet_num++, true));
  3119. quic_data1.AddRead(ASYNC, ERR_IO_PENDING); // Pause
  3120. // Connectivity probe to receive from the server.
  3121. quic_data1.AddRead(ASYNC,
  3122. server_maker_.MakeConnectivityProbingPacket(1, false));
  3123. quic_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
  3124. // in-flight SETTINGS and requests will be retransmitted. Since data is
  3125. // already sent on the new address, ping will no longer be sent.
  3126. quic_data1.AddWrite(ASYNC, client_maker_.MakeRetransmissionPacket(
  3127. /*original_packet_number=*/1, packet_num++,
  3128. /*should_include_version=*/false));
  3129. quic_data1.AddWrite(SYNCHRONOUS, client_maker_.MakeRetireConnectionIdPacket(
  3130. packet_num++, false, 0u));
  3131. quic_data1.AddSocketDataToFactory(socket_factory_.get());
  3132. }
  3133. // Create request and QuicHttpStream.
  3134. QuicStreamRequest request(factory_.get());
  3135. EXPECT_EQ(ERR_IO_PENDING,
  3136. request.Request(
  3137. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  3138. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  3139. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  3140. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  3141. failed_on_default_network_callback_, callback_.callback()));
  3142. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  3143. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  3144. EXPECT_TRUE(stream.get());
  3145. // Ensure that session is alive and active.
  3146. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  3147. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  3148. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  3149. EXPECT_FALSE(session->HasActiveRequestStreams());
  3150. MaybeMakeNewConnectionIdAvailableToSession(cid_on_new_path, session);
  3151. // Trigger connection migration.
  3152. scoped_mock_network_change_notifier_->mock_network_change_notifier()
  3153. ->NotifyNetworkMadeDefault(kNewNetworkForTests);
  3154. EXPECT_EQ(migrate_idle_sessions, HasActiveSession(scheme_host_port_));
  3155. if (migrate_idle_sessions) {
  3156. quic_data1.Resume();
  3157. base::RunLoop().RunUntilIdle();
  3158. EXPECT_TRUE(quic_data1.AllReadDataConsumed());
  3159. EXPECT_TRUE(quic_data1.AllWriteDataConsumed());
  3160. }
  3161. EXPECT_TRUE(socket_data.AllReadDataConsumed());
  3162. EXPECT_TRUE(socket_data.AllWriteDataConsumed());
  3163. }
  3164. TEST_P(QuicStreamFactoryTest,
  3165. OnNetworkDisconnectedNoOpenStreams_DoNotMigateIdleSessions) {
  3166. TestOnNetworkDisconnectedNoOpenStreams(false);
  3167. }
  3168. TEST_P(QuicStreamFactoryTest,
  3169. OnNetworkDisconnectedNoOpenStreams_MigateIdleSessions) {
  3170. TestOnNetworkDisconnectedNoOpenStreams(true);
  3171. }
  3172. void QuicStreamFactoryTestBase::TestOnNetworkDisconnectedNoOpenStreams(
  3173. bool migrate_idle_sessions) {
  3174. if (!version_.UsesHttp3())
  3175. return;
  3176. quic_params_->migrate_idle_sessions = migrate_idle_sessions;
  3177. InitializeConnectionMigrationV2Test(
  3178. {kDefaultNetworkForTests, kNewNetworkForTests});
  3179. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  3180. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  3181. client_maker_.set_save_packet_frames(true);
  3182. MockQuicData default_socket_data(version_);
  3183. default_socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  3184. int packet_num = 1;
  3185. default_socket_data.AddWrite(SYNCHRONOUS,
  3186. ConstructInitialSettingsPacket(packet_num++));
  3187. default_socket_data.AddSocketDataToFactory(socket_factory_.get());
  3188. MockQuicData alternate_socket_data(version_);
  3189. quic::QuicConnectionId cid_on_new_path =
  3190. quic::test::TestConnectionId(12345678);
  3191. if (migrate_idle_sessions) {
  3192. client_maker_.set_connection_id(cid_on_new_path);
  3193. // Set up second socket data provider that is used after migration.
  3194. alternate_socket_data.AddRead(SYNCHRONOUS,
  3195. ERR_IO_PENDING); // Hanging read.
  3196. alternate_socket_data.AddWrite(
  3197. SYNCHRONOUS,
  3198. client_maker_.MakeRetransmissionPacket(1, packet_num++, true));
  3199. // Ping packet to send after migration.
  3200. alternate_socket_data.AddWrite(
  3201. SYNCHRONOUS, client_maker_.MakePingPacket(packet_num++,
  3202. /*include_version=*/false));
  3203. alternate_socket_data.AddWrite(
  3204. SYNCHRONOUS,
  3205. client_maker_.MakeRetireConnectionIdPacket(packet_num++, true, 0u));
  3206. alternate_socket_data.AddSocketDataToFactory(socket_factory_.get());
  3207. }
  3208. // Create request and QuicHttpStream.
  3209. QuicStreamRequest request(factory_.get());
  3210. EXPECT_EQ(ERR_IO_PENDING,
  3211. request.Request(
  3212. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  3213. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  3214. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  3215. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  3216. failed_on_default_network_callback_, callback_.callback()));
  3217. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  3218. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  3219. EXPECT_TRUE(stream.get());
  3220. // Ensure that session is active.
  3221. auto* session = GetActiveSession(scheme_host_port_);
  3222. MaybeMakeNewConnectionIdAvailableToSession(cid_on_new_path, session);
  3223. // Trigger connection migration. Since there are no active streams,
  3224. // the session will be closed.
  3225. scoped_mock_network_change_notifier_->mock_network_change_notifier()
  3226. ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
  3227. EXPECT_EQ(migrate_idle_sessions, HasActiveSession(scheme_host_port_));
  3228. EXPECT_TRUE(default_socket_data.AllReadDataConsumed());
  3229. EXPECT_TRUE(default_socket_data.AllWriteDataConsumed());
  3230. if (migrate_idle_sessions) {
  3231. EXPECT_TRUE(alternate_socket_data.AllReadDataConsumed());
  3232. EXPECT_TRUE(alternate_socket_data.AllWriteDataConsumed());
  3233. }
  3234. }
  3235. // This test verifies session migrates to the alternate network immediately when
  3236. // default network disconnects with a synchronous write before migration.
  3237. TEST_P(QuicStreamFactoryTest, MigrateOnDefaultNetworkDisconnectedSync) {
  3238. TestMigrationOnNetworkDisconnected(/*async_write_before*/ false);
  3239. }
  3240. // This test verifies session migrates to the alternate network immediately when
  3241. // default network disconnects with an asynchronously write before migration.
  3242. TEST_P(QuicStreamFactoryTest, MigrateOnDefaultNetworkDisconnectedAsync) {
  3243. TestMigrationOnNetworkDisconnected(/*async_write_before*/ true);
  3244. }
  3245. void QuicStreamFactoryTestBase::TestMigrationOnNetworkDisconnected(
  3246. bool async_write_before) {
  3247. if (!version_.UsesHttp3())
  3248. return;
  3249. InitializeConnectionMigrationV2Test(
  3250. {kDefaultNetworkForTests, kNewNetworkForTests});
  3251. scoped_mock_network_change_notifier_->mock_network_change_notifier()
  3252. ->NotifyNetworkMadeDefault(kDefaultNetworkForTests);
  3253. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  3254. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  3255. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  3256. client_maker_.set_save_packet_frames(true);
  3257. // Use the test task runner.
  3258. QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
  3259. int packet_number = 1;
  3260. MockQuicData socket_data(version_);
  3261. socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  3262. socket_data.AddWrite(SYNCHRONOUS,
  3263. ConstructInitialSettingsPacket(packet_number++));
  3264. socket_data.AddWrite(
  3265. SYNCHRONOUS,
  3266. ConstructGetRequestPacket(packet_number++,
  3267. GetNthClientInitiatedBidirectionalStreamId(0),
  3268. true, true));
  3269. if (async_write_before) {
  3270. socket_data.AddWrite(ASYNC, OK);
  3271. packet_number++;
  3272. }
  3273. socket_data.AddSocketDataToFactory(socket_factory_.get());
  3274. // Create request and QuicHttpStream.
  3275. QuicStreamRequest request(factory_.get());
  3276. EXPECT_EQ(ERR_IO_PENDING,
  3277. request.Request(
  3278. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  3279. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  3280. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  3281. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  3282. failed_on_default_network_callback_, callback_.callback()));
  3283. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  3284. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  3285. EXPECT_TRUE(stream.get());
  3286. // Cause QUIC stream to be created.
  3287. HttpRequestInfo request_info;
  3288. request_info.method = "GET";
  3289. request_info.url = url_;
  3290. request_info.traffic_annotation =
  3291. MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
  3292. stream->RegisterRequest(&request_info);
  3293. EXPECT_EQ(OK, stream->InitializeStream(true, DEFAULT_PRIORITY, net_log_,
  3294. CompletionOnceCallback()));
  3295. // Ensure that session is alive and active.
  3296. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  3297. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  3298. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  3299. quic::QuicConnectionId cid_on_new_path =
  3300. quic::test::TestConnectionId(12345678);
  3301. MaybeMakeNewConnectionIdAvailableToSession(cid_on_new_path, session);
  3302. // Send GET request on stream.
  3303. HttpResponseInfo response;
  3304. HttpRequestHeaders request_headers;
  3305. EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
  3306. callback_.callback()));
  3307. if (async_write_before)
  3308. session->connection()->SendPing();
  3309. // Set up second socket data provider that is used after migration.
  3310. // The response to the earlier request is read on this new socket.
  3311. MockQuicData socket_data1(version_);
  3312. client_maker_.set_connection_id(cid_on_new_path);
  3313. socket_data1.AddWrite(SYNCHRONOUS,
  3314. client_maker_.MakeCombinedRetransmissionPacket(
  3315. {1, 2}, packet_number++, true));
  3316. socket_data1.AddWrite(
  3317. SYNCHRONOUS, client_maker_.MakePingPacket(packet_number++,
  3318. /*include_version=*/false));
  3319. socket_data1.AddWrite(SYNCHRONOUS, client_maker_.MakeRetireConnectionIdPacket(
  3320. packet_number++, false, 0u));
  3321. socket_data1.AddRead(
  3322. ASYNC,
  3323. ConstructOkResponsePacket(
  3324. 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
  3325. socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  3326. socket_data1.AddWrite(
  3327. SYNCHRONOUS,
  3328. client_maker_.MakeDataPacket(
  3329. packet_number++, GetQpackDecoderStreamId(),
  3330. /*should_include_version=*/false,
  3331. /*fin=*/false, StreamCancellationQpackDecoderInstruction(0)));
  3332. socket_data1.AddWrite(
  3333. SYNCHRONOUS,
  3334. client_maker_.MakeRstPacket(packet_number++, false,
  3335. GetNthClientInitiatedBidirectionalStreamId(0),
  3336. quic::QUIC_STREAM_CANCELLED));
  3337. socket_data1.AddSocketDataToFactory(socket_factory_.get());
  3338. // Trigger connection migration.
  3339. scoped_mock_network_change_notifier_->mock_network_change_notifier()
  3340. ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
  3341. // The connection should still be alive, not marked as going away.
  3342. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  3343. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  3344. EXPECT_EQ(1u, session->GetNumActiveStreams());
  3345. EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
  3346. // Ensure that the session is still alive.
  3347. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  3348. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  3349. EXPECT_EQ(1u, session->GetNumActiveStreams());
  3350. // Run the message loop so that data queued in the new socket is read by the
  3351. // packet reader.
  3352. runner_->RunNextTask();
  3353. // Response headers are received over the new network.
  3354. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  3355. EXPECT_EQ(200, response.headers->response_code());
  3356. // Check that the session is still alive.
  3357. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  3358. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  3359. // There should be posted tasks not executed, which is to migrate back to
  3360. // default network.
  3361. EXPECT_FALSE(runner_->GetPostedTasks().empty());
  3362. // Receive signal to mark new network as default.
  3363. scoped_mock_network_change_notifier_->mock_network_change_notifier()
  3364. ->NotifyNetworkMadeDefault(kNewNetworkForTests);
  3365. stream.reset();
  3366. EXPECT_TRUE(socket_data.AllReadDataConsumed());
  3367. EXPECT_TRUE(socket_data.AllWriteDataConsumed());
  3368. EXPECT_TRUE(socket_data1.AllReadDataConsumed());
  3369. EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
  3370. }
  3371. // This test receives NCN signals in the following order:
  3372. // - default network disconnected
  3373. // - after a pause, new network is connected.
  3374. // - new network is made default.
  3375. TEST_P(QuicStreamFactoryTest, NewNetworkConnectedAfterNoNetwork) {
  3376. if (!version_.UsesHttp3())
  3377. return;
  3378. InitializeConnectionMigrationV2Test({kDefaultNetworkForTests});
  3379. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  3380. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  3381. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  3382. client_maker_.set_save_packet_frames(true);
  3383. // Use the test task runner.
  3384. QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
  3385. MockQuicData socket_data(version_);
  3386. socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  3387. int packet_num = 1;
  3388. socket_data.AddWrite(SYNCHRONOUS,
  3389. ConstructInitialSettingsPacket(packet_num++));
  3390. socket_data.AddWrite(
  3391. SYNCHRONOUS,
  3392. ConstructGetRequestPacket(packet_num++,
  3393. GetNthClientInitiatedBidirectionalStreamId(0),
  3394. true, true));
  3395. socket_data.AddSocketDataToFactory(socket_factory_.get());
  3396. // Create request and QuicHttpStream.
  3397. QuicStreamRequest request(factory_.get());
  3398. EXPECT_EQ(ERR_IO_PENDING,
  3399. request.Request(
  3400. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  3401. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  3402. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  3403. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  3404. failed_on_default_network_callback_, callback_.callback()));
  3405. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  3406. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  3407. EXPECT_TRUE(stream.get());
  3408. // Cause QUIC stream to be created.
  3409. HttpRequestInfo request_info;
  3410. request_info.method = "GET";
  3411. request_info.url = url_;
  3412. request_info.traffic_annotation =
  3413. MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
  3414. stream->RegisterRequest(&request_info);
  3415. EXPECT_EQ(OK, stream->InitializeStream(true, DEFAULT_PRIORITY, net_log_,
  3416. CompletionOnceCallback()));
  3417. // Ensure that session is alive and active.
  3418. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  3419. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  3420. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  3421. quic::QuicConnectionId cid_on_new_path =
  3422. quic::test::TestConnectionId(12345678);
  3423. MaybeMakeNewConnectionIdAvailableToSession(cid_on_new_path, session);
  3424. // Send GET request on stream.
  3425. HttpResponseInfo response;
  3426. HttpRequestHeaders request_headers;
  3427. EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
  3428. callback_.callback()));
  3429. // Trigger connection migration. Since there are no networks
  3430. // to migrate to, this should cause the session to wait for a new network.
  3431. scoped_mock_network_change_notifier_->mock_network_change_notifier()
  3432. ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
  3433. // The connection should still be alive, not marked as going away.
  3434. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  3435. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  3436. EXPECT_EQ(1u, session->GetNumActiveStreams());
  3437. EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
  3438. // Set up second socket data provider that is used after migration.
  3439. // The response to the earlier request is read on this new socket.
  3440. MockQuicData socket_data1(version_);
  3441. client_maker_.set_connection_id(cid_on_new_path);
  3442. socket_data1.AddWrite(SYNCHRONOUS,
  3443. client_maker_.MakeCombinedRetransmissionPacket(
  3444. {1, 2}, packet_num++, true));
  3445. socket_data1.AddWrite(
  3446. SYNCHRONOUS,
  3447. client_maker_.MakePingPacket(packet_num++, /*include_version=*/false));
  3448. socket_data1.AddWrite(SYNCHRONOUS, client_maker_.MakeRetireConnectionIdPacket(
  3449. packet_num++, false, 0u));
  3450. socket_data1.AddRead(
  3451. ASYNC,
  3452. ConstructOkResponsePacket(
  3453. 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
  3454. socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  3455. socket_data1.AddWrite(
  3456. SYNCHRONOUS,
  3457. client_maker_.MakeDataPacket(
  3458. packet_num++, GetQpackDecoderStreamId(),
  3459. /*should_include_version=*/false,
  3460. /*fin=*/false, StreamCancellationQpackDecoderInstruction(0)));
  3461. socket_data1.AddWrite(
  3462. SYNCHRONOUS,
  3463. client_maker_.MakeRstPacket(packet_num++, false,
  3464. GetNthClientInitiatedBidirectionalStreamId(0),
  3465. quic::QUIC_STREAM_CANCELLED));
  3466. socket_data1.AddSocketDataToFactory(socket_factory_.get());
  3467. // Add a new network and notify the stream factory of a new connected network.
  3468. // This causes a PING packet to be sent over the new network.
  3469. scoped_mock_network_change_notifier_->mock_network_change_notifier()
  3470. ->SetConnectedNetworksList({kNewNetworkForTests});
  3471. scoped_mock_network_change_notifier_->mock_network_change_notifier()
  3472. ->NotifyNetworkConnected(kNewNetworkForTests);
  3473. // Ensure that the session is still alive.
  3474. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  3475. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  3476. EXPECT_EQ(1u, session->GetNumActiveStreams());
  3477. // Run the message loop so that data queued in the new socket is read by the
  3478. // packet reader.
  3479. runner_->RunNextTask();
  3480. // Response headers are received over the new network.
  3481. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  3482. EXPECT_EQ(200, response.headers->response_code());
  3483. // Check that the session is still alive.
  3484. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  3485. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  3486. // There should posted tasks not executed, which is to migrate back to default
  3487. // network.
  3488. EXPECT_FALSE(runner_->GetPostedTasks().empty());
  3489. // Receive signal to mark new network as default.
  3490. scoped_mock_network_change_notifier_->mock_network_change_notifier()
  3491. ->NotifyNetworkMadeDefault(kNewNetworkForTests);
  3492. stream.reset();
  3493. EXPECT_TRUE(socket_data.AllReadDataConsumed());
  3494. EXPECT_TRUE(socket_data.AllWriteDataConsumed());
  3495. EXPECT_TRUE(socket_data1.AllReadDataConsumed());
  3496. EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
  3497. }
  3498. // Regression test for http://crbug.com/872011.
  3499. // This test verifies that migrate to the probing socket will not trigger
  3500. // new packets being read synchronously and generate ACK frame while
  3501. // processing the initial connectivity probe response, which may cause a
  3502. // connection being closed with INTERNAL_ERROR as pending ACK frame is not
  3503. // allowed when processing a new packet.
  3504. TEST_P(QuicStreamFactoryTest, MigrateToProbingSocket) {
  3505. if (!version_.UsesHttp3())
  3506. return;
  3507. InitializeConnectionMigrationV2Test(
  3508. {kDefaultNetworkForTests, kNewNetworkForTests});
  3509. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  3510. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  3511. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  3512. client_maker_.set_save_packet_frames(true);
  3513. // Using a testing task runner so that we can control time.
  3514. auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
  3515. QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
  3516. scoped_mock_network_change_notifier_->mock_network_change_notifier()
  3517. ->QueueNetworkMadeDefault(kDefaultNetworkForTests);
  3518. int packet_number = 1;
  3519. MockQuicData quic_data1(version_);
  3520. quic_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging Read.
  3521. quic_data1.AddWrite(SYNCHRONOUS,
  3522. ConstructInitialSettingsPacket(packet_number++));
  3523. quic_data1.AddWrite(
  3524. SYNCHRONOUS,
  3525. ConstructGetRequestPacket(packet_number++,
  3526. GetNthClientInitiatedBidirectionalStreamId(0),
  3527. true, true));
  3528. quic_data1.AddSocketDataToFactory(socket_factory_.get());
  3529. // Set up the second socket data provider that is used for probing on the
  3530. // alternate network.
  3531. MockQuicData quic_data2(version_);
  3532. quic::QuicConnectionId cid_on_new_path =
  3533. quic::test::TestConnectionId(12345678);
  3534. client_maker_.set_connection_id(cid_on_new_path);
  3535. // Connectivity probe to be sent on the new path.
  3536. quic_data2.AddWrite(SYNCHRONOUS, client_maker_.MakeConnectivityProbingPacket(
  3537. packet_number++, true));
  3538. quic_data2.AddRead(ASYNC, ERR_IO_PENDING); // Pause
  3539. // First connectivity probe to receive from the server, which will complete
  3540. // connection migraiton on path degrading.
  3541. quic_data2.AddRead(ASYNC,
  3542. server_maker_.MakeConnectivityProbingPacket(1, false));
  3543. // Read multiple connectivity probes synchronously.
  3544. quic_data2.AddRead(SYNCHRONOUS,
  3545. server_maker_.MakeConnectivityProbingPacket(2, false));
  3546. quic_data2.AddRead(SYNCHRONOUS,
  3547. server_maker_.MakeConnectivityProbingPacket(3, false));
  3548. quic_data2.AddRead(SYNCHRONOUS,
  3549. server_maker_.MakeConnectivityProbingPacket(4, false));
  3550. quic_data2.AddWrite(ASYNC, client_maker_.MakeAckAndRetransmissionPacket(
  3551. packet_number++, 1, 4, 1, {1, 2}));
  3552. quic_data2.AddWrite(SYNCHRONOUS,
  3553. client_maker_.MakeRetireConnectionIdPacket(
  3554. packet_number++, /*include_version=*/false, 0u));
  3555. quic_data2.AddRead(
  3556. ASYNC,
  3557. ConstructOkResponsePacket(
  3558. 5, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
  3559. quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  3560. quic_data2.AddWrite(
  3561. SYNCHRONOUS, client_maker_.MakeAckAndDataPacket(
  3562. packet_number++, false, GetQpackDecoderStreamId(), 5, 1,
  3563. false, StreamCancellationQpackDecoderInstruction(0)));
  3564. quic_data2.AddWrite(
  3565. SYNCHRONOUS,
  3566. client_maker_.MakeRstPacket(packet_number++, false,
  3567. GetNthClientInitiatedBidirectionalStreamId(0),
  3568. quic::QUIC_STREAM_CANCELLED));
  3569. quic_data2.AddSocketDataToFactory(socket_factory_.get());
  3570. // Create request and QuicHttpStream.
  3571. QuicStreamRequest request(factory_.get());
  3572. EXPECT_EQ(ERR_IO_PENDING,
  3573. request.Request(
  3574. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  3575. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  3576. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  3577. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  3578. failed_on_default_network_callback_, callback_.callback()));
  3579. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  3580. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  3581. EXPECT_TRUE(stream.get());
  3582. // Cause QUIC stream to be created.
  3583. HttpRequestInfo request_info;
  3584. request_info.method = "GET";
  3585. request_info.url = url_;
  3586. request_info.traffic_annotation =
  3587. MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
  3588. stream->RegisterRequest(&request_info);
  3589. EXPECT_EQ(OK, stream->InitializeStream(true, DEFAULT_PRIORITY, net_log_,
  3590. CompletionOnceCallback()));
  3591. // Ensure that session is alive and active.
  3592. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  3593. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  3594. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  3595. MaybeMakeNewConnectionIdAvailableToSession(cid_on_new_path, session);
  3596. // Send GET request on stream.
  3597. HttpResponseInfo response;
  3598. HttpRequestHeaders request_headers;
  3599. EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
  3600. callback_.callback()));
  3601. EXPECT_EQ(0u, QuicStreamFactoryPeer::GetNumDegradingSessions(factory_.get()));
  3602. // Cause the connection to report path degrading to the session.
  3603. // Session will start to probe the alternate network.
  3604. session->connection()->OnPathDegradingDetected();
  3605. EXPECT_EQ(1u, QuicStreamFactoryPeer::GetNumDegradingSessions(factory_.get()));
  3606. // The connection should still be alive, and not marked as going away.
  3607. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  3608. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  3609. EXPECT_EQ(1u, session->GetNumActiveStreams());
  3610. EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
  3611. // Resume quic data and a connectivity probe response will be read on the new
  3612. // socket.
  3613. quic_data2.Resume();
  3614. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  3615. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  3616. EXPECT_EQ(1u, session->GetNumActiveStreams());
  3617. // There should be a task that will complete the migration to the new network.
  3618. task_runner->RunUntilIdle();
  3619. EXPECT_EQ(1u, QuicStreamFactoryPeer::GetNumDegradingSessions(factory_.get()));
  3620. // Response headers are received over the new network.
  3621. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  3622. EXPECT_EQ(200, response.headers->response_code());
  3623. // Deliver a signal that the alternate network now becomes default to session,
  3624. // this will cancel migrate back to default network timer.
  3625. scoped_mock_network_change_notifier_->mock_network_change_notifier()
  3626. ->NotifyNetworkMadeDefault(kNewNetworkForTests);
  3627. EXPECT_EQ(0u, QuicStreamFactoryPeer::GetNumDegradingSessions(factory_.get()));
  3628. task_runner->FastForwardBy(base::Seconds(kMinRetryTimeForDefaultNetworkSecs));
  3629. // Verify that the session is still alive.
  3630. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  3631. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  3632. stream.reset();
  3633. EXPECT_TRUE(quic_data1.AllReadDataConsumed());
  3634. EXPECT_TRUE(quic_data1.AllWriteDataConsumed());
  3635. EXPECT_TRUE(quic_data2.AllReadDataConsumed());
  3636. EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
  3637. }
  3638. // This test verifies that the connection migrates to the alternate network
  3639. // early when path degrading is detected with an ASYNCHRONOUS write before
  3640. // migration.
  3641. TEST_P(QuicStreamFactoryTest, MigrateEarlyOnPathDegradingAsync) {
  3642. TestMigrationOnPathDegrading(/*async_write_before_migration*/ true);
  3643. }
  3644. // This test verifies that the connection migrates to the alternate network
  3645. // early when path degrading is detected with a SYNCHRONOUS write before
  3646. // migration.
  3647. TEST_P(QuicStreamFactoryTest, MigrateEarlyOnPathDegradingSync) {
  3648. TestMigrationOnPathDegrading(/*async_write_before_migration*/ false);
  3649. }
  3650. void QuicStreamFactoryTestBase::TestMigrationOnPathDegrading(
  3651. bool async_write_before) {
  3652. if (!version_.UsesHttp3())
  3653. return;
  3654. InitializeConnectionMigrationV2Test(
  3655. {kDefaultNetworkForTests, kNewNetworkForTests});
  3656. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  3657. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  3658. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  3659. client_maker_.set_save_packet_frames(true);
  3660. // Using a testing task runner so that we can control time.
  3661. auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
  3662. QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
  3663. scoped_mock_network_change_notifier_->mock_network_change_notifier()
  3664. ->QueueNetworkMadeDefault(kDefaultNetworkForTests);
  3665. int packet_number = 1;
  3666. MockQuicData quic_data1(version_);
  3667. quic_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging Read.
  3668. quic_data1.AddWrite(SYNCHRONOUS,
  3669. ConstructInitialSettingsPacket(packet_number++));
  3670. quic_data1.AddWrite(
  3671. SYNCHRONOUS,
  3672. ConstructGetRequestPacket(packet_number++,
  3673. GetNthClientInitiatedBidirectionalStreamId(0),
  3674. true, true));
  3675. if (async_write_before) {
  3676. quic_data1.AddWrite(ASYNC, OK);
  3677. packet_number++;
  3678. }
  3679. quic_data1.AddSocketDataToFactory(socket_factory_.get());
  3680. // Set up the second socket data provider that is used after migration.
  3681. // The response to the earlier request is read on the new socket.
  3682. MockQuicData quic_data2(version_);
  3683. quic::QuicConnectionId cid_on_new_path =
  3684. quic::test::TestConnectionId(12345678);
  3685. client_maker_.set_connection_id(cid_on_new_path);
  3686. // Connectivity probe to be sent on the new path.
  3687. quic_data2.AddWrite(SYNCHRONOUS, client_maker_.MakeConnectivityProbingPacket(
  3688. packet_number++, true));
  3689. quic_data2.AddRead(ASYNC, ERR_IO_PENDING); // Pause
  3690. // Connectivity probe to receive from the server.
  3691. quic_data2.AddRead(ASYNC,
  3692. server_maker_.MakeConnectivityProbingPacket(1, false));
  3693. // in-flight SETTINGS and requests will be retransmitted. Since data is
  3694. // already sent on the new address, ping will no longer be sent.
  3695. quic_data2.AddWrite(ASYNC,
  3696. client_maker_.MakeCombinedRetransmissionPacket(
  3697. /*original_packet_numbers=*/{1, 2}, packet_number++,
  3698. /*should_include_version=*/false));
  3699. quic_data2.AddWrite(SYNCHRONOUS, client_maker_.MakeRetireConnectionIdPacket(
  3700. packet_number++, true, 0u));
  3701. quic_data2.AddRead(
  3702. ASYNC,
  3703. ConstructOkResponsePacket(
  3704. 2, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
  3705. quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  3706. quic_data2.AddWrite(
  3707. SYNCHRONOUS, client_maker_.MakeAckAndDataPacket(
  3708. packet_number++, false, GetQpackDecoderStreamId(), 2, 2,
  3709. false, StreamCancellationQpackDecoderInstruction(0)));
  3710. quic_data2.AddWrite(
  3711. SYNCHRONOUS,
  3712. client_maker_.MakeRstPacket(packet_number++, false,
  3713. GetNthClientInitiatedBidirectionalStreamId(0),
  3714. quic::QUIC_STREAM_CANCELLED));
  3715. quic_data2.AddSocketDataToFactory(socket_factory_.get());
  3716. // Create request and QuicHttpStream.
  3717. QuicStreamRequest request(factory_.get());
  3718. EXPECT_EQ(ERR_IO_PENDING,
  3719. request.Request(
  3720. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  3721. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  3722. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  3723. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  3724. failed_on_default_network_callback_, callback_.callback()));
  3725. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  3726. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  3727. EXPECT_TRUE(stream.get());
  3728. // Cause QUIC stream to be created.
  3729. HttpRequestInfo request_info;
  3730. request_info.method = "GET";
  3731. request_info.url = url_;
  3732. request_info.traffic_annotation =
  3733. MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
  3734. stream->RegisterRequest(&request_info);
  3735. EXPECT_EQ(OK, stream->InitializeStream(true, DEFAULT_PRIORITY, net_log_,
  3736. CompletionOnceCallback()));
  3737. // Ensure that session is alive and active.
  3738. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  3739. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  3740. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  3741. MaybeMakeNewConnectionIdAvailableToSession(cid_on_new_path, session);
  3742. // Send GET request on stream.
  3743. HttpResponseInfo response;
  3744. HttpRequestHeaders request_headers;
  3745. EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
  3746. callback_.callback()));
  3747. if (async_write_before)
  3748. session->connection()->SendPing();
  3749. EXPECT_EQ(0u, QuicStreamFactoryPeer::GetNumDegradingSessions(factory_.get()));
  3750. // Cause the connection to report path degrading to the session.
  3751. // Session will start to probe the alternate network.
  3752. session->connection()->OnPathDegradingDetected();
  3753. EXPECT_EQ(1u, QuicStreamFactoryPeer::GetNumDegradingSessions(factory_.get()));
  3754. base::TimeDelta next_task_delay;
  3755. // IETF QUIC's PATH_CHALLENGE retransmission is managed by timer in core QUIC
  3756. // code.
  3757. if (!version_.HasIetfQuicFrames()) {
  3758. // Next connectivity probe is scheduled to be sent in 2 *
  3759. // kDefaultRTTMilliSecs.
  3760. EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
  3761. next_task_delay = task_runner->NextPendingTaskDelay();
  3762. EXPECT_EQ(base::Milliseconds(2 * kDefaultRTTMilliSecs), next_task_delay);
  3763. }
  3764. // The connection should still be alive, and not marked as going away.
  3765. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  3766. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  3767. EXPECT_EQ(1u, session->GetNumActiveStreams());
  3768. EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
  3769. // Resume quic data and a connectivity probe response will be read on the new
  3770. // socket.
  3771. quic_data2.Resume();
  3772. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  3773. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  3774. EXPECT_EQ(1u, session->GetNumActiveStreams());
  3775. // There should be a task that will complete the migration to the new network.
  3776. task_runner->RunUntilIdle();
  3777. EXPECT_EQ(1u, QuicStreamFactoryPeer::GetNumDegradingSessions(factory_.get()));
  3778. // Response headers are received over the new network.
  3779. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  3780. EXPECT_EQ(200, response.headers->response_code());
  3781. EXPECT_EQ(1u, QuicStreamFactoryPeer::GetNumDegradingSessions(factory_.get()));
  3782. // Deliver a signal that the alternate network now becomes default to session,
  3783. // this will cancel mgirate back to default network timer.
  3784. scoped_mock_network_change_notifier_->mock_network_change_notifier()
  3785. ->NotifyNetworkMadeDefault(kNewNetworkForTests);
  3786. EXPECT_EQ(0u, QuicStreamFactoryPeer::GetNumDegradingSessions(factory_.get()));
  3787. task_runner->FastForwardBy(base::Seconds(kMinRetryTimeForDefaultNetworkSecs));
  3788. // Verify that the session is still alive.
  3789. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  3790. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  3791. stream.reset();
  3792. EXPECT_TRUE(quic_data1.AllReadDataConsumed());
  3793. EXPECT_TRUE(quic_data1.AllWriteDataConsumed());
  3794. EXPECT_TRUE(quic_data2.AllReadDataConsumed());
  3795. EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
  3796. }
  3797. TEST_P(QuicStreamFactoryTest, MigrateSessionEarlyProbingWriterError) {
  3798. if (!version_.UsesHttp3())
  3799. return;
  3800. InitializeConnectionMigrationV2Test(
  3801. {kDefaultNetworkForTests, kNewNetworkForTests});
  3802. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  3803. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  3804. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  3805. // Using a testing task runner so that we can control time.
  3806. auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
  3807. QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
  3808. scoped_mock_network_change_notifier_->mock_network_change_notifier()
  3809. ->QueueNetworkMadeDefault(kDefaultNetworkForTests);
  3810. int packet_number = 1;
  3811. MockQuicData quic_data1(version_);
  3812. quic_data1.AddWrite(SYNCHRONOUS,
  3813. ConstructInitialSettingsPacket(packet_number++));
  3814. quic_data1.AddWrite(
  3815. SYNCHRONOUS,
  3816. ConstructGetRequestPacket(packet_number++,
  3817. GetNthClientInitiatedBidirectionalStreamId(0),
  3818. true, true));
  3819. quic_data1.AddRead(ASYNC, ERR_IO_PENDING); // Pause
  3820. quic_data1.AddRead(
  3821. ASYNC,
  3822. ConstructOkResponsePacket(
  3823. 1, GetNthClientInitiatedBidirectionalStreamId(0), false, true));
  3824. quic_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
  3825. // Set up the second socket data provider that is used for path validation.
  3826. MockQuicData quic_data2(version_);
  3827. quic::QuicConnectionId cid_on_old_path =
  3828. quic::QuicUtils::CreateRandomConnectionId(context_.random_generator());
  3829. quic::QuicConnectionId cid_on_new_path =
  3830. quic::test::TestConnectionId(12345678);
  3831. client_maker_.set_connection_id(cid_on_new_path);
  3832. // Connectivity probe to be sent on the new path.
  3833. quic_data2.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE);
  3834. ++packet_number; // Account for the packet encountering write error.
  3835. quic_data2.AddRead(ASYNC, ERR_IO_PENDING); // Pause
  3836. quic_data2.AddRead(ASYNC,
  3837. server_maker_.MakeConnectivityProbingPacket(1, false));
  3838. // Connection ID is retired on the old path.
  3839. client_maker_.set_connection_id(cid_on_old_path);
  3840. quic_data1.AddWrite(SYNCHRONOUS,
  3841. client_maker_.MakeRetireConnectionIdPacket(
  3842. packet_number++, /*include_version=*/false,
  3843. /*sequence_number=*/1u));
  3844. quic_data1.AddSocketDataToFactory(socket_factory_.get());
  3845. quic_data2.AddSocketDataToFactory(socket_factory_.get());
  3846. // Create request and QuicHttpStream.
  3847. QuicStreamRequest request(factory_.get());
  3848. EXPECT_EQ(ERR_IO_PENDING,
  3849. request.Request(
  3850. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  3851. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  3852. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  3853. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  3854. failed_on_default_network_callback_, callback_.callback()));
  3855. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  3856. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  3857. EXPECT_TRUE(stream.get());
  3858. // Cause QUIC stream to be created.
  3859. HttpRequestInfo request_info;
  3860. request_info.method = "GET";
  3861. request_info.url = url_;
  3862. request_info.traffic_annotation =
  3863. MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
  3864. stream->RegisterRequest(&request_info);
  3865. EXPECT_EQ(OK, stream->InitializeStream(true, DEFAULT_PRIORITY, net_log_,
  3866. CompletionOnceCallback()));
  3867. // Ensure that session is alive and active.
  3868. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  3869. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  3870. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  3871. MaybeMakeNewConnectionIdAvailableToSession(cid_on_new_path, session);
  3872. // Send GET request on stream.
  3873. HttpResponseInfo response;
  3874. HttpRequestHeaders request_headers;
  3875. EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
  3876. callback_.callback()));
  3877. EXPECT_EQ(0u, QuicStreamFactoryPeer::GetNumDegradingSessions(factory_.get()));
  3878. // Cause the connection to report path degrading to the session.
  3879. // Session will start to probe the alternate network.
  3880. // However, the probing writer will fail. This should result in a failed probe
  3881. // but no connection close.
  3882. session->connection()->OnPathDegradingDetected();
  3883. EXPECT_EQ(1u, QuicStreamFactoryPeer::GetNumDegradingSessions(factory_.get()));
  3884. // The connection should still be alive, and not marked as going away.
  3885. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  3886. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  3887. EXPECT_EQ(1u, session->GetNumActiveStreams());
  3888. EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
  3889. // There should be one task of notifying the session that probing failed.
  3890. EXPECT_TRUE(session->connection()->HasPendingPathValidation());
  3891. EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
  3892. base::TimeDelta next_task_delay = task_runner->NextPendingTaskDelay();
  3893. EXPECT_EQ(base::TimeDelta(), next_task_delay);
  3894. task_runner->FastForwardBy(next_task_delay);
  3895. // Verify that path validation is cancelled.
  3896. EXPECT_FALSE(session->connection()->HasPendingPathValidation());
  3897. EXPECT_EQ(1u, QuicStreamFactoryPeer::GetNumDegradingSessions(factory_.get()));
  3898. quic_data1.Resume();
  3899. // Response headers are received on the original network..
  3900. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  3901. EXPECT_EQ(200, response.headers->response_code());
  3902. // Verify that the session is still alive.
  3903. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  3904. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  3905. stream.reset();
  3906. EXPECT_TRUE(quic_data1.AllReadDataConsumed());
  3907. EXPECT_TRUE(quic_data1.AllWriteDataConsumed());
  3908. EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
  3909. }
  3910. TEST_P(QuicStreamFactoryTest,
  3911. MigrateSessionEarlyProbingWriterErrorThreeNetworks) {
  3912. InitializeConnectionMigrationV2Test(
  3913. {kDefaultNetworkForTests, kNewNetworkForTests});
  3914. if (!version_.HasIetfQuicFrames())
  3915. return;
  3916. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  3917. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  3918. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  3919. // Using a testing task runner so that we can control time.
  3920. auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
  3921. QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
  3922. scoped_mock_network_change_notifier_->mock_network_change_notifier()
  3923. ->QueueNetworkMadeDefault(kDefaultNetworkForTests);
  3924. quic::QuicConnectionId cid_on_path1 =
  3925. quic::QuicUtils::CreateRandomConnectionId(context_.random_generator());
  3926. quic::QuicConnectionId cid_on_path2 = quic::test::TestConnectionId(12345678);
  3927. int packet_number = 1;
  3928. MockQuicData quic_data1(version_);
  3929. quic_data1.AddWrite(SYNCHRONOUS,
  3930. ConstructInitialSettingsPacket(packet_number++));
  3931. quic_data1.AddWrite(
  3932. SYNCHRONOUS,
  3933. ConstructGetRequestPacket(packet_number++,
  3934. GetNthClientInitiatedBidirectionalStreamId(0),
  3935. true, true));
  3936. quic_data1.AddRead(ASYNC, ERR_IO_PENDING); // Pause
  3937. quic_data1.AddRead(
  3938. ASYNC,
  3939. ConstructOkResponsePacket(
  3940. 1, GetNthClientInitiatedBidirectionalStreamId(0), false, true));
  3941. quic_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
  3942. // Set up the second socket data provider that is used for path validation.
  3943. MockQuicData quic_data2(version_);
  3944. if (VersionUsesHttp3(version_.transport_version)) {
  3945. client_maker_.set_connection_id(cid_on_path2);
  3946. }
  3947. // Connectivity probe to be sent on the new path.
  3948. quic_data2.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE);
  3949. quic_data2.AddRead(ASYNC, ERR_IO_PENDING); // Pause
  3950. quic_data2.AddRead(ASYNC,
  3951. server_maker_.MakeConnectivityProbingPacket(1, false));
  3952. packet_number++; // Account for packet encountering write error.
  3953. // Connection ID is retired on the old path.
  3954. client_maker_.set_connection_id(cid_on_path1);
  3955. quic_data1.AddWrite(SYNCHRONOUS,
  3956. client_maker_.MakeRetireConnectionIdPacket(
  3957. packet_number++, /*include_version=*/false,
  3958. /*sequence_number=*/1u));
  3959. // A socket will be created for a new path, but there would be no write
  3960. // due to lack of new connection ID.
  3961. MockQuicData quic_data3(version_);
  3962. quic_data3.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Pause
  3963. quic_data1.AddSocketDataToFactory(socket_factory_.get());
  3964. quic_data2.AddSocketDataToFactory(socket_factory_.get());
  3965. quic_data3.AddSocketDataToFactory(socket_factory_.get());
  3966. // Create request and QuicHttpStream.
  3967. QuicStreamRequest request(factory_.get());
  3968. EXPECT_EQ(ERR_IO_PENDING,
  3969. request.Request(
  3970. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  3971. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  3972. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  3973. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  3974. failed_on_default_network_callback_, callback_.callback()));
  3975. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  3976. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  3977. EXPECT_TRUE(stream.get());
  3978. // Cause QUIC stream to be created.
  3979. HttpRequestInfo request_info;
  3980. request_info.method = "GET";
  3981. request_info.url = url_;
  3982. request_info.traffic_annotation =
  3983. MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
  3984. stream->RegisterRequest(&request_info);
  3985. EXPECT_EQ(OK, stream->InitializeStream(true, DEFAULT_PRIORITY, net_log_,
  3986. CompletionOnceCallback()));
  3987. // Ensure that session is alive and active.
  3988. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  3989. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  3990. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  3991. MaybeMakeNewConnectionIdAvailableToSession(cid_on_path2, session);
  3992. // Send GET request on stream.
  3993. HttpResponseInfo response;
  3994. HttpRequestHeaders request_headers;
  3995. EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
  3996. callback_.callback()));
  3997. EXPECT_EQ(0u, QuicStreamFactoryPeer::GetNumDegradingSessions(factory_.get()));
  3998. // Cause the connection to report path degrading to the session.
  3999. // Session will start to probe the alternate network.
  4000. // However, the probing writer will fail. This should result in a failed probe
  4001. // but no connection close.
  4002. session->connection()->OnPathDegradingDetected();
  4003. EXPECT_EQ(1u, QuicStreamFactoryPeer::GetNumDegradingSessions(factory_.get()));
  4004. // The connection should still be alive, and not marked as going away.
  4005. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  4006. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  4007. EXPECT_EQ(1u, session->GetNumActiveStreams());
  4008. EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
  4009. // There should be one task of notifying the session that probing failed.
  4010. EXPECT_TRUE(session->connection()->HasPendingPathValidation());
  4011. EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
  4012. // Trigger another path degrading, but this time another network is available.
  4013. scoped_mock_network_change_notifier_->mock_network_change_notifier()
  4014. ->SetConnectedNetworksList({kDefaultNetworkForTests, 3});
  4015. session->connection()->OnPathDegradingDetected();
  4016. base::TimeDelta next_task_delay = task_runner->NextPendingTaskDelay();
  4017. EXPECT_EQ(base::TimeDelta(), next_task_delay);
  4018. task_runner->FastForwardBy(next_task_delay);
  4019. // Verify that the task is executed.
  4020. EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
  4021. // No pending path validation as there is no connection ID available.
  4022. EXPECT_FALSE(session->connection()->HasPendingPathValidation());
  4023. EXPECT_EQ(1u, QuicStreamFactoryPeer::GetNumDegradingSessions(factory_.get()));
  4024. quic_data1.Resume();
  4025. // Response headers are received on the original network..
  4026. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  4027. EXPECT_EQ(200, response.headers->response_code());
  4028. // Verify that the session is still alive.
  4029. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  4030. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  4031. stream.reset();
  4032. EXPECT_TRUE(quic_data1.AllReadDataConsumed());
  4033. EXPECT_TRUE(quic_data1.AllWriteDataConsumed());
  4034. EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
  4035. }
  4036. TEST_P(QuicStreamFactoryTest,
  4037. MigratePortOnPathDegrading_WithoutNetworkHandle_PathValidator) {
  4038. if (!version_.HasIetfQuicFrames()) {
  4039. // Path validator is only supported in IETF QUIC.
  4040. return;
  4041. }
  4042. SetIetfConnectionMigrationFlagsAndConnectionOptions();
  4043. socket_factory_ = std::make_unique<TestPortMigrationSocketFactory>();
  4044. Initialize();
  4045. TestSimplePortMigrationOnPathDegrading();
  4046. }
  4047. TEST_P(QuicStreamFactoryTest, PortMigrationDisabledOnPathDegrading) {
  4048. if (!version_.HasIetfQuicFrames()) {
  4049. // Path validator is only supported in IETF QUIC.
  4050. return;
  4051. }
  4052. SetIetfConnectionMigrationFlagsAndConnectionOptions();
  4053. socket_factory_ = std::make_unique<TestPortMigrationSocketFactory>();
  4054. Initialize();
  4055. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  4056. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  4057. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  4058. int packet_number = 1;
  4059. MockQuicData quic_data1(version_);
  4060. quic_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging Read.
  4061. quic_data1.AddWrite(SYNCHRONOUS,
  4062. ConstructInitialSettingsPacket(packet_number++));
  4063. quic_data1.AddWrite(
  4064. SYNCHRONOUS,
  4065. ConstructGetRequestPacket(packet_number++,
  4066. GetNthClientInitiatedBidirectionalStreamId(0),
  4067. true, true));
  4068. quic_data1.AddWrite(
  4069. SYNCHRONOUS, client_maker_.MakeDataPacket(
  4070. packet_number++, GetQpackDecoderStreamId(), true, false,
  4071. StreamCancellationQpackDecoderInstruction(0)));
  4072. quic_data1.AddWrite(
  4073. SYNCHRONOUS,
  4074. client_maker_.MakeRstPacket(packet_number++, true,
  4075. GetNthClientInitiatedBidirectionalStreamId(0),
  4076. quic::QUIC_STREAM_CANCELLED));
  4077. quic_data1.AddSocketDataToFactory(socket_factory_.get());
  4078. // Create request and QuicHttpStream.
  4079. QuicStreamRequest request(factory_.get());
  4080. EXPECT_EQ(ERR_IO_PENDING,
  4081. request.Request(
  4082. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  4083. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  4084. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  4085. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  4086. failed_on_default_network_callback_, callback_.callback()));
  4087. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  4088. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  4089. EXPECT_TRUE(stream.get());
  4090. // Cause QUIC stream to be created.
  4091. HttpRequestInfo request_info;
  4092. request_info.method = "GET";
  4093. request_info.url = url_;
  4094. request_info.traffic_annotation =
  4095. MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
  4096. stream->RegisterRequest(&request_info);
  4097. EXPECT_EQ(OK, stream->InitializeStream(true, DEFAULT_PRIORITY, net_log_,
  4098. CompletionOnceCallback()));
  4099. // Ensure that session is alive and active.
  4100. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  4101. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  4102. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  4103. // Send GET request on stream.
  4104. HttpResponseInfo response;
  4105. HttpRequestHeaders request_headers;
  4106. EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
  4107. callback_.callback()));
  4108. // Disable connection migration on the request streams.
  4109. // This should have no effect for port migration.
  4110. QuicChromiumClientStream* chrome_stream =
  4111. static_cast<QuicChromiumClientStream*>(
  4112. quic::test::QuicSessionPeer::GetStream(
  4113. session, GetNthClientInitiatedBidirectionalStreamId(0)));
  4114. EXPECT_TRUE(chrome_stream);
  4115. chrome_stream->DisableConnectionMigrationToCellularNetwork();
  4116. EXPECT_EQ(0u, QuicStreamFactoryPeer::GetNumDegradingSessions(factory_.get()));
  4117. // Manually initialize the connection's self address. In real life, the
  4118. // initialization will be done during crypto handshake.
  4119. IPEndPoint ip;
  4120. session->GetDefaultSocket()->GetLocalAddress(&ip);
  4121. quic::test::QuicConnectionPeer::SetSelfAddress(session->connection(),
  4122. ToQuicSocketAddress(ip));
  4123. // Set session config to have active migration disabled.
  4124. quic::test::QuicConfigPeer::SetReceivedDisableConnectionMigration(
  4125. session->config());
  4126. EXPECT_TRUE(session->config()->DisableConnectionMigration());
  4127. // Cause the connection to report path degrading to the session.
  4128. // Session will start to probe a different port.
  4129. session->connection()->OnPathDegradingDetected();
  4130. // The session should stay alive as if nothing happened.
  4131. EXPECT_EQ(1u, QuicStreamFactoryPeer::GetNumDegradingSessions(factory_.get()));
  4132. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  4133. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  4134. EXPECT_EQ(1u, session->GetNumActiveStreams());
  4135. stream.reset();
  4136. EXPECT_TRUE(quic_data1.AllReadDataConsumed());
  4137. EXPECT_TRUE(quic_data1.AllWriteDataConsumed());
  4138. }
  4139. TEST_P(QuicStreamFactoryTest,
  4140. PortMigrationProbingReceivedStatelessReset_PathValidator) {
  4141. if (!version_.HasIetfQuicFrames()) {
  4142. // Path validator is only supported in IETF QUIC.
  4143. return;
  4144. }
  4145. SetIetfConnectionMigrationFlagsAndConnectionOptions();
  4146. socket_factory_ = std::make_unique<TestPortMigrationSocketFactory>();
  4147. Initialize();
  4148. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  4149. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  4150. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  4151. // Using a testing task runner so that we can control time.
  4152. auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
  4153. QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
  4154. int packet_number = 1;
  4155. MockQuicData quic_data1(version_);
  4156. quic_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // hanging read
  4157. quic_data1.AddWrite(SYNCHRONOUS,
  4158. ConstructInitialSettingsPacket(packet_number++));
  4159. quic_data1.AddWrite(
  4160. SYNCHRONOUS,
  4161. ConstructGetRequestPacket(packet_number++,
  4162. GetNthClientInitiatedBidirectionalStreamId(0),
  4163. true, true));
  4164. quic_data1.AddWrite(SYNCHRONOUS,
  4165. client_maker_.MakeDataPacket(
  4166. packet_number + 1, GetQpackDecoderStreamId(), true,
  4167. false, StreamCancellationQpackDecoderInstruction(0)));
  4168. quic_data1.AddWrite(
  4169. SYNCHRONOUS,
  4170. client_maker_.MakeRstPacket(packet_number + 2, false,
  4171. GetNthClientInitiatedBidirectionalStreamId(0),
  4172. quic::QUIC_STREAM_CANCELLED));
  4173. quic_data1.AddSocketDataToFactory(socket_factory_.get());
  4174. // Set up the second socket data provider that is used for migration probing.
  4175. MockQuicData quic_data2(version_);
  4176. quic::QuicConnectionId cid_on_new_path =
  4177. quic::test::TestConnectionId(12345678);
  4178. if (VersionUsesHttp3(version_.transport_version)) {
  4179. client_maker_.set_connection_id(cid_on_new_path);
  4180. }
  4181. // Connectivity probe to be sent on the new path.
  4182. quic_data2.AddWrite(SYNCHRONOUS, client_maker_.MakeConnectivityProbingPacket(
  4183. packet_number, true));
  4184. quic_data2.AddRead(ASYNC, ERR_IO_PENDING); // Pause
  4185. // Stateless reset to receive from the server.
  4186. quic_data2.AddRead(ASYNC, server_maker_.MakeStatelessResetPacket());
  4187. quic_data2.AddSocketDataToFactory(socket_factory_.get());
  4188. // Create request and QuicHttpStream.
  4189. QuicStreamRequest request(factory_.get());
  4190. EXPECT_EQ(ERR_IO_PENDING,
  4191. request.Request(
  4192. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  4193. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  4194. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  4195. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  4196. failed_on_default_network_callback_, callback_.callback()));
  4197. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  4198. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  4199. EXPECT_TRUE(stream.get());
  4200. // Cause QUIC stream to be created.
  4201. HttpRequestInfo request_info;
  4202. request_info.method = "GET";
  4203. request_info.url = url_;
  4204. request_info.traffic_annotation =
  4205. MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
  4206. stream->RegisterRequest(&request_info);
  4207. EXPECT_EQ(OK, stream->InitializeStream(true, DEFAULT_PRIORITY, net_log_,
  4208. CompletionOnceCallback()));
  4209. // Ensure that session is alive and active.
  4210. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  4211. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  4212. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  4213. MaybeMakeNewConnectionIdAvailableToSession(cid_on_new_path, session);
  4214. // Send GET request on stream.
  4215. HttpResponseInfo response;
  4216. HttpRequestHeaders request_headers;
  4217. EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
  4218. callback_.callback()));
  4219. // Manually initialize the connection's self address. In real life, the
  4220. // initialization will be done during crypto handshake.
  4221. IPEndPoint ip;
  4222. session->GetDefaultSocket()->GetLocalAddress(&ip);
  4223. quic::test::QuicConnectionPeer::SetSelfAddress(session->connection(),
  4224. ToQuicSocketAddress(ip));
  4225. EXPECT_EQ(0u, QuicStreamFactoryPeer::GetNumDegradingSessions(factory_.get()));
  4226. // Cause the connection to report path degrading to the session.
  4227. // Session will start to probe a different port.
  4228. session->connection()->OnPathDegradingDetected();
  4229. EXPECT_EQ(1u, QuicStreamFactoryPeer::GetNumDegradingSessions(factory_.get()));
  4230. // The connection should still be alive, and not marked as going away.
  4231. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  4232. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  4233. EXPECT_EQ(1u, session->GetNumActiveStreams());
  4234. EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
  4235. // Resume quic data and a STATELESS_RESET is read from the probing path.
  4236. quic_data2.Resume();
  4237. EXPECT_EQ(1u, QuicStreamFactoryPeer::GetNumDegradingSessions(factory_.get()));
  4238. // Verify that the session is still active, and the request stream is active.
  4239. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  4240. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  4241. EXPECT_EQ(1u, session->GetNumActiveStreams());
  4242. stream.reset();
  4243. EXPECT_TRUE(quic_data1.AllReadDataConsumed());
  4244. EXPECT_TRUE(quic_data1.AllWriteDataConsumed());
  4245. EXPECT_TRUE(quic_data2.AllReadDataConsumed());
  4246. EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
  4247. }
  4248. TEST_P(QuicStreamFactoryTest,
  4249. MigratePortOnPathDegrading_WithNetworkHandle_PathValidator) {
  4250. if (!version_.HasIetfQuicFrames()) {
  4251. // Path validator is only supported in IETF QUIC.
  4252. return;
  4253. }
  4254. scoped_mock_network_change_notifier_ =
  4255. std::make_unique<ScopedMockNetworkChangeNotifier>();
  4256. MockNetworkChangeNotifier* mock_ncn =
  4257. scoped_mock_network_change_notifier_->mock_network_change_notifier();
  4258. mock_ncn->ForceNetworkHandlesSupported();
  4259. mock_ncn->SetConnectedNetworksList({kDefaultNetworkForTests});
  4260. SetIetfConnectionMigrationFlagsAndConnectionOptions();
  4261. socket_factory_ = std::make_unique<TestPortMigrationSocketFactory>();
  4262. Initialize();
  4263. scoped_mock_network_change_notifier_->mock_network_change_notifier()
  4264. ->NotifyNetworkMadeDefault(kDefaultNetworkForTests);
  4265. TestSimplePortMigrationOnPathDegrading();
  4266. }
  4267. TEST_P(QuicStreamFactoryTest,
  4268. MigratePortOnPathDegrading_WithMigration_PathValidator) {
  4269. if (!version_.HasIetfQuicFrames()) {
  4270. // Path validator is only supported in IETF QUIC.
  4271. return;
  4272. }
  4273. scoped_mock_network_change_notifier_ =
  4274. std::make_unique<ScopedMockNetworkChangeNotifier>();
  4275. MockNetworkChangeNotifier* mock_ncn =
  4276. scoped_mock_network_change_notifier_->mock_network_change_notifier();
  4277. mock_ncn->ForceNetworkHandlesSupported();
  4278. mock_ncn->SetConnectedNetworksList({kDefaultNetworkForTests});
  4279. // Enable migration on network change.
  4280. quic_params_->migrate_sessions_on_network_change_v2 = true;
  4281. SetIetfConnectionMigrationFlagsAndConnectionOptions();
  4282. socket_factory_ = std::make_unique<TestPortMigrationSocketFactory>();
  4283. Initialize();
  4284. scoped_mock_network_change_notifier_->mock_network_change_notifier()
  4285. ->NotifyNetworkMadeDefault(kDefaultNetworkForTests);
  4286. TestSimplePortMigrationOnPathDegrading();
  4287. }
  4288. void QuicStreamFactoryTestBase::TestSimplePortMigrationOnPathDegrading() {
  4289. DCHECK(version_.UsesHttp3());
  4290. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  4291. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  4292. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  4293. // Using a testing task runner so that we can control time.
  4294. auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
  4295. QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
  4296. int packet_number = 1;
  4297. MockQuicData quic_data1(version_);
  4298. quic_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging Read.
  4299. quic_data1.AddWrite(SYNCHRONOUS,
  4300. ConstructInitialSettingsPacket(packet_number++));
  4301. quic_data1.AddWrite(
  4302. SYNCHRONOUS,
  4303. ConstructGetRequestPacket(packet_number++,
  4304. GetNthClientInitiatedBidirectionalStreamId(0),
  4305. true, true));
  4306. quic_data1.AddSocketDataToFactory(socket_factory_.get());
  4307. // Set up the second socket data provider that is used after migration.
  4308. // The response to the earlier request is read on the new socket.
  4309. MockQuicData quic_data2(version_);
  4310. quic::QuicConnectionId cid_on_new_path =
  4311. quic::test::TestConnectionId(12345678);
  4312. client_maker_.set_connection_id(cid_on_new_path);
  4313. // Connectivity probe to be sent on the new path.
  4314. quic_data2.AddWrite(SYNCHRONOUS, client_maker_.MakeConnectivityProbingPacket(
  4315. packet_number++, true));
  4316. quic_data2.AddRead(ASYNC, ERR_IO_PENDING); // Pause
  4317. // Connectivity probe to receive from the server.
  4318. quic_data2.AddRead(ASYNC,
  4319. server_maker_.MakeConnectivityProbingPacket(1, false));
  4320. // Ping packet to send after migration is completed.
  4321. quic_data2.AddWrite(ASYNC,
  4322. client_maker_.MakePingPacket(packet_number++,
  4323. /*include_version=*/false));
  4324. quic_data2.AddRead(
  4325. ASYNC,
  4326. ConstructOkResponsePacket(
  4327. 2, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
  4328. quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  4329. if (FLAGS_quic_reloadable_flag_quic_connection_migration_use_new_cid_v2) {
  4330. quic_data2.AddWrite(SYNCHRONOUS,
  4331. client_maker_.MakeAckAndRetireConnectionIdPacket(
  4332. packet_number++, /*include_version=*/false,
  4333. /*largest_received=*/2,
  4334. /*smallest_received=*/1, /*sequence_number=*/0u));
  4335. quic_data2.AddWrite(
  4336. SYNCHRONOUS,
  4337. client_maker_.MakeDataPacket(
  4338. packet_number++, GetQpackDecoderStreamId(),
  4339. /*should_include_version=*/false,
  4340. /*fin=*/false, StreamCancellationQpackDecoderInstruction(0)));
  4341. } else {
  4342. quic_data2.AddWrite(
  4343. SYNCHRONOUS,
  4344. client_maker_.MakeAckAndDataPacket(
  4345. packet_number++, /*include_version=*/false,
  4346. GetQpackDecoderStreamId(),
  4347. /*largest_received=*/2, /*smallest_received=*/2, /*fin=*/false,
  4348. StreamCancellationQpackDecoderInstruction(0)));
  4349. }
  4350. quic_data2.AddWrite(
  4351. SYNCHRONOUS,
  4352. client_maker_.MakeRstPacket(packet_number++, false,
  4353. GetNthClientInitiatedBidirectionalStreamId(0),
  4354. quic::QUIC_STREAM_CANCELLED));
  4355. quic_data2.AddSocketDataToFactory(socket_factory_.get());
  4356. // Create request and QuicHttpStream.
  4357. QuicStreamRequest request(factory_.get());
  4358. EXPECT_EQ(ERR_IO_PENDING,
  4359. request.Request(
  4360. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  4361. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  4362. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  4363. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  4364. failed_on_default_network_callback_, callback_.callback()));
  4365. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  4366. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  4367. EXPECT_TRUE(stream.get());
  4368. // Cause QUIC stream to be created.
  4369. HttpRequestInfo request_info;
  4370. request_info.method = "GET";
  4371. request_info.url = url_;
  4372. request_info.traffic_annotation =
  4373. MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
  4374. stream->RegisterRequest(&request_info);
  4375. EXPECT_EQ(OK, stream->InitializeStream(true, DEFAULT_PRIORITY, net_log_,
  4376. CompletionOnceCallback()));
  4377. // Ensure that session is alive and active.
  4378. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  4379. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  4380. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  4381. MaybeMakeNewConnectionIdAvailableToSession(cid_on_new_path, session);
  4382. // Send GET request on stream.
  4383. HttpResponseInfo response;
  4384. HttpRequestHeaders request_headers;
  4385. EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
  4386. callback_.callback()));
  4387. // Disable connection migration on the request streams.
  4388. // This should have no effect for port migration.
  4389. QuicChromiumClientStream* chrome_stream =
  4390. static_cast<QuicChromiumClientStream*>(
  4391. quic::test::QuicSessionPeer::GetStream(
  4392. session, GetNthClientInitiatedBidirectionalStreamId(0)));
  4393. EXPECT_TRUE(chrome_stream);
  4394. chrome_stream->DisableConnectionMigrationToCellularNetwork();
  4395. EXPECT_EQ(0u, QuicStreamFactoryPeer::GetNumDegradingSessions(factory_.get()));
  4396. // Manually initialize the connection's self address. In real life, the
  4397. // initialization will be done during crypto handshake.
  4398. IPEndPoint ip;
  4399. session->GetDefaultSocket()->GetLocalAddress(&ip);
  4400. quic::test::QuicConnectionPeer::SetSelfAddress(session->connection(),
  4401. ToQuicSocketAddress(ip));
  4402. // Cause the connection to report path degrading to the session.
  4403. // Session will start to probe a different port.
  4404. session->connection()->OnPathDegradingDetected();
  4405. EXPECT_EQ(1u, QuicStreamFactoryPeer::GetNumDegradingSessions(factory_.get()));
  4406. // The retry mechanism is internal to path validator.
  4407. EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
  4408. // The connection should still be alive, and not marked as going away.
  4409. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  4410. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  4411. EXPECT_EQ(1u, session->GetNumActiveStreams());
  4412. EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
  4413. // Resume quic data and a connectivity probe response will be read on the new
  4414. // socket.
  4415. quic_data2.Resume();
  4416. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  4417. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  4418. EXPECT_EQ(1u, session->GetNumActiveStreams());
  4419. // Successful port migration causes the path no longer degrading on the same
  4420. // network.
  4421. EXPECT_EQ(0u, QuicStreamFactoryPeer::GetNumDegradingSessions(factory_.get()));
  4422. // There should be pending tasks, the nearest one will complete
  4423. // migration to the new port.
  4424. task_runner->RunUntilIdle();
  4425. // Fire any outstanding quic alarms.
  4426. base::RunLoop().RunUntilIdle();
  4427. // Response headers are received over the new port.
  4428. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  4429. EXPECT_EQ(200, response.headers->response_code());
  4430. EXPECT_EQ(0u, QuicStreamFactoryPeer::GetNumDegradingSessions(factory_.get()));
  4431. // Now there may be one pending task to send connectivity probe that has been
  4432. // cancelled due to successful migration.
  4433. task_runner->FastForwardUntilNoTasksRemain();
  4434. // Verify that the session is still alive, and the request stream is still
  4435. // alive.
  4436. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  4437. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  4438. chrome_stream = static_cast<QuicChromiumClientStream*>(
  4439. quic::test::QuicSessionPeer::GetStream(
  4440. session, GetNthClientInitiatedBidirectionalStreamId(0)));
  4441. EXPECT_TRUE(chrome_stream);
  4442. stream.reset();
  4443. EXPECT_TRUE(quic_data1.AllReadDataConsumed());
  4444. EXPECT_TRUE(quic_data1.AllWriteDataConsumed());
  4445. EXPECT_TRUE(quic_data2.AllReadDataConsumed());
  4446. EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
  4447. }
  4448. TEST_P(QuicStreamFactoryTest,
  4449. MultiplePortMigrationsExceedsMaxLimit_iQUICStyle) {
  4450. if (!version_.HasIetfQuicFrames()) {
  4451. return;
  4452. }
  4453. SetIetfConnectionMigrationFlagsAndConnectionOptions();
  4454. socket_factory_ = std::make_unique<TestPortMigrationSocketFactory>();
  4455. Initialize();
  4456. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  4457. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  4458. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  4459. // Using a testing task runner so that we can control time.
  4460. auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
  4461. QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
  4462. int packet_number = 1;
  4463. MockQuicData quic_data1(version_);
  4464. quic_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging Read.
  4465. quic_data1.AddWrite(SYNCHRONOUS,
  4466. ConstructInitialSettingsPacket(packet_number++));
  4467. quic_data1.AddWrite(
  4468. SYNCHRONOUS,
  4469. ConstructGetRequestPacket(packet_number++,
  4470. GetNthClientInitiatedBidirectionalStreamId(0),
  4471. true, true));
  4472. quic_data1.AddSocketDataToFactory(socket_factory_.get());
  4473. // Create request and QuicHttpStream.
  4474. QuicStreamRequest request(factory_.get());
  4475. EXPECT_EQ(ERR_IO_PENDING,
  4476. request.Request(
  4477. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  4478. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  4479. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  4480. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  4481. failed_on_default_network_callback_, callback_.callback()));
  4482. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  4483. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  4484. EXPECT_TRUE(stream.get());
  4485. // Cause QUIC stream to be created.
  4486. HttpRequestInfo request_info;
  4487. request_info.method = "GET";
  4488. request_info.url = url_;
  4489. request_info.traffic_annotation =
  4490. MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
  4491. stream->RegisterRequest(&request_info);
  4492. EXPECT_EQ(OK, stream->InitializeStream(true, DEFAULT_PRIORITY, net_log_,
  4493. CompletionOnceCallback()));
  4494. // Ensure that session is alive and active.
  4495. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  4496. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  4497. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  4498. // Send GET request on stream.
  4499. HttpResponseInfo response;
  4500. HttpRequestHeaders request_headers;
  4501. EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
  4502. callback_.callback()));
  4503. int server_packet_num = 1;
  4504. // Perform 4 round of successful migration, and the 5th round will
  4505. // cancel after successful probing due to hitting the limit.
  4506. for (int i = 0; i <= 4; i++) {
  4507. // Set up a different socket data provider that is used for
  4508. // probing and migration.
  4509. MockQuicData quic_data2(version_);
  4510. // Connectivity probe to be sent on the new path.
  4511. uint64_t new_cid = 12345678;
  4512. quic::QuicConnectionId cid_on_new_path =
  4513. quic::test::TestConnectionId(new_cid + i);
  4514. if (FLAGS_quic_reloadable_flag_quic_connection_migration_use_new_cid_v2) {
  4515. client_maker_.set_connection_id(cid_on_new_path);
  4516. MaybeMakeNewConnectionIdAvailableToSession(cid_on_new_path, session,
  4517. i + 1);
  4518. }
  4519. quic_data2.AddWrite(SYNCHRONOUS,
  4520. client_maker_.MakeConnectivityProbingPacket(
  4521. packet_number, packet_number == 2));
  4522. packet_number++;
  4523. quic_data2.AddRead(ASYNC, ERR_IO_PENDING); // Pause
  4524. // Connectivity probe to receive from the server.
  4525. quic_data2.AddRead(ASYNC, server_maker_.MakeConnectivityProbingPacket(
  4526. server_packet_num++, false));
  4527. if (i == 0) {
  4528. // Retire old connection id and send ping packet after migration is
  4529. // completed.
  4530. quic_data2.AddWrite(SYNCHRONOUS,
  4531. client_maker_.MakeRetireConnectionIdPacket(
  4532. packet_number++, /*include_version=*/false,
  4533. /*sequence_number=*/0u));
  4534. quic_data2.AddWrite(
  4535. SYNCHRONOUS, client_maker_.MakePingPacket(packet_number++,
  4536. /*include_version=*/false));
  4537. } else if (i != 4) {
  4538. quic_data2.AddWrite(SYNCHRONOUS,
  4539. client_maker_.MakeAckAndRetireConnectionIdPacket(
  4540. packet_number++, false, 1 + 2 * i, 1 + 2 * i, i));
  4541. quic_data2.AddWrite(
  4542. SYNCHRONOUS, client_maker_.MakePingPacket(packet_number++,
  4543. /*include_version=*/false));
  4544. }
  4545. if (i == 4) {
  4546. // Add one more synchronous read on the last probing reader. The
  4547. // reader should be deleted on the read before this one.
  4548. // The test will verify this read is not consumed.
  4549. quic_data2.AddRead(SYNCHRONOUS,
  4550. server_maker_.MakeConnectivityProbingPacket(
  4551. server_packet_num++, false));
  4552. } else {
  4553. quic_data2.AddRead(ASYNC, server_maker_.MakeConnectivityProbingPacket(
  4554. server_packet_num++, false));
  4555. }
  4556. if (i == 3) {
  4557. // On the last allowed port migration, read one more packet so
  4558. // that ACK is sent. The next round of migration (which hits the limit)
  4559. // will not send any proactive ACK when reading the successful probing
  4560. // response.
  4561. quic_data2.AddRead(ASYNC, server_maker_.MakeConnectivityProbingPacket(
  4562. server_packet_num++, false));
  4563. quic_data2.AddWrite(SYNCHRONOUS,
  4564. client_maker_.MakeAckPacket(packet_number++, 9, 9));
  4565. }
  4566. quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // EOF.
  4567. quic_data2.AddSocketDataToFactory(socket_factory_.get());
  4568. EXPECT_EQ(0u,
  4569. QuicStreamFactoryPeer::GetNumDegradingSessions(factory_.get()));
  4570. // Cause the connection to report path degrading to the session.
  4571. // Session will start to probe a different port.
  4572. session->connection()->OnPathDegradingDetected();
  4573. EXPECT_EQ(1u,
  4574. QuicStreamFactoryPeer::GetNumDegradingSessions(factory_.get()));
  4575. // The retry mechanism is internal to path validator.
  4576. EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
  4577. // The connection should still be alive, and not marked as going away.
  4578. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  4579. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  4580. EXPECT_EQ(1u, session->GetNumActiveStreams());
  4581. // Resume quic data and a connectivity probe response will be read on the
  4582. // new socket.
  4583. quic_data2.Resume();
  4584. base::RunLoop().RunUntilIdle();
  4585. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  4586. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  4587. EXPECT_EQ(1u, session->GetNumActiveStreams());
  4588. if (i < 4) {
  4589. // There's a pending task to complete migration to the new port.
  4590. task_runner->RunUntilIdle();
  4591. } else {
  4592. // Last attempt to migrate will abort due to hitting the limit of max
  4593. // number of allowed migrations.
  4594. task_runner->FastForwardUntilNoTasksRemain();
  4595. }
  4596. EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
  4597. // The last round of migration will abort upon reading the probing response.
  4598. // Future reads in the same socket is ignored.
  4599. EXPECT_EQ(i != 4, quic_data2.AllReadDataConsumed());
  4600. }
  4601. // Verify that the session is still alive.
  4602. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  4603. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  4604. stream.reset();
  4605. EXPECT_TRUE(quic_data1.AllReadDataConsumed());
  4606. EXPECT_TRUE(quic_data1.AllWriteDataConsumed());
  4607. }
  4608. TEST_P(QuicStreamFactoryTest,
  4609. MigratePortOnPathDegrading_MigrateIdleSession_PathValidator) {
  4610. if (!version_.HasIetfQuicFrames()) {
  4611. // Path validator is only supported in IETF QUIC.
  4612. return;
  4613. }
  4614. scoped_mock_network_change_notifier_ =
  4615. std::make_unique<ScopedMockNetworkChangeNotifier>();
  4616. MockNetworkChangeNotifier* mock_ncn =
  4617. scoped_mock_network_change_notifier_->mock_network_change_notifier();
  4618. mock_ncn->ForceNetworkHandlesSupported();
  4619. mock_ncn->SetConnectedNetworksList({kDefaultNetworkForTests});
  4620. // Enable migration on network change.
  4621. quic_params_->migrate_sessions_on_network_change_v2 = true;
  4622. quic_params_->migrate_idle_sessions = true;
  4623. SetIetfConnectionMigrationFlagsAndConnectionOptions();
  4624. socket_factory_ = std::make_unique<TestPortMigrationSocketFactory>();
  4625. Initialize();
  4626. scoped_mock_network_change_notifier_->mock_network_change_notifier()
  4627. ->NotifyNetworkMadeDefault(kDefaultNetworkForTests);
  4628. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  4629. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  4630. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  4631. // Using a testing task runner so that we can control time.
  4632. auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
  4633. QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
  4634. int packet_number = 1;
  4635. MockQuicData quic_data1(version_);
  4636. quic_data1.AddWrite(SYNCHRONOUS,
  4637. ConstructInitialSettingsPacket(packet_number++));
  4638. quic_data1.AddWrite(
  4639. SYNCHRONOUS,
  4640. ConstructGetRequestPacket(packet_number++,
  4641. GetNthClientInitiatedBidirectionalStreamId(0),
  4642. true, true));
  4643. quic_data1.AddRead(ASYNC, ERR_IO_PENDING); // Pause
  4644. // The client session will receive the response first and closes its only
  4645. // stream.
  4646. quic_data1.AddRead(
  4647. ASYNC, ConstructOkResponsePacket(
  4648. 1, GetNthClientInitiatedBidirectionalStreamId(0), false,
  4649. /*fin = */ true));
  4650. quic_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Pause
  4651. quic_data1.AddSocketDataToFactory(socket_factory_.get());
  4652. // Set up the second socket data provider that is used after migration.
  4653. // The response to the earlier request is read on the new socket.
  4654. MockQuicData quic_data2(version_);
  4655. quic::QuicConnectionId cid_on_new_path =
  4656. quic::test::TestConnectionId(12345678);
  4657. client_maker_.set_connection_id(cid_on_new_path);
  4658. // Connectivity probe to be sent on the new path.
  4659. quic_data2.AddWrite(SYNCHRONOUS, client_maker_.MakeConnectivityProbingPacket(
  4660. packet_number++, true));
  4661. quic_data2.AddRead(ASYNC, ERR_IO_PENDING); // Pause
  4662. // Connectivity probe to receive from the server.
  4663. quic_data2.AddRead(ASYNC,
  4664. server_maker_.MakeConnectivityProbingPacket(2, false));
  4665. quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  4666. // Ping packet to send after migration is completed.
  4667. quic_data2.AddWrite(ASYNC, client_maker_.MakeAckAndPingPacket(
  4668. packet_number++,
  4669. /*include_version=*/false, 2, 1));
  4670. quic_data2.AddWrite(
  4671. SYNCHRONOUS,
  4672. client_maker_.MakeRetireConnectionIdPacket(
  4673. packet_number++, /*include_version=*/false, /*sequence_number=*/0u));
  4674. quic_data2.AddSocketDataToFactory(socket_factory_.get());
  4675. // Create request and QuicHttpStream.
  4676. QuicStreamRequest request(factory_.get());
  4677. EXPECT_EQ(ERR_IO_PENDING,
  4678. request.Request(
  4679. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  4680. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  4681. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  4682. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  4683. failed_on_default_network_callback_, callback_.callback()));
  4684. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  4685. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  4686. EXPECT_TRUE(stream.get());
  4687. // Cause QUIC stream to be created.
  4688. HttpRequestInfo request_info;
  4689. request_info.method = "GET";
  4690. request_info.url = url_;
  4691. request_info.traffic_annotation =
  4692. MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
  4693. stream->RegisterRequest(&request_info);
  4694. EXPECT_EQ(OK, stream->InitializeStream(true, DEFAULT_PRIORITY, net_log_,
  4695. CompletionOnceCallback()));
  4696. // Ensure that session is alive and active.
  4697. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  4698. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  4699. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  4700. MaybeMakeNewConnectionIdAvailableToSession(cid_on_new_path, session);
  4701. // Send GET request on stream.
  4702. HttpResponseInfo response;
  4703. HttpRequestHeaders request_headers;
  4704. EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
  4705. callback_.callback()));
  4706. // Disable connection migration on the request streams.
  4707. // This should have no effect for port migration.
  4708. QuicChromiumClientStream* chrome_stream =
  4709. static_cast<QuicChromiumClientStream*>(
  4710. quic::test::QuicSessionPeer::GetStream(
  4711. session, GetNthClientInitiatedBidirectionalStreamId(0)));
  4712. EXPECT_TRUE(chrome_stream);
  4713. chrome_stream->DisableConnectionMigrationToCellularNetwork();
  4714. EXPECT_EQ(0u, QuicStreamFactoryPeer::GetNumDegradingSessions(factory_.get()));
  4715. // Manually initialize the connection's self address. In real life, the
  4716. // initialization will be done during crypto handshake.
  4717. IPEndPoint ip;
  4718. session->GetDefaultSocket()->GetLocalAddress(&ip);
  4719. quic::test::QuicConnectionPeer::SetSelfAddress(session->connection(),
  4720. ToQuicSocketAddress(ip));
  4721. // Cause the connection to report path degrading to the session.
  4722. // Session will start to probe a different port.
  4723. session->connection()->OnPathDegradingDetected();
  4724. EXPECT_EQ(1u, session->GetNumActiveStreams());
  4725. EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
  4726. // A response will be received on the current path and closes the request
  4727. // stream.
  4728. quic_data1.Resume();
  4729. base::RunLoop().RunUntilIdle();
  4730. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  4731. EXPECT_EQ(200, response.headers->response_code());
  4732. EXPECT_EQ(0u, session->GetNumActiveStreams());
  4733. EXPECT_EQ(1u, QuicStreamFactoryPeer::GetNumDegradingSessions(factory_.get()));
  4734. // The retry mechanism is internal to path validator.
  4735. EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
  4736. // The connection should still be alive, and not marked as going away.
  4737. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  4738. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  4739. // Resume quic data and a connectivity probe response will be read on the new
  4740. // socket.
  4741. quic_data2.Resume();
  4742. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  4743. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  4744. // Successful port migration causes the path no longer degrading on the same
  4745. // network.
  4746. EXPECT_EQ(0u, QuicStreamFactoryPeer::GetNumDegradingSessions(factory_.get()));
  4747. // There should be pending tasks, the nearest one will complete
  4748. // migration to the new port.
  4749. task_runner->RunUntilIdle();
  4750. // Fire any outstanding quic alarms.
  4751. base::RunLoop().RunUntilIdle();
  4752. // Now there may be one pending task to send connectivity probe that has been
  4753. // cancelled due to successful migration.
  4754. task_runner->FastForwardUntilNoTasksRemain();
  4755. // Verify that the session is still alive.
  4756. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  4757. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  4758. EXPECT_TRUE(quic_data1.AllReadDataConsumed());
  4759. EXPECT_TRUE(quic_data1.AllWriteDataConsumed());
  4760. EXPECT_TRUE(quic_data2.AllReadDataConsumed());
  4761. EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
  4762. }
  4763. // This test verifies that the connection will not migrate to a bad socket
  4764. // when path degrading is detected.
  4765. TEST_P(QuicStreamFactoryTest, DoNotMigrateToBadSocketOnPathDegrading) {
  4766. if (!version_.UsesHttp3())
  4767. return;
  4768. InitializeConnectionMigrationV2Test(
  4769. {kDefaultNetworkForTests, kNewNetworkForTests});
  4770. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  4771. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  4772. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  4773. // Using a testing task runner so that we can control time.
  4774. auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
  4775. QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
  4776. scoped_mock_network_change_notifier_->mock_network_change_notifier()
  4777. ->QueueNetworkMadeDefault(kDefaultNetworkForTests);
  4778. MockQuicData quic_data(version_);
  4779. int packet_num = 1;
  4780. quic_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket(packet_num++));
  4781. quic_data.AddWrite(
  4782. SYNCHRONOUS,
  4783. ConstructGetRequestPacket(packet_num++,
  4784. GetNthClientInitiatedBidirectionalStreamId(0),
  4785. true, true));
  4786. quic_data.AddRead(ASYNC, ERR_IO_PENDING); // Pause
  4787. quic_data.AddRead(ASYNC, ConstructOkResponsePacket(
  4788. 1, GetNthClientInitiatedBidirectionalStreamId(0),
  4789. false, false));
  4790. quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  4791. quic_data.AddWrite(SYNCHRONOUS,
  4792. client_maker_.MakeAckAndDataPacket(
  4793. packet_num++, false, GetQpackDecoderStreamId(), 1, 1,
  4794. false, StreamCancellationQpackDecoderInstruction(0)));
  4795. quic_data.AddWrite(
  4796. SYNCHRONOUS,
  4797. client_maker_.MakeRstPacket(packet_num++, false,
  4798. GetNthClientInitiatedBidirectionalStreamId(0),
  4799. quic::QUIC_STREAM_CANCELLED));
  4800. quic_data.AddSocketDataToFactory(socket_factory_.get());
  4801. // Set up second socket that will immediately return disconnected.
  4802. // The stream factory will abort probe the alternate network.
  4803. MockConnect bad_connect = MockConnect(SYNCHRONOUS, ERR_INTERNET_DISCONNECTED);
  4804. SequencedSocketData socket_data(bad_connect, base::span<MockRead>(),
  4805. base::span<MockWrite>());
  4806. socket_factory_->AddSocketDataProvider(&socket_data);
  4807. // Create request and QuicHttpStream.
  4808. QuicStreamRequest request(factory_.get());
  4809. EXPECT_EQ(ERR_IO_PENDING,
  4810. request.Request(
  4811. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  4812. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  4813. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  4814. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  4815. failed_on_default_network_callback_, callback_.callback()));
  4816. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  4817. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  4818. EXPECT_TRUE(stream.get());
  4819. // Cause QUIC stream to be created.
  4820. HttpRequestInfo request_info;
  4821. request_info.method = "GET";
  4822. request_info.url = url_;
  4823. request_info.traffic_annotation =
  4824. MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
  4825. stream->RegisterRequest(&request_info);
  4826. EXPECT_EQ(OK, stream->InitializeStream(true, DEFAULT_PRIORITY, net_log_,
  4827. CompletionOnceCallback()));
  4828. // Ensure that session is alive and active.
  4829. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  4830. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  4831. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  4832. // Send GET request on stream.
  4833. HttpResponseInfo response;
  4834. HttpRequestHeaders request_headers;
  4835. EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
  4836. callback_.callback()));
  4837. EXPECT_EQ(0u, QuicStreamFactoryPeer::GetNumDegradingSessions(factory_.get()));
  4838. // Cause the connection to report path degrading to the session.
  4839. // Session will start to probe the alternate network.
  4840. session->connection()->OnPathDegradingDetected();
  4841. EXPECT_EQ(1u, QuicStreamFactoryPeer::GetNumDegradingSessions(factory_.get()));
  4842. // The connection should still be alive, and not marked as going away.
  4843. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  4844. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  4845. EXPECT_EQ(1u, session->GetNumActiveStreams());
  4846. EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
  4847. // Resume the data, and response header is received over the original network.
  4848. quic_data.Resume();
  4849. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  4850. EXPECT_EQ(200, response.headers->response_code());
  4851. // Verify there is no pending task as probing alternate network is halted.
  4852. EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
  4853. // Verify that the session is still alive.
  4854. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  4855. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  4856. stream.reset();
  4857. EXPECT_TRUE(quic_data.AllReadDataConsumed());
  4858. EXPECT_TRUE(quic_data.AllWriteDataConsumed());
  4859. }
  4860. // Regression test for http://crbug.com/847569.
  4861. // This test verifies that the connection migrates to the alternate network
  4862. // early when there is no active stream but a draining stream.
  4863. // The first packet being written after migration is a synchrnous write, which
  4864. // will cause a PING packet being sent.
  4865. TEST_P(QuicStreamFactoryTest, MigrateSessionWithDrainingStreamSync) {
  4866. TestMigrateSessionWithDrainingStream(SYNCHRONOUS);
  4867. }
  4868. // Regression test for http://crbug.com/847569.
  4869. // This test verifies that the connection migrates to the alternate network
  4870. // early when there is no active stream but a draining stream.
  4871. // The first packet being written after migration is an asynchronous write, no
  4872. // PING packet will be sent.
  4873. TEST_P(QuicStreamFactoryTest, MigrateSessionWithDrainingStreamAsync) {
  4874. TestMigrateSessionWithDrainingStream(ASYNC);
  4875. }
  4876. void QuicStreamFactoryTestBase::TestMigrateSessionWithDrainingStream(
  4877. IoMode write_mode_for_queued_packet) {
  4878. if (!version_.UsesHttp3())
  4879. return;
  4880. InitializeConnectionMigrationV2Test(
  4881. {kDefaultNetworkForTests, kNewNetworkForTests});
  4882. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  4883. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  4884. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  4885. client_maker_.set_save_packet_frames(true);
  4886. // Using a testing task runner so that we can control time.
  4887. auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
  4888. QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
  4889. scoped_mock_network_change_notifier_->mock_network_change_notifier()
  4890. ->QueueNetworkMadeDefault(kDefaultNetworkForTests);
  4891. int packet_number = 1;
  4892. MockQuicData quic_data1(version_);
  4893. quic_data1.AddWrite(SYNCHRONOUS,
  4894. ConstructInitialSettingsPacket(packet_number++));
  4895. quic_data1.AddWrite(
  4896. SYNCHRONOUS,
  4897. ConstructGetRequestPacket(packet_number++,
  4898. GetNthClientInitiatedBidirectionalStreamId(0),
  4899. true, true));
  4900. // Read an out of order packet with FIN to drain the stream.
  4901. quic_data1.AddRead(
  4902. ASYNC, ConstructOkResponsePacket(
  4903. 2, GetNthClientInitiatedBidirectionalStreamId(0), false,
  4904. true)); // keep sending version.
  4905. quic_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  4906. quic_data1.AddSocketDataToFactory(socket_factory_.get());
  4907. // Set up the second socket data provider that is used after migration.
  4908. MockQuicData quic_data2(version_);
  4909. quic::QuicConnectionId cid_on_new_path =
  4910. quic::test::TestConnectionId(12345678);
  4911. client_maker_.set_connection_id(cid_on_new_path);
  4912. // Connectivity probe to be sent on the new path.
  4913. quic_data2.AddWrite(SYNCHRONOUS, client_maker_.MakeConnectivityProbingPacket(
  4914. packet_number++, false));
  4915. quic_data2.AddRead(ASYNC, ERR_IO_PENDING); // Pause
  4916. // Connectivity probe to receive from the server.
  4917. quic_data2.AddRead(ASYNC,
  4918. server_maker_.MakeConnectivityProbingPacket(3, false));
  4919. // Ping packet to send after migration is completed.
  4920. quic_data2.AddWrite(write_mode_for_queued_packet,
  4921. client_maker_.MakeAckAndRetransmissionPacket(
  4922. packet_number++, 2, 3, 3, {1, 2}));
  4923. if (write_mode_for_queued_packet == SYNCHRONOUS) {
  4924. quic_data2.AddWrite(ASYNC,
  4925. client_maker_.MakePingPacket(packet_number++, false));
  4926. }
  4927. quic_data2.AddWrite(SYNCHRONOUS, client_maker_.MakeRetireConnectionIdPacket(
  4928. packet_number++, false, 0u));
  4929. server_maker_.Reset();
  4930. quic_data2.AddRead(
  4931. ASYNC,
  4932. ConstructOkResponsePacket(
  4933. 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
  4934. quic_data2.AddWrite(SYNCHRONOUS,
  4935. client_maker_.MakeAckPacket(packet_number++, 1, 3, 1));
  4936. quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  4937. quic_data2.AddSocketDataToFactory(socket_factory_.get());
  4938. // Create request and QuicHttpStream.
  4939. QuicStreamRequest request(factory_.get());
  4940. EXPECT_EQ(ERR_IO_PENDING,
  4941. request.Request(
  4942. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  4943. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  4944. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  4945. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  4946. failed_on_default_network_callback_, callback_.callback()));
  4947. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  4948. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  4949. EXPECT_TRUE(stream.get());
  4950. // Cause QUIC stream to be created.
  4951. HttpRequestInfo request_info;
  4952. request_info.method = "GET";
  4953. request_info.url = url_;
  4954. request_info.traffic_annotation =
  4955. MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
  4956. stream->RegisterRequest(&request_info);
  4957. EXPECT_EQ(OK, stream->InitializeStream(true, DEFAULT_PRIORITY, net_log_,
  4958. CompletionOnceCallback()));
  4959. // Ensure that session is alive and active.
  4960. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  4961. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  4962. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  4963. MaybeMakeNewConnectionIdAvailableToSession(cid_on_new_path, session);
  4964. // Send GET request on stream.
  4965. HttpResponseInfo response;
  4966. HttpRequestHeaders request_headers;
  4967. EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
  4968. callback_.callback()));
  4969. // Run the message loop to receive the out of order packet which contains a
  4970. // FIN and drains the stream.
  4971. base::RunLoop().RunUntilIdle();
  4972. EXPECT_EQ(0u, session->GetNumActiveStreams());
  4973. EXPECT_EQ(0u, QuicStreamFactoryPeer::GetNumDegradingSessions(factory_.get()));
  4974. // Cause the connection to report path degrading to the session.
  4975. // Session should still start to probe the alternate network.
  4976. session->connection()->OnPathDegradingDetected();
  4977. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  4978. EXPECT_EQ(1u, QuicStreamFactoryPeer::GetNumDegradingSessions(factory_.get()));
  4979. // The connection should still be alive, and not marked as going away.
  4980. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  4981. // Resume quic data and a connectivity probe response will be read on the new
  4982. // socket.
  4983. quic_data2.Resume();
  4984. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  4985. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  4986. EXPECT_EQ(0u, session->GetNumActiveStreams());
  4987. EXPECT_TRUE(session->HasActiveRequestStreams());
  4988. // There should be a task that will complete the migration to the new network.
  4989. task_runner->RunUntilIdle();
  4990. // Deliver a signal that the alternate network now becomes default to session,
  4991. // this will cancel mgirate back to default network timer.
  4992. scoped_mock_network_change_notifier_->mock_network_change_notifier()
  4993. ->NotifyNetworkMadeDefault(kNewNetworkForTests);
  4994. task_runner->FastForwardBy(base::Seconds(kMinRetryTimeForDefaultNetworkSecs));
  4995. // Verify that the session is still alive.
  4996. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  4997. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  4998. EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
  4999. stream.reset();
  5000. EXPECT_TRUE(quic_data1.AllReadDataConsumed());
  5001. EXPECT_TRUE(quic_data1.AllWriteDataConsumed());
  5002. EXPECT_TRUE(quic_data2.AllReadDataConsumed());
  5003. EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
  5004. }
  5005. // Regression test for http://crbug.com/835444.
  5006. // This test verifies that the connection migrates to the alternate network
  5007. // when the alternate network is connected after path has been degrading.
  5008. TEST_P(QuicStreamFactoryTest, MigrateOnNewNetworkConnectAfterPathDegrading) {
  5009. if (!version_.UsesHttp3())
  5010. return;
  5011. InitializeConnectionMigrationV2Test({kDefaultNetworkForTests});
  5012. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  5013. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  5014. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  5015. client_maker_.set_save_packet_frames(true);
  5016. // Using a testing task runner so that we can control time.
  5017. auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
  5018. QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
  5019. scoped_mock_network_change_notifier_->mock_network_change_notifier()
  5020. ->QueueNetworkMadeDefault(kDefaultNetworkForTests);
  5021. MockQuicData quic_data1(version_);
  5022. quic_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging Read.
  5023. int packet_num = 1;
  5024. if (VersionUsesHttp3(version_.transport_version)) {
  5025. quic_data1.AddWrite(SYNCHRONOUS,
  5026. ConstructInitialSettingsPacket(packet_num++));
  5027. }
  5028. quic_data1.AddWrite(
  5029. SYNCHRONOUS,
  5030. ConstructGetRequestPacket(packet_num++,
  5031. GetNthClientInitiatedBidirectionalStreamId(0),
  5032. true, true));
  5033. quic_data1.AddSocketDataToFactory(socket_factory_.get());
  5034. // Set up the second socket data provider that is used after migration.
  5035. // The response to the earlier request is read on the new socket.
  5036. MockQuicData quic_data2(version_);
  5037. quic::QuicConnectionId cid_on_new_path =
  5038. quic::test::TestConnectionId(12345678);
  5039. client_maker_.set_connection_id(cid_on_new_path);
  5040. // Connectivity probe to be sent on the new path.
  5041. quic_data2.AddWrite(SYNCHRONOUS, client_maker_.MakeConnectivityProbingPacket(
  5042. packet_num++, true));
  5043. quic_data2.AddRead(ASYNC, ERR_IO_PENDING); // Pause
  5044. // Connectivity probe to receive from the server.
  5045. quic_data2.AddRead(ASYNC,
  5046. server_maker_.MakeConnectivityProbingPacket(1, false));
  5047. // in-flight SETTINGS and requests will be retransmitted. Since data is
  5048. // already sent on the new address, ping will no longer be sent.
  5049. quic_data2.AddWrite(ASYNC,
  5050. client_maker_.MakeCombinedRetransmissionPacket(
  5051. /*original_packet_numbers=*/{1, 2}, packet_num++,
  5052. /*should_include_version=*/false));
  5053. quic_data2.AddWrite(SYNCHRONOUS, client_maker_.MakeRetireConnectionIdPacket(
  5054. packet_num++, false, 0u));
  5055. quic_data2.AddRead(
  5056. ASYNC,
  5057. ConstructOkResponsePacket(
  5058. 2, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
  5059. quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  5060. quic_data2.AddWrite(SYNCHRONOUS,
  5061. client_maker_.MakeAckAndDataPacket(
  5062. packet_num++, false, GetQpackDecoderStreamId(), 2, 2,
  5063. false, StreamCancellationQpackDecoderInstruction(0)));
  5064. quic_data2.AddWrite(
  5065. SYNCHRONOUS,
  5066. client_maker_.MakeRstPacket(packet_num++, false,
  5067. GetNthClientInitiatedBidirectionalStreamId(0),
  5068. quic::QUIC_STREAM_CANCELLED));
  5069. quic_data2.AddSocketDataToFactory(socket_factory_.get());
  5070. // Create request and QuicHttpStream.
  5071. QuicStreamRequest request(factory_.get());
  5072. EXPECT_EQ(ERR_IO_PENDING,
  5073. request.Request(
  5074. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  5075. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  5076. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  5077. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  5078. failed_on_default_network_callback_, callback_.callback()));
  5079. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  5080. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  5081. EXPECT_TRUE(stream.get());
  5082. // Cause QUIC stream to be created.
  5083. HttpRequestInfo request_info;
  5084. request_info.method = "GET";
  5085. request_info.url = url_;
  5086. request_info.traffic_annotation =
  5087. MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
  5088. stream->RegisterRequest(&request_info);
  5089. EXPECT_EQ(OK, stream->InitializeStream(true, DEFAULT_PRIORITY, net_log_,
  5090. CompletionOnceCallback()));
  5091. // Ensure that session is alive and active.
  5092. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  5093. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  5094. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  5095. MaybeMakeNewConnectionIdAvailableToSession(cid_on_new_path, session);
  5096. // Send GET request on stream.
  5097. HttpResponseInfo response;
  5098. HttpRequestHeaders request_headers;
  5099. EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
  5100. callback_.callback()));
  5101. EXPECT_EQ(0u, QuicStreamFactoryPeer::GetNumDegradingSessions(factory_.get()));
  5102. // Cause the connection to report path degrading to the session.
  5103. // Due to lack of alternate network, session will not mgirate connection.
  5104. EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
  5105. EXPECT_EQ(0u, QuicStreamFactoryPeer::GetNumDegradingSessions(factory_.get()));
  5106. session->connection()->OnPathDegradingDetected();
  5107. EXPECT_EQ(1u, QuicStreamFactoryPeer::GetNumDegradingSessions(factory_.get()));
  5108. EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
  5109. EXPECT_EQ(1u, QuicStreamFactoryPeer::GetNumDegradingSessions(factory_.get()));
  5110. // Deliver a signal that a alternate network is connected now, this should
  5111. // cause the connection to start early migration on path degrading.
  5112. scoped_mock_network_change_notifier_->mock_network_change_notifier()
  5113. ->SetConnectedNetworksList(
  5114. {kDefaultNetworkForTests, kNewNetworkForTests});
  5115. scoped_mock_network_change_notifier_->mock_network_change_notifier()
  5116. ->NotifyNetworkConnected(kNewNetworkForTests);
  5117. // The connection should still be alive, and not marked as going away.
  5118. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  5119. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  5120. EXPECT_EQ(1u, session->GetNumActiveStreams());
  5121. EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
  5122. // Resume quic data and a connectivity probe response will be read on the new
  5123. // socket.
  5124. quic_data2.Resume();
  5125. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  5126. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  5127. EXPECT_EQ(1u, session->GetNumActiveStreams());
  5128. // There should be a task that will complete the migration to the new network.
  5129. task_runner->RunUntilIdle();
  5130. // Although the session successfully migrates, it is still considered
  5131. // degrading sessions.
  5132. EXPECT_EQ(1u, QuicStreamFactoryPeer::GetNumDegradingSessions(factory_.get()));
  5133. // Response headers are received over the new network.
  5134. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  5135. EXPECT_EQ(200, response.headers->response_code());
  5136. // Deliver a signal that the alternate network now becomes default to session,
  5137. // this will cancel mgirate back to default network timer.
  5138. scoped_mock_network_change_notifier_->mock_network_change_notifier()
  5139. ->NotifyNetworkMadeDefault(kNewNetworkForTests);
  5140. // There's one more task to mgirate back to the default network in 0.4s.
  5141. task_runner->FastForwardBy(base::Seconds(kMinRetryTimeForDefaultNetworkSecs));
  5142. // Verify that the session is still alive.
  5143. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  5144. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  5145. stream.reset();
  5146. EXPECT_TRUE(quic_data1.AllReadDataConsumed());
  5147. EXPECT_TRUE(quic_data1.AllWriteDataConsumed());
  5148. EXPECT_TRUE(quic_data2.AllReadDataConsumed());
  5149. EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
  5150. }
  5151. // This test verifies that multiple sessions are migrated on connection
  5152. // migration signal.
  5153. TEST_P(QuicStreamFactoryTest,
  5154. MigrateMultipleSessionsToBadSocketsAfterDisconnected) {
  5155. if (!version_.UsesHttp3())
  5156. return;
  5157. InitializeConnectionMigrationV2Test({kDefaultNetworkForTests});
  5158. MockQuicData socket_data1(version_);
  5159. socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  5160. if (VersionUsesHttp3(version_.transport_version))
  5161. socket_data1.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
  5162. socket_data1.AddWrite(ASYNC, OK);
  5163. socket_data1.AddSocketDataToFactory(socket_factory_.get());
  5164. client_maker_.Reset();
  5165. MockQuicData socket_data2(version_);
  5166. socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  5167. socket_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
  5168. socket_data2.AddWrite(ASYNC, OK);
  5169. socket_data2.AddSocketDataToFactory(socket_factory_.get());
  5170. url::SchemeHostPort server1(url::kHttpsScheme, kDefaultServerHostName, 443);
  5171. url::SchemeHostPort server2(url::kHttpsScheme, kServer2HostName, 443);
  5172. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  5173. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  5174. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  5175. host_resolver_->set_synchronous_mode(true);
  5176. host_resolver_->rules()->AddIPLiteralRule(server1.host(), "192.168.0.1", "");
  5177. host_resolver_->rules()->AddIPLiteralRule(server2.host(), "192.168.0.2", "");
  5178. // Create request and QuicHttpStream to create session1.
  5179. QuicStreamRequest request1(factory_.get());
  5180. EXPECT_EQ(OK,
  5181. request1.Request(
  5182. server1, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
  5183. NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  5184. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  5185. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  5186. failed_on_default_network_callback_, callback_.callback()));
  5187. std::unique_ptr<HttpStream> stream1 = CreateStream(&request1);
  5188. EXPECT_TRUE(stream1.get());
  5189. // Create request and QuicHttpStream to create session2.
  5190. QuicStreamRequest request2(factory_.get());
  5191. EXPECT_EQ(OK,
  5192. request2.Request(
  5193. server2, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
  5194. NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  5195. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  5196. /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_,
  5197. failed_on_default_network_callback_, callback_.callback()));
  5198. std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
  5199. EXPECT_TRUE(stream2.get());
  5200. QuicChromiumClientSession* session1 = GetActiveSession(server1);
  5201. QuicChromiumClientSession* session2 = GetActiveSession(server2);
  5202. EXPECT_NE(session1, session2);
  5203. // Cause QUIC stream to be created and send GET so session1 has an open
  5204. // stream.
  5205. HttpRequestInfo request_info1;
  5206. request_info1.method = "GET";
  5207. request_info1.url = url_;
  5208. request_info1.traffic_annotation =
  5209. MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
  5210. stream1->RegisterRequest(&request_info1);
  5211. EXPECT_EQ(OK, stream1->InitializeStream(true, DEFAULT_PRIORITY, net_log_,
  5212. CompletionOnceCallback()));
  5213. HttpResponseInfo response1;
  5214. HttpRequestHeaders request_headers1;
  5215. EXPECT_EQ(OK, stream1->SendRequest(request_headers1, &response1,
  5216. callback_.callback()));
  5217. // Cause QUIC stream to be created and send GET so session2 has an open
  5218. // stream.
  5219. HttpRequestInfo request_info2;
  5220. request_info2.method = "GET";
  5221. request_info2.url = url_;
  5222. request_info2.traffic_annotation =
  5223. MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
  5224. stream2->RegisterRequest(&request_info2);
  5225. EXPECT_EQ(OK, stream2->InitializeStream(true, DEFAULT_PRIORITY, net_log_,
  5226. CompletionOnceCallback()));
  5227. HttpResponseInfo response2;
  5228. HttpRequestHeaders request_headers2;
  5229. EXPECT_EQ(OK, stream2->SendRequest(request_headers2, &response2,
  5230. callback_.callback()));
  5231. // Cause both sessions to be paused due to DISCONNECTED.
  5232. scoped_mock_network_change_notifier_->mock_network_change_notifier()
  5233. ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
  5234. // Ensure that both sessions are paused but alive.
  5235. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session1));
  5236. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session2));
  5237. // Add new sockets to use post migration. Those are bad sockets and will cause
  5238. // migration to fail.
  5239. MockConnect connect_result =
  5240. MockConnect(SYNCHRONOUS, ERR_INTERNET_DISCONNECTED);
  5241. SequencedSocketData socket_data3(connect_result, base::span<MockRead>(),
  5242. base::span<MockWrite>());
  5243. socket_factory_->AddSocketDataProvider(&socket_data3);
  5244. SequencedSocketData socket_data4(connect_result, base::span<MockRead>(),
  5245. base::span<MockWrite>());
  5246. socket_factory_->AddSocketDataProvider(&socket_data4);
  5247. // Connect the new network and cause migration to bad sockets, causing
  5248. // sessions to close.
  5249. scoped_mock_network_change_notifier_->mock_network_change_notifier()
  5250. ->SetConnectedNetworksList({kNewNetworkForTests});
  5251. scoped_mock_network_change_notifier_->mock_network_change_notifier()
  5252. ->NotifyNetworkConnected(kNewNetworkForTests);
  5253. EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session1));
  5254. EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session2));
  5255. EXPECT_TRUE(socket_data1.AllReadDataConsumed());
  5256. EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
  5257. EXPECT_TRUE(socket_data2.AllReadDataConsumed());
  5258. EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
  5259. }
  5260. // This test verifies that session attempts connection migration with signals
  5261. // delivered in the following order (no alternate network is available):
  5262. // - path degrading is detected: session attempts connection migration but no
  5263. // alternate network is available, session caches path degrading signal in
  5264. // connection and stays on the original network.
  5265. // - original network backs up, request is served in the orignal network,
  5266. // session is not marked as going away.
  5267. TEST_P(QuicStreamFactoryTest, MigrateOnPathDegradingWithNoNewNetwork) {
  5268. if (!version_.UsesHttp3())
  5269. return;
  5270. InitializeConnectionMigrationV2Test({kDefaultNetworkForTests});
  5271. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  5272. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  5273. MockQuicData quic_data(version_);
  5274. int packet_num = 1;
  5275. quic_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket(packet_num++));
  5276. quic_data.AddWrite(
  5277. SYNCHRONOUS,
  5278. ConstructGetRequestPacket(packet_num++,
  5279. GetNthClientInitiatedBidirectionalStreamId(0),
  5280. true, true));
  5281. quic_data.AddRead(ASYNC, ERR_IO_PENDING); // Pause for path degrading signal.
  5282. // The rest of the data will still flow in the original socket as there is no
  5283. // new network after path degrading.
  5284. quic_data.AddRead(ASYNC, ConstructOkResponsePacket(
  5285. 1, GetNthClientInitiatedBidirectionalStreamId(0),
  5286. false, false));
  5287. quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  5288. quic_data.AddWrite(SYNCHRONOUS,
  5289. client_maker_.MakeAckAndDataPacket(
  5290. packet_num++, false, GetQpackDecoderStreamId(), 1, 1,
  5291. false, StreamCancellationQpackDecoderInstruction(0)));
  5292. quic_data.AddWrite(
  5293. SYNCHRONOUS,
  5294. client_maker_.MakeRstPacket(packet_num++, false,
  5295. GetNthClientInitiatedBidirectionalStreamId(0),
  5296. quic::QUIC_STREAM_CANCELLED));
  5297. quic_data.AddSocketDataToFactory(socket_factory_.get());
  5298. // Create request and QuicHttpStream.
  5299. QuicStreamRequest request(factory_.get());
  5300. EXPECT_EQ(ERR_IO_PENDING,
  5301. request.Request(
  5302. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  5303. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  5304. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  5305. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  5306. failed_on_default_network_callback_, callback_.callback()));
  5307. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  5308. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  5309. EXPECT_TRUE(stream.get());
  5310. // Cause QUIC stream to be created.
  5311. HttpRequestInfo request_info;
  5312. request_info.method = "GET";
  5313. request_info.url = url_;
  5314. request_info.traffic_annotation =
  5315. MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
  5316. stream->RegisterRequest(&request_info);
  5317. EXPECT_EQ(OK, stream->InitializeStream(true, DEFAULT_PRIORITY, net_log_,
  5318. CompletionOnceCallback()));
  5319. // Ensure that session is alive and active.
  5320. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  5321. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  5322. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  5323. // Send GET request on stream.
  5324. HttpResponseInfo response;
  5325. HttpRequestHeaders request_headers;
  5326. EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
  5327. callback_.callback()));
  5328. // Trigger connection migration on path degrading. Since there are no networks
  5329. // to migrate to, the session will remain on the original network, not marked
  5330. // as going away.
  5331. EXPECT_EQ(0u, QuicStreamFactoryPeer::GetNumDegradingSessions(factory_.get()));
  5332. session->connection()->OnPathDegradingDetected();
  5333. EXPECT_TRUE(session->connection()->IsPathDegrading());
  5334. EXPECT_EQ(1u, QuicStreamFactoryPeer::GetNumDegradingSessions(factory_.get()));
  5335. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  5336. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  5337. EXPECT_EQ(1u, session->GetNumActiveStreams());
  5338. EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
  5339. // Resume so that rest of the data will flow in the original socket.
  5340. quic_data.Resume();
  5341. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  5342. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  5343. EXPECT_EQ(1u, session->GetNumActiveStreams());
  5344. stream.reset();
  5345. EXPECT_TRUE(quic_data.AllReadDataConsumed());
  5346. EXPECT_TRUE(quic_data.AllWriteDataConsumed());
  5347. }
  5348. // This test verifies that session with non-migratable stream will probe the
  5349. // alternate network on path degrading, and close the non-migratable streams
  5350. // when probe is successful.
  5351. TEST_P(QuicStreamFactoryTest,
  5352. MigrateSessionEarlyNonMigratableStream_DoNotMigrateIdleSessions) {
  5353. TestMigrateSessionEarlyNonMigratableStream(false);
  5354. }
  5355. TEST_P(QuicStreamFactoryTest,
  5356. MigrateSessionEarlyNonMigratableStream_MigrateIdleSessions) {
  5357. TestMigrateSessionEarlyNonMigratableStream(true);
  5358. }
  5359. void QuicStreamFactoryTestBase::TestMigrateSessionEarlyNonMigratableStream(
  5360. bool migrate_idle_sessions) {
  5361. if (!version_.UsesHttp3())
  5362. return;
  5363. quic_params_->migrate_idle_sessions = migrate_idle_sessions;
  5364. InitializeConnectionMigrationV2Test(
  5365. {kDefaultNetworkForTests, kNewNetworkForTests});
  5366. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  5367. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  5368. client_maker_.set_save_packet_frames(true);
  5369. MockQuicData socket_data(version_);
  5370. socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  5371. int packet_num = 1;
  5372. if (VersionUsesHttp3(version_.transport_version)) {
  5373. socket_data.AddWrite(SYNCHRONOUS,
  5374. ConstructInitialSettingsPacket(packet_num++));
  5375. }
  5376. // Set up the second socket data provider that is used for probing.
  5377. MockQuicData quic_data1(version_);
  5378. quic::QuicConnectionId cid_on_old_path =
  5379. quic::QuicUtils::CreateRandomConnectionId(context_.random_generator());
  5380. quic::QuicConnectionId cid_on_new_path =
  5381. quic::test::TestConnectionId(12345678);
  5382. if (VersionUsesHttp3(version_.transport_version)) {
  5383. client_maker_.set_connection_id(cid_on_new_path);
  5384. }
  5385. // Connectivity probe to be sent on the new path.
  5386. quic_data1.AddWrite(SYNCHRONOUS, client_maker_.MakeConnectivityProbingPacket(
  5387. packet_num++, true));
  5388. quic_data1.AddRead(ASYNC, ERR_IO_PENDING); // Pause
  5389. // Connectivity probe to receive from the server.
  5390. quic_data1.AddRead(ASYNC,
  5391. server_maker_.MakeConnectivityProbingPacket(1, false));
  5392. if (migrate_idle_sessions) {
  5393. quic_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
  5394. // A RESET will be sent to the peer to cancel the non-migratable stream.
  5395. quic_data1.AddWrite(
  5396. SYNCHRONOUS,
  5397. client_maker_.MakeDataAndRstPacket(
  5398. packet_num++, /*include_version=*/true, GetQpackDecoderStreamId(),
  5399. StreamCancellationQpackDecoderInstruction(0),
  5400. GetNthClientInitiatedBidirectionalStreamId(0),
  5401. quic::QUIC_STREAM_CANCELLED));
  5402. quic_data1.AddWrite(SYNCHRONOUS, client_maker_.MakeRetransmissionPacket(
  5403. 1, packet_num++, false));
  5404. // Ping packet to send after migration is completed.
  5405. quic_data1.AddWrite(SYNCHRONOUS,
  5406. client_maker_.MakePingPacket(packet_num++, false));
  5407. quic_data1.AddWrite(SYNCHRONOUS, client_maker_.MakeRetireConnectionIdPacket(
  5408. packet_num++, false, 0u));
  5409. } else {
  5410. client_maker_.set_connection_id(cid_on_old_path);
  5411. socket_data.AddWrite(
  5412. SYNCHRONOUS, client_maker_.MakeDataRstAckAndConnectionClosePacket(
  5413. packet_num++, false, GetQpackDecoderStreamId(),
  5414. StreamCancellationQpackDecoderInstruction(0),
  5415. GetNthClientInitiatedBidirectionalStreamId(0),
  5416. quic::QUIC_STREAM_CANCELLED, 1, 1,
  5417. quic::QUIC_CONNECTION_MIGRATION_NO_MIGRATABLE_STREAMS,
  5418. "net error", 0x1b));
  5419. }
  5420. socket_data.AddSocketDataToFactory(socket_factory_.get());
  5421. quic_data1.AddSocketDataToFactory(socket_factory_.get());
  5422. // Create request and QuicHttpStream.
  5423. QuicStreamRequest request(factory_.get());
  5424. EXPECT_EQ(ERR_IO_PENDING,
  5425. request.Request(
  5426. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  5427. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  5428. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  5429. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  5430. failed_on_default_network_callback_, callback_.callback()));
  5431. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  5432. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  5433. EXPECT_TRUE(stream.get());
  5434. // Cause QUIC stream to be created, but marked as non-migratable.
  5435. HttpRequestInfo request_info;
  5436. request_info.load_flags |= LOAD_DISABLE_CONNECTION_MIGRATION_TO_CELLULAR;
  5437. request_info.traffic_annotation =
  5438. MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
  5439. stream->RegisterRequest(&request_info);
  5440. EXPECT_EQ(OK, stream->InitializeStream(false, DEFAULT_PRIORITY, net_log_,
  5441. CompletionOnceCallback()));
  5442. // Ensure that session is alive and active.
  5443. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  5444. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  5445. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  5446. MaybeMakeNewConnectionIdAvailableToSession(cid_on_new_path, session);
  5447. // Trigger connection migration. Since there is a non-migratable stream,
  5448. // this should cause session to migrate.
  5449. session->OnPathDegrading();
  5450. // Run the message loop so that data queued in the new socket is read by the
  5451. // packet reader.
  5452. base::RunLoop().RunUntilIdle();
  5453. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  5454. EXPECT_EQ(1u, session->GetNumActiveStreams());
  5455. // Resume the data to read the connectivity probing response to declare probe
  5456. // as successful. Non-migratable streams will be closed.
  5457. quic_data1.Resume();
  5458. if (migrate_idle_sessions)
  5459. base::RunLoop().RunUntilIdle();
  5460. EXPECT_EQ(migrate_idle_sessions, HasActiveSession(scheme_host_port_));
  5461. EXPECT_EQ(0u, session->GetNumActiveStreams());
  5462. EXPECT_TRUE(quic_data1.AllReadDataConsumed());
  5463. EXPECT_TRUE(quic_data1.AllWriteDataConsumed());
  5464. EXPECT_TRUE(socket_data.AllReadDataConsumed());
  5465. EXPECT_TRUE(socket_data.AllWriteDataConsumed());
  5466. }
  5467. TEST_P(QuicStreamFactoryTest, MigrateSessionEarlyConnectionMigrationDisabled) {
  5468. InitializeConnectionMigrationV2Test(
  5469. {kDefaultNetworkForTests, kNewNetworkForTests});
  5470. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  5471. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  5472. MockQuicData socket_data(version_);
  5473. socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  5474. int packet_num = 1;
  5475. if (VersionUsesHttp3(version_.transport_version)) {
  5476. socket_data.AddWrite(SYNCHRONOUS,
  5477. ConstructInitialSettingsPacket(packet_num++));
  5478. }
  5479. if (VersionUsesHttp3(version_.transport_version)) {
  5480. socket_data.AddWrite(
  5481. SYNCHRONOUS, client_maker_.MakeDataPacket(
  5482. packet_num++, GetQpackDecoderStreamId(), true, false,
  5483. StreamCancellationQpackDecoderInstruction(0)));
  5484. }
  5485. socket_data.AddWrite(
  5486. SYNCHRONOUS,
  5487. client_maker_.MakeRstPacket(packet_num++, true,
  5488. GetNthClientInitiatedBidirectionalStreamId(0),
  5489. quic::QUIC_STREAM_CANCELLED));
  5490. socket_data.AddSocketDataToFactory(socket_factory_.get());
  5491. // Create request and QuicHttpStream.
  5492. QuicStreamRequest request(factory_.get());
  5493. EXPECT_EQ(ERR_IO_PENDING,
  5494. request.Request(
  5495. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  5496. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  5497. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  5498. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  5499. failed_on_default_network_callback_, callback_.callback()));
  5500. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  5501. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  5502. EXPECT_TRUE(stream.get());
  5503. // Cause QUIC stream to be created.
  5504. HttpRequestInfo request_info;
  5505. request_info.traffic_annotation =
  5506. MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
  5507. stream->RegisterRequest(&request_info);
  5508. EXPECT_EQ(OK, stream->InitializeStream(false, DEFAULT_PRIORITY, net_log_,
  5509. CompletionOnceCallback()));
  5510. // Ensure that session is alive and active.
  5511. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  5512. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  5513. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  5514. // Set session config to have connection migration disabled.
  5515. quic::test::QuicConfigPeer::SetReceivedDisableConnectionMigration(
  5516. session->config());
  5517. EXPECT_TRUE(session->config()->DisableConnectionMigration());
  5518. // Trigger connection migration. Since there is a non-migratable stream,
  5519. // this should cause session to be continue without migrating.
  5520. session->OnPathDegrading();
  5521. // Run the message loop so that data queued in the new socket is read by the
  5522. // packet reader.
  5523. base::RunLoop().RunUntilIdle();
  5524. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  5525. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  5526. EXPECT_EQ(1u, session->GetNumActiveStreams());
  5527. stream.reset();
  5528. EXPECT_TRUE(socket_data.AllReadDataConsumed());
  5529. EXPECT_TRUE(socket_data.AllWriteDataConsumed());
  5530. }
  5531. // Regression test for http://crbug.com/791886.
  5532. // This test verifies that the old packet writer which encountered an
  5533. // asynchronous write error will be blocked during migration on write error. New
  5534. // packets would not be written until the one with write error is rewritten on
  5535. // the new network.
  5536. TEST_P(QuicStreamFactoryTest, MigrateSessionOnAsyncWriteError) {
  5537. if (!version_.UsesHttp3())
  5538. return;
  5539. InitializeConnectionMigrationV2Test(
  5540. {kDefaultNetworkForTests, kNewNetworkForTests});
  5541. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  5542. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  5543. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  5544. client_maker_.set_save_packet_frames(true);
  5545. // Using a testing task runner so that we can control time.
  5546. // base::RunLoop() controls mocked socket writes and reads.
  5547. auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
  5548. QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
  5549. MockQuicData socket_data(version_);
  5550. socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  5551. int packet_num = 1;
  5552. socket_data.AddWrite(SYNCHRONOUS,
  5553. ConstructInitialSettingsPacket(packet_num++));
  5554. socket_data.AddWrite(ASYNC, ERR_ADDRESS_UNREACHABLE);
  5555. socket_data.AddSocketDataToFactory(socket_factory_.get());
  5556. // Set up second socket data provider that is used after
  5557. // migration. The request is rewritten to this new socket, and the
  5558. // response to the request is read on this new socket.
  5559. MockQuicData socket_data1(version_);
  5560. quic::QuicConnectionId cid_on_new_path =
  5561. quic::test::TestConnectionId(12345678);
  5562. client_maker_.set_connection_id(cid_on_new_path);
  5563. ConstructGetRequestPacket(
  5564. packet_num++, GetNthClientInitiatedBidirectionalStreamId(0), true, true);
  5565. spdy::Http2HeaderBlock headers =
  5566. client_maker_.GetRequestHeaders("GET", "https", "/");
  5567. spdy::SpdyPriority priority =
  5568. ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
  5569. size_t spdy_headers_frame_len;
  5570. socket_data1.AddWrite(
  5571. SYNCHRONOUS,
  5572. client_maker_.MakeRetransmissionAndRequestHeadersPacket(
  5573. {1, 2}, packet_num++, GetNthClientInitiatedBidirectionalStreamId(1),
  5574. true, true, priority, std::move(headers),
  5575. GetNthClientInitiatedBidirectionalStreamId(0),
  5576. &spdy_headers_frame_len));
  5577. socket_data1.AddWrite(
  5578. SYNCHRONOUS,
  5579. client_maker_.MakePingPacket(packet_num++, /*include_version=*/false));
  5580. socket_data1.AddWrite(SYNCHRONOUS,
  5581. client_maker_.MakeRetireConnectionIdPacket(
  5582. packet_num++, /*include_version=*/false,
  5583. /*sequence_number=*/0u));
  5584. socket_data1.AddRead(
  5585. ASYNC,
  5586. ConstructOkResponsePacket(
  5587. 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
  5588. socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  5589. socket_data1.AddWrite(
  5590. SYNCHRONOUS,
  5591. client_maker_.MakeDataPacket(
  5592. packet_num++, GetQpackDecoderStreamId(),
  5593. /*should_include_version=*/false,
  5594. /*fin=*/false, StreamCancellationQpackDecoderInstruction(0)));
  5595. socket_data1.AddWrite(
  5596. SYNCHRONOUS,
  5597. client_maker_.MakeRstPacket(packet_num++, false,
  5598. GetNthClientInitiatedBidirectionalStreamId(0),
  5599. quic::QUIC_STREAM_CANCELLED));
  5600. socket_data1.AddWrite(
  5601. SYNCHRONOUS, client_maker_.MakeDataPacket(
  5602. packet_num++, GetQpackDecoderStreamId(),
  5603. /* should_include_version = */ true,
  5604. /* fin = */ false,
  5605. StreamCancellationQpackDecoderInstruction(1, false)));
  5606. socket_data1.AddWrite(
  5607. SYNCHRONOUS,
  5608. client_maker_.MakeRstPacket(packet_num++, false,
  5609. GetNthClientInitiatedBidirectionalStreamId(1),
  5610. quic::QUIC_STREAM_CANCELLED,
  5611. /*include_stop_sending_if_v99=*/true));
  5612. socket_data1.AddSocketDataToFactory(socket_factory_.get());
  5613. // Create request #1 and QuicHttpStream.
  5614. QuicStreamRequest request1(factory_.get());
  5615. EXPECT_EQ(ERR_IO_PENDING,
  5616. request1.Request(
  5617. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  5618. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  5619. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  5620. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  5621. failed_on_default_network_callback_, callback_.callback()));
  5622. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  5623. std::unique_ptr<HttpStream> stream1 = CreateStream(&request1);
  5624. EXPECT_TRUE(stream1.get());
  5625. HttpRequestInfo request_info1;
  5626. request_info1.method = "GET";
  5627. request_info1.url = GURL("https://www.example.org/");
  5628. request_info1.traffic_annotation =
  5629. MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
  5630. stream1->RegisterRequest(&request_info1);
  5631. EXPECT_EQ(OK, stream1->InitializeStream(true, DEFAULT_PRIORITY, net_log_,
  5632. CompletionOnceCallback()));
  5633. // Request #2 returns synchronously because it pools to existing session.
  5634. TestCompletionCallback callback2;
  5635. QuicStreamRequest request2(factory_.get());
  5636. EXPECT_EQ(OK,
  5637. request2.Request(
  5638. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  5639. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  5640. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  5641. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  5642. failed_on_default_network_callback_, callback2.callback()));
  5643. std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
  5644. EXPECT_TRUE(stream2.get());
  5645. HttpRequestInfo request_info2;
  5646. request_info2.method = "GET";
  5647. request_info2.url = GURL("https://www.example.org/");
  5648. request_info2.traffic_annotation =
  5649. MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
  5650. stream2->RegisterRequest(&request_info2);
  5651. EXPECT_EQ(OK, stream2->InitializeStream(true, DEFAULT_PRIORITY, net_log_,
  5652. CompletionOnceCallback()));
  5653. // Ensure that session is alive and active.
  5654. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  5655. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  5656. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  5657. EXPECT_EQ(2u, session->GetNumActiveStreams());
  5658. MaybeMakeNewConnectionIdAvailableToSession(cid_on_new_path, session);
  5659. // Send GET request on stream1. This should cause an async write error.
  5660. HttpResponseInfo response;
  5661. HttpRequestHeaders request_headers;
  5662. EXPECT_EQ(OK, stream1->SendRequest(request_headers, &response,
  5663. callback_.callback()));
  5664. EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
  5665. // Run the message loop so that asynchronous write completes and a connection
  5666. // migration on write error attempt is posted in QuicStreamFactory's task
  5667. // runner.
  5668. base::RunLoop().RunUntilIdle();
  5669. EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
  5670. // Send GET request on stream. This will cause another write attempt before
  5671. // migration on write error is exectued.
  5672. HttpResponseInfo response2;
  5673. HttpRequestHeaders request_headers2;
  5674. EXPECT_EQ(OK, stream2->SendRequest(request_headers2, &response2,
  5675. callback2.callback()));
  5676. // Run the task runner so that migration on write error is finally executed.
  5677. task_runner->RunUntilIdle();
  5678. // Fire the retire connection ID alarm.
  5679. base::RunLoop().RunUntilIdle();
  5680. // Verify the session is still alive and not marked as going away.
  5681. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  5682. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  5683. EXPECT_EQ(2u, session->GetNumActiveStreams());
  5684. // There should be one task posted to migrate back to the default network in
  5685. // kMinRetryTimeForDefaultNetworkSecs.
  5686. EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
  5687. EXPECT_EQ(base::Seconds(kMinRetryTimeForDefaultNetworkSecs),
  5688. task_runner->NextPendingTaskDelay());
  5689. // Verify that response headers on the migrated socket were delivered to the
  5690. // stream.
  5691. EXPECT_EQ(OK, stream1->ReadResponseHeaders(callback_.callback()));
  5692. EXPECT_EQ(200, response.headers->response_code());
  5693. stream1.reset();
  5694. stream2.reset();
  5695. EXPECT_TRUE(socket_data.AllReadDataConsumed());
  5696. EXPECT_TRUE(socket_data.AllWriteDataConsumed());
  5697. EXPECT_TRUE(socket_data1.AllReadDataConsumed());
  5698. EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
  5699. }
  5700. // Verify session is not marked as going away after connection migration on
  5701. // write error and migrate back to default network logic is applied to bring the
  5702. // migrated session back to the default network. Migration singals delivered
  5703. // in the following order (alternate network is always availabe):
  5704. // - session on the default network encountered a write error;
  5705. // - session successfully migrated to the non-default network;
  5706. // - session attempts to migrate back to default network post migration;
  5707. // - migration back to the default network is successful.
  5708. TEST_P(QuicStreamFactoryTest, MigrateBackToDefaultPostMigrationOnWriteError) {
  5709. if (!version_.UsesHttp3())
  5710. return;
  5711. InitializeConnectionMigrationV2Test(
  5712. {kDefaultNetworkForTests, kNewNetworkForTests});
  5713. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  5714. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  5715. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  5716. client_maker_.set_save_packet_frames(true);
  5717. // Using a testing task runner so that we can control time.
  5718. auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
  5719. QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
  5720. MockQuicData socket_data(version_);
  5721. socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  5722. int packet_num = 1;
  5723. int peer_packet_num = 1;
  5724. socket_data.AddWrite(SYNCHRONOUS,
  5725. ConstructInitialSettingsPacket(packet_num++));
  5726. socket_data.AddWrite(ASYNC, ERR_ADDRESS_UNREACHABLE);
  5727. socket_data.AddSocketDataToFactory(socket_factory_.get());
  5728. // Set up second socket data provider that is used after
  5729. // migration. The request is rewritten to this new socket, and the
  5730. // response to the request is read on this new socket.
  5731. MockQuicData quic_data2(version_);
  5732. quic::QuicConnectionId cid1 = quic::test::TestConnectionId(12345678);
  5733. quic::QuicConnectionId cid2 = quic::test::TestConnectionId(87654321);
  5734. client_maker_.set_connection_id(cid1);
  5735. // Increment packet number to account for packet write error on the old
  5736. // path. Also save the packet in client_maker_ for constructing the
  5737. // retransmission packet.
  5738. ConstructGetRequestPacket(packet_num++,
  5739. GetNthClientInitiatedBidirectionalStreamId(0),
  5740. /*should_include_version=*/false,
  5741. /*fin=*/true);
  5742. quic_data2.AddWrite(SYNCHRONOUS,
  5743. client_maker_.MakeCombinedRetransmissionPacket(
  5744. /*original_packet_numbers=*/{1, 2}, packet_num++,
  5745. /*should_include_version=*/false));
  5746. quic_data2.AddWrite(
  5747. SYNCHRONOUS,
  5748. client_maker_.MakePingPacket(packet_num++, /*include_version=*/false));
  5749. quic_data2.AddWrite(SYNCHRONOUS, client_maker_.MakeRetireConnectionIdPacket(
  5750. packet_num++, /*include_version=*/false,
  5751. /*sequence_number=*/0u));
  5752. quic_data2.AddRead(ASYNC, server_maker_.MakeAckAndNewConnectionIdPacket(
  5753. peer_packet_num++, false, packet_num - 1, 1u,
  5754. cid2, /*sequence_number=*/2u,
  5755. /*retire_prior_to=*/1u));
  5756. quic_data2.AddRead(
  5757. ASYNC, ConstructOkResponsePacket(
  5758. peer_packet_num++,
  5759. GetNthClientInitiatedBidirectionalStreamId(0), false, false));
  5760. quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  5761. quic_data2.AddSocketDataToFactory(socket_factory_.get());
  5762. // Create request QuicHttpStream.
  5763. QuicStreamRequest request1(factory_.get());
  5764. EXPECT_EQ(ERR_IO_PENDING,
  5765. request1.Request(
  5766. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  5767. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  5768. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  5769. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  5770. failed_on_default_network_callback_, callback_.callback()));
  5771. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  5772. std::unique_ptr<HttpStream> stream1 = CreateStream(&request1);
  5773. EXPECT_TRUE(stream1.get());
  5774. HttpRequestInfo request_info1;
  5775. request_info1.method = "GET";
  5776. request_info1.url = GURL("https://www.example.org/");
  5777. request_info1.traffic_annotation =
  5778. MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
  5779. stream1->RegisterRequest(&request_info1);
  5780. EXPECT_EQ(OK, stream1->InitializeStream(true, DEFAULT_PRIORITY, net_log_,
  5781. CompletionOnceCallback()));
  5782. // Ensure that session is alive and active.
  5783. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  5784. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  5785. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  5786. EXPECT_EQ(1u, session->GetNumActiveStreams());
  5787. MaybeMakeNewConnectionIdAvailableToSession(cid1, session);
  5788. // Send GET request. This should cause an async write error.
  5789. HttpResponseInfo response;
  5790. HttpRequestHeaders request_headers;
  5791. EXPECT_EQ(OK, stream1->SendRequest(request_headers, &response,
  5792. callback_.callback()));
  5793. EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
  5794. // Run the message loop so that asynchronous write completes and a connection
  5795. // migration on write error attempt is posted in QuicStreamFactory's task
  5796. // runner.
  5797. base::RunLoop().RunUntilIdle();
  5798. EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
  5799. // Run the task runner so that migration on write error is finally executed.
  5800. task_runner->RunUntilIdle();
  5801. // Make sure the alarm that retires connection ID on the old path is fired.
  5802. base::RunLoop().RunUntilIdle();
  5803. // Verify the session is still alive and not marked as going away.
  5804. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  5805. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  5806. EXPECT_EQ(1u, session->GetNumActiveStreams());
  5807. // There should be one task posted to migrate back to the default network in
  5808. // kMinRetryTimeForDefaultNetworkSecs.
  5809. EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
  5810. base::TimeDelta expected_delay =
  5811. base::Seconds(kMinRetryTimeForDefaultNetworkSecs);
  5812. EXPECT_EQ(expected_delay, task_runner->NextPendingTaskDelay());
  5813. // Verify that response headers on the migrated socket were delivered to the
  5814. // stream.
  5815. EXPECT_EQ(OK, stream1->ReadResponseHeaders(callback_.callback()));
  5816. EXPECT_EQ(200, response.headers->response_code());
  5817. // Set up the third socket data provider for migrate back to default network.
  5818. MockQuicData quic_data3(version_);
  5819. client_maker_.set_connection_id(cid2);
  5820. // Connectivity probe to be sent on the new path.
  5821. quic_data3.AddWrite(SYNCHRONOUS, client_maker_.MakeConnectivityProbingPacket(
  5822. packet_num++, false));
  5823. // Connectivity probe to receive from the server.
  5824. quic_data3.AddRead(ASYNC, server_maker_.MakeConnectivityProbingPacket(
  5825. peer_packet_num++, /*include_version=*/false));
  5826. quic_data3.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  5827. // There is no other data to retransmit as they have been acknowledged by
  5828. // the packet containing NEW_CONNECTION_ID frame from the server.
  5829. quic_data3.AddWrite(ASYNC, client_maker_.MakeAckPacket(
  5830. packet_num++,
  5831. /*first_received=*/1,
  5832. /*largest_received=*/peer_packet_num - 1,
  5833. /*smallest_received=*/1));
  5834. quic_data3.AddWrite(SYNCHRONOUS,
  5835. client_maker_.MakeDataPacket(
  5836. packet_num++, GetQpackDecoderStreamId(), true, false,
  5837. StreamCancellationQpackDecoderInstruction(0)));
  5838. quic_data3.AddWrite(
  5839. SYNCHRONOUS,
  5840. client_maker_.MakeRstPacket(packet_num++, false,
  5841. GetNthClientInitiatedBidirectionalStreamId(0),
  5842. quic::QUIC_STREAM_CANCELLED,
  5843. /*include_stop_sending_if_v99=*/true));
  5844. quic_data3.AddSocketDataToFactory(socket_factory_.get());
  5845. // Fast forward to fire the migrate back timer and verify the session
  5846. // successfully migrates back to the default network.
  5847. task_runner->FastForwardBy(expected_delay);
  5848. // Verify the session is still alive and not marked as going away.
  5849. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  5850. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  5851. EXPECT_EQ(1u, session->GetNumActiveStreams());
  5852. // There should be one task posted to one will resend a connectivity probe and
  5853. // the other will retry migrate back, both are cancelled.
  5854. task_runner->FastForwardUntilNoTasksRemain();
  5855. // Verify the session is still alive and not marked as going away.
  5856. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  5857. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  5858. EXPECT_EQ(1u, session->GetNumActiveStreams());
  5859. stream1.reset();
  5860. EXPECT_TRUE(socket_data.AllReadDataConsumed());
  5861. EXPECT_TRUE(socket_data.AllWriteDataConsumed());
  5862. EXPECT_TRUE(quic_data2.AllReadDataConsumed());
  5863. EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
  5864. EXPECT_TRUE(quic_data3.AllReadDataConsumed());
  5865. EXPECT_TRUE(quic_data3.AllWriteDataConsumed());
  5866. }
  5867. // This test verifies that the connection will not attempt connection migration
  5868. // (send connectivity probes on alternate path) when path degrading is detected
  5869. // and handshake is not confirmed.
  5870. // TODO(crbug.com/1347664): This test is failing on various platforms.
  5871. TEST_P(QuicStreamFactoryTest,
  5872. DISABLED_NoMigrationOnPathDegradingBeforeHandshakeConfirmed) {
  5873. InitializeConnectionMigrationV2Test(
  5874. {kDefaultNetworkForTests, kNewNetworkForTests});
  5875. // Using a testing task runner.
  5876. auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
  5877. QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
  5878. // Use cold start mode to send crypto message for handshake.
  5879. crypto_client_stream_factory_.set_handshake_mode(
  5880. MockCryptoClientStream::COLD_START_WITH_CHLO_SENT);
  5881. MockQuicData socket_data(version_);
  5882. socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  5883. socket_data.AddWrite(ASYNC, client_maker_.MakeDummyCHLOPacket(1));
  5884. socket_data.AddSocketDataToFactory(socket_factory_.get());
  5885. // Create request and QuicHttpStream.
  5886. QuicStreamRequest request(factory_.get());
  5887. EXPECT_EQ(ERR_IO_PENDING,
  5888. request.Request(
  5889. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  5890. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  5891. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  5892. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  5893. failed_on_default_network_callback_, callback_.callback()));
  5894. base::RunLoop().RunUntilIdle();
  5895. // Ensure that session is alive but not active.
  5896. EXPECT_FALSE(HasActiveSession(scheme_host_port_));
  5897. EXPECT_TRUE(HasActiveJob(scheme_host_port_, privacy_mode_));
  5898. QuicChromiumClientSession* session = GetPendingSession(scheme_host_port_);
  5899. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  5900. EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
  5901. // Cause the connection to report path degrading to the session.
  5902. // Session will ignore the signal as handshake is not completed.
  5903. EXPECT_EQ(0u, QuicStreamFactoryPeer::GetNumDegradingSessions(factory_.get()));
  5904. session->connection()->OnPathDegradingDetected();
  5905. EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
  5906. EXPECT_EQ(1u, QuicStreamFactoryPeer::GetNumDegradingSessions(factory_.get()));
  5907. EXPECT_FALSE(HasActiveSession(scheme_host_port_));
  5908. EXPECT_TRUE(HasActiveJob(scheme_host_port_, privacy_mode_));
  5909. EXPECT_TRUE(socket_data.AllReadDataConsumed());
  5910. EXPECT_TRUE(socket_data.AllWriteDataConsumed());
  5911. }
  5912. // This test verifies that if a connection is closed with
  5913. // QUIC_NETWORK_IDLE_TIMEOUT before handshake is completed and there is no
  5914. // alternate network, no new connection will be created.
  5915. // TODO(crbug.com/1347664): This test is failing on various platforms.
  5916. TEST_P(QuicStreamFactoryTest,
  5917. DISABLED_NoAlternateNetworkBeforeHandshakeOnIdleTimeout) {
  5918. TestNoAlternateNetworkBeforeHandshake(quic::QUIC_NETWORK_IDLE_TIMEOUT);
  5919. }
  5920. // This test verifies that if a connection is closed with QUIC_HANDSHAKE_TIMEOUT
  5921. // and there is no alternate network, no new connection will be created.
  5922. // TODO(crbug.com/1347664): This test is failing on various platforms.
  5923. TEST_P(QuicStreamFactoryTest, DISABLED_NoAlternateNetworkOnHandshakeTimeout) {
  5924. TestNoAlternateNetworkBeforeHandshake(quic::QUIC_HANDSHAKE_TIMEOUT);
  5925. }
  5926. void QuicStreamFactoryTestBase::TestNoAlternateNetworkBeforeHandshake(
  5927. quic::QuicErrorCode quic_error) {
  5928. DCHECK(quic_error == quic::QUIC_NETWORK_IDLE_TIMEOUT ||
  5929. quic_error == quic::QUIC_HANDSHAKE_TIMEOUT);
  5930. InitializeConnectionMigrationV2Test({kDefaultNetworkForTests});
  5931. // Using a testing task runner.
  5932. auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
  5933. QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
  5934. // Use cold start mode to send crypto message for handshake.
  5935. crypto_client_stream_factory_.set_handshake_mode(
  5936. MockCryptoClientStream::COLD_START_WITH_CHLO_SENT);
  5937. MockQuicData socket_data(version_);
  5938. socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  5939. socket_data.AddWrite(ASYNC, client_maker_.MakeDummyCHLOPacket(1));
  5940. socket_data.AddSocketDataToFactory(socket_factory_.get());
  5941. // Create request.
  5942. QuicStreamRequest request(factory_.get());
  5943. EXPECT_EQ(ERR_IO_PENDING,
  5944. request.Request(
  5945. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  5946. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  5947. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  5948. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  5949. failed_on_default_network_callback_, callback_.callback()));
  5950. base::RunLoop().RunUntilIdle();
  5951. // Ensure that session is alive but not active.
  5952. EXPECT_FALSE(HasActiveSession(scheme_host_port_));
  5953. EXPECT_TRUE(HasActiveJob(scheme_host_port_, privacy_mode_));
  5954. QuicChromiumClientSession* session = GetPendingSession(scheme_host_port_);
  5955. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  5956. EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
  5957. EXPECT_EQ(0u, QuicStreamFactoryPeer::GetNumDegradingSessions(factory_.get()));
  5958. // Cause the connection to report path degrading to the session.
  5959. // Session will ignore the signal as handshake is not completed.
  5960. session->connection()->OnPathDegradingDetected();
  5961. EXPECT_EQ(1u, QuicStreamFactoryPeer::GetNumDegradingSessions(factory_.get()));
  5962. EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
  5963. EXPECT_FALSE(HasActiveSession(scheme_host_port_));
  5964. EXPECT_TRUE(HasActiveJob(scheme_host_port_, privacy_mode_));
  5965. // Cause the connection to close due to |quic_error| before handshake.
  5966. std::string error_details;
  5967. if (quic_error == quic::QUIC_NETWORK_IDLE_TIMEOUT) {
  5968. error_details = "No recent network activity.";
  5969. } else {
  5970. error_details = "Handshake timeout expired.";
  5971. }
  5972. session->connection()->CloseConnection(
  5973. quic_error, error_details, quic::ConnectionCloseBehavior::SILENT_CLOSE);
  5974. // A task will be posted to clean up the session in the factory.
  5975. EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
  5976. task_runner->FastForwardUntilNoTasksRemain();
  5977. // No new session should be created as there is no alternate network.
  5978. EXPECT_FALSE(HasActiveSession(scheme_host_port_));
  5979. EXPECT_FALSE(HasActiveJob(scheme_host_port_, privacy_mode_));
  5980. EXPECT_TRUE(socket_data.AllReadDataConsumed());
  5981. EXPECT_TRUE(socket_data.AllWriteDataConsumed());
  5982. }
  5983. // TODO(crbug.com/1347664): This test is failing on various platforms.
  5984. TEST_P(QuicStreamFactoryTest,
  5985. DISABLED_NewConnectionBeforeHandshakeAfterIdleTimeout) {
  5986. TestNewConnectionOnAlternateNetworkBeforeHandshake(
  5987. quic::QUIC_NETWORK_IDLE_TIMEOUT);
  5988. }
  5989. // TODO(crbug.com/1347664): This test is failing on various platforms.
  5990. TEST_P(QuicStreamFactoryTest, DISABLED_NewConnectionAfterHandshakeTimeout) {
  5991. TestNewConnectionOnAlternateNetworkBeforeHandshake(
  5992. quic::QUIC_HANDSHAKE_TIMEOUT);
  5993. }
  5994. // Sets up a test to verify that a new connection will be created on the
  5995. // alternate network after the initial connection fails before handshake with
  5996. // signals delivered in the following order (alternate network is available):
  5997. // - the default network is not able to complete crypto handshake;
  5998. // - the original connection is closed with |quic_error|;
  5999. // - a new connection is created on the alternate network and is able to finish
  6000. // crypto handshake;
  6001. // - the new session on the alternate network attempts to migrate back to the
  6002. // default network by sending probes;
  6003. // - default network being disconnected is delivered: session will stop probing
  6004. // the original network.
  6005. // - alternate network is made by default.
  6006. void QuicStreamFactoryTestBase::
  6007. TestNewConnectionOnAlternateNetworkBeforeHandshake(
  6008. quic::QuicErrorCode quic_error) {
  6009. if (!version_.UsesHttp3())
  6010. return;
  6011. DCHECK(quic_error == quic::QUIC_NETWORK_IDLE_TIMEOUT ||
  6012. quic_error == quic::QUIC_HANDSHAKE_TIMEOUT);
  6013. quic_params_->retry_on_alternate_network_before_handshake = true;
  6014. InitializeConnectionMigrationV2Test(
  6015. {kDefaultNetworkForTests, kNewNetworkForTests});
  6016. // Using a testing task runner.
  6017. auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
  6018. QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
  6019. // Use cold start mode to send crypto message for handshake.
  6020. crypto_client_stream_factory_.set_handshake_mode(
  6021. MockCryptoClientStream::COLD_START_WITH_CHLO_SENT);
  6022. // Socket data for connection on the default network.
  6023. MockQuicData socket_data(version_);
  6024. socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  6025. socket_data.AddWrite(ASYNC, client_maker_.MakeDummyCHLOPacket(1));
  6026. socket_data.AddSocketDataToFactory(socket_factory_.get());
  6027. // Socket data for connection on the alternate network.
  6028. MockQuicData socket_data2(version_);
  6029. int packet_num = 1;
  6030. socket_data2.AddWrite(SYNCHRONOUS,
  6031. client_maker_.MakeDummyCHLOPacket(packet_num++));
  6032. socket_data2.AddRead(ASYNC, ERR_IO_PENDING); // Pause.
  6033. // Change the encryption level after handshake is confirmed.
  6034. client_maker_.SetEncryptionLevel(quic::ENCRYPTION_FORWARD_SECURE);
  6035. socket_data2.AddWrite(ASYNC, ConstructInitialSettingsPacket(packet_num++));
  6036. socket_data2.AddWrite(
  6037. ASYNC, ConstructGetRequestPacket(
  6038. packet_num++, GetNthClientInitiatedBidirectionalStreamId(0),
  6039. true, true));
  6040. socket_data2.AddRead(
  6041. ASYNC,
  6042. ConstructOkResponsePacket(
  6043. 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
  6044. socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  6045. int probing_packet_num = packet_num++;
  6046. socket_data2.AddWrite(SYNCHRONOUS,
  6047. client_maker_.MakeRetireConnectionIdPacket(
  6048. packet_num++, /*include_version=*/false,
  6049. /*sequence_number=*/1u));
  6050. socket_data2.AddWrite(SYNCHRONOUS,
  6051. client_maker_.MakeDataPacket(
  6052. packet_num++, GetQpackDecoderStreamId(),
  6053. /*should_include_version=*/false, /*fin=*/false,
  6054. StreamCancellationQpackDecoderInstruction(0)));
  6055. socket_data2.AddWrite(
  6056. SYNCHRONOUS,
  6057. client_maker_.MakeRstPacket(packet_num++, false,
  6058. GetNthClientInitiatedBidirectionalStreamId(0),
  6059. quic::QUIC_STREAM_CANCELLED));
  6060. socket_data2.AddSocketDataToFactory(socket_factory_.get());
  6061. // Socket data for probing on the default network.
  6062. MockQuicData probing_data(version_);
  6063. quic::QuicConnectionId cid_on_path1 = quic::test::TestConnectionId(1234567);
  6064. client_maker_.set_connection_id(cid_on_path1);
  6065. probing_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
  6066. probing_data.AddWrite(
  6067. SYNCHRONOUS,
  6068. client_maker_.MakeConnectivityProbingPacket(probing_packet_num, false));
  6069. probing_data.AddSocketDataToFactory(socket_factory_.get());
  6070. // Create request and QuicHttpStream.
  6071. QuicStreamRequest request(factory_.get());
  6072. EXPECT_EQ(ERR_IO_PENDING,
  6073. request.Request(
  6074. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  6075. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  6076. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  6077. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  6078. failed_on_default_network_callback_, callback_.callback()));
  6079. base::RunLoop().RunUntilIdle();
  6080. // Ensure that session is alive but not active.
  6081. EXPECT_FALSE(HasActiveSession(scheme_host_port_));
  6082. EXPECT_TRUE(HasActiveJob(scheme_host_port_, privacy_mode_));
  6083. QuicChromiumClientSession* session = GetPendingSession(scheme_host_port_);
  6084. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  6085. EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
  6086. EXPECT_FALSE(failed_on_default_network_);
  6087. std::string error_details;
  6088. if (quic_error == quic::QUIC_NETWORK_IDLE_TIMEOUT) {
  6089. error_details = "No recent network activity.";
  6090. } else {
  6091. error_details = "Handshake timeout expired.";
  6092. }
  6093. session->connection()->CloseConnection(
  6094. quic_error, error_details, quic::ConnectionCloseBehavior::SILENT_CLOSE);
  6095. // A task will be posted to clean up the session in the factory.
  6096. EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
  6097. task_runner->FastForwardUntilNoTasksRemain();
  6098. // Verify a new session is created on the alternate network.
  6099. EXPECT_TRUE(HasActiveJob(scheme_host_port_, privacy_mode_));
  6100. EXPECT_FALSE(HasActiveSession(scheme_host_port_));
  6101. QuicChromiumClientSession* session2 = GetPendingSession(scheme_host_port_);
  6102. EXPECT_NE(session, session2);
  6103. EXPECT_TRUE(failed_on_default_network_);
  6104. // Confirm the handshake on the alternate network.
  6105. crypto_client_stream_factory_.last_stream()
  6106. ->NotifySessionOneRttKeyAvailable();
  6107. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  6108. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  6109. MaybeMakeNewConnectionIdAvailableToSession(cid_on_path1, session2);
  6110. // Resume the data now so that data can be sent and read.
  6111. socket_data2.Resume();
  6112. // Create the stream.
  6113. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  6114. EXPECT_TRUE(stream.get());
  6115. HttpRequestInfo request_info;
  6116. request_info.method = "GET";
  6117. request_info.url = GURL("https://www.example.org/");
  6118. request_info.traffic_annotation =
  6119. MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
  6120. stream->RegisterRequest(&request_info);
  6121. EXPECT_EQ(OK, stream->InitializeStream(true, DEFAULT_PRIORITY, net_log_,
  6122. CompletionOnceCallback()));
  6123. // Send the request.
  6124. HttpResponseInfo response;
  6125. HttpRequestHeaders request_headers;
  6126. EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
  6127. callback_.callback()));
  6128. // Run the message loop to finish asynchronous mock write.
  6129. base::RunLoop().RunUntilIdle();
  6130. // Read the response.
  6131. EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
  6132. EXPECT_EQ(200, response.headers->response_code());
  6133. // There should be a new task posted to migrate back to the default network.
  6134. EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
  6135. base::TimeDelta next_task_delay = task_runner->NextPendingTaskDelay();
  6136. EXPECT_EQ(base::Seconds(kMinRetryTimeForDefaultNetworkSecs), next_task_delay);
  6137. task_runner->FastForwardBy(next_task_delay);
  6138. // Deliver the signal that the default network is disconnected.
  6139. scoped_mock_network_change_notifier_->mock_network_change_notifier()
  6140. ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
  6141. // Verify no connectivity probes will be sent as probing will be cancelled.
  6142. task_runner->FastForwardUntilNoTasksRemain();
  6143. // Deliver the signal that the alternate network is made default.
  6144. scoped_mock_network_change_notifier_->mock_network_change_notifier()
  6145. ->NotifyNetworkMadeDefault(kNewNetworkForTests);
  6146. EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
  6147. stream.reset();
  6148. EXPECT_TRUE(socket_data.AllReadDataConsumed());
  6149. EXPECT_TRUE(socket_data.AllWriteDataConsumed());
  6150. EXPECT_TRUE(socket_data2.AllReadDataConsumed());
  6151. EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
  6152. }
  6153. // Test that connection will be closed with PACKET_WRITE_ERROR if a write error
  6154. // is triggered before handshake is confirmed and connection migration is turned
  6155. // on.
  6156. TEST_P(QuicStreamFactoryTest, MigrationOnWriteErrorBeforeHandshakeConfirmed) {
  6157. DCHECK(!quic_params_->retry_on_alternate_network_before_handshake);
  6158. InitializeConnectionMigrationV2Test(
  6159. {kDefaultNetworkForTests, kNewNetworkForTests});
  6160. // Use unmocked crypto stream to do crypto connect.
  6161. crypto_client_stream_factory_.set_handshake_mode(
  6162. MockCryptoClientStream::COLD_START_WITH_CHLO_SENT);
  6163. MockQuicData socket_data(version_);
  6164. socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  6165. // Trigger PACKET_WRITE_ERROR when sending packets in crypto connect.
  6166. socket_data.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE);
  6167. socket_data.AddSocketDataToFactory(socket_factory_.get());
  6168. // Create request, should fail after the write of the CHLO fails.
  6169. QuicStreamRequest request(factory_.get());
  6170. EXPECT_EQ(ERR_IO_PENDING,
  6171. request.Request(
  6172. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  6173. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  6174. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  6175. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  6176. failed_on_default_network_callback_, callback_.callback()));
  6177. EXPECT_EQ(ERR_QUIC_HANDSHAKE_FAILED, callback_.WaitForResult());
  6178. EXPECT_FALSE(HasActiveSession(scheme_host_port_));
  6179. EXPECT_FALSE(HasActiveJob(scheme_host_port_, privacy_mode_));
  6180. // Verify new requests can be sent normally.
  6181. crypto_client_stream_factory_.set_handshake_mode(
  6182. MockCryptoClientStream::COLD_START);
  6183. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  6184. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  6185. client_maker_.Reset();
  6186. MockQuicData socket_data2(version_);
  6187. socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  6188. if (VersionUsesHttp3(version_.transport_version))
  6189. socket_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
  6190. socket_data2.AddSocketDataToFactory(socket_factory_.get());
  6191. QuicStreamRequest request2(factory_.get());
  6192. EXPECT_EQ(ERR_IO_PENDING,
  6193. request2.Request(
  6194. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  6195. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  6196. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  6197. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  6198. failed_on_default_network_callback_, callback_.callback()));
  6199. EXPECT_FALSE(HasActiveSession(scheme_host_port_));
  6200. EXPECT_TRUE(HasActiveJob(scheme_host_port_, privacy_mode_));
  6201. // Run the message loop to complete host resolution.
  6202. base::RunLoop().RunUntilIdle();
  6203. // Complete handshake. QuicStreamFactory::Job should complete and succeed.
  6204. crypto_client_stream_factory_.last_stream()
  6205. ->NotifySessionOneRttKeyAvailable();
  6206. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  6207. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  6208. EXPECT_FALSE(HasActiveJob(scheme_host_port_, privacy_mode_));
  6209. // Create QuicHttpStream.
  6210. std::unique_ptr<HttpStream> stream = CreateStream(&request2);
  6211. EXPECT_TRUE(stream.get());
  6212. stream.reset();
  6213. EXPECT_TRUE(socket_data.AllReadDataConsumed());
  6214. EXPECT_TRUE(socket_data.AllWriteDataConsumed());
  6215. EXPECT_TRUE(socket_data2.AllReadDataConsumed());
  6216. EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
  6217. }
  6218. // Test that if the original connection is closed with QUIC_PACKET_WRITE_ERROR
  6219. // before handshake is confirmed and new connection before handshake is turned
  6220. // on, a new connection will be retried on the alternate network.
  6221. // TODO(crbug.com/1347664): This test is failing on various platforms.
  6222. TEST_P(QuicStreamFactoryTest,
  6223. DISABLED_RetryConnectionOnWriteErrorBeforeHandshakeConfirmed) {
  6224. quic_params_->retry_on_alternate_network_before_handshake = true;
  6225. InitializeConnectionMigrationV2Test(
  6226. {kDefaultNetworkForTests, kNewNetworkForTests});
  6227. // Use unmocked crypto stream to do crypto connect.
  6228. crypto_client_stream_factory_.set_handshake_mode(
  6229. MockCryptoClientStream::COLD_START_WITH_CHLO_SENT);
  6230. // Socket data for connection on the default network.
  6231. MockQuicData socket_data(version_);
  6232. socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  6233. // Trigger PACKET_WRITE_ERROR when sending packets in crypto connect.
  6234. socket_data.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE);
  6235. socket_data.AddSocketDataToFactory(socket_factory_.get());
  6236. // Socket data for connection on the alternate network.
  6237. MockQuicData socket_data2(version_);
  6238. int packet_num = 1;
  6239. socket_data2.AddWrite(SYNCHRONOUS,
  6240. client_maker_.MakeDummyCHLOPacket(packet_num++));
  6241. socket_data2.AddRead(ASYNC, ERR_IO_PENDING); // Pause.
  6242. // Change the encryption level after handshake is confirmed.
  6243. client_maker_.SetEncryptionLevel(quic::ENCRYPTION_FORWARD_SECURE);
  6244. if (VersionUsesHttp3(version_.transport_version))
  6245. socket_data2.AddWrite(ASYNC, ConstructInitialSettingsPacket(packet_num++));
  6246. socket_data2.AddWrite(
  6247. ASYNC, ConstructGetRequestPacket(
  6248. packet_num++, GetNthClientInitiatedBidirectionalStreamId(0),
  6249. true, true));
  6250. socket_data2.AddRead(
  6251. ASYNC,
  6252. ConstructOkResponsePacket(
  6253. 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
  6254. socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  6255. if (VersionUsesHttp3(version_.transport_version)) {
  6256. socket_data2.AddWrite(
  6257. SYNCHRONOUS, client_maker_.MakeAckAndDataPacket(
  6258. packet_num++, false, GetQpackDecoderStreamId(), 1, 1,
  6259. false, StreamCancellationQpackDecoderInstruction(0)));
  6260. socket_data2.AddWrite(
  6261. SYNCHRONOUS,
  6262. client_maker_.MakeRstPacket(
  6263. packet_num++, false, GetNthClientInitiatedBidirectionalStreamId(0),
  6264. quic::QUIC_STREAM_CANCELLED));
  6265. } else {
  6266. socket_data2.AddWrite(
  6267. SYNCHRONOUS,
  6268. client_maker_.MakeAckAndRstPacket(
  6269. packet_num++, false, GetNthClientInitiatedBidirectionalStreamId(0),
  6270. quic::QUIC_STREAM_CANCELLED, 1, 1));
  6271. }
  6272. socket_data2.AddSocketDataToFactory(socket_factory_.get());
  6273. // Create request, should fail after the write of the CHLO fails.
  6274. QuicStreamRequest request(factory_.get());
  6275. EXPECT_EQ(ERR_IO_PENDING,
  6276. request.Request(
  6277. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  6278. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  6279. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  6280. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  6281. failed_on_default_network_callback_, callback_.callback()));
  6282. // Ensure that the session is alive but not active.
  6283. EXPECT_FALSE(HasActiveSession(scheme_host_port_));
  6284. EXPECT_TRUE(HasActiveJob(scheme_host_port_, privacy_mode_));
  6285. base::RunLoop().RunUntilIdle();
  6286. QuicChromiumClientSession* session = GetPendingSession(scheme_host_port_);
  6287. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  6288. // Confirm the handshake on the alternate network.
  6289. crypto_client_stream_factory_.last_stream()
  6290. ->NotifySessionOneRttKeyAvailable();
  6291. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  6292. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  6293. // Resume the data now so that data can be sent and read.
  6294. socket_data2.Resume();
  6295. // Create the stream.
  6296. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  6297. EXPECT_TRUE(stream.get());
  6298. HttpRequestInfo request_info;
  6299. request_info.method = "GET";
  6300. request_info.url = GURL("https://www.example.org/");
  6301. request_info.traffic_annotation =
  6302. MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
  6303. stream->RegisterRequest(&request_info);
  6304. EXPECT_EQ(OK, stream->InitializeStream(true, DEFAULT_PRIORITY, net_log_,
  6305. CompletionOnceCallback()));
  6306. // Send the request.
  6307. HttpResponseInfo response;
  6308. HttpRequestHeaders request_headers;
  6309. EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
  6310. callback_.callback()));
  6311. // Run the message loop to finish asynchronous mock write.
  6312. base::RunLoop().RunUntilIdle();
  6313. // Read the response.
  6314. EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
  6315. EXPECT_EQ(200, response.headers->response_code());
  6316. stream.reset();
  6317. EXPECT_TRUE(socket_data.AllReadDataConsumed());
  6318. EXPECT_TRUE(socket_data.AllWriteDataConsumed());
  6319. EXPECT_TRUE(socket_data2.AllReadDataConsumed());
  6320. EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
  6321. }
  6322. void QuicStreamFactoryTestBase::TestMigrationOnWriteError(
  6323. IoMode write_error_mode) {
  6324. if (!version_.UsesHttp3())
  6325. return;
  6326. InitializeConnectionMigrationV2Test(
  6327. {kDefaultNetworkForTests, kNewNetworkForTests});
  6328. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  6329. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  6330. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  6331. client_maker_.set_save_packet_frames(true);
  6332. auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
  6333. MockQuicData socket_data(version_);
  6334. socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  6335. int packet_num = 1;
  6336. socket_data.AddWrite(SYNCHRONOUS,
  6337. ConstructInitialSettingsPacket(packet_num++));
  6338. socket_data.AddWrite(write_error_mode, ERR_ADDRESS_UNREACHABLE);
  6339. socket_data.AddSocketDataToFactory(socket_factory_.get());
  6340. // Create request and QuicHttpStream.
  6341. QuicStreamRequest request(factory_.get());
  6342. EXPECT_EQ(ERR_IO_PENDING,
  6343. request.Request(
  6344. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  6345. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  6346. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  6347. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  6348. failed_on_default_network_callback_, callback_.callback()));
  6349. EXPECT_EQ(OK, callback_.WaitForResult());
  6350. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  6351. EXPECT_TRUE(stream.get());
  6352. // Cause QUIC stream to be created.
  6353. HttpRequestInfo request_info;
  6354. request_info.method = "GET";
  6355. request_info.url = GURL("https://www.example.org/");
  6356. request_info.traffic_annotation =
  6357. MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
  6358. stream->RegisterRequest(&request_info);
  6359. EXPECT_EQ(OK, stream->InitializeStream(true, DEFAULT_PRIORITY, net_log_,
  6360. CompletionOnceCallback()));
  6361. // Ensure that session is alive and active.
  6362. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  6363. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  6364. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  6365. quic::QuicConnectionId cid_on_new_path =
  6366. quic::test::TestConnectionId(12345678);
  6367. MaybeMakeNewConnectionIdAvailableToSession(cid_on_new_path, session);
  6368. // Set up second socket data provider that is used after
  6369. // migration. The request is rewritten to this new socket, and the
  6370. // response to the request is read on this new socket.
  6371. MockQuicData socket_data1(version_);
  6372. client_maker_.set_connection_id(cid_on_new_path);
  6373. // Increment packet number to account for packet write error on the old
  6374. // path. Also save the packet in client_maker_ for constructing the
  6375. // retransmission packet.
  6376. ConstructGetRequestPacket(packet_num++,
  6377. GetNthClientInitiatedBidirectionalStreamId(0),
  6378. /*should_include_version=*/false,
  6379. /*fin=*/true);
  6380. socket_data1.AddWrite(SYNCHRONOUS,
  6381. client_maker_.MakeCombinedRetransmissionPacket(
  6382. /*original_packet_numbers=*/{1, 2}, packet_num++,
  6383. /*should_include_version=*/false));
  6384. socket_data1.AddWrite(ASYNC, client_maker_.MakePingPacket(
  6385. packet_num++, /*include_version=*/false));
  6386. socket_data1.AddWrite(
  6387. SYNCHRONOUS,
  6388. client_maker_.MakeRetireConnectionIdPacket(
  6389. packet_num++, /*include_version=*/false, /*sequence_number=*/0u));
  6390. socket_data1.AddRead(
  6391. ASYNC,
  6392. ConstructOkResponsePacket(
  6393. 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
  6394. socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  6395. socket_data1.AddWrite(
  6396. SYNCHRONOUS,
  6397. client_maker_.MakeDataPacket(
  6398. packet_num++, GetQpackDecoderStreamId(),
  6399. /*should_include_version=*/false,
  6400. /*fin=*/false, StreamCancellationQpackDecoderInstruction(0)));
  6401. socket_data1.AddWrite(
  6402. SYNCHRONOUS,
  6403. client_maker_.MakeRstPacket(packet_num++, false,
  6404. GetNthClientInitiatedBidirectionalStreamId(0),
  6405. quic::QUIC_STREAM_CANCELLED));
  6406. socket_data1.AddSocketDataToFactory(socket_factory_.get());
  6407. // Send GET request on stream. This should cause a write error, which triggers
  6408. // a connection migration attempt.
  6409. HttpResponseInfo response;
  6410. HttpRequestHeaders request_headers;
  6411. EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
  6412. callback_.callback()));
  6413. // Run the message loop so that the migration attempt is executed and
  6414. // data queued in the new socket is read by the packet reader.
  6415. base::RunLoop().RunUntilIdle();
  6416. // Verify that session is alive and not marked as going away.
  6417. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  6418. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  6419. EXPECT_EQ(1u, session->GetNumActiveStreams());
  6420. // Verify that response headers on the migrated socket were delivered to the
  6421. // stream.
  6422. EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
  6423. EXPECT_EQ(200, response.headers->response_code());
  6424. stream.reset();
  6425. EXPECT_TRUE(socket_data.AllReadDataConsumed());
  6426. EXPECT_TRUE(socket_data.AllWriteDataConsumed());
  6427. EXPECT_TRUE(socket_data1.AllReadDataConsumed());
  6428. EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
  6429. }
  6430. TEST_P(QuicStreamFactoryTest, MigrateSessionOnWriteErrorSynchronous) {
  6431. TestMigrationOnWriteError(SYNCHRONOUS);
  6432. }
  6433. TEST_P(QuicStreamFactoryTest, MigrateSessionOnWriteErrorAsync) {
  6434. TestMigrationOnWriteError(ASYNC);
  6435. }
  6436. void QuicStreamFactoryTestBase::TestMigrationOnWriteErrorNoNewNetwork(
  6437. IoMode write_error_mode) {
  6438. if (!version_.UsesHttp3())
  6439. return;
  6440. InitializeConnectionMigrationV2Test({kDefaultNetworkForTests});
  6441. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  6442. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  6443. // Use the test task runner, to force the migration alarm timeout later.
  6444. QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
  6445. MockQuicData socket_data(version_);
  6446. socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  6447. if (VersionUsesHttp3(version_.transport_version))
  6448. socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
  6449. socket_data.AddWrite(write_error_mode, ERR_ADDRESS_UNREACHABLE);
  6450. socket_data.AddSocketDataToFactory(socket_factory_.get());
  6451. // Create request and QuicHttpStream.
  6452. QuicStreamRequest request(factory_.get());
  6453. EXPECT_EQ(ERR_IO_PENDING,
  6454. request.Request(
  6455. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  6456. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  6457. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  6458. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  6459. failed_on_default_network_callback_, callback_.callback()));
  6460. EXPECT_EQ(OK, callback_.WaitForResult());
  6461. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  6462. EXPECT_TRUE(stream.get());
  6463. // Cause QUIC stream to be created.
  6464. HttpRequestInfo request_info;
  6465. request_info.method = "GET";
  6466. request_info.url = GURL("https://www.example.org/");
  6467. request_info.traffic_annotation =
  6468. MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
  6469. stream->RegisterRequest(&request_info);
  6470. EXPECT_EQ(OK, stream->InitializeStream(true, DEFAULT_PRIORITY, net_log_,
  6471. CompletionOnceCallback()));
  6472. // Ensure that session is alive and active.
  6473. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  6474. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  6475. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  6476. // Send GET request on stream. This causes a write error, which triggers
  6477. // a connection migration attempt. Since there are no networks
  6478. // to migrate to, this causes the session to wait for a new network.
  6479. HttpResponseInfo response;
  6480. HttpRequestHeaders request_headers;
  6481. EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
  6482. callback_.callback()));
  6483. // Complete any pending writes. Pending async MockQuicData writes
  6484. // are run on the message loop, not on the test runner.
  6485. base::RunLoop().RunUntilIdle();
  6486. // Write error causes migration task to be posted. Spin the loop.
  6487. if (write_error_mode == ASYNC)
  6488. runner_->RunNextTask();
  6489. // Migration has not yet failed. The session should be alive and active.
  6490. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  6491. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  6492. EXPECT_EQ(1u, session->GetNumActiveStreams());
  6493. EXPECT_TRUE(session->connection()->writer()->IsWriteBlocked());
  6494. // The migration will not fail until the migration alarm timeout.
  6495. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  6496. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  6497. EXPECT_EQ(1u, session->GetNumActiveStreams());
  6498. EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
  6499. // Force migration alarm timeout to run.
  6500. RunTestLoopUntilIdle();
  6501. // The connection should be closed. A request for response headers
  6502. // should fail.
  6503. EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  6504. EXPECT_FALSE(HasActiveSession(scheme_host_port_));
  6505. EXPECT_EQ(ERR_NETWORK_CHANGED, callback_.WaitForResult());
  6506. EXPECT_EQ(ERR_NETWORK_CHANGED,
  6507. stream->ReadResponseHeaders(callback_.callback()));
  6508. NetErrorDetails error_details;
  6509. stream->PopulateNetErrorDetails(&error_details);
  6510. EXPECT_EQ(error_details.quic_connection_error,
  6511. quic::QUIC_CONNECTION_MIGRATION_NO_NEW_NETWORK);
  6512. EXPECT_TRUE(socket_data.AllReadDataConsumed());
  6513. EXPECT_TRUE(socket_data.AllWriteDataConsumed());
  6514. }
  6515. TEST_P(QuicStreamFactoryTest,
  6516. MigrateSessionOnWriteErrorNoNewNetworkSynchronous) {
  6517. TestMigrationOnWriteErrorNoNewNetwork(SYNCHRONOUS);
  6518. }
  6519. TEST_P(QuicStreamFactoryTest, MigrateSessionOnWriteErrorNoNewNetworkAsync) {
  6520. TestMigrationOnWriteErrorNoNewNetwork(ASYNC);
  6521. }
  6522. TEST_P(QuicStreamFactoryTest,
  6523. MigrateSessionOnWriteErrorWithMultipleRequestsSync) {
  6524. TestMigrationOnWriteErrorWithMultipleRequests(SYNCHRONOUS);
  6525. }
  6526. TEST_P(QuicStreamFactoryTest,
  6527. MigrateSessionOnWriteErrorWithMultipleRequestsAsync) {
  6528. TestMigrationOnWriteErrorWithMultipleRequests(ASYNC);
  6529. }
  6530. // Sets up a test which verifies that connection migration on write error can
  6531. // eventually succeed and rewrite the packet on the new network with *multiple*
  6532. // migratable streams.
  6533. void QuicStreamFactoryTestBase::TestMigrationOnWriteErrorWithMultipleRequests(
  6534. IoMode write_error_mode) {
  6535. if (!version_.UsesHttp3())
  6536. return;
  6537. InitializeConnectionMigrationV2Test(
  6538. {kDefaultNetworkForTests, kNewNetworkForTests});
  6539. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  6540. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  6541. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  6542. client_maker_.set_save_packet_frames(true);
  6543. MockQuicData socket_data(version_);
  6544. socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  6545. int packet_num = 1;
  6546. socket_data.AddWrite(SYNCHRONOUS,
  6547. ConstructInitialSettingsPacket(packet_num++));
  6548. socket_data.AddWrite(write_error_mode, ERR_ADDRESS_UNREACHABLE);
  6549. socket_data.AddSocketDataToFactory(socket_factory_.get());
  6550. // Set up second socket data provider that is used after
  6551. // migration. The request is rewritten to this new socket, and the
  6552. // response to the request is read on this new socket.
  6553. MockQuicData socket_data1(version_);
  6554. quic::QuicConnectionId cid_on_new_path =
  6555. quic::test::TestConnectionId(12345678);
  6556. client_maker_.set_connection_id(cid_on_new_path);
  6557. // Increment packet number to account for packet write error on the old
  6558. // path. Also save the packet in client_maker_ for constructing the
  6559. // retransmission packet.
  6560. ConstructGetRequestPacket(packet_num++,
  6561. GetNthClientInitiatedBidirectionalStreamId(0),
  6562. /*should_include_version=*/false,
  6563. /*fin=*/true);
  6564. socket_data1.AddWrite(SYNCHRONOUS,
  6565. client_maker_.MakeCombinedRetransmissionPacket(
  6566. /*original_packet_numbers=*/{1, 2}, packet_num++,
  6567. /*should_include_version=*/false));
  6568. socket_data1.AddWrite(
  6569. SYNCHRONOUS, client_maker_.MakePingPacket(packet_num++,
  6570. /*include_version=*/false));
  6571. socket_data1.AddWrite(SYNCHRONOUS,
  6572. client_maker_.MakeRetireConnectionIdPacket(
  6573. packet_num++, /*include_version=*/false,
  6574. /*sequence_number=*/0u));
  6575. socket_data1.AddRead(
  6576. ASYNC,
  6577. ConstructOkResponsePacket(
  6578. 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
  6579. socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  6580. socket_data1.AddWrite(
  6581. SYNCHRONOUS,
  6582. client_maker_.MakeDataPacket(
  6583. packet_num++, GetQpackDecoderStreamId(),
  6584. /*should_include_version=*/false,
  6585. /*fin=*/false, StreamCancellationQpackDecoderInstruction(0)));
  6586. socket_data1.AddWrite(
  6587. SYNCHRONOUS,
  6588. client_maker_.MakeRstPacket(packet_num++, false,
  6589. GetNthClientInitiatedBidirectionalStreamId(0),
  6590. quic::QUIC_STREAM_CANCELLED));
  6591. socket_data1.AddWrite(
  6592. SYNCHRONOUS, client_maker_.MakeDataPacket(
  6593. packet_num++, GetQpackDecoderStreamId(), true, false,
  6594. StreamCancellationQpackDecoderInstruction(1, false)));
  6595. socket_data1.AddWrite(
  6596. SYNCHRONOUS,
  6597. client_maker_.MakeRstPacket(packet_num++, false,
  6598. GetNthClientInitiatedBidirectionalStreamId(1),
  6599. quic::QUIC_STREAM_CANCELLED,
  6600. /*include_stop_sending_if_v99=*/true));
  6601. socket_data1.AddSocketDataToFactory(socket_factory_.get());
  6602. // Create request #1 and QuicHttpStream.
  6603. QuicStreamRequest request1(factory_.get());
  6604. EXPECT_EQ(ERR_IO_PENDING,
  6605. request1.Request(
  6606. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  6607. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  6608. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  6609. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  6610. failed_on_default_network_callback_, callback_.callback()));
  6611. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  6612. std::unique_ptr<HttpStream> stream1 = CreateStream(&request1);
  6613. EXPECT_TRUE(stream1.get());
  6614. HttpRequestInfo request_info1;
  6615. request_info1.method = "GET";
  6616. request_info1.url = GURL("https://www.example.org/");
  6617. request_info1.traffic_annotation =
  6618. MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
  6619. stream1->RegisterRequest(&request_info1);
  6620. EXPECT_EQ(OK, stream1->InitializeStream(true, DEFAULT_PRIORITY, net_log_,
  6621. CompletionOnceCallback()));
  6622. // Second request returns synchronously because it pools to existing session.
  6623. TestCompletionCallback callback2;
  6624. QuicStreamRequest request2(factory_.get());
  6625. EXPECT_EQ(OK,
  6626. request2.Request(
  6627. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  6628. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  6629. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  6630. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  6631. failed_on_default_network_callback_, callback2.callback()));
  6632. std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
  6633. EXPECT_TRUE(stream2.get());
  6634. HttpRequestInfo request_info2;
  6635. request_info2.method = "GET";
  6636. request_info2.url = GURL("https://www.example.org/");
  6637. request_info2.traffic_annotation =
  6638. MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
  6639. stream2->RegisterRequest(&request_info2);
  6640. EXPECT_EQ(OK, stream2->InitializeStream(true, DEFAULT_PRIORITY, net_log_,
  6641. CompletionOnceCallback()));
  6642. // Ensure that session is alive and active.
  6643. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  6644. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  6645. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  6646. EXPECT_EQ(2u, session->GetNumActiveStreams());
  6647. MaybeMakeNewConnectionIdAvailableToSession(cid_on_new_path, session);
  6648. // Send GET request on stream. This should cause a write error, which triggers
  6649. // a connection migration attempt.
  6650. HttpResponseInfo response;
  6651. HttpRequestHeaders request_headers;
  6652. EXPECT_EQ(OK, stream1->SendRequest(request_headers, &response,
  6653. callback_.callback()));
  6654. // Run the message loop so that the migration attempt is executed and
  6655. // data queued in the new socket is read by the packet reader.
  6656. base::RunLoop().RunUntilIdle();
  6657. // Verify session is still alive and not marked as going away.
  6658. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  6659. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  6660. EXPECT_EQ(2u, session->GetNumActiveStreams());
  6661. // Verify that response headers on the migrated socket were delivered to the
  6662. // stream.
  6663. EXPECT_EQ(OK, stream1->ReadResponseHeaders(callback_.callback()));
  6664. EXPECT_EQ(200, response.headers->response_code());
  6665. stream1.reset();
  6666. stream2.reset();
  6667. EXPECT_TRUE(socket_data.AllReadDataConsumed());
  6668. EXPECT_TRUE(socket_data.AllWriteDataConsumed());
  6669. EXPECT_TRUE(socket_data1.AllReadDataConsumed());
  6670. EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
  6671. }
  6672. TEST_P(QuicStreamFactoryTest, MigrateOnWriteErrorWithMixedRequestsSync) {
  6673. TestMigrationOnWriteErrorMixedStreams(SYNCHRONOUS);
  6674. }
  6675. TEST_P(QuicStreamFactoryTest, MigrateOnWriteErrorWithMixedRequestsAsync) {
  6676. TestMigrationOnWriteErrorMixedStreams(ASYNC);
  6677. }
  6678. // Sets up a test that verifies connection migration manages to migrate to
  6679. // alternate network after encountering a SYNC/ASYNC write error based on
  6680. // |write_error_mode| on the original network.
  6681. // Note there are mixed types of unfinished requests before migration: one
  6682. // migratable and one non-migratable. The *migratable* one triggers write
  6683. // error.
  6684. void QuicStreamFactoryTestBase::TestMigrationOnWriteErrorMixedStreams(
  6685. IoMode write_error_mode) {
  6686. if (!version_.UsesHttp3())
  6687. return;
  6688. InitializeConnectionMigrationV2Test(
  6689. {kDefaultNetworkForTests, kNewNetworkForTests});
  6690. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  6691. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  6692. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  6693. client_maker_.set_save_packet_frames(true);
  6694. int packet_number = 1;
  6695. MockQuicData socket_data(version_);
  6696. socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  6697. socket_data.AddWrite(SYNCHRONOUS,
  6698. ConstructInitialSettingsPacket(packet_number++));
  6699. socket_data.AddWrite(write_error_mode, ERR_ADDRESS_UNREACHABLE);
  6700. socket_data.AddSocketDataToFactory(socket_factory_.get());
  6701. // Set up second socket data provider that is used after
  6702. // migration. The request is rewritten to this new socket, and the
  6703. // response to the request is read on this new socket.
  6704. MockQuicData socket_data1(version_);
  6705. quic::QuicConnectionId cid_on_new_path =
  6706. quic::test::TestConnectionId(1234567);
  6707. client_maker_.set_connection_id(cid_on_new_path);
  6708. // Increment packet number to account for packet write error on the old
  6709. // path. Also save the packet in client_maker_ for constructing the
  6710. // retransmission packet.
  6711. ConstructGetRequestPacket(packet_number++,
  6712. GetNthClientInitiatedBidirectionalStreamId(0),
  6713. /*should_include_version=*/false,
  6714. /*fin=*/true);
  6715. socket_data1.AddWrite(
  6716. SYNCHRONOUS, client_maker_.MakeRetransmissionRstAndDataPacket(
  6717. /*original_packet_numbers=*/{1, 2}, packet_number++,
  6718. /*include_version=*/false,
  6719. GetNthClientInitiatedBidirectionalStreamId(1),
  6720. quic::QUIC_STREAM_CANCELLED, GetQpackDecoderStreamId(),
  6721. StreamCancellationQpackDecoderInstruction(1)));
  6722. socket_data1.AddWrite(
  6723. SYNCHRONOUS, client_maker_.MakePingPacket(packet_number++,
  6724. /*include_version=*/false));
  6725. socket_data1.AddWrite(SYNCHRONOUS,
  6726. client_maker_.MakeRetireConnectionIdPacket(
  6727. packet_number++, /*include_version=*/false,
  6728. /*sequence_number=*/0u));
  6729. socket_data1.AddRead(
  6730. ASYNC,
  6731. ConstructOkResponsePacket(
  6732. 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
  6733. socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  6734. socket_data1.AddWrite(
  6735. SYNCHRONOUS,
  6736. client_maker_.MakeDataPacket(
  6737. packet_number++, GetQpackDecoderStreamId(),
  6738. /*should_include_version=*/false,
  6739. /*fin=*/false, StreamCancellationQpackDecoderInstruction(0, false)));
  6740. socket_data1.AddWrite(
  6741. SYNCHRONOUS,
  6742. client_maker_.MakeRstPacket(packet_number++, false,
  6743. GetNthClientInitiatedBidirectionalStreamId(0),
  6744. quic::QUIC_STREAM_CANCELLED));
  6745. socket_data1.AddSocketDataToFactory(socket_factory_.get());
  6746. // Create request #1 and QuicHttpStream.
  6747. QuicStreamRequest request1(factory_.get());
  6748. EXPECT_EQ(ERR_IO_PENDING,
  6749. request1.Request(
  6750. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  6751. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  6752. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  6753. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  6754. failed_on_default_network_callback_, callback_.callback()));
  6755. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  6756. std::unique_ptr<HttpStream> stream1 = CreateStream(&request1);
  6757. EXPECT_TRUE(stream1.get());
  6758. HttpRequestInfo request_info1;
  6759. request_info1.method = "GET";
  6760. request_info1.url = GURL("https://www.example.org/");
  6761. request_info1.traffic_annotation =
  6762. MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
  6763. stream1->RegisterRequest(&request_info1);
  6764. EXPECT_EQ(OK, stream1->InitializeStream(true, DEFAULT_PRIORITY, net_log_,
  6765. CompletionOnceCallback()));
  6766. // Second request returns synchronously because it pools to existing session.
  6767. TestCompletionCallback callback2;
  6768. QuicStreamRequest request2(factory_.get());
  6769. EXPECT_EQ(OK,
  6770. request2.Request(
  6771. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  6772. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  6773. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  6774. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  6775. failed_on_default_network_callback_, callback2.callback()));
  6776. std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
  6777. EXPECT_TRUE(stream2.get());
  6778. HttpRequestInfo request_info2;
  6779. request_info2.method = "GET";
  6780. request_info2.load_flags |= LOAD_DISABLE_CONNECTION_MIGRATION_TO_CELLULAR;
  6781. request_info2.url = GURL("https://www.example.org/");
  6782. request_info2.traffic_annotation =
  6783. MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
  6784. stream2->RegisterRequest(&request_info2);
  6785. EXPECT_EQ(OK, stream2->InitializeStream(true, DEFAULT_PRIORITY, net_log_,
  6786. CompletionOnceCallback()));
  6787. // Ensure that session is alive and active.
  6788. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  6789. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  6790. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  6791. EXPECT_EQ(2u, session->GetNumActiveStreams());
  6792. MaybeMakeNewConnectionIdAvailableToSession(cid_on_new_path, session);
  6793. // Send GET request on stream 1. This should cause a write error, which
  6794. // triggers a connection migration attempt.
  6795. HttpResponseInfo response;
  6796. HttpRequestHeaders request_headers;
  6797. EXPECT_EQ(OK, stream1->SendRequest(request_headers, &response,
  6798. callback_.callback()));
  6799. // Run the message loop so that the migration attempt is executed and
  6800. // data queued in the new socket is read by the packet reader.
  6801. base::RunLoop().RunUntilIdle();
  6802. // Verify that the session is still alive and not marked as going away.
  6803. // Non-migratable stream should be closed due to migration.
  6804. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  6805. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  6806. EXPECT_EQ(1u, session->GetNumActiveStreams());
  6807. // Verify that response headers on the migrated socket were delivered to the
  6808. // stream.
  6809. EXPECT_EQ(OK, stream1->ReadResponseHeaders(callback_.callback()));
  6810. EXPECT_EQ(200, response.headers->response_code());
  6811. stream1.reset();
  6812. EXPECT_TRUE(socket_data.AllReadDataConsumed());
  6813. EXPECT_TRUE(socket_data.AllWriteDataConsumed());
  6814. EXPECT_TRUE(socket_data1.AllReadDataConsumed());
  6815. EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
  6816. }
  6817. TEST_P(QuicStreamFactoryTest, MigrateOnWriteErrorWithMixedRequests2Sync) {
  6818. TestMigrationOnWriteErrorMixedStreams2(SYNCHRONOUS);
  6819. }
  6820. TEST_P(QuicStreamFactoryTest, MigrateOnWriteErrorWithMixedRequests2Async) {
  6821. TestMigrationOnWriteErrorMixedStreams2(ASYNC);
  6822. }
  6823. // The one triggers write error is a non-migratable stream.
  6824. // Sets up a test that verifies connection migration manages to migrate to
  6825. // alternate network after encountering a SYNC/ASYNC write error based on
  6826. // |write_error_mode| on the original network.
  6827. // Note there are mixed types of unfinished requests before migration: one
  6828. // migratable and one non-migratable. The *non-migratable* one triggers write
  6829. // error.
  6830. void QuicStreamFactoryTestBase::TestMigrationOnWriteErrorMixedStreams2(
  6831. IoMode write_error_mode) {
  6832. if (!version_.UsesHttp3())
  6833. return;
  6834. InitializeConnectionMigrationV2Test(
  6835. {kDefaultNetworkForTests, kNewNetworkForTests});
  6836. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  6837. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  6838. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  6839. client_maker_.set_save_packet_frames(true);
  6840. int packet_number = 1;
  6841. MockQuicData socket_data(version_);
  6842. socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  6843. socket_data.AddWrite(SYNCHRONOUS,
  6844. ConstructInitialSettingsPacket(packet_number++));
  6845. socket_data.AddWrite(write_error_mode,
  6846. ERR_ADDRESS_UNREACHABLE); // Write error.
  6847. socket_data.AddSocketDataToFactory(socket_factory_.get());
  6848. // Set up second socket data provider that is used after migration. The
  6849. // request is rewritten to this new socket, and the response to the request is
  6850. // read on this new socket.
  6851. MockQuicData socket_data1(version_);
  6852. quic::QuicConnectionId cid_on_new_path =
  6853. quic::test::TestConnectionId(12345678);
  6854. client_maker_.set_connection_id(cid_on_new_path);
  6855. // Increment packet number to account for packet write error on the old
  6856. // path. Also save the packet in client_maker_ for constructing the
  6857. // retransmission packet.
  6858. ConstructGetRequestPacket(packet_number++,
  6859. GetNthClientInitiatedBidirectionalStreamId(1),
  6860. /*should_include_version=*/false,
  6861. /*fin=*/true);
  6862. socket_data1.AddWrite(
  6863. SYNCHRONOUS, client_maker_.MakeRetransmissionRstAndDataPacket(
  6864. /*original_packet_numbers=*/{1}, packet_number++,
  6865. /*include_version=*/false,
  6866. GetNthClientInitiatedBidirectionalStreamId(1),
  6867. quic::QUIC_STREAM_CANCELLED, GetQpackDecoderStreamId(),
  6868. StreamCancellationQpackDecoderInstruction(1)));
  6869. socket_data1.AddWrite(
  6870. SYNCHRONOUS, client_maker_.MakePingPacket(packet_number++,
  6871. /*include_version=*/false));
  6872. socket_data1.AddWrite(SYNCHRONOUS,
  6873. client_maker_.MakeRetireConnectionIdPacket(
  6874. packet_number++, /*include_version=*/false,
  6875. /*sequence_number=*/0u));
  6876. socket_data1.AddWrite(
  6877. SYNCHRONOUS,
  6878. ConstructGetRequestPacket(packet_number++,
  6879. GetNthClientInitiatedBidirectionalStreamId(0),
  6880. true, true));
  6881. socket_data1.AddRead(
  6882. ASYNC,
  6883. ConstructOkResponsePacket(
  6884. 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
  6885. socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  6886. socket_data1.AddWrite(
  6887. SYNCHRONOUS,
  6888. client_maker_.MakeDataPacket(
  6889. packet_number++, GetQpackDecoderStreamId(),
  6890. /*should_include_version=*/false,
  6891. /*fin=*/false, StreamCancellationQpackDecoderInstruction(0, false)));
  6892. socket_data1.AddWrite(
  6893. SYNCHRONOUS,
  6894. client_maker_.MakeRstPacket(packet_number++, false,
  6895. GetNthClientInitiatedBidirectionalStreamId(0),
  6896. quic::QUIC_STREAM_CANCELLED));
  6897. socket_data1.AddSocketDataToFactory(socket_factory_.get());
  6898. // Create request #1 and QuicHttpStream.
  6899. QuicStreamRequest request1(factory_.get());
  6900. EXPECT_EQ(ERR_IO_PENDING,
  6901. request1.Request(
  6902. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  6903. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  6904. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  6905. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  6906. failed_on_default_network_callback_, callback_.callback()));
  6907. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  6908. std::unique_ptr<HttpStream> stream1 = CreateStream(&request1);
  6909. EXPECT_TRUE(stream1.get());
  6910. HttpRequestInfo request_info1;
  6911. request_info1.method = "GET";
  6912. request_info1.url = GURL("https://www.example.org/");
  6913. request_info1.traffic_annotation =
  6914. MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
  6915. stream1->RegisterRequest(&request_info1);
  6916. EXPECT_EQ(OK, stream1->InitializeStream(true, DEFAULT_PRIORITY, net_log_,
  6917. CompletionOnceCallback()));
  6918. // Second request returns synchronously because it pools to existing session.
  6919. TestCompletionCallback callback2;
  6920. QuicStreamRequest request2(factory_.get());
  6921. EXPECT_EQ(OK,
  6922. request2.Request(
  6923. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  6924. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  6925. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  6926. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  6927. failed_on_default_network_callback_, callback2.callback()));
  6928. std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
  6929. EXPECT_TRUE(stream2.get());
  6930. HttpRequestInfo request_info2;
  6931. request_info2.method = "GET";
  6932. request_info2.load_flags |= LOAD_DISABLE_CONNECTION_MIGRATION_TO_CELLULAR;
  6933. request_info2.url = GURL("https://www.example.org/");
  6934. request_info2.traffic_annotation =
  6935. MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
  6936. stream2->RegisterRequest(&request_info2);
  6937. EXPECT_EQ(OK, stream2->InitializeStream(true, DEFAULT_PRIORITY, net_log_,
  6938. CompletionOnceCallback()));
  6939. // Ensure that session is alive and active.
  6940. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  6941. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  6942. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  6943. EXPECT_EQ(2u, session->GetNumActiveStreams());
  6944. MaybeMakeNewConnectionIdAvailableToSession(cid_on_new_path, session);
  6945. // Send GET request on stream 2 which is non-migratable. This should cause a
  6946. // write error, which triggers a connection migration attempt.
  6947. HttpResponseInfo response2;
  6948. HttpRequestHeaders request_headers2;
  6949. EXPECT_EQ(OK, stream2->SendRequest(request_headers2, &response2,
  6950. callback2.callback()));
  6951. // Run the message loop so that the migration attempt is executed and
  6952. // data queued in the new socket is read by the packet reader. Session is
  6953. // still alive and not marked as going away, non-migratable stream will be
  6954. // closed.
  6955. base::RunLoop().RunUntilIdle();
  6956. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  6957. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  6958. EXPECT_EQ(1u, session->GetNumActiveStreams());
  6959. // Send GET request on stream 1.
  6960. HttpResponseInfo response;
  6961. HttpRequestHeaders request_headers;
  6962. EXPECT_EQ(OK, stream1->SendRequest(request_headers, &response,
  6963. callback_.callback()));
  6964. base::RunLoop().RunUntilIdle();
  6965. // Verify that response headers on the migrated socket were delivered to the
  6966. // stream.
  6967. EXPECT_EQ(OK, stream1->ReadResponseHeaders(callback_.callback()));
  6968. EXPECT_EQ(200, response.headers->response_code());
  6969. stream1.reset();
  6970. EXPECT_TRUE(socket_data.AllReadDataConsumed());
  6971. EXPECT_TRUE(socket_data.AllWriteDataConsumed());
  6972. EXPECT_TRUE(socket_data1.AllReadDataConsumed());
  6973. EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
  6974. }
  6975. // This test verifies that when a connection encounters a packet write error, it
  6976. // will cancel non-migratable streams, and migrate to the alternate network.
  6977. void QuicStreamFactoryTestBase::TestMigrationOnWriteErrorNonMigratableStream(
  6978. IoMode write_error_mode,
  6979. bool migrate_idle_sessions) {
  6980. if (!version_.UsesHttp3())
  6981. return;
  6982. quic_params_->migrate_idle_sessions = migrate_idle_sessions;
  6983. InitializeConnectionMigrationV2Test(
  6984. {kDefaultNetworkForTests, kNewNetworkForTests});
  6985. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  6986. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  6987. client_maker_.set_save_packet_frames(true);
  6988. MockQuicData failed_socket_data(version_);
  6989. MockQuicData socket_data(version_);
  6990. quic::QuicConnectionId cid_on_new_path =
  6991. quic::test::TestConnectionId(12345678);
  6992. int packet_num = 1;
  6993. if (migrate_idle_sessions) {
  6994. // The socket data provider for the original socket before migration.
  6995. failed_socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  6996. failed_socket_data.AddWrite(SYNCHRONOUS,
  6997. ConstructInitialSettingsPacket(packet_num++));
  6998. failed_socket_data.AddWrite(write_error_mode, ERR_ADDRESS_UNREACHABLE);
  6999. failed_socket_data.AddSocketDataToFactory(socket_factory_.get());
  7000. // Set up second socket data provider that is used after migration.
  7001. socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
  7002. client_maker_.set_connection_id(cid_on_new_path);
  7003. // Increment packet number to account for packet write error on the old
  7004. // path. Also save the packet in client_maker_ for constructing the
  7005. // retransmission packet.
  7006. ConstructGetRequestPacket(packet_num++,
  7007. GetNthClientInitiatedBidirectionalStreamId(0),
  7008. /*should_include_version=*/false,
  7009. /*fin=*/true);
  7010. socket_data.AddWrite(
  7011. SYNCHRONOUS, client_maker_.MakeRetransmissionRstAndDataPacket(
  7012. /*original_packet_numbers=*/{1}, packet_num++,
  7013. /*include_version=*/false,
  7014. GetNthClientInitiatedBidirectionalStreamId(0),
  7015. quic::QUIC_STREAM_CANCELLED, GetQpackDecoderStreamId(),
  7016. StreamCancellationQpackDecoderInstruction(0)));
  7017. socket_data.AddWrite(
  7018. SYNCHRONOUS, client_maker_.MakePingPacket(packet_num++,
  7019. /*include_version=*/false));
  7020. socket_data.AddWrite(SYNCHRONOUS,
  7021. client_maker_.MakeRetireConnectionIdPacket(
  7022. packet_num++, /*include_version=*/false,
  7023. /*sequence_number=*/0u));
  7024. socket_data.AddSocketDataToFactory(socket_factory_.get());
  7025. } else {
  7026. socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  7027. if (VersionUsesHttp3(version_.transport_version))
  7028. socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
  7029. socket_data.AddWrite(write_error_mode, ERR_ADDRESS_UNREACHABLE);
  7030. socket_data.AddSocketDataToFactory(socket_factory_.get());
  7031. }
  7032. // Create request and QuicHttpStream.
  7033. QuicStreamRequest request(factory_.get());
  7034. EXPECT_EQ(ERR_IO_PENDING,
  7035. request.Request(
  7036. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  7037. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  7038. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  7039. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  7040. failed_on_default_network_callback_, callback_.callback()));
  7041. EXPECT_EQ(OK, callback_.WaitForResult());
  7042. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  7043. EXPECT_TRUE(stream.get());
  7044. // Cause QUIC stream to be created, but marked as non-migratable.
  7045. HttpRequestInfo request_info;
  7046. request_info.load_flags |= LOAD_DISABLE_CONNECTION_MIGRATION_TO_CELLULAR;
  7047. request_info.method = "GET";
  7048. request_info.url = GURL("https://www.example.org/");
  7049. request_info.traffic_annotation =
  7050. MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
  7051. stream->RegisterRequest(&request_info);
  7052. EXPECT_EQ(OK, stream->InitializeStream(true, DEFAULT_PRIORITY, net_log_,
  7053. CompletionOnceCallback()));
  7054. // Ensure that session is alive and active.
  7055. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  7056. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  7057. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  7058. MaybeMakeNewConnectionIdAvailableToSession(cid_on_new_path, session);
  7059. // Send GET request on stream. This should cause a write error, which triggers
  7060. // a connection migration attempt.
  7061. HttpResponseInfo response;
  7062. HttpRequestHeaders request_headers;
  7063. EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
  7064. callback_.callback()));
  7065. // Run message loop to execute migration attempt.
  7066. base::RunLoop().RunUntilIdle();
  7067. // Migration closes the non-migratable stream and:
  7068. // if migrate idle session is enabled, it migrates to the alternate network
  7069. // successfully; otherwise the connection is closed.
  7070. EXPECT_EQ(migrate_idle_sessions,
  7071. QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  7072. EXPECT_EQ(migrate_idle_sessions, HasActiveSession(scheme_host_port_));
  7073. if (migrate_idle_sessions) {
  7074. EXPECT_TRUE(failed_socket_data.AllReadDataConsumed());
  7075. EXPECT_TRUE(failed_socket_data.AllWriteDataConsumed());
  7076. }
  7077. EXPECT_TRUE(socket_data.AllReadDataConsumed());
  7078. EXPECT_TRUE(socket_data.AllWriteDataConsumed());
  7079. }
  7080. TEST_P(
  7081. QuicStreamFactoryTest,
  7082. MigrateSessionOnWriteErrorNonMigratableStreamSync_DoNotMigrateIdleSessions) {
  7083. TestMigrationOnWriteErrorNonMigratableStream(SYNCHRONOUS, false);
  7084. }
  7085. TEST_P(
  7086. QuicStreamFactoryTest,
  7087. MigrateSessionOnWriteErrorNonMigratableStreamAsync_DoNotMigrateIdleSessions) {
  7088. TestMigrationOnWriteErrorNonMigratableStream(ASYNC, false);
  7089. }
  7090. TEST_P(QuicStreamFactoryTest,
  7091. MigrateSessionOnWriteErrorNonMigratableStreamSync_MigrateIdleSessions) {
  7092. TestMigrationOnWriteErrorNonMigratableStream(SYNCHRONOUS, true);
  7093. }
  7094. TEST_P(QuicStreamFactoryTest,
  7095. MigrateSessionOnWriteErrorNonMigratableStreamAsync_MigrateIdleSessions) {
  7096. TestMigrationOnWriteErrorNonMigratableStream(ASYNC, true);
  7097. }
  7098. void QuicStreamFactoryTestBase::TestMigrationOnWriteErrorMigrationDisabled(
  7099. IoMode write_error_mode) {
  7100. InitializeConnectionMigrationV2Test(
  7101. {kDefaultNetworkForTests, kNewNetworkForTests});
  7102. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  7103. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  7104. MockQuicData socket_data(version_);
  7105. socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  7106. if (VersionUsesHttp3(version_.transport_version))
  7107. socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
  7108. socket_data.AddWrite(write_error_mode, ERR_ADDRESS_UNREACHABLE);
  7109. socket_data.AddSocketDataToFactory(socket_factory_.get());
  7110. // Create request and QuicHttpStream.
  7111. QuicStreamRequest request(factory_.get());
  7112. EXPECT_EQ(ERR_IO_PENDING,
  7113. request.Request(
  7114. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  7115. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  7116. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  7117. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  7118. failed_on_default_network_callback_, callback_.callback()));
  7119. EXPECT_EQ(OK, callback_.WaitForResult());
  7120. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  7121. EXPECT_TRUE(stream.get());
  7122. // Cause QUIC stream to be created.
  7123. HttpRequestInfo request_info;
  7124. request_info.method = "GET";
  7125. request_info.url = GURL("https://www.example.org/");
  7126. request_info.traffic_annotation =
  7127. MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
  7128. stream->RegisterRequest(&request_info);
  7129. EXPECT_EQ(OK, stream->InitializeStream(true, DEFAULT_PRIORITY, net_log_,
  7130. CompletionOnceCallback()));
  7131. // Ensure that session is alive and active.
  7132. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  7133. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  7134. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  7135. // Set session config to have connection migration disabled.
  7136. quic::test::QuicConfigPeer::SetReceivedDisableConnectionMigration(
  7137. session->config());
  7138. EXPECT_TRUE(session->config()->DisableConnectionMigration());
  7139. // Send GET request on stream. This should cause a write error, which triggers
  7140. // a connection migration attempt.
  7141. HttpResponseInfo response;
  7142. HttpRequestHeaders request_headers;
  7143. EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
  7144. callback_.callback()));
  7145. // Run message loop to execute migration attempt.
  7146. base::RunLoop().RunUntilIdle();
  7147. // Migration fails, and session is closed and deleted.
  7148. EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  7149. EXPECT_FALSE(HasActiveSession(scheme_host_port_));
  7150. EXPECT_TRUE(socket_data.AllReadDataConsumed());
  7151. EXPECT_TRUE(socket_data.AllWriteDataConsumed());
  7152. }
  7153. TEST_P(QuicStreamFactoryTest,
  7154. MigrateSessionOnWriteErrorMigrationDisabledSynchronous) {
  7155. TestMigrationOnWriteErrorMigrationDisabled(SYNCHRONOUS);
  7156. }
  7157. TEST_P(QuicStreamFactoryTest,
  7158. MigrateSessionOnWriteErrorMigrationDisabledAsync) {
  7159. TestMigrationOnWriteErrorMigrationDisabled(ASYNC);
  7160. }
  7161. // For IETF QUIC, this test the following scenario:
  7162. // - original network encounters a SYNC/ASYNC write error based on
  7163. // |write_error_mode_on_old_network|, the packet failed to be written is
  7164. // cached, session migrates immediately to the alternate network.
  7165. // - an immediate SYNC/ASYNC write error based on
  7166. // |write_error_mode_on_new_network| is encountered after migration to the
  7167. // alternate network, session migrates immediately to the original network.
  7168. // - After a new socket for the original network is created and starts to read,
  7169. // connection migration fails due to lack of unused connection ID and
  7170. // connection is closed.
  7171. // TODO(zhongyi): once https://crbug.com/855666 is fixed, this test should be
  7172. // modified to test that session is closed early if hopping between networks
  7173. // with consecutive write errors is detected.
  7174. void QuicStreamFactoryTestBase::TestMigrationOnMultipleWriteErrors(
  7175. IoMode write_error_mode_on_old_network,
  7176. IoMode write_error_mode_on_new_network) {
  7177. if (!version_.UsesHttp3())
  7178. return;
  7179. InitializeConnectionMigrationV2Test(
  7180. {kDefaultNetworkForTests, kNewNetworkForTests});
  7181. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  7182. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  7183. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  7184. client_maker_.set_save_packet_frames(true);
  7185. // Set up the socket data used by the original network, which encounters a
  7186. // write error.
  7187. MockQuicData socket_data1(version_);
  7188. socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  7189. int packet_num = 1;
  7190. socket_data1.AddWrite(SYNCHRONOUS,
  7191. ConstructInitialSettingsPacket(packet_num++));
  7192. socket_data1.AddWrite(write_error_mode_on_old_network,
  7193. ERR_ADDRESS_UNREACHABLE); // Write Error
  7194. socket_data1.AddSocketDataToFactory(socket_factory_.get());
  7195. // Set up the socket data used by the alternate network, which
  7196. // - is not used to write as migration fails due to lack of connection ID.
  7197. // - encounters a write error in gQUIC.
  7198. MockQuicData failed_quic_data2(version_);
  7199. quic::QuicConnectionId cid_on_new_path =
  7200. quic::test::TestConnectionId(12345678);
  7201. failed_quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  7202. failed_quic_data2.AddWrite(write_error_mode_on_new_network, ERR_FAILED);
  7203. failed_quic_data2.AddSocketDataToFactory(socket_factory_.get());
  7204. // Set up the third socket data used by original network, which
  7205. // - encounters a write error again.
  7206. MockQuicData failed_quic_data1(version_);
  7207. failed_quic_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  7208. failed_quic_data1.AddSocketDataToFactory(socket_factory_.get());
  7209. // Create request and QuicHttpStream.
  7210. QuicStreamRequest request(factory_.get());
  7211. EXPECT_EQ(ERR_IO_PENDING,
  7212. request.Request(
  7213. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  7214. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  7215. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  7216. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  7217. failed_on_default_network_callback_, callback_.callback()));
  7218. EXPECT_EQ(OK, callback_.WaitForResult());
  7219. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  7220. EXPECT_TRUE(stream.get());
  7221. // Cause QUIC stream to be created.
  7222. HttpRequestInfo request_info;
  7223. request_info.method = "GET";
  7224. request_info.url = GURL("https://www.example.org/");
  7225. request_info.traffic_annotation =
  7226. MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
  7227. stream->RegisterRequest(&request_info);
  7228. EXPECT_EQ(OK, stream->InitializeStream(true, DEFAULT_PRIORITY, net_log_,
  7229. CompletionOnceCallback()));
  7230. // Ensure that session is alive and active.
  7231. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  7232. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  7233. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  7234. MaybeMakeNewConnectionIdAvailableToSession(cid_on_new_path, session);
  7235. // Send GET request on stream.
  7236. // This should encounter a write error on network 1,
  7237. // then migrate to network 2, which encounters another write error,
  7238. // and migrate again to network 1, which encoutners one more write error.
  7239. HttpResponseInfo response;
  7240. HttpRequestHeaders request_headers;
  7241. EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
  7242. callback_.callback()));
  7243. base::RunLoop().RunUntilIdle();
  7244. // Connection is closed as there is no connection ID available yet for the
  7245. // second migration.
  7246. EXPECT_FALSE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  7247. stream.reset();
  7248. EXPECT_TRUE(socket_data1.AllReadDataConsumed());
  7249. EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
  7250. EXPECT_TRUE(failed_quic_data2.AllReadDataConsumed());
  7251. EXPECT_TRUE(failed_quic_data2.AllWriteDataConsumed());
  7252. EXPECT_TRUE(failed_quic_data1.AllReadDataConsumed());
  7253. EXPECT_TRUE(failed_quic_data1.AllWriteDataConsumed());
  7254. }
  7255. TEST_P(QuicStreamFactoryTest, MigrateSessionOnMultipleWriteErrorsSyncSync) {
  7256. TestMigrationOnMultipleWriteErrors(
  7257. /*write_error_mode_on_old_network*/ SYNCHRONOUS,
  7258. /*write_error_mode_on_new_network*/ SYNCHRONOUS);
  7259. }
  7260. TEST_P(QuicStreamFactoryTest, MigrateSessionOnMultipleWriteErrorsSyncAsync) {
  7261. TestMigrationOnMultipleWriteErrors(
  7262. /*write_error_mode_on_old_network*/ SYNCHRONOUS,
  7263. /*write_error_mode_on_new_network*/ ASYNC);
  7264. }
  7265. TEST_P(QuicStreamFactoryTest, MigrateSessionOnMultipleWriteErrorsAsyncSync) {
  7266. TestMigrationOnMultipleWriteErrors(
  7267. /*write_error_mode_on_old_network*/ ASYNC,
  7268. /*write_error_mode_on_new_network*/ SYNCHRONOUS);
  7269. }
  7270. TEST_P(QuicStreamFactoryTest, MigrateSessionOnMultipleWriteErrorsAsyncAsync) {
  7271. TestMigrationOnMultipleWriteErrors(
  7272. /*write_error_mode_on_old_network*/ ASYNC,
  7273. /*write_error_mode_on_new_network*/ ASYNC);
  7274. }
  7275. // Verifies that a connection is closed when connection migration is triggered
  7276. // on network being disconnected and the handshake is not confirmed.
  7277. // TODO(crbug.com/1347664): This test is failing on various platforms.
  7278. TEST_P(QuicStreamFactoryTest,
  7279. DISABLED_NoMigrationBeforeHandshakeOnNetworkDisconnected) {
  7280. if (!version_.UsesHttp3())
  7281. return;
  7282. InitializeConnectionMigrationV2Test(
  7283. {kDefaultNetworkForTests, kNewNetworkForTests});
  7284. // Use cold start mode to do crypto connect, and send CHLO packet on wire.
  7285. crypto_client_stream_factory_.set_handshake_mode(
  7286. MockCryptoClientStream::COLD_START_WITH_CHLO_SENT);
  7287. MockQuicData socket_data(version_);
  7288. socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  7289. socket_data.AddWrite(ASYNC, client_maker_.MakeDummyCHLOPacket(1));
  7290. socket_data.AddSocketDataToFactory(socket_factory_.get());
  7291. // Create request and QuicHttpStream.
  7292. QuicStreamRequest request(factory_.get());
  7293. EXPECT_EQ(ERR_IO_PENDING,
  7294. request.Request(
  7295. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  7296. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  7297. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  7298. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  7299. failed_on_default_network_callback_, callback_.callback()));
  7300. // Deliver the network notification, which should cause the connection to be
  7301. // closed.
  7302. scoped_mock_network_change_notifier_->mock_network_change_notifier()
  7303. ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
  7304. EXPECT_EQ(ERR_NETWORK_CHANGED, callback_.WaitForResult());
  7305. EXPECT_FALSE(HasActiveSession(scheme_host_port_));
  7306. EXPECT_FALSE(HasActiveJob(scheme_host_port_, privacy_mode_));
  7307. EXPECT_TRUE(socket_data.AllReadDataConsumed());
  7308. EXPECT_TRUE(socket_data.AllWriteDataConsumed());
  7309. }
  7310. // Sets up the connection migration test where network change notification is
  7311. // queued BEFORE connection migration attempt on write error is posted.
  7312. void QuicStreamFactoryTestBase::
  7313. TestMigrationOnNetworkNotificationWithWriteErrorQueuedLater(
  7314. bool disconnected) {
  7315. if (!version_.UsesHttp3())
  7316. return;
  7317. InitializeConnectionMigrationV2Test(
  7318. {kDefaultNetworkForTests, kNewNetworkForTests});
  7319. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  7320. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  7321. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  7322. client_maker_.set_save_packet_frames(true);
  7323. MockQuicData socket_data(version_);
  7324. socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  7325. int packet_num = 1;
  7326. socket_data.AddWrite(SYNCHRONOUS,
  7327. ConstructInitialSettingsPacket(packet_num++));
  7328. socket_data.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE);
  7329. socket_data.AddSocketDataToFactory(socket_factory_.get());
  7330. // Create request and QuicHttpStream.
  7331. QuicStreamRequest request(factory_.get());
  7332. EXPECT_EQ(ERR_IO_PENDING,
  7333. request.Request(
  7334. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  7335. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  7336. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  7337. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  7338. failed_on_default_network_callback_, callback_.callback()));
  7339. EXPECT_EQ(OK, callback_.WaitForResult());
  7340. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  7341. EXPECT_TRUE(stream.get());
  7342. // Cause QUIC stream to be created.
  7343. HttpRequestInfo request_info;
  7344. request_info.method = "GET";
  7345. request_info.url = GURL("https://www.example.org/");
  7346. request_info.traffic_annotation =
  7347. MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
  7348. stream->RegisterRequest(&request_info);
  7349. EXPECT_EQ(OK, stream->InitializeStream(true, DEFAULT_PRIORITY, net_log_,
  7350. CompletionOnceCallback()));
  7351. // Ensure that session is alive and active.
  7352. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  7353. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  7354. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  7355. quic::QuicConnectionId cid_on_new_path =
  7356. quic::test::TestConnectionId(12345678);
  7357. MaybeMakeNewConnectionIdAvailableToSession(cid_on_new_path, session);
  7358. // Set up second socket data provider that is used after
  7359. // migration. The request is rewritten to this new socket, and the
  7360. // response to the request is read on this new socket.
  7361. MockQuicData socket_data1(version_);
  7362. client_maker_.set_connection_id(cid_on_new_path);
  7363. // Increment packet number to account for packet write error on the old
  7364. // path. Also save the packet in client_maker_ for constructing the
  7365. // retransmission packet.
  7366. ConstructGetRequestPacket(packet_num++,
  7367. GetNthClientInitiatedBidirectionalStreamId(0),
  7368. /*should_include_version=*/false, /*fin=*/true);
  7369. socket_data1.AddWrite(SYNCHRONOUS,
  7370. client_maker_.MakeCombinedRetransmissionPacket(
  7371. /*original_packet_numbers=*/{1, 2}, packet_num++,
  7372. /*should_include_version=*/false));
  7373. socket_data1.AddWrite(
  7374. SYNCHRONOUS,
  7375. client_maker_.MakePingPacket(packet_num++, /*include_version=*/false));
  7376. socket_data1.AddWrite(
  7377. SYNCHRONOUS,
  7378. client_maker_.MakeRetireConnectionIdPacket(
  7379. packet_num++, /*include_version=*/false, /*sequence_number=*/0u));
  7380. socket_data1.AddRead(
  7381. ASYNC,
  7382. ConstructOkResponsePacket(
  7383. 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
  7384. socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  7385. socket_data1.AddWrite(
  7386. SYNCHRONOUS,
  7387. client_maker_.MakeDataPacket(
  7388. packet_num++, GetQpackDecoderStreamId(),
  7389. /*should_include_version=*/false,
  7390. /*fin=*/false, StreamCancellationQpackDecoderInstruction(0)));
  7391. socket_data1.AddWrite(
  7392. SYNCHRONOUS,
  7393. client_maker_.MakeRstPacket(packet_num++, false,
  7394. GetNthClientInitiatedBidirectionalStreamId(0),
  7395. quic::QUIC_STREAM_CANCELLED));
  7396. socket_data1.AddSocketDataToFactory(socket_factory_.get());
  7397. // First queue a network change notification in the message loop.
  7398. if (disconnected) {
  7399. scoped_mock_network_change_notifier_->mock_network_change_notifier()
  7400. ->QueueNetworkDisconnected(kDefaultNetworkForTests);
  7401. } else {
  7402. scoped_mock_network_change_notifier_->mock_network_change_notifier()
  7403. ->QueueNetworkMadeDefault(kNewNetworkForTests);
  7404. }
  7405. // Send GET request on stream. This should cause a write error,
  7406. // which triggers a connection migration attempt. This will queue a
  7407. // migration attempt behind the notification in the message loop.
  7408. HttpResponseInfo response;
  7409. HttpRequestHeaders request_headers;
  7410. EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
  7411. callback_.callback()));
  7412. base::RunLoop().RunUntilIdle();
  7413. // Verify the session is still alive and not marked as going away post
  7414. // migration.
  7415. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  7416. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  7417. EXPECT_EQ(1u, session->GetNumActiveStreams());
  7418. // Verify that response headers on the migrated socket were delivered to the
  7419. // stream.
  7420. EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
  7421. EXPECT_EQ(200, response.headers->response_code());
  7422. stream.reset();
  7423. EXPECT_TRUE(socket_data.AllReadDataConsumed());
  7424. EXPECT_TRUE(socket_data.AllWriteDataConsumed());
  7425. EXPECT_TRUE(socket_data1.AllReadDataConsumed());
  7426. EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
  7427. }
  7428. // This test verifies that session attempts connection migration successfully
  7429. // with signals delivered in the following order (alternate network is always
  7430. // available):
  7431. // - a notification that default network is disconnected is queued.
  7432. // - write error is triggered: session posts a task to attempt connection
  7433. // migration, |migration_pending_| set to true.
  7434. // - default network disconnected is delivered: session immediately migrates to
  7435. // the alternate network, |migration_pending_| set to false.
  7436. // - connection migration on write error attempt aborts: writer encountered
  7437. // error is no longer in active use.
  7438. TEST_P(QuicStreamFactoryTest,
  7439. MigrateOnNetworkDisconnectedWithWriteErrorQueuedLater) {
  7440. TestMigrationOnNetworkNotificationWithWriteErrorQueuedLater(
  7441. /*disconnected=*/true);
  7442. }
  7443. // This test verifies that session attempts connection migration successfully
  7444. // with signals delivered in the following order (alternate network is always
  7445. // available):
  7446. // - a notification that alternate network is made default is queued.
  7447. // - write error is triggered: session posts a task to attempt connection
  7448. // migration, block future migrations.
  7449. // - new default notification is delivered: migrate back timer spins and task is
  7450. // posted to migrate to the new default network.
  7451. // - connection migration on write error attempt proceeds successfully: session
  7452. // is
  7453. // marked as going away, future migrations unblocked.
  7454. // - migrate back to default network task executed: session is already on the
  7455. // default network, no-op.
  7456. TEST_P(QuicStreamFactoryTest,
  7457. MigrateOnWriteErrorWithNetworkMadeDefaultQueuedEarlier) {
  7458. TestMigrationOnNetworkNotificationWithWriteErrorQueuedLater(
  7459. /*disconnected=*/false);
  7460. }
  7461. // Sets up the connection migration test where network change notification is
  7462. // queued AFTER connection migration attempt on write error is posted.
  7463. void QuicStreamFactoryTestBase::
  7464. TestMigrationOnWriteErrorWithNotificationQueuedLater(bool disconnected) {
  7465. if (!version_.UsesHttp3())
  7466. return;
  7467. InitializeConnectionMigrationV2Test(
  7468. {kDefaultNetworkForTests, kNewNetworkForTests});
  7469. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  7470. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  7471. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  7472. client_maker_.set_save_packet_frames(true);
  7473. MockQuicData socket_data(version_);
  7474. socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  7475. int packet_num = 1;
  7476. socket_data.AddWrite(SYNCHRONOUS,
  7477. ConstructInitialSettingsPacket(packet_num++));
  7478. socket_data.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE);
  7479. socket_data.AddSocketDataToFactory(socket_factory_.get());
  7480. // Create request and QuicHttpStream.
  7481. QuicStreamRequest request(factory_.get());
  7482. EXPECT_EQ(ERR_IO_PENDING,
  7483. request.Request(
  7484. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  7485. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  7486. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  7487. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  7488. failed_on_default_network_callback_, callback_.callback()));
  7489. EXPECT_EQ(OK, callback_.WaitForResult());
  7490. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  7491. EXPECT_TRUE(stream.get());
  7492. // Cause QUIC stream to be created.
  7493. HttpRequestInfo request_info;
  7494. request_info.method = "GET";
  7495. request_info.url = GURL("https://www.example.org/");
  7496. request_info.traffic_annotation =
  7497. MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
  7498. stream->RegisterRequest(&request_info);
  7499. EXPECT_EQ(OK, stream->InitializeStream(true, DEFAULT_PRIORITY, net_log_,
  7500. CompletionOnceCallback()));
  7501. // Ensure that session is alive and active.
  7502. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  7503. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  7504. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  7505. quic::QuicConnectionId cid_on_new_path =
  7506. quic::test::TestConnectionId(12345678);
  7507. MaybeMakeNewConnectionIdAvailableToSession(cid_on_new_path, session);
  7508. // Set up second socket data provider that is used after
  7509. // migration. The request is rewritten to this new socket, and the
  7510. // response to the request is read on this new socket.
  7511. MockQuicData socket_data1(version_);
  7512. client_maker_.set_connection_id(cid_on_new_path);
  7513. // Increment packet number to account for packet write error on the old
  7514. // path. Also save the packet in client_maker_ for constructing the
  7515. // retransmission packet.
  7516. ConstructGetRequestPacket(packet_num++,
  7517. GetNthClientInitiatedBidirectionalStreamId(0),
  7518. /*should_include_version=*/false, /*fin=*/true);
  7519. socket_data1.AddWrite(SYNCHRONOUS,
  7520. client_maker_.MakeCombinedRetransmissionPacket(
  7521. /*original_packet_numbers=*/{1, 2}, packet_num++,
  7522. /*should_include_version=*/false));
  7523. socket_data1.AddWrite(
  7524. SYNCHRONOUS,
  7525. client_maker_.MakePingPacket(packet_num++, /*include_version=*/false));
  7526. socket_data1.AddWrite(SYNCHRONOUS,
  7527. client_maker_.MakeRetireConnectionIdPacket(
  7528. packet_num++, /*include_version=*/false,
  7529. /*sequence_number=*/0u));
  7530. socket_data1.AddRead(
  7531. ASYNC,
  7532. ConstructOkResponsePacket(
  7533. 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
  7534. socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  7535. socket_data1.AddWrite(
  7536. SYNCHRONOUS,
  7537. client_maker_.MakeDataPacket(
  7538. packet_num++, GetQpackDecoderStreamId(),
  7539. /*should_include_version=*/false,
  7540. /*fin=*/false, StreamCancellationQpackDecoderInstruction(0)));
  7541. socket_data1.AddWrite(
  7542. SYNCHRONOUS,
  7543. client_maker_.MakeRstPacket(packet_num++, false,
  7544. GetNthClientInitiatedBidirectionalStreamId(0),
  7545. quic::QUIC_STREAM_CANCELLED));
  7546. socket_data1.AddSocketDataToFactory(socket_factory_.get());
  7547. // Send GET request on stream. This should cause a write error,
  7548. // which triggers a connection migration attempt. This will queue a
  7549. // migration attempt in the message loop.
  7550. HttpResponseInfo response;
  7551. HttpRequestHeaders request_headers;
  7552. EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
  7553. callback_.callback()));
  7554. // Now queue a network change notification in the message loop behind
  7555. // the migration attempt.
  7556. if (disconnected) {
  7557. scoped_mock_network_change_notifier_->mock_network_change_notifier()
  7558. ->QueueNetworkDisconnected(kDefaultNetworkForTests);
  7559. } else {
  7560. scoped_mock_network_change_notifier_->mock_network_change_notifier()
  7561. ->QueueNetworkMadeDefault(kNewNetworkForTests);
  7562. }
  7563. base::RunLoop().RunUntilIdle();
  7564. // Verify session is still alive and not marked as going away.
  7565. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  7566. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  7567. EXPECT_EQ(1u, session->GetNumActiveStreams());
  7568. // Verify that response headers on the migrated socket were delivered to the
  7569. // stream.
  7570. EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
  7571. EXPECT_EQ(200, response.headers->response_code());
  7572. stream.reset();
  7573. EXPECT_TRUE(socket_data.AllReadDataConsumed());
  7574. EXPECT_TRUE(socket_data.AllWriteDataConsumed());
  7575. EXPECT_TRUE(socket_data1.AllReadDataConsumed());
  7576. EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
  7577. }
  7578. // This test verifies that session attempts connection migration successfully
  7579. // with signals delivered in the following order (alternate network is always
  7580. // available):
  7581. // - write error is triggered: session posts a task to complete connection
  7582. // migration.
  7583. // - a notification that alternate network is made default is queued.
  7584. // - connection migration attempt proceeds successfully, session is marked as
  7585. // going away.
  7586. // - new default notification is delivered after connection migration has been
  7587. // completed.
  7588. TEST_P(QuicStreamFactoryTest,
  7589. MigrateOnWriteErrorWithNetworkMadeDefaultQueuedLater) {
  7590. TestMigrationOnWriteErrorWithNotificationQueuedLater(/*disconnected=*/false);
  7591. }
  7592. // This test verifies that session attempts connection migration successfully
  7593. // with signals delivered in the following order (alternate network is always
  7594. // available):
  7595. // - write error is triggered: session posts a task to complete connection
  7596. // migration.
  7597. // - a notification that default network is diconnected is queued.
  7598. // - connection migration attempt proceeds successfully, session is marked as
  7599. // going away.
  7600. // - disconnect notification is delivered after connection migration has been
  7601. // completed.
  7602. TEST_P(QuicStreamFactoryTest,
  7603. MigrateOnWriteErrorWithNetworkDisconnectedQueuedLater) {
  7604. TestMigrationOnWriteErrorWithNotificationQueuedLater(/*disconnected=*/true);
  7605. }
  7606. // This tests connection migration on write error with signals delivered in the
  7607. // following order:
  7608. // - a synchronous/asynchronous write error is triggered base on
  7609. // |write_error_mode|: connection migration attempt is posted.
  7610. // - old default network disconnects, migration waits for a new network.
  7611. // - after a pause, new network is connected: session will migrate to new
  7612. // network immediately.
  7613. // - migration on writer error is exectued and aborts as writer passed in is no
  7614. // longer active in use.
  7615. // - new network is made default.
  7616. void QuicStreamFactoryTestBase::TestMigrationOnWriteErrorPauseBeforeConnected(
  7617. IoMode write_error_mode) {
  7618. if (!version_.UsesHttp3())
  7619. return;
  7620. InitializeConnectionMigrationV2Test({kDefaultNetworkForTests});
  7621. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  7622. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  7623. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  7624. client_maker_.set_save_packet_frames(true);
  7625. // Use the test task runner.
  7626. QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
  7627. MockQuicData socket_data(version_);
  7628. socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
  7629. int packet_num = 1;
  7630. socket_data.AddWrite(SYNCHRONOUS,
  7631. ConstructInitialSettingsPacket(packet_num++));
  7632. socket_data.AddWrite(write_error_mode, ERR_FAILED);
  7633. socket_data.AddSocketDataToFactory(socket_factory_.get());
  7634. // Create request and QuicHttpStream.
  7635. QuicStreamRequest request(factory_.get());
  7636. EXPECT_EQ(ERR_IO_PENDING,
  7637. request.Request(
  7638. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  7639. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  7640. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  7641. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  7642. failed_on_default_network_callback_, callback_.callback()));
  7643. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  7644. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  7645. EXPECT_TRUE(stream.get());
  7646. // Cause QUIC stream to be created.
  7647. HttpRequestInfo request_info;
  7648. request_info.method = "GET";
  7649. request_info.url = url_;
  7650. request_info.traffic_annotation =
  7651. MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
  7652. stream->RegisterRequest(&request_info);
  7653. EXPECT_EQ(OK, stream->InitializeStream(true, DEFAULT_PRIORITY, net_log_,
  7654. CompletionOnceCallback()));
  7655. // Ensure that session is alive and active.
  7656. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  7657. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  7658. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  7659. quic::QuicConnectionId cid_on_new_path =
  7660. quic::test::TestConnectionId(12345678);
  7661. MaybeMakeNewConnectionIdAvailableToSession(cid_on_new_path, session);
  7662. // Send GET request on stream.
  7663. HttpResponseInfo response;
  7664. HttpRequestHeaders request_headers;
  7665. EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
  7666. callback_.callback()));
  7667. // The connection should still be alive, not marked as going away.
  7668. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  7669. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  7670. EXPECT_EQ(1u, session->GetNumActiveStreams());
  7671. EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
  7672. // Set up second socket data provider that is used after migration.
  7673. // The response to the earlier request is read on this new socket.
  7674. MockQuicData socket_data1(version_);
  7675. client_maker_.set_connection_id(cid_on_new_path);
  7676. // Increment packet number to account for packet write error on the old
  7677. // path. Also save the packet in client_maker_ for constructing the
  7678. // retransmission packet.
  7679. ConstructGetRequestPacket(packet_num++,
  7680. GetNthClientInitiatedBidirectionalStreamId(0),
  7681. /*should_include_version=*/false, /*fin=*/true);
  7682. socket_data1.AddRead(
  7683. ASYNC,
  7684. ConstructOkResponsePacket(
  7685. 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
  7686. socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  7687. socket_data1.AddWrite(
  7688. SYNCHRONOUS, client_maker_.MakeRetransmissionAndRetireConnectionIdPacket(
  7689. packet_num++, /*include_version=*/false,
  7690. /*original_packet_numbers=*/{1, 2},
  7691. /*sequence_number=*/0u));
  7692. socket_data1.AddWrite(
  7693. SYNCHRONOUS,
  7694. client_maker_.MakePingPacket(packet_num++, /*include_version=*/false));
  7695. socket_data1.AddWrite(
  7696. SYNCHRONOUS,
  7697. client_maker_.MakeDataPacket(
  7698. packet_num++, GetQpackDecoderStreamId(),
  7699. /*should_include_version=*/false,
  7700. /*fin=*/false, StreamCancellationQpackDecoderInstruction(0)));
  7701. socket_data1.AddWrite(
  7702. SYNCHRONOUS,
  7703. client_maker_.MakeRstPacket(packet_num++, false,
  7704. GetNthClientInitiatedBidirectionalStreamId(0),
  7705. quic::QUIC_STREAM_CANCELLED));
  7706. socket_data1.AddSocketDataToFactory(socket_factory_.get());
  7707. // On a DISCONNECTED notification, nothing happens.
  7708. scoped_mock_network_change_notifier_->mock_network_change_notifier()
  7709. ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
  7710. // Add a new network and notify the stream factory of a new connected network.
  7711. // This causes a PING packet to be sent over the new network.
  7712. scoped_mock_network_change_notifier_->mock_network_change_notifier()
  7713. ->SetConnectedNetworksList({kNewNetworkForTests});
  7714. scoped_mock_network_change_notifier_->mock_network_change_notifier()
  7715. ->NotifyNetworkConnected(kNewNetworkForTests);
  7716. // Ensure that the session is still alive.
  7717. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  7718. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  7719. EXPECT_EQ(1u, session->GetNumActiveStreams());
  7720. // Run the message loop migration for write error can finish.
  7721. runner_->RunUntilIdle();
  7722. // Response headers are received over the new network.
  7723. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  7724. EXPECT_EQ(200, response.headers->response_code());
  7725. // Check that the session is still alive.
  7726. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  7727. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  7728. // There should be no posted tasks not executed, no way to migrate back to
  7729. // default network.
  7730. EXPECT_TRUE(runner_->GetPostedTasks().empty());
  7731. // Receive signal to mark new network as default.
  7732. scoped_mock_network_change_notifier_->mock_network_change_notifier()
  7733. ->NotifyNetworkMadeDefault(kNewNetworkForTests);
  7734. stream.reset();
  7735. EXPECT_TRUE(socket_data.AllReadDataConsumed());
  7736. EXPECT_TRUE(socket_data.AllWriteDataConsumed());
  7737. EXPECT_TRUE(socket_data1.AllReadDataConsumed());
  7738. EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
  7739. }
  7740. TEST_P(QuicStreamFactoryTest,
  7741. MigrateSessionOnSyncWriteErrorPauseBeforeConnected) {
  7742. TestMigrationOnWriteErrorPauseBeforeConnected(SYNCHRONOUS);
  7743. }
  7744. TEST_P(QuicStreamFactoryTest,
  7745. MigrateSessionOnAsyncWriteErrorPauseBeforeConnected) {
  7746. TestMigrationOnWriteErrorPauseBeforeConnected(ASYNC);
  7747. }
  7748. // This test verifies that when session successfully migrate to the alternate
  7749. // network, packet write error on the old writer will be ignored and will not
  7750. // trigger connection migration on write error.
  7751. TEST_P(QuicStreamFactoryTest, IgnoreWriteErrorFromOldWriterAfterMigration) {
  7752. if (!version_.UsesHttp3())
  7753. return;
  7754. InitializeConnectionMigrationV2Test(
  7755. {kDefaultNetworkForTests, kNewNetworkForTests});
  7756. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  7757. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  7758. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  7759. client_maker_.set_save_packet_frames(true);
  7760. // Using a testing task runner so that we can verify whether the migrate on
  7761. // write error task is posted.
  7762. auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
  7763. QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
  7764. MockQuicData socket_data(version_);
  7765. int packet_num = 1;
  7766. socket_data.AddWrite(SYNCHRONOUS,
  7767. ConstructInitialSettingsPacket(packet_num++));
  7768. socket_data.AddRead(ASYNC, ERR_IO_PENDING); // Pause
  7769. socket_data.AddWrite(
  7770. ASYNC, ERR_ADDRESS_UNREACHABLE,
  7771. ConstructGetRequestPacket(packet_num++,
  7772. GetNthClientInitiatedBidirectionalStreamId(0),
  7773. true, true));
  7774. socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  7775. socket_data.AddSocketDataToFactory(socket_factory_.get());
  7776. // Create request and QuicHttpStream.
  7777. QuicStreamRequest request(factory_.get());
  7778. EXPECT_EQ(ERR_IO_PENDING,
  7779. request.Request(
  7780. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  7781. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  7782. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  7783. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  7784. failed_on_default_network_callback_, callback_.callback()));
  7785. EXPECT_EQ(OK, callback_.WaitForResult());
  7786. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  7787. EXPECT_TRUE(stream.get());
  7788. // Cause QUIC stream to be created.
  7789. HttpRequestInfo request_info;
  7790. request_info.method = "GET";
  7791. request_info.url = GURL("https://www.example.org/");
  7792. request_info.traffic_annotation =
  7793. MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
  7794. stream->RegisterRequest(&request_info);
  7795. EXPECT_EQ(OK, stream->InitializeStream(true, DEFAULT_PRIORITY, net_log_,
  7796. CompletionOnceCallback()));
  7797. // Ensure that session is alive and active.
  7798. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  7799. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  7800. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  7801. quic::QuicConnectionId cid_on_new_path =
  7802. quic::test::TestConnectionId(12345678);
  7803. MaybeMakeNewConnectionIdAvailableToSession(cid_on_new_path, session);
  7804. // Set up second socket data provider that is used after
  7805. // migration. The response to the request is read on this new socket.
  7806. MockQuicData socket_data1(version_);
  7807. client_maker_.set_connection_id(cid_on_new_path);
  7808. socket_data1.AddWrite(SYNCHRONOUS,
  7809. client_maker_.MakeCombinedRetransmissionPacket(
  7810. {1, 2}, packet_num++, true));
  7811. socket_data1.AddWrite(
  7812. SYNCHRONOUS,
  7813. client_maker_.MakePingPacket(packet_num++, /*include_version=*/false));
  7814. socket_data1.AddRead(
  7815. ASYNC,
  7816. ConstructOkResponsePacket(
  7817. 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
  7818. socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  7819. socket_data1.AddWrite(
  7820. SYNCHRONOUS,
  7821. client_maker_.MakeDataPacket(
  7822. packet_num++, GetQpackDecoderStreamId(),
  7823. /*should_include_version=*/false,
  7824. /*fin=*/false, StreamCancellationQpackDecoderInstruction(0)));
  7825. socket_data1.AddWrite(
  7826. SYNCHRONOUS,
  7827. client_maker_.MakeRstPacket(packet_num++, false,
  7828. GetNthClientInitiatedBidirectionalStreamId(0),
  7829. quic::QUIC_STREAM_CANCELLED));
  7830. socket_data1.AddSocketDataToFactory(socket_factory_.get());
  7831. // Send GET request on stream.
  7832. HttpResponseInfo response;
  7833. HttpRequestHeaders request_headers;
  7834. EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
  7835. callback_.callback()));
  7836. EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
  7837. // Now notify network is disconnected, cause the migration to complete
  7838. // immediately.
  7839. scoped_mock_network_change_notifier_->mock_network_change_notifier()
  7840. ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
  7841. // There will be two pending task, one will complete migration with no delay
  7842. // and the other will attempt to migrate back to the default network with
  7843. // delay.
  7844. EXPECT_EQ(2u, task_runner->GetPendingTaskCount());
  7845. // Complete migration.
  7846. task_runner->RunUntilIdle();
  7847. EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
  7848. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  7849. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  7850. EXPECT_EQ(1u, session->GetNumActiveStreams());
  7851. // Verify that response headers on the migrated socket were delivered to the
  7852. // stream.
  7853. EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
  7854. EXPECT_EQ(200, response.headers->response_code());
  7855. // Resume the old socket data, a write error will be delivered to the old
  7856. // packet writer. Verify no additional task is posted.
  7857. socket_data.Resume();
  7858. EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
  7859. stream.reset();
  7860. EXPECT_TRUE(socket_data.AllWriteDataConsumed());
  7861. EXPECT_TRUE(socket_data1.AllReadDataConsumed());
  7862. EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
  7863. }
  7864. // This test verifies that when session successfully migrate to the alternate
  7865. // network, packet read error on the old reader will be ignored and will not
  7866. // close the connection.
  7867. TEST_P(QuicStreamFactoryTest, IgnoreReadErrorFromOldReaderAfterMigration) {
  7868. if (!version_.UsesHttp3())
  7869. return;
  7870. InitializeConnectionMigrationV2Test(
  7871. {kDefaultNetworkForTests, kNewNetworkForTests});
  7872. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  7873. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  7874. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  7875. client_maker_.set_save_packet_frames(true);
  7876. // Using a testing task runner.
  7877. auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
  7878. QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
  7879. MockQuicData socket_data(version_);
  7880. int packet_num = 1;
  7881. socket_data.AddWrite(SYNCHRONOUS,
  7882. ConstructInitialSettingsPacket(packet_num++));
  7883. socket_data.AddRead(ASYNC, ERR_IO_PENDING); // Pause
  7884. socket_data.AddRead(ASYNC, ERR_ADDRESS_UNREACHABLE);
  7885. socket_data.AddSocketDataToFactory(socket_factory_.get());
  7886. // Create request and QuicHttpStream.
  7887. QuicStreamRequest request(factory_.get());
  7888. EXPECT_EQ(ERR_IO_PENDING,
  7889. request.Request(
  7890. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  7891. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  7892. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  7893. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  7894. failed_on_default_network_callback_, callback_.callback()));
  7895. EXPECT_EQ(OK, callback_.WaitForResult());
  7896. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  7897. EXPECT_TRUE(stream.get());
  7898. // Cause QUIC stream to be created.
  7899. HttpRequestInfo request_info;
  7900. request_info.method = "GET";
  7901. request_info.url = GURL("https://www.example.org/");
  7902. request_info.traffic_annotation =
  7903. MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
  7904. stream->RegisterRequest(&request_info);
  7905. EXPECT_EQ(OK, stream->InitializeStream(true, DEFAULT_PRIORITY, net_log_,
  7906. CompletionOnceCallback()));
  7907. // Ensure that session is alive and active.
  7908. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  7909. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  7910. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  7911. quic::QuicConnectionId cid_on_new_path =
  7912. quic::test::TestConnectionId(12345678);
  7913. MaybeMakeNewConnectionIdAvailableToSession(cid_on_new_path, session);
  7914. // Set up second socket data provider that is used after
  7915. // migration. The request is written to this new socket, and the
  7916. // response to the request is read on this new socket.
  7917. MockQuicData socket_data1(version_);
  7918. client_maker_.set_connection_id(cid_on_new_path);
  7919. socket_data1.AddWrite(SYNCHRONOUS, client_maker_.MakeRetransmissionPacket(
  7920. 1, packet_num++, true));
  7921. socket_data1.AddWrite(
  7922. SYNCHRONOUS,
  7923. client_maker_.MakePingPacket(packet_num++, /*include_version=*/false));
  7924. socket_data1.AddWrite(
  7925. SYNCHRONOUS,
  7926. ConstructGetRequestPacket(packet_num++,
  7927. GetNthClientInitiatedBidirectionalStreamId(0),
  7928. true, true));
  7929. socket_data1.AddWrite(SYNCHRONOUS, client_maker_.MakeRetireConnectionIdPacket(
  7930. packet_num++, /*include_version=*/true,
  7931. /*sequence_number=*/0u));
  7932. socket_data1.AddRead(
  7933. ASYNC,
  7934. ConstructOkResponsePacket(
  7935. 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
  7936. socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  7937. socket_data1.AddWrite(
  7938. SYNCHRONOUS,
  7939. client_maker_.MakeDataPacket(
  7940. packet_num++, GetQpackDecoderStreamId(),
  7941. /*should_include_version=*/false,
  7942. /*fin=*/false, StreamCancellationQpackDecoderInstruction(0)));
  7943. socket_data1.AddWrite(
  7944. SYNCHRONOUS,
  7945. client_maker_.MakeRstPacket(packet_num++, false,
  7946. GetNthClientInitiatedBidirectionalStreamId(0),
  7947. quic::QUIC_STREAM_CANCELLED));
  7948. socket_data1.AddSocketDataToFactory(socket_factory_.get());
  7949. EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
  7950. // Now notify network is disconnected, cause the migration to complete
  7951. // immediately.
  7952. scoped_mock_network_change_notifier_->mock_network_change_notifier()
  7953. ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
  7954. // There will be two pending task, one will complete migration with no delay
  7955. // and the other will attempt to migrate back to the default network with
  7956. // delay.
  7957. EXPECT_EQ(2u, task_runner->GetPendingTaskCount());
  7958. // Complete migration.
  7959. task_runner->RunUntilIdle();
  7960. EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
  7961. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  7962. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  7963. EXPECT_EQ(1u, session->GetNumActiveStreams());
  7964. // Send GET request on stream.
  7965. HttpResponseInfo response;
  7966. HttpRequestHeaders request_headers;
  7967. EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
  7968. callback_.callback()));
  7969. // Verify that response headers on the migrated socket were delivered to the
  7970. // stream.
  7971. EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
  7972. EXPECT_EQ(OK, callback_.WaitForResult());
  7973. EXPECT_EQ(200, response.headers->response_code());
  7974. // Resume the old socket data, a read error will be delivered to the old
  7975. // packet reader. Verify that the session is not affected.
  7976. socket_data.Resume();
  7977. EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
  7978. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  7979. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  7980. EXPECT_EQ(1u, session->GetNumActiveStreams());
  7981. stream.reset();
  7982. EXPECT_TRUE(socket_data.AllReadDataConsumed());
  7983. EXPECT_TRUE(socket_data.AllWriteDataConsumed());
  7984. EXPECT_TRUE(socket_data1.AllReadDataConsumed());
  7985. EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
  7986. }
  7987. // This test verifies that after migration on network is executed, packet
  7988. // read error on the old reader will be ignored and will not close the
  7989. // connection.
  7990. TEST_P(QuicStreamFactoryTest, IgnoreReadErrorOnOldReaderDuringMigration) {
  7991. if (!version_.UsesHttp3())
  7992. return;
  7993. InitializeConnectionMigrationV2Test(
  7994. {kDefaultNetworkForTests, kNewNetworkForTests});
  7995. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  7996. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  7997. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  7998. client_maker_.set_save_packet_frames(true);
  7999. // Using a testing task runner.
  8000. auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
  8001. QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
  8002. MockQuicData socket_data(version_);
  8003. int packet_num = 1;
  8004. socket_data.AddWrite(SYNCHRONOUS,
  8005. ConstructInitialSettingsPacket(packet_num++));
  8006. socket_data.AddRead(ASYNC, ERR_IO_PENDING); // Pause
  8007. socket_data.AddRead(ASYNC, ERR_ADDRESS_UNREACHABLE);
  8008. socket_data.AddSocketDataToFactory(socket_factory_.get());
  8009. // Create request and QuicHttpStream.
  8010. QuicStreamRequest request(factory_.get());
  8011. EXPECT_EQ(ERR_IO_PENDING,
  8012. request.Request(
  8013. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  8014. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  8015. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  8016. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  8017. failed_on_default_network_callback_, callback_.callback()));
  8018. EXPECT_EQ(OK, callback_.WaitForResult());
  8019. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  8020. EXPECT_TRUE(stream.get());
  8021. // Cause QUIC stream to be created.
  8022. HttpRequestInfo request_info;
  8023. request_info.method = "GET";
  8024. request_info.url = GURL("https://www.example.org/");
  8025. request_info.traffic_annotation =
  8026. MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
  8027. stream->RegisterRequest(&request_info);
  8028. EXPECT_EQ(OK, stream->InitializeStream(true, DEFAULT_PRIORITY, net_log_,
  8029. CompletionOnceCallback()));
  8030. // Ensure that session is alive and active.
  8031. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  8032. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  8033. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  8034. quic::QuicConnectionId cid_on_new_path =
  8035. quic::test::TestConnectionId(12345678);
  8036. MaybeMakeNewConnectionIdAvailableToSession(cid_on_new_path, session);
  8037. // Set up second socket data provider that is used after
  8038. // migration. The request is written to this new socket, and the
  8039. // response to the request is read on this new socket.
  8040. MockQuicData socket_data1(version_);
  8041. client_maker_.set_connection_id(cid_on_new_path);
  8042. socket_data1.AddWrite(SYNCHRONOUS, client_maker_.MakeRetransmissionPacket(
  8043. 1, packet_num++, true));
  8044. socket_data1.AddWrite(
  8045. SYNCHRONOUS,
  8046. client_maker_.MakePingPacket(packet_num++, /*include_version=*/false));
  8047. socket_data1.AddWrite(
  8048. SYNCHRONOUS,
  8049. ConstructGetRequestPacket(packet_num++,
  8050. GetNthClientInitiatedBidirectionalStreamId(0),
  8051. true, true));
  8052. socket_data1.AddWrite(SYNCHRONOUS,
  8053. client_maker_.MakeRetireConnectionIdPacket(
  8054. packet_num++, /*include_version=*/false,
  8055. /*sequence_number=*/0u));
  8056. socket_data1.AddRead(
  8057. ASYNC,
  8058. ConstructOkResponsePacket(
  8059. 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
  8060. socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  8061. socket_data1.AddWrite(
  8062. SYNCHRONOUS,
  8063. client_maker_.MakeDataPacket(
  8064. packet_num++, GetQpackDecoderStreamId(),
  8065. /*should_include_version=*/false,
  8066. /*fin=*/false, StreamCancellationQpackDecoderInstruction(0)));
  8067. socket_data1.AddWrite(
  8068. SYNCHRONOUS,
  8069. client_maker_.MakeRstPacket(packet_num++, false,
  8070. GetNthClientInitiatedBidirectionalStreamId(0),
  8071. quic::QUIC_STREAM_CANCELLED));
  8072. socket_data1.AddSocketDataToFactory(socket_factory_.get());
  8073. EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
  8074. // Now notify network is disconnected, cause the migration to complete
  8075. // immediately.
  8076. scoped_mock_network_change_notifier_->mock_network_change_notifier()
  8077. ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
  8078. // There will be two pending task, one will complete migration with no delay
  8079. // and the other will attempt to migrate back to the default network with
  8080. // delay.
  8081. EXPECT_EQ(2u, task_runner->GetPendingTaskCount());
  8082. // Resume the old socket data, a read error will be delivered to the old
  8083. // packet reader. Verify that the session is not affected.
  8084. socket_data.Resume();
  8085. EXPECT_EQ(2u, task_runner->GetPendingTaskCount());
  8086. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  8087. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  8088. EXPECT_EQ(1u, session->GetNumActiveStreams());
  8089. // Complete migration.
  8090. task_runner->RunUntilIdle();
  8091. EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
  8092. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  8093. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  8094. EXPECT_EQ(1u, session->GetNumActiveStreams());
  8095. // Send GET request on stream.
  8096. HttpResponseInfo response;
  8097. HttpRequestHeaders request_headers;
  8098. EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
  8099. callback_.callback()));
  8100. // Verify that response headers on the migrated socket were delivered to the
  8101. // stream.
  8102. EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
  8103. EXPECT_EQ(OK, callback_.WaitForResult());
  8104. EXPECT_EQ(200, response.headers->response_code());
  8105. stream.reset();
  8106. EXPECT_TRUE(socket_data.AllWriteDataConsumed());
  8107. EXPECT_TRUE(socket_data1.AllReadDataConsumed());
  8108. EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
  8109. }
  8110. // This test verifies that when connection migration on path degrading is
  8111. // enabled, and no custom retransmittable on wire timeout is specified, the
  8112. // default value is used.
  8113. TEST_P(QuicStreamFactoryTest, DefaultRetransmittableOnWireTimeoutForMigration) {
  8114. if (!version_.UsesHttp3())
  8115. return;
  8116. InitializeConnectionMigrationV2Test(
  8117. {kDefaultNetworkForTests, kNewNetworkForTests});
  8118. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  8119. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  8120. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  8121. client_maker_.set_save_packet_frames(true);
  8122. // Using a testing task runner.
  8123. auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
  8124. QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
  8125. QuicStreamFactoryPeer::SetAlarmFactory(
  8126. factory_.get(), std::make_unique<QuicChromiumAlarmFactory>(
  8127. task_runner.get(), context_.clock()));
  8128. quic::QuicConnectionId cid_on_new_path =
  8129. quic::test::TestConnectionId(12345678);
  8130. MockQuicData socket_data(version_);
  8131. int packet_num = 1;
  8132. int peer_packet_num = 1;
  8133. socket_data.AddWrite(SYNCHRONOUS,
  8134. ConstructInitialSettingsPacket(packet_num++));
  8135. socket_data.AddRead(
  8136. ASYNC, server_maker_.MakeNewConnectionIdPacket(
  8137. peer_packet_num++, /*include_version=*/false, cid_on_new_path,
  8138. /*sequence_number=*/1u,
  8139. /*retire_prior_to=*/0u));
  8140. socket_data.AddRead(ASYNC, ERR_IO_PENDING); // Pause
  8141. socket_data.AddRead(ASYNC, ERR_ADDRESS_UNREACHABLE);
  8142. socket_data.AddSocketDataToFactory(socket_factory_.get());
  8143. // Set up second socket data provider that is used after
  8144. // migration. The request is written to this new socket, and the
  8145. // response to the request is read on this new socket.
  8146. MockQuicData socket_data1(version_);
  8147. client_maker_.set_connection_id(cid_on_new_path);
  8148. socket_data1.AddWrite(SYNCHRONOUS,
  8149. client_maker_.MakeAckAndRetransmissionPacket(
  8150. packet_num++, /*first_received=*/1,
  8151. /*largest_received=*/1, /*smallest_received=*/1,
  8152. /*original_packet_numbers=*/{1}));
  8153. // The PING packet sent post migration.
  8154. socket_data1.AddWrite(SYNCHRONOUS,
  8155. client_maker_.MakePingPacket(packet_num++, true));
  8156. socket_data1.AddWrite(
  8157. SYNCHRONOUS,
  8158. client_maker_.MakeRetireConnectionIdPacket(
  8159. packet_num++, /*include_version=*/false, /*sequence_number=*/0u));
  8160. socket_data1.AddWrite(
  8161. SYNCHRONOUS,
  8162. ConstructGetRequestPacket(packet_num++,
  8163. GetNthClientInitiatedBidirectionalStreamId(0),
  8164. true, true));
  8165. socket_data1.AddRead(ASYNC, ERR_IO_PENDING); // Pause.
  8166. // Read two packets so that client will send ACK immediately.
  8167. socket_data1.AddRead(
  8168. ASYNC, ConstructOkResponsePacket(
  8169. peer_packet_num++,
  8170. GetNthClientInitiatedBidirectionalStreamId(0), false, false));
  8171. socket_data1.AddRead(ASYNC, server_maker_.MakeDataPacket(
  8172. peer_packet_num++,
  8173. GetNthClientInitiatedBidirectionalStreamId(0),
  8174. false, false, "Hello World"));
  8175. // Read an ACK from server which acks all client data.
  8176. socket_data1.AddRead(SYNCHRONOUS, server_maker_.MakeAckPacket(
  8177. peer_packet_num++, packet_num, 1));
  8178. socket_data1.AddWrite(
  8179. ASYNC, client_maker_.MakeAckPacket(packet_num++, peer_packet_num - 2, 1));
  8180. // The PING packet sent for retransmittable on wire.
  8181. socket_data1.AddWrite(SYNCHRONOUS,
  8182. client_maker_.MakePingPacket(packet_num++, false));
  8183. socket_data1.AddRead(ASYNC, ERR_IO_PENDING); // Pause.
  8184. std::string header = ConstructDataHeader(6);
  8185. socket_data1.AddRead(
  8186. ASYNC, ConstructServerDataPacket(
  8187. 3, GetNthClientInitiatedBidirectionalStreamId(0), false, true,
  8188. header + "hello!"));
  8189. socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read.
  8190. socket_data1.AddWrite(
  8191. SYNCHRONOUS, client_maker_.MakeDataPacket(
  8192. packet_num++, GetQpackDecoderStreamId(), true, false,
  8193. StreamCancellationQpackDecoderInstruction(0)));
  8194. socket_data1.AddWrite(
  8195. SYNCHRONOUS,
  8196. client_maker_.MakeRstPacket(packet_num++, false,
  8197. GetNthClientInitiatedBidirectionalStreamId(0),
  8198. quic::QUIC_STREAM_CANCELLED));
  8199. socket_data1.AddSocketDataToFactory(socket_factory_.get());
  8200. // Create request and QuicHttpStream.
  8201. QuicStreamRequest request(factory_.get());
  8202. EXPECT_EQ(ERR_IO_PENDING,
  8203. request.Request(
  8204. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  8205. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  8206. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  8207. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  8208. failed_on_default_network_callback_, callback_.callback()));
  8209. EXPECT_EQ(OK, callback_.WaitForResult());
  8210. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  8211. EXPECT_TRUE(stream.get());
  8212. // Cause QUIC stream to be created.
  8213. HttpRequestInfo request_info;
  8214. request_info.method = "GET";
  8215. request_info.url = GURL("https://www.example.org/");
  8216. request_info.traffic_annotation =
  8217. MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
  8218. stream->RegisterRequest(&request_info);
  8219. EXPECT_EQ(OK, stream->InitializeStream(true, DEFAULT_PRIORITY, net_log_,
  8220. CompletionOnceCallback()));
  8221. // Ensure that session is alive and active.
  8222. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  8223. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  8224. // Now notify network is disconnected, cause the migration to complete
  8225. // immediately.
  8226. scoped_mock_network_change_notifier_->mock_network_change_notifier()
  8227. ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
  8228. // Complete migration.
  8229. task_runner->RunUntilIdle();
  8230. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  8231. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  8232. EXPECT_EQ(1u, session->GetNumActiveStreams());
  8233. // Send GET request on stream.
  8234. HttpResponseInfo response;
  8235. HttpRequestHeaders request_headers;
  8236. EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
  8237. callback_.callback()));
  8238. socket_data1.Resume();
  8239. // Spin up the message loop to read incoming data from server till the ACK.
  8240. base::RunLoop().RunUntilIdle();
  8241. // Fire the ping alarm with retransmittable-on-wire timeout, send PING.
  8242. context_.AdvanceTime(quic::QuicTime::Delta::FromMilliseconds(
  8243. kDefaultRetransmittableOnWireTimeout.InMilliseconds()));
  8244. task_runner->FastForwardBy(kDefaultRetransmittableOnWireTimeout);
  8245. socket_data1.Resume();
  8246. // Verify that response headers on the migrated socket were delivered to the
  8247. // stream.
  8248. EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
  8249. EXPECT_EQ(200, response.headers->response_code());
  8250. // Resume the old socket data, a read error will be delivered to the old
  8251. // packet reader. Verify that the session is not affected.
  8252. socket_data.Resume();
  8253. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  8254. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  8255. EXPECT_EQ(1u, session->GetNumActiveStreams());
  8256. stream.reset();
  8257. EXPECT_TRUE(socket_data.AllReadDataConsumed());
  8258. EXPECT_TRUE(socket_data.AllWriteDataConsumed());
  8259. EXPECT_TRUE(socket_data1.AllReadDataConsumed());
  8260. EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
  8261. }
  8262. // This test verifies that when connection migration on path degrading is
  8263. // enabled, and a custom retransmittable on wire timeout is specified, the
  8264. // custom value is used.
  8265. TEST_P(QuicStreamFactoryTest, CustomRetransmittableOnWireTimeoutForMigration) {
  8266. if (!version_.UsesHttp3())
  8267. return;
  8268. constexpr base::TimeDelta custom_timeout_value = base::Milliseconds(200);
  8269. quic_params_->retransmittable_on_wire_timeout = custom_timeout_value;
  8270. InitializeConnectionMigrationV2Test(
  8271. {kDefaultNetworkForTests, kNewNetworkForTests});
  8272. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  8273. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  8274. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  8275. client_maker_.set_save_packet_frames(true);
  8276. // Using a testing task runner.
  8277. auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
  8278. QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
  8279. QuicStreamFactoryPeer::SetAlarmFactory(
  8280. factory_.get(), std::make_unique<QuicChromiumAlarmFactory>(
  8281. task_runner.get(), context_.clock()));
  8282. quic::QuicConnectionId cid_on_new_path =
  8283. quic::test::TestConnectionId(12345678);
  8284. MockQuicData socket_data(version_);
  8285. int packet_num = 1;
  8286. int peer_packet_num = 1;
  8287. socket_data.AddWrite(SYNCHRONOUS,
  8288. ConstructInitialSettingsPacket(packet_num++));
  8289. socket_data.AddRead(
  8290. ASYNC, server_maker_.MakeNewConnectionIdPacket(
  8291. peer_packet_num++, /*include_version=*/false, cid_on_new_path,
  8292. /*sequence_number=*/1u,
  8293. /*retire_prior_to=*/0u));
  8294. socket_data.AddRead(ASYNC, ERR_IO_PENDING); // Pause
  8295. socket_data.AddRead(ASYNC, ERR_ADDRESS_UNREACHABLE);
  8296. socket_data.AddSocketDataToFactory(socket_factory_.get());
  8297. // Set up second socket data provider that is used after
  8298. // migration. The request is written to this new socket, and the
  8299. // response to the request is read on this new socket.
  8300. MockQuicData socket_data1(version_);
  8301. client_maker_.set_connection_id(cid_on_new_path);
  8302. socket_data1.AddWrite(SYNCHRONOUS,
  8303. client_maker_.MakeAckAndRetransmissionPacket(
  8304. packet_num++, /*first_received=*/1,
  8305. /*largest_received=*/1, /*smallest_received=*/1,
  8306. /*original_packet_numbers=*/{1}));
  8307. // The PING packet sent post migration.
  8308. socket_data1.AddWrite(SYNCHRONOUS,
  8309. client_maker_.MakePingPacket(packet_num++, true));
  8310. socket_data1.AddWrite(SYNCHRONOUS,
  8311. client_maker_.MakeRetireConnectionIdPacket(
  8312. packet_num++, /*include_version=*/false,
  8313. /*sequence_number=*/0u));
  8314. socket_data1.AddWrite(
  8315. SYNCHRONOUS,
  8316. ConstructGetRequestPacket(packet_num++,
  8317. GetNthClientInitiatedBidirectionalStreamId(0),
  8318. true, true));
  8319. socket_data1.AddRead(ASYNC, ERR_IO_PENDING); // Pause.
  8320. // Read two packets so that client will send ACK immedaitely.
  8321. socket_data1.AddRead(
  8322. ASYNC, ConstructOkResponsePacket(
  8323. peer_packet_num++,
  8324. GetNthClientInitiatedBidirectionalStreamId(0), false, false));
  8325. socket_data1.AddRead(ASYNC, server_maker_.MakeDataPacket(
  8326. peer_packet_num++,
  8327. GetNthClientInitiatedBidirectionalStreamId(0),
  8328. /*should_include_version=*/false, /*fin=*/false, "Hello World"));
  8329. // Read an ACK from server which acks all client data.
  8330. socket_data1.AddRead(SYNCHRONOUS, server_maker_.MakeAckPacket(
  8331. peer_packet_num++, packet_num, 1));
  8332. socket_data1.AddWrite(
  8333. ASYNC, client_maker_.MakeAckPacket(packet_num++, peer_packet_num - 2, 1));
  8334. // The PING packet sent for retransmittable on wire.
  8335. socket_data1.AddWrite(SYNCHRONOUS,
  8336. client_maker_.MakePingPacket(packet_num++, false));
  8337. socket_data1.AddRead(ASYNC, ERR_IO_PENDING); // Pause.
  8338. std::string header = ConstructDataHeader(6);
  8339. socket_data1.AddRead(
  8340. ASYNC, ConstructServerDataPacket(
  8341. 3, GetNthClientInitiatedBidirectionalStreamId(0), false, true,
  8342. header + "hello!"));
  8343. socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read.
  8344. socket_data1.AddWrite(
  8345. SYNCHRONOUS, client_maker_.MakeDataPacket(
  8346. packet_num++, GetQpackDecoderStreamId(), true, false,
  8347. StreamCancellationQpackDecoderInstruction(0)));
  8348. socket_data1.AddWrite(
  8349. SYNCHRONOUS,
  8350. client_maker_.MakeRstPacket(packet_num++, false,
  8351. GetNthClientInitiatedBidirectionalStreamId(0),
  8352. quic::QUIC_STREAM_CANCELLED));
  8353. socket_data1.AddSocketDataToFactory(socket_factory_.get());
  8354. // Create request and QuicHttpStream.
  8355. QuicStreamRequest request(factory_.get());
  8356. EXPECT_EQ(ERR_IO_PENDING,
  8357. request.Request(
  8358. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  8359. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  8360. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  8361. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  8362. failed_on_default_network_callback_, callback_.callback()));
  8363. EXPECT_EQ(OK, callback_.WaitForResult());
  8364. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  8365. EXPECT_TRUE(stream.get());
  8366. // Cause QUIC stream to be created.
  8367. HttpRequestInfo request_info;
  8368. request_info.method = "GET";
  8369. request_info.url = GURL("https://www.example.org/");
  8370. request_info.traffic_annotation =
  8371. MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
  8372. stream->RegisterRequest(&request_info);
  8373. EXPECT_EQ(OK, stream->InitializeStream(true, DEFAULT_PRIORITY, net_log_,
  8374. CompletionOnceCallback()));
  8375. // Ensure that session is alive and active.
  8376. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  8377. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  8378. // Now notify network is disconnected, cause the migration to complete
  8379. // immediately.
  8380. scoped_mock_network_change_notifier_->mock_network_change_notifier()
  8381. ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
  8382. // Complete migration.
  8383. task_runner->RunUntilIdle();
  8384. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  8385. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  8386. EXPECT_EQ(1u, session->GetNumActiveStreams());
  8387. // Send GET request on stream.
  8388. HttpResponseInfo response;
  8389. HttpRequestHeaders request_headers;
  8390. EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
  8391. callback_.callback()));
  8392. socket_data1.Resume();
  8393. // Spin up the message loop to read incoming data from server till the ACK.
  8394. base::RunLoop().RunUntilIdle();
  8395. // Fire the ping alarm with retransmittable-on-wire timeout, send PING.
  8396. context_.AdvanceTime(quic::QuicTime::Delta::FromMilliseconds(
  8397. custom_timeout_value.InMilliseconds()));
  8398. task_runner->FastForwardBy(custom_timeout_value);
  8399. socket_data1.Resume();
  8400. // Verify that response headers on the migrated socket were delivered to the
  8401. // stream.
  8402. EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
  8403. EXPECT_EQ(200, response.headers->response_code());
  8404. // Resume the old socket data, a read error will be delivered to the old
  8405. // packet reader. Verify that the session is not affected.
  8406. socket_data.Resume();
  8407. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  8408. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  8409. EXPECT_EQ(1u, session->GetNumActiveStreams());
  8410. stream.reset();
  8411. EXPECT_TRUE(socket_data.AllReadDataConsumed());
  8412. EXPECT_TRUE(socket_data.AllWriteDataConsumed());
  8413. EXPECT_TRUE(socket_data1.AllReadDataConsumed());
  8414. EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
  8415. }
  8416. // This test verifies that when no migration is enabled, but a custom value for
  8417. // retransmittable-on-wire timeout is specified, the ping alarm is set up to
  8418. // send retransmittable pings with the custom value.
  8419. TEST_P(QuicStreamFactoryTest, CustomRetransmittableOnWireTimeout) {
  8420. constexpr base::TimeDelta custom_timeout_value = base::Milliseconds(200);
  8421. quic_params_->retransmittable_on_wire_timeout = custom_timeout_value;
  8422. Initialize();
  8423. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  8424. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  8425. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  8426. // Using a testing task runner.
  8427. auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
  8428. QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
  8429. QuicStreamFactoryPeer::SetAlarmFactory(
  8430. factory_.get(), std::make_unique<QuicChromiumAlarmFactory>(
  8431. task_runner.get(), context_.clock()));
  8432. MockQuicData socket_data1(version_);
  8433. int packet_num = 1;
  8434. if (VersionUsesHttp3(version_.transport_version)) {
  8435. socket_data1.AddWrite(SYNCHRONOUS,
  8436. ConstructInitialSettingsPacket(packet_num++));
  8437. }
  8438. socket_data1.AddWrite(
  8439. SYNCHRONOUS,
  8440. ConstructGetRequestPacket(packet_num++,
  8441. GetNthClientInitiatedBidirectionalStreamId(0),
  8442. true, true));
  8443. socket_data1.AddRead(ASYNC, ERR_IO_PENDING); // Pause.
  8444. // Read two packets so that client will send ACK immedaitely.
  8445. socket_data1.AddRead(
  8446. ASYNC,
  8447. ConstructOkResponsePacket(
  8448. 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
  8449. socket_data1.AddRead(
  8450. ASYNC, server_maker_.MakeDataPacket(
  8451. 2, GetNthClientInitiatedBidirectionalStreamId(0), false, false,
  8452. "Hello World"));
  8453. // Read an ACK from server which acks all client data.
  8454. socket_data1.AddRead(SYNCHRONOUS, server_maker_.MakeAckPacket(3, 2, 1));
  8455. socket_data1.AddWrite(ASYNC, client_maker_.MakeAckPacket(packet_num++, 2, 1));
  8456. // The PING packet sent for retransmittable on wire.
  8457. socket_data1.AddWrite(SYNCHRONOUS,
  8458. client_maker_.MakePingPacket(packet_num++, false));
  8459. socket_data1.AddRead(ASYNC, ERR_IO_PENDING); // Pause.
  8460. std::string header = ConstructDataHeader(6);
  8461. socket_data1.AddRead(
  8462. ASYNC, ConstructServerDataPacket(
  8463. 3, GetNthClientInitiatedBidirectionalStreamId(0), false, true,
  8464. header + "hello!"));
  8465. socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read.
  8466. if (VersionUsesHttp3(version_.transport_version)) {
  8467. socket_data1.AddWrite(
  8468. SYNCHRONOUS, client_maker_.MakeDataPacket(
  8469. packet_num++, GetQpackDecoderStreamId(), true, false,
  8470. StreamCancellationQpackDecoderInstruction(0)));
  8471. }
  8472. socket_data1.AddWrite(
  8473. SYNCHRONOUS,
  8474. client_maker_.MakeRstPacket(packet_num++, false,
  8475. GetNthClientInitiatedBidirectionalStreamId(0),
  8476. quic::QUIC_STREAM_CANCELLED));
  8477. socket_data1.AddSocketDataToFactory(socket_factory_.get());
  8478. // Create request and QuicHttpStream.
  8479. QuicStreamRequest request(factory_.get());
  8480. EXPECT_EQ(ERR_IO_PENDING,
  8481. request.Request(
  8482. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  8483. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  8484. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  8485. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  8486. failed_on_default_network_callback_, callback_.callback()));
  8487. EXPECT_EQ(OK, callback_.WaitForResult());
  8488. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  8489. EXPECT_TRUE(stream.get());
  8490. // Cause QUIC stream to be created.
  8491. HttpRequestInfo request_info;
  8492. request_info.method = "GET";
  8493. request_info.url = GURL("https://www.example.org/");
  8494. request_info.traffic_annotation =
  8495. MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
  8496. stream->RegisterRequest(&request_info);
  8497. EXPECT_EQ(OK, stream->InitializeStream(true, DEFAULT_PRIORITY, net_log_,
  8498. CompletionOnceCallback()));
  8499. // Ensure that session is alive and active.
  8500. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  8501. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  8502. // Complete migration.
  8503. task_runner->RunUntilIdle();
  8504. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  8505. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  8506. EXPECT_EQ(1u, session->GetNumActiveStreams());
  8507. // Send GET request on stream.
  8508. HttpResponseInfo response;
  8509. HttpRequestHeaders request_headers;
  8510. EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
  8511. callback_.callback()));
  8512. socket_data1.Resume();
  8513. // Spin up the message loop to read incoming data from server till the ACK.
  8514. base::RunLoop().RunUntilIdle();
  8515. // Fire the ping alarm with retransmittable-on-wire timeout, send PING.
  8516. context_.AdvanceTime(quic::QuicTime::Delta::FromMilliseconds(
  8517. custom_timeout_value.InMilliseconds()));
  8518. task_runner->FastForwardBy(custom_timeout_value);
  8519. socket_data1.Resume();
  8520. // Verify that response headers on the migrated socket were delivered to the
  8521. // stream.
  8522. EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
  8523. EXPECT_EQ(200, response.headers->response_code());
  8524. // Resume the old socket data, a read error will be delivered to the old
  8525. // packet reader. Verify that the session is not affected.
  8526. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  8527. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  8528. EXPECT_EQ(1u, session->GetNumActiveStreams());
  8529. stream.reset();
  8530. EXPECT_TRUE(socket_data1.AllReadDataConsumed());
  8531. EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
  8532. }
  8533. // This test verifies that when no migration is enabled, and no custom value
  8534. // for retransmittable-on-wire timeout is specified, the ping alarm will not
  8535. // send any retransmittable pings.
  8536. TEST_P(QuicStreamFactoryTest, NoRetransmittableOnWireTimeout) {
  8537. // Use non-default initial srtt so that if QPACK emits additional setting
  8538. // packet, it will not have the same retransmission timeout as the
  8539. // default value of retransmittable-on-wire-ping timeout.
  8540. ServerNetworkStats stats;
  8541. stats.srtt = base::Milliseconds(200);
  8542. http_server_properties_->SetServerNetworkStats(url::SchemeHostPort(url_),
  8543. NetworkIsolationKey(), stats);
  8544. quic_params_->estimate_initial_rtt = true;
  8545. Initialize();
  8546. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  8547. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  8548. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  8549. // Using a testing task runner.
  8550. auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
  8551. QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
  8552. QuicStreamFactoryPeer::SetAlarmFactory(
  8553. factory_.get(), std::make_unique<QuicChromiumAlarmFactory>(
  8554. task_runner.get(), context_.clock()));
  8555. MockQuicData socket_data1(version_);
  8556. int packet_num = 1;
  8557. if (VersionUsesHttp3(version_.transport_version)) {
  8558. socket_data1.AddWrite(SYNCHRONOUS,
  8559. ConstructInitialSettingsPacket(packet_num++));
  8560. }
  8561. socket_data1.AddWrite(
  8562. SYNCHRONOUS,
  8563. ConstructGetRequestPacket(packet_num++,
  8564. GetNthClientInitiatedBidirectionalStreamId(0),
  8565. true, true));
  8566. socket_data1.AddRead(ASYNC, ERR_IO_PENDING); // Pause.
  8567. // Read two packets so that client will send ACK immedaitely.
  8568. socket_data1.AddRead(
  8569. ASYNC,
  8570. ConstructOkResponsePacket(
  8571. 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
  8572. socket_data1.AddRead(
  8573. ASYNC, server_maker_.MakeDataPacket(
  8574. 2, GetNthClientInitiatedBidirectionalStreamId(0), false, false,
  8575. "Hello World"));
  8576. // Read an ACK from server which acks all client data.
  8577. socket_data1.AddRead(SYNCHRONOUS, server_maker_.MakeAckPacket(3, 2, 1));
  8578. socket_data1.AddWrite(ASYNC, client_maker_.MakeAckPacket(packet_num++, 2, 1));
  8579. std::string header = ConstructDataHeader(6);
  8580. socket_data1.AddRead(
  8581. ASYNC, ConstructServerDataPacket(
  8582. 3, GetNthClientInitiatedBidirectionalStreamId(0), false, true,
  8583. header + "hello!"));
  8584. socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read.
  8585. if (VersionUsesHttp3(version_.transport_version)) {
  8586. socket_data1.AddWrite(
  8587. SYNCHRONOUS, client_maker_.MakeDataPacket(
  8588. packet_num++, GetQpackDecoderStreamId(), true, false,
  8589. StreamCancellationQpackDecoderInstruction(0)));
  8590. }
  8591. socket_data1.AddWrite(
  8592. SYNCHRONOUS,
  8593. client_maker_.MakeRstPacket(packet_num++, false,
  8594. GetNthClientInitiatedBidirectionalStreamId(0),
  8595. quic::QUIC_STREAM_CANCELLED));
  8596. socket_data1.AddSocketDataToFactory(socket_factory_.get());
  8597. // Create request and QuicHttpStream.
  8598. QuicStreamRequest request(factory_.get());
  8599. EXPECT_EQ(ERR_IO_PENDING,
  8600. request.Request(
  8601. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  8602. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  8603. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  8604. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  8605. failed_on_default_network_callback_, callback_.callback()));
  8606. EXPECT_EQ(OK, callback_.WaitForResult());
  8607. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  8608. EXPECT_TRUE(stream.get());
  8609. // Cause QUIC stream to be created.
  8610. HttpRequestInfo request_info;
  8611. request_info.method = "GET";
  8612. request_info.url = GURL("https://www.example.org/");
  8613. request_info.traffic_annotation =
  8614. MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
  8615. stream->RegisterRequest(&request_info);
  8616. EXPECT_EQ(OK, stream->InitializeStream(true, DEFAULT_PRIORITY, net_log_,
  8617. CompletionOnceCallback()));
  8618. // Ensure that session is alive and active.
  8619. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  8620. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  8621. // Complete migration.
  8622. task_runner->RunUntilIdle();
  8623. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  8624. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  8625. EXPECT_EQ(1u, session->GetNumActiveStreams());
  8626. // Send GET request on stream.
  8627. HttpResponseInfo response;
  8628. HttpRequestHeaders request_headers;
  8629. EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
  8630. callback_.callback()));
  8631. socket_data1.Resume();
  8632. // Spin up the message loop to read incoming data from server till the ACK.
  8633. base::RunLoop().RunUntilIdle();
  8634. // Verify the ping alarm is set, but not with the default timeout.
  8635. const quic::QuicAlarm* const ping_alarm =
  8636. quic::test::QuicConnectionPeer::GetPingAlarm(session->connection());
  8637. ASSERT_TRUE(ping_alarm);
  8638. ASSERT_TRUE(ping_alarm->IsSet());
  8639. quic::QuicTime::Delta delay =
  8640. ping_alarm->deadline() - context_.clock()->ApproximateNow();
  8641. EXPECT_NE(kDefaultRetransmittableOnWireTimeout.InMilliseconds(),
  8642. delay.ToMilliseconds());
  8643. // Verify that response headers on the migrated socket were delivered to the
  8644. // stream.
  8645. EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
  8646. EXPECT_EQ(200, response.headers->response_code());
  8647. // Resume the old socket data, a read error will be delivered to the old
  8648. // packet reader. Verify that the session is not affected.
  8649. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  8650. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  8651. EXPECT_EQ(1u, session->GetNumActiveStreams());
  8652. stream.reset();
  8653. EXPECT_TRUE(socket_data1.AllReadDataConsumed());
  8654. EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
  8655. }
  8656. // This test verifies that when only migration on network change is enabled, and
  8657. // a custom value for retransmittable-on-wire is specified, the ping alarm will
  8658. // send retransmittable pings to the peer with custom value.
  8659. TEST_P(QuicStreamFactoryTest,
  8660. CustomRetransmittableOnWireTimeoutWithMigrationOnNetworkChangeOnly) {
  8661. if (!version_.UsesHttp3())
  8662. return;
  8663. constexpr base::TimeDelta custom_timeout_value = base::Milliseconds(200);
  8664. quic_params_->retransmittable_on_wire_timeout = custom_timeout_value;
  8665. quic_params_->migrate_sessions_on_network_change_v2 = true;
  8666. Initialize();
  8667. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  8668. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  8669. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  8670. // Using a testing task runner.
  8671. auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
  8672. QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
  8673. QuicStreamFactoryPeer::SetAlarmFactory(
  8674. factory_.get(), std::make_unique<QuicChromiumAlarmFactory>(
  8675. task_runner.get(), context_.clock()));
  8676. MockQuicData socket_data1(version_);
  8677. int packet_num = 1;
  8678. socket_data1.AddWrite(SYNCHRONOUS,
  8679. ConstructInitialSettingsPacket(packet_num++));
  8680. socket_data1.AddWrite(
  8681. SYNCHRONOUS,
  8682. ConstructGetRequestPacket(packet_num++,
  8683. GetNthClientInitiatedBidirectionalStreamId(0),
  8684. true, true));
  8685. socket_data1.AddRead(ASYNC, ERR_IO_PENDING); // Pause.
  8686. // Read two packets so that client will send ACK immedaitely.
  8687. socket_data1.AddRead(
  8688. ASYNC,
  8689. ConstructOkResponsePacket(
  8690. 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
  8691. socket_data1.AddRead(
  8692. ASYNC, server_maker_.MakeDataPacket(
  8693. 2, GetNthClientInitiatedBidirectionalStreamId(0), false, false,
  8694. "Hello World"));
  8695. // Read an ACK from server which acks all client data.
  8696. socket_data1.AddRead(SYNCHRONOUS, server_maker_.MakeAckPacket(3, 2, 1));
  8697. socket_data1.AddWrite(ASYNC, client_maker_.MakeAckPacket(packet_num++, 2, 1));
  8698. // The PING packet sent for retransmittable on wire.
  8699. socket_data1.AddWrite(SYNCHRONOUS,
  8700. client_maker_.MakePingPacket(packet_num++, false));
  8701. socket_data1.AddRead(ASYNC, ERR_IO_PENDING); // Pause.
  8702. std::string header = ConstructDataHeader(6);
  8703. socket_data1.AddRead(
  8704. ASYNC, ConstructServerDataPacket(
  8705. 3, GetNthClientInitiatedBidirectionalStreamId(0), false, true,
  8706. header + "hello!"));
  8707. socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read.
  8708. socket_data1.AddWrite(
  8709. SYNCHRONOUS, client_maker_.MakeDataPacket(
  8710. packet_num++, GetQpackDecoderStreamId(), true, false,
  8711. StreamCancellationQpackDecoderInstruction(0)));
  8712. socket_data1.AddWrite(
  8713. SYNCHRONOUS,
  8714. client_maker_.MakeRstPacket(packet_num++, false,
  8715. GetNthClientInitiatedBidirectionalStreamId(0),
  8716. quic::QUIC_STREAM_CANCELLED));
  8717. socket_data1.AddSocketDataToFactory(socket_factory_.get());
  8718. // Create request and QuicHttpStream.
  8719. QuicStreamRequest request(factory_.get());
  8720. EXPECT_EQ(ERR_IO_PENDING,
  8721. request.Request(
  8722. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  8723. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  8724. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  8725. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  8726. failed_on_default_network_callback_, callback_.callback()));
  8727. EXPECT_EQ(OK, callback_.WaitForResult());
  8728. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  8729. EXPECT_TRUE(stream.get());
  8730. // Cause QUIC stream to be created.
  8731. HttpRequestInfo request_info;
  8732. request_info.method = "GET";
  8733. request_info.url = GURL("https://www.example.org/");
  8734. request_info.traffic_annotation =
  8735. MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
  8736. stream->RegisterRequest(&request_info);
  8737. EXPECT_EQ(OK, stream->InitializeStream(true, DEFAULT_PRIORITY, net_log_,
  8738. CompletionOnceCallback()));
  8739. // Ensure that session is alive and active.
  8740. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  8741. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  8742. // Complete migration.
  8743. task_runner->RunUntilIdle();
  8744. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  8745. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  8746. EXPECT_EQ(1u, session->GetNumActiveStreams());
  8747. // Send GET request on stream.
  8748. HttpResponseInfo response;
  8749. HttpRequestHeaders request_headers;
  8750. EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
  8751. callback_.callback()));
  8752. socket_data1.Resume();
  8753. // Spin up the message loop to read incoming data from server till the ACK.
  8754. base::RunLoop().RunUntilIdle();
  8755. // Fire the ping alarm with retransmittable-on-wire timeout, send PING.
  8756. context_.AdvanceTime(quic::QuicTime::Delta::FromMilliseconds(
  8757. custom_timeout_value.InMilliseconds()));
  8758. task_runner->FastForwardBy(custom_timeout_value);
  8759. socket_data1.Resume();
  8760. // Verify that response headers on the migrated socket were delivered to the
  8761. // stream.
  8762. EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
  8763. EXPECT_EQ(200, response.headers->response_code());
  8764. // Resume the old socket data, a read error will be delivered to the old
  8765. // packet reader. Verify that the session is not affected.
  8766. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  8767. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  8768. EXPECT_EQ(1u, session->GetNumActiveStreams());
  8769. stream.reset();
  8770. EXPECT_TRUE(socket_data1.AllReadDataConsumed());
  8771. EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
  8772. }
  8773. // This test verifies that when only migration on network change is enabled, and
  8774. // no custom value for retransmittable-on-wire is specified, the ping alarm will
  8775. // NOT send retransmittable pings to the peer with custom value.
  8776. TEST_P(QuicStreamFactoryTest,
  8777. NoRetransmittableOnWireTimeoutWithMigrationOnNetworkChangeOnly) {
  8778. if (!version_.UsesHttp3())
  8779. return;
  8780. // Use non-default initial srtt so that if QPACK emits additional setting
  8781. // packet, it will not have the same retransmission timeout as the
  8782. // default value of retransmittable-on-wire-ping timeout.
  8783. ServerNetworkStats stats;
  8784. stats.srtt = base::Milliseconds(200);
  8785. http_server_properties_->SetServerNetworkStats(url::SchemeHostPort(url_),
  8786. NetworkIsolationKey(), stats);
  8787. quic_params_->estimate_initial_rtt = true;
  8788. quic_params_->migrate_sessions_on_network_change_v2 = true;
  8789. Initialize();
  8790. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  8791. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  8792. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  8793. // Using a testing task runner.
  8794. auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
  8795. QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
  8796. QuicStreamFactoryPeer::SetAlarmFactory(
  8797. factory_.get(), std::make_unique<QuicChromiumAlarmFactory>(
  8798. task_runner.get(), context_.clock()));
  8799. MockQuicData socket_data1(version_);
  8800. int packet_num = 1;
  8801. socket_data1.AddWrite(SYNCHRONOUS,
  8802. ConstructInitialSettingsPacket(packet_num++));
  8803. socket_data1.AddWrite(
  8804. SYNCHRONOUS,
  8805. ConstructGetRequestPacket(packet_num++,
  8806. GetNthClientInitiatedBidirectionalStreamId(0),
  8807. true, true));
  8808. socket_data1.AddRead(ASYNC, ERR_IO_PENDING); // Pause.
  8809. // Read two packets so that client will send ACK immedaitely.
  8810. socket_data1.AddRead(
  8811. ASYNC,
  8812. ConstructOkResponsePacket(
  8813. 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
  8814. socket_data1.AddRead(
  8815. ASYNC, server_maker_.MakeDataPacket(
  8816. 2, GetNthClientInitiatedBidirectionalStreamId(0), false, false,
  8817. "Hello World"));
  8818. // Read an ACK from server which acks all client data.
  8819. socket_data1.AddRead(SYNCHRONOUS, server_maker_.MakeAckPacket(3, 2, 1));
  8820. socket_data1.AddWrite(ASYNC, client_maker_.MakeAckPacket(packet_num++, 2, 1));
  8821. std::string header = ConstructDataHeader(6);
  8822. socket_data1.AddRead(
  8823. ASYNC, ConstructServerDataPacket(
  8824. 3, GetNthClientInitiatedBidirectionalStreamId(0), false, true,
  8825. header + "hello!"));
  8826. socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // No more data to read.
  8827. socket_data1.AddWrite(
  8828. SYNCHRONOUS, client_maker_.MakeDataPacket(
  8829. packet_num++, GetQpackDecoderStreamId(), true, false,
  8830. StreamCancellationQpackDecoderInstruction(0)));
  8831. socket_data1.AddWrite(
  8832. SYNCHRONOUS,
  8833. client_maker_.MakeRstPacket(packet_num++, false,
  8834. GetNthClientInitiatedBidirectionalStreamId(0),
  8835. quic::QUIC_STREAM_CANCELLED));
  8836. socket_data1.AddSocketDataToFactory(socket_factory_.get());
  8837. // Create request and QuicHttpStream.
  8838. QuicStreamRequest request(factory_.get());
  8839. EXPECT_EQ(ERR_IO_PENDING,
  8840. request.Request(
  8841. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  8842. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  8843. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  8844. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  8845. failed_on_default_network_callback_, callback_.callback()));
  8846. EXPECT_EQ(OK, callback_.WaitForResult());
  8847. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  8848. EXPECT_TRUE(stream.get());
  8849. // Cause QUIC stream to be created.
  8850. HttpRequestInfo request_info;
  8851. request_info.method = "GET";
  8852. request_info.url = GURL("https://www.example.org/");
  8853. request_info.traffic_annotation =
  8854. MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
  8855. stream->RegisterRequest(&request_info);
  8856. EXPECT_EQ(OK, stream->InitializeStream(true, DEFAULT_PRIORITY, net_log_,
  8857. CompletionOnceCallback()));
  8858. // Ensure that session is alive and active.
  8859. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  8860. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  8861. // Complete migration.
  8862. task_runner->RunUntilIdle();
  8863. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  8864. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  8865. EXPECT_EQ(1u, session->GetNumActiveStreams());
  8866. // Send GET request on stream.
  8867. HttpResponseInfo response;
  8868. HttpRequestHeaders request_headers;
  8869. EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
  8870. callback_.callback()));
  8871. socket_data1.Resume();
  8872. // Spin up the message loop to read incoming data from server till the ACK.
  8873. base::RunLoop().RunUntilIdle();
  8874. // Verify the ping alarm is set, but not with the default timeout.
  8875. const quic::QuicAlarm* const ping_alarm =
  8876. quic::test::QuicConnectionPeer::GetPingAlarm(session->connection());
  8877. ASSERT_TRUE(ping_alarm);
  8878. ASSERT_TRUE(ping_alarm->IsSet());
  8879. quic::QuicTime::Delta delay =
  8880. ping_alarm->deadline() - context_.clock()->ApproximateNow();
  8881. EXPECT_NE(kDefaultRetransmittableOnWireTimeout.InMilliseconds(),
  8882. delay.ToMilliseconds());
  8883. // Verify that response headers on the migrated socket were delivered to the
  8884. // stream.
  8885. EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
  8886. EXPECT_EQ(200, response.headers->response_code());
  8887. // Resume the old socket data, a read error will be delivered to the old
  8888. // packet reader. Verify that the session is not affected.
  8889. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  8890. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  8891. EXPECT_EQ(1u, session->GetNumActiveStreams());
  8892. stream.reset();
  8893. EXPECT_TRUE(socket_data1.AllReadDataConsumed());
  8894. EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
  8895. }
  8896. // This test verifies that after migration on write error is posted, packet
  8897. // read error on the old reader will be ignored and will not close the
  8898. // connection.
  8899. TEST_P(QuicStreamFactoryTest,
  8900. IgnoreReadErrorOnOldReaderDuringPendingMigrationOnWriteError) {
  8901. if (!version_.UsesHttp3())
  8902. return;
  8903. InitializeConnectionMigrationV2Test(
  8904. {kDefaultNetworkForTests, kNewNetworkForTests});
  8905. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  8906. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  8907. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  8908. client_maker_.set_save_packet_frames(true);
  8909. // Using a testing task runner.
  8910. auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
  8911. QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
  8912. MockQuicData socket_data(version_);
  8913. int packet_num = 1;
  8914. socket_data.AddWrite(SYNCHRONOUS,
  8915. ConstructInitialSettingsPacket(packet_num++));
  8916. socket_data.AddWrite(ASYNC, ERR_FAILED); // Write error.
  8917. socket_data.AddRead(ASYNC, ERR_ADDRESS_UNREACHABLE); // Read error.
  8918. socket_data.AddSocketDataToFactory(socket_factory_.get());
  8919. // Create request and QuicHttpStream.
  8920. QuicStreamRequest request(factory_.get());
  8921. EXPECT_EQ(ERR_IO_PENDING,
  8922. request.Request(
  8923. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  8924. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  8925. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  8926. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  8927. failed_on_default_network_callback_, callback_.callback()));
  8928. EXPECT_EQ(OK, callback_.WaitForResult());
  8929. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  8930. EXPECT_TRUE(stream.get());
  8931. // Cause QUIC stream to be created.
  8932. HttpRequestInfo request_info;
  8933. request_info.method = "GET";
  8934. request_info.url = GURL("https://www.example.org/");
  8935. request_info.traffic_annotation =
  8936. MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
  8937. stream->RegisterRequest(&request_info);
  8938. EXPECT_EQ(OK, stream->InitializeStream(true, DEFAULT_PRIORITY, net_log_,
  8939. CompletionOnceCallback()));
  8940. // Ensure that session is alive and active.
  8941. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  8942. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  8943. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  8944. quic::QuicConnectionId cid_on_new_path =
  8945. quic::test::TestConnectionId(12345678);
  8946. MaybeMakeNewConnectionIdAvailableToSession(cid_on_new_path, session);
  8947. // Set up second socket data provider that is used after
  8948. // migration. The request is written to this new socket, and the
  8949. // response to the request is read on this new socket.
  8950. MockQuicData socket_data1(version_);
  8951. client_maker_.set_connection_id(cid_on_new_path);
  8952. ConstructGetRequestPacket(packet_num++,
  8953. GetNthClientInitiatedBidirectionalStreamId(0),
  8954. /*should_include_version=*/true, /*fin=*/true);
  8955. socket_data1.AddWrite(ASYNC,
  8956. client_maker_.MakeCombinedRetransmissionPacket(
  8957. /*original_packet_numbers=*/{1, 2}, packet_num++,
  8958. /*should_include_version=*/false));
  8959. socket_data1.AddRead(
  8960. ASYNC,
  8961. ConstructOkResponsePacket(
  8962. 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
  8963. socket_data1.AddRead(ASYNC, ERR_IO_PENDING); // Pause.
  8964. socket_data1.AddRead(ASYNC, ERR_FAILED); // Read error to close connection.
  8965. socket_data1.AddSocketDataToFactory(socket_factory_.get());
  8966. EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
  8967. // Send GET request on stream.
  8968. HttpResponseInfo response;
  8969. HttpRequestHeaders request_headers;
  8970. EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
  8971. callback_.callback()));
  8972. // Run the message loop to complete asynchronous write and read with errors.
  8973. base::RunLoop().RunUntilIdle();
  8974. // There will be one pending task to complete migration on write error.
  8975. // Verify session is not closed with read error.
  8976. EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
  8977. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  8978. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  8979. EXPECT_EQ(1u, session->GetNumActiveStreams());
  8980. // Complete migration.
  8981. task_runner->RunUntilIdle();
  8982. // There will be one more task posted attempting to migrate back to the
  8983. // default network.
  8984. EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
  8985. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  8986. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  8987. EXPECT_EQ(1u, session->GetNumActiveStreams());
  8988. // Verify that response headers on the migrated socket were delivered to the
  8989. // stream.
  8990. EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
  8991. EXPECT_EQ(200, response.headers->response_code());
  8992. // Resume to consume the read error on new socket, which will close
  8993. // the connection.
  8994. socket_data1.Resume();
  8995. EXPECT_TRUE(socket_data.AllReadDataConsumed());
  8996. EXPECT_TRUE(socket_data.AllWriteDataConsumed());
  8997. EXPECT_TRUE(socket_data1.AllReadDataConsumed());
  8998. EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
  8999. }
  9000. // Migrate on asynchronous write error, old network disconnects after alternate
  9001. // network connects.
  9002. TEST_P(QuicStreamFactoryTest,
  9003. MigrateSessionOnWriteErrorWithDisconnectAfterConnectAsync) {
  9004. TestMigrationOnWriteErrorWithMultipleNotifications(
  9005. ASYNC, /*disconnect_before_connect*/ false);
  9006. }
  9007. // Migrate on synchronous write error, old network disconnects after alternate
  9008. // network connects.
  9009. TEST_P(QuicStreamFactoryTest,
  9010. MigrateSessionOnWriteErrorWithDisconnectAfterConnectSync) {
  9011. TestMigrationOnWriteErrorWithMultipleNotifications(
  9012. SYNCHRONOUS, /*disconnect_before_connect*/ false);
  9013. }
  9014. // Migrate on asynchronous write error, old network disconnects before alternate
  9015. // network connects.
  9016. TEST_P(QuicStreamFactoryTest,
  9017. MigrateSessionOnWriteErrorWithDisconnectBeforeConnectAsync) {
  9018. TestMigrationOnWriteErrorWithMultipleNotifications(
  9019. ASYNC, /*disconnect_before_connect*/ true);
  9020. }
  9021. // Migrate on synchronous write error, old network disconnects before alternate
  9022. // network connects.
  9023. TEST_P(QuicStreamFactoryTest,
  9024. MigrateSessionOnWriteErrorWithDisconnectBeforeConnectSync) {
  9025. TestMigrationOnWriteErrorWithMultipleNotifications(
  9026. SYNCHRONOUS, /*disconnect_before_connect*/ true);
  9027. }
  9028. // Sets up test which verifies that session successfully migrate to alternate
  9029. // network with signals delivered in the following order:
  9030. // *NOTE* Signal (A) and (B) can reverse order based on
  9031. // |disconnect_before_connect|.
  9032. // - (No alternate network is connected) session connects to
  9033. // kDefaultNetworkForTests.
  9034. // - An async/sync write error is encountered based on |write_error_mode|:
  9035. // session posted task to migrate session on write error.
  9036. // - Posted task is executed, miration moves to pending state due to lack of
  9037. // alternate network.
  9038. // - (A) An alternate network is connected, pending migration completes.
  9039. // - (B) Old default network disconnects, no migration will be attempted as
  9040. // session has already migrate to the alternate network.
  9041. // - The alternate network is made default.
  9042. void QuicStreamFactoryTestBase::
  9043. TestMigrationOnWriteErrorWithMultipleNotifications(
  9044. IoMode write_error_mode,
  9045. bool disconnect_before_connect) {
  9046. if (!version_.UsesHttp3())
  9047. return;
  9048. InitializeConnectionMigrationV2Test({kDefaultNetworkForTests});
  9049. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  9050. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  9051. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  9052. client_maker_.set_save_packet_frames(true);
  9053. MockQuicData socket_data(version_);
  9054. socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  9055. int packet_num = 1;
  9056. socket_data.AddWrite(SYNCHRONOUS,
  9057. ConstructInitialSettingsPacket(packet_num++));
  9058. socket_data.AddWrite(write_error_mode, ERR_FAILED); // Write error.
  9059. socket_data.AddSocketDataToFactory(socket_factory_.get());
  9060. // Create request and QuicHttpStream.
  9061. QuicStreamRequest request(factory_.get());
  9062. EXPECT_EQ(ERR_IO_PENDING,
  9063. request.Request(
  9064. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  9065. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  9066. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  9067. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  9068. failed_on_default_network_callback_, callback_.callback()));
  9069. EXPECT_EQ(OK, callback_.WaitForResult());
  9070. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  9071. EXPECT_TRUE(stream.get());
  9072. // Cause QUIC stream to be created.
  9073. HttpRequestInfo request_info;
  9074. request_info.method = "GET";
  9075. request_info.url = GURL("https://www.example.org/");
  9076. request_info.traffic_annotation =
  9077. MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
  9078. stream->RegisterRequest(&request_info);
  9079. EXPECT_EQ(OK, stream->InitializeStream(true, DEFAULT_PRIORITY, net_log_,
  9080. CompletionOnceCallback()));
  9081. // Ensure that session is alive and active.
  9082. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  9083. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  9084. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  9085. quic::QuicConnectionId cid_on_new_path =
  9086. quic::test::TestConnectionId(12345678);
  9087. MaybeMakeNewConnectionIdAvailableToSession(cid_on_new_path, session);
  9088. // Send GET request on stream. This should cause a write error, which triggers
  9089. // a connection migration attempt.
  9090. HttpResponseInfo response;
  9091. HttpRequestHeaders request_headers;
  9092. EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
  9093. callback_.callback()));
  9094. // Run the message loop so that posted task to migrate to socket will be
  9095. // executed. A new task will be posted to wait for a new network.
  9096. base::RunLoop().RunUntilIdle();
  9097. // In this particular code path, the network will not yet be marked
  9098. // as going away and the session will still be alive.
  9099. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  9100. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  9101. EXPECT_EQ(1u, session->GetNumActiveStreams());
  9102. EXPECT_EQ(ERR_IO_PENDING, stream->ReadResponseHeaders(callback_.callback()));
  9103. // Set up second socket data provider that is used after
  9104. // migration. The request is rewritten to this new socket, and the
  9105. // response to the request is read on this new socket.
  9106. MockQuicData socket_data1(version_);
  9107. client_maker_.set_connection_id(cid_on_new_path);
  9108. // Increment packet number to account for packet write error on the old
  9109. // path. Also save the packet in client_maker_ for constructing the
  9110. // retransmission packet.
  9111. ConstructGetRequestPacket(packet_num++,
  9112. GetNthClientInitiatedBidirectionalStreamId(0),
  9113. /*should_include_version=*/false, /*fin=*/true);
  9114. socket_data1.AddRead(
  9115. ASYNC,
  9116. ConstructOkResponsePacket(
  9117. 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
  9118. socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  9119. socket_data1.AddWrite(ASYNC,
  9120. client_maker_.MakeCombinedRetransmissionPacket(
  9121. /*original_packet_numbers=*/{1, 2}, packet_num++,
  9122. /*should_include_version=*/false));
  9123. socket_data1.AddWrite(
  9124. SYNCHRONOUS,
  9125. client_maker_.MakeRetireConnectionIdPacket(
  9126. packet_num++, /*include_version=*/false, /*sequence_number=*/0u));
  9127. socket_data1.AddWrite(
  9128. SYNCHRONOUS,
  9129. client_maker_.MakeDataPacket(
  9130. packet_num++, GetQpackDecoderStreamId(),
  9131. /*should_include_version=*/false,
  9132. /*fin=*/false, StreamCancellationQpackDecoderInstruction(0)));
  9133. socket_data1.AddWrite(
  9134. SYNCHRONOUS,
  9135. client_maker_.MakeRstPacket(packet_num++, false,
  9136. GetNthClientInitiatedBidirectionalStreamId(0),
  9137. quic::QUIC_STREAM_CANCELLED));
  9138. socket_data1.AddSocketDataToFactory(socket_factory_.get());
  9139. scoped_mock_network_change_notifier_->mock_network_change_notifier()
  9140. ->SetConnectedNetworksList(
  9141. {kDefaultNetworkForTests, kNewNetworkForTests});
  9142. if (disconnect_before_connect) {
  9143. // Now deliver a DISCONNECT notification.
  9144. scoped_mock_network_change_notifier_->mock_network_change_notifier()
  9145. ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
  9146. // Now deliver a CONNECTED notification and completes migration.
  9147. scoped_mock_network_change_notifier_->mock_network_change_notifier()
  9148. ->NotifyNetworkConnected(kNewNetworkForTests);
  9149. } else {
  9150. // Now deliver a CONNECTED notification and completes migration.
  9151. scoped_mock_network_change_notifier_->mock_network_change_notifier()
  9152. ->NotifyNetworkConnected(kNewNetworkForTests);
  9153. // Now deliver a DISCONNECT notification.
  9154. scoped_mock_network_change_notifier_->mock_network_change_notifier()
  9155. ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
  9156. }
  9157. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  9158. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  9159. EXPECT_EQ(1u, session->GetNumActiveStreams());
  9160. // This is the callback for the response headers that returned
  9161. // pending previously, because no result was available. Check that
  9162. // the result is now available due to the successful migration.
  9163. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  9164. EXPECT_EQ(200, response.headers->response_code());
  9165. // Deliver a MADEDEFAULT notification.
  9166. scoped_mock_network_change_notifier_->mock_network_change_notifier()
  9167. ->NotifyNetworkMadeDefault(kNewNetworkForTests);
  9168. QuicStreamRequest request2(factory_.get());
  9169. EXPECT_EQ(OK,
  9170. request2.Request(
  9171. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  9172. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  9173. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  9174. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  9175. failed_on_default_network_callback_, callback_.callback()));
  9176. std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
  9177. EXPECT_TRUE(stream2.get());
  9178. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  9179. EXPECT_EQ(session, GetActiveSession(scheme_host_port_));
  9180. stream.reset();
  9181. stream2.reset();
  9182. EXPECT_TRUE(socket_data.AllReadDataConsumed());
  9183. EXPECT_TRUE(socket_data.AllWriteDataConsumed());
  9184. EXPECT_TRUE(socket_data1.AllReadDataConsumed());
  9185. EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
  9186. }
  9187. // This test verifies after session migrates off the default network, it keeps
  9188. // retrying migrate back to the default network until successfully gets on the
  9189. // default network or the idle migration period threshold is exceeded.
  9190. // The default threshold is 30s.
  9191. TEST_P(QuicStreamFactoryTest, DefaultIdleMigrationPeriod) {
  9192. if (!version_.UsesHttp3())
  9193. return;
  9194. quic_params_->migrate_idle_sessions = true;
  9195. InitializeConnectionMigrationV2Test(
  9196. {kDefaultNetworkForTests, kNewNetworkForTests});
  9197. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  9198. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  9199. client_maker_.set_save_packet_frames(true);
  9200. // Using a testing task runner and a test tick tock.
  9201. auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
  9202. QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
  9203. QuicStreamFactoryPeer::SetTickClock(factory_.get(),
  9204. task_runner->GetMockTickClock());
  9205. quic::QuicConnectionId cid1 = quic::test::TestConnectionId(1234567);
  9206. quic::QuicConnectionId cid2 = quic::test::TestConnectionId(2345671);
  9207. quic::QuicConnectionId cid3 = quic::test::TestConnectionId(3456712);
  9208. quic::QuicConnectionId cid4 = quic::test::TestConnectionId(4567123);
  9209. quic::QuicConnectionId cid5 = quic::test::TestConnectionId(5671234);
  9210. quic::QuicConnectionId cid6 = quic::test::TestConnectionId(6712345);
  9211. quic::QuicConnectionId cid7 = quic::test::TestConnectionId(7123456);
  9212. int peer_packet_num = 1;
  9213. MockQuicData default_socket_data(version_);
  9214. default_socket_data.AddRead(
  9215. SYNCHRONOUS, server_maker_.MakeNewConnectionIdPacket(
  9216. peer_packet_num++, /*include_version=*/false, cid1,
  9217. /*sequence_number=*/1u,
  9218. /*retire_prior_to=*/0u));
  9219. default_socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  9220. int packet_num = 1;
  9221. default_socket_data.AddWrite(SYNCHRONOUS,
  9222. ConstructInitialSettingsPacket(packet_num++));
  9223. default_socket_data.AddSocketDataToFactory(socket_factory_.get());
  9224. // Set up second socket data provider that is used after migration.
  9225. MockQuicData alternate_socket_data(version_);
  9226. client_maker_.set_connection_id(cid1);
  9227. alternate_socket_data.AddWrite(SYNCHRONOUS,
  9228. client_maker_.MakeAckAndRetransmissionPacket(
  9229. packet_num++,
  9230. /*first_received=*/1,
  9231. /*largest_received=*/peer_packet_num - 1,
  9232. /*smallest_received=*/1,
  9233. /*original_packet_numbers=*/{1}));
  9234. alternate_socket_data.AddWrite(
  9235. SYNCHRONOUS,
  9236. client_maker_.MakePingPacket(packet_num++, /*include_version=*/false));
  9237. alternate_socket_data.AddWrite(
  9238. ASYNC,
  9239. client_maker_.MakeRetireConnectionIdPacket(
  9240. packet_num++, /*include_version=*/false, /*sequence_number=*/0u));
  9241. alternate_socket_data.AddRead(
  9242. ASYNC, server_maker_.MakeNewConnectionIdPacket(
  9243. peer_packet_num++, /*include_version=*/false, cid2,
  9244. /*sequence_number=*/2u,
  9245. /*retire_prior_to=*/1u));
  9246. ++packet_num; // Probing packet on default network encounters write error.
  9247. alternate_socket_data.AddWrite(
  9248. ASYNC, client_maker_.MakeAckAndRetireConnectionIdPacket(
  9249. packet_num++, /*include_version=*/false,
  9250. /*largest_received=*/peer_packet_num - 1,
  9251. /*smallest_received=*/1,
  9252. /*sequence_number=*/2u));
  9253. alternate_socket_data.AddRead(ASYNC, ERR_IO_PENDING); // Pause.
  9254. alternate_socket_data.AddRead(
  9255. ASYNC, server_maker_.MakeNewConnectionIdPacket(
  9256. peer_packet_num++, /*include_version=*/false, cid3,
  9257. /*sequence_number=*/3u,
  9258. /*retire_prior_to=*/1u));
  9259. ++packet_num; // Probing packet on default network encounters write error.
  9260. alternate_socket_data.AddWrite(
  9261. ASYNC, client_maker_.MakeAckAndRetireConnectionIdPacket(
  9262. packet_num++, /*include_version=*/false,
  9263. /*largest_received=*/peer_packet_num - 1,
  9264. /*smallest_received=*/1,
  9265. /*sequence_number=*/3u));
  9266. alternate_socket_data.AddRead(ASYNC, ERR_IO_PENDING); // Pause.
  9267. alternate_socket_data.AddRead(
  9268. ASYNC, server_maker_.MakeNewConnectionIdPacket(
  9269. peer_packet_num++, /*include_version=*/false, cid4,
  9270. /*sequence_number=*/4u,
  9271. /*retire_prior_to=*/1u));
  9272. ++packet_num; // Probing packet on default network encounters write error.
  9273. alternate_socket_data.AddWrite(
  9274. ASYNC, client_maker_.MakeAckAndRetireConnectionIdPacket(
  9275. packet_num++, /*include_version=*/false,
  9276. /*largest_received=*/peer_packet_num - 1,
  9277. /*smallest_received=*/1,
  9278. /*sequence_number=*/4u));
  9279. alternate_socket_data.AddRead(ASYNC, ERR_IO_PENDING); // Pause.
  9280. alternate_socket_data.AddRead(
  9281. ASYNC, server_maker_.MakeNewConnectionIdPacket(
  9282. peer_packet_num++, /*include_version=*/false, cid5,
  9283. /*sequence_number=*/5u,
  9284. /*retire_prior_to=*/1u));
  9285. ++packet_num; // Probing packet on default network encounters write error.
  9286. alternate_socket_data.AddWrite(
  9287. ASYNC, client_maker_.MakeAckAndRetireConnectionIdPacket(
  9288. packet_num++, /*include_version=*/false,
  9289. /*largest_received=*/peer_packet_num - 1,
  9290. /*smallest_received=*/1,
  9291. /*sequence_number=*/5u));
  9292. alternate_socket_data.AddRead(ASYNC, ERR_IO_PENDING); // Pause.
  9293. alternate_socket_data.AddRead(
  9294. ASYNC, server_maker_.MakeNewConnectionIdPacket(
  9295. peer_packet_num++, /*include_version=*/false, cid6,
  9296. /*sequence_number=*/6u,
  9297. /*retire_prior_to=*/1u));
  9298. ++packet_num; // Probing packet on default network encounters write error.
  9299. alternate_socket_data.AddWrite(
  9300. ASYNC, client_maker_.MakeAckAndRetireConnectionIdPacket(
  9301. packet_num++, /*include_version=*/false,
  9302. /*largest_received=*/peer_packet_num - 1,
  9303. /*smallest_received=*/1,
  9304. /*sequence_number=*/6u));
  9305. alternate_socket_data.AddRead(ASYNC, ERR_IO_PENDING); // Pause.
  9306. alternate_socket_data.AddRead(
  9307. ASYNC, server_maker_.MakeNewConnectionIdPacket(
  9308. peer_packet_num++, /*include_version=*/false, cid7,
  9309. /*sequence_number=*/7u,
  9310. /*retire_prior_to=*/1u));
  9311. alternate_socket_data.AddRead(SYNCHRONOUS,
  9312. ERR_IO_PENDING); // Hanging read.
  9313. alternate_socket_data.AddSocketDataToFactory(socket_factory_.get());
  9314. // Set up probing socket for migrating back to the default network.
  9315. MockQuicData quic_data(version_); // retry count: 0.
  9316. quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
  9317. quic_data.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE);
  9318. quic_data.AddSocketDataToFactory(socket_factory_.get());
  9319. MockQuicData quic_data1(version_); // retry count: 1
  9320. quic_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
  9321. quic_data1.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE);
  9322. quic_data1.AddSocketDataToFactory(socket_factory_.get());
  9323. MockQuicData quic_data2(version_); // retry count: 2
  9324. quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
  9325. quic_data2.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE);
  9326. quic_data2.AddSocketDataToFactory(socket_factory_.get());
  9327. MockQuicData quic_data3(version_); // retry count: 3
  9328. quic_data3.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
  9329. quic_data3.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE);
  9330. quic_data3.AddSocketDataToFactory(socket_factory_.get());
  9331. MockQuicData quic_data4(version_); // retry count: 4
  9332. quic_data4.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
  9333. quic_data4.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE);
  9334. quic_data4.AddSocketDataToFactory(socket_factory_.get());
  9335. MockQuicData quic_data5(version_); // retry count: 5
  9336. quic_data5.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
  9337. quic_data5.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE);
  9338. quic_data5.AddSocketDataToFactory(socket_factory_.get());
  9339. // Create request and QuicHttpStream.
  9340. QuicStreamRequest request(factory_.get());
  9341. EXPECT_EQ(ERR_IO_PENDING,
  9342. request.Request(
  9343. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  9344. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  9345. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  9346. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  9347. failed_on_default_network_callback_, callback_.callback()));
  9348. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  9349. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  9350. EXPECT_TRUE(stream.get());
  9351. // Ensure that session is active.
  9352. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  9353. // Trigger connection migration. Since there are no active streams,
  9354. // the session will be closed.
  9355. scoped_mock_network_change_notifier_->mock_network_change_notifier()
  9356. ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
  9357. // The nearest task will complete migration.
  9358. EXPECT_EQ(2u, task_runner->GetPendingTaskCount());
  9359. EXPECT_EQ(base::TimeDelta(), task_runner->NextPendingTaskDelay());
  9360. task_runner->FastForwardBy(base::TimeDelta());
  9361. // The migrate back timer will fire. Due to default network
  9362. // being disconnected, no attempt will be exercised to migrate back.
  9363. EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
  9364. EXPECT_EQ(base::Seconds(kMinRetryTimeForDefaultNetworkSecs),
  9365. task_runner->NextPendingTaskDelay());
  9366. task_runner->FastForwardBy(task_runner->NextPendingTaskDelay());
  9367. EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
  9368. // Deliver the signal that the old default network now backs up.
  9369. scoped_mock_network_change_notifier_->mock_network_change_notifier()
  9370. ->NotifyNetworkMadeDefault(kDefaultNetworkForTests);
  9371. // A task is posted to migrate back to the default network immediately.
  9372. EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
  9373. EXPECT_EQ(base::TimeDelta(), task_runner->NextPendingTaskDelay());
  9374. task_runner->FastForwardBy(base::TimeDelta());
  9375. // Retry migrate back in 1, 2, 4, 8, 16s.
  9376. // Session will be closed due to idle migration timeout.
  9377. for (int i = 0; i < 5; i++) {
  9378. if (version_.UsesHttp3()) {
  9379. // Fire retire connection ID alarm.
  9380. base::RunLoop().RunUntilIdle();
  9381. // Make new connection ID available.
  9382. alternate_socket_data.Resume();
  9383. }
  9384. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  9385. // A task is posted to migrate back to the default network in 2^i seconds.
  9386. EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
  9387. EXPECT_EQ(base::Seconds(UINT64_C(1) << i),
  9388. task_runner->NextPendingTaskDelay());
  9389. task_runner->FastForwardBy(task_runner->NextPendingTaskDelay());
  9390. }
  9391. EXPECT_TRUE(default_socket_data.AllReadDataConsumed());
  9392. EXPECT_TRUE(default_socket_data.AllWriteDataConsumed());
  9393. EXPECT_TRUE(alternate_socket_data.AllReadDataConsumed());
  9394. EXPECT_TRUE(alternate_socket_data.AllWriteDataConsumed());
  9395. }
  9396. TEST_P(QuicStreamFactoryTest, CustomIdleMigrationPeriod) {
  9397. if (!version_.UsesHttp3())
  9398. return;
  9399. // The customized threshold is 15s.
  9400. quic_params_->migrate_idle_sessions = true;
  9401. quic_params_->idle_session_migration_period = base::Seconds(15);
  9402. InitializeConnectionMigrationV2Test(
  9403. {kDefaultNetworkForTests, kNewNetworkForTests});
  9404. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  9405. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  9406. client_maker_.set_save_packet_frames(true);
  9407. // Using a testing task runner and a test tick tock.
  9408. auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
  9409. QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
  9410. QuicStreamFactoryPeer::SetTickClock(factory_.get(),
  9411. task_runner->GetMockTickClock());
  9412. quic::QuicConnectionId cid1 = quic::test::TestConnectionId(1234567);
  9413. quic::QuicConnectionId cid2 = quic::test::TestConnectionId(2345671);
  9414. quic::QuicConnectionId cid3 = quic::test::TestConnectionId(3456712);
  9415. quic::QuicConnectionId cid4 = quic::test::TestConnectionId(4567123);
  9416. quic::QuicConnectionId cid5 = quic::test::TestConnectionId(5671234);
  9417. quic::QuicConnectionId cid6 = quic::test::TestConnectionId(6712345);
  9418. int peer_packet_num = 1;
  9419. MockQuicData default_socket_data(version_);
  9420. default_socket_data.AddRead(
  9421. SYNCHRONOUS,
  9422. server_maker_.MakeNewConnectionIdPacket(peer_packet_num++, true, cid1,
  9423. /*sequence_number=*/1u,
  9424. /*retire_prior_to=*/0u));
  9425. default_socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  9426. int packet_num = 1;
  9427. default_socket_data.AddWrite(SYNCHRONOUS,
  9428. ConstructInitialSettingsPacket(packet_num++));
  9429. default_socket_data.AddSocketDataToFactory(socket_factory_.get());
  9430. // Set up second socket data provider that is used after migration.
  9431. MockQuicData alternate_socket_data(version_);
  9432. client_maker_.set_connection_id(cid1);
  9433. alternate_socket_data.AddWrite(SYNCHRONOUS,
  9434. client_maker_.MakeAckAndRetransmissionPacket(
  9435. packet_num++,
  9436. /*first_received=*/1,
  9437. /*largest_received=*/peer_packet_num - 1,
  9438. /*smallest_received=*/1,
  9439. /*original_packet_numbers=*/{1}));
  9440. alternate_socket_data.AddWrite(
  9441. SYNCHRONOUS,
  9442. client_maker_.MakePingPacket(packet_num++, /*include_version=*/false));
  9443. alternate_socket_data.AddWrite(
  9444. ASYNC,
  9445. client_maker_.MakeRetireConnectionIdPacket(
  9446. packet_num++, /*include_version=*/false, /*sequence_number=*/0u));
  9447. alternate_socket_data.AddRead(ASYNC, ERR_IO_PENDING); // Pause.
  9448. alternate_socket_data.AddRead(
  9449. ASYNC, server_maker_.MakeNewConnectionIdPacket(
  9450. peer_packet_num++, /*include_version=*/false, cid2,
  9451. /*sequence_number=*/2u,
  9452. /*retire_prior_to=*/1u));
  9453. ++packet_num; // Probing packet on default network encounters write error.
  9454. alternate_socket_data.AddWrite(
  9455. ASYNC, client_maker_.MakeAckAndRetireConnectionIdPacket(
  9456. packet_num++, /*include_version=*/false,
  9457. /*largest_received=*/peer_packet_num - 1,
  9458. /*smallest_received=*/1,
  9459. /*sequence_number=*/2u));
  9460. alternate_socket_data.AddRead(ASYNC, ERR_IO_PENDING); // Pause.
  9461. alternate_socket_data.AddRead(
  9462. ASYNC, server_maker_.MakeNewConnectionIdPacket(
  9463. peer_packet_num++, /*include_version=*/false, cid3,
  9464. /*sequence_number=*/3u,
  9465. /*retire_prior_to=*/1u));
  9466. ++packet_num; // Probing packet on default network encounters write error.
  9467. alternate_socket_data.AddWrite(
  9468. ASYNC, client_maker_.MakeAckAndRetireConnectionIdPacket(
  9469. packet_num++, /*include_version=*/false,
  9470. /*largest_received=*/peer_packet_num - 1,
  9471. /*smallest_received=*/1,
  9472. /*sequence_number=*/3u));
  9473. alternate_socket_data.AddRead(ASYNC, ERR_IO_PENDING); // Pause.
  9474. alternate_socket_data.AddRead(
  9475. ASYNC, server_maker_.MakeNewConnectionIdPacket(
  9476. peer_packet_num++, /*include_version=*/false, cid4,
  9477. /*sequence_number=*/4u,
  9478. /*retire_prior_to=*/1u));
  9479. ++packet_num; // Probing packet on default network encounters write error.
  9480. alternate_socket_data.AddWrite(
  9481. ASYNC, client_maker_.MakeAckAndRetireConnectionIdPacket(
  9482. packet_num++, /*include_version=*/false,
  9483. /*largest_received=*/peer_packet_num - 1,
  9484. /*smallest_received=*/1,
  9485. /*sequence_number=*/4u));
  9486. alternate_socket_data.AddRead(ASYNC, ERR_IO_PENDING); // Pause.
  9487. alternate_socket_data.AddRead(
  9488. ASYNC, server_maker_.MakeNewConnectionIdPacket(
  9489. peer_packet_num++, /*include_version=*/false, cid5,
  9490. /*sequence_number=*/5u,
  9491. /*retire_prior_to=*/1u));
  9492. alternate_socket_data.AddRead(SYNCHRONOUS,
  9493. ERR_IO_PENDING); // Hanging read.
  9494. alternate_socket_data.AddSocketDataToFactory(socket_factory_.get());
  9495. // Set up probing socket for migrating back to the default network.
  9496. MockQuicData quic_data(version_); // retry count: 0.
  9497. quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
  9498. quic_data.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE);
  9499. quic_data.AddSocketDataToFactory(socket_factory_.get());
  9500. MockQuicData quic_data1(version_); // retry count: 1
  9501. quic_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
  9502. quic_data1.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE);
  9503. quic_data1.AddSocketDataToFactory(socket_factory_.get());
  9504. MockQuicData quic_data2(version_); // retry count: 2
  9505. quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
  9506. quic_data2.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE);
  9507. quic_data2.AddSocketDataToFactory(socket_factory_.get());
  9508. MockQuicData quic_data3(version_); // retry count: 3
  9509. quic_data3.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
  9510. quic_data3.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE);
  9511. quic_data3.AddSocketDataToFactory(socket_factory_.get());
  9512. MockQuicData quic_data4(version_); // retry count: 4
  9513. quic_data4.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging read.
  9514. quic_data4.AddWrite(SYNCHRONOUS, ERR_ADDRESS_UNREACHABLE);
  9515. quic_data4.AddSocketDataToFactory(socket_factory_.get());
  9516. // Create request and QuicHttpStream.
  9517. QuicStreamRequest request(factory_.get());
  9518. EXPECT_EQ(ERR_IO_PENDING,
  9519. request.Request(
  9520. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  9521. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  9522. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  9523. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  9524. failed_on_default_network_callback_, callback_.callback()));
  9525. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  9526. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  9527. EXPECT_TRUE(stream.get());
  9528. // Ensure that session is active.
  9529. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  9530. // Trigger connection migration. Since there are no active streams,
  9531. // the session will be closed.
  9532. scoped_mock_network_change_notifier_->mock_network_change_notifier()
  9533. ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
  9534. // The nearest task will complete migration.
  9535. EXPECT_EQ(2u, task_runner->GetPendingTaskCount());
  9536. EXPECT_EQ(base::TimeDelta(), task_runner->NextPendingTaskDelay());
  9537. task_runner->FastForwardBy(base::TimeDelta());
  9538. // The migrate back timer will fire. Due to default network
  9539. // being disconnected, no attempt will be exercised to migrate back.
  9540. EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
  9541. EXPECT_EQ(base::Seconds(kMinRetryTimeForDefaultNetworkSecs),
  9542. task_runner->NextPendingTaskDelay());
  9543. task_runner->FastForwardBy(task_runner->NextPendingTaskDelay());
  9544. EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
  9545. // Deliver the signal that the old default network now backs up.
  9546. scoped_mock_network_change_notifier_->mock_network_change_notifier()
  9547. ->NotifyNetworkMadeDefault(kDefaultNetworkForTests);
  9548. // A task is posted to migrate back to the default network immediately.
  9549. EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
  9550. EXPECT_EQ(base::TimeDelta(), task_runner->NextPendingTaskDelay());
  9551. task_runner->FastForwardBy(base::TimeDelta());
  9552. // Retry migrate back in 1, 2, 4, 8s.
  9553. // Session will be closed due to idle migration timeout.
  9554. for (int i = 0; i < 4; i++) {
  9555. if (version_.UsesHttp3()) {
  9556. // Fire retire connection ID alarm.
  9557. base::RunLoop().RunUntilIdle();
  9558. // Make new connection ID available.
  9559. alternate_socket_data.Resume();
  9560. }
  9561. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  9562. // A task is posted to migrate back to the default network in 2^i seconds.
  9563. EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
  9564. EXPECT_EQ(base::Seconds(UINT64_C(1) << i),
  9565. task_runner->NextPendingTaskDelay());
  9566. task_runner->FastForwardBy(task_runner->NextPendingTaskDelay());
  9567. }
  9568. EXPECT_TRUE(default_socket_data.AllReadDataConsumed());
  9569. EXPECT_TRUE(default_socket_data.AllWriteDataConsumed());
  9570. EXPECT_TRUE(alternate_socket_data.AllReadDataConsumed());
  9571. EXPECT_TRUE(alternate_socket_data.AllWriteDataConsumed());
  9572. }
  9573. TEST_P(QuicStreamFactoryTest, ServerMigration) {
  9574. quic_params_->allow_server_migration = true;
  9575. SetIetfConnectionMigrationFlagsAndConnectionOptions();
  9576. Initialize();
  9577. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  9578. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  9579. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  9580. client_maker_.set_save_packet_frames(true);
  9581. MockQuicData socket_data1(version_);
  9582. socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  9583. int packet_num = 1;
  9584. if (VersionUsesHttp3(version_.transport_version)) {
  9585. socket_data1.AddWrite(SYNCHRONOUS,
  9586. ConstructInitialSettingsPacket(packet_num++));
  9587. }
  9588. socket_data1.AddWrite(
  9589. SYNCHRONOUS,
  9590. ConstructGetRequestPacket(packet_num++,
  9591. GetNthClientInitiatedBidirectionalStreamId(0),
  9592. true, true));
  9593. socket_data1.AddSocketDataToFactory(socket_factory_.get());
  9594. // Create request and QuicHttpStream.
  9595. QuicStreamRequest request(factory_.get());
  9596. EXPECT_EQ(ERR_IO_PENDING,
  9597. request.Request(
  9598. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  9599. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  9600. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  9601. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  9602. failed_on_default_network_callback_, callback_.callback()));
  9603. EXPECT_EQ(OK, callback_.WaitForResult());
  9604. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  9605. EXPECT_TRUE(stream.get());
  9606. // Cause QUIC stream to be created.
  9607. HttpRequestInfo request_info;
  9608. request_info.method = "GET";
  9609. request_info.url = GURL("https://www.example.org/");
  9610. request_info.traffic_annotation =
  9611. MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
  9612. stream->RegisterRequest(&request_info);
  9613. EXPECT_EQ(OK, stream->InitializeStream(true, DEFAULT_PRIORITY, net_log_,
  9614. CompletionOnceCallback()));
  9615. // Ensure that session is alive and active.
  9616. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  9617. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  9618. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  9619. quic::QuicConnectionId cid_on_new_path =
  9620. quic::test::TestConnectionId(12345678);
  9621. MaybeMakeNewConnectionIdAvailableToSession(cid_on_new_path, session);
  9622. NetErrorDetails details;
  9623. EXPECT_FALSE(details.quic_connection_migration_attempted);
  9624. EXPECT_FALSE(details.quic_connection_migration_successful);
  9625. session->PopulateNetErrorDetails(&details);
  9626. EXPECT_FALSE(details.quic_connection_migration_attempted);
  9627. EXPECT_FALSE(details.quic_connection_migration_successful);
  9628. // Send GET request on stream.
  9629. HttpResponseInfo response;
  9630. HttpRequestHeaders request_headers;
  9631. EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
  9632. callback_.callback()));
  9633. IPEndPoint ip;
  9634. session->GetDefaultSocket()->GetPeerAddress(&ip);
  9635. DVLOG(1) << "Socket connected to: " << ip.address().ToString() << " "
  9636. << ip.port();
  9637. // Set up second socket data provider that is used after
  9638. // migration. The request is rewritten to this new socket, and the
  9639. // response to the request is read on this new socket.
  9640. MockQuicData socket_data2(version_);
  9641. if (version_.UsesHttp3()) {
  9642. client_maker_.set_connection_id(cid_on_new_path);
  9643. socket_data2.AddWrite(SYNCHRONOUS,
  9644. client_maker_.MakeCombinedRetransmissionPacket(
  9645. {1, 2}, packet_num++, true));
  9646. }
  9647. socket_data2.AddWrite(
  9648. SYNCHRONOUS,
  9649. client_maker_.MakePingPacket(packet_num++, /*include_version=*/true));
  9650. if (version_.UsesHttp3()) {
  9651. socket_data2.AddWrite(SYNCHRONOUS,
  9652. client_maker_.MakeRetireConnectionIdPacket(
  9653. packet_num++, /*include_version=*/false,
  9654. /*sequence_number=*/0u));
  9655. }
  9656. socket_data2.AddRead(
  9657. ASYNC,
  9658. ConstructOkResponsePacket(
  9659. 1, GetNthClientInitiatedBidirectionalStreamId(0), false, false));
  9660. socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  9661. if (VersionUsesHttp3(version_.transport_version)) {
  9662. socket_data2.AddWrite(
  9663. SYNCHRONOUS,
  9664. client_maker_.MakeDataPacket(
  9665. packet_num++, GetQpackDecoderStreamId(),
  9666. /*should_include_version=*/false,
  9667. /*fin=*/false, StreamCancellationQpackDecoderInstruction(0)));
  9668. socket_data2.AddWrite(
  9669. SYNCHRONOUS,
  9670. client_maker_.MakeRstPacket(
  9671. packet_num++, false, GetNthClientInitiatedBidirectionalStreamId(0),
  9672. quic::QUIC_STREAM_CANCELLED));
  9673. } else {
  9674. socket_data2.AddWrite(
  9675. SYNCHRONOUS,
  9676. client_maker_.MakeAckAndRstPacket(
  9677. packet_num++, false, GetNthClientInitiatedBidirectionalStreamId(0),
  9678. quic::QUIC_STREAM_CANCELLED, 1, 1));
  9679. }
  9680. socket_data2.AddSocketDataToFactory(socket_factory_.get());
  9681. const uint8_t kTestIpAddress[] = {1, 2, 3, 4};
  9682. const uint16_t kTestPort = 123;
  9683. session->Migrate(handles::kInvalidNetworkHandle,
  9684. IPEndPoint(IPAddress(kTestIpAddress), kTestPort), true);
  9685. session->GetDefaultSocket()->GetPeerAddress(&ip);
  9686. DVLOG(1) << "Socket migrated to: " << ip.address().ToString() << " "
  9687. << ip.port();
  9688. // The session should be alive and active.
  9689. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  9690. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  9691. EXPECT_EQ(1u, session->GetNumActiveStreams());
  9692. session->PopulateNetErrorDetails(&details);
  9693. EXPECT_TRUE(details.quic_connection_migration_attempted);
  9694. EXPECT_TRUE(details.quic_connection_migration_successful);
  9695. // Run the message loop so that data queued in the new socket is read by the
  9696. // packet reader.
  9697. base::RunLoop().RunUntilIdle();
  9698. // Verify that response headers on the migrated socket were delivered to the
  9699. // stream.
  9700. EXPECT_EQ(OK, stream->ReadResponseHeaders(callback_.callback()));
  9701. EXPECT_EQ(200, response.headers->response_code());
  9702. stream.reset();
  9703. EXPECT_TRUE(socket_data1.AllReadDataConsumed());
  9704. EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
  9705. EXPECT_TRUE(socket_data2.AllReadDataConsumed());
  9706. EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
  9707. }
  9708. TEST_P(QuicStreamFactoryTest, ServerMigrationNonMigratableStream) {
  9709. quic_params_->allow_server_migration = true;
  9710. SetIetfConnectionMigrationFlagsAndConnectionOptions();
  9711. Initialize();
  9712. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  9713. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  9714. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  9715. client_maker_.set_save_packet_frames(true);
  9716. int packet_num = 1;
  9717. MockQuicData socket_data(version_);
  9718. socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING); // Hanging Read.
  9719. if (VersionUsesHttp3(version_.transport_version)) {
  9720. socket_data.AddWrite(SYNCHRONOUS,
  9721. ConstructInitialSettingsPacket(packet_num++));
  9722. }
  9723. socket_data.AddWrite(
  9724. SYNCHRONOUS,
  9725. ConstructGetRequestPacket(packet_num++,
  9726. GetNthClientInitiatedBidirectionalStreamId(0),
  9727. true, true));
  9728. if (VersionUsesHttp3(version_.transport_version)) {
  9729. socket_data.AddWrite(
  9730. SYNCHRONOUS, client_maker_.MakeDataPacket(
  9731. packet_num++, GetQpackDecoderStreamId(), true, false,
  9732. StreamCancellationQpackDecoderInstruction(0)));
  9733. }
  9734. socket_data.AddWrite(
  9735. SYNCHRONOUS,
  9736. ConstructClientRstPacket(packet_num++, quic::QUIC_STREAM_CANCELLED));
  9737. socket_data.AddSocketDataToFactory(socket_factory_.get());
  9738. // Create request and QuicHttpStream.
  9739. QuicStreamRequest request(factory_.get());
  9740. EXPECT_EQ(ERR_IO_PENDING,
  9741. request.Request(
  9742. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  9743. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  9744. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  9745. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  9746. failed_on_default_network_callback_, callback_.callback()));
  9747. EXPECT_EQ(OK, callback_.WaitForResult());
  9748. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  9749. EXPECT_TRUE(stream.get());
  9750. // Cause QUIC stream to be created.
  9751. HttpRequestInfo request_info;
  9752. request_info.method = "GET";
  9753. request_info.url = GURL("https://www.example.org/");
  9754. request_info.traffic_annotation =
  9755. MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
  9756. stream->RegisterRequest(&request_info);
  9757. EXPECT_EQ(OK, stream->InitializeStream(true, DEFAULT_PRIORITY, net_log_,
  9758. CompletionOnceCallback()));
  9759. // Ensure that session is alive and active.
  9760. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  9761. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  9762. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  9763. quic::QuicConnectionId cid_on_new_path =
  9764. quic::test::TestConnectionId(12345678);
  9765. MaybeMakeNewConnectionIdAvailableToSession(cid_on_new_path, session);
  9766. // Disable connection migration on the request streams.
  9767. QuicChromiumClientStream* chrome_stream =
  9768. static_cast<QuicChromiumClientStream*>(
  9769. quic::test::QuicSessionPeer::GetStream(
  9770. session, GetNthClientInitiatedBidirectionalStreamId(0)));
  9771. EXPECT_TRUE(chrome_stream);
  9772. chrome_stream->DisableConnectionMigrationToCellularNetwork();
  9773. NetErrorDetails details;
  9774. EXPECT_FALSE(details.quic_connection_migration_attempted);
  9775. EXPECT_FALSE(details.quic_connection_migration_successful);
  9776. session->PopulateNetErrorDetails(&details);
  9777. EXPECT_FALSE(details.quic_connection_migration_attempted);
  9778. EXPECT_FALSE(details.quic_connection_migration_successful);
  9779. // Send GET request on stream.
  9780. HttpResponseInfo response;
  9781. HttpRequestHeaders request_headers;
  9782. EXPECT_EQ(OK, stream->SendRequest(request_headers, &response,
  9783. callback_.callback()));
  9784. // The specific network isn't important, we just want something !=
  9785. // handles::kInvalidNetworkHandle to specify a non-default network.
  9786. constexpr handles::NetworkHandle kNonDefaultNetwork = 1;
  9787. constexpr uint8_t kTestIpAddress[] = {1, 2, 3, 4};
  9788. constexpr uint16_t kTestPort = 123;
  9789. session->Migrate(kNonDefaultNetwork,
  9790. IPEndPoint(IPAddress(kTestIpAddress), kTestPort), true);
  9791. // The session should exist but no longer be active since its only stream has
  9792. // been reset.
  9793. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  9794. EXPECT_FALSE(HasActiveSession(scheme_host_port_));
  9795. session->PopulateNetErrorDetails(&details);
  9796. EXPECT_TRUE(details.quic_connection_migration_attempted);
  9797. EXPECT_FALSE(details.quic_connection_migration_successful);
  9798. // Run the message loop so that data queued due to the reset is read by the
  9799. // packet reader.
  9800. base::RunLoop().RunUntilIdle();
  9801. // Verify that the request failed since connection the stream couldn't be
  9802. // migrated.
  9803. EXPECT_EQ(ERR_QUIC_PROTOCOL_ERROR,
  9804. stream->ReadResponseHeaders(callback_.callback()));
  9805. EXPECT_EQ(nullptr, response.headers);
  9806. stream.reset();
  9807. EXPECT_TRUE(socket_data.AllReadDataConsumed());
  9808. EXPECT_TRUE(socket_data.AllWriteDataConsumed());
  9809. }
  9810. TEST_P(QuicStreamFactoryTest, ServerMigrationIPv4ToIPv4) {
  9811. // Add alternate IPv4 server address to config.
  9812. IPEndPoint alt_address = IPEndPoint(IPAddress(1, 2, 3, 4), 123);
  9813. quic::QuicConfig config;
  9814. if (version_.UsesHttp3()) {
  9815. SetIetfConnectionMigrationFlagsAndConnectionOptions();
  9816. config.SetIPv4AlternateServerAddressToSend(
  9817. ToQuicSocketAddress(alt_address), kNewCID,
  9818. quic::QuicUtils::GenerateStatelessResetToken(kNewCID));
  9819. } else {
  9820. config.SetIPv4AlternateServerAddressToSend(
  9821. ToQuicSocketAddress(alt_address));
  9822. }
  9823. VerifyServerMigration(config, alt_address);
  9824. }
  9825. TEST_P(QuicStreamFactoryTest, ServerMigrationIPv6ToIPv6) {
  9826. // Add a resolver rule to make initial connection to an IPv6 address.
  9827. host_resolver_->rules()->AddIPLiteralRule(scheme_host_port_.host(),
  9828. "fe80::aebc:32ff:febb:1e33", "");
  9829. // Add alternate IPv6 server address to config.
  9830. IPEndPoint alt_address = IPEndPoint(
  9831. IPAddress(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16), 123);
  9832. quic::QuicConfig config;
  9833. if (version_.UsesHttp3()) {
  9834. SetIetfConnectionMigrationFlagsAndConnectionOptions();
  9835. config.SetIPv6AlternateServerAddressToSend(
  9836. ToQuicSocketAddress(alt_address), kNewCID,
  9837. quic::QuicUtils::GenerateStatelessResetToken(kNewCID));
  9838. } else {
  9839. config.SetIPv6AlternateServerAddressToSend(
  9840. ToQuicSocketAddress(alt_address));
  9841. }
  9842. VerifyServerMigration(config, alt_address);
  9843. }
  9844. TEST_P(QuicStreamFactoryTest, ServerMigrationIPv6ToIPv4Fails) {
  9845. quic_params_->allow_server_migration = true;
  9846. Initialize();
  9847. // Add a resolver rule to make initial connection to an IPv6 address.
  9848. host_resolver_->rules()->AddIPLiteralRule(scheme_host_port_.host(),
  9849. "fe80::aebc:32ff:febb:1e33", "");
  9850. // Add alternate IPv4 server address to config.
  9851. IPEndPoint alt_address = IPEndPoint(IPAddress(1, 2, 3, 4), 123);
  9852. quic::QuicConfig config;
  9853. config.SetIPv4AlternateServerAddressToSend(ToQuicSocketAddress(alt_address));
  9854. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  9855. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  9856. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  9857. crypto_client_stream_factory_.SetConfig(config);
  9858. // Set up only socket data provider.
  9859. MockQuicData socket_data1(version_);
  9860. socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  9861. int packet_num = 1;
  9862. if (VersionUsesHttp3(version_.transport_version)) {
  9863. socket_data1.AddWrite(SYNCHRONOUS,
  9864. ConstructInitialSettingsPacket(packet_num++));
  9865. socket_data1.AddWrite(
  9866. SYNCHRONOUS, client_maker_.MakeDataPacket(
  9867. packet_num++, GetQpackDecoderStreamId(), true, false,
  9868. StreamCancellationQpackDecoderInstruction(0)));
  9869. }
  9870. socket_data1.AddWrite(
  9871. SYNCHRONOUS,
  9872. client_maker_.MakeRstPacket(packet_num++, true,
  9873. GetNthClientInitiatedBidirectionalStreamId(0),
  9874. quic::QUIC_STREAM_CANCELLED));
  9875. socket_data1.AddSocketDataToFactory(socket_factory_.get());
  9876. // Create request and QuicHttpStream.
  9877. QuicStreamRequest request(factory_.get());
  9878. EXPECT_EQ(ERR_IO_PENDING,
  9879. request.Request(
  9880. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  9881. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  9882. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  9883. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  9884. failed_on_default_network_callback_, callback_.callback()));
  9885. EXPECT_EQ(OK, callback_.WaitForResult());
  9886. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  9887. EXPECT_TRUE(stream.get());
  9888. // Cause QUIC stream to be created.
  9889. HttpRequestInfo request_info;
  9890. request_info.method = "GET";
  9891. request_info.url = GURL("https://www.example.org/");
  9892. request_info.traffic_annotation =
  9893. MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
  9894. stream->RegisterRequest(&request_info);
  9895. EXPECT_EQ(OK, stream->InitializeStream(true, DEFAULT_PRIORITY, net_log_,
  9896. CompletionOnceCallback()));
  9897. // Ensure that session is alive and active.
  9898. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  9899. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  9900. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  9901. IPEndPoint actual_address;
  9902. session->GetDefaultSocket()->GetPeerAddress(&actual_address);
  9903. // No migration should have happened.
  9904. IPEndPoint expected_address =
  9905. IPEndPoint(IPAddress(0xfe, 0x80, 0, 0, 0, 0, 0, 0, 0xae, 0xbc, 0x32, 0xff,
  9906. 0xfe, 0xbb, 0x1e, 0x33),
  9907. kDefaultServerPort);
  9908. EXPECT_EQ(actual_address, expected_address);
  9909. DVLOG(1) << "Socket connected to: " << actual_address.address().ToString()
  9910. << " " << actual_address.port();
  9911. DVLOG(1) << "Expected address: " << expected_address.address().ToString()
  9912. << " " << expected_address.port();
  9913. stream.reset();
  9914. EXPECT_TRUE(socket_data1.AllReadDataConsumed());
  9915. EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
  9916. }
  9917. TEST_P(QuicStreamFactoryTest, ServerMigrationIPv4ToIPv6Fails) {
  9918. quic_params_->allow_server_migration = true;
  9919. Initialize();
  9920. // Add a resolver rule to make initial connection to an IPv4 address.
  9921. host_resolver_->rules()->AddIPLiteralRule(scheme_host_port_.host(), "1.2.3.4",
  9922. "");
  9923. // Add alternate IPv6 server address to config.
  9924. IPEndPoint alt_address = IPEndPoint(
  9925. IPAddress(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16), 123);
  9926. quic::QuicConfig config;
  9927. config.SetIPv6AlternateServerAddressToSend(ToQuicSocketAddress(alt_address));
  9928. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  9929. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  9930. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  9931. crypto_client_stream_factory_.SetConfig(config);
  9932. // Set up only socket data provider.
  9933. MockQuicData socket_data1(version_);
  9934. socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  9935. int packet_num = 1;
  9936. if (VersionUsesHttp3(version_.transport_version)) {
  9937. socket_data1.AddWrite(SYNCHRONOUS,
  9938. ConstructInitialSettingsPacket(packet_num++));
  9939. socket_data1.AddWrite(
  9940. SYNCHRONOUS, client_maker_.MakeDataPacket(
  9941. packet_num++, GetQpackDecoderStreamId(), true, false,
  9942. StreamCancellationQpackDecoderInstruction(0)));
  9943. }
  9944. socket_data1.AddWrite(
  9945. SYNCHRONOUS,
  9946. client_maker_.MakeRstPacket(packet_num++, true,
  9947. GetNthClientInitiatedBidirectionalStreamId(0),
  9948. quic::QUIC_STREAM_CANCELLED));
  9949. socket_data1.AddSocketDataToFactory(socket_factory_.get());
  9950. // Create request and QuicHttpStream.
  9951. QuicStreamRequest request(factory_.get());
  9952. EXPECT_EQ(ERR_IO_PENDING,
  9953. request.Request(
  9954. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  9955. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  9956. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  9957. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  9958. failed_on_default_network_callback_, callback_.callback()));
  9959. EXPECT_EQ(OK, callback_.WaitForResult());
  9960. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  9961. EXPECT_TRUE(stream.get());
  9962. // Cause QUIC stream to be created.
  9963. HttpRequestInfo request_info;
  9964. request_info.method = "GET";
  9965. request_info.url = GURL("https://www.example.org/");
  9966. request_info.traffic_annotation =
  9967. MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
  9968. stream->RegisterRequest(&request_info);
  9969. EXPECT_EQ(OK, stream->InitializeStream(true, DEFAULT_PRIORITY, net_log_,
  9970. CompletionOnceCallback()));
  9971. // Ensure that session is alive and active.
  9972. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  9973. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  9974. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  9975. IPEndPoint actual_address;
  9976. session->GetDefaultSocket()->GetPeerAddress(&actual_address);
  9977. // No migration should have happened.
  9978. IPEndPoint expected_address =
  9979. IPEndPoint(IPAddress(1, 2, 3, 4), kDefaultServerPort);
  9980. EXPECT_EQ(actual_address, expected_address);
  9981. DVLOG(1) << "Socket connected to: " << actual_address.address().ToString()
  9982. << " " << actual_address.port();
  9983. DVLOG(1) << "Expected address: " << expected_address.address().ToString()
  9984. << " " << expected_address.port();
  9985. stream.reset();
  9986. EXPECT_TRUE(socket_data1.AllReadDataConsumed());
  9987. EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
  9988. }
  9989. TEST_P(QuicStreamFactoryTest, OnCertDBChanged) {
  9990. Initialize();
  9991. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  9992. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  9993. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  9994. MockQuicData socket_data(version_);
  9995. socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  9996. if (VersionUsesHttp3(version_.transport_version))
  9997. socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
  9998. socket_data.AddSocketDataToFactory(socket_factory_.get());
  9999. client_maker_.Reset();
  10000. MockQuicData socket_data2(version_);
  10001. socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  10002. if (VersionUsesHttp3(version_.transport_version))
  10003. socket_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
  10004. socket_data2.AddSocketDataToFactory(socket_factory_.get());
  10005. QuicStreamRequest request(factory_.get());
  10006. EXPECT_EQ(ERR_IO_PENDING,
  10007. request.Request(
  10008. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  10009. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  10010. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  10011. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  10012. failed_on_default_network_callback_, callback_.callback()));
  10013. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  10014. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  10015. EXPECT_TRUE(stream);
  10016. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  10017. // Change the CA cert and verify that stream saw the event.
  10018. factory_->OnCertDBChanged();
  10019. EXPECT_TRUE(factory_->is_quic_known_to_work_on_current_network());
  10020. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  10021. EXPECT_FALSE(HasActiveSession(scheme_host_port_));
  10022. // Now attempting to request a stream to the same origin should create
  10023. // a new session.
  10024. QuicStreamRequest request2(factory_.get());
  10025. EXPECT_EQ(ERR_IO_PENDING,
  10026. request2.Request(
  10027. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  10028. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  10029. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  10030. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  10031. failed_on_default_network_callback_, callback_.callback()));
  10032. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  10033. std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
  10034. EXPECT_TRUE(stream2);
  10035. QuicChromiumClientSession* session2 = GetActiveSession(scheme_host_port_);
  10036. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  10037. EXPECT_NE(session, session2);
  10038. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  10039. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session2));
  10040. stream2.reset();
  10041. stream.reset();
  10042. EXPECT_TRUE(socket_data.AllReadDataConsumed());
  10043. EXPECT_TRUE(socket_data.AllWriteDataConsumed());
  10044. EXPECT_TRUE(socket_data2.AllReadDataConsumed());
  10045. EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
  10046. }
  10047. TEST_P(QuicStreamFactoryTest, SharedCryptoConfig) {
  10048. Initialize();
  10049. std::vector<string> cannoncial_suffixes;
  10050. cannoncial_suffixes.emplace_back(".c.youtube.com");
  10051. cannoncial_suffixes.emplace_back(".googlevideo.com");
  10052. for (const auto& cannoncial_suffix : cannoncial_suffixes) {
  10053. string r1_host_name("r1");
  10054. string r2_host_name("r2");
  10055. r1_host_name.append(cannoncial_suffix);
  10056. r2_host_name.append(cannoncial_suffix);
  10057. url::SchemeHostPort scheme_host_port1(url::kHttpsScheme, r1_host_name, 80);
  10058. // Need to hold onto this through the test, to keep the
  10059. // QuicCryptoClientConfig alive.
  10060. std::unique_ptr<QuicCryptoClientConfigHandle> crypto_config_handle =
  10061. QuicStreamFactoryPeer::GetCryptoConfig(factory_.get(),
  10062. NetworkIsolationKey());
  10063. quic::QuicServerId server_id1(scheme_host_port1.host(),
  10064. scheme_host_port1.port(), privacy_mode_);
  10065. quic::QuicCryptoClientConfig::CachedState* cached1 =
  10066. crypto_config_handle->GetConfig()->LookupOrCreate(server_id1);
  10067. EXPECT_FALSE(cached1->proof_valid());
  10068. EXPECT_TRUE(cached1->source_address_token().empty());
  10069. // Mutate the cached1 to have different data.
  10070. // TODO(rtenneti): mutate other members of CachedState.
  10071. cached1->set_source_address_token(r1_host_name);
  10072. cached1->SetProofValid();
  10073. url::SchemeHostPort scheme_host_port2(url::kHttpsScheme, r2_host_name, 80);
  10074. quic::QuicServerId server_id2(scheme_host_port2.host(),
  10075. scheme_host_port2.port(), privacy_mode_);
  10076. quic::QuicCryptoClientConfig::CachedState* cached2 =
  10077. crypto_config_handle->GetConfig()->LookupOrCreate(server_id2);
  10078. EXPECT_EQ(cached1->source_address_token(), cached2->source_address_token());
  10079. EXPECT_TRUE(cached2->proof_valid());
  10080. }
  10081. }
  10082. TEST_P(QuicStreamFactoryTest, CryptoConfigWhenProofIsInvalid) {
  10083. Initialize();
  10084. std::vector<string> cannoncial_suffixes;
  10085. cannoncial_suffixes.emplace_back(".c.youtube.com");
  10086. cannoncial_suffixes.emplace_back(".googlevideo.com");
  10087. for (const auto& cannoncial_suffix : cannoncial_suffixes) {
  10088. string r3_host_name("r3");
  10089. string r4_host_name("r4");
  10090. r3_host_name.append(cannoncial_suffix);
  10091. r4_host_name.append(cannoncial_suffix);
  10092. url::SchemeHostPort scheme_host_port1(url::kHttpsScheme, r3_host_name, 80);
  10093. // Need to hold onto this through the test, to keep the
  10094. // QuicCryptoClientConfig alive.
  10095. std::unique_ptr<QuicCryptoClientConfigHandle> crypto_config_handle =
  10096. QuicStreamFactoryPeer::GetCryptoConfig(factory_.get(),
  10097. NetworkIsolationKey());
  10098. quic::QuicServerId server_id1(scheme_host_port1.host(),
  10099. scheme_host_port1.port(), privacy_mode_);
  10100. quic::QuicCryptoClientConfig::CachedState* cached1 =
  10101. crypto_config_handle->GetConfig()->LookupOrCreate(server_id1);
  10102. EXPECT_FALSE(cached1->proof_valid());
  10103. EXPECT_TRUE(cached1->source_address_token().empty());
  10104. // Mutate the cached1 to have different data.
  10105. // TODO(rtenneti): mutate other members of CachedState.
  10106. cached1->set_source_address_token(r3_host_name);
  10107. cached1->SetProofInvalid();
  10108. url::SchemeHostPort scheme_host_port2(url::kHttpsScheme, r4_host_name, 80);
  10109. quic::QuicServerId server_id2(scheme_host_port2.host(),
  10110. scheme_host_port2.port(), privacy_mode_);
  10111. quic::QuicCryptoClientConfig::CachedState* cached2 =
  10112. crypto_config_handle->GetConfig()->LookupOrCreate(server_id2);
  10113. EXPECT_NE(cached1->source_address_token(), cached2->source_address_token());
  10114. EXPECT_TRUE(cached2->source_address_token().empty());
  10115. EXPECT_FALSE(cached2->proof_valid());
  10116. }
  10117. }
  10118. TEST_P(QuicStreamFactoryTest, EnableNotLoadFromDiskCache) {
  10119. Initialize();
  10120. factory_->set_is_quic_known_to_work_on_current_network(true);
  10121. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  10122. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  10123. QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
  10124. MockQuicData socket_data(version_);
  10125. socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  10126. client_maker_.SetEncryptionLevel(quic::ENCRYPTION_ZERO_RTT);
  10127. if (VersionUsesHttp3(version_.transport_version))
  10128. socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
  10129. socket_data.AddSocketDataToFactory(socket_factory_.get());
  10130. crypto_client_stream_factory_.set_handshake_mode(
  10131. MockCryptoClientStream::ZERO_RTT);
  10132. host_resolver_->set_synchronous_mode(true);
  10133. host_resolver_->rules()->AddIPLiteralRule(scheme_host_port_.host(),
  10134. "192.168.0.1", "");
  10135. QuicStreamRequest request(factory_.get());
  10136. EXPECT_EQ(OK,
  10137. request.Request(
  10138. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  10139. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  10140. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  10141. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  10142. failed_on_default_network_callback_, callback_.callback()));
  10143. // If we are waiting for disk cache, we would have posted a task. Verify that
  10144. // the CancelWaitForDataReady task hasn't been posted.
  10145. ASSERT_EQ(0u, runner_->GetPostedTasks().size());
  10146. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  10147. EXPECT_TRUE(stream.get());
  10148. EXPECT_TRUE(socket_data.AllReadDataConsumed());
  10149. EXPECT_TRUE(socket_data.AllWriteDataConsumed());
  10150. }
  10151. TEST_P(QuicStreamFactoryTest, ReducePingTimeoutOnConnectionTimeOutOpenStreams) {
  10152. quic_params_->reduced_ping_timeout = base::Seconds(10);
  10153. Initialize();
  10154. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  10155. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  10156. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  10157. QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
  10158. MockQuicData socket_data(version_);
  10159. socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  10160. if (VersionUsesHttp3(version_.transport_version))
  10161. socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
  10162. socket_data.AddSocketDataToFactory(socket_factory_.get());
  10163. client_maker_.Reset();
  10164. MockQuicData socket_data2(version_);
  10165. socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  10166. if (VersionUsesHttp3(version_.transport_version))
  10167. socket_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
  10168. socket_data2.AddSocketDataToFactory(socket_factory_.get());
  10169. url::SchemeHostPort server2(url::kHttpsScheme, kServer2HostName,
  10170. kDefaultServerPort);
  10171. crypto_client_stream_factory_.set_handshake_mode(
  10172. MockCryptoClientStream::CONFIRM_HANDSHAKE);
  10173. host_resolver_->set_synchronous_mode(true);
  10174. host_resolver_->rules()->AddIPLiteralRule(scheme_host_port_.host(),
  10175. "192.168.0.1", "");
  10176. host_resolver_->rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
  10177. // Quic should use default PING timeout when no previous connection times out
  10178. // with open stream.
  10179. EXPECT_EQ(quic::QuicTime::Delta::FromSeconds(quic::kPingTimeoutSecs),
  10180. QuicStreamFactoryPeer::GetPingTimeout(factory_.get()));
  10181. QuicStreamRequest request(factory_.get());
  10182. EXPECT_EQ(OK,
  10183. request.Request(
  10184. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  10185. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  10186. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  10187. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  10188. failed_on_default_network_callback_, callback_.callback()));
  10189. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  10190. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  10191. EXPECT_TRUE(stream.get());
  10192. HttpRequestInfo request_info;
  10193. request_info.traffic_annotation =
  10194. MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
  10195. stream->RegisterRequest(&request_info);
  10196. EXPECT_EQ(OK, stream->InitializeStream(false, DEFAULT_PRIORITY, net_log_,
  10197. CompletionOnceCallback()));
  10198. DVLOG(1)
  10199. << "Created 1st session and initialized a stream. Now trigger timeout";
  10200. session->connection()->CloseConnection(
  10201. quic::QUIC_NETWORK_IDLE_TIMEOUT, "test",
  10202. quic::ConnectionCloseBehavior::SILENT_CLOSE);
  10203. // Need to spin the loop now to ensure that
  10204. // QuicStreamFactory::OnSessionClosed() runs.
  10205. base::RunLoop run_loop;
  10206. run_loop.RunUntilIdle();
  10207. // The first connection times out with open stream, QUIC should reduce initial
  10208. // PING time for subsequent connections.
  10209. EXPECT_EQ(quic::QuicTime::Delta::FromSeconds(10),
  10210. QuicStreamFactoryPeer::GetPingTimeout(factory_.get()));
  10211. // Test two-in-a-row timeouts with open streams.
  10212. DVLOG(1) << "Create 2nd session and timeout with open stream";
  10213. TestCompletionCallback callback2;
  10214. QuicStreamRequest request2(factory_.get());
  10215. EXPECT_EQ(OK,
  10216. request2.Request(
  10217. server2, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
  10218. NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  10219. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  10220. /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_,
  10221. failed_on_default_network_callback_, callback2.callback()));
  10222. QuicChromiumClientSession* session2 = GetActiveSession(server2);
  10223. std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
  10224. EXPECT_TRUE(stream2.get());
  10225. stream2->RegisterRequest(&request_info);
  10226. EXPECT_EQ(OK, stream2->InitializeStream(false, DEFAULT_PRIORITY, net_log_,
  10227. CompletionOnceCallback()));
  10228. session2->connection()->CloseConnection(
  10229. quic::QUIC_NETWORK_IDLE_TIMEOUT, "test",
  10230. quic::ConnectionCloseBehavior::SILENT_CLOSE);
  10231. // Need to spin the loop now to ensure that
  10232. // QuicStreamFactory::OnSessionClosed() runs.
  10233. base::RunLoop run_loop2;
  10234. run_loop2.RunUntilIdle();
  10235. EXPECT_TRUE(socket_data.AllReadDataConsumed());
  10236. EXPECT_TRUE(socket_data.AllWriteDataConsumed());
  10237. EXPECT_TRUE(socket_data2.AllReadDataConsumed());
  10238. EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
  10239. }
  10240. // Verifies that the QUIC stream factory is initialized correctly.
  10241. TEST_P(QuicStreamFactoryTest, MaybeInitialize) {
  10242. VerifyInitialization(false /* vary_network_isolation_key */);
  10243. }
  10244. TEST_P(QuicStreamFactoryTest, MaybeInitializeWithNetworkIsolationKey) {
  10245. base::test::ScopedFeatureList feature_list;
  10246. feature_list.InitWithFeatures(
  10247. // enabled_features
  10248. {features::kPartitionHttpServerPropertiesByNetworkIsolationKey,
  10249. // Need to partition connections by NetworkIsolationKey for
  10250. // QuicSessionAliasKey to include NetworkIsolationKeys.
  10251. features::kPartitionConnectionsByNetworkIsolationKey},
  10252. // disabled_features
  10253. {});
  10254. // Since HttpServerProperties caches the feature value, have to create a new
  10255. // one.
  10256. http_server_properties_ = std::make_unique<HttpServerProperties>();
  10257. VerifyInitialization(true /* vary_network_isolation_key */);
  10258. }
  10259. // Without NetworkIsolationKeys enabled for HttpServerProperties, there should
  10260. // only be one global CryptoCache.
  10261. TEST_P(QuicStreamFactoryTest, CryptoConfigCache) {
  10262. const char kUserAgentId[] = "spoon";
  10263. base::test::ScopedFeatureList feature_list;
  10264. feature_list.InitWithFeatures(
  10265. // enabled_features
  10266. {features::kPartitionConnectionsByNetworkIsolationKey},
  10267. // disabled_features
  10268. {features::kPartitionHttpServerPropertiesByNetworkIsolationKey});
  10269. const SchemefulSite kSite1(GURL("https://foo.test/"));
  10270. const NetworkIsolationKey kNetworkIsolationKey1(kSite1, kSite1);
  10271. const SchemefulSite kSite2(GURL("https://bar.test/"));
  10272. const NetworkIsolationKey kNetworkIsolationKey2(kSite2, kSite2);
  10273. const SchemefulSite kSite3(GURL("https://baz.test/"));
  10274. const NetworkIsolationKey kNetworkIsolationKey3(kSite3, kSite3);
  10275. Initialize();
  10276. // Create a QuicCryptoClientConfigHandle for kNetworkIsolationKey1, and set
  10277. // the user agent.
  10278. std::unique_ptr<QuicCryptoClientConfigHandle> crypto_config_handle1 =
  10279. QuicStreamFactoryPeer::GetCryptoConfig(factory_.get(),
  10280. kNetworkIsolationKey1);
  10281. crypto_config_handle1->GetConfig()->set_user_agent_id(kUserAgentId);
  10282. EXPECT_EQ(kUserAgentId, crypto_config_handle1->GetConfig()->user_agent_id());
  10283. // Create another crypto config handle using a different NetworkIsolationKey
  10284. // while the first one is still alive should return the same config, with the
  10285. // user agent that was just set.
  10286. std::unique_ptr<QuicCryptoClientConfigHandle> crypto_config_handle2 =
  10287. QuicStreamFactoryPeer::GetCryptoConfig(factory_.get(),
  10288. kNetworkIsolationKey2);
  10289. EXPECT_EQ(kUserAgentId, crypto_config_handle2->GetConfig()->user_agent_id());
  10290. // Destroying both handles and creating a new one with yet another
  10291. // NetworkIsolationKey should again return the same config.
  10292. crypto_config_handle1.reset();
  10293. crypto_config_handle2.reset();
  10294. std::unique_ptr<QuicCryptoClientConfigHandle> crypto_config_handle3 =
  10295. QuicStreamFactoryPeer::GetCryptoConfig(factory_.get(),
  10296. kNetworkIsolationKey3);
  10297. EXPECT_EQ(kUserAgentId, crypto_config_handle3->GetConfig()->user_agent_id());
  10298. }
  10299. // With different NetworkIsolationKeys enabled for HttpServerProperties, there
  10300. // should only be one global CryptoCache per NetworkIsolationKey.
  10301. // TODO(https://crbug.com/1335453): The test is flaky.
  10302. TEST_P(QuicStreamFactoryTest,
  10303. DISABLED_CryptoConfigCacheWithNetworkIsolationKey) {
  10304. const char kUserAgentId1[] = "spoon";
  10305. const char kUserAgentId2[] = "fork";
  10306. const char kUserAgentId3[] = "another spoon";
  10307. base::test::ScopedFeatureList feature_list;
  10308. feature_list.InitWithFeatures(
  10309. // enabled_features
  10310. {features::kPartitionHttpServerPropertiesByNetworkIsolationKey,
  10311. // Need to partition connections by NetworkIsolationKey for
  10312. // QuicSessionAliasKey to include NetworkIsolationKeys.
  10313. features::kPartitionConnectionsByNetworkIsolationKey},
  10314. // disabled_features
  10315. {});
  10316. const SchemefulSite kSite1(GURL("https://foo.test/"));
  10317. const NetworkIsolationKey kNetworkIsolationKey1(kSite1, kSite1);
  10318. const SchemefulSite kSite2(GURL("https://bar.test/"));
  10319. const NetworkIsolationKey kNetworkIsolationKey2(kSite2, kSite2);
  10320. const SchemefulSite kSite3(GURL("https://baz.test/"));
  10321. const NetworkIsolationKey kNetworkIsolationKey3(kSite3, kSite3);
  10322. Initialize();
  10323. // Create a QuicCryptoClientConfigHandle for kNetworkIsolationKey1, and set
  10324. // the user agent.
  10325. std::unique_ptr<QuicCryptoClientConfigHandle> crypto_config_handle1 =
  10326. QuicStreamFactoryPeer::GetCryptoConfig(factory_.get(),
  10327. kNetworkIsolationKey1);
  10328. crypto_config_handle1->GetConfig()->set_user_agent_id(kUserAgentId1);
  10329. EXPECT_EQ(kUserAgentId1, crypto_config_handle1->GetConfig()->user_agent_id());
  10330. // Create another crypto config handle using a different NetworkIsolationKey
  10331. // while the first one is still alive should return a different config.
  10332. std::unique_ptr<QuicCryptoClientConfigHandle> crypto_config_handle2 =
  10333. QuicStreamFactoryPeer::GetCryptoConfig(factory_.get(),
  10334. kNetworkIsolationKey2);
  10335. EXPECT_EQ("", crypto_config_handle2->GetConfig()->user_agent_id());
  10336. crypto_config_handle2->GetConfig()->set_user_agent_id(kUserAgentId2);
  10337. EXPECT_EQ(kUserAgentId1, crypto_config_handle1->GetConfig()->user_agent_id());
  10338. EXPECT_EQ(kUserAgentId2, crypto_config_handle2->GetConfig()->user_agent_id());
  10339. // Creating handles with the same NIKs while the old handles are still alive
  10340. // should result in getting the same CryptoConfigs.
  10341. std::unique_ptr<QuicCryptoClientConfigHandle> crypto_config_handle1_2 =
  10342. QuicStreamFactoryPeer::GetCryptoConfig(factory_.get(),
  10343. kNetworkIsolationKey1);
  10344. std::unique_ptr<QuicCryptoClientConfigHandle> crypto_config_handle2_2 =
  10345. QuicStreamFactoryPeer::GetCryptoConfig(factory_.get(),
  10346. kNetworkIsolationKey2);
  10347. EXPECT_EQ(kUserAgentId1,
  10348. crypto_config_handle1_2->GetConfig()->user_agent_id());
  10349. EXPECT_EQ(kUserAgentId2,
  10350. crypto_config_handle2_2->GetConfig()->user_agent_id());
  10351. // Destroying all handles and creating a new one with yet another
  10352. // NetworkIsolationKey return yet another config.
  10353. crypto_config_handle1.reset();
  10354. crypto_config_handle2.reset();
  10355. crypto_config_handle1_2.reset();
  10356. crypto_config_handle2_2.reset();
  10357. std::unique_ptr<QuicCryptoClientConfigHandle> crypto_config_handle3 =
  10358. QuicStreamFactoryPeer::GetCryptoConfig(factory_.get(),
  10359. kNetworkIsolationKey3);
  10360. EXPECT_EQ("", crypto_config_handle3->GetConfig()->user_agent_id());
  10361. crypto_config_handle3->GetConfig()->set_user_agent_id(kUserAgentId3);
  10362. EXPECT_EQ(kUserAgentId3, crypto_config_handle3->GetConfig()->user_agent_id());
  10363. crypto_config_handle3.reset();
  10364. // The old CryptoConfigs should be recovered when creating handles with the
  10365. // same NIKs as before.
  10366. crypto_config_handle2 = QuicStreamFactoryPeer::GetCryptoConfig(
  10367. factory_.get(), kNetworkIsolationKey2);
  10368. crypto_config_handle1 = QuicStreamFactoryPeer::GetCryptoConfig(
  10369. factory_.get(), kNetworkIsolationKey1);
  10370. crypto_config_handle3 = QuicStreamFactoryPeer::GetCryptoConfig(
  10371. factory_.get(), kNetworkIsolationKey3);
  10372. EXPECT_EQ(kUserAgentId1, crypto_config_handle1->GetConfig()->user_agent_id());
  10373. EXPECT_EQ(kUserAgentId2, crypto_config_handle2->GetConfig()->user_agent_id());
  10374. EXPECT_EQ(kUserAgentId3, crypto_config_handle3->GetConfig()->user_agent_id());
  10375. }
  10376. // Makes Verifies MRU behavior of the crypto config caches. Without
  10377. // NetworkIsolationKeys enabled, behavior is uninteresting, since there's only
  10378. // one cache, so nothing is ever evicted.
  10379. TEST_P(QuicStreamFactoryTest, CryptoConfigCacheMRUWithNetworkIsolationKey) {
  10380. base::test::ScopedFeatureList feature_list;
  10381. feature_list.InitWithFeatures(
  10382. // enabled_features
  10383. {features::kPartitionHttpServerPropertiesByNetworkIsolationKey,
  10384. // Need to partition connections by NetworkIsolationKey for
  10385. // QuicSessionAliasKey to include NetworkIsolationKeys.
  10386. features::kPartitionConnectionsByNetworkIsolationKey},
  10387. // disabled_features
  10388. {});
  10389. const int kNumSessionsToMake = kMaxRecentCryptoConfigs + 5;
  10390. Initialize();
  10391. // Make more entries than the maximum, setting a unique user agent for each,
  10392. // and keeping the handles alives.
  10393. std::vector<std::unique_ptr<QuicCryptoClientConfigHandle>>
  10394. crypto_config_handles;
  10395. std::vector<NetworkIsolationKey> network_isolation_keys;
  10396. for (int i = 0; i < kNumSessionsToMake; ++i) {
  10397. SchemefulSite site(GURL(base::StringPrintf("https://foo%i.test/", i)));
  10398. network_isolation_keys.emplace_back(site, site);
  10399. std::unique_ptr<QuicCryptoClientConfigHandle> crypto_config_handle =
  10400. QuicStreamFactoryPeer::GetCryptoConfig(factory_.get(),
  10401. network_isolation_keys[i]);
  10402. crypto_config_handle->GetConfig()->set_user_agent_id(
  10403. base::NumberToString(i));
  10404. crypto_config_handles.emplace_back(std::move(crypto_config_handle));
  10405. }
  10406. // Since all the handles are still alive, nothing should be evicted yet.
  10407. for (int i = 0; i < kNumSessionsToMake; ++i) {
  10408. SCOPED_TRACE(i);
  10409. EXPECT_EQ(base::NumberToString(i),
  10410. crypto_config_handles[i]->GetConfig()->user_agent_id());
  10411. // A new handle for the same NIK returns the same crypto config.
  10412. std::unique_ptr<QuicCryptoClientConfigHandle> crypto_config_handle =
  10413. QuicStreamFactoryPeer::GetCryptoConfig(factory_.get(),
  10414. network_isolation_keys[i]);
  10415. EXPECT_EQ(base::NumberToString(i),
  10416. crypto_config_handle->GetConfig()->user_agent_id());
  10417. }
  10418. // Destroying the only remaining handle for a NIK results in evicting entries,
  10419. // until there are exactly |kMaxRecentCryptoConfigs| handles.
  10420. for (int i = 0; i < kNumSessionsToMake; ++i) {
  10421. SCOPED_TRACE(i);
  10422. EXPECT_EQ(base::NumberToString(i),
  10423. crypto_config_handles[i]->GetConfig()->user_agent_id());
  10424. crypto_config_handles[i].reset();
  10425. // A new handle for the same NIK will return a new config, if the config was
  10426. // evicted. Otherwise, it will return the same one.
  10427. std::unique_ptr<QuicCryptoClientConfigHandle> crypto_config_handle =
  10428. QuicStreamFactoryPeer::GetCryptoConfig(factory_.get(),
  10429. network_isolation_keys[i]);
  10430. if (kNumSessionsToMake - i > kNumSessionsToMake) {
  10431. EXPECT_EQ("", crypto_config_handle->GetConfig()->user_agent_id());
  10432. } else {
  10433. EXPECT_EQ(base::NumberToString(i),
  10434. crypto_config_handle->GetConfig()->user_agent_id());
  10435. }
  10436. }
  10437. }
  10438. // Similar to above test, but uses real requests, and doesn't keep Handles
  10439. // around, so evictions happen immediately.
  10440. TEST_P(QuicStreamFactoryTest,
  10441. CryptoConfigCacheMRUWithRealRequestsAndWithNetworkIsolationKey) {
  10442. const int kNumSessionsToMake = kMaxRecentCryptoConfigs + 5;
  10443. base::test::ScopedFeatureList feature_list;
  10444. feature_list.InitWithFeatures(
  10445. // enabled_features
  10446. {features::kPartitionHttpServerPropertiesByNetworkIsolationKey,
  10447. // Need to partition connections by NetworkIsolationKey for
  10448. // QuicSessionAliasKey to include NetworkIsolationKeys.
  10449. features::kPartitionConnectionsByNetworkIsolationKey},
  10450. // disabled_features
  10451. {});
  10452. // Since HttpServerProperties caches the feature value, have to create a new
  10453. // one.
  10454. http_server_properties_ = std::make_unique<HttpServerProperties>();
  10455. std::vector<NetworkIsolationKey> network_isolation_keys;
  10456. for (int i = 0; i < kNumSessionsToMake; ++i) {
  10457. SchemefulSite site(GURL(base::StringPrintf("https://foo%i.test/", i)));
  10458. network_isolation_keys.emplace_back(site, site);
  10459. }
  10460. const quic::QuicServerId kQuicServerId(
  10461. kDefaultServerHostName, kDefaultServerPort, PRIVACY_MODE_DISABLED);
  10462. quic_params_->max_server_configs_stored_in_properties = 1;
  10463. quic_params_->idle_connection_timeout = base::Seconds(500);
  10464. Initialize();
  10465. factory_->set_is_quic_known_to_work_on_current_network(true);
  10466. crypto_client_stream_factory_.set_handshake_mode(
  10467. MockCryptoClientStream::ZERO_RTT);
  10468. const quic::QuicConfig* config =
  10469. QuicStreamFactoryPeer::GetConfig(factory_.get());
  10470. EXPECT_EQ(500, config->IdleNetworkTimeout().ToSeconds());
  10471. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  10472. for (int i = 0; i < kNumSessionsToMake; ++i) {
  10473. SCOPED_TRACE(i);
  10474. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  10475. QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), runner_.get());
  10476. const AlternativeService alternative_service1(
  10477. kProtoQUIC, scheme_host_port_.host(), scheme_host_port_.port());
  10478. AlternativeServiceInfoVector alternative_service_info_vector;
  10479. base::Time expiration = base::Time::Now() + base::Days(1);
  10480. alternative_service_info_vector.push_back(
  10481. AlternativeServiceInfo::CreateQuicAlternativeServiceInfo(
  10482. alternative_service1, expiration, {version_}));
  10483. http_server_properties_->SetAlternativeServices(
  10484. url::SchemeHostPort(url_), network_isolation_keys[i],
  10485. alternative_service_info_vector);
  10486. http_server_properties_->SetMaxServerConfigsStoredInProperties(
  10487. kDefaultMaxQuicServerEntries);
  10488. std::unique_ptr<QuicServerInfo> quic_server_info =
  10489. std::make_unique<PropertiesBasedQuicServerInfo>(
  10490. kQuicServerId, network_isolation_keys[i],
  10491. http_server_properties_.get());
  10492. // Update quic_server_info's server_config and persist it.
  10493. QuicServerInfo::State* state = quic_server_info->mutable_state();
  10494. // Minimum SCFG that passes config validation checks.
  10495. const char scfg[] = {// SCFG
  10496. 0x53, 0x43, 0x46, 0x47,
  10497. // num entries
  10498. 0x01, 0x00,
  10499. // padding
  10500. 0x00, 0x00,
  10501. // EXPY
  10502. 0x45, 0x58, 0x50, 0x59,
  10503. // EXPY end offset
  10504. 0x08, 0x00, 0x00, 0x00,
  10505. // Value
  10506. '1', '2', '3', '4', '5', '6', '7', '8'};
  10507. // Create temporary strings because Persist() clears string data in |state|.
  10508. string server_config(reinterpret_cast<const char*>(&scfg), sizeof(scfg));
  10509. string source_address_token("test_source_address_token");
  10510. string cert_sct("test_cert_sct");
  10511. string chlo_hash("test_chlo_hash");
  10512. string signature("test_signature");
  10513. string test_cert("test_cert");
  10514. std::vector<string> certs;
  10515. certs.push_back(test_cert);
  10516. state->server_config = server_config;
  10517. state->source_address_token = source_address_token;
  10518. state->cert_sct = cert_sct;
  10519. state->chlo_hash = chlo_hash;
  10520. state->server_config_sig = signature;
  10521. state->certs = certs;
  10522. quic_server_info->Persist();
  10523. // Create a session and verify that the cached state is loaded.
  10524. MockQuicData socket_data(version_);
  10525. socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  10526. client_maker_.SetEncryptionLevel(quic::ENCRYPTION_ZERO_RTT);
  10527. if (VersionUsesHttp3(version_.transport_version))
  10528. socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
  10529. // For the close socket message.
  10530. socket_data.AddWrite(SYNCHRONOUS, ERR_IO_PENDING);
  10531. socket_data.AddSocketDataToFactory(socket_factory_.get());
  10532. client_maker_.Reset();
  10533. QuicStreamRequest request(factory_.get());
  10534. int rv = request.Request(
  10535. url::SchemeHostPort(url::kHttpsScheme, kDefaultServerHostName,
  10536. kDefaultServerPort),
  10537. version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
  10538. network_isolation_keys[i], SecureDnsPolicy::kAllow,
  10539. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  10540. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  10541. failed_on_default_network_callback_, callback_.callback());
  10542. EXPECT_THAT(callback_.GetResult(rv), IsOk());
  10543. // While the session is still alive, there should be
  10544. // kMaxRecentCryptoConfigs+1 CryptoConfigCaches alive, since active configs
  10545. // don't count towards the limit.
  10546. for (int j = 0; j < kNumSessionsToMake; ++j) {
  10547. SCOPED_TRACE(j);
  10548. EXPECT_EQ(i - (kMaxRecentCryptoConfigs + 1) < j && j <= i,
  10549. !QuicStreamFactoryPeer::CryptoConfigCacheIsEmpty(
  10550. factory_.get(), kQuicServerId, network_isolation_keys[j]));
  10551. }
  10552. // Close the sessions, which should cause its CryptoConfigCache to be moved
  10553. // to the MRU cache, potentially evicting the oldest entry..
  10554. factory_->CloseAllSessions(ERR_FAILED, quic::QUIC_PEER_GOING_AWAY);
  10555. // There should now be at most kMaxRecentCryptoConfigs live
  10556. // CryptoConfigCaches
  10557. for (int j = 0; j < kNumSessionsToMake; ++j) {
  10558. SCOPED_TRACE(j);
  10559. EXPECT_EQ(i - kMaxRecentCryptoConfigs < j && j <= i,
  10560. !QuicStreamFactoryPeer::CryptoConfigCacheIsEmpty(
  10561. factory_.get(), kQuicServerId, network_isolation_keys[j]));
  10562. }
  10563. }
  10564. }
  10565. TEST_P(QuicStreamFactoryTest, YieldAfterPackets) {
  10566. Initialize();
  10567. factory_->set_is_quic_known_to_work_on_current_network(true);
  10568. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  10569. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  10570. QuicStreamFactoryPeer::SetYieldAfterPackets(factory_.get(), 0);
  10571. MockQuicData socket_data(version_);
  10572. socket_data.AddRead(SYNCHRONOUS, ConstructClientConnectionClosePacket(1));
  10573. client_maker_.SetEncryptionLevel(quic::ENCRYPTION_ZERO_RTT);
  10574. if (VersionUsesHttp3(version_.transport_version))
  10575. socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
  10576. socket_data.AddRead(ASYNC, ERR_CONNECTION_CLOSED);
  10577. socket_data.AddSocketDataToFactory(socket_factory_.get());
  10578. crypto_client_stream_factory_.set_handshake_mode(
  10579. MockCryptoClientStream::ZERO_RTT);
  10580. host_resolver_->set_synchronous_mode(true);
  10581. host_resolver_->rules()->AddIPLiteralRule(scheme_host_port_.host(),
  10582. "192.168.0.1", "");
  10583. // Set up the TaskObserver to verify QuicChromiumPacketReader::StartReading
  10584. // posts a task.
  10585. // TODO(rtenneti): Change SpdySessionTestTaskObserver to NetTestTaskObserver??
  10586. SpdySessionTestTaskObserver observer("quic_chromium_packet_reader.cc",
  10587. "StartReading");
  10588. QuicStreamRequest request(factory_.get());
  10589. EXPECT_EQ(OK,
  10590. request.Request(
  10591. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  10592. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  10593. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  10594. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  10595. failed_on_default_network_callback_, callback_.callback()));
  10596. // Call run_loop so that QuicChromiumPacketReader::OnReadComplete() gets
  10597. // called.
  10598. base::RunLoop run_loop;
  10599. run_loop.RunUntilIdle();
  10600. // Verify task that the observer's executed_count is 1, which indicates
  10601. // QuicChromiumPacketReader::StartReading() has posted only one task and
  10602. // yielded the read.
  10603. EXPECT_EQ(1u, observer.executed_count());
  10604. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  10605. EXPECT_FALSE(stream.get()); // Session is already closed.
  10606. EXPECT_TRUE(socket_data.AllReadDataConsumed());
  10607. EXPECT_TRUE(socket_data.AllWriteDataConsumed());
  10608. }
  10609. TEST_P(QuicStreamFactoryTest, YieldAfterDuration) {
  10610. Initialize();
  10611. factory_->set_is_quic_known_to_work_on_current_network(true);
  10612. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  10613. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  10614. QuicStreamFactoryPeer::SetYieldAfterDuration(
  10615. factory_.get(), quic::QuicTime::Delta::FromMilliseconds(-1));
  10616. MockQuicData socket_data(version_);
  10617. socket_data.AddRead(SYNCHRONOUS, ConstructClientConnectionClosePacket(1));
  10618. client_maker_.SetEncryptionLevel(quic::ENCRYPTION_ZERO_RTT);
  10619. if (VersionUsesHttp3(version_.transport_version))
  10620. socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
  10621. socket_data.AddRead(ASYNC, ERR_CONNECTION_CLOSED);
  10622. socket_data.AddSocketDataToFactory(socket_factory_.get());
  10623. crypto_client_stream_factory_.set_handshake_mode(
  10624. MockCryptoClientStream::ZERO_RTT);
  10625. host_resolver_->set_synchronous_mode(true);
  10626. host_resolver_->rules()->AddIPLiteralRule(scheme_host_port_.host(),
  10627. "192.168.0.1", "");
  10628. // Set up the TaskObserver to verify QuicChromiumPacketReader::StartReading
  10629. // posts a task.
  10630. // TODO(rtenneti): Change SpdySessionTestTaskObserver to NetTestTaskObserver??
  10631. SpdySessionTestTaskObserver observer("quic_chromium_packet_reader.cc",
  10632. "StartReading");
  10633. QuicStreamRequest request(factory_.get());
  10634. EXPECT_EQ(OK,
  10635. request.Request(
  10636. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  10637. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  10638. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  10639. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  10640. failed_on_default_network_callback_, callback_.callback()));
  10641. // Call run_loop so that QuicChromiumPacketReader::OnReadComplete() gets
  10642. // called.
  10643. base::RunLoop run_loop;
  10644. run_loop.RunUntilIdle();
  10645. // Verify task that the observer's executed_count is 1, which indicates
  10646. // QuicChromiumPacketReader::StartReading() has posted only one task and
  10647. // yielded the read.
  10648. EXPECT_EQ(1u, observer.executed_count());
  10649. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  10650. EXPECT_FALSE(stream.get()); // Session is already closed.
  10651. EXPECT_TRUE(socket_data.AllReadDataConsumed());
  10652. EXPECT_TRUE(socket_data.AllWriteDataConsumed());
  10653. }
  10654. TEST_P(QuicStreamFactoryTest, ServerPushSessionAffinity) {
  10655. Initialize();
  10656. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  10657. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  10658. MockQuicData socket_data(version_);
  10659. socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  10660. if (VersionUsesHttp3(version_.transport_version))
  10661. socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
  10662. socket_data.AddSocketDataToFactory(socket_factory_.get());
  10663. QuicStreamRequest request(factory_.get());
  10664. EXPECT_EQ(ERR_IO_PENDING,
  10665. request.Request(
  10666. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  10667. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  10668. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  10669. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  10670. failed_on_default_network_callback_, callback_.callback()));
  10671. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  10672. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  10673. EXPECT_TRUE(stream.get());
  10674. EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumPushStreamsCreated(factory_.get()));
  10675. string url = "https://www.example.org/";
  10676. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  10677. quic::QuicClientPromisedInfo promised(
  10678. session, GetNthServerInitiatedUnidirectionalStreamId(0), kDefaultUrl);
  10679. (*session->push_promise_index()->promised_by_url())[kDefaultUrl] = &promised;
  10680. QuicStreamRequest request2(factory_.get());
  10681. EXPECT_EQ(OK,
  10682. request2.Request(
  10683. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  10684. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  10685. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  10686. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  10687. failed_on_default_network_callback_, callback_.callback()));
  10688. EXPECT_EQ(1, QuicStreamFactoryPeer::GetNumPushStreamsCreated(factory_.get()));
  10689. }
  10690. TEST_P(QuicStreamFactoryTest, ServerPushPrivacyModeMismatch) {
  10691. Initialize();
  10692. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  10693. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  10694. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  10695. MockQuicData socket_data1(version_);
  10696. socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  10697. if (VersionUsesHttp3(version_.transport_version)) {
  10698. socket_data1.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
  10699. }
  10700. socket_data1.AddSocketDataToFactory(socket_factory_.get());
  10701. client_maker_.Reset();
  10702. MockQuicData socket_data2(version_);
  10703. socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  10704. if (VersionUsesHttp3(version_.transport_version))
  10705. socket_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
  10706. socket_data2.AddSocketDataToFactory(socket_factory_.get());
  10707. QuicStreamRequest request(factory_.get());
  10708. EXPECT_EQ(ERR_IO_PENDING,
  10709. request.Request(
  10710. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  10711. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  10712. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  10713. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  10714. failed_on_default_network_callback_, callback_.callback()));
  10715. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  10716. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  10717. EXPECT_TRUE(stream.get());
  10718. EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumPushStreamsCreated(factory_.get()));
  10719. string url = "https://www.example.org/";
  10720. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  10721. quic::QuicClientPromisedInfo promised(
  10722. session, GetNthServerInitiatedUnidirectionalStreamId(0), kDefaultUrl);
  10723. quic::QuicClientPushPromiseIndex* index = session->push_promise_index();
  10724. (*index->promised_by_url())[kDefaultUrl] = &promised;
  10725. EXPECT_EQ(index->GetPromised(kDefaultUrl), &promised);
  10726. // Sending the request should not use the push stream, since the privacy mode
  10727. // is different.
  10728. QuicStreamRequest request2(factory_.get());
  10729. EXPECT_EQ(
  10730. ERR_IO_PENDING,
  10731. request2.Request(
  10732. scheme_host_port_, version_, PRIVACY_MODE_ENABLED, DEFAULT_PRIORITY,
  10733. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  10734. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  10735. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  10736. failed_on_default_network_callback_, callback_.callback()));
  10737. EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumPushStreamsCreated(factory_.get()));
  10738. // The pushed stream should still be pending.
  10739. EXPECT_EQ(&promised, index->GetPromised(kDefaultUrl));
  10740. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  10741. std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
  10742. EXPECT_TRUE(stream2.get());
  10743. EXPECT_TRUE(socket_data1.AllReadDataConsumed());
  10744. EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
  10745. EXPECT_TRUE(socket_data2.AllReadDataConsumed());
  10746. EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
  10747. }
  10748. TEST_P(QuicStreamFactoryTest, ServerPushNetworkIsolationKeyMismatch) {
  10749. base::test::ScopedFeatureList feature_list;
  10750. feature_list.InitWithFeatures(
  10751. // enabled_features
  10752. {features::kPartitionHttpServerPropertiesByNetworkIsolationKey,
  10753. // Need to partition connections by NetworkIsolationKey for
  10754. // QuicSessionAliasKey to include NetworkIsolationKeys.
  10755. features::kPartitionConnectionsByNetworkIsolationKey},
  10756. // disabled_features
  10757. {});
  10758. Initialize();
  10759. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  10760. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  10761. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  10762. MockQuicData socket_data1(version_);
  10763. socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  10764. if (VersionUsesHttp3(version_.transport_version)) {
  10765. socket_data1.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
  10766. }
  10767. socket_data1.AddSocketDataToFactory(socket_factory_.get());
  10768. client_maker_.Reset();
  10769. MockQuicData socket_data2(version_);
  10770. socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  10771. if (VersionUsesHttp3(version_.transport_version))
  10772. socket_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
  10773. socket_data2.AddSocketDataToFactory(socket_factory_.get());
  10774. QuicStreamRequest request(factory_.get());
  10775. EXPECT_EQ(ERR_IO_PENDING,
  10776. request.Request(
  10777. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  10778. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  10779. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  10780. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  10781. failed_on_default_network_callback_, callback_.callback()));
  10782. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  10783. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  10784. EXPECT_TRUE(stream.get());
  10785. EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumPushStreamsCreated(factory_.get()));
  10786. string url = "https://www.example.org/";
  10787. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  10788. quic::QuicClientPromisedInfo promised(
  10789. session, GetNthServerInitiatedUnidirectionalStreamId(0), kDefaultUrl);
  10790. quic::QuicClientPushPromiseIndex* index = session->push_promise_index();
  10791. (*index->promised_by_url())[kDefaultUrl] = &promised;
  10792. EXPECT_EQ(index->GetPromised(kDefaultUrl), &promised);
  10793. // Sending the request should not use the push stream, since the
  10794. // NetworkIsolationKey is different.
  10795. QuicStreamRequest request2(factory_.get());
  10796. EXPECT_EQ(ERR_IO_PENDING,
  10797. request2.Request(
  10798. scheme_host_port_, version_, PRIVACY_MODE_DISABLED,
  10799. DEFAULT_PRIORITY, SocketTag(),
  10800. NetworkIsolationKey::CreateTransient(), SecureDnsPolicy::kAllow,
  10801. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  10802. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  10803. failed_on_default_network_callback_, callback_.callback()));
  10804. EXPECT_EQ(0, QuicStreamFactoryPeer::GetNumPushStreamsCreated(factory_.get()));
  10805. EXPECT_EQ(&promised, index->GetPromised(kDefaultUrl));
  10806. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  10807. std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
  10808. EXPECT_TRUE(stream2.get());
  10809. EXPECT_TRUE(socket_data1.AllReadDataConsumed());
  10810. EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
  10811. EXPECT_TRUE(socket_data2.AllReadDataConsumed());
  10812. EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
  10813. }
  10814. // Pool to existing session with matching quic::QuicServerId
  10815. // even if destination is different.
  10816. TEST_P(QuicStreamFactoryTest, PoolByOrigin) {
  10817. Initialize();
  10818. url::SchemeHostPort destination1(url::kHttpsScheme, "first.example.com", 443);
  10819. url::SchemeHostPort destination2(url::kHttpsScheme, "second.example.com",
  10820. 443);
  10821. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  10822. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  10823. MockQuicData socket_data(version_);
  10824. socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  10825. if (VersionUsesHttp3(version_.transport_version))
  10826. socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
  10827. socket_data.AddSocketDataToFactory(socket_factory_.get());
  10828. QuicStreamRequest request1(factory_.get());
  10829. EXPECT_EQ(ERR_IO_PENDING,
  10830. request1.Request(
  10831. destination1, version_, privacy_mode_, DEFAULT_PRIORITY,
  10832. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  10833. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  10834. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  10835. failed_on_default_network_callback_, callback_.callback()));
  10836. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  10837. std::unique_ptr<HttpStream> stream1 = CreateStream(&request1);
  10838. EXPECT_TRUE(stream1.get());
  10839. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  10840. // Second request returns synchronously because it pools to existing session.
  10841. TestCompletionCallback callback2;
  10842. QuicStreamRequest request2(factory_.get());
  10843. EXPECT_EQ(OK,
  10844. request2.Request(
  10845. destination2, version_, privacy_mode_, DEFAULT_PRIORITY,
  10846. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  10847. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  10848. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  10849. failed_on_default_network_callback_, callback2.callback()));
  10850. std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
  10851. EXPECT_TRUE(stream2.get());
  10852. QuicChromiumClientSession::Handle* session1 =
  10853. QuicHttpStreamPeer::GetSessionHandle(stream1.get());
  10854. QuicChromiumClientSession::Handle* session2 =
  10855. QuicHttpStreamPeer::GetSessionHandle(stream2.get());
  10856. EXPECT_TRUE(session1->SharesSameSession(*session2));
  10857. EXPECT_EQ(
  10858. quic::QuicServerId(scheme_host_port_.host(), scheme_host_port_.port(),
  10859. privacy_mode_ == PRIVACY_MODE_ENABLED),
  10860. session1->server_id());
  10861. EXPECT_TRUE(socket_data.AllReadDataConsumed());
  10862. EXPECT_TRUE(socket_data.AllWriteDataConsumed());
  10863. }
  10864. namespace {
  10865. enum DestinationType {
  10866. // In pooling tests with two requests for different origins to the same
  10867. // destination, the destination should be
  10868. SAME_AS_FIRST, // the same as the first origin,
  10869. SAME_AS_SECOND, // the same as the second origin, or
  10870. DIFFERENT, // different from both.
  10871. };
  10872. // Run QuicStreamFactoryWithDestinationTest instances with all value
  10873. // combinations of version, enable_connection_racting, and destination_type.
  10874. struct PoolingTestParams {
  10875. quic::ParsedQuicVersion version;
  10876. DestinationType destination_type;
  10877. bool client_headers_include_h2_stream_dependency;
  10878. };
  10879. // Used by ::testing::PrintToStringParamName().
  10880. std::string PrintToString(const PoolingTestParams& p) {
  10881. const char* destination_string = "";
  10882. switch (p.destination_type) {
  10883. case SAME_AS_FIRST:
  10884. destination_string = "SAME_AS_FIRST";
  10885. break;
  10886. case SAME_AS_SECOND:
  10887. destination_string = "SAME_AS_SECOND";
  10888. break;
  10889. case DIFFERENT:
  10890. destination_string = "DIFFERENT";
  10891. break;
  10892. }
  10893. return base::StrCat(
  10894. {ParsedQuicVersionToString(p.version), "_", destination_string, "_",
  10895. (p.client_headers_include_h2_stream_dependency ? "" : "No"),
  10896. "Dependency"});
  10897. }
  10898. std::vector<PoolingTestParams> GetPoolingTestParams() {
  10899. std::vector<PoolingTestParams> params;
  10900. quic::ParsedQuicVersionVector all_supported_versions =
  10901. quic::AllSupportedVersions();
  10902. for (const quic::ParsedQuicVersion& version : all_supported_versions) {
  10903. params.push_back(PoolingTestParams{version, SAME_AS_FIRST, false});
  10904. params.push_back(PoolingTestParams{version, SAME_AS_FIRST, true});
  10905. params.push_back(PoolingTestParams{version, SAME_AS_SECOND, false});
  10906. params.push_back(PoolingTestParams{version, SAME_AS_SECOND, true});
  10907. params.push_back(PoolingTestParams{version, DIFFERENT, false});
  10908. params.push_back(PoolingTestParams{version, DIFFERENT, true});
  10909. }
  10910. return params;
  10911. }
  10912. } // namespace
  10913. class QuicStreamFactoryWithDestinationTest
  10914. : public QuicStreamFactoryTestBase,
  10915. public ::testing::TestWithParam<PoolingTestParams> {
  10916. protected:
  10917. QuicStreamFactoryWithDestinationTest()
  10918. : QuicStreamFactoryTestBase(
  10919. GetParam().version,
  10920. GetParam().client_headers_include_h2_stream_dependency),
  10921. destination_type_(GetParam().destination_type),
  10922. hanging_read_(SYNCHRONOUS, ERR_IO_PENDING, 0) {}
  10923. url::SchemeHostPort GetDestination() {
  10924. switch (destination_type_) {
  10925. case SAME_AS_FIRST:
  10926. return origin1_;
  10927. case SAME_AS_SECOND:
  10928. return origin2_;
  10929. case DIFFERENT:
  10930. return url::SchemeHostPort(url::kHttpsScheme, kDifferentHostname, 443);
  10931. default:
  10932. NOTREACHED();
  10933. return url::SchemeHostPort();
  10934. }
  10935. }
  10936. void AddHangingSocketData() {
  10937. auto sequenced_socket_data = std::make_unique<SequencedSocketData>(
  10938. base::make_span(&hanging_read_, 1), base::span<MockWrite>());
  10939. socket_factory_->AddSocketDataProvider(sequenced_socket_data.get());
  10940. sequenced_socket_data_vector_.push_back(std::move(sequenced_socket_data));
  10941. }
  10942. bool AllDataConsumed() {
  10943. for (const auto& socket_data_ptr : sequenced_socket_data_vector_) {
  10944. if (!socket_data_ptr->AllReadDataConsumed() ||
  10945. !socket_data_ptr->AllWriteDataConsumed()) {
  10946. return false;
  10947. }
  10948. }
  10949. return true;
  10950. }
  10951. DestinationType destination_type_;
  10952. url::SchemeHostPort origin1_;
  10953. url::SchemeHostPort origin2_;
  10954. MockRead hanging_read_;
  10955. std::vector<std::unique_ptr<SequencedSocketData>>
  10956. sequenced_socket_data_vector_;
  10957. };
  10958. INSTANTIATE_TEST_SUITE_P(VersionIncludeStreamDependencySequence,
  10959. QuicStreamFactoryWithDestinationTest,
  10960. ::testing::ValuesIn(GetPoolingTestParams()),
  10961. ::testing::PrintToStringParamName());
  10962. // A single QUIC request fails because the certificate does not match the origin
  10963. // hostname, regardless of whether it matches the alternative service hostname.
  10964. TEST_P(QuicStreamFactoryWithDestinationTest, InvalidCertificate) {
  10965. if (destination_type_ == DIFFERENT)
  10966. return;
  10967. Initialize();
  10968. GURL url("https://mail.example.com/");
  10969. origin1_ = url::SchemeHostPort(url);
  10970. // Not used for requests, but this provides a test case where the certificate
  10971. // is valid for the hostname of the alternative service.
  10972. origin2_ = url::SchemeHostPort(url::kHttpsScheme, "mail.example.org", 433);
  10973. url::SchemeHostPort destination = GetDestination();
  10974. scoped_refptr<X509Certificate> cert(
  10975. ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
  10976. ASSERT_FALSE(cert->VerifyNameMatch(origin1_.host()));
  10977. ASSERT_TRUE(cert->VerifyNameMatch(origin2_.host()));
  10978. ProofVerifyDetailsChromium verify_details;
  10979. verify_details.cert_verify_result.verified_cert = cert;
  10980. verify_details.cert_verify_result.is_issued_by_known_root = true;
  10981. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  10982. AddHangingSocketData();
  10983. QuicStreamRequest request(factory_.get());
  10984. EXPECT_EQ(ERR_IO_PENDING,
  10985. request.Request(
  10986. destination, version_, privacy_mode_, DEFAULT_PRIORITY,
  10987. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  10988. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  10989. /*cert_verify_flags=*/0, url, net_log_, &net_error_details_,
  10990. failed_on_default_network_callback_, callback_.callback()));
  10991. EXPECT_THAT(callback_.WaitForResult(), IsError(ERR_QUIC_HANDSHAKE_FAILED));
  10992. EXPECT_TRUE(AllDataConsumed());
  10993. }
  10994. // QuicStreamRequest is pooled based on |destination| if certificate matches.
  10995. TEST_P(QuicStreamFactoryWithDestinationTest, SharedCertificate) {
  10996. Initialize();
  10997. GURL url1("https://www.example.org/");
  10998. GURL url2("https://mail.example.org/");
  10999. origin1_ = url::SchemeHostPort(url1);
  11000. origin2_ = url::SchemeHostPort(url2);
  11001. url::SchemeHostPort destination = GetDestination();
  11002. scoped_refptr<X509Certificate> cert(
  11003. ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
  11004. ASSERT_TRUE(cert->VerifyNameMatch(origin1_.host()));
  11005. ASSERT_TRUE(cert->VerifyNameMatch(origin2_.host()));
  11006. ASSERT_FALSE(cert->VerifyNameMatch(kDifferentHostname));
  11007. ProofVerifyDetailsChromium verify_details;
  11008. verify_details.cert_verify_result.verified_cert = cert;
  11009. verify_details.cert_verify_result.is_issued_by_known_root = true;
  11010. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  11011. MockQuicData socket_data(version_);
  11012. socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  11013. if (VersionUsesHttp3(version_.transport_version))
  11014. socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
  11015. socket_data.AddSocketDataToFactory(socket_factory_.get());
  11016. QuicStreamRequest request1(factory_.get());
  11017. EXPECT_EQ(ERR_IO_PENDING,
  11018. request1.Request(
  11019. destination, version_, privacy_mode_, DEFAULT_PRIORITY,
  11020. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  11021. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  11022. /*cert_verify_flags=*/0, url1, net_log_, &net_error_details_,
  11023. failed_on_default_network_callback_, callback_.callback()));
  11024. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  11025. std::unique_ptr<HttpStream> stream1 = CreateStream(&request1);
  11026. EXPECT_TRUE(stream1.get());
  11027. EXPECT_TRUE(HasActiveSession(origin1_));
  11028. // Second request returns synchronously because it pools to existing session.
  11029. TestCompletionCallback callback2;
  11030. QuicStreamRequest request2(factory_.get());
  11031. EXPECT_EQ(OK,
  11032. request2.Request(
  11033. destination, version_, privacy_mode_, DEFAULT_PRIORITY,
  11034. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  11035. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  11036. /*cert_verify_flags=*/0, url2, net_log_, &net_error_details_,
  11037. failed_on_default_network_callback_, callback2.callback()));
  11038. std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
  11039. EXPECT_TRUE(stream2.get());
  11040. QuicChromiumClientSession::Handle* session1 =
  11041. QuicHttpStreamPeer::GetSessionHandle(stream1.get());
  11042. QuicChromiumClientSession::Handle* session2 =
  11043. QuicHttpStreamPeer::GetSessionHandle(stream2.get());
  11044. EXPECT_TRUE(session1->SharesSameSession(*session2));
  11045. EXPECT_EQ(quic::QuicServerId(origin1_.host(), origin1_.port(),
  11046. privacy_mode_ == PRIVACY_MODE_ENABLED),
  11047. session1->server_id());
  11048. EXPECT_TRUE(socket_data.AllReadDataConsumed());
  11049. EXPECT_TRUE(socket_data.AllWriteDataConsumed());
  11050. }
  11051. // QuicStreamRequest is not pooled if PrivacyMode differs.
  11052. TEST_P(QuicStreamFactoryWithDestinationTest, DifferentPrivacyMode) {
  11053. Initialize();
  11054. GURL url1("https://www.example.org/");
  11055. GURL url2("https://mail.example.org/");
  11056. origin1_ = url::SchemeHostPort(url1);
  11057. origin2_ = url::SchemeHostPort(url2);
  11058. url::SchemeHostPort destination = GetDestination();
  11059. scoped_refptr<X509Certificate> cert(
  11060. ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
  11061. ASSERT_TRUE(cert->VerifyNameMatch(origin1_.host()));
  11062. ASSERT_TRUE(cert->VerifyNameMatch(origin2_.host()));
  11063. ASSERT_FALSE(cert->VerifyNameMatch(kDifferentHostname));
  11064. ProofVerifyDetailsChromium verify_details1;
  11065. verify_details1.cert_verify_result.verified_cert = cert;
  11066. verify_details1.cert_verify_result.is_issued_by_known_root = true;
  11067. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details1);
  11068. ProofVerifyDetailsChromium verify_details2;
  11069. verify_details2.cert_verify_result.verified_cert = cert;
  11070. verify_details2.cert_verify_result.is_issued_by_known_root = true;
  11071. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details2);
  11072. MockQuicData socket_data1(version_);
  11073. socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  11074. if (VersionUsesHttp3(version_.transport_version))
  11075. socket_data1.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
  11076. socket_data1.AddSocketDataToFactory(socket_factory_.get());
  11077. client_maker_.Reset();
  11078. MockQuicData socket_data2(version_);
  11079. socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  11080. if (VersionUsesHttp3(version_.transport_version))
  11081. socket_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
  11082. socket_data2.AddSocketDataToFactory(socket_factory_.get());
  11083. QuicStreamRequest request1(factory_.get());
  11084. EXPECT_EQ(ERR_IO_PENDING,
  11085. request1.Request(
  11086. destination, version_, PRIVACY_MODE_DISABLED, DEFAULT_PRIORITY,
  11087. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  11088. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  11089. /*cert_verify_flags=*/0, url1, net_log_, &net_error_details_,
  11090. failed_on_default_network_callback_, callback_.callback()));
  11091. EXPECT_EQ(OK, callback_.WaitForResult());
  11092. std::unique_ptr<HttpStream> stream1 = CreateStream(&request1);
  11093. EXPECT_TRUE(stream1.get());
  11094. EXPECT_TRUE(HasActiveSession(origin1_));
  11095. TestCompletionCallback callback2;
  11096. QuicStreamRequest request2(factory_.get());
  11097. EXPECT_EQ(ERR_IO_PENDING,
  11098. request2.Request(
  11099. destination, version_, PRIVACY_MODE_ENABLED, DEFAULT_PRIORITY,
  11100. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  11101. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  11102. /*cert_verify_flags=*/0, url2, net_log_, &net_error_details_,
  11103. failed_on_default_network_callback_, callback2.callback()));
  11104. EXPECT_EQ(OK, callback2.WaitForResult());
  11105. std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
  11106. EXPECT_TRUE(stream2.get());
  11107. // |request2| does not pool to the first session, because PrivacyMode does not
  11108. // match. Instead, another session is opened to the same destination, but
  11109. // with a different quic::QuicServerId.
  11110. QuicChromiumClientSession::Handle* session1 =
  11111. QuicHttpStreamPeer::GetSessionHandle(stream1.get());
  11112. QuicChromiumClientSession::Handle* session2 =
  11113. QuicHttpStreamPeer::GetSessionHandle(stream2.get());
  11114. EXPECT_FALSE(session1->SharesSameSession(*session2));
  11115. EXPECT_EQ(quic::QuicServerId(origin1_.host(), origin1_.port(), false),
  11116. session1->server_id());
  11117. EXPECT_EQ(quic::QuicServerId(origin2_.host(), origin2_.port(), true),
  11118. session2->server_id());
  11119. EXPECT_TRUE(socket_data1.AllReadDataConsumed());
  11120. EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
  11121. EXPECT_TRUE(socket_data2.AllReadDataConsumed());
  11122. EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
  11123. }
  11124. // QuicStreamRequest is not pooled if the secure_dns_policy field differs.
  11125. TEST_P(QuicStreamFactoryWithDestinationTest, DifferentSecureDnsPolicy) {
  11126. Initialize();
  11127. GURL url1("https://www.example.org/");
  11128. GURL url2("https://mail.example.org/");
  11129. origin1_ = url::SchemeHostPort(url1);
  11130. origin2_ = url::SchemeHostPort(url2);
  11131. url::SchemeHostPort destination = GetDestination();
  11132. scoped_refptr<X509Certificate> cert(
  11133. ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
  11134. ASSERT_TRUE(cert->VerifyNameMatch(origin1_.host()));
  11135. ASSERT_TRUE(cert->VerifyNameMatch(origin2_.host()));
  11136. ASSERT_FALSE(cert->VerifyNameMatch(kDifferentHostname));
  11137. ProofVerifyDetailsChromium verify_details1;
  11138. verify_details1.cert_verify_result.verified_cert = cert;
  11139. verify_details1.cert_verify_result.is_issued_by_known_root = true;
  11140. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details1);
  11141. ProofVerifyDetailsChromium verify_details2;
  11142. verify_details2.cert_verify_result.verified_cert = cert;
  11143. verify_details2.cert_verify_result.is_issued_by_known_root = true;
  11144. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details2);
  11145. MockQuicData socket_data1(version_);
  11146. socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  11147. if (VersionUsesHttp3(version_.transport_version))
  11148. socket_data1.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
  11149. socket_data1.AddSocketDataToFactory(socket_factory_.get());
  11150. client_maker_.Reset();
  11151. MockQuicData socket_data2(version_);
  11152. socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  11153. if (VersionUsesHttp3(version_.transport_version))
  11154. socket_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
  11155. socket_data2.AddSocketDataToFactory(socket_factory_.get());
  11156. QuicStreamRequest request1(factory_.get());
  11157. EXPECT_EQ(ERR_IO_PENDING,
  11158. request1.Request(
  11159. destination, version_, PRIVACY_MODE_DISABLED, DEFAULT_PRIORITY,
  11160. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  11161. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  11162. /*cert_verify_flags=*/0, url1, net_log_, &net_error_details_,
  11163. failed_on_default_network_callback_, callback_.callback()));
  11164. EXPECT_EQ(OK, callback_.WaitForResult());
  11165. std::unique_ptr<HttpStream> stream1 = CreateStream(&request1);
  11166. EXPECT_TRUE(stream1.get());
  11167. EXPECT_TRUE(HasActiveSession(origin1_));
  11168. TestCompletionCallback callback2;
  11169. QuicStreamRequest request2(factory_.get());
  11170. EXPECT_EQ(ERR_IO_PENDING,
  11171. request2.Request(
  11172. destination, version_, PRIVACY_MODE_DISABLED, DEFAULT_PRIORITY,
  11173. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kDisable,
  11174. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  11175. /*cert_verify_flags=*/0, url2, net_log_, &net_error_details_,
  11176. failed_on_default_network_callback_, callback2.callback()));
  11177. EXPECT_EQ(OK, callback2.WaitForResult());
  11178. std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
  11179. EXPECT_TRUE(stream2.get());
  11180. // |request2| does not pool to the first session, because |secure_dns_policy|
  11181. // does not match.
  11182. QuicChromiumClientSession::Handle* session1 =
  11183. QuicHttpStreamPeer::GetSessionHandle(stream1.get());
  11184. QuicChromiumClientSession::Handle* session2 =
  11185. QuicHttpStreamPeer::GetSessionHandle(stream2.get());
  11186. EXPECT_FALSE(session1->SharesSameSession(*session2));
  11187. EXPECT_TRUE(socket_data1.AllReadDataConsumed());
  11188. EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
  11189. EXPECT_TRUE(socket_data2.AllReadDataConsumed());
  11190. EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
  11191. }
  11192. // QuicStreamRequest is not pooled if certificate does not match its origin.
  11193. TEST_P(QuicStreamFactoryWithDestinationTest, DisjointCertificate) {
  11194. Initialize();
  11195. GURL url1("https://news.example.org/");
  11196. GURL url2("https://mail.example.com/");
  11197. origin1_ = url::SchemeHostPort(url1);
  11198. origin2_ = url::SchemeHostPort(url2);
  11199. url::SchemeHostPort destination = GetDestination();
  11200. scoped_refptr<X509Certificate> cert1(
  11201. ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
  11202. ASSERT_TRUE(cert1->VerifyNameMatch(origin1_.host()));
  11203. ASSERT_FALSE(cert1->VerifyNameMatch(origin2_.host()));
  11204. ASSERT_FALSE(cert1->VerifyNameMatch(kDifferentHostname));
  11205. ProofVerifyDetailsChromium verify_details1;
  11206. verify_details1.cert_verify_result.verified_cert = cert1;
  11207. verify_details1.cert_verify_result.is_issued_by_known_root = true;
  11208. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details1);
  11209. scoped_refptr<X509Certificate> cert2(
  11210. ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"));
  11211. ASSERT_TRUE(cert2->VerifyNameMatch(origin2_.host()));
  11212. ASSERT_FALSE(cert2->VerifyNameMatch(kDifferentHostname));
  11213. ProofVerifyDetailsChromium verify_details2;
  11214. verify_details2.cert_verify_result.verified_cert = cert2;
  11215. verify_details2.cert_verify_result.is_issued_by_known_root = true;
  11216. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details2);
  11217. MockQuicData socket_data1(version_);
  11218. socket_data1.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  11219. if (VersionUsesHttp3(version_.transport_version))
  11220. socket_data1.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
  11221. socket_data1.AddSocketDataToFactory(socket_factory_.get());
  11222. client_maker_.Reset();
  11223. MockQuicData socket_data2(version_);
  11224. socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  11225. if (VersionUsesHttp3(version_.transport_version))
  11226. socket_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
  11227. socket_data2.AddSocketDataToFactory(socket_factory_.get());
  11228. QuicStreamRequest request1(factory_.get());
  11229. EXPECT_EQ(ERR_IO_PENDING,
  11230. request1.Request(
  11231. destination, version_, privacy_mode_, DEFAULT_PRIORITY,
  11232. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  11233. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  11234. /*cert_verify_flags=*/0, url1, net_log_, &net_error_details_,
  11235. failed_on_default_network_callback_, callback_.callback()));
  11236. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  11237. std::unique_ptr<HttpStream> stream1 = CreateStream(&request1);
  11238. EXPECT_TRUE(stream1.get());
  11239. EXPECT_TRUE(HasActiveSession(origin1_));
  11240. TestCompletionCallback callback2;
  11241. QuicStreamRequest request2(factory_.get());
  11242. EXPECT_EQ(ERR_IO_PENDING,
  11243. request2.Request(
  11244. destination, version_, privacy_mode_, DEFAULT_PRIORITY,
  11245. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  11246. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  11247. /*cert_verify_flags=*/0, url2, net_log_, &net_error_details_,
  11248. failed_on_default_network_callback_, callback2.callback()));
  11249. EXPECT_THAT(callback2.WaitForResult(), IsOk());
  11250. std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
  11251. EXPECT_TRUE(stream2.get());
  11252. // |request2| does not pool to the first session, because the certificate does
  11253. // not match. Instead, another session is opened to the same destination, but
  11254. // with a different quic::QuicServerId.
  11255. QuicChromiumClientSession::Handle* session1 =
  11256. QuicHttpStreamPeer::GetSessionHandle(stream1.get());
  11257. QuicChromiumClientSession::Handle* session2 =
  11258. QuicHttpStreamPeer::GetSessionHandle(stream2.get());
  11259. EXPECT_FALSE(session1->SharesSameSession(*session2));
  11260. EXPECT_EQ(quic::QuicServerId(origin1_.host(), origin1_.port(),
  11261. privacy_mode_ == PRIVACY_MODE_ENABLED),
  11262. session1->server_id());
  11263. EXPECT_EQ(quic::QuicServerId(origin2_.host(), origin2_.port(),
  11264. privacy_mode_ == PRIVACY_MODE_ENABLED),
  11265. session2->server_id());
  11266. EXPECT_TRUE(socket_data1.AllReadDataConsumed());
  11267. EXPECT_TRUE(socket_data1.AllWriteDataConsumed());
  11268. EXPECT_TRUE(socket_data2.AllReadDataConsumed());
  11269. EXPECT_TRUE(socket_data2.AllWriteDataConsumed());
  11270. }
  11271. // This test verifies that QuicStreamFactory::ClearCachedStatesInCryptoConfig
  11272. // correctly transform an origin filter to a ServerIdFilter. Whether the
  11273. // deletion itself works correctly is tested in QuicCryptoClientConfigTest.
  11274. TEST_P(QuicStreamFactoryTest, ClearCachedStatesInCryptoConfig) {
  11275. Initialize();
  11276. // Need to hold onto this through the test, to keep the QuicCryptoClientConfig
  11277. // alive.
  11278. std::unique_ptr<QuicCryptoClientConfigHandle> crypto_config_handle =
  11279. QuicStreamFactoryPeer::GetCryptoConfig(factory_.get(),
  11280. NetworkIsolationKey());
  11281. struct TestCase {
  11282. TestCase(const std::string& host,
  11283. int port,
  11284. PrivacyMode privacy_mode,
  11285. quic::QuicCryptoClientConfig* crypto_config)
  11286. : server_id(host, port, privacy_mode),
  11287. state(crypto_config->LookupOrCreate(server_id)) {
  11288. std::vector<string> certs(1);
  11289. certs[0] = "cert";
  11290. state->SetProof(certs, "cert_sct", "chlo_hash", "signature");
  11291. state->set_source_address_token("TOKEN");
  11292. state->SetProofValid();
  11293. EXPECT_FALSE(state->certs().empty());
  11294. }
  11295. quic::QuicServerId server_id;
  11296. raw_ptr<quic::QuicCryptoClientConfig::CachedState> state;
  11297. } test_cases[] = {TestCase("www.google.com", 443, privacy_mode_,
  11298. crypto_config_handle->GetConfig()),
  11299. TestCase("www.example.com", 443, privacy_mode_,
  11300. crypto_config_handle->GetConfig()),
  11301. TestCase("www.example.com", 4433, privacy_mode_,
  11302. crypto_config_handle->GetConfig())};
  11303. // Clear cached states for the origin https://www.example.com:4433.
  11304. GURL origin("https://www.example.com:4433");
  11305. factory_->ClearCachedStatesInCryptoConfig(base::BindRepeating(
  11306. static_cast<bool (*)(const GURL&, const GURL&)>(::operator==), origin));
  11307. EXPECT_FALSE(test_cases[0].state->certs().empty());
  11308. EXPECT_FALSE(test_cases[1].state->certs().empty());
  11309. EXPECT_TRUE(test_cases[2].state->certs().empty());
  11310. // Clear all cached states.
  11311. factory_->ClearCachedStatesInCryptoConfig(
  11312. base::RepeatingCallback<bool(const GURL&)>());
  11313. EXPECT_TRUE(test_cases[0].state->certs().empty());
  11314. EXPECT_TRUE(test_cases[1].state->certs().empty());
  11315. EXPECT_TRUE(test_cases[2].state->certs().empty());
  11316. }
  11317. // Passes connection options and client connection options to QuicStreamFactory,
  11318. // then checks that its internal quic::QuicConfig is correct.
  11319. TEST_P(QuicStreamFactoryTest, ConfigConnectionOptions) {
  11320. quic_params_->connection_options.push_back(quic::kTIME);
  11321. quic_params_->connection_options.push_back(quic::kTBBR);
  11322. quic_params_->connection_options.push_back(quic::kREJ);
  11323. quic_params_->client_connection_options.push_back(quic::kTBBR);
  11324. quic_params_->client_connection_options.push_back(quic::k1RTT);
  11325. Initialize();
  11326. // RVCM will be default enabled as a connection option.
  11327. quic_params_->connection_options.push_back(quic::kRVCM);
  11328. const quic::QuicConfig* config =
  11329. QuicStreamFactoryPeer::GetConfig(factory_.get());
  11330. EXPECT_EQ(quic_params_->connection_options, config->SendConnectionOptions());
  11331. EXPECT_TRUE(config->HasClientRequestedIndependentOption(
  11332. quic::kTBBR, quic::Perspective::IS_CLIENT));
  11333. EXPECT_TRUE(config->HasClientRequestedIndependentOption(
  11334. quic::k1RTT, quic::Perspective::IS_CLIENT));
  11335. }
  11336. // Verifies that the host resolver uses the request priority passed to
  11337. // QuicStreamRequest::Request().
  11338. TEST_P(QuicStreamFactoryTest, HostResolverUsesRequestPriority) {
  11339. Initialize();
  11340. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  11341. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  11342. MockQuicData socket_data(version_);
  11343. socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  11344. if (VersionUsesHttp3(version_.transport_version))
  11345. socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
  11346. socket_data.AddSocketDataToFactory(socket_factory_.get());
  11347. QuicStreamRequest request(factory_.get());
  11348. EXPECT_EQ(ERR_IO_PENDING,
  11349. request.Request(
  11350. scheme_host_port_, version_, privacy_mode_, MAXIMUM_PRIORITY,
  11351. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  11352. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  11353. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  11354. failed_on_default_network_callback_, callback_.callback()));
  11355. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  11356. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  11357. EXPECT_TRUE(stream.get());
  11358. EXPECT_EQ(MAXIMUM_PRIORITY, host_resolver_->last_request_priority());
  11359. EXPECT_TRUE(socket_data.AllReadDataConsumed());
  11360. EXPECT_TRUE(socket_data.AllWriteDataConsumed());
  11361. }
  11362. TEST_P(QuicStreamFactoryTest, HostResolverRequestReprioritizedOnSetPriority) {
  11363. Initialize();
  11364. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  11365. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  11366. MockQuicData socket_data(version_);
  11367. socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  11368. if (VersionUsesHttp3(version_.transport_version))
  11369. socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
  11370. socket_data.AddSocketDataToFactory(socket_factory_.get());
  11371. QuicStreamRequest request(factory_.get());
  11372. EXPECT_EQ(ERR_IO_PENDING,
  11373. request.Request(
  11374. scheme_host_port_, version_, privacy_mode_, MAXIMUM_PRIORITY,
  11375. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  11376. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  11377. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  11378. failed_on_default_network_callback_, callback_.callback()));
  11379. EXPECT_EQ(MAXIMUM_PRIORITY, host_resolver_->last_request_priority());
  11380. EXPECT_EQ(MAXIMUM_PRIORITY, host_resolver_->request_priority(1));
  11381. QuicStreamRequest request2(factory_.get());
  11382. EXPECT_EQ(ERR_IO_PENDING,
  11383. request2.Request(
  11384. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  11385. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  11386. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  11387. /*cert_verify_flags=*/0, url2_, net_log_, &net_error_details_,
  11388. failed_on_default_network_callback_, callback_.callback()));
  11389. EXPECT_EQ(DEFAULT_PRIORITY, host_resolver_->last_request_priority());
  11390. EXPECT_EQ(DEFAULT_PRIORITY, host_resolver_->request_priority(2));
  11391. request.SetPriority(LOWEST);
  11392. EXPECT_EQ(LOWEST, host_resolver_->request_priority(1));
  11393. EXPECT_EQ(DEFAULT_PRIORITY, host_resolver_->request_priority(2));
  11394. }
  11395. // Verifies that the host resolver uses the disable secure DNS setting and
  11396. // NetworkIsolationKey passed to QuicStreamRequest::Request().
  11397. TEST_P(QuicStreamFactoryTest, HostResolverUsesParams) {
  11398. const SchemefulSite kSite1(GURL("https://foo.test/"));
  11399. const SchemefulSite kSite2(GURL("https://bar.test/"));
  11400. const NetworkIsolationKey kNetworkIsolationKey(kSite1, kSite1);
  11401. base::test::ScopedFeatureList feature_list;
  11402. feature_list.InitWithFeatures(
  11403. // enabled_features
  11404. {features::kPartitionConnectionsByNetworkIsolationKey,
  11405. features::kSplitHostCacheByNetworkIsolationKey},
  11406. // disabled_features
  11407. {});
  11408. Initialize();
  11409. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  11410. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  11411. MockQuicData socket_data(version_);
  11412. socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  11413. if (VersionUsesHttp3(version_.transport_version))
  11414. socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
  11415. socket_data.AddSocketDataToFactory(socket_factory_.get());
  11416. QuicStreamRequest request(factory_.get());
  11417. EXPECT_EQ(ERR_IO_PENDING,
  11418. request.Request(
  11419. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  11420. SocketTag(), kNetworkIsolationKey, SecureDnsPolicy::kDisable,
  11421. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  11422. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  11423. failed_on_default_network_callback_, callback_.callback()));
  11424. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  11425. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  11426. EXPECT_TRUE(stream.get());
  11427. EXPECT_EQ(net::SecureDnsPolicy::kDisable,
  11428. host_resolver_->last_secure_dns_policy());
  11429. ASSERT_TRUE(host_resolver_->last_request_network_isolation_key().has_value());
  11430. EXPECT_EQ(kNetworkIsolationKey,
  11431. host_resolver_->last_request_network_isolation_key().value());
  11432. EXPECT_TRUE(socket_data.AllReadDataConsumed());
  11433. EXPECT_TRUE(socket_data.AllWriteDataConsumed());
  11434. }
  11435. // Passes |quic_max_time_before_crypto_handshake| and
  11436. // |quic_max_idle_time_before_crypto_handshake| to QuicStreamFactory,
  11437. // checks that its internal quic::QuicConfig is correct.
  11438. TEST_P(QuicStreamFactoryTest, ConfigMaxTimeBeforeCryptoHandshake) {
  11439. quic_params_->max_time_before_crypto_handshake = base::Seconds(11);
  11440. quic_params_->max_idle_time_before_crypto_handshake = base::Seconds(13);
  11441. Initialize();
  11442. const quic::QuicConfig* config =
  11443. QuicStreamFactoryPeer::GetConfig(factory_.get());
  11444. EXPECT_EQ(quic::QuicTime::Delta::FromSeconds(11),
  11445. config->max_time_before_crypto_handshake());
  11446. EXPECT_EQ(quic::QuicTime::Delta::FromSeconds(13),
  11447. config->max_idle_time_before_crypto_handshake());
  11448. }
  11449. // Verify ResultAfterHostResolutionCallback behavior when host resolution
  11450. // succeeds asynchronously, then crypto handshake fails synchronously.
  11451. TEST_P(QuicStreamFactoryTest, ResultAfterHostResolutionCallbackAsyncSync) {
  11452. Initialize();
  11453. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  11454. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  11455. host_resolver_->set_ondemand_mode(true);
  11456. MockQuicData socket_data(version_);
  11457. socket_data.AddRead(SYNCHRONOUS, ERR_FAILED);
  11458. socket_data.AddWrite(SYNCHRONOUS, ERR_FAILED);
  11459. socket_data.AddSocketDataToFactory(socket_factory_.get());
  11460. QuicStreamRequest request(factory_.get());
  11461. EXPECT_EQ(ERR_IO_PENDING,
  11462. request.Request(
  11463. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  11464. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  11465. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  11466. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  11467. failed_on_default_network_callback_, callback_.callback()));
  11468. TestCompletionCallback host_resolution_callback;
  11469. EXPECT_TRUE(
  11470. request.WaitForHostResolution(host_resolution_callback.callback()));
  11471. // |host_resolver_| has not finished host resolution at this point, so
  11472. // |host_resolution_callback| should not have a result.
  11473. base::RunLoop().RunUntilIdle();
  11474. EXPECT_FALSE(host_resolution_callback.have_result());
  11475. // Allow |host_resolver_| to finish host resolution.
  11476. // Since the request fails immediately after host resolution (getting
  11477. // ERR_FAILED from socket reads/writes), |host_resolution_callback| should be
  11478. // called with ERR_QUIC_PROTOCOL_ERROR since that's the next result in
  11479. // forming the connection.
  11480. host_resolver_->ResolveAllPending();
  11481. base::RunLoop().RunUntilIdle();
  11482. EXPECT_TRUE(host_resolution_callback.have_result());
  11483. EXPECT_EQ(ERR_QUIC_PROTOCOL_ERROR, host_resolution_callback.WaitForResult());
  11484. // Calling WaitForHostResolution() a second time should return
  11485. // false since host resolution has finished already.
  11486. EXPECT_FALSE(
  11487. request.WaitForHostResolution(host_resolution_callback.callback()));
  11488. EXPECT_TRUE(callback_.have_result());
  11489. EXPECT_EQ(ERR_QUIC_PROTOCOL_ERROR, callback_.WaitForResult());
  11490. }
  11491. // Verify ResultAfterHostResolutionCallback behavior when host resolution
  11492. // succeeds asynchronously, then crypto handshake fails asynchronously.
  11493. TEST_P(QuicStreamFactoryTest, ResultAfterHostResolutionCallbackAsyncAsync) {
  11494. Initialize();
  11495. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  11496. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  11497. host_resolver_->set_ondemand_mode(true);
  11498. crypto_client_stream_factory_.set_handshake_mode(
  11499. MockCryptoClientStream::ZERO_RTT);
  11500. factory_->set_is_quic_known_to_work_on_current_network(false);
  11501. MockQuicData socket_data(version_);
  11502. socket_data.AddRead(ASYNC, ERR_IO_PENDING); // Pause
  11503. socket_data.AddRead(ASYNC, ERR_FAILED);
  11504. socket_data.AddWrite(ASYNC, ERR_FAILED);
  11505. socket_data.AddSocketDataToFactory(socket_factory_.get());
  11506. QuicStreamRequest request(factory_.get());
  11507. EXPECT_EQ(ERR_IO_PENDING,
  11508. request.Request(
  11509. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  11510. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  11511. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  11512. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  11513. failed_on_default_network_callback_, callback_.callback()));
  11514. TestCompletionCallback host_resolution_callback;
  11515. EXPECT_TRUE(
  11516. request.WaitForHostResolution(host_resolution_callback.callback()));
  11517. // |host_resolver_| has not finished host resolution at this point, so
  11518. // |host_resolution_callback| should not have a result.
  11519. base::RunLoop().RunUntilIdle();
  11520. EXPECT_FALSE(host_resolution_callback.have_result());
  11521. // Allow |host_resolver_| to finish host resolution. Since crypto handshake
  11522. // will hang after host resolution, |host_resolution_callback| should run with
  11523. // ERR_IO_PENDING since that's the next result in forming the connection.
  11524. host_resolver_->ResolveAllPending();
  11525. base::RunLoop().RunUntilIdle();
  11526. EXPECT_TRUE(host_resolution_callback.have_result());
  11527. EXPECT_EQ(ERR_IO_PENDING, host_resolution_callback.WaitForResult());
  11528. // Calling WaitForHostResolution() a second time should return
  11529. // false since host resolution has finished already.
  11530. EXPECT_FALSE(
  11531. request.WaitForHostResolution(host_resolution_callback.callback()));
  11532. EXPECT_FALSE(callback_.have_result());
  11533. socket_data.GetSequencedSocketData()->Resume();
  11534. base::RunLoop().RunUntilIdle();
  11535. EXPECT_TRUE(callback_.have_result());
  11536. EXPECT_EQ(ERR_QUIC_PROTOCOL_ERROR, callback_.WaitForResult());
  11537. }
  11538. // Verify ResultAfterHostResolutionCallback behavior when host resolution
  11539. // succeeds synchronously, then crypto handshake fails synchronously.
  11540. TEST_P(QuicStreamFactoryTest, ResultAfterHostResolutionCallbackSyncSync) {
  11541. Initialize();
  11542. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  11543. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  11544. host_resolver_->set_synchronous_mode(true);
  11545. MockQuicData socket_data(version_);
  11546. socket_data.AddRead(SYNCHRONOUS, ERR_FAILED);
  11547. socket_data.AddWrite(SYNCHRONOUS, ERR_FAILED);
  11548. socket_data.AddSocketDataToFactory(socket_factory_.get());
  11549. QuicStreamRequest request(factory_.get());
  11550. EXPECT_EQ(ERR_QUIC_PROTOCOL_ERROR,
  11551. request.Request(
  11552. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  11553. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  11554. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  11555. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  11556. failed_on_default_network_callback_, callback_.callback()));
  11557. // WaitForHostResolution() should return false since host
  11558. // resolution has finished already.
  11559. TestCompletionCallback host_resolution_callback;
  11560. EXPECT_FALSE(
  11561. request.WaitForHostResolution(host_resolution_callback.callback()));
  11562. base::RunLoop().RunUntilIdle();
  11563. EXPECT_FALSE(host_resolution_callback.have_result());
  11564. EXPECT_FALSE(callback_.have_result());
  11565. }
  11566. // Verify ResultAfterHostResolutionCallback behavior when host resolution
  11567. // succeeds synchronously, then crypto handshake fails asynchronously.
  11568. TEST_P(QuicStreamFactoryTest, ResultAfterHostResolutionCallbackSyncAsync) {
  11569. Initialize();
  11570. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  11571. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  11572. // Host resolution will succeed synchronously, but Request() as a whole
  11573. // will fail asynchronously.
  11574. host_resolver_->set_synchronous_mode(true);
  11575. crypto_client_stream_factory_.set_handshake_mode(
  11576. MockCryptoClientStream::ZERO_RTT);
  11577. factory_->set_is_quic_known_to_work_on_current_network(false);
  11578. MockQuicData socket_data(version_);
  11579. socket_data.AddRead(ASYNC, ERR_IO_PENDING); // Pause
  11580. socket_data.AddRead(ASYNC, ERR_FAILED);
  11581. socket_data.AddWrite(ASYNC, ERR_FAILED);
  11582. socket_data.AddSocketDataToFactory(socket_factory_.get());
  11583. QuicStreamRequest request(factory_.get());
  11584. EXPECT_EQ(ERR_IO_PENDING,
  11585. request.Request(
  11586. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  11587. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  11588. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  11589. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  11590. failed_on_default_network_callback_, callback_.callback()));
  11591. // WaitForHostResolution() should return false since host
  11592. // resolution has finished already.
  11593. TestCompletionCallback host_resolution_callback;
  11594. EXPECT_FALSE(
  11595. request.WaitForHostResolution(host_resolution_callback.callback()));
  11596. base::RunLoop().RunUntilIdle();
  11597. EXPECT_FALSE(host_resolution_callback.have_result());
  11598. EXPECT_FALSE(callback_.have_result());
  11599. socket_data.GetSequencedSocketData()->Resume();
  11600. base::RunLoop().RunUntilIdle();
  11601. EXPECT_TRUE(callback_.have_result());
  11602. EXPECT_EQ(ERR_QUIC_PROTOCOL_ERROR, callback_.WaitForResult());
  11603. }
  11604. // Verify ResultAfterHostResolutionCallback behavior when host resolution fails
  11605. // synchronously.
  11606. TEST_P(QuicStreamFactoryTest, ResultAfterHostResolutionCallbackFailSync) {
  11607. Initialize();
  11608. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  11609. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  11610. // Host resolution will fail synchronously.
  11611. host_resolver_->rules()->AddSimulatedFailure(scheme_host_port_.host());
  11612. host_resolver_->set_synchronous_mode(true);
  11613. QuicStreamRequest request(factory_.get());
  11614. EXPECT_EQ(ERR_NAME_NOT_RESOLVED,
  11615. request.Request(
  11616. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  11617. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  11618. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  11619. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  11620. failed_on_default_network_callback_, callback_.callback()));
  11621. // WaitForHostResolution() should return false since host
  11622. // resolution has failed already.
  11623. TestCompletionCallback host_resolution_callback;
  11624. EXPECT_FALSE(
  11625. request.WaitForHostResolution(host_resolution_callback.callback()));
  11626. base::RunLoop().RunUntilIdle();
  11627. EXPECT_FALSE(host_resolution_callback.have_result());
  11628. }
  11629. // Verify ResultAfterHostResolutionCallback behavior when host resolution fails
  11630. // asynchronously.
  11631. TEST_P(QuicStreamFactoryTest, ResultAfterHostResolutionCallbackFailAsync) {
  11632. Initialize();
  11633. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  11634. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  11635. host_resolver_->rules()->AddSimulatedFailure(scheme_host_port_.host());
  11636. QuicStreamRequest request(factory_.get());
  11637. EXPECT_EQ(ERR_IO_PENDING,
  11638. request.Request(
  11639. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  11640. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  11641. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  11642. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  11643. failed_on_default_network_callback_, callback_.callback()));
  11644. TestCompletionCallback host_resolution_callback;
  11645. EXPECT_TRUE(
  11646. request.WaitForHostResolution(host_resolution_callback.callback()));
  11647. // Allow |host_resolver_| to fail host resolution. |host_resolution_callback|
  11648. // Should run with ERR_NAME_NOT_RESOLVED since that's the error host
  11649. // resolution failed with.
  11650. base::RunLoop().RunUntilIdle();
  11651. EXPECT_TRUE(host_resolution_callback.have_result());
  11652. EXPECT_EQ(ERR_NAME_NOT_RESOLVED, host_resolution_callback.WaitForResult());
  11653. EXPECT_TRUE(callback_.have_result());
  11654. EXPECT_EQ(ERR_NAME_NOT_RESOLVED, callback_.WaitForResult());
  11655. }
  11656. // With dns race experiment turned on, and DNS resolve succeeds synchronously,
  11657. // the final connection is established through the resolved DNS. No racing
  11658. // connection.
  11659. TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceAndHostResolutionSync) {
  11660. quic_params_->race_stale_dns_on_connection = true;
  11661. host_resolver_ = std::make_unique<MockCachingHostResolver>();
  11662. Initialize();
  11663. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  11664. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  11665. // Set up an address in stale resolver cache.
  11666. host_resolver_->set_synchronous_mode(true);
  11667. host_resolver_->rules()->AddRule(scheme_host_port_.host(), kCachedIPAddress);
  11668. host_resolver_->LoadIntoCache(scheme_host_port_, NetworkIsolationKey(),
  11669. /*optional_parameters=*/absl::nullopt);
  11670. // Expire the cache
  11671. host_resolver_->GetHostCache()->Invalidate();
  11672. // Change to different address for fresh host resolutions.
  11673. host_resolver_->rules()->ClearRules();
  11674. host_resolver_->rules()->AddRule(scheme_host_port_.host(),
  11675. kNonCachedIPAddress);
  11676. MockQuicData quic_data(version_);
  11677. quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  11678. if (VersionUsesHttp3(version_.transport_version))
  11679. quic_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
  11680. quic_data.AddSocketDataToFactory(socket_factory_.get());
  11681. QuicStreamRequest request(factory_.get());
  11682. EXPECT_THAT(request.Request(
  11683. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  11684. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  11685. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  11686. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  11687. failed_on_default_network_callback_, callback_.callback()),
  11688. IsOk());
  11689. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  11690. EXPECT_TRUE(stream.get());
  11691. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  11692. EXPECT_EQ(session->peer_address().host().ToString(), kNonCachedIPAddress);
  11693. EXPECT_TRUE(quic_data.AllReadDataConsumed());
  11694. EXPECT_TRUE(quic_data.AllWriteDataConsumed());
  11695. }
  11696. // With dns race experiment on, DNS resolve returns async, no matching cache in
  11697. // host resolver, connection should be successful and through resolved DNS. No
  11698. // racing connection.
  11699. TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceAndHostResolutionAsync) {
  11700. host_resolver_ = std::make_unique<MockCachingHostResolver>();
  11701. Initialize();
  11702. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  11703. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  11704. // Set an address in resolver for asynchronous return.
  11705. host_resolver_->set_ondemand_mode(true);
  11706. host_resolver_->rules()->AddIPLiteralRule(scheme_host_port_.host(),
  11707. kNonCachedIPAddress, "");
  11708. MockQuicData quic_data(version_);
  11709. quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  11710. if (VersionUsesHttp3(version_.transport_version))
  11711. quic_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
  11712. quic_data.AddSocketDataToFactory(socket_factory_.get());
  11713. QuicStreamRequest request(factory_.get());
  11714. EXPECT_EQ(ERR_IO_PENDING,
  11715. request.Request(
  11716. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  11717. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  11718. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  11719. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  11720. failed_on_default_network_callback_, callback_.callback()));
  11721. TestCompletionCallback host_resolution_callback;
  11722. EXPECT_TRUE(
  11723. request.WaitForHostResolution(host_resolution_callback.callback()));
  11724. base::RunLoop().RunUntilIdle();
  11725. EXPECT_FALSE(host_resolution_callback.have_result());
  11726. // Cause the host resolution to return.
  11727. host_resolver_->ResolveAllPending();
  11728. EXPECT_THAT(host_resolution_callback.WaitForResult(), IsOk());
  11729. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  11730. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  11731. EXPECT_TRUE(stream.get());
  11732. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  11733. EXPECT_EQ(session->peer_address().host().ToString(), kNonCachedIPAddress);
  11734. EXPECT_TRUE(quic_data.AllReadDataConsumed());
  11735. EXPECT_TRUE(quic_data.AllWriteDataConsumed());
  11736. }
  11737. // With dns race experiment on, DNS resolve returns async, stale dns used,
  11738. // connects synchrounously, and then the resolved DNS matches.
  11739. TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceHostResolveAsyncStaleMatch) {
  11740. quic_params_->race_stale_dns_on_connection = true;
  11741. host_resolver_ = std::make_unique<MockCachingHostResolver>();
  11742. Initialize();
  11743. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  11744. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  11745. // Set up an address in stale resolver cache.
  11746. host_resolver_->set_ondemand_mode(true);
  11747. host_resolver_->rules()->AddRule(scheme_host_port_.host(), kCachedIPAddress);
  11748. host_resolver_->LoadIntoCache(scheme_host_port_, NetworkIsolationKey(),
  11749. /*optional_parameters=*/absl::nullopt);
  11750. // Expire the cache
  11751. host_resolver_->GetHostCache()->Invalidate();
  11752. MockQuicData quic_data(version_);
  11753. quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  11754. if (VersionUsesHttp3(version_.transport_version))
  11755. quic_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
  11756. quic_data.AddSocketDataToFactory(socket_factory_.get());
  11757. QuicStreamRequest request(factory_.get());
  11758. EXPECT_EQ(ERR_IO_PENDING,
  11759. request.Request(
  11760. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  11761. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  11762. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  11763. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  11764. failed_on_default_network_callback_, callback_.callback()));
  11765. // Check that the racing job is running.
  11766. EXPECT_TRUE(HasLiveSession(scheme_host_port_));
  11767. EXPECT_TRUE(HasActiveJob(scheme_host_port_, privacy_mode_));
  11768. // Resolve dns and return.
  11769. host_resolver_->ResolveAllPending();
  11770. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  11771. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  11772. EXPECT_TRUE(stream.get());
  11773. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  11774. EXPECT_EQ(session->peer_address().host().ToString(), kCachedIPAddress);
  11775. EXPECT_TRUE(quic_data.AllReadDataConsumed());
  11776. EXPECT_TRUE(quic_data.AllWriteDataConsumed());
  11777. }
  11778. // With dns race experiment on, dns resolve async, stale dns used, connect
  11779. // async, and then the result matches.
  11780. TEST_P(QuicStreamFactoryTest,
  11781. ResultAfterDNSRaceHostResolveAsyncConnectAsyncStaleMatch) {
  11782. quic_params_->race_stale_dns_on_connection = true;
  11783. host_resolver_ = std::make_unique<MockCachingHostResolver>();
  11784. Initialize();
  11785. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  11786. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  11787. // Set up an address in stale resolver cache.
  11788. host_resolver_->set_ondemand_mode(true);
  11789. host_resolver_->rules()->AddRule(scheme_host_port_.host(), kCachedIPAddress);
  11790. host_resolver_->LoadIntoCache(scheme_host_port_, NetworkIsolationKey(),
  11791. /*optional_parameters=*/absl::nullopt);
  11792. // Expire the cache
  11793. host_resolver_->GetHostCache()->Invalidate();
  11794. factory_->set_is_quic_known_to_work_on_current_network(false);
  11795. crypto_client_stream_factory_.set_handshake_mode(
  11796. MockCryptoClientStream::ZERO_RTT);
  11797. MockQuicData quic_data(version_);
  11798. quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  11799. client_maker_.SetEncryptionLevel(quic::ENCRYPTION_ZERO_RTT);
  11800. if (VersionUsesHttp3(version_.transport_version))
  11801. quic_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
  11802. quic_data.AddSocketDataToFactory(socket_factory_.get());
  11803. QuicStreamRequest request(factory_.get());
  11804. EXPECT_EQ(ERR_IO_PENDING,
  11805. request.Request(
  11806. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  11807. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  11808. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  11809. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  11810. failed_on_default_network_callback_, callback_.callback()));
  11811. // Send Crypto handshake so connect will call back.
  11812. crypto_client_stream_factory_.last_stream()
  11813. ->NotifySessionOneRttKeyAvailable();
  11814. base::RunLoop().RunUntilIdle();
  11815. // Check that the racing job is running.
  11816. EXPECT_TRUE(HasLiveSession(scheme_host_port_));
  11817. EXPECT_TRUE(HasActiveJob(scheme_host_port_, privacy_mode_));
  11818. // Resolve dns and call back, make sure job finishes.
  11819. host_resolver_->ResolveAllPending();
  11820. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  11821. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  11822. EXPECT_TRUE(stream.get());
  11823. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  11824. EXPECT_EQ(session->peer_address().host().ToString(), kCachedIPAddress);
  11825. EXPECT_TRUE(quic_data.AllReadDataConsumed());
  11826. EXPECT_TRUE(quic_data.AllWriteDataConsumed());
  11827. }
  11828. // With dns race experiment on, dns resolve async, stale dns used, dns resolve
  11829. // return, then connection finishes and matches with the result.
  11830. TEST_P(QuicStreamFactoryTest,
  11831. ResultAfterDNSRaceHostResolveAsyncStaleMatchConnectAsync) {
  11832. quic_params_->race_stale_dns_on_connection = true;
  11833. host_resolver_ = std::make_unique<MockCachingHostResolver>();
  11834. Initialize();
  11835. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  11836. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  11837. // Set up an address in stale resolver cache.
  11838. host_resolver_->set_ondemand_mode(true);
  11839. host_resolver_->rules()->AddRule(scheme_host_port_.host(), kCachedIPAddress);
  11840. host_resolver_->LoadIntoCache(scheme_host_port_, NetworkIsolationKey(),
  11841. /*optional_parameters=*/absl::nullopt);
  11842. // Expire the cache
  11843. host_resolver_->GetHostCache()->Invalidate();
  11844. factory_->set_is_quic_known_to_work_on_current_network(false);
  11845. crypto_client_stream_factory_.set_handshake_mode(
  11846. MockCryptoClientStream::ZERO_RTT);
  11847. MockQuicData quic_data(version_);
  11848. quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  11849. client_maker_.SetEncryptionLevel(quic::ENCRYPTION_ZERO_RTT);
  11850. if (VersionUsesHttp3(version_.transport_version))
  11851. quic_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
  11852. quic_data.AddSocketDataToFactory(socket_factory_.get());
  11853. QuicStreamRequest request(factory_.get());
  11854. EXPECT_EQ(ERR_IO_PENDING,
  11855. request.Request(
  11856. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  11857. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  11858. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  11859. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  11860. failed_on_default_network_callback_, callback_.callback()));
  11861. // Finish dns async, check we still need to wait for stale connection async.
  11862. host_resolver_->ResolveAllPending();
  11863. base::RunLoop().RunUntilIdle();
  11864. EXPECT_FALSE(callback_.have_result());
  11865. // Finish stale connection async, and the stale connection should pass dns
  11866. // validation.
  11867. crypto_client_stream_factory_.last_stream()
  11868. ->NotifySessionOneRttKeyAvailable();
  11869. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  11870. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  11871. EXPECT_TRUE(stream.get());
  11872. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  11873. EXPECT_EQ(session->peer_address().host().ToString(), kCachedIPAddress);
  11874. EXPECT_TRUE(quic_data.AllReadDataConsumed());
  11875. EXPECT_TRUE(quic_data.AllWriteDataConsumed());
  11876. }
  11877. // With dns race experiment on, dns resolve async, stale used and connects
  11878. // sync, but dns no match
  11879. TEST_P(QuicStreamFactoryTest,
  11880. ResultAfterDNSRaceHostResolveAsyncStaleSyncNoMatch) {
  11881. quic_params_->race_stale_dns_on_connection = true;
  11882. host_resolver_ = std::make_unique<MockCachingHostResolver>();
  11883. Initialize();
  11884. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  11885. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  11886. // Set up an address in stale resolver cache.
  11887. host_resolver_->set_ondemand_mode(true);
  11888. host_resolver_->rules()->AddRule(scheme_host_port_.host(), kCachedIPAddress);
  11889. host_resolver_->LoadIntoCache(scheme_host_port_, NetworkIsolationKey(),
  11890. /*optional_parameters=*/absl::nullopt);
  11891. // Expire the cache
  11892. host_resolver_->GetHostCache()->Invalidate();
  11893. // Change to different address for fresh host resolutions.
  11894. host_resolver_->rules()->ClearRules();
  11895. host_resolver_->rules()->AddRule(scheme_host_port_.host(),
  11896. kNonCachedIPAddress);
  11897. // Socket for the stale connection which will invoke connection closure.
  11898. MockQuicData quic_data(version_);
  11899. quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  11900. int packet_num = 1;
  11901. if (VersionUsesHttp3(version_.transport_version)) {
  11902. quic_data.AddWrite(SYNCHRONOUS,
  11903. ConstructInitialSettingsPacket(packet_num++));
  11904. }
  11905. quic_data.AddWrite(SYNCHRONOUS,
  11906. client_maker_.MakeConnectionClosePacket(
  11907. packet_num++, true,
  11908. quic::QUIC_STALE_CONNECTION_CANCELLED, "net error"));
  11909. quic_data.AddSocketDataToFactory(socket_factory_.get());
  11910. // Socket for the new connection.
  11911. client_maker_.Reset();
  11912. MockQuicData quic_data2(version_);
  11913. quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  11914. if (VersionUsesHttp3(version_.transport_version))
  11915. quic_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
  11916. quic_data2.AddSocketDataToFactory(socket_factory_.get());
  11917. QuicStreamRequest request(factory_.get());
  11918. EXPECT_EQ(ERR_IO_PENDING,
  11919. request.Request(
  11920. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  11921. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  11922. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  11923. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  11924. failed_on_default_network_callback_, callback_.callback()));
  11925. // Check the stale connection is running.
  11926. EXPECT_TRUE(HasLiveSession(scheme_host_port_));
  11927. EXPECT_TRUE(HasActiveJob(scheme_host_port_, privacy_mode_));
  11928. // Finish dns resolution and check the job has finished.
  11929. host_resolver_->ResolveAllPending();
  11930. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  11931. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  11932. EXPECT_TRUE(stream.get());
  11933. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  11934. EXPECT_EQ(session->peer_address().host().ToString(), kNonCachedIPAddress);
  11935. EXPECT_TRUE(quic_data.AllReadDataConsumed());
  11936. EXPECT_TRUE(quic_data.AllWriteDataConsumed());
  11937. EXPECT_TRUE(quic_data2.AllReadDataConsumed());
  11938. EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
  11939. }
  11940. // With dns race experiment on, dns resolve async, stale used and connects
  11941. // async, finishes before dns, but no match
  11942. TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceStaleAsyncResolveAsyncNoMatch) {
  11943. quic_params_->race_stale_dns_on_connection = true;
  11944. host_resolver_ = std::make_unique<MockCachingHostResolver>();
  11945. Initialize();
  11946. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  11947. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  11948. // Set up an address in stale resolver cache.
  11949. host_resolver_->set_ondemand_mode(true);
  11950. host_resolver_->rules()->AddRule(scheme_host_port_.host(), kCachedIPAddress);
  11951. host_resolver_->LoadIntoCache(scheme_host_port_, NetworkIsolationKey(),
  11952. /*optional_parameters=*/absl::nullopt);
  11953. // Expire the cache
  11954. host_resolver_->GetHostCache()->Invalidate();
  11955. // Change to different address for fresh host resolutions.
  11956. host_resolver_->rules()->ClearRules();
  11957. host_resolver_->rules()->AddRule(scheme_host_port_.host(),
  11958. kNonCachedIPAddress);
  11959. factory_->set_is_quic_known_to_work_on_current_network(false);
  11960. crypto_client_stream_factory_.set_handshake_mode(
  11961. MockCryptoClientStream::ZERO_RTT);
  11962. MockQuicData quic_data(version_);
  11963. quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  11964. int packet_num = 1;
  11965. client_maker_.SetEncryptionLevel(quic::ENCRYPTION_ZERO_RTT);
  11966. if (VersionUsesHttp3(version_.transport_version)) {
  11967. quic_data.AddWrite(SYNCHRONOUS,
  11968. ConstructInitialSettingsPacket(packet_num++));
  11969. }
  11970. client_maker_.SetEncryptionLevel(quic::ENCRYPTION_FORWARD_SECURE);
  11971. quic_data.AddWrite(SYNCHRONOUS,
  11972. client_maker_.MakeConnectionClosePacket(
  11973. packet_num++, true,
  11974. quic::QUIC_STALE_CONNECTION_CANCELLED, "net error"));
  11975. quic_data.AddSocketDataToFactory(socket_factory_.get());
  11976. client_maker_.Reset();
  11977. MockQuicData quic_data2(version_);
  11978. quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  11979. client_maker_.SetEncryptionLevel(quic::ENCRYPTION_ZERO_RTT);
  11980. if (VersionUsesHttp3(version_.transport_version)) {
  11981. quic_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
  11982. }
  11983. quic_data2.AddSocketDataToFactory(socket_factory_.get());
  11984. QuicStreamRequest request(factory_.get());
  11985. EXPECT_EQ(ERR_IO_PENDING,
  11986. request.Request(
  11987. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  11988. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  11989. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  11990. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  11991. failed_on_default_network_callback_, callback_.callback()));
  11992. // Finish the stale connection.
  11993. crypto_client_stream_factory_.last_stream()
  11994. ->NotifySessionOneRttKeyAvailable();
  11995. base::RunLoop().RunUntilIdle();
  11996. EXPECT_TRUE(HasLiveSession(scheme_host_port_));
  11997. EXPECT_TRUE(HasActiveJob(scheme_host_port_, privacy_mode_));
  11998. // Finish host resolution and check the job is done.
  11999. host_resolver_->ResolveAllPending();
  12000. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  12001. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  12002. EXPECT_TRUE(stream.get());
  12003. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  12004. EXPECT_EQ(session->peer_address().host().ToString(), kNonCachedIPAddress);
  12005. EXPECT_TRUE(quic_data.AllReadDataConsumed());
  12006. EXPECT_TRUE(quic_data.AllWriteDataConsumed());
  12007. EXPECT_TRUE(quic_data2.AllReadDataConsumed());
  12008. EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
  12009. }
  12010. // With dns race experiment on, dns resolve async, stale used and connects
  12011. // async, dns finishes first, but no match
  12012. TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceResolveAsyncStaleAsyncNoMatch) {
  12013. quic_params_->race_stale_dns_on_connection = true;
  12014. host_resolver_ = std::make_unique<MockCachingHostResolver>();
  12015. Initialize();
  12016. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  12017. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  12018. // Set up an address in stale resolver cache.
  12019. host_resolver_->set_ondemand_mode(true);
  12020. host_resolver_->rules()->AddRule(scheme_host_port_.host(), kCachedIPAddress);
  12021. host_resolver_->LoadIntoCache(scheme_host_port_, NetworkIsolationKey(),
  12022. /*optional_parameters=*/absl::nullopt);
  12023. // Expire the cache
  12024. host_resolver_->GetHostCache()->Invalidate();
  12025. // Change to different address for fresh host resolutions.
  12026. host_resolver_->rules()->ClearRules();
  12027. host_resolver_->rules()->AddRule(scheme_host_port_.host(),
  12028. kNonCachedIPAddress);
  12029. factory_->set_is_quic_known_to_work_on_current_network(false);
  12030. crypto_client_stream_factory_.set_handshake_mode(
  12031. MockCryptoClientStream::ZERO_RTT);
  12032. MockQuicData quic_data(version_);
  12033. quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  12034. client_maker_.SetEncryptionLevel(quic::ENCRYPTION_ZERO_RTT);
  12035. int packet_number = 1;
  12036. if (VersionUsesHttp3(version_.transport_version))
  12037. quic_data.AddWrite(SYNCHRONOUS,
  12038. ConstructInitialSettingsPacket(packet_number++));
  12039. quic_data.AddWrite(SYNCHRONOUS,
  12040. client_maker_.MakeConnectionClosePacket(
  12041. packet_number++, true,
  12042. quic::QUIC_STALE_CONNECTION_CANCELLED, "net error"));
  12043. quic_data.AddSocketDataToFactory(socket_factory_.get());
  12044. client_maker_.Reset();
  12045. MockQuicData quic_data2(version_);
  12046. quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  12047. if (VersionUsesHttp3(version_.transport_version))
  12048. quic_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
  12049. quic_data2.AddSocketDataToFactory(socket_factory_.get());
  12050. QuicStreamRequest request(factory_.get());
  12051. EXPECT_EQ(ERR_IO_PENDING,
  12052. request.Request(
  12053. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  12054. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  12055. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  12056. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  12057. failed_on_default_network_callback_, callback_.callback()));
  12058. // Finish dns resolution, but need to wait for stale connection.
  12059. host_resolver_->ResolveAllPending();
  12060. base::RunLoop().RunUntilIdle();
  12061. crypto_client_stream_factory_.last_stream()
  12062. ->NotifySessionOneRttKeyAvailable();
  12063. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  12064. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  12065. EXPECT_TRUE(stream.get());
  12066. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  12067. EXPECT_EQ(session->peer_address().host().ToString(), kNonCachedIPAddress);
  12068. EXPECT_TRUE(quic_data.AllReadDataConsumed());
  12069. EXPECT_TRUE(quic_data.AllWriteDataConsumed());
  12070. EXPECT_TRUE(quic_data2.AllReadDataConsumed());
  12071. EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
  12072. }
  12073. // With dns race experiment on, dns resolve returns error sync, same behavior
  12074. // as experiment is not on
  12075. TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceHostResolveError) {
  12076. quic_params_->race_stale_dns_on_connection = true;
  12077. host_resolver_ = std::make_unique<MockCachingHostResolver>();
  12078. Initialize();
  12079. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  12080. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  12081. // Set synchronous failure in resolver.
  12082. host_resolver_->set_synchronous_mode(true);
  12083. host_resolver_->rules()->AddSimulatedFailure(scheme_host_port_.host());
  12084. MockQuicData quic_data(version_);
  12085. quic_data.AddSocketDataToFactory(socket_factory_.get());
  12086. QuicStreamRequest request(factory_.get());
  12087. EXPECT_EQ(ERR_NAME_NOT_RESOLVED,
  12088. request.Request(
  12089. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  12090. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  12091. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  12092. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  12093. failed_on_default_network_callback_, callback_.callback()));
  12094. }
  12095. // With dns race experiment on, no cache available, dns resolve returns error
  12096. // async
  12097. TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceHostResolveAsyncError) {
  12098. quic_params_->race_stale_dns_on_connection = true;
  12099. host_resolver_ = std::make_unique<MockCachingHostResolver>();
  12100. Initialize();
  12101. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  12102. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  12103. // Set asynchronous failure in resolver.
  12104. host_resolver_->set_ondemand_mode(true);
  12105. host_resolver_->rules()->AddSimulatedFailure(scheme_host_port_.host());
  12106. MockQuicData quic_data(version_);
  12107. quic_data.AddSocketDataToFactory(socket_factory_.get());
  12108. QuicStreamRequest request(factory_.get());
  12109. EXPECT_EQ(ERR_IO_PENDING,
  12110. request.Request(
  12111. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  12112. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  12113. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  12114. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  12115. failed_on_default_network_callback_, callback_.callback()));
  12116. // Resolve and expect result that shows the resolution error.
  12117. host_resolver_->ResolveAllPending();
  12118. EXPECT_THAT(callback_.WaitForResult(), IsError(ERR_NAME_NOT_RESOLVED));
  12119. }
  12120. // With dns race experiment on, dns resolve async, staled used and connects
  12121. // sync, dns returns error and no connection is established.
  12122. TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceStaleSyncHostResolveError) {
  12123. quic_params_->race_stale_dns_on_connection = true;
  12124. host_resolver_ = std::make_unique<MockCachingHostResolver>();
  12125. Initialize();
  12126. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  12127. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  12128. // Set up an address in stale resolver cache.
  12129. host_resolver_->set_ondemand_mode(true);
  12130. host_resolver_->rules()->AddRule(scheme_host_port_.host(), kCachedIPAddress);
  12131. host_resolver_->LoadIntoCache(scheme_host_port_, NetworkIsolationKey(),
  12132. /*optional_parameters=*/absl::nullopt);
  12133. // Expire the cache
  12134. host_resolver_->GetHostCache()->Invalidate();
  12135. // Change to failure for fresh host resolutions.
  12136. host_resolver_->rules()->ClearRules();
  12137. host_resolver_->rules()->AddRule(scheme_host_port_.host(),
  12138. ERR_NAME_NOT_RESOLVED);
  12139. // Socket for the stale connection which is supposed to disconnect.
  12140. MockQuicData quic_data(version_);
  12141. quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  12142. int packet_num = 1;
  12143. if (VersionUsesHttp3(version_.transport_version)) {
  12144. quic_data.AddWrite(SYNCHRONOUS,
  12145. ConstructInitialSettingsPacket(packet_num++));
  12146. }
  12147. quic_data.AddWrite(SYNCHRONOUS,
  12148. client_maker_.MakeConnectionClosePacket(
  12149. packet_num++, true,
  12150. quic::QUIC_STALE_CONNECTION_CANCELLED, "net error"));
  12151. quic_data.AddSocketDataToFactory(socket_factory_.get());
  12152. QuicStreamRequest request(factory_.get());
  12153. EXPECT_EQ(ERR_IO_PENDING,
  12154. request.Request(
  12155. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  12156. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  12157. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  12158. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  12159. failed_on_default_network_callback_, callback_.callback()));
  12160. // Check that the stale connection is running.
  12161. EXPECT_TRUE(HasLiveSession(scheme_host_port_));
  12162. EXPECT_TRUE(HasActiveJob(scheme_host_port_, privacy_mode_));
  12163. // Finish host resolution.
  12164. host_resolver_->ResolveAllPending();
  12165. EXPECT_THAT(callback_.WaitForResult(), IsError(ERR_NAME_NOT_RESOLVED));
  12166. EXPECT_TRUE(quic_data.AllReadDataConsumed());
  12167. EXPECT_TRUE(quic_data.AllWriteDataConsumed());
  12168. }
  12169. // With dns race experiment on, dns resolve async, stale used and connection
  12170. // return error, then dns matches.
  12171. // This serves as a regression test for crbug.com/956374.
  12172. TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceStaleErrorDNSMatches) {
  12173. quic_params_->race_stale_dns_on_connection = true;
  12174. host_resolver_ = std::make_unique<MockCachingHostResolver>();
  12175. Initialize();
  12176. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  12177. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  12178. // Set up an address in stale resolver cache.
  12179. host_resolver_->set_ondemand_mode(true);
  12180. host_resolver_->rules()->AddRule(scheme_host_port_.host(), kCachedIPAddress);
  12181. host_resolver_->LoadIntoCache(scheme_host_port_, NetworkIsolationKey(),
  12182. /*optional_parameters=*/absl::nullopt);
  12183. // Expire the cache
  12184. host_resolver_->GetHostCache()->Invalidate();
  12185. // Simulate synchronous connect failure.
  12186. MockQuicData quic_data(version_);
  12187. quic_data.AddConnect(SYNCHRONOUS, ERR_ADDRESS_IN_USE);
  12188. quic_data.AddSocketDataToFactory(socket_factory_.get());
  12189. MockQuicData quic_data2(version_);
  12190. quic_data2.AddConnect(SYNCHRONOUS, ERR_ADDRESS_IN_USE);
  12191. quic_data2.AddSocketDataToFactory(socket_factory_.get());
  12192. QuicStreamRequest request(factory_.get());
  12193. EXPECT_EQ(ERR_IO_PENDING,
  12194. request.Request(
  12195. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  12196. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  12197. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  12198. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  12199. failed_on_default_network_callback_, callback_.callback()));
  12200. EXPECT_FALSE(HasLiveSession(scheme_host_port_));
  12201. EXPECT_TRUE(HasActiveJob(scheme_host_port_, privacy_mode_));
  12202. host_resolver_->ResolveAllPending();
  12203. EXPECT_THAT(callback_.WaitForResult(), IsError(ERR_ADDRESS_IN_USE));
  12204. }
  12205. // With dns race experiment on, dns resolve async, stale used and connection
  12206. // returns error, dns no match, new connection is established
  12207. TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceStaleErrorDNSNoMatch) {
  12208. quic_params_->race_stale_dns_on_connection = true;
  12209. host_resolver_ = std::make_unique<MockCachingHostResolver>();
  12210. Initialize();
  12211. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  12212. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  12213. // Set up an address in stale resolver cache.
  12214. host_resolver_->set_ondemand_mode(true);
  12215. host_resolver_->rules()->AddRule(scheme_host_port_.host(), kCachedIPAddress);
  12216. host_resolver_->LoadIntoCache(scheme_host_port_, NetworkIsolationKey(),
  12217. /*optional_parameters=*/absl::nullopt);
  12218. // Expire the cache
  12219. host_resolver_->GetHostCache()->Invalidate();
  12220. // Change to different address for fresh host resolutions.
  12221. host_resolver_->rules()->ClearRules();
  12222. host_resolver_->rules()->AddRule(scheme_host_port_.host(),
  12223. kNonCachedIPAddress);
  12224. // Add failure for the stale connection.
  12225. MockQuicData quic_data(version_);
  12226. quic_data.AddConnect(SYNCHRONOUS, ERR_ADDRESS_IN_USE);
  12227. quic_data.AddSocketDataToFactory(socket_factory_.get());
  12228. client_maker_.Reset();
  12229. MockQuicData quic_data2(version_);
  12230. quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  12231. if (VersionUsesHttp3(version_.transport_version))
  12232. quic_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
  12233. quic_data2.AddSocketDataToFactory(socket_factory_.get());
  12234. QuicStreamRequest request(factory_.get());
  12235. EXPECT_EQ(ERR_IO_PENDING,
  12236. request.Request(
  12237. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  12238. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  12239. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  12240. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  12241. failed_on_default_network_callback_, callback_.callback()));
  12242. // Check that the stale connection fails.
  12243. EXPECT_FALSE(HasLiveSession(scheme_host_port_));
  12244. EXPECT_TRUE(HasActiveJob(scheme_host_port_, privacy_mode_));
  12245. // Finish host resolution and check the job finishes ok.
  12246. host_resolver_->ResolveAllPending();
  12247. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  12248. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  12249. EXPECT_TRUE(stream.get());
  12250. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  12251. EXPECT_EQ(session->peer_address().host().ToString(), kNonCachedIPAddress);
  12252. EXPECT_TRUE(quic_data2.AllReadDataConsumed());
  12253. EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
  12254. }
  12255. // With dns race experiment on, dns resolve async, stale used and connection
  12256. // returns error, dns no match, new connection error
  12257. TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceStaleErrorDNSNoMatchError) {
  12258. quic_params_->race_stale_dns_on_connection = true;
  12259. host_resolver_ = std::make_unique<MockCachingHostResolver>();
  12260. Initialize();
  12261. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  12262. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  12263. // Set up an address in stale resolver cache.
  12264. host_resolver_->set_ondemand_mode(true);
  12265. host_resolver_->rules()->AddRule(scheme_host_port_.host(), kCachedIPAddress);
  12266. host_resolver_->LoadIntoCache(scheme_host_port_, NetworkIsolationKey(),
  12267. /*optional_parameters=*/absl::nullopt);
  12268. // Expire the cache
  12269. host_resolver_->GetHostCache()->Invalidate();
  12270. // Change to different address for fresh host resolutions.
  12271. host_resolver_->rules()->ClearRules();
  12272. host_resolver_->rules()->AddRule(scheme_host_port_.host(),
  12273. kNonCachedIPAddress);
  12274. // Add failure for stale connection.
  12275. MockQuicData quic_data(version_);
  12276. quic_data.AddConnect(SYNCHRONOUS, ERR_ADDRESS_IN_USE);
  12277. quic_data.AddSocketDataToFactory(socket_factory_.get());
  12278. // Add failure for resolved dns connection.
  12279. MockQuicData quic_data2(version_);
  12280. quic_data2.AddConnect(SYNCHRONOUS, ERR_ADDRESS_IN_USE);
  12281. quic_data2.AddSocketDataToFactory(socket_factory_.get());
  12282. QuicStreamRequest request(factory_.get());
  12283. EXPECT_EQ(ERR_IO_PENDING,
  12284. request.Request(
  12285. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  12286. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  12287. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  12288. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  12289. failed_on_default_network_callback_, callback_.callback()));
  12290. // Check the stale connection fails.
  12291. EXPECT_FALSE(HasLiveSession(scheme_host_port_));
  12292. EXPECT_TRUE(HasActiveJob(scheme_host_port_, privacy_mode_));
  12293. // Check the resolved dns connection fails.
  12294. host_resolver_->ResolveAllPending();
  12295. EXPECT_THAT(callback_.WaitForResult(), IsError(ERR_ADDRESS_IN_USE));
  12296. }
  12297. // With dns race experiment on, dns resolve async and stale connect async, dns
  12298. // resolve returns error and then preconnect finishes
  12299. TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceResolveAsyncErrorStaleAsync) {
  12300. quic_params_->race_stale_dns_on_connection = true;
  12301. host_resolver_ = std::make_unique<MockCachingHostResolver>();
  12302. Initialize();
  12303. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  12304. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  12305. // Set up an address in stale resolver cache.
  12306. host_resolver_->set_ondemand_mode(true);
  12307. host_resolver_->rules()->AddRule(scheme_host_port_.host(), kCachedIPAddress);
  12308. host_resolver_->LoadIntoCache(scheme_host_port_, NetworkIsolationKey(),
  12309. /*optional_parameters=*/absl::nullopt);
  12310. // Expire the cache
  12311. host_resolver_->GetHostCache()->Invalidate();
  12312. // Change to error for fresh host resolutions.
  12313. host_resolver_->rules()->ClearRules();
  12314. host_resolver_->rules()->AddRule(scheme_host_port_.host(),
  12315. ERR_NAME_NOT_RESOLVED);
  12316. factory_->set_is_quic_known_to_work_on_current_network(false);
  12317. // Socket data for stale connection which is supposed to disconnect.
  12318. MockQuicData quic_data(version_);
  12319. quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  12320. int packet_number = 1;
  12321. if (VersionUsesHttp3(version_.transport_version)) {
  12322. quic_data.AddWrite(SYNCHRONOUS,
  12323. ConstructInitialSettingsPacket(packet_number++));
  12324. }
  12325. quic_data.AddWrite(SYNCHRONOUS,
  12326. client_maker_.MakeConnectionClosePacket(
  12327. packet_number++, true,
  12328. quic::QUIC_STALE_CONNECTION_CANCELLED, "net error"));
  12329. quic_data.AddSocketDataToFactory(socket_factory_.get());
  12330. QuicStreamRequest request(factory_.get());
  12331. EXPECT_EQ(ERR_IO_PENDING,
  12332. request.Request(
  12333. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  12334. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  12335. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  12336. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  12337. failed_on_default_network_callback_, callback_.callback()));
  12338. // host resolution returned but stale connection hasn't finished yet.
  12339. host_resolver_->ResolveAllPending();
  12340. EXPECT_THAT(callback_.WaitForResult(), IsError(ERR_NAME_NOT_RESOLVED));
  12341. EXPECT_TRUE(quic_data.AllReadDataConsumed());
  12342. EXPECT_TRUE(quic_data.AllWriteDataConsumed());
  12343. }
  12344. // With dns race experiment on, dns resolve async and stale connect async, dns
  12345. // resolve returns error and then preconnect fails.
  12346. TEST_P(QuicStreamFactoryTest,
  12347. ResultAfterDNSRaceResolveAsyncErrorStaleAsyncError) {
  12348. quic_params_->race_stale_dns_on_connection = true;
  12349. host_resolver_ = std::make_unique<MockCachingHostResolver>();
  12350. Initialize();
  12351. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  12352. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  12353. // Set up an address in stale resolver cache.
  12354. host_resolver_->set_ondemand_mode(true);
  12355. host_resolver_->rules()->AddRule(scheme_host_port_.host(), kCachedIPAddress);
  12356. host_resolver_->LoadIntoCache(scheme_host_port_, NetworkIsolationKey(),
  12357. /*optional_parameters=*/absl::nullopt);
  12358. // Expire the cache
  12359. host_resolver_->GetHostCache()->Invalidate();
  12360. // Change to different address for fresh host resolutions.
  12361. host_resolver_->rules()->ClearRules();
  12362. host_resolver_->rules()->AddRule(scheme_host_port_.host(),
  12363. ERR_NAME_NOT_RESOLVED);
  12364. factory_->set_is_quic_known_to_work_on_current_network(false);
  12365. MockQuicData quic_data(version_);
  12366. quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  12367. int packet_number = 1;
  12368. if (VersionUsesHttp3(version_.transport_version)) {
  12369. quic_data.AddWrite(SYNCHRONOUS,
  12370. ConstructInitialSettingsPacket(packet_number++));
  12371. }
  12372. quic_data.AddWrite(SYNCHRONOUS,
  12373. client_maker_.MakeConnectionClosePacket(
  12374. packet_number++, true,
  12375. quic::QUIC_STALE_CONNECTION_CANCELLED, "net error"));
  12376. quic_data.AddSocketDataToFactory(socket_factory_.get());
  12377. QuicStreamRequest request(factory_.get());
  12378. EXPECT_EQ(ERR_IO_PENDING,
  12379. request.Request(
  12380. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  12381. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  12382. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  12383. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  12384. failed_on_default_network_callback_, callback_.callback()));
  12385. // Host Resolution returns failure but stale connection hasn't finished.
  12386. host_resolver_->ResolveAllPending();
  12387. // Check that the final error is on resolution failure.
  12388. EXPECT_THAT(callback_.WaitForResult(), IsError(ERR_NAME_NOT_RESOLVED));
  12389. EXPECT_TRUE(quic_data.AllReadDataConsumed());
  12390. }
  12391. // With dns race experiment on, test that host resolution callback behaves
  12392. // normal as experiment is not on
  12393. TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceHostResolveAsync) {
  12394. quic_params_->race_stale_dns_on_connection = true;
  12395. host_resolver_ = std::make_unique<MockCachingHostResolver>();
  12396. Initialize();
  12397. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  12398. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  12399. host_resolver_->set_ondemand_mode(true);
  12400. host_resolver_->rules()->AddIPLiteralRule(scheme_host_port_.host(),
  12401. kNonCachedIPAddress, "");
  12402. MockQuicData quic_data(version_);
  12403. quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  12404. if (VersionUsesHttp3(version_.transport_version))
  12405. quic_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
  12406. quic_data.AddSocketDataToFactory(socket_factory_.get());
  12407. QuicStreamRequest request(factory_.get());
  12408. EXPECT_EQ(ERR_IO_PENDING,
  12409. request.Request(
  12410. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  12411. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  12412. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  12413. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  12414. failed_on_default_network_callback_, callback_.callback()));
  12415. // Check that expect_on_host_resolution_ is properlly set.
  12416. TestCompletionCallback host_resolution_callback;
  12417. EXPECT_TRUE(
  12418. request.WaitForHostResolution(host_resolution_callback.callback()));
  12419. base::RunLoop().RunUntilIdle();
  12420. EXPECT_FALSE(host_resolution_callback.have_result());
  12421. host_resolver_->ResolveAllPending();
  12422. EXPECT_THAT(host_resolution_callback.WaitForResult(), IsOk());
  12423. // Check that expect_on_host_resolution_ is flipped back.
  12424. EXPECT_FALSE(
  12425. request.WaitForHostResolution(host_resolution_callback.callback()));
  12426. EXPECT_TRUE(quic_data.AllReadDataConsumed());
  12427. EXPECT_TRUE(quic_data.AllWriteDataConsumed());
  12428. }
  12429. // With stale dns and migration before handshake experiment on, migration failed
  12430. // after handshake confirmed, and then fresh resolve returns.
  12431. TEST_P(QuicStreamFactoryTest, StaleNetworkFailedAfterHandshake) {
  12432. if (!version_.UsesHttp3())
  12433. return;
  12434. quic_params_->race_stale_dns_on_connection = true;
  12435. host_resolver_ = std::make_unique<MockCachingHostResolver>();
  12436. InitializeConnectionMigrationV2Test(
  12437. {kDefaultNetworkForTests, kNewNetworkForTests});
  12438. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  12439. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  12440. // Set up an address in stale resolver cache.
  12441. host_resolver_->set_ondemand_mode(true);
  12442. host_resolver_->rules()->AddRule(scheme_host_port_.host(), kCachedIPAddress);
  12443. host_resolver_->LoadIntoCache(scheme_host_port_, NetworkIsolationKey(),
  12444. /*optional_parameters=*/absl::nullopt);
  12445. // Expire the cache
  12446. host_resolver_->GetHostCache()->Invalidate();
  12447. // Change to different address for fresh host resolutions.
  12448. host_resolver_->rules()->ClearRules();
  12449. host_resolver_->rules()->AddRule(scheme_host_port_.host(),
  12450. kNonCachedIPAddress);
  12451. MockQuicData quic_data(version_);
  12452. quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  12453. if (VersionUsesHttp3(version_.transport_version))
  12454. quic_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
  12455. quic_data.AddSocketDataToFactory(socket_factory_.get());
  12456. // Socket for the new connection.
  12457. client_maker_.Reset();
  12458. MockQuicData quic_data2(version_);
  12459. quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  12460. if (VersionUsesHttp3(version_.transport_version))
  12461. quic_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
  12462. quic_data2.AddSocketDataToFactory(socket_factory_.get());
  12463. QuicStreamRequest request(factory_.get());
  12464. EXPECT_EQ(ERR_IO_PENDING,
  12465. request.Request(
  12466. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  12467. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  12468. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  12469. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  12470. failed_on_default_network_callback_, callback_.callback()));
  12471. // Check that the racing job is running.
  12472. EXPECT_TRUE(HasLiveSession(scheme_host_port_));
  12473. EXPECT_TRUE(HasActiveJob(scheme_host_port_, privacy_mode_));
  12474. // By disconnecting the network, the stale session will be killed.
  12475. scoped_mock_network_change_notifier_->mock_network_change_notifier()
  12476. ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
  12477. host_resolver_->ResolveAllPending();
  12478. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  12479. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  12480. EXPECT_TRUE(stream.get());
  12481. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  12482. EXPECT_EQ(session->peer_address().host().ToString(), kNonCachedIPAddress);
  12483. EXPECT_TRUE(quic_data.AllReadDataConsumed());
  12484. EXPECT_TRUE(quic_data.AllWriteDataConsumed());
  12485. EXPECT_TRUE(quic_data2.AllReadDataConsumed());
  12486. EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
  12487. }
  12488. // With stale dns experiment on, the stale session is killed while waiting for
  12489. // handshake
  12490. TEST_P(QuicStreamFactoryTest, StaleNetworkFailedBeforeHandshake) {
  12491. if (!version_.UsesHttp3())
  12492. return;
  12493. quic_params_->race_stale_dns_on_connection = true;
  12494. host_resolver_ = std::make_unique<MockCachingHostResolver>();
  12495. InitializeConnectionMigrationV2Test(
  12496. {kDefaultNetworkForTests, kNewNetworkForTests});
  12497. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  12498. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  12499. // Set up an address in stale resolver cache.
  12500. host_resolver_->set_ondemand_mode(true);
  12501. host_resolver_->rules()->AddRule(scheme_host_port_.host(), kCachedIPAddress);
  12502. host_resolver_->LoadIntoCache(scheme_host_port_, NetworkIsolationKey(),
  12503. /*optional_parameters=*/absl::nullopt);
  12504. // Expire the cache
  12505. host_resolver_->GetHostCache()->Invalidate();
  12506. // Change to different address for fresh host resolutions.
  12507. host_resolver_->rules()->ClearRules();
  12508. host_resolver_->rules()->AddRule(scheme_host_port_.host(),
  12509. kNonCachedIPAddress);
  12510. factory_->set_is_quic_known_to_work_on_current_network(false);
  12511. crypto_client_stream_factory_.set_handshake_mode(
  12512. MockCryptoClientStream::ZERO_RTT);
  12513. MockQuicData quic_data(version_);
  12514. quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  12515. client_maker_.SetEncryptionLevel(quic::ENCRYPTION_ZERO_RTT);
  12516. if (VersionUsesHttp3(version_.transport_version))
  12517. quic_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
  12518. quic_data.AddSocketDataToFactory(socket_factory_.get());
  12519. client_maker_.Reset();
  12520. MockQuicData quic_data2(version_);
  12521. quic_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  12522. if (VersionUsesHttp3(version_.transport_version))
  12523. quic_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
  12524. quic_data2.AddSocketDataToFactory(socket_factory_.get());
  12525. QuicStreamRequest request(factory_.get());
  12526. EXPECT_EQ(ERR_IO_PENDING,
  12527. request.Request(
  12528. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  12529. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  12530. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  12531. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  12532. failed_on_default_network_callback_, callback_.callback()));
  12533. // Check that the racing job is running.
  12534. EXPECT_TRUE(HasLiveSession(scheme_host_port_));
  12535. EXPECT_TRUE(HasActiveJob(scheme_host_port_, privacy_mode_));
  12536. // By disconnecting the network, the stale session will be killed.
  12537. scoped_mock_network_change_notifier_->mock_network_change_notifier()
  12538. ->NotifyNetworkDisconnected(kDefaultNetworkForTests);
  12539. host_resolver_->ResolveAllPending();
  12540. base::RunLoop().RunUntilIdle();
  12541. // Make sure the fresh session is established.
  12542. crypto_client_stream_factory_.last_stream()
  12543. ->NotifySessionOneRttKeyAvailable();
  12544. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  12545. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  12546. EXPECT_TRUE(stream.get());
  12547. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  12548. EXPECT_EQ(session->peer_address().host().ToString(), kNonCachedIPAddress);
  12549. EXPECT_TRUE(quic_data.AllReadDataConsumed());
  12550. EXPECT_TRUE(quic_data.AllWriteDataConsumed());
  12551. EXPECT_TRUE(quic_data2.AllReadDataConsumed());
  12552. EXPECT_TRUE(quic_data2.AllWriteDataConsumed());
  12553. }
  12554. TEST_P(QuicStreamFactoryTest, ConfigInitialRttForHandshake) {
  12555. if (version_.UsesTls()) {
  12556. // IETF QUIC uses a different handshake timeout management system.
  12557. return;
  12558. }
  12559. constexpr base::TimeDelta kInitialRtt = base::Milliseconds(400);
  12560. quic_params_->initial_rtt_for_handshake = kInitialRtt;
  12561. crypto_client_stream_factory_.set_handshake_mode(
  12562. MockCryptoClientStream::COLD_START_WITH_CHLO_SENT);
  12563. Initialize();
  12564. factory_->set_is_quic_known_to_work_on_current_network(false);
  12565. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  12566. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  12567. // Using a testing task runner so that we can control time.
  12568. auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
  12569. QuicStreamFactoryPeer::SetTaskRunner(factory_.get(), task_runner.get());
  12570. QuicStreamFactoryPeer::SetAlarmFactory(
  12571. factory_.get(), std::make_unique<QuicChromiumAlarmFactory>(
  12572. task_runner.get(), context_.clock()));
  12573. MockQuicData socket_data(version_);
  12574. socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  12575. socket_data.AddWrite(ASYNC, client_maker_.MakeDummyCHLOPacket(1));
  12576. socket_data.AddWrite(ASYNC, client_maker_.MakeDummyCHLOPacket(2));
  12577. client_maker_.SetEncryptionLevel(quic::ENCRYPTION_FORWARD_SECURE);
  12578. if (VersionUsesHttp3(version_.transport_version)) {
  12579. socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket(3));
  12580. }
  12581. socket_data.AddSocketDataToFactory(socket_factory_.get());
  12582. QuicStreamRequest request(factory_.get());
  12583. EXPECT_EQ(ERR_IO_PENDING,
  12584. request.Request(
  12585. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  12586. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  12587. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  12588. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  12589. failed_on_default_network_callback_, callback_.callback()));
  12590. base::RunLoop().RunUntilIdle();
  12591. EXPECT_FALSE(HasActiveSession(scheme_host_port_));
  12592. EXPECT_TRUE(HasActiveJob(scheme_host_port_, privacy_mode_));
  12593. // The pending task is scheduled for handshake timeout retransmission,
  12594. // which is 3 * 400ms with crypto frames and 1.5 * 400ms otherwise.
  12595. base::TimeDelta handshake_timeout =
  12596. QuicVersionUsesCryptoFrames(version_.transport_version)
  12597. ? 3 * kInitialRtt
  12598. : 1.5 * kInitialRtt;
  12599. EXPECT_EQ(handshake_timeout, task_runner->NextPendingTaskDelay());
  12600. // The alarm factory dependes on |clock_|, so clock is advanced to trigger
  12601. // retransmission alarm.
  12602. context_.AdvanceTime(quic::QuicTime::Delta::FromMilliseconds(
  12603. handshake_timeout.InMilliseconds()));
  12604. task_runner->FastForwardBy(handshake_timeout);
  12605. crypto_client_stream_factory_.last_stream()
  12606. ->NotifySessionOneRttKeyAvailable();
  12607. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  12608. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  12609. EXPECT_EQ(400000u, session->config()->GetInitialRoundTripTimeUsToSend());
  12610. EXPECT_TRUE(socket_data.AllReadDataConsumed());
  12611. EXPECT_TRUE(socket_data.AllWriteDataConsumed());
  12612. }
  12613. // Test that QuicStreamRequests with similar and different tags results in
  12614. // reused and unique QUIC streams using appropriately tagged sockets.
  12615. TEST_P(QuicStreamFactoryTest, Tag) {
  12616. socket_factory_ = std::make_unique<MockTaggingClientSocketFactory>();
  12617. auto* socket_factory =
  12618. static_cast<MockTaggingClientSocketFactory*>(socket_factory_.get());
  12619. Initialize();
  12620. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  12621. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  12622. // Prepare to establish two QUIC sessions.
  12623. MockQuicData socket_data(version_);
  12624. socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  12625. if (VersionUsesHttp3(version_.transport_version))
  12626. socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
  12627. socket_data.AddSocketDataToFactory(socket_factory_.get());
  12628. client_maker_.Reset();
  12629. MockQuicData socket_data2(version_);
  12630. socket_data2.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  12631. if (VersionUsesHttp3(version_.transport_version))
  12632. socket_data2.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
  12633. socket_data2.AddSocketDataToFactory(socket_factory_.get());
  12634. #if BUILDFLAG(IS_ANDROID)
  12635. SocketTag tag1(SocketTag::UNSET_UID, 0x12345678);
  12636. SocketTag tag2(getuid(), 0x87654321);
  12637. #else
  12638. // On non-Android platforms we can only use the default constructor.
  12639. SocketTag tag1, tag2;
  12640. #endif
  12641. // Request a stream with |tag1|.
  12642. QuicStreamRequest request1(factory_.get());
  12643. int rv = request1.Request(
  12644. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY, tag1,
  12645. NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  12646. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  12647. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  12648. failed_on_default_network_callback_, callback_.callback());
  12649. EXPECT_THAT(callback_.GetResult(rv), IsOk());
  12650. EXPECT_EQ(socket_factory->GetLastProducedUDPSocket()->tag(), tag1);
  12651. EXPECT_TRUE(socket_factory->GetLastProducedUDPSocket()
  12652. ->tagged_before_data_transferred());
  12653. std::unique_ptr<QuicChromiumClientSession::Handle> stream1 =
  12654. request1.ReleaseSessionHandle();
  12655. EXPECT_TRUE(stream1);
  12656. EXPECT_TRUE(stream1->IsConnected());
  12657. // Request a stream with |tag1| and verify underlying session is reused.
  12658. QuicStreamRequest request2(factory_.get());
  12659. rv = request2.Request(
  12660. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY, tag1,
  12661. NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  12662. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  12663. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  12664. failed_on_default_network_callback_, callback_.callback());
  12665. EXPECT_THAT(callback_.GetResult(rv), IsOk());
  12666. std::unique_ptr<QuicChromiumClientSession::Handle> stream2 =
  12667. request2.ReleaseSessionHandle();
  12668. EXPECT_TRUE(stream2);
  12669. EXPECT_TRUE(stream2->IsConnected());
  12670. EXPECT_TRUE(stream2->SharesSameSession(*stream1));
  12671. // Request a stream with |tag2| and verify a new session is created.
  12672. QuicStreamRequest request3(factory_.get());
  12673. rv = request3.Request(
  12674. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY, tag2,
  12675. NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  12676. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  12677. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  12678. failed_on_default_network_callback_, callback_.callback());
  12679. EXPECT_THAT(callback_.GetResult(rv), IsOk());
  12680. EXPECT_EQ(socket_factory->GetLastProducedUDPSocket()->tag(), tag2);
  12681. EXPECT_TRUE(socket_factory->GetLastProducedUDPSocket()
  12682. ->tagged_before_data_transferred());
  12683. std::unique_ptr<QuicChromiumClientSession::Handle> stream3 =
  12684. request3.ReleaseSessionHandle();
  12685. EXPECT_TRUE(stream3);
  12686. EXPECT_TRUE(stream3->IsConnected());
  12687. #if BUILDFLAG(IS_ANDROID)
  12688. EXPECT_FALSE(stream3->SharesSameSession(*stream1));
  12689. #else
  12690. // Same tag should reuse session.
  12691. EXPECT_TRUE(stream3->SharesSameSession(*stream1));
  12692. #endif
  12693. }
  12694. TEST_P(QuicStreamFactoryTest, ReadErrorClosesConnection) {
  12695. Initialize();
  12696. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  12697. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  12698. MockQuicData socket_data(version_);
  12699. if (version_.UsesHttp3()) {
  12700. socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
  12701. }
  12702. socket_data.AddRead(ASYNC, ERR_IO_PENDING); // Pause
  12703. socket_data.AddRead(ASYNC, ERR_CONNECTION_REFUSED);
  12704. socket_data.AddSocketDataToFactory(socket_factory_.get());
  12705. // Create request and QuicHttpStream to trigger creation of the session.
  12706. QuicStreamRequest request(factory_.get());
  12707. EXPECT_EQ(ERR_IO_PENDING,
  12708. request.Request(
  12709. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  12710. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  12711. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  12712. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  12713. failed_on_default_network_callback_, callback_.callback()));
  12714. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  12715. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  12716. EXPECT_TRUE(stream.get());
  12717. // Ensure that the session is alive and active before we read the error.
  12718. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  12719. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  12720. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  12721. // Resume the socket data to get the read error delivered.
  12722. socket_data.Resume();
  12723. // Ensure that the session is no longer active.
  12724. EXPECT_FALSE(HasActiveSession(scheme_host_port_));
  12725. }
  12726. TEST_P(QuicStreamFactoryTest, MessageTooBigReadErrorDoesNotCloseConnection) {
  12727. Initialize();
  12728. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  12729. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  12730. MockQuicData socket_data(version_);
  12731. if (version_.UsesHttp3()) {
  12732. socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
  12733. }
  12734. socket_data.AddRead(ASYNC, ERR_IO_PENDING); // Pause
  12735. socket_data.AddRead(ASYNC, ERR_MSG_TOO_BIG);
  12736. socket_data.AddSocketDataToFactory(socket_factory_.get());
  12737. // Create request and QuicHttpStream to trigger creation of the session.
  12738. QuicStreamRequest request(factory_.get());
  12739. EXPECT_EQ(ERR_IO_PENDING,
  12740. request.Request(
  12741. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  12742. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  12743. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  12744. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  12745. failed_on_default_network_callback_, callback_.callback()));
  12746. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  12747. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  12748. EXPECT_TRUE(stream.get());
  12749. // Ensure that the session is alive and active before we read the error.
  12750. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  12751. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  12752. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  12753. // Resume the socket data to get the read error delivered.
  12754. socket_data.Resume();
  12755. // Ensure that the session is still active.
  12756. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  12757. }
  12758. TEST_P(QuicStreamFactoryTest, ZeroLengthReadDoesNotCloseConnection) {
  12759. Initialize();
  12760. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  12761. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  12762. MockQuicData socket_data(version_);
  12763. if (version_.UsesHttp3()) {
  12764. socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
  12765. }
  12766. socket_data.AddRead(ASYNC, ERR_IO_PENDING); // Pause
  12767. socket_data.AddRead(ASYNC, 0);
  12768. socket_data.AddSocketDataToFactory(socket_factory_.get());
  12769. // Create request and QuicHttpStream to trigger creation of the session.
  12770. QuicStreamRequest request(factory_.get());
  12771. EXPECT_EQ(ERR_IO_PENDING,
  12772. request.Request(
  12773. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  12774. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  12775. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  12776. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  12777. failed_on_default_network_callback_, callback_.callback()));
  12778. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  12779. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  12780. EXPECT_TRUE(stream.get());
  12781. // Ensure that the session is alive and active before we read the error.
  12782. QuicChromiumClientSession* session = GetActiveSession(scheme_host_port_);
  12783. EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
  12784. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  12785. // Resume the socket data to get the zero-length read delivered.
  12786. socket_data.Resume();
  12787. // Ensure that the session is still active.
  12788. EXPECT_TRUE(HasActiveSession(scheme_host_port_));
  12789. }
  12790. TEST_P(QuicStreamFactoryTest, DnsAliasesCanBeAccessedFromStream) {
  12791. std::vector<std::string> dns_aliases(
  12792. {"alias1", "alias2", scheme_host_port_.host()});
  12793. host_resolver_->rules()->AddIPLiteralRuleWithDnsAliases(
  12794. scheme_host_port_.host(), "192.168.0.1", std::move(dns_aliases));
  12795. Initialize();
  12796. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  12797. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  12798. MockQuicData socket_data(version_);
  12799. socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  12800. if (VersionUsesHttp3(version_.transport_version))
  12801. socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
  12802. socket_data.AddSocketDataToFactory(socket_factory_.get());
  12803. QuicStreamRequest request(factory_.get());
  12804. EXPECT_EQ(ERR_IO_PENDING,
  12805. request.Request(
  12806. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  12807. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  12808. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  12809. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  12810. failed_on_default_network_callback_, callback_.callback()));
  12811. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  12812. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  12813. EXPECT_TRUE(stream.get());
  12814. EXPECT_EQ(DEFAULT_PRIORITY, host_resolver_->last_request_priority());
  12815. EXPECT_TRUE(socket_data.AllReadDataConsumed());
  12816. EXPECT_TRUE(socket_data.AllWriteDataConsumed());
  12817. EXPECT_THAT(
  12818. stream->GetDnsAliases(),
  12819. testing::ElementsAre("alias1", "alias2", scheme_host_port_.host()));
  12820. }
  12821. TEST_P(QuicStreamFactoryTest, NoAdditionalDnsAliases) {
  12822. std::vector<std::string> dns_aliases;
  12823. host_resolver_->rules()->AddIPLiteralRuleWithDnsAliases(
  12824. scheme_host_port_.host(), "192.168.0.1", std::move(dns_aliases));
  12825. Initialize();
  12826. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  12827. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  12828. MockQuicData socket_data(version_);
  12829. socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  12830. if (VersionUsesHttp3(version_.transport_version))
  12831. socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
  12832. socket_data.AddSocketDataToFactory(socket_factory_.get());
  12833. QuicStreamRequest request(factory_.get());
  12834. EXPECT_EQ(ERR_IO_PENDING,
  12835. request.Request(
  12836. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  12837. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  12838. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  12839. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  12840. failed_on_default_network_callback_, callback_.callback()));
  12841. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  12842. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  12843. EXPECT_TRUE(stream.get());
  12844. EXPECT_EQ(DEFAULT_PRIORITY, host_resolver_->last_request_priority());
  12845. EXPECT_TRUE(socket_data.AllReadDataConsumed());
  12846. EXPECT_TRUE(socket_data.AllWriteDataConsumed());
  12847. EXPECT_THAT(stream->GetDnsAliases(),
  12848. testing::ElementsAre(scheme_host_port_.host()));
  12849. }
  12850. TEST_P(QuicStreamFactoryTest, DoNotUseDnsAliases) {
  12851. std::vector<std::string> dns_aliases({"alias1", "alias2"});
  12852. host_resolver_->rules()->AddIPLiteralRuleWithDnsAliases(
  12853. scheme_host_port_.host(), "192.168.0.1", std::move(dns_aliases));
  12854. Initialize();
  12855. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  12856. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  12857. MockQuicData socket_data(version_);
  12858. socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  12859. if (VersionUsesHttp3(version_.transport_version))
  12860. socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
  12861. socket_data.AddSocketDataToFactory(socket_factory_.get());
  12862. QuicStreamRequest request(factory_.get());
  12863. EXPECT_EQ(ERR_IO_PENDING,
  12864. request.Request(
  12865. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  12866. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  12867. /*use_dns_aliases=*/false, /*require_dns_https_alpn=*/false,
  12868. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  12869. failed_on_default_network_callback_, callback_.callback()));
  12870. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  12871. std::unique_ptr<HttpStream> stream = CreateStream(&request);
  12872. EXPECT_TRUE(stream.get());
  12873. EXPECT_EQ(DEFAULT_PRIORITY, host_resolver_->last_request_priority());
  12874. EXPECT_TRUE(socket_data.AllReadDataConsumed());
  12875. EXPECT_TRUE(socket_data.AllWriteDataConsumed());
  12876. EXPECT_TRUE(stream->GetDnsAliases().empty());
  12877. }
  12878. TEST_P(QuicStreamFactoryTest, ConnectErrorInCreateWithDnsAliases) {
  12879. std::vector<std::string> dns_aliases({"alias1", "alias2"});
  12880. host_resolver_->rules()->AddIPLiteralRuleWithDnsAliases(
  12881. scheme_host_port_.host(), "192.168.0.1", std::move(dns_aliases));
  12882. Initialize();
  12883. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  12884. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  12885. MockQuicData socket_data(version_);
  12886. socket_data.AddConnect(SYNCHRONOUS, ERR_ADDRESS_IN_USE);
  12887. socket_data.AddSocketDataToFactory(socket_factory_.get());
  12888. QuicStreamRequest request(factory_.get());
  12889. EXPECT_EQ(ERR_IO_PENDING,
  12890. request.Request(
  12891. scheme_host_port_, version_, privacy_mode_, DEFAULT_PRIORITY,
  12892. SocketTag(), NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  12893. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/false,
  12894. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  12895. failed_on_default_network_callback_, callback_.callback()));
  12896. EXPECT_THAT(callback_.WaitForResult(), IsError(ERR_ADDRESS_IN_USE));
  12897. EXPECT_TRUE(socket_data.AllReadDataConsumed());
  12898. EXPECT_TRUE(socket_data.AllWriteDataConsumed());
  12899. }
  12900. TEST_P(QuicStreamFactoryTest, RequireDnsHttpsAlpnNoHttpsRecord) {
  12901. std::vector<HostResolverEndpointResult> endpoints(1);
  12902. endpoints[0].ip_endpoints = {IPEndPoint(IPAddress::IPv4Localhost(), 0)};
  12903. TestRequireDnsHttpsAlpn(std::move(endpoints), /*expect_success=*/false);
  12904. }
  12905. TEST_P(QuicStreamFactoryTest, RequireDnsHttpsAlpnMatch) {
  12906. std::vector<HostResolverEndpointResult> endpoints(2);
  12907. endpoints[0].ip_endpoints = {IPEndPoint(IPAddress::IPv4Localhost(), 0)};
  12908. endpoints[0].metadata.supported_protocol_alpns = {
  12909. quic::QuicVersionLabelToString(quic::CreateQuicVersionLabel(version_))};
  12910. // Add a final non-protocol endpoint at the end.
  12911. endpoints[1].ip_endpoints = {IPEndPoint(IPAddress::IPv4Localhost(), 0)};
  12912. TestRequireDnsHttpsAlpn(std::move(endpoints), /*expect_success=*/true);
  12913. }
  12914. TEST_P(QuicStreamFactoryTest, RequireDnsHttpsAlpnUnkownAlpn) {
  12915. std::vector<HostResolverEndpointResult> endpoints(2);
  12916. endpoints[0].ip_endpoints = {IPEndPoint(IPAddress::IPv4Localhost(), 0)};
  12917. endpoints[0].metadata.supported_protocol_alpns = {"unkown"};
  12918. // Add a final non-protocol endpoint at the end.
  12919. endpoints[1].ip_endpoints = {IPEndPoint(IPAddress::IPv4Localhost(), 0)};
  12920. TestRequireDnsHttpsAlpn(std::move(endpoints), /*expect_success=*/false);
  12921. }
  12922. TEST_P(QuicStreamFactoryTest, RequireDnsHttpsAlpnUnkownAndSupportedAlpn) {
  12923. std::vector<HostResolverEndpointResult> endpoints(2);
  12924. endpoints[0].ip_endpoints = {IPEndPoint(IPAddress::IPv4Localhost(), 0)};
  12925. endpoints[0].metadata.supported_protocol_alpns = {
  12926. "unkown",
  12927. quic::QuicVersionLabelToString(quic::CreateQuicVersionLabel(version_))};
  12928. // Add a final non-protocol endpoint at the end.
  12929. endpoints[1].ip_endpoints = {IPEndPoint(IPAddress::IPv4Localhost(), 0)};
  12930. TestRequireDnsHttpsAlpn(std::move(endpoints), /*expect_success=*/true);
  12931. }
  12932. void QuicStreamFactoryTestBase::TestRequireDnsHttpsAlpn(
  12933. std::vector<HostResolverEndpointResult> endpoints,
  12934. bool expect_success) {
  12935. quic_params_->supported_versions = {version_};
  12936. host_resolver_ = std::make_unique<MockCachingHostResolver>();
  12937. host_resolver_->rules()->AddRule(
  12938. scheme_host_port_.host(),
  12939. MockHostResolverBase::RuleResolver::RuleResult(
  12940. std::move(endpoints),
  12941. /*aliases=*/std::set<std::string>{scheme_host_port_.host()}));
  12942. Initialize();
  12943. ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
  12944. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  12945. MockQuicData socket_data(version_);
  12946. socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  12947. if (VersionUsesHttp3(version_.transport_version))
  12948. socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
  12949. socket_data.AddSocketDataToFactory(socket_factory_.get());
  12950. QuicStreamRequest request(factory_.get());
  12951. EXPECT_EQ(ERR_IO_PENDING,
  12952. request.Request(
  12953. scheme_host_port_, quic::ParsedQuicVersion::Unsupported(),
  12954. privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
  12955. NetworkIsolationKey(), SecureDnsPolicy::kAllow,
  12956. /*use_dns_aliases=*/true, /*require_dns_https_alpn=*/true,
  12957. /*cert_verify_flags=*/0, url_, net_log_, &net_error_details_,
  12958. failed_on_default_network_callback_, callback_.callback()));
  12959. if (expect_success) {
  12960. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  12961. } else {
  12962. EXPECT_THAT(callback_.WaitForResult(),
  12963. IsError(ERR_DNS_NO_MACHING_SUPPORTED_ALPN));
  12964. }
  12965. }
  12966. namespace {
  12967. // Run QuicStreamFactoryDnsAliasPoolingTest instances with all value
  12968. // combinations of version, H2 stream dependency or not, DNS alias use or not,
  12969. // and example DNS aliases. `expected_dns_aliases*` params are dependent on
  12970. // `use_dns_aliases`, `dns_aliases1`, and `dns_aliases2`.
  12971. struct DnsAliasPoolingTestParams {
  12972. quic::ParsedQuicVersion version;
  12973. bool client_headers_include_h2_stream_dependency;
  12974. bool use_dns_aliases;
  12975. std::set<std::string> dns_aliases1;
  12976. std::set<std::string> dns_aliases2;
  12977. std::set<std::string> expected_dns_aliases1;
  12978. std::set<std::string> expected_dns_aliases2;
  12979. };
  12980. std::string PrintToString(const std::set<std::string>& set) {
  12981. std::string joined;
  12982. for (const std::string& str : set) {
  12983. if (!joined.empty())
  12984. joined += "_";
  12985. joined += str;
  12986. }
  12987. return joined;
  12988. }
  12989. // Used by ::testing::PrintToStringParamName().
  12990. std::string PrintToString(const DnsAliasPoolingTestParams& p) {
  12991. return base::StrCat(
  12992. {ParsedQuicVersionToString(p.version), "_",
  12993. (p.client_headers_include_h2_stream_dependency ? "" : "No"),
  12994. "Dependency_", (p.use_dns_aliases ? "" : "DoNot"), "UseDnsAliases_1st_",
  12995. PrintToString(p.dns_aliases1), "_2nd_", PrintToString(p.dns_aliases2)});
  12996. }
  12997. std::vector<DnsAliasPoolingTestParams> GetDnsAliasPoolingTestParams() {
  12998. std::vector<DnsAliasPoolingTestParams> params;
  12999. quic::ParsedQuicVersionVector all_supported_versions =
  13000. quic::AllSupportedVersions();
  13001. for (bool include_h2_stream_dependency : {true, false}) {
  13002. for (const quic::ParsedQuicVersion& version : all_supported_versions) {
  13003. params.push_back(
  13004. DnsAliasPoolingTestParams{version,
  13005. include_h2_stream_dependency,
  13006. false /* use_dns_aliases */,
  13007. {} /* dns_aliases1 */,
  13008. {} /* dns_aliases2 */,
  13009. {} /* expected_dns_aliases1 */,
  13010. {} /* expected_dns_aliases2 */});
  13011. params.push_back(DnsAliasPoolingTestParams{
  13012. version,
  13013. include_h2_stream_dependency,
  13014. true /* use_dns_aliases */,
  13015. {} /* dns_aliases1 */,
  13016. {} /* dns_aliases2 */,
  13017. {kDefaultServerHostName} /* expected_dns_aliases1 */,
  13018. {kServer2HostName} /* expected_dns_aliases2 */});
  13019. params.push_back(
  13020. DnsAliasPoolingTestParams{version,
  13021. include_h2_stream_dependency,
  13022. false /* use_dns_aliases */,
  13023. {"alias1", "alias2", "alias3"},
  13024. {} /* dns_aliases2 */,
  13025. {} /* expected_dns_aliases1 */,
  13026. {} /* expected_dns_aliases2 */});
  13027. params.push_back(DnsAliasPoolingTestParams{
  13028. version,
  13029. include_h2_stream_dependency,
  13030. true /* use_dns_aliases */,
  13031. {"alias1", "alias2", "alias3"} /* dns_aliases1 */,
  13032. {} /* dns_aliases2 */,
  13033. {"alias1", "alias2", "alias3"} /* expected_dns_aliases1 */,
  13034. {kServer2HostName} /* expected_dns_aliases2 */});
  13035. params.push_back(DnsAliasPoolingTestParams{
  13036. version,
  13037. include_h2_stream_dependency,
  13038. false /* use_dns_aliases */,
  13039. {"alias1", "alias2", "alias3"} /* dns_aliases1 */,
  13040. {"alias3", "alias4", "alias5"} /* dns_aliases2 */,
  13041. {} /* expected_dns_aliases1 */,
  13042. {} /* expected_dns_aliases2 */});
  13043. params.push_back(DnsAliasPoolingTestParams{
  13044. version,
  13045. include_h2_stream_dependency,
  13046. true /* use_dns_aliases */,
  13047. {"alias1", "alias2", "alias3"} /* dns_aliases1 */,
  13048. {"alias3", "alias4", "alias5"} /* dns_aliases2 */,
  13049. {"alias1", "alias2", "alias3"} /* expected_dns_aliases1 */,
  13050. {"alias3", "alias4", "alias5"} /* expected_dns_aliases2 */});
  13051. params.push_back(DnsAliasPoolingTestParams{
  13052. version,
  13053. include_h2_stream_dependency,
  13054. false /* use_dns_aliases */,
  13055. {} /* dns_aliases1 */,
  13056. {"alias3", "alias4", "alias5"} /* dns_aliases2 */,
  13057. {} /* expected_dns_aliases1 */,
  13058. {} /* expected_dns_aliases2 */});
  13059. params.push_back(DnsAliasPoolingTestParams{
  13060. version,
  13061. include_h2_stream_dependency,
  13062. true /* use_dns_aliases */,
  13063. {} /* dns_aliases1 */,
  13064. {"alias3", "alias4", "alias5"} /* dns_aliases2 */,
  13065. {kDefaultServerHostName} /* expected_dns_aliases1 */,
  13066. {"alias3", "alias4", "alias5"} /* expected_dns_aliases2 */});
  13067. }
  13068. }
  13069. return params;
  13070. }
  13071. } // namespace
  13072. class QuicStreamFactoryDnsAliasPoolingTest
  13073. : public QuicStreamFactoryTestBase,
  13074. public ::testing::TestWithParam<DnsAliasPoolingTestParams> {
  13075. protected:
  13076. QuicStreamFactoryDnsAliasPoolingTest()
  13077. : QuicStreamFactoryTestBase(
  13078. GetParam().version,
  13079. GetParam().client_headers_include_h2_stream_dependency),
  13080. use_dns_aliases_(GetParam().use_dns_aliases),
  13081. dns_aliases1_(GetParam().dns_aliases1),
  13082. dns_aliases2_(GetParam().dns_aliases2),
  13083. expected_dns_aliases1_(GetParam().expected_dns_aliases1),
  13084. expected_dns_aliases2_(GetParam().expected_dns_aliases2) {}
  13085. const bool use_dns_aliases_;
  13086. const std::set<std::string> dns_aliases1_;
  13087. const std::set<std::string> dns_aliases2_;
  13088. const std::set<std::string> expected_dns_aliases1_;
  13089. const std::set<std::string> expected_dns_aliases2_;
  13090. };
  13091. INSTANTIATE_TEST_SUITE_P(VersionIncludeStreamDependencySequence,
  13092. QuicStreamFactoryDnsAliasPoolingTest,
  13093. ::testing::ValuesIn(GetDnsAliasPoolingTestParams()),
  13094. ::testing::PrintToStringParamName());
  13095. TEST_P(QuicStreamFactoryDnsAliasPoolingTest, IPPooling) {
  13096. Initialize();
  13097. const GURL kUrl1(kDefaultUrl);
  13098. const GURL kUrl2(kServer2Url);
  13099. const url::SchemeHostPort kOrigin1 = url::SchemeHostPort(kUrl1);
  13100. const url::SchemeHostPort kOrigin2 = url::SchemeHostPort(kUrl2);
  13101. host_resolver_->rules()->AddIPLiteralRuleWithDnsAliases(
  13102. kOrigin1.host(), "192.168.0.1", std::move(dns_aliases1_));
  13103. host_resolver_->rules()->AddIPLiteralRuleWithDnsAliases(
  13104. kOrigin2.host(), "192.168.0.1", std::move(dns_aliases2_));
  13105. scoped_refptr<X509Certificate> cert(
  13106. ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
  13107. ASSERT_TRUE(cert->VerifyNameMatch(kOrigin1.host()));
  13108. ASSERT_TRUE(cert->VerifyNameMatch(kOrigin2.host()));
  13109. ProofVerifyDetailsChromium verify_details;
  13110. verify_details.cert_verify_result.verified_cert = cert;
  13111. verify_details.cert_verify_result.is_issued_by_known_root = true;
  13112. crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
  13113. MockQuicData socket_data(version_);
  13114. socket_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);
  13115. if (VersionUsesHttp3(version_.transport_version))
  13116. socket_data.AddWrite(SYNCHRONOUS, ConstructInitialSettingsPacket());
  13117. socket_data.AddSocketDataToFactory(socket_factory_.get());
  13118. QuicStreamRequest request1(factory_.get());
  13119. EXPECT_EQ(
  13120. ERR_IO_PENDING,
  13121. request1.Request(
  13122. kOrigin1, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
  13123. NetworkIsolationKey(), SecureDnsPolicy::kAllow, use_dns_aliases_,
  13124. /*require_dns_https_alpn=*/false, /*cert_verify_flags=*/0, kUrl1,
  13125. net_log_, &net_error_details_, failed_on_default_network_callback_,
  13126. callback_.callback()));
  13127. EXPECT_THAT(callback_.WaitForResult(), IsOk());
  13128. std::unique_ptr<HttpStream> stream1 = CreateStream(&request1);
  13129. EXPECT_TRUE(stream1.get());
  13130. EXPECT_TRUE(HasActiveSession(kOrigin1));
  13131. TestCompletionCallback callback2;
  13132. QuicStreamRequest request2(factory_.get());
  13133. EXPECT_EQ(
  13134. ERR_IO_PENDING,
  13135. request2.Request(
  13136. kOrigin2, version_, privacy_mode_, DEFAULT_PRIORITY, SocketTag(),
  13137. NetworkIsolationKey(), SecureDnsPolicy::kAllow, use_dns_aliases_,
  13138. /*require_dns_https_alpn=*/false, /*cert_verify_flags=*/0, kUrl2,
  13139. net_log_, &net_error_details_, failed_on_default_network_callback_,
  13140. callback2.callback()));
  13141. EXPECT_THAT(callback2.WaitForResult(), IsOk());
  13142. std::unique_ptr<HttpStream> stream2 = CreateStream(&request2);
  13143. EXPECT_TRUE(stream2.get());
  13144. EXPECT_TRUE(HasActiveSession(kOrigin2));
  13145. QuicChromiumClientSession::Handle* session1 =
  13146. QuicHttpStreamPeer::GetSessionHandle(stream1.get());
  13147. QuicChromiumClientSession::Handle* session2 =
  13148. QuicHttpStreamPeer::GetSessionHandle(stream2.get());
  13149. EXPECT_TRUE(session1->SharesSameSession(*session2));
  13150. EXPECT_EQ(quic::QuicServerId(kOrigin1.host(), kOrigin1.port(),
  13151. privacy_mode_ == PRIVACY_MODE_ENABLED),
  13152. session1->server_id());
  13153. EXPECT_TRUE(socket_data.AllReadDataConsumed());
  13154. EXPECT_TRUE(socket_data.AllWriteDataConsumed());
  13155. EXPECT_EQ(expected_dns_aliases1_, stream1->GetDnsAliases());
  13156. EXPECT_EQ(expected_dns_aliases2_, stream2->GetDnsAliases());
  13157. }
  13158. } // namespace net::test