ice_unittest.cpp 123 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934
  1. /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
  2. /* This Source Code Form is subject to the terms of the Mozilla Public
  3. * License, v. 2.0. If a copy of the MPL was not distributed with this file,
  4. * You can obtain one at http://mozilla.org/MPL/2.0/. */
  5. // Original author: ekr@rtfm.com
  6. #include <algorithm>
  7. #include <deque>
  8. #include <iostream>
  9. #include <limits>
  10. #include <map>
  11. #include <string>
  12. #include <vector>
  13. #include "sigslot.h"
  14. #include "logging.h"
  15. #include "nspr.h"
  16. #include "nss.h"
  17. #include "ssl.h"
  18. #include "mozilla/Preferences.h"
  19. #include "nsThreadUtils.h"
  20. #include "nsXPCOM.h"
  21. #include "nricectxhandler.h"
  22. #include "nricemediastream.h"
  23. #include "nriceresolverfake.h"
  24. #include "nriceresolver.h"
  25. #include "nrinterfaceprioritizer.h"
  26. #include "gtest_ringbuffer_dumper.h"
  27. #include "rlogconnector.h"
  28. #include "runnable_utils.h"
  29. #include "stunserver.h"
  30. #include "nr_socket_prsock.h"
  31. #include "test_nr_socket.h"
  32. #include "ice_ctx.h"
  33. #include "stun_socket_filter.h"
  34. #include "mozilla/net/DNS.h"
  35. #include "ice_ctx.h"
  36. #include "ice_peer_ctx.h"
  37. #include "ice_media_stream.h"
  38. extern "C" {
  39. #include "async_timer.h"
  40. #include "r_data.h"
  41. #include "util.h"
  42. #include "r_time.h"
  43. }
  44. #define GTEST_HAS_RTTI 0
  45. #include "gtest/gtest.h"
  46. #include "gtest_utils.h"
  47. using namespace mozilla;
  48. static unsigned int kDefaultTimeout = 7000;
  49. //TODO(nils@mozilla.com): This should get replaced with some non-external
  50. //solution like discussed in bug 860775.
  51. const std::string kDefaultStunServerHostname(
  52. (char *)"global.stun.twilio.com");
  53. const std::string kBogusStunServerHostname(
  54. (char *)"stun-server-nonexistent.invalid");
  55. const uint16_t kDefaultStunServerPort=3478;
  56. const std::string kBogusIceCandidate(
  57. (char *)"candidate:0 2 UDP 2113601790 192.168.178.20 50769 typ");
  58. const std::string kUnreachableHostIceCandidate(
  59. (char *)"candidate:0 1 UDP 2113601790 192.168.178.20 50769 typ host");
  60. namespace {
  61. // DNS resolution helper code
  62. static std::string
  63. Resolve(const std::string& fqdn, int address_family)
  64. {
  65. struct addrinfo hints;
  66. memset(&hints, 0, sizeof(hints));
  67. hints.ai_family = address_family;
  68. hints.ai_protocol = IPPROTO_UDP;
  69. struct addrinfo *res;
  70. int err = getaddrinfo(fqdn.c_str(), nullptr, &hints, &res);
  71. if (err) {
  72. std::cerr << "Error in getaddrinfo: " << err << std::endl;
  73. return "";
  74. }
  75. char str_addr[64] = {0};
  76. switch (res->ai_family) {
  77. case AF_INET:
  78. inet_ntop(
  79. AF_INET,
  80. &reinterpret_cast<struct sockaddr_in*>(res->ai_addr)->sin_addr,
  81. str_addr,
  82. sizeof(str_addr));
  83. break;
  84. case AF_INET6:
  85. inet_ntop(
  86. AF_INET6,
  87. &reinterpret_cast<struct sockaddr_in6*>(res->ai_addr)->sin6_addr,
  88. str_addr,
  89. sizeof(str_addr));
  90. break;
  91. default:
  92. std::cerr << "Got unexpected address family in DNS lookup: "
  93. << res->ai_family << std::endl;
  94. freeaddrinfo(res);
  95. return "";
  96. }
  97. if (!strlen(str_addr)) {
  98. std::cerr << "inet_ntop failed" << std::endl;
  99. }
  100. freeaddrinfo(res);
  101. return str_addr;
  102. }
  103. class StunTest : public MtransportTest {
  104. public:
  105. StunTest() : MtransportTest() {
  106. stun_server_hostname_ = kDefaultStunServerHostname;
  107. }
  108. void SetUp() override {
  109. MtransportTest::SetUp();
  110. // If only a STUN server FQDN was provided, look up its IP address for the
  111. // address-only tests.
  112. if (stun_server_address_.empty() && !stun_server_hostname_.empty()) {
  113. stun_server_address_ = Resolve(stun_server_hostname_, AF_INET);
  114. }
  115. // Make sure NrIceCtx is in a testable state.
  116. test_utils_->sts_target()->Dispatch(
  117. WrapRunnableNM(&NrIceCtx::internal_DeinitializeGlobal),
  118. NS_DISPATCH_SYNC);
  119. // NB: NrIceCtx::internal_DeinitializeGlobal destroys the RLogConnector
  120. // singleton.
  121. RLogConnector::CreateInstance();
  122. test_utils_->sts_target()->Dispatch(
  123. WrapRunnableNM(&TestStunServer::GetInstance, AF_INET),
  124. NS_DISPATCH_SYNC);
  125. test_utils_->sts_target()->Dispatch(
  126. WrapRunnableNM(&TestStunServer::GetInstance, AF_INET6),
  127. NS_DISPATCH_SYNC);
  128. test_utils_->sts_target()->Dispatch(
  129. WrapRunnableNM(&TestStunTcpServer::GetInstance, AF_INET),
  130. NS_DISPATCH_SYNC);
  131. test_utils_->sts_target()->Dispatch(
  132. WrapRunnableNM(&TestStunTcpServer::GetInstance, AF_INET6),
  133. NS_DISPATCH_SYNC);
  134. }
  135. void TearDown() override {
  136. test_utils_->sts_target()->Dispatch(
  137. WrapRunnableNM(&NrIceCtx::internal_DeinitializeGlobal),
  138. NS_DISPATCH_SYNC);
  139. test_utils_->sts_target()->Dispatch(
  140. WrapRunnableNM(&TestStunServer::ShutdownInstance), NS_DISPATCH_SYNC);
  141. test_utils_->sts_target()->Dispatch(
  142. WrapRunnableNM(&TestStunTcpServer::ShutdownInstance), NS_DISPATCH_SYNC);
  143. RLogConnector::DestroyInstance();
  144. MtransportTest::TearDown();
  145. }
  146. };
  147. enum TrickleMode { TRICKLE_NONE, TRICKLE_SIMULATE, TRICKLE_REAL };
  148. enum ConsentStatus { CONSENT_FRESH, CONSENT_STALE, CONSENT_EXPIRED};
  149. const unsigned int ICE_TEST_PEER_OFFERER = (1 << 0);
  150. const unsigned int ICE_TEST_PEER_ALLOW_LOOPBACK = (1 << 1);
  151. const unsigned int ICE_TEST_PEER_ENABLED_TCP = (1 << 2);
  152. const unsigned int ICE_TEST_PEER_ALLOW_LINK_LOCAL = (1 << 3);
  153. typedef std::string (*CandidateFilter)(const std::string& candidate);
  154. std::vector<std::string> split(const std::string &s, char delim) {
  155. std::vector<std::string> elems;
  156. std::stringstream ss(s);
  157. std::string item;
  158. while (std::getline(ss, item, delim)) {
  159. elems.push_back(item);
  160. }
  161. return elems;
  162. }
  163. static std::string IsSrflxCandidate(const std::string& candidate) {
  164. std::vector<std::string> tokens = split(candidate, ' ');
  165. if ((tokens.at(6) == "typ") && (tokens.at(7) == "srflx")) {
  166. return candidate;
  167. }
  168. return std::string();
  169. }
  170. static std::string IsRelayCandidate(const std::string& candidate) {
  171. if (candidate.find("typ relay") != std::string::npos) {
  172. return candidate;
  173. }
  174. return std::string();
  175. }
  176. static std::string IsTcpCandidate(const std::string& candidate) {
  177. if (candidate.find("TCP") != std::string::npos) {
  178. return candidate;
  179. }
  180. return std::string();
  181. }
  182. static std::string IsTcpSoCandidate(const std::string& candidate) {
  183. if (candidate.find("tcptype so") != std::string::npos) {
  184. return candidate;
  185. }
  186. return std::string();
  187. }
  188. static std::string IsLoopbackCandidate(const std::string& candidate) {
  189. if (candidate.find("127.0.0.") != std::string::npos) {
  190. return candidate;
  191. }
  192. return std::string();
  193. }
  194. static std::string IsIpv4Candidate(const std::string& candidate) {
  195. std::vector<std::string> tokens = split(candidate, ' ');
  196. if (tokens.at(4).find(":") == std::string::npos) {
  197. return candidate;
  198. }
  199. return std::string();
  200. }
  201. static std::string SabotageHostCandidateAndDropReflexive(
  202. const std::string& candidate) {
  203. if (candidate.find("typ srflx") != std::string::npos) {
  204. return std::string();
  205. }
  206. if (candidate.find("typ host") != std::string::npos) {
  207. return kUnreachableHostIceCandidate;
  208. }
  209. return candidate;
  210. }
  211. bool ContainsSucceededPair(const std::vector<NrIceCandidatePair>& pairs) {
  212. for (size_t i = 0; i < pairs.size(); ++i) {
  213. if (pairs[i].state == NrIceCandidatePair::STATE_SUCCEEDED) {
  214. return true;
  215. }
  216. }
  217. return false;
  218. }
  219. // Note: Does not correspond to any notion of prioritization; this is just
  220. // so we can use stl containers/algorithms that need a comparator
  221. bool operator<(const NrIceCandidate& lhs,
  222. const NrIceCandidate& rhs) {
  223. if (lhs.cand_addr.host == rhs.cand_addr.host) {
  224. if (lhs.cand_addr.port == rhs.cand_addr.port) {
  225. if (lhs.cand_addr.transport == rhs.cand_addr.transport) {
  226. if (lhs.type == rhs.type) {
  227. return lhs.tcp_type < rhs.tcp_type;
  228. }
  229. return lhs.type < rhs.type;
  230. }
  231. return lhs.cand_addr.transport < rhs.cand_addr.transport;
  232. }
  233. return lhs.cand_addr.port < rhs.cand_addr.port;
  234. }
  235. return lhs.cand_addr.host < rhs.cand_addr.host;
  236. }
  237. bool operator==(const NrIceCandidate& lhs,
  238. const NrIceCandidate& rhs) {
  239. return !((lhs < rhs) || (rhs < lhs));
  240. }
  241. class IceCandidatePairCompare {
  242. public:
  243. bool operator()(const NrIceCandidatePair& lhs,
  244. const NrIceCandidatePair& rhs) const {
  245. if (lhs.priority == rhs.priority) {
  246. if (lhs.local == rhs.local) {
  247. if (lhs.remote == rhs.remote) {
  248. return lhs.codeword < rhs.codeword;
  249. }
  250. return lhs.remote < rhs.remote;
  251. }
  252. return lhs.local < rhs.local;
  253. }
  254. return lhs.priority < rhs.priority;
  255. }
  256. };
  257. class IceTestPeer;
  258. class SchedulableTrickleCandidate {
  259. public:
  260. SchedulableTrickleCandidate(IceTestPeer *peer,
  261. size_t stream,
  262. const std::string &candidate,
  263. MtransportTestUtils* utils) :
  264. peer_(peer),
  265. stream_(stream),
  266. candidate_(candidate),
  267. timer_handle_(nullptr),
  268. test_utils_(utils) {
  269. }
  270. ~SchedulableTrickleCandidate() {
  271. if (timer_handle_)
  272. NR_async_timer_cancel(timer_handle_);
  273. }
  274. void Schedule(unsigned int ms) {
  275. test_utils_->sts_target()->Dispatch(
  276. WrapRunnable(this, &SchedulableTrickleCandidate::Schedule_s, ms),
  277. NS_DISPATCH_SYNC);
  278. }
  279. void Schedule_s(unsigned int ms) {
  280. MOZ_ASSERT(!timer_handle_);
  281. NR_ASYNC_TIMER_SET(ms, Trickle_cb, this, &timer_handle_);
  282. }
  283. static void Trickle_cb(NR_SOCKET s, int how, void *cb_arg) {
  284. static_cast<SchedulableTrickleCandidate*>(cb_arg)->Trickle();
  285. }
  286. void Trickle();
  287. std::string& Candidate() {
  288. return candidate_;
  289. }
  290. const std::string& Candidate() const {
  291. return candidate_;
  292. }
  293. size_t Stream() const {
  294. return stream_;
  295. }
  296. bool IsHost() const {
  297. return candidate_.find("typ host") != std::string::npos;
  298. }
  299. bool IsReflexive() const {
  300. return candidate_.find("typ srflx") != std::string::npos;
  301. }
  302. bool IsRelay() const {
  303. return candidate_.find("typ relay") != std::string::npos;
  304. }
  305. private:
  306. IceTestPeer *peer_;
  307. size_t stream_;
  308. std::string candidate_;
  309. void *timer_handle_;
  310. MtransportTestUtils* test_utils_;
  311. DISALLOW_COPY_ASSIGN(SchedulableTrickleCandidate);
  312. };
  313. class IceTestPeer : public sigslot::has_slots<> {
  314. public:
  315. // TODO(ekr@rtfm.com): Convert to flags when NrIceCtx::Create() does.
  316. // Bug 1193437.
  317. IceTestPeer(const std::string& name, MtransportTestUtils* utils,
  318. bool offerer,
  319. bool allow_loopback = false, bool enable_tcp = true,
  320. bool allow_link_local = false,
  321. NrIceCtx::Policy ice_policy = NrIceCtx::ICE_POLICY_ALL) :
  322. name_(name),
  323. ice_ctx_(NrIceCtxHandler::Create(name, offerer, allow_loopback,
  324. enable_tcp, allow_link_local,
  325. ice_policy)),
  326. candidates_(),
  327. shutting_down_(false),
  328. gathering_complete_(false),
  329. ready_ct_(0),
  330. ice_connected_(false),
  331. ice_failed_(false),
  332. ice_reached_checking_(false),
  333. received_(0),
  334. sent_(0),
  335. fake_resolver_(),
  336. dns_resolver_(new NrIceResolver()),
  337. remote_(nullptr),
  338. candidate_filter_(nullptr),
  339. expected_local_type_(NrIceCandidate::ICE_HOST),
  340. expected_local_transport_(kNrIceTransportUdp),
  341. expected_remote_type_(NrIceCandidate::ICE_HOST),
  342. trickle_mode_(TRICKLE_NONE),
  343. trickled_(0),
  344. simulate_ice_lite_(false),
  345. nat_(new TestNat),
  346. test_utils_(utils) {
  347. ice_ctx_->ctx()->SignalGatheringStateChange.connect(
  348. this,
  349. &IceTestPeer::GatheringStateChange);
  350. ice_ctx_->ctx()->SignalConnectionStateChange.connect(
  351. this,
  352. &IceTestPeer::ConnectionStateChange);
  353. consent_timestamp_.tv_sec = 0;
  354. consent_timestamp_.tv_usec = 0;
  355. int r = ice_ctx_->ctx()->SetNat(nat_);
  356. (void)r;
  357. MOZ_ASSERT(!r);
  358. }
  359. ~IceTestPeer() {
  360. test_utils_->sts_target()->Dispatch(WrapRunnable(this,
  361. &IceTestPeer::Shutdown),
  362. NS_DISPATCH_SYNC);
  363. // Give the ICE destruction callback time to fire before
  364. // we destroy the resolver.
  365. PR_Sleep(1000);
  366. }
  367. void AddStream_s(int components) {
  368. char name[100];
  369. snprintf(name, sizeof(name), "%s:stream%d", name_.c_str(),
  370. (int)ice_ctx_->ctx()->GetStreamCount());
  371. RefPtr<NrIceMediaStream> stream =
  372. ice_ctx_->CreateStream(static_cast<char *>(name), components);
  373. ice_ctx_->ctx()->SetStream(ice_ctx_->ctx()->GetStreamCount(), stream);
  374. ASSERT_TRUE(stream);
  375. stream->SignalCandidate.connect(this, &IceTestPeer::CandidateInitialized);
  376. stream->SignalReady.connect(this, &IceTestPeer::StreamReady);
  377. stream->SignalFailed.connect(this, &IceTestPeer::StreamFailed);
  378. stream->SignalPacketReceived.connect(this, &IceTestPeer::PacketReceived);
  379. }
  380. void AddStream(int components)
  381. {
  382. test_utils_->sts_target()->Dispatch(
  383. WrapRunnable(this, &IceTestPeer::AddStream_s, components),
  384. NS_DISPATCH_SYNC);
  385. }
  386. void RemoveStream_s(size_t index) {
  387. ice_ctx_->ctx()->SetStream(index, nullptr);
  388. }
  389. void RemoveStream(size_t index) {
  390. test_utils_->sts_target()->Dispatch(
  391. WrapRunnable(this, &IceTestPeer::RemoveStream_s, index),
  392. NS_DISPATCH_SYNC);
  393. }
  394. void SetStunServer(const std::string addr, uint16_t port,
  395. const char* transport = kNrIceTransportUdp) {
  396. if (addr.empty()) {
  397. // Happens when MOZ_DISABLE_NONLOCAL_CONNECTIONS is set
  398. return;
  399. }
  400. std::vector<NrIceStunServer> stun_servers;
  401. UniquePtr<NrIceStunServer> server(NrIceStunServer::Create(
  402. addr, port, transport));
  403. stun_servers.push_back(*server);
  404. SetStunServers(stun_servers);
  405. }
  406. void SetStunServers(const std::vector<NrIceStunServer> &servers) {
  407. ASSERT_TRUE(NS_SUCCEEDED(ice_ctx_->ctx()->SetStunServers(servers)));
  408. }
  409. void UseTestStunServer() {
  410. SetStunServer(TestStunServer::GetInstance(AF_INET)->addr(),
  411. TestStunServer::GetInstance(AF_INET)->port());
  412. }
  413. void SetTurnServer(const std::string addr, uint16_t port,
  414. const std::string username,
  415. const std::string password,
  416. const char* transport) {
  417. std::vector<unsigned char> password_vec(password.begin(), password.end());
  418. SetTurnServer(addr, port, username, password_vec, transport);
  419. }
  420. void SetTurnServer(const std::string addr, uint16_t port,
  421. const std::string username,
  422. const std::vector<unsigned char> password,
  423. const char* transport) {
  424. std::vector<NrIceTurnServer> turn_servers;
  425. UniquePtr<NrIceTurnServer> server(NrIceTurnServer::Create(
  426. addr, port, username, password, transport));
  427. turn_servers.push_back(*server);
  428. ASSERT_TRUE(NS_SUCCEEDED(ice_ctx_->ctx()->SetTurnServers(turn_servers)));
  429. }
  430. void SetTurnServers(const std::vector<NrIceTurnServer> servers) {
  431. ASSERT_TRUE(NS_SUCCEEDED(ice_ctx_->ctx()->SetTurnServers(servers)));
  432. }
  433. void SetFakeResolver(const std::string& ip,
  434. const std::string& fqdn) {
  435. ASSERT_TRUE(NS_SUCCEEDED(dns_resolver_->Init()));
  436. if (!ip.empty() && !fqdn.empty()) {
  437. PRNetAddr addr;
  438. PRStatus status = PR_StringToNetAddr(ip.c_str(), &addr);
  439. addr.inet.port = kDefaultStunServerPort;
  440. ASSERT_EQ(PR_SUCCESS, status);
  441. fake_resolver_.SetAddr(fqdn, addr);
  442. }
  443. ASSERT_TRUE(NS_SUCCEEDED(ice_ctx_->ctx()->SetResolver(
  444. fake_resolver_.AllocateResolver())));
  445. }
  446. void SetDNSResolver() {
  447. ASSERT_TRUE(NS_SUCCEEDED(dns_resolver_->Init()));
  448. ASSERT_TRUE(NS_SUCCEEDED(ice_ctx_->ctx()->SetResolver(
  449. dns_resolver_->AllocateResolver())));
  450. }
  451. void Gather(bool default_route_only = false) {
  452. nsresult res;
  453. test_utils_->sts_target()->Dispatch(
  454. WrapRunnableRet(&res,
  455. ice_ctx_->ctx(),
  456. &NrIceCtx::StartGathering,
  457. default_route_only,
  458. false),
  459. NS_DISPATCH_SYNC);
  460. ASSERT_TRUE(NS_SUCCEEDED(res));
  461. }
  462. void UseNat() {
  463. nat_->enabled_ = true;
  464. }
  465. void SetTimerDivider(int div) {
  466. ice_ctx_->ctx()->internal_SetTimerAccelarator(div);
  467. }
  468. void SetStunResponseDelay(uint32_t delay) {
  469. nat_->delay_stun_resp_ms_ = delay;
  470. }
  471. void SetFilteringType(TestNat::NatBehavior type) {
  472. MOZ_ASSERT(!nat_->has_port_mappings());
  473. nat_->filtering_type_ = type;
  474. }
  475. void SetMappingType(TestNat::NatBehavior type) {
  476. MOZ_ASSERT(!nat_->has_port_mappings());
  477. nat_->mapping_type_ = type;
  478. }
  479. void SetBlockUdp(bool block) {
  480. MOZ_ASSERT(!nat_->has_port_mappings());
  481. nat_->block_udp_ = block;
  482. }
  483. void SetBlockStun(bool block) {
  484. nat_->block_stun_ = block;
  485. }
  486. // Get various pieces of state
  487. std::vector<std::string> GetGlobalAttributes() {
  488. std::vector<std::string> attrs(ice_ctx_->ctx()->GetGlobalAttributes());
  489. if (simulate_ice_lite_) {
  490. attrs.push_back("ice-lite");
  491. }
  492. return attrs;
  493. }
  494. std::vector<std::string> GetCandidates(size_t stream) {
  495. std::vector<std::string> v;
  496. RUN_ON_THREAD(
  497. test_utils_->sts_target(),
  498. WrapRunnableRet(&v, this, &IceTestPeer::GetCandidates_s, stream));
  499. return v;
  500. }
  501. std::string FilterCandidate(const std::string& candidate) {
  502. if (candidate_filter_) {
  503. return candidate_filter_(candidate);
  504. }
  505. return candidate;
  506. }
  507. std::vector<std::string> GetCandidates_s(size_t stream) {
  508. std::vector<std::string> candidates;
  509. if (stream >= ice_ctx_->ctx()->GetStreamCount() ||
  510. !ice_ctx_->ctx()->GetStream(stream)) {
  511. EXPECT_TRUE(false) << "No such stream " << stream;
  512. return candidates;
  513. }
  514. std::vector<std::string> candidates_in =
  515. ice_ctx_->ctx()->GetStream(stream)->GetCandidates();
  516. for (size_t i=0; i < candidates_in.size(); i++) {
  517. std::string candidate(FilterCandidate(candidates_in[i]));
  518. if (!candidate.empty()) {
  519. std::cerr << name_ << " Returning candidate: "
  520. << candidate << std::endl;
  521. candidates.push_back(candidate);
  522. }
  523. }
  524. return candidates;
  525. }
  526. void SetExpectedTypes(NrIceCandidate::Type local,
  527. NrIceCandidate::Type remote,
  528. std::string local_transport = kNrIceTransportUdp) {
  529. expected_local_type_ = local;
  530. expected_local_transport_ = local_transport;
  531. expected_remote_type_ = remote;
  532. }
  533. void SetExpectedRemoteCandidateAddr(const std::string& addr) {
  534. expected_remote_addr_ = addr;
  535. }
  536. int GetCandidatesPrivateIpv4Range(size_t stream) {
  537. std::vector<std::string> candidates = GetCandidates(stream);
  538. int host_net = 0;
  539. for (auto c : candidates) {
  540. if (c.find("typ host") != std::string::npos) {
  541. nr_transport_addr addr;
  542. std::vector<std::string> tokens = split(c, ' ');
  543. int r = nr_str_port_to_transport_addr(tokens.at(4).c_str(), 0, IPPROTO_UDP, &addr);
  544. MOZ_ASSERT(!r);
  545. if (!r && (addr.ip_version == NR_IPV4)) {
  546. int n = nr_transport_addr_get_private_addr_range(&addr);
  547. if (n) {
  548. if (host_net) {
  549. // TODO: add support for multiple private interfaces
  550. std::cerr << "This test doesn't support multiple private interfaces";
  551. return -1;
  552. }
  553. host_net = n;
  554. }
  555. }
  556. }
  557. }
  558. return host_net;
  559. }
  560. bool gathering_complete() { return gathering_complete_; }
  561. int ready_ct() { return ready_ct_; }
  562. bool is_ready_s(size_t stream) {
  563. RefPtr<NrIceMediaStream> media_stream = ice_ctx_->ctx()->GetStream(stream);
  564. if (!media_stream) {
  565. EXPECT_TRUE(false) << "No such stream " << stream;
  566. return false;
  567. }
  568. return media_stream->state() == NrIceMediaStream::ICE_OPEN;
  569. }
  570. bool is_ready(size_t stream)
  571. {
  572. bool result;
  573. test_utils_->sts_target()->Dispatch(
  574. WrapRunnableRet(&result, this, &IceTestPeer::is_ready_s, stream),
  575. NS_DISPATCH_SYNC);
  576. return result;
  577. }
  578. bool ice_connected() { return ice_connected_; }
  579. bool ice_failed() { return ice_failed_; }
  580. bool ice_reached_checking() { return ice_reached_checking_; }
  581. size_t received() { return received_; }
  582. size_t sent() { return sent_; }
  583. void RestartIce() {
  584. test_utils_->sts_target()->Dispatch(
  585. WrapRunnable(this,
  586. &IceTestPeer::RestartIce_s,
  587. ice_ctx_->CreateCtx()),
  588. NS_DISPATCH_SYNC);
  589. }
  590. void RestartIce_s(RefPtr<NrIceCtx> new_ctx) {
  591. ice_ctx_->BeginIceRestart(new_ctx);
  592. // set signals for the newly restarted ctx
  593. ice_ctx_->ctx()->SignalGatheringStateChange.connect(
  594. this,
  595. &IceTestPeer::GatheringStateChange);
  596. ice_ctx_->ctx()->SignalConnectionStateChange.connect(
  597. this,
  598. &IceTestPeer::ConnectionStateChange);
  599. // take care of some local bookkeeping
  600. ready_ct_ = 0;
  601. gathering_complete_ = false;
  602. ice_connected_ = false;
  603. ice_failed_ = false;
  604. ice_reached_checking_ = false;
  605. remote_ = nullptr;
  606. }
  607. void FinalizeIceRestart() {
  608. test_utils_->sts_target()->Dispatch(
  609. WrapRunnable(this, &IceTestPeer::FinalizeIceRestart_s),
  610. NS_DISPATCH_SYNC);
  611. }
  612. void FinalizeIceRestart_s() {
  613. ice_ctx_->FinalizeIceRestart();
  614. }
  615. void RollbackIceRestart() {
  616. test_utils_->sts_target()->Dispatch(
  617. WrapRunnable(this, &IceTestPeer::RollbackIceRestart_s),
  618. NS_DISPATCH_SYNC);
  619. }
  620. void RollbackIceRestart_s() {
  621. ice_ctx_->RollbackIceRestart();
  622. }
  623. // Start connecting to another peer
  624. void Connect_s(IceTestPeer *remote, TrickleMode trickle_mode,
  625. bool start = true) {
  626. nsresult res;
  627. remote_ = remote;
  628. trickle_mode_ = trickle_mode;
  629. ice_connected_ = false;
  630. ice_failed_ = false;
  631. ice_reached_checking_ = false;
  632. res = ice_ctx_->ctx()->ParseGlobalAttributes(remote->GetGlobalAttributes());
  633. ASSERT_TRUE(NS_SUCCEEDED(res));
  634. if (trickle_mode == TRICKLE_NONE ||
  635. trickle_mode == TRICKLE_REAL) {
  636. for (size_t i=0; i<ice_ctx_->ctx()->GetStreamCount(); ++i) {
  637. RefPtr<NrIceMediaStream> aStream = ice_ctx_->ctx()->GetStream(i);
  638. if (!aStream || aStream->HasParsedAttributes()) {
  639. continue;
  640. }
  641. std::vector<std::string> candidates =
  642. remote->GetCandidates(i);
  643. for (size_t j=0; j<candidates.size(); ++j) {
  644. std::cerr << name_ << " Adding remote candidate: " + candidates[j] << std::endl;
  645. }
  646. res = aStream->ParseAttributes(candidates);
  647. ASSERT_TRUE(NS_SUCCEEDED(res));
  648. }
  649. } else {
  650. // Parse empty attributes and then trickle them out later
  651. for (size_t i=0; i<ice_ctx_->ctx()->GetStreamCount(); ++i) {
  652. RefPtr<NrIceMediaStream> aStream = ice_ctx_->ctx()->GetStream(i);
  653. if (!aStream || aStream->HasParsedAttributes()) {
  654. continue;
  655. }
  656. std::vector<std::string> empty_attrs;
  657. std::cout << "Calling ParseAttributes on stream " << i << std::endl;
  658. res = aStream->ParseAttributes(empty_attrs);
  659. ASSERT_TRUE(NS_SUCCEEDED(res));
  660. }
  661. }
  662. if (start) {
  663. // Now start checks
  664. res = ice_ctx_->ctx()->StartChecks();
  665. ASSERT_TRUE(NS_SUCCEEDED(res));
  666. }
  667. }
  668. void Connect(IceTestPeer *remote, TrickleMode trickle_mode,
  669. bool start = true) {
  670. test_utils_->sts_target()->Dispatch(
  671. WrapRunnable(
  672. this, &IceTestPeer::Connect_s, remote, trickle_mode, start),
  673. NS_DISPATCH_SYNC);
  674. }
  675. void SimulateTrickle(size_t stream) {
  676. std::cerr << name_ << " Doing trickle for stream " << stream << std::endl;
  677. // If we are in trickle deferred mode, now trickle in the candidates
  678. // for |stream|
  679. // We should be safe here since stream changes happen on STS thread.
  680. ASSERT_GT(remote_->ice_ctx_->ctx()->GetStreamCount(), stream);
  681. ASSERT_TRUE(remote_->ice_ctx_->ctx()->GetStream(stream).get());
  682. std::vector<SchedulableTrickleCandidate*>& candidates =
  683. ControlTrickle(stream);
  684. for (auto i = candidates.begin(); i != candidates.end(); ++i) {
  685. (*i)->Schedule(0);
  686. }
  687. }
  688. // Allows test case to completely control when/if candidates are trickled
  689. // (test could also do things like insert extra trickle candidates, or
  690. // change existing ones, or insert duplicates, really anything is fair game)
  691. std::vector<SchedulableTrickleCandidate*>& ControlTrickle(size_t stream) {
  692. std::cerr << "Doing controlled trickle for stream " << stream << std::endl;
  693. std::vector<std::string> candidates =
  694. remote_->GetCandidates(stream);
  695. for (size_t j=0; j<candidates.size(); j++) {
  696. controlled_trickle_candidates_[stream].push_back(
  697. new SchedulableTrickleCandidate(
  698. this, stream, candidates[j], test_utils_));
  699. }
  700. return controlled_trickle_candidates_[stream];
  701. }
  702. nsresult TrickleCandidate_s(const std::string &candidate, size_t stream) {
  703. if (!ice_ctx_->ctx()->GetStream(stream)) {
  704. // stream might have gone away before the trickle timer popped
  705. return NS_OK;
  706. }
  707. return ice_ctx_->ctx()->GetStream(stream)->ParseTrickleCandidate(candidate);
  708. }
  709. void DumpCandidate(std::string which, const NrIceCandidate& cand) {
  710. std::string type;
  711. std::string tcp_type;
  712. std::string addr;
  713. int port;
  714. if (which.find("Remote") != std::string::npos) {
  715. addr = cand.cand_addr.host;
  716. port = cand.cand_addr.port;
  717. }
  718. else {
  719. addr = cand.local_addr.host;
  720. port = cand.local_addr.port;
  721. }
  722. switch(cand.type) {
  723. case NrIceCandidate::ICE_HOST:
  724. type = "host";
  725. break;
  726. case NrIceCandidate::ICE_SERVER_REFLEXIVE:
  727. type = "srflx";
  728. break;
  729. case NrIceCandidate::ICE_PEER_REFLEXIVE:
  730. type = "prflx";
  731. break;
  732. case NrIceCandidate::ICE_RELAYED:
  733. type = "relay";
  734. if (which.find("Local") != std::string::npos) {
  735. type += "(" + cand.local_addr.transport + ")";
  736. }
  737. break;
  738. default:
  739. FAIL();
  740. };
  741. switch(cand.tcp_type) {
  742. case NrIceCandidate::ICE_NONE:
  743. break;
  744. case NrIceCandidate::ICE_ACTIVE:
  745. tcp_type = " tcptype=active";
  746. break;
  747. case NrIceCandidate::ICE_PASSIVE:
  748. tcp_type = " tcptype=passive";
  749. break;
  750. case NrIceCandidate::ICE_SO:
  751. tcp_type = " tcptype=so";
  752. break;
  753. default:
  754. FAIL();
  755. };
  756. std::cerr << which
  757. << " --> "
  758. << type
  759. << " "
  760. << addr
  761. << ":"
  762. << port
  763. << "/"
  764. << cand.cand_addr.transport
  765. << tcp_type
  766. << " codeword="
  767. << cand.codeword
  768. << std::endl;
  769. }
  770. void DumpAndCheckActiveCandidates_s() {
  771. std::cerr << name_ << " Active candidates:" << std::endl;
  772. for (size_t i=0; i < ice_ctx_->ctx()->GetStreamCount(); ++i) {
  773. if (!ice_ctx_->ctx()->GetStream(i)) {
  774. continue;
  775. }
  776. for (size_t j=0; j < ice_ctx_->ctx()->GetStream(i)->components(); ++j) {
  777. std::cerr << name_ << " Stream " << i
  778. << " component " << j+1 << std::endl;
  779. UniquePtr<NrIceCandidate> local;
  780. UniquePtr<NrIceCandidate> remote;
  781. nsresult res = ice_ctx_->ctx()->GetStream(i)->GetActivePair(j+1,
  782. &local,
  783. &remote);
  784. if (res == NS_ERROR_NOT_AVAILABLE) {
  785. std::cerr << "Component unpaired or disabled." << std::endl;
  786. } else {
  787. ASSERT_TRUE(NS_SUCCEEDED(res));
  788. DumpCandidate("Local ", *local);
  789. /* Depending on timing, and the whims of the network
  790. * stack/configuration we're running on top of, prflx is always a
  791. * possibility. */
  792. if (expected_local_type_ == NrIceCandidate::ICE_HOST) {
  793. ASSERT_NE(NrIceCandidate::ICE_SERVER_REFLEXIVE, local->type);
  794. ASSERT_NE(NrIceCandidate::ICE_RELAYED, local->type);
  795. } else {
  796. ASSERT_EQ(expected_local_type_, local->type);
  797. }
  798. ASSERT_EQ(expected_local_transport_, local->local_addr.transport);
  799. DumpCandidate("Remote ", *remote);
  800. /* Depending on timing, and the whims of the network
  801. * stack/configuration we're running on top of, prflx is always a
  802. * possibility. */
  803. if (expected_remote_type_ == NrIceCandidate::ICE_HOST) {
  804. ASSERT_NE(NrIceCandidate::ICE_SERVER_REFLEXIVE, remote->type);
  805. ASSERT_NE(NrIceCandidate::ICE_RELAYED, remote->type);
  806. } else {
  807. ASSERT_EQ(expected_remote_type_, remote->type);
  808. }
  809. if (!expected_remote_addr_.empty()) {
  810. ASSERT_EQ(expected_remote_addr_, remote->cand_addr.host);
  811. }
  812. }
  813. }
  814. }
  815. }
  816. void DumpAndCheckActiveCandidates() {
  817. test_utils_->sts_target()->Dispatch(
  818. WrapRunnable(this, &IceTestPeer::DumpAndCheckActiveCandidates_s),
  819. NS_DISPATCH_SYNC);
  820. }
  821. void Close() {
  822. test_utils_->sts_target()->Dispatch(
  823. WrapRunnable(ice_ctx_->ctx(), &NrIceCtx::destroy_peer_ctx),
  824. NS_DISPATCH_SYNC);
  825. }
  826. void Shutdown() {
  827. std::cerr << name_ << " Shutdown" << std::endl;
  828. shutting_down_ = true;
  829. for (auto s = controlled_trickle_candidates_.begin();
  830. s != controlled_trickle_candidates_.end();
  831. ++s) {
  832. for (auto cand = s->second.begin(); cand != s->second.end(); ++cand) {
  833. delete *cand;
  834. }
  835. }
  836. ice_ctx_ = nullptr;
  837. if (remote_) {
  838. remote_->UnsetRemote();
  839. remote_ = nullptr;
  840. }
  841. }
  842. void UnsetRemote()
  843. {
  844. remote_ = nullptr;
  845. }
  846. void StartChecks() {
  847. nsresult res;
  848. // Now start checks
  849. test_utils_->sts_target()->Dispatch(
  850. WrapRunnableRet(&res, ice_ctx_->ctx(), &NrIceCtx::StartChecks),
  851. NS_DISPATCH_SYNC);
  852. ASSERT_TRUE(NS_SUCCEEDED(res));
  853. }
  854. // Handle events
  855. void GatheringStateChange(NrIceCtx* ctx,
  856. NrIceCtx::GatheringState state) {
  857. if (shutting_down_) {
  858. return;
  859. }
  860. if (state != NrIceCtx::ICE_CTX_GATHER_COMPLETE) {
  861. return;
  862. }
  863. std::cerr << name_ << " Gathering complete" << std::endl;
  864. gathering_complete_ = true;
  865. std::cerr << name_ << " CANDIDATES:" << std::endl;
  866. for (size_t i=0; i<ice_ctx_->ctx()->GetStreamCount(); ++i) {
  867. std::cerr << "Stream " << name_ << std::endl;
  868. if (!ice_ctx_->ctx()->GetStream(i)) {
  869. std::cerr << "DISABLED" << std::endl;
  870. continue;
  871. }
  872. std::vector<std::string> candidates =
  873. ice_ctx_->ctx()->GetStream(i)->GetCandidates();
  874. for(size_t j=0; j<candidates.size(); ++j) {
  875. std::cerr << candidates[j] << std::endl;
  876. }
  877. }
  878. std::cerr << std::endl;
  879. }
  880. void CandidateInitialized(NrIceMediaStream *stream, const std::string &raw_candidate) {
  881. std::string candidate(FilterCandidate(raw_candidate));
  882. if (candidate.empty()) {
  883. return;
  884. }
  885. std::cerr << "Candidate for stream " << stream->name() << " initialized: "
  886. << candidate << std::endl;
  887. candidates_[stream->name()].push_back(candidate);
  888. // If we are connected, then try to trickle to the other side.
  889. if (remote_ && remote_->remote_ && (trickle_mode_ != TRICKLE_SIMULATE)) {
  890. // first, find the index of the stream we've been given so
  891. // we can get the corresponding stream on the remote side
  892. for (size_t i=0; i<ice_ctx_->ctx()->GetStreamCount(); ++i) {
  893. if (ice_ctx_->ctx()->GetStream(i) == stream) {
  894. RefPtr<NrIceCtx> ctx = remote_->ice_ctx_->ctx();
  895. ASSERT_GT(ctx->GetStreamCount(), i);
  896. nsresult res = ctx->GetStream(i)->ParseTrickleCandidate(candidate);
  897. ASSERT_TRUE(NS_SUCCEEDED(res));
  898. ++trickled_;
  899. return;
  900. }
  901. }
  902. ADD_FAILURE() << "No matching stream found for " << stream;
  903. }
  904. }
  905. nsresult GetCandidatePairs_s(size_t stream_index,
  906. std::vector<NrIceCandidatePair>* pairs)
  907. {
  908. MOZ_ASSERT(pairs);
  909. if (stream_index >= ice_ctx_->ctx()->GetStreamCount() ||
  910. !ice_ctx_->ctx()->GetStream(stream_index)) {
  911. // Is there a better error for "no such index"?
  912. ADD_FAILURE() << "No such media stream index: " << stream_index;
  913. return NS_ERROR_INVALID_ARG;
  914. }
  915. return ice_ctx_->ctx()->GetStream(stream_index)->GetCandidatePairs(pairs);
  916. }
  917. nsresult GetCandidatePairs(size_t stream_index,
  918. std::vector<NrIceCandidatePair>* pairs) {
  919. nsresult v;
  920. test_utils_->sts_target()->Dispatch(
  921. WrapRunnableRet(&v, this,
  922. &IceTestPeer::GetCandidatePairs_s,
  923. stream_index,
  924. pairs),
  925. NS_DISPATCH_SYNC);
  926. return v;
  927. }
  928. void DumpCandidatePair(const NrIceCandidatePair& pair) {
  929. std::cerr << std::endl;
  930. DumpCandidate("Local", pair.local);
  931. DumpCandidate("Remote", pair.remote);
  932. std::cerr << "state = " << pair.state
  933. << " priority = " << pair.priority
  934. << " nominated = " << pair.nominated
  935. << " selected = " << pair.selected
  936. << " codeword = " << pair.codeword << std::endl;
  937. }
  938. void DumpCandidatePairs_s(NrIceMediaStream *stream) {
  939. std::vector<NrIceCandidatePair> pairs;
  940. nsresult res = stream->GetCandidatePairs(&pairs);
  941. ASSERT_TRUE(NS_SUCCEEDED(res));
  942. std::cerr << "Begin list of candidate pairs [" << std::endl;
  943. for (std::vector<NrIceCandidatePair>::iterator p = pairs.begin();
  944. p != pairs.end(); ++p) {
  945. DumpCandidatePair(*p);
  946. }
  947. std::cerr << "]" << std::endl;
  948. }
  949. void DumpCandidatePairs_s() {
  950. std::cerr << "Dumping candidate pairs for all streams [" << std::endl;
  951. for (size_t s = 0; s < ice_ctx_->ctx()->GetStreamCount(); ++s) {
  952. if (!ice_ctx_->ctx()->GetStream(s)) {
  953. continue;
  954. }
  955. DumpCandidatePairs_s(ice_ctx_->ctx()->GetStream(s).get());
  956. }
  957. std::cerr << "]" << std::endl;
  958. }
  959. bool CandidatePairsPriorityDescending(const std::vector<NrIceCandidatePair>&
  960. pairs) {
  961. // Verify that priority is descending
  962. uint64_t priority = std::numeric_limits<uint64_t>::max();
  963. for (size_t p = 0; p < pairs.size(); ++p) {
  964. if (priority < pairs[p].priority) {
  965. std::cerr << "Priority increased in subsequent pairs:" << std::endl;
  966. DumpCandidatePair(pairs[p-1]);
  967. DumpCandidatePair(pairs[p]);
  968. return false;
  969. } else if (priority == pairs[p].priority) {
  970. if (!IceCandidatePairCompare()(pairs[p], pairs[p-1]) &&
  971. !IceCandidatePairCompare()(pairs[p-1], pairs[p])) {
  972. std::cerr << "Ignoring identical pair from trigger check" << std::endl;
  973. } else {
  974. std::cerr << "Duplicate priority in subseqent pairs:" << std::endl;
  975. DumpCandidatePair(pairs[p-1]);
  976. DumpCandidatePair(pairs[p]);
  977. return false;
  978. }
  979. }
  980. priority = pairs[p].priority;
  981. }
  982. return true;
  983. }
  984. void UpdateAndValidateCandidatePairs(size_t stream_index,
  985. std::vector<NrIceCandidatePair>*
  986. new_pairs) {
  987. std::vector<NrIceCandidatePair> old_pairs = *new_pairs;
  988. GetCandidatePairs(stream_index, new_pairs);
  989. ASSERT_TRUE(CandidatePairsPriorityDescending(*new_pairs)) << "New list of "
  990. "candidate pairs is either not sorted in priority order, or has "
  991. "duplicate priorities.";
  992. ASSERT_TRUE(CandidatePairsPriorityDescending(old_pairs)) << "Old list of "
  993. "candidate pairs is either not sorted in priority order, or has "
  994. "duplicate priorities. This indicates some bug in the test case.";
  995. std::vector<NrIceCandidatePair> added_pairs;
  996. std::vector<NrIceCandidatePair> removed_pairs;
  997. // set_difference computes the set of elements that are present in the
  998. // first set, but not the second
  999. // NrIceCandidatePair::operator< compares based on the priority, local
  1000. // candidate, and remote candidate in that order. This means this will
  1001. // catch cases where the priority has remained the same, but one of the
  1002. // candidates has changed.
  1003. std::set_difference((*new_pairs).begin(),
  1004. (*new_pairs).end(),
  1005. old_pairs.begin(),
  1006. old_pairs.end(),
  1007. std::inserter(added_pairs, added_pairs.begin()),
  1008. IceCandidatePairCompare());
  1009. std::set_difference(old_pairs.begin(),
  1010. old_pairs.end(),
  1011. (*new_pairs).begin(),
  1012. (*new_pairs).end(),
  1013. std::inserter(removed_pairs, removed_pairs.begin()),
  1014. IceCandidatePairCompare());
  1015. for (std::vector<NrIceCandidatePair>::iterator a = added_pairs.begin();
  1016. a != added_pairs.end(); ++a) {
  1017. std::cerr << "Found new candidate pair." << std::endl;
  1018. DumpCandidatePair(*a);
  1019. }
  1020. for (std::vector<NrIceCandidatePair>::iterator r = removed_pairs.begin();
  1021. r != removed_pairs.end(); ++r) {
  1022. std::cerr << "Pre-existing candidate pair is now missing:" << std::endl;
  1023. DumpCandidatePair(*r);
  1024. }
  1025. ASSERT_TRUE(removed_pairs.empty()) << "At least one candidate pair has "
  1026. "gone missing.";
  1027. }
  1028. void StreamReady(NrIceMediaStream *stream) {
  1029. ++ready_ct_;
  1030. std::cerr << name_ << " Stream ready for " << stream->name()
  1031. << " ct=" << ready_ct_ << std::endl;
  1032. DumpCandidatePairs_s(stream);
  1033. }
  1034. void StreamFailed(NrIceMediaStream *stream) {
  1035. std::cerr << name_ << " Stream failed for " << stream->name()
  1036. << " ct=" << ready_ct_ << std::endl;
  1037. DumpCandidatePairs_s(stream);
  1038. }
  1039. void ConnectionStateChange(NrIceCtx* ctx,
  1040. NrIceCtx::ConnectionState state) {
  1041. (void)ctx;
  1042. switch (state) {
  1043. case NrIceCtx::ICE_CTX_INIT:
  1044. break;
  1045. case NrIceCtx::ICE_CTX_CHECKING:
  1046. std::cerr << name_ << " ICE reached checking" << std::endl;
  1047. ice_reached_checking_ = true;
  1048. break;
  1049. case NrIceCtx::ICE_CTX_CONNECTED:
  1050. std::cerr << name_ << " ICE connected" << std::endl;
  1051. ice_connected_ = true;
  1052. break;
  1053. case NrIceCtx::ICE_CTX_COMPLETED:
  1054. std::cerr << name_ << " ICE completed" << std::endl;
  1055. break;
  1056. case NrIceCtx::ICE_CTX_FAILED:
  1057. std::cerr << name_ << " ICE failed" << std::endl;
  1058. ice_failed_ = true;
  1059. break;
  1060. case NrIceCtx::ICE_CTX_DISCONNECTED:
  1061. std::cerr << name_ << " ICE disconnected" << std::endl;
  1062. ice_connected_ = false;
  1063. break;
  1064. default:
  1065. MOZ_CRASH();
  1066. }
  1067. }
  1068. void PacketReceived(NrIceMediaStream *stream, int component, const unsigned char *data,
  1069. int len) {
  1070. std::cerr << name_ << ": received " << len << " bytes" << std::endl;
  1071. ++received_;
  1072. }
  1073. void SendPacket(int stream, int component, const unsigned char *data,
  1074. int len) {
  1075. RefPtr<NrIceMediaStream> media_stream = ice_ctx_->ctx()->GetStream(stream);
  1076. if (!media_stream) {
  1077. ADD_FAILURE() << "No such stream " << stream;
  1078. return;
  1079. }
  1080. ASSERT_TRUE(NS_SUCCEEDED(media_stream->SendPacket(component, data, len)));
  1081. ++sent_;
  1082. std::cerr << name_ << ": sent " << len << " bytes" << std::endl;
  1083. }
  1084. void SendFailure(int stream, int component) {
  1085. RefPtr<NrIceMediaStream> media_stream = ice_ctx_->ctx()->GetStream(stream);
  1086. if (!media_stream) {
  1087. ADD_FAILURE() << "No such stream " << stream;
  1088. return;
  1089. }
  1090. const std::string d("FAIL");
  1091. ASSERT_TRUE(NS_FAILED(media_stream->SendPacket(component,
  1092. reinterpret_cast<const unsigned char *>(d.c_str()), d.length())));
  1093. std::cerr << name_ << ": send failed as expected" << std::endl;
  1094. }
  1095. void SetCandidateFilter(CandidateFilter filter) {
  1096. candidate_filter_ = filter;
  1097. }
  1098. void ParseCandidate_s(size_t i, const std::string& candidate) {
  1099. ASSERT_TRUE(ice_ctx_->ctx()->GetStream(i).get()) << "No such stream " << i;
  1100. std::vector<std::string> attributes;
  1101. attributes.push_back(candidate);
  1102. ice_ctx_->ctx()->GetStream(i)->ParseAttributes(attributes);
  1103. }
  1104. void ParseCandidate(size_t i, const std::string& candidate)
  1105. {
  1106. test_utils_->sts_target()->Dispatch(
  1107. WrapRunnable(this,
  1108. &IceTestPeer::ParseCandidate_s,
  1109. i,
  1110. candidate),
  1111. NS_DISPATCH_SYNC);
  1112. }
  1113. void DisableComponent_s(size_t stream, int component_id) {
  1114. ASSERT_LT(stream, ice_ctx_->ctx()->GetStreamCount());
  1115. ASSERT_TRUE(ice_ctx_->ctx()->GetStream(stream).get()) << "No such stream "
  1116. << stream;
  1117. nsresult res =
  1118. ice_ctx_->ctx()->GetStream(stream)->DisableComponent(component_id);
  1119. ASSERT_TRUE(NS_SUCCEEDED(res));
  1120. }
  1121. void DisableComponent(size_t stream, int component_id)
  1122. {
  1123. test_utils_->sts_target()->Dispatch(
  1124. WrapRunnable(this,
  1125. &IceTestPeer::DisableComponent_s,
  1126. stream,
  1127. component_id),
  1128. NS_DISPATCH_SYNC);
  1129. }
  1130. void AssertConsentRefresh_s(size_t stream, int component_id, ConsentStatus status) {
  1131. ASSERT_LT(stream, ice_ctx_->ctx()->GetStreamCount());
  1132. ASSERT_TRUE(ice_ctx_->ctx()->GetStream(stream).get()) << "No such stream "
  1133. << stream;
  1134. bool can_send;
  1135. struct timeval timestamp;
  1136. nsresult res = ice_ctx_->ctx()->GetStream(stream)->
  1137. GetConsentStatus(component_id, &can_send, &timestamp);
  1138. ASSERT_TRUE(NS_SUCCEEDED(res));
  1139. if (status == CONSENT_EXPIRED) {
  1140. ASSERT_EQ(can_send, 0);
  1141. } else {
  1142. ASSERT_EQ(can_send, 1);
  1143. }
  1144. if (consent_timestamp_.tv_sec) {
  1145. if (status == CONSENT_FRESH) {
  1146. ASSERT_EQ(r_timeval_cmp(&timestamp, &consent_timestamp_), 1);
  1147. } else {
  1148. ASSERT_EQ(r_timeval_cmp(&timestamp, &consent_timestamp_), 0);
  1149. }
  1150. }
  1151. consent_timestamp_.tv_sec = timestamp.tv_sec;
  1152. consent_timestamp_.tv_usec = timestamp.tv_usec;
  1153. std::cerr << name_ << ": new consent timestamp = " <<
  1154. consent_timestamp_.tv_sec << "." << consent_timestamp_.tv_usec <<
  1155. std::endl;
  1156. }
  1157. void AssertConsentRefresh(ConsentStatus status) {
  1158. test_utils_->sts_target()->Dispatch(
  1159. WrapRunnable(this,
  1160. &IceTestPeer::AssertConsentRefresh_s,
  1161. 0,
  1162. 1,
  1163. status),
  1164. NS_DISPATCH_SYNC);
  1165. }
  1166. int trickled() { return trickled_; }
  1167. void SetControlling(NrIceCtx::Controlling controlling) {
  1168. nsresult res;
  1169. test_utils_->sts_target()->Dispatch(
  1170. WrapRunnableRet(&res, ice_ctx_->ctx(),
  1171. &NrIceCtx::SetControlling,
  1172. controlling),
  1173. NS_DISPATCH_SYNC);
  1174. ASSERT_TRUE(NS_SUCCEEDED(res));
  1175. }
  1176. NrIceCtx::Controlling GetControlling() {
  1177. return ice_ctx_->ctx()->GetControlling();
  1178. }
  1179. void SetTiebreaker(uint64_t tiebreaker) {
  1180. test_utils_->sts_target()->Dispatch(
  1181. WrapRunnable(this,
  1182. &IceTestPeer::SetTiebreaker_s,
  1183. tiebreaker),
  1184. NS_DISPATCH_SYNC);
  1185. }
  1186. void SetTiebreaker_s(uint64_t tiebreaker) {
  1187. ice_ctx_->ctx()->peer()->tiebreaker = tiebreaker;
  1188. }
  1189. void SimulateIceLite() {
  1190. simulate_ice_lite_ = true;
  1191. SetControlling(NrIceCtx::ICE_CONTROLLED);
  1192. }
  1193. nsresult GetDefaultCandidate(unsigned int stream, NrIceCandidate* cand) {
  1194. nsresult rv;
  1195. test_utils_->sts_target()->Dispatch(
  1196. WrapRunnableRet(&rv, this,
  1197. &IceTestPeer::GetDefaultCandidate_s,
  1198. stream, cand),
  1199. NS_DISPATCH_SYNC);
  1200. return rv;
  1201. }
  1202. nsresult GetDefaultCandidate_s(unsigned int stream, NrIceCandidate* cand) {
  1203. return ice_ctx_->ctx()->GetStream(stream)->GetDefaultCandidate(1, cand);
  1204. }
  1205. private:
  1206. std::string name_;
  1207. RefPtr<NrIceCtxHandler> ice_ctx_;
  1208. std::map<std::string, std::vector<std::string> > candidates_;
  1209. // Maps from stream id to list of remote trickle candidates
  1210. std::map<size_t, std::vector<SchedulableTrickleCandidate*> >
  1211. controlled_trickle_candidates_;
  1212. bool shutting_down_;
  1213. bool gathering_complete_;
  1214. int ready_ct_;
  1215. bool ice_connected_;
  1216. bool ice_failed_;
  1217. bool ice_reached_checking_;
  1218. size_t received_;
  1219. size_t sent_;
  1220. struct timeval consent_timestamp_;
  1221. NrIceResolverFake fake_resolver_;
  1222. RefPtr<NrIceResolver> dns_resolver_;
  1223. IceTestPeer *remote_;
  1224. CandidateFilter candidate_filter_;
  1225. NrIceCandidate::Type expected_local_type_;
  1226. std::string expected_local_transport_;
  1227. NrIceCandidate::Type expected_remote_type_;
  1228. std::string expected_remote_addr_;
  1229. TrickleMode trickle_mode_;
  1230. int trickled_;
  1231. bool simulate_ice_lite_;
  1232. RefPtr<mozilla::TestNat> nat_;
  1233. MtransportTestUtils* test_utils_;
  1234. };
  1235. void SchedulableTrickleCandidate::Trickle() {
  1236. timer_handle_ = nullptr;
  1237. nsresult res = peer_->TrickleCandidate_s(candidate_, stream_);
  1238. ASSERT_TRUE(NS_SUCCEEDED(res));
  1239. }
  1240. class WebRtcIceGatherTest : public StunTest {
  1241. public:
  1242. void SetUp() override {
  1243. StunTest::SetUp();
  1244. Preferences::SetInt("media.peerconnection.ice.tcp_so_sock_count", 3);
  1245. test_utils_->sts_target()->Dispatch(
  1246. WrapRunnable(TestStunServer::GetInstance(AF_INET),
  1247. &TestStunServer::Reset),
  1248. NS_DISPATCH_SYNC);
  1249. if (TestStunServer::GetInstance(AF_INET6)) {
  1250. test_utils_->sts_target()->Dispatch(
  1251. WrapRunnable(TestStunServer::GetInstance(AF_INET6),
  1252. &TestStunServer::Reset),
  1253. NS_DISPATCH_SYNC);
  1254. }
  1255. }
  1256. void TearDown() override {
  1257. peer_ = nullptr;
  1258. StunTest::TearDown();
  1259. }
  1260. void EnsurePeer(const unsigned int flags = ICE_TEST_PEER_OFFERER) {
  1261. if (!peer_) {
  1262. peer_ = MakeUnique<IceTestPeer>("P1", test_utils_,
  1263. flags & ICE_TEST_PEER_OFFERER,
  1264. flags & ICE_TEST_PEER_ALLOW_LOOPBACK,
  1265. flags & ICE_TEST_PEER_ENABLED_TCP,
  1266. flags & ICE_TEST_PEER_ALLOW_LINK_LOCAL);
  1267. peer_->AddStream(1);
  1268. }
  1269. }
  1270. void Gather(unsigned int waitTime = kDefaultTimeout) {
  1271. EnsurePeer();
  1272. peer_->Gather();
  1273. if (waitTime) {
  1274. WaitForGather(waitTime);
  1275. }
  1276. }
  1277. void WaitForGather(unsigned int waitTime = kDefaultTimeout) {
  1278. ASSERT_TRUE_WAIT(peer_->gathering_complete(), waitTime);
  1279. }
  1280. void AddStunServerWithResponse(
  1281. const std::string& fake_addr,
  1282. uint16_t fake_port,
  1283. const std::string& fqdn,
  1284. const std::string& proto,
  1285. std::vector<NrIceStunServer>* stun_servers) {
  1286. int family;
  1287. if (fake_addr.find(':') != std::string::npos) {
  1288. family = AF_INET6;
  1289. } else {
  1290. family = AF_INET;
  1291. }
  1292. std::string stun_addr;
  1293. uint16_t stun_port;
  1294. if (proto == kNrIceTransportUdp) {
  1295. TestStunServer::GetInstance(family)->SetResponseAddr(fake_addr,
  1296. fake_port);
  1297. stun_addr = TestStunServer::GetInstance(family)->addr();
  1298. stun_port = TestStunServer::GetInstance(family)->port();
  1299. } else if (proto == kNrIceTransportTcp) {
  1300. TestStunTcpServer::GetInstance(family)->SetResponseAddr(fake_addr,
  1301. fake_port);
  1302. stun_addr = TestStunTcpServer::GetInstance(family)->addr();
  1303. stun_port = TestStunTcpServer::GetInstance(family)->port();
  1304. } else {
  1305. MOZ_CRASH();
  1306. }
  1307. if (!fqdn.empty()) {
  1308. peer_->SetFakeResolver(stun_addr, fqdn);
  1309. stun_addr = fqdn;
  1310. }
  1311. stun_servers->push_back(*NrIceStunServer::Create(stun_addr,
  1312. stun_port,
  1313. proto.c_str()));
  1314. }
  1315. void UseFakeStunUdpServerWithResponse(
  1316. const std::string& fake_addr,
  1317. uint16_t fake_port,
  1318. const std::string& fqdn = std::string()) {
  1319. EnsurePeer();
  1320. std::vector<NrIceStunServer> stun_servers;
  1321. AddStunServerWithResponse(fake_addr, fake_port, fqdn, "udp", &stun_servers);
  1322. peer_->SetStunServers(stun_servers);
  1323. }
  1324. void UseFakeStunTcpServerWithResponse(
  1325. const std::string& fake_addr,
  1326. uint16_t fake_port,
  1327. const std::string& fqdn = std::string()) {
  1328. EnsurePeer(ICE_TEST_PEER_OFFERER | ICE_TEST_PEER_ENABLED_TCP);
  1329. std::vector<NrIceStunServer> stun_servers;
  1330. AddStunServerWithResponse(fake_addr, fake_port, fqdn, "tcp", &stun_servers);
  1331. peer_->SetStunServers(stun_servers);
  1332. }
  1333. void UseFakeStunUdpTcpServersWithResponse(
  1334. const std::string& fake_udp_addr,
  1335. uint16_t fake_udp_port,
  1336. const std::string& fake_tcp_addr,
  1337. uint16_t fake_tcp_port) {
  1338. EnsurePeer(ICE_TEST_PEER_OFFERER | ICE_TEST_PEER_ENABLED_TCP);
  1339. std::vector<NrIceStunServer> stun_servers;
  1340. AddStunServerWithResponse(fake_udp_addr,
  1341. fake_udp_port,
  1342. "", // no fqdn
  1343. "udp",
  1344. &stun_servers);
  1345. AddStunServerWithResponse(fake_tcp_addr,
  1346. fake_tcp_port,
  1347. "", // no fqdn
  1348. "tcp",
  1349. &stun_servers);
  1350. peer_->SetStunServers(stun_servers);
  1351. }
  1352. void UseTestStunServer() {
  1353. TestStunServer::GetInstance(AF_INET)->Reset();
  1354. peer_->SetStunServer(TestStunServer::GetInstance(AF_INET)->addr(),
  1355. TestStunServer::GetInstance(AF_INET)->port());
  1356. }
  1357. // NB: Only does substring matching, watch out for stuff like "1.2.3.4"
  1358. // matching "21.2.3.47". " 1.2.3.4 " should not have false positives.
  1359. bool StreamHasMatchingCandidate(unsigned int stream,
  1360. const std::string& match,
  1361. const std::string& match2 = "") {
  1362. std::vector<std::string> candidates = peer_->GetCandidates(stream);
  1363. for (size_t c = 0; c < candidates.size(); ++c) {
  1364. if (std::string::npos != candidates[c].find(match)) {
  1365. if (!match2.length() ||
  1366. std::string::npos != candidates[c].find(match2)) {
  1367. return true;
  1368. }
  1369. }
  1370. }
  1371. return false;
  1372. }
  1373. void DumpCandidates(unsigned int stream) {
  1374. std::vector<std::string> candidates = peer_->GetCandidates(stream);
  1375. std::cerr << "Candidates for stream " << stream << "->"
  1376. << candidates.size() << std::endl;
  1377. for (auto c : candidates) {
  1378. std::cerr << "Candidate: " << c << std::endl;
  1379. }
  1380. }
  1381. protected:
  1382. mozilla::UniquePtr<IceTestPeer> peer_;
  1383. };
  1384. class WebRtcIceConnectTest : public StunTest {
  1385. public:
  1386. WebRtcIceConnectTest() :
  1387. initted_(false),
  1388. test_stun_server_inited_(false),
  1389. use_nat_(false),
  1390. filtering_type_(TestNat::ENDPOINT_INDEPENDENT),
  1391. mapping_type_(TestNat::ENDPOINT_INDEPENDENT),
  1392. block_udp_(false) {}
  1393. void SetUp() override {
  1394. StunTest::SetUp();
  1395. nsresult rv;
  1396. target_ = do_GetService(NS_SOCKETTRANSPORTSERVICE_CONTRACTID, &rv);
  1397. ASSERT_TRUE(NS_SUCCEEDED(rv));
  1398. }
  1399. void TearDown() override {
  1400. p1_ = nullptr;
  1401. p2_ = nullptr;
  1402. StunTest::TearDown();
  1403. }
  1404. void AddStream(int components) {
  1405. Init(false, false);
  1406. p1_->AddStream(components);
  1407. p2_->AddStream(components);
  1408. }
  1409. void RemoveStream(size_t index) {
  1410. p1_->RemoveStream(index);
  1411. p2_->RemoveStream(index);
  1412. }
  1413. void Init(bool allow_loopback,
  1414. bool enable_tcp,
  1415. bool setup_stun_servers = true,
  1416. NrIceCtx::Policy ice_policy = NrIceCtx::ICE_POLICY_ALL) {
  1417. if (initted_) {
  1418. return;
  1419. }
  1420. p1_ = MakeUnique<IceTestPeer>("P1", test_utils_, true, allow_loopback,
  1421. enable_tcp, false, ice_policy);
  1422. p2_ = MakeUnique<IceTestPeer>("P2", test_utils_, false, allow_loopback,
  1423. enable_tcp, false, ice_policy);
  1424. InitPeer(p1_.get(), setup_stun_servers);
  1425. InitPeer(p2_.get(), setup_stun_servers);
  1426. initted_ = true;
  1427. }
  1428. void InitPeer(IceTestPeer* peer, bool setup_stun_servers = true) {
  1429. if (use_nat_) {
  1430. // If we enable nat simulation, but still use a real STUN server somewhere
  1431. // on the internet, we will see failures if there is a real NAT in
  1432. // addition to our simulated one, particularly if it disallows
  1433. // hairpinning.
  1434. if (setup_stun_servers) {
  1435. InitTestStunServer();
  1436. peer->UseTestStunServer();
  1437. }
  1438. peer->UseNat();
  1439. peer->SetFilteringType(filtering_type_);
  1440. peer->SetMappingType(mapping_type_);
  1441. peer->SetBlockUdp(block_udp_);
  1442. } else if (setup_stun_servers) {
  1443. std::vector<NrIceStunServer> stun_servers;
  1444. stun_servers.push_back(*NrIceStunServer::Create(stun_server_address_,
  1445. kDefaultStunServerPort, kNrIceTransportUdp));
  1446. stun_servers.push_back(*NrIceStunServer::Create(stun_server_address_,
  1447. kDefaultStunServerPort, kNrIceTransportTcp));
  1448. peer->SetStunServers(stun_servers);
  1449. }
  1450. }
  1451. bool Gather(unsigned int waitTime = kDefaultTimeout,
  1452. bool default_route_only = false) {
  1453. Init(false, false);
  1454. return GatherCallerAndCallee(p1_.get(),
  1455. p2_.get(),
  1456. waitTime,
  1457. default_route_only);
  1458. }
  1459. bool GatherCallerAndCallee(IceTestPeer* caller,
  1460. IceTestPeer* callee,
  1461. unsigned int waitTime = kDefaultTimeout,
  1462. bool default_route_only = false) {
  1463. caller->Gather(default_route_only);
  1464. callee->Gather(default_route_only);
  1465. if (waitTime) {
  1466. EXPECT_TRUE_WAIT(caller->gathering_complete(), waitTime);
  1467. if (!caller->gathering_complete())
  1468. return false;
  1469. EXPECT_TRUE_WAIT(callee->gathering_complete(), waitTime);
  1470. if (!callee->gathering_complete())
  1471. return false;
  1472. }
  1473. return true;
  1474. }
  1475. void UseNat() {
  1476. // to be useful, this method should be called before Init
  1477. ASSERT_FALSE(initted_);
  1478. use_nat_ = true;
  1479. }
  1480. void SetFilteringType(TestNat::NatBehavior type) {
  1481. // to be useful, this method should be called before Init
  1482. ASSERT_FALSE(initted_);
  1483. filtering_type_ = type;
  1484. }
  1485. void SetMappingType(TestNat::NatBehavior type) {
  1486. // to be useful, this method should be called before Init
  1487. ASSERT_FALSE(initted_);
  1488. mapping_type_ = type;
  1489. }
  1490. void BlockUdp() {
  1491. // note: |block_udp_| is used only in InitPeer.
  1492. // Use IceTestPeer::SetBlockUdp to act on the peer directly.
  1493. block_udp_ = true;
  1494. }
  1495. void SetupAndCheckConsent() {
  1496. p1_->SetTimerDivider(10);
  1497. p2_->SetTimerDivider(10);
  1498. ASSERT_TRUE(Gather());
  1499. Connect();
  1500. p1_->AssertConsentRefresh(CONSENT_FRESH);
  1501. p2_->AssertConsentRefresh(CONSENT_FRESH);
  1502. SendReceive();
  1503. }
  1504. void AssertConsentRefresh(ConsentStatus status = CONSENT_FRESH) {
  1505. p1_->AssertConsentRefresh(status);
  1506. p2_->AssertConsentRefresh(status);
  1507. }
  1508. void InitTestStunServer() {
  1509. if (test_stun_server_inited_) {
  1510. return;
  1511. }
  1512. std::cerr << "Resetting TestStunServer" << std::endl;
  1513. TestStunServer::GetInstance(AF_INET)->Reset();
  1514. test_stun_server_inited_ = true;
  1515. }
  1516. void UseTestStunServer() {
  1517. InitTestStunServer();
  1518. p1_->UseTestStunServer();
  1519. p2_->UseTestStunServer();
  1520. }
  1521. void SetTurnServer(const std::string addr, uint16_t port,
  1522. const std::string username,
  1523. const std::string password,
  1524. const char* transport = kNrIceTransportUdp) {
  1525. p1_->SetTurnServer(addr, port, username, password, transport);
  1526. p2_->SetTurnServer(addr, port, username, password, transport);
  1527. }
  1528. void SetTurnServers(const std::vector<NrIceTurnServer>& servers) {
  1529. p1_->SetTurnServers(servers);
  1530. p2_->SetTurnServers(servers);
  1531. }
  1532. void SetCandidateFilter(CandidateFilter filter, bool both=true) {
  1533. p1_->SetCandidateFilter(filter);
  1534. if (both) {
  1535. p2_->SetCandidateFilter(filter);
  1536. }
  1537. }
  1538. void Connect() {
  1539. ConnectCallerAndCallee(p1_.get(), p2_.get());
  1540. }
  1541. void ConnectCallerAndCallee(IceTestPeer* caller, IceTestPeer* callee) {
  1542. ASSERT_TRUE(caller->ready_ct() == 0);
  1543. ASSERT_TRUE(caller->ice_connected() == 0);
  1544. ASSERT_TRUE(caller->ice_reached_checking() == 0);
  1545. ASSERT_TRUE(callee->ready_ct() == 0);
  1546. ASSERT_TRUE(callee->ice_connected() == 0);
  1547. ASSERT_TRUE(callee->ice_reached_checking() == 0);
  1548. // IceTestPeer::Connect grabs attributes from the first arg, and
  1549. // gives them to |this|, meaning that callee->Connect(caller, ...)
  1550. // simulates caller sending an offer to callee. Order matters here
  1551. // because it determines which peer is controlling.
  1552. callee->Connect(caller, TRICKLE_NONE);
  1553. caller->Connect(callee, TRICKLE_NONE);
  1554. ASSERT_TRUE_WAIT(caller->ready_ct() == 1 && callee->ready_ct() == 1,
  1555. kDefaultTimeout);
  1556. ASSERT_TRUE_WAIT(caller->ice_connected() && callee->ice_connected(),
  1557. kDefaultTimeout);
  1558. ASSERT_TRUE(caller->ice_reached_checking());
  1559. ASSERT_TRUE(callee->ice_reached_checking());
  1560. caller->DumpAndCheckActiveCandidates();
  1561. callee->DumpAndCheckActiveCandidates();
  1562. }
  1563. void SetExpectedTypes(NrIceCandidate::Type local, NrIceCandidate::Type remote,
  1564. std::string transport = kNrIceTransportUdp) {
  1565. p1_->SetExpectedTypes(local, remote, transport);
  1566. p2_->SetExpectedTypes(local, remote, transport);
  1567. }
  1568. void SetExpectedTypes(NrIceCandidate::Type local1, NrIceCandidate::Type remote1,
  1569. NrIceCandidate::Type local2, NrIceCandidate::Type remote2) {
  1570. p1_->SetExpectedTypes(local1, remote1);
  1571. p2_->SetExpectedTypes(local2, remote2);
  1572. }
  1573. void SetExpectedRemoteCandidateAddr(const std::string& addr) {
  1574. p1_->SetExpectedRemoteCandidateAddr(addr);
  1575. p2_->SetExpectedRemoteCandidateAddr(addr);
  1576. }
  1577. void ConnectP1(TrickleMode mode = TRICKLE_NONE) {
  1578. p1_->Connect(p2_.get(), mode);
  1579. }
  1580. void ConnectP2(TrickleMode mode = TRICKLE_NONE) {
  1581. p2_->Connect(p1_.get(), mode);
  1582. }
  1583. void WaitForConnectedStreams(int expected_streams = 1) {
  1584. ASSERT_TRUE_WAIT(p1_->ready_ct() == expected_streams &&
  1585. p2_->ready_ct() == expected_streams, kDefaultTimeout);
  1586. ASSERT_TRUE_WAIT(p1_->ice_connected() && p2_->ice_connected(),
  1587. kDefaultTimeout);
  1588. }
  1589. void AssertCheckingReached() {
  1590. ASSERT_TRUE(p1_->ice_reached_checking());
  1591. ASSERT_TRUE(p2_->ice_reached_checking());
  1592. }
  1593. void WaitForConnected(unsigned int timeout = kDefaultTimeout) {
  1594. ASSERT_TRUE_WAIT(p1_->ice_connected(), timeout);
  1595. ASSERT_TRUE_WAIT(p2_->ice_connected(), timeout);
  1596. }
  1597. void WaitForGather() {
  1598. ASSERT_TRUE_WAIT(p1_->gathering_complete(), kDefaultTimeout);
  1599. ASSERT_TRUE_WAIT(p2_->gathering_complete(), kDefaultTimeout);
  1600. }
  1601. void WaitForDisconnected(unsigned int timeout = kDefaultTimeout) {
  1602. ASSERT_TRUE(p1_->ice_connected());
  1603. ASSERT_TRUE(p2_->ice_connected());
  1604. ASSERT_TRUE_WAIT(p1_->ice_connected() == 0 &&
  1605. p2_->ice_connected() == 0,
  1606. timeout);
  1607. }
  1608. void WaitForFailed(unsigned int timeout = kDefaultTimeout) {
  1609. ASSERT_TRUE_WAIT(p1_->ice_failed() &&
  1610. p2_->ice_failed(),
  1611. timeout);
  1612. }
  1613. void ConnectTrickle(TrickleMode trickle = TRICKLE_SIMULATE) {
  1614. p2_->Connect(p1_.get(), trickle);
  1615. p1_->Connect(p2_.get(), trickle);
  1616. }
  1617. void SimulateTrickle(size_t stream) {
  1618. p1_->SimulateTrickle(stream);
  1619. p2_->SimulateTrickle(stream);
  1620. ASSERT_TRUE_WAIT(p1_->is_ready(stream), kDefaultTimeout);
  1621. ASSERT_TRUE_WAIT(p2_->is_ready(stream), kDefaultTimeout);
  1622. }
  1623. void SimulateTrickleP1(size_t stream) {
  1624. p1_->SimulateTrickle(stream);
  1625. }
  1626. void SimulateTrickleP2(size_t stream) {
  1627. p2_->SimulateTrickle(stream);
  1628. }
  1629. void CloseP1() {
  1630. p1_->Close();
  1631. }
  1632. void ConnectThenDelete() {
  1633. p2_->Connect(p1_.get(), TRICKLE_NONE, false);
  1634. p1_->Connect(p2_.get(), TRICKLE_NONE, true);
  1635. test_utils_->sts_target()->Dispatch(WrapRunnable(this,
  1636. &WebRtcIceConnectTest::CloseP1),
  1637. NS_DISPATCH_SYNC);
  1638. p2_->StartChecks();
  1639. // Wait to see if we crash
  1640. PR_Sleep(PR_MillisecondsToInterval(kDefaultTimeout));
  1641. }
  1642. // default is p1_ sending to p2_
  1643. void SendReceive() {
  1644. SendReceive(p1_.get(), p2_.get());
  1645. }
  1646. void SendReceive(IceTestPeer *p1, IceTestPeer *p2,
  1647. bool expect_tx_failure = false,
  1648. bool expect_rx_failure = false) {
  1649. size_t previousSent = p1->sent();
  1650. size_t previousReceived = p2->received();
  1651. test_utils_->sts_target()->Dispatch(
  1652. WrapRunnable(p1,
  1653. &IceTestPeer::SendPacket, 0, 1,
  1654. reinterpret_cast<const unsigned char *>("TEST"), 4),
  1655. NS_DISPATCH_SYNC);
  1656. if (expect_tx_failure) {
  1657. ASSERT_EQ(previousSent, p1->sent());
  1658. } else {
  1659. ASSERT_EQ(previousSent+1, p1->sent());
  1660. }
  1661. if (expect_rx_failure) {
  1662. usleep(1000);
  1663. ASSERT_EQ(previousReceived, p2->received());
  1664. } else {
  1665. ASSERT_TRUE_WAIT(p2->received() == previousReceived+1, 1000);
  1666. }
  1667. }
  1668. void SendFailure() {
  1669. test_utils_->sts_target()->Dispatch(
  1670. WrapRunnable(p1_.get(),
  1671. &IceTestPeer::SendFailure, 0, 1),
  1672. NS_DISPATCH_SYNC);
  1673. }
  1674. protected:
  1675. bool initted_;
  1676. bool test_stun_server_inited_;
  1677. nsCOMPtr<nsIEventTarget> target_;
  1678. mozilla::UniquePtr<IceTestPeer> p1_;
  1679. mozilla::UniquePtr<IceTestPeer> p2_;
  1680. bool use_nat_;
  1681. TestNat::NatBehavior filtering_type_;
  1682. TestNat::NatBehavior mapping_type_;
  1683. bool block_udp_;
  1684. };
  1685. class WebRtcIcePrioritizerTest : public StunTest {
  1686. public:
  1687. WebRtcIcePrioritizerTest():
  1688. prioritizer_(nullptr) {}
  1689. ~WebRtcIcePrioritizerTest() {
  1690. if (prioritizer_) {
  1691. nr_interface_prioritizer_destroy(&prioritizer_);
  1692. }
  1693. }
  1694. void SetPriorizer(nr_interface_prioritizer *prioritizer) {
  1695. prioritizer_ = prioritizer;
  1696. }
  1697. void AddInterface(const std::string& num, int type, int estimated_speed) {
  1698. std::string str_addr = "10.0.0." + num;
  1699. std::string ifname = "eth" + num;
  1700. nr_local_addr local_addr;
  1701. local_addr.interface.type = type;
  1702. local_addr.interface.estimated_speed = estimated_speed;
  1703. int r = nr_str_port_to_transport_addr(str_addr.c_str(), 0,
  1704. IPPROTO_UDP, &(local_addr.addr));
  1705. ASSERT_EQ(0, r);
  1706. strncpy(local_addr.addr.ifname, ifname.c_str(), MAXIFNAME);
  1707. r = nr_interface_prioritizer_add_interface(prioritizer_, &local_addr);
  1708. ASSERT_EQ(0, r);
  1709. r = nr_interface_prioritizer_sort_preference(prioritizer_);
  1710. ASSERT_EQ(0, r);
  1711. }
  1712. void HasLowerPreference(const std::string& num1, const std::string& num2) {
  1713. std::string key1 = "eth" + num1 + ":10.0.0." + num1;
  1714. std::string key2 = "eth" + num2 + ":10.0.0." + num2;
  1715. UCHAR pref1, pref2;
  1716. int r = nr_interface_prioritizer_get_priority(prioritizer_, key1.c_str(), &pref1);
  1717. ASSERT_EQ(0, r);
  1718. r = nr_interface_prioritizer_get_priority(prioritizer_, key2.c_str(), &pref2);
  1719. ASSERT_EQ(0, r);
  1720. ASSERT_LE(pref1, pref2);
  1721. }
  1722. private:
  1723. nr_interface_prioritizer *prioritizer_;
  1724. };
  1725. class WebRtcIcePacketFilterTest : public StunTest {
  1726. public:
  1727. WebRtcIcePacketFilterTest(): udp_filter_(nullptr),
  1728. tcp_filter_(nullptr) {}
  1729. void SetUp() {
  1730. StunTest::SetUp();
  1731. // Set up enough of the ICE ctx to allow the packet filter to work
  1732. ice_ctx_ = NrIceCtxHandler::Create("test", true);
  1733. nsCOMPtr<nsISocketFilterHandler> udp_handler =
  1734. do_GetService(NS_STUN_UDP_SOCKET_FILTER_HANDLER_CONTRACTID);
  1735. ASSERT_TRUE(udp_handler);
  1736. udp_handler->NewFilter(getter_AddRefs(udp_filter_));
  1737. nsCOMPtr<nsISocketFilterHandler> tcp_handler =
  1738. do_GetService(NS_STUN_TCP_SOCKET_FILTER_HANDLER_CONTRACTID);
  1739. ASSERT_TRUE(tcp_handler);
  1740. tcp_handler->NewFilter(getter_AddRefs(tcp_filter_));
  1741. }
  1742. void TearDown() {
  1743. test_utils_->sts_target()->Dispatch(WrapRunnable(this,
  1744. &WebRtcIcePacketFilterTest::TearDown_s),
  1745. NS_DISPATCH_SYNC);
  1746. StunTest::TearDown();
  1747. }
  1748. void TearDown_s() {
  1749. ice_ctx_ = nullptr;
  1750. }
  1751. void TestIncoming(const uint8_t* data, uint32_t len,
  1752. uint8_t from_addr, int from_port,
  1753. bool expected_result) {
  1754. mozilla::net::NetAddr addr;
  1755. MakeNetAddr(&addr, from_addr, from_port);
  1756. bool result;
  1757. nsresult rv = udp_filter_->FilterPacket(&addr, data, len,
  1758. nsISocketFilter::SF_INCOMING,
  1759. &result);
  1760. ASSERT_EQ(NS_OK, rv);
  1761. ASSERT_EQ(expected_result, result);
  1762. }
  1763. void TestIncomingTcp(const uint8_t* data, uint32_t len,
  1764. bool expected_result) {
  1765. mozilla::net::NetAddr addr;
  1766. bool result;
  1767. nsresult rv = tcp_filter_->FilterPacket(&addr, data, len,
  1768. nsISocketFilter::SF_INCOMING,
  1769. &result);
  1770. ASSERT_EQ(NS_OK, rv);
  1771. ASSERT_EQ(expected_result, result);
  1772. }
  1773. void TestIncomingTcpFramed(const uint8_t* data, uint32_t len,
  1774. bool expected_result) {
  1775. mozilla::net::NetAddr addr;
  1776. bool result;
  1777. uint8_t* framed_data = new uint8_t[len+2];
  1778. framed_data[0] = htons(len);
  1779. memcpy(&framed_data[2], data, len);
  1780. nsresult rv = tcp_filter_->FilterPacket(&addr, framed_data, len+2,
  1781. nsISocketFilter::SF_INCOMING,
  1782. &result);
  1783. ASSERT_EQ(NS_OK, rv);
  1784. ASSERT_EQ(expected_result, result);
  1785. delete[] framed_data;
  1786. }
  1787. void TestOutgoing(const uint8_t* data, uint32_t len,
  1788. uint8_t to_addr, int to_port,
  1789. bool expected_result) {
  1790. mozilla::net::NetAddr addr;
  1791. MakeNetAddr(&addr, to_addr, to_port);
  1792. bool result;
  1793. nsresult rv = udp_filter_->FilterPacket(&addr, data, len,
  1794. nsISocketFilter::SF_OUTGOING,
  1795. &result);
  1796. ASSERT_EQ(NS_OK, rv);
  1797. ASSERT_EQ(expected_result, result);
  1798. }
  1799. void TestOutgoingTcp(const uint8_t* data, uint32_t len,
  1800. bool expected_result) {
  1801. mozilla::net::NetAddr addr;
  1802. bool result;
  1803. nsresult rv = tcp_filter_->FilterPacket(&addr, data, len,
  1804. nsISocketFilter::SF_OUTGOING,
  1805. &result);
  1806. ASSERT_EQ(NS_OK, rv);
  1807. ASSERT_EQ(expected_result, result);
  1808. }
  1809. void TestOutgoingTcpFramed(const uint8_t* data, uint32_t len,
  1810. bool expected_result) {
  1811. mozilla::net::NetAddr addr;
  1812. bool result;
  1813. uint8_t* framed_data = new uint8_t[len+2];
  1814. framed_data[0] = htons(len);
  1815. memcpy(&framed_data[2], data, len);
  1816. nsresult rv = tcp_filter_->FilterPacket(&addr, framed_data, len+2,
  1817. nsISocketFilter::SF_OUTGOING,
  1818. &result);
  1819. ASSERT_EQ(NS_OK, rv);
  1820. ASSERT_EQ(expected_result, result);
  1821. delete[] framed_data;
  1822. }
  1823. private:
  1824. void MakeNetAddr(mozilla::net::NetAddr* net_addr,
  1825. uint8_t last_digit, uint16_t port) {
  1826. net_addr->inet.family = AF_INET;
  1827. net_addr->inet.ip = 192 << 24 | 168 << 16 | 1 << 8 | last_digit;
  1828. net_addr->inet.port = port;
  1829. }
  1830. nsCOMPtr<nsISocketFilter> udp_filter_;
  1831. nsCOMPtr<nsISocketFilter> tcp_filter_;
  1832. RefPtr<NrIceCtxHandler> ice_ctx_;
  1833. };
  1834. } // end namespace
  1835. TEST_F(WebRtcIceGatherTest, TestGatherFakeStunServerHostnameNoResolver) {
  1836. if (stun_server_hostname_.empty()) {
  1837. return;
  1838. }
  1839. EnsurePeer();
  1840. peer_->SetStunServer(stun_server_hostname_, kDefaultStunServerPort);
  1841. Gather();
  1842. }
  1843. TEST_F(WebRtcIceGatherTest, TestGatherFakeStunServerTcpHostnameNoResolver) {
  1844. if (stun_server_hostname_.empty()) {
  1845. return;
  1846. }
  1847. EnsurePeer(ICE_TEST_PEER_OFFERER | ICE_TEST_PEER_ENABLED_TCP);
  1848. peer_->SetStunServer(stun_server_hostname_, kDefaultStunServerPort,
  1849. kNrIceTransportTcp);
  1850. Gather();
  1851. ASSERT_TRUE(StreamHasMatchingCandidate(0, " TCP "));
  1852. }
  1853. TEST_F(WebRtcIceGatherTest, TestGatherFakeStunServerIpAddress) {
  1854. if (stun_server_address_.empty()) {
  1855. return;
  1856. }
  1857. EnsurePeer();
  1858. peer_->SetStunServer(stun_server_address_, kDefaultStunServerPort);
  1859. peer_->SetFakeResolver(stun_server_address_, stun_server_hostname_);
  1860. Gather();
  1861. }
  1862. TEST_F(WebRtcIceGatherTest, TestGatherStunServerIpAddressNoHost) {
  1863. if (stun_server_address_.empty()) {
  1864. return;
  1865. }
  1866. peer_ = MakeUnique<IceTestPeer>("P1", test_utils_, true, false, false, false, NrIceCtx::ICE_POLICY_NO_HOST);
  1867. peer_->AddStream(1);
  1868. peer_->SetStunServer(stun_server_address_, kDefaultStunServerPort);
  1869. peer_->SetFakeResolver(stun_server_address_, stun_server_hostname_);
  1870. Gather();
  1871. ASSERT_FALSE(StreamHasMatchingCandidate(0, " host "));
  1872. }
  1873. TEST_F(WebRtcIceGatherTest, TestGatherFakeStunServerHostname) {
  1874. if (stun_server_hostname_.empty()) {
  1875. return;
  1876. }
  1877. EnsurePeer();
  1878. peer_->SetStunServer(stun_server_hostname_, kDefaultStunServerPort);
  1879. peer_->SetFakeResolver(stun_server_address_, stun_server_hostname_);
  1880. Gather();
  1881. }
  1882. TEST_F(WebRtcIceGatherTest, TestGatherFakeStunBogusHostname) {
  1883. EnsurePeer();
  1884. peer_->SetStunServer(kBogusStunServerHostname, kDefaultStunServerPort);
  1885. peer_->SetFakeResolver(stun_server_address_, stun_server_hostname_);
  1886. Gather();
  1887. }
  1888. TEST_F(WebRtcIceGatherTest, TestGatherDNSStunServerIpAddress) {
  1889. if (stun_server_address_.empty()) {
  1890. return;
  1891. }
  1892. EnsurePeer();
  1893. peer_->SetStunServer(stun_server_address_, kDefaultStunServerPort);
  1894. peer_->SetDNSResolver();
  1895. Gather();
  1896. ASSERT_TRUE(StreamHasMatchingCandidate(0, " UDP "));
  1897. ASSERT_TRUE(StreamHasMatchingCandidate(0, "typ srflx raddr"));
  1898. }
  1899. TEST_F(WebRtcIceGatherTest, TestGatherDNSStunServerIpAddressTcp) {
  1900. if (stun_server_address_.empty()) {
  1901. return;
  1902. }
  1903. EnsurePeer(ICE_TEST_PEER_OFFERER | ICE_TEST_PEER_ENABLED_TCP);
  1904. peer_->SetStunServer(stun_server_address_, kDefaultStunServerPort,
  1905. kNrIceTransportTcp);
  1906. peer_->SetDNSResolver();
  1907. Gather();
  1908. ASSERT_TRUE(StreamHasMatchingCandidate(0, "tcptype passive"));
  1909. ASSERT_FALSE(StreamHasMatchingCandidate(0, "tcptype passive", " 9 "));
  1910. ASSERT_TRUE(StreamHasMatchingCandidate(0, "tcptype so"));
  1911. ASSERT_FALSE(StreamHasMatchingCandidate(0, "tcptype so", " 9 "));
  1912. ASSERT_TRUE(StreamHasMatchingCandidate(0, "tcptype active", " 9 "));
  1913. }
  1914. TEST_F(WebRtcIceGatherTest, TestGatherDNSStunServerHostname) {
  1915. if (stun_server_hostname_.empty()) {
  1916. return;
  1917. }
  1918. EnsurePeer();
  1919. peer_->SetStunServer(stun_server_hostname_, kDefaultStunServerPort);
  1920. peer_->SetDNSResolver();
  1921. Gather();
  1922. ASSERT_TRUE(StreamHasMatchingCandidate(0, " UDP "));
  1923. ASSERT_TRUE(StreamHasMatchingCandidate(0, "typ srflx raddr"));
  1924. }
  1925. TEST_F(WebRtcIceGatherTest, TestGatherDNSStunServerHostnameTcp) {
  1926. EnsurePeer(ICE_TEST_PEER_OFFERER | ICE_TEST_PEER_ENABLED_TCP);
  1927. peer_->SetStunServer(stun_server_hostname_, kDefaultStunServerPort,
  1928. kNrIceTransportTcp);
  1929. peer_->SetDNSResolver();
  1930. Gather();
  1931. ASSERT_TRUE(StreamHasMatchingCandidate(0, "tcptype passive"));
  1932. ASSERT_FALSE(StreamHasMatchingCandidate(0, "tcptype passive", " 9 "));
  1933. ASSERT_TRUE(StreamHasMatchingCandidate(0, "tcptype so"));
  1934. ASSERT_FALSE(StreamHasMatchingCandidate(0, "tcptype so", " 9 "));
  1935. ASSERT_TRUE(StreamHasMatchingCandidate(0, "tcptype active", " 9 "));
  1936. }
  1937. TEST_F(WebRtcIceGatherTest, TestGatherDNSStunServerHostnameBothUdpTcp) {
  1938. if (stun_server_hostname_.empty()) {
  1939. return;
  1940. }
  1941. std::vector<NrIceStunServer> stun_servers;
  1942. EnsurePeer(ICE_TEST_PEER_OFFERER | ICE_TEST_PEER_ENABLED_TCP);
  1943. stun_servers.push_back(*NrIceStunServer::Create(stun_server_hostname_,
  1944. kDefaultStunServerPort, kNrIceTransportUdp));
  1945. stun_servers.push_back(*NrIceStunServer::Create(stun_server_hostname_,
  1946. kDefaultStunServerPort, kNrIceTransportTcp));
  1947. peer_->SetStunServers(stun_servers);
  1948. peer_->SetDNSResolver();
  1949. Gather();
  1950. ASSERT_TRUE(StreamHasMatchingCandidate(0, " UDP "));
  1951. ASSERT_TRUE(StreamHasMatchingCandidate(0, " TCP "));
  1952. }
  1953. TEST_F(WebRtcIceGatherTest, TestGatherDNSStunServerIpAddressBothUdpTcp) {
  1954. if (stun_server_address_.empty()) {
  1955. return;
  1956. }
  1957. std::vector<NrIceStunServer> stun_servers;
  1958. EnsurePeer(ICE_TEST_PEER_OFFERER | ICE_TEST_PEER_ENABLED_TCP);
  1959. stun_servers.push_back(*NrIceStunServer::Create(stun_server_address_,
  1960. kDefaultStunServerPort, kNrIceTransportUdp));
  1961. stun_servers.push_back(*NrIceStunServer::Create(stun_server_address_,
  1962. kDefaultStunServerPort, kNrIceTransportTcp));
  1963. peer_->SetStunServers(stun_servers);
  1964. peer_->SetDNSResolver();
  1965. Gather();
  1966. ASSERT_TRUE(StreamHasMatchingCandidate(0, " UDP "));
  1967. ASSERT_TRUE(StreamHasMatchingCandidate(0, " TCP "));
  1968. }
  1969. TEST_F(WebRtcIceGatherTest, TestGatherDNSStunBogusHostname) {
  1970. EnsurePeer();
  1971. peer_->SetStunServer(kBogusStunServerHostname, kDefaultStunServerPort);
  1972. peer_->SetDNSResolver();
  1973. Gather();
  1974. ASSERT_TRUE(StreamHasMatchingCandidate(0, " UDP "));
  1975. }
  1976. TEST_F(WebRtcIceGatherTest, TestGatherDNSStunBogusHostnameTcp) {
  1977. EnsurePeer(ICE_TEST_PEER_OFFERER | ICE_TEST_PEER_ENABLED_TCP);
  1978. peer_->SetStunServer(kBogusStunServerHostname, kDefaultStunServerPort,
  1979. kNrIceTransportTcp);
  1980. peer_->SetDNSResolver();
  1981. Gather();
  1982. ASSERT_TRUE(StreamHasMatchingCandidate(0, " TCP "));
  1983. }
  1984. TEST_F(WebRtcIceGatherTest, TestDefaultCandidate) {
  1985. EnsurePeer();
  1986. peer_->SetStunServer(stun_server_hostname_, kDefaultStunServerPort);
  1987. Gather();
  1988. NrIceCandidate default_candidate;
  1989. ASSERT_TRUE(NS_SUCCEEDED(peer_->GetDefaultCandidate(0, &default_candidate)));
  1990. }
  1991. TEST_F(WebRtcIceGatherTest, TestGatherTurn) {
  1992. EnsurePeer();
  1993. if (turn_server_.empty())
  1994. return;
  1995. peer_->SetTurnServer(turn_server_, kDefaultStunServerPort,
  1996. turn_user_, turn_password_, kNrIceTransportUdp);
  1997. Gather();
  1998. }
  1999. TEST_F(WebRtcIceGatherTest, TestGatherTurnTcp) {
  2000. EnsurePeer();
  2001. if (turn_server_.empty())
  2002. return;
  2003. peer_->SetTurnServer(turn_server_, kDefaultStunServerPort,
  2004. turn_user_, turn_password_, kNrIceTransportTcp);
  2005. Gather();
  2006. }
  2007. TEST_F(WebRtcIceGatherTest, TestGatherDisableComponent) {
  2008. if (stun_server_hostname_.empty()) {
  2009. return;
  2010. }
  2011. EnsurePeer();
  2012. peer_->SetStunServer(stun_server_hostname_, kDefaultStunServerPort);
  2013. peer_->AddStream(2);
  2014. peer_->DisableComponent(1, 2);
  2015. Gather();
  2016. std::vector<std::string> candidates =
  2017. peer_->GetCandidates(1);
  2018. for (size_t i=0; i<candidates.size(); ++i) {
  2019. size_t sp1 = candidates[i].find(' ');
  2020. ASSERT_EQ(0, candidates[i].compare(sp1+1, 1, "1", 1));
  2021. }
  2022. }
  2023. TEST_F(WebRtcIceGatherTest, TestGatherVerifyNoLoopback) {
  2024. Gather();
  2025. ASSERT_FALSE(StreamHasMatchingCandidate(0, "127.0.0.1"));
  2026. }
  2027. TEST_F(WebRtcIceGatherTest, TestGatherAllowLoopback) {
  2028. // Set up peer with loopback allowed.
  2029. peer_ = MakeUnique<IceTestPeer>("P1", test_utils_, true, true);
  2030. peer_->AddStream(1);
  2031. Gather();
  2032. ASSERT_TRUE(StreamHasMatchingCandidate(0, "127.0.0.1"));
  2033. }
  2034. TEST_F(WebRtcIceGatherTest, TestGatherTcpDisabled) {
  2035. // Set up peer with tcp disabled.
  2036. peer_ = MakeUnique<IceTestPeer>("P1", test_utils_, true, false, false);
  2037. peer_->AddStream(1);
  2038. Gather();
  2039. ASSERT_FALSE(StreamHasMatchingCandidate(0, " TCP "));
  2040. ASSERT_TRUE(StreamHasMatchingCandidate(0, " UDP "));
  2041. }
  2042. // Verify that a bogus candidate doesn't cause crashes on the
  2043. // main thread. See bug 856433.
  2044. TEST_F(WebRtcIceGatherTest, TestBogusCandidate) {
  2045. Gather();
  2046. peer_->ParseCandidate(0, kBogusIceCandidate);
  2047. }
  2048. TEST_F(WebRtcIceGatherTest, VerifyTestStunServer) {
  2049. UseFakeStunUdpServerWithResponse("192.0.2.133", 3333);
  2050. Gather();
  2051. ASSERT_TRUE(StreamHasMatchingCandidate(0, " 192.0.2.133 3333 "));
  2052. }
  2053. TEST_F(WebRtcIceGatherTest, VerifyTestStunTcpServer) {
  2054. UseFakeStunTcpServerWithResponse("192.0.2.233", 3333);
  2055. Gather();
  2056. ASSERT_TRUE(StreamHasMatchingCandidate(0, " 192.0.2.233 3333 typ srflx",
  2057. " tcptype "));
  2058. }
  2059. TEST_F(WebRtcIceGatherTest, VerifyTestStunServerV6) {
  2060. if (!TestStunServer::GetInstance(AF_INET6)) {
  2061. // No V6 addresses
  2062. return;
  2063. }
  2064. UseFakeStunUdpServerWithResponse("beef::", 3333);
  2065. Gather();
  2066. ASSERT_TRUE(StreamHasMatchingCandidate(0, " beef:: 3333 "));
  2067. }
  2068. TEST_F(WebRtcIceGatherTest, VerifyTestStunServerFQDN) {
  2069. UseFakeStunUdpServerWithResponse("192.0.2.133", 3333, "stun.example.com");
  2070. Gather();
  2071. ASSERT_TRUE(StreamHasMatchingCandidate(0, " 192.0.2.133 3333 "));
  2072. }
  2073. TEST_F(WebRtcIceGatherTest, VerifyTestStunServerV6FQDN) {
  2074. if (!TestStunServer::GetInstance(AF_INET6)) {
  2075. // No V6 addresses
  2076. return;
  2077. }
  2078. UseFakeStunUdpServerWithResponse("beef::", 3333, "stun.example.com");
  2079. Gather();
  2080. ASSERT_TRUE(StreamHasMatchingCandidate(0, " beef:: 3333 "));
  2081. }
  2082. TEST_F(WebRtcIceGatherTest, TestStunServerReturnsWildcardAddr) {
  2083. UseFakeStunUdpServerWithResponse("0.0.0.0", 3333);
  2084. Gather(kDefaultTimeout * 3);
  2085. ASSERT_FALSE(StreamHasMatchingCandidate(0, " 0.0.0.0 "));
  2086. }
  2087. TEST_F(WebRtcIceGatherTest, TestStunServerReturnsWildcardAddrV6) {
  2088. if (!TestStunServer::GetInstance(AF_INET6)) {
  2089. // No V6 addresses
  2090. return;
  2091. }
  2092. UseFakeStunUdpServerWithResponse("::", 3333);
  2093. Gather(kDefaultTimeout * 3);
  2094. ASSERT_FALSE(StreamHasMatchingCandidate(0, " :: "));
  2095. }
  2096. TEST_F(WebRtcIceGatherTest, TestStunServerReturnsPort0) {
  2097. UseFakeStunUdpServerWithResponse("192.0.2.133", 0);
  2098. Gather(kDefaultTimeout * 3);
  2099. ASSERT_FALSE(StreamHasMatchingCandidate(0, " 192.0.2.133 0 "));
  2100. }
  2101. TEST_F(WebRtcIceGatherTest, TestStunServerReturnsLoopbackAddr) {
  2102. UseFakeStunUdpServerWithResponse("127.0.0.133", 3333);
  2103. Gather(kDefaultTimeout * 3);
  2104. ASSERT_FALSE(StreamHasMatchingCandidate(0, " 127.0.0.133 "));
  2105. }
  2106. TEST_F(WebRtcIceGatherTest, TestStunServerReturnsLoopbackAddrV6) {
  2107. if (!TestStunServer::GetInstance(AF_INET6)) {
  2108. // No V6 addresses
  2109. return;
  2110. }
  2111. UseFakeStunUdpServerWithResponse("::1", 3333);
  2112. Gather(kDefaultTimeout * 3);
  2113. ASSERT_FALSE(StreamHasMatchingCandidate(0, " ::1 "));
  2114. }
  2115. TEST_F(WebRtcIceGatherTest, TestStunServerTrickle) {
  2116. UseFakeStunUdpServerWithResponse("192.0.2.1", 3333);
  2117. TestStunServer::GetInstance(AF_INET)->SetDropInitialPackets(3);
  2118. Gather(0);
  2119. ASSERT_FALSE(StreamHasMatchingCandidate(0, "192.0.2.1"));
  2120. WaitForGather();
  2121. ASSERT_TRUE(StreamHasMatchingCandidate(0, "192.0.2.1"));
  2122. }
  2123. // Test no host with our fake STUN server and apparently NATted.
  2124. TEST_F(WebRtcIceGatherTest, TestFakeStunServerNatedNoHost) {
  2125. peer_ = MakeUnique<IceTestPeer>("P1", test_utils_, true, false, false, false, NrIceCtx::ICE_POLICY_NO_HOST);
  2126. peer_->AddStream(1);
  2127. UseFakeStunUdpServerWithResponse("192.0.2.1", 3333);
  2128. Gather(0);
  2129. WaitForGather();
  2130. DumpCandidates(0);
  2131. ASSERT_FALSE(StreamHasMatchingCandidate(0, "host"));
  2132. ASSERT_TRUE(StreamHasMatchingCandidate(0, "srflx"));
  2133. NrIceCandidate default_candidate;
  2134. nsresult rv = peer_->GetDefaultCandidate(0, &default_candidate);
  2135. if (NS_SUCCEEDED(rv)) {
  2136. ASSERT_NE(NrIceCandidate::ICE_HOST, default_candidate.type);
  2137. }
  2138. }
  2139. // Test no host with our fake STUN server and apparently non-NATted.
  2140. TEST_F(WebRtcIceGatherTest, TestFakeStunServerNoNatNoHost) {
  2141. peer_ = MakeUnique<IceTestPeer>("P1", test_utils_, true, false, false, false, NrIceCtx::ICE_POLICY_NO_HOST);
  2142. peer_->AddStream(1);
  2143. UseTestStunServer();
  2144. Gather(0);
  2145. WaitForGather();
  2146. DumpCandidates(0);
  2147. ASSERT_FALSE(StreamHasMatchingCandidate(0, "host"));
  2148. ASSERT_TRUE(StreamHasMatchingCandidate(0, "srflx"));
  2149. }
  2150. TEST_F(WebRtcIceGatherTest, TestStunTcpServerTrickle) {
  2151. UseFakeStunTcpServerWithResponse("192.0.3.1", 3333);
  2152. TestStunTcpServer::GetInstance(AF_INET)->SetDelay(500);
  2153. Gather(0);
  2154. ASSERT_FALSE(StreamHasMatchingCandidate(0, " 192.0.3.1 ", " tcptype "));
  2155. WaitForGather();
  2156. ASSERT_TRUE(StreamHasMatchingCandidate(0, " 192.0.3.1 ", " tcptype "));
  2157. }
  2158. TEST_F(WebRtcIceGatherTest, TestStunTcpAndUdpServerTrickle) {
  2159. UseFakeStunUdpTcpServersWithResponse("192.0.2.1", 3333, "192.0.3.1", 3333);
  2160. TestStunServer::GetInstance(AF_INET)->SetDropInitialPackets(3);
  2161. TestStunTcpServer::GetInstance(AF_INET)->SetDelay(500);
  2162. Gather(0);
  2163. ASSERT_FALSE(StreamHasMatchingCandidate(0, "192.0.2.1", "UDP"));
  2164. ASSERT_FALSE(StreamHasMatchingCandidate(0, " 192.0.3.1 ", " tcptype "));
  2165. WaitForGather();
  2166. ASSERT_TRUE(StreamHasMatchingCandidate(0, "192.0.2.1", "UDP"));
  2167. ASSERT_TRUE(StreamHasMatchingCandidate(0, " 192.0.3.1 ", " tcptype "));
  2168. }
  2169. TEST_F(WebRtcIceGatherTest, TestSetIceControlling) {
  2170. EnsurePeer();
  2171. peer_->SetControlling(NrIceCtx::ICE_CONTROLLING);
  2172. NrIceCtx::Controlling controlling = peer_->GetControlling();
  2173. ASSERT_EQ(NrIceCtx::ICE_CONTROLLING, controlling);
  2174. // SetControlling should only allow setting this once
  2175. peer_->SetControlling(NrIceCtx::ICE_CONTROLLED);
  2176. controlling = peer_->GetControlling();
  2177. ASSERT_EQ(NrIceCtx::ICE_CONTROLLING, controlling);
  2178. }
  2179. TEST_F(WebRtcIceGatherTest, TestSetIceControlled) {
  2180. EnsurePeer();
  2181. peer_->SetControlling(NrIceCtx::ICE_CONTROLLED);
  2182. NrIceCtx::Controlling controlling = peer_->GetControlling();
  2183. ASSERT_EQ(NrIceCtx::ICE_CONTROLLED, controlling);
  2184. // SetControlling should only allow setting this once
  2185. peer_->SetControlling(NrIceCtx::ICE_CONTROLLING);
  2186. controlling = peer_->GetControlling();
  2187. ASSERT_EQ(NrIceCtx::ICE_CONTROLLED, controlling);
  2188. }
  2189. TEST_F(WebRtcIceConnectTest, TestGather) {
  2190. AddStream(1);
  2191. ASSERT_TRUE(Gather());
  2192. }
  2193. TEST_F(WebRtcIceConnectTest, TestGatherTcp) {
  2194. Init(false, true);
  2195. AddStream(1);
  2196. ASSERT_TRUE(Gather());
  2197. }
  2198. TEST_F(WebRtcIceConnectTest, TestGatherAutoPrioritize) {
  2199. Init(false, false);
  2200. AddStream(1);
  2201. ASSERT_TRUE(Gather());
  2202. }
  2203. TEST_F(WebRtcIceConnectTest, TestConnect) {
  2204. AddStream(1);
  2205. ASSERT_TRUE(Gather());
  2206. Connect();
  2207. }
  2208. TEST_F(WebRtcIceConnectTest, TestConnectRestartIce) {
  2209. AddStream(1);
  2210. ASSERT_TRUE(Gather());
  2211. Connect();
  2212. SendReceive(p1_.get(), p2_.get());
  2213. p2_->RestartIce();
  2214. ASSERT_FALSE(p2_->gathering_complete());
  2215. // verify p1 and p2 streams are still connected after restarting ice on p2
  2216. SendReceive(p1_.get(), p2_.get());
  2217. mozilla::UniquePtr<IceTestPeer> p3_;
  2218. p3_ = MakeUnique<IceTestPeer>("P3", test_utils_, true, false, false, false);
  2219. InitPeer(p3_.get());
  2220. p3_->AddStream(1);
  2221. p2_->AddStream(1);
  2222. ASSERT_TRUE(GatherCallerAndCallee(p2_.get(), p3_.get()));
  2223. std::cout << "-------------------------------------------------" << std::endl;
  2224. ConnectCallerAndCallee(p3_.get(), p2_.get());
  2225. SendReceive(p1_.get(), p2_.get()); // p1 and p2 still connected
  2226. SendReceive(p3_.get(), p2_.get()); // p3 and p2 are now connected
  2227. p2_->FinalizeIceRestart();
  2228. SendReceive(p3_.get(), p2_.get()); // p3 and p2 are still connected
  2229. SendReceive(p1_.get(), p2_.get(), false, true); // p1 and p2 not connected
  2230. p3_ = nullptr;
  2231. }
  2232. TEST_F(WebRtcIceConnectTest, TestConnectRestartIceThenAbort) {
  2233. AddStream(1);
  2234. ASSERT_TRUE(Gather());
  2235. Connect();
  2236. SendReceive(p1_.get(), p2_.get());
  2237. p2_->RestartIce();
  2238. ASSERT_FALSE(p2_->gathering_complete());
  2239. // verify p1 and p2 streams are still connected after restarting ice on p2
  2240. SendReceive(p1_.get(), p2_.get());
  2241. mozilla::UniquePtr<IceTestPeer> p3_;
  2242. p3_ = MakeUnique<IceTestPeer>("P3", test_utils_, true, false, false, false);
  2243. InitPeer(p3_.get());
  2244. p3_->AddStream(1);
  2245. p2_->AddStream(1);
  2246. ASSERT_TRUE(GatherCallerAndCallee(p2_.get(), p3_.get()));
  2247. std::cout << "-------------------------------------------------" << std::endl;
  2248. ConnectCallerAndCallee(p3_.get(), p2_.get());
  2249. SendReceive(p1_.get(), p2_.get()); // p1 and p2 still connected
  2250. SendReceive(p3_.get(), p2_.get()); // p3 and p2 are now connected
  2251. p2_->RollbackIceRestart();
  2252. SendReceive(p1_.get(), p2_.get()); // p1 and p2 are still connected
  2253. SendReceive(p3_.get(), p2_.get(), false, true); // p3 and p2 not connected
  2254. p3_ = nullptr;
  2255. }
  2256. TEST_F(WebRtcIceConnectTest, TestConnectSetControllingAfterIceRestart) {
  2257. AddStream(1);
  2258. ASSERT_TRUE(Gather());
  2259. // Just for fun lets do this with switched rolls
  2260. p1_->SetControlling(NrIceCtx::ICE_CONTROLLED);
  2261. p2_->SetControlling(NrIceCtx::ICE_CONTROLLING);
  2262. Connect();
  2263. SendReceive(p1_.get(), p2_.get());
  2264. // Set rolls should not switch by connecting
  2265. ASSERT_EQ(NrIceCtx::ICE_CONTROLLED, p1_->GetControlling());
  2266. ASSERT_EQ(NrIceCtx::ICE_CONTROLLING, p2_->GetControlling());
  2267. p2_->RestartIce();
  2268. ASSERT_FALSE(p2_->gathering_complete());
  2269. // ICE restart should allow us to set control role again
  2270. p2_->SetControlling(NrIceCtx::ICE_CONTROLLED);
  2271. ASSERT_EQ(NrIceCtx::ICE_CONTROLLED, p2_->GetControlling());
  2272. // But still only allowed to set control role once
  2273. p2_->SetControlling(NrIceCtx::ICE_CONTROLLING);
  2274. ASSERT_EQ(NrIceCtx::ICE_CONTROLLED, p2_->GetControlling());
  2275. mozilla::UniquePtr<IceTestPeer> p3_;
  2276. p3_ = MakeUnique<IceTestPeer>("P3", test_utils_, true, false, false, false);
  2277. InitPeer(p3_.get());
  2278. p3_->AddStream(1);
  2279. // Set control role for p3 accordingly (w/o role conflict)
  2280. p3_->SetControlling(NrIceCtx::ICE_CONTROLLING);
  2281. ASSERT_EQ(NrIceCtx::ICE_CONTROLLING, p3_->GetControlling());
  2282. p2_->AddStream(1);
  2283. ASSERT_TRUE(GatherCallerAndCallee(p2_.get(), p3_.get()));
  2284. std::cout << "-------------------------------------------------" << std::endl;
  2285. ConnectCallerAndCallee(p3_.get(), p2_.get());
  2286. // Again connecting should not result in role switch
  2287. ASSERT_EQ(NrIceCtx::ICE_CONTROLLED, p2_->GetControlling());
  2288. ASSERT_EQ(NrIceCtx::ICE_CONTROLLING, p3_->GetControlling());
  2289. p2_->FinalizeIceRestart();
  2290. // And again we are not allowed to switch roles at this point any more
  2291. p2_->SetControlling(NrIceCtx::ICE_CONTROLLING);
  2292. ASSERT_EQ(NrIceCtx::ICE_CONTROLLED, p2_->GetControlling());
  2293. p3_->SetControlling(NrIceCtx::ICE_CONTROLLED);
  2294. ASSERT_EQ(NrIceCtx::ICE_CONTROLLING, p3_->GetControlling());
  2295. p3_ = nullptr;
  2296. }
  2297. TEST_F(WebRtcIceConnectTest, TestConnectTcp) {
  2298. Init(false, true);
  2299. AddStream(1);
  2300. ASSERT_TRUE(Gather());
  2301. SetCandidateFilter(IsTcpCandidate);
  2302. SetExpectedTypes(NrIceCandidate::Type::ICE_HOST,
  2303. NrIceCandidate::Type::ICE_HOST, kNrIceTransportTcp);
  2304. Connect();
  2305. }
  2306. //TCP SO tests works on localhost only with delay applied:
  2307. // tc qdisc add dev lo root netem delay 10ms
  2308. TEST_F(WebRtcIceConnectTest, DISABLED_TestConnectTcpSo) {
  2309. Init(false, true);
  2310. AddStream(1);
  2311. ASSERT_TRUE(Gather());
  2312. SetCandidateFilter(IsTcpSoCandidate);
  2313. SetExpectedTypes(NrIceCandidate::Type::ICE_HOST,
  2314. NrIceCandidate::Type::ICE_HOST, kNrIceTransportTcp);
  2315. Connect();
  2316. }
  2317. // Disabled because this breaks with hairpinning.
  2318. TEST_F(WebRtcIceConnectTest, DISABLED_TestConnectNoHost) {
  2319. Init(false, false, false, NrIceCtx::ICE_POLICY_NO_HOST);
  2320. AddStream(1);
  2321. ASSERT_TRUE(Gather());
  2322. SetExpectedTypes(NrIceCandidate::Type::ICE_SERVER_REFLEXIVE,
  2323. NrIceCandidate::Type::ICE_SERVER_REFLEXIVE, kNrIceTransportTcp);
  2324. Connect();
  2325. }
  2326. TEST_F(WebRtcIceConnectTest, TestLoopbackOnlySortOf) {
  2327. Init(true, false, false);
  2328. AddStream(1);
  2329. SetCandidateFilter(IsLoopbackCandidate);
  2330. ASSERT_TRUE(Gather());
  2331. SetExpectedRemoteCandidateAddr("127.0.0.1");
  2332. Connect();
  2333. }
  2334. TEST_F(WebRtcIceConnectTest, TestConnectBothControllingP1Wins) {
  2335. AddStream(1);
  2336. p1_->SetTiebreaker(1);
  2337. p2_->SetTiebreaker(0);
  2338. ASSERT_TRUE(Gather());
  2339. p1_->SetControlling(NrIceCtx::ICE_CONTROLLING);
  2340. p2_->SetControlling(NrIceCtx::ICE_CONTROLLING);
  2341. Connect();
  2342. }
  2343. TEST_F(WebRtcIceConnectTest, TestConnectBothControllingP2Wins) {
  2344. AddStream(1);
  2345. p1_->SetTiebreaker(0);
  2346. p2_->SetTiebreaker(1);
  2347. ASSERT_TRUE(Gather());
  2348. p1_->SetControlling(NrIceCtx::ICE_CONTROLLING);
  2349. p2_->SetControlling(NrIceCtx::ICE_CONTROLLING);
  2350. Connect();
  2351. }
  2352. TEST_F(WebRtcIceConnectTest, TestConnectIceLiteOfferer) {
  2353. AddStream(1);
  2354. ASSERT_TRUE(Gather());
  2355. p1_->SimulateIceLite();
  2356. Connect();
  2357. }
  2358. TEST_F(WebRtcIceConnectTest, TestTrickleBothControllingP1Wins) {
  2359. AddStream(1);
  2360. p1_->SetTiebreaker(1);
  2361. p2_->SetTiebreaker(0);
  2362. ASSERT_TRUE(Gather());
  2363. p1_->SetControlling(NrIceCtx::ICE_CONTROLLING);
  2364. p2_->SetControlling(NrIceCtx::ICE_CONTROLLING);
  2365. ConnectTrickle();
  2366. SimulateTrickle(0);
  2367. WaitForConnected(1000);
  2368. AssertCheckingReached();
  2369. }
  2370. TEST_F(WebRtcIceConnectTest, TestTrickleBothControllingP2Wins) {
  2371. AddStream(1);
  2372. p1_->SetTiebreaker(0);
  2373. p2_->SetTiebreaker(1);
  2374. ASSERT_TRUE(Gather());
  2375. p1_->SetControlling(NrIceCtx::ICE_CONTROLLING);
  2376. p2_->SetControlling(NrIceCtx::ICE_CONTROLLING);
  2377. ConnectTrickle();
  2378. SimulateTrickle(0);
  2379. WaitForConnected(1000);
  2380. AssertCheckingReached();
  2381. }
  2382. TEST_F(WebRtcIceConnectTest, TestTrickleIceLiteOfferer) {
  2383. AddStream(1);
  2384. ASSERT_TRUE(Gather());
  2385. p1_->SimulateIceLite();
  2386. ConnectTrickle();
  2387. SimulateTrickle(0);
  2388. WaitForConnected(1000);
  2389. AssertCheckingReached();
  2390. }
  2391. TEST_F(WebRtcIceConnectTest, TestGatherFullCone) {
  2392. UseNat();
  2393. AddStream(1);
  2394. ASSERT_TRUE(Gather());
  2395. }
  2396. TEST_F(WebRtcIceConnectTest, TestGatherFullConeAutoPrioritize) {
  2397. UseNat();
  2398. Init(true, false);
  2399. AddStream(1);
  2400. ASSERT_TRUE(Gather());
  2401. }
  2402. TEST_F(WebRtcIceConnectTest, TestConnectFullCone) {
  2403. UseNat();
  2404. AddStream(1);
  2405. SetExpectedTypes(NrIceCandidate::Type::ICE_SERVER_REFLEXIVE,
  2406. NrIceCandidate::Type::ICE_SERVER_REFLEXIVE);
  2407. ASSERT_TRUE(Gather());
  2408. Connect();
  2409. }
  2410. TEST_F(WebRtcIceConnectTest, TestConnectNoNatNoHost) {
  2411. Init(false, false, false, NrIceCtx::ICE_POLICY_NO_HOST);
  2412. AddStream(1);
  2413. UseTestStunServer();
  2414. // Because we are connecting from our host candidate to the
  2415. // other side's apparent srflx (which is also their host)
  2416. // we see a host/srflx pair.
  2417. SetExpectedTypes(NrIceCandidate::Type::ICE_HOST,
  2418. NrIceCandidate::Type::ICE_SERVER_REFLEXIVE);
  2419. ASSERT_TRUE(Gather());
  2420. Connect();
  2421. }
  2422. TEST_F(WebRtcIceConnectTest, TestConnectFullConeNoHost) {
  2423. UseNat();
  2424. Init(false, false, false, NrIceCtx::ICE_POLICY_NO_HOST);
  2425. AddStream(1);
  2426. UseTestStunServer();
  2427. SetExpectedTypes(NrIceCandidate::Type::ICE_SERVER_REFLEXIVE,
  2428. NrIceCandidate::Type::ICE_SERVER_REFLEXIVE);
  2429. ASSERT_TRUE(Gather());
  2430. Connect();
  2431. }
  2432. TEST_F(WebRtcIceConnectTest, TestGatherAddressRestrictedCone) {
  2433. UseNat();
  2434. SetFilteringType(TestNat::ADDRESS_DEPENDENT);
  2435. SetMappingType(TestNat::ENDPOINT_INDEPENDENT);
  2436. AddStream(1);
  2437. ASSERT_TRUE(Gather());
  2438. }
  2439. TEST_F(WebRtcIceConnectTest, TestConnectAddressRestrictedCone) {
  2440. UseNat();
  2441. SetFilteringType(TestNat::ADDRESS_DEPENDENT);
  2442. SetMappingType(TestNat::ENDPOINT_INDEPENDENT);
  2443. AddStream(1);
  2444. SetExpectedTypes(NrIceCandidate::Type::ICE_SERVER_REFLEXIVE,
  2445. NrIceCandidate::Type::ICE_SERVER_REFLEXIVE);
  2446. ASSERT_TRUE(Gather());
  2447. Connect();
  2448. }
  2449. TEST_F(WebRtcIceConnectTest, TestGatherPortRestrictedCone) {
  2450. UseNat();
  2451. SetFilteringType(TestNat::PORT_DEPENDENT);
  2452. SetMappingType(TestNat::ENDPOINT_INDEPENDENT);
  2453. AddStream(1);
  2454. ASSERT_TRUE(Gather());
  2455. }
  2456. TEST_F(WebRtcIceConnectTest, TestConnectPortRestrictedCone) {
  2457. UseNat();
  2458. SetFilteringType(TestNat::PORT_DEPENDENT);
  2459. SetMappingType(TestNat::ENDPOINT_INDEPENDENT);
  2460. AddStream(1);
  2461. SetExpectedTypes(NrIceCandidate::Type::ICE_SERVER_REFLEXIVE,
  2462. NrIceCandidate::Type::ICE_SERVER_REFLEXIVE);
  2463. ASSERT_TRUE(Gather());
  2464. Connect();
  2465. }
  2466. TEST_F(WebRtcIceConnectTest, TestGatherSymmetricNat) {
  2467. UseNat();
  2468. SetFilteringType(TestNat::PORT_DEPENDENT);
  2469. SetMappingType(TestNat::PORT_DEPENDENT);
  2470. AddStream(1);
  2471. ASSERT_TRUE(Gather());
  2472. }
  2473. TEST_F(WebRtcIceConnectTest, TestConnectSymmetricNat) {
  2474. if (turn_server_.empty())
  2475. return;
  2476. UseNat();
  2477. SetFilteringType(TestNat::PORT_DEPENDENT);
  2478. SetMappingType(TestNat::PORT_DEPENDENT);
  2479. AddStream(1);
  2480. p1_->SetExpectedTypes(NrIceCandidate::Type::ICE_RELAYED,
  2481. NrIceCandidate::Type::ICE_RELAYED);
  2482. p2_->SetExpectedTypes(NrIceCandidate::Type::ICE_RELAYED,
  2483. NrIceCandidate::Type::ICE_RELAYED);
  2484. SetTurnServer(turn_server_, kDefaultStunServerPort,
  2485. turn_user_, turn_password_);
  2486. ASSERT_TRUE(Gather());
  2487. Connect();
  2488. }
  2489. TEST_F(WebRtcIceConnectTest, TestConnectSymmetricNatAndNoNat) {
  2490. p1_ = MakeUnique<IceTestPeer>("P1", test_utils_, true, false, false);
  2491. p1_->UseNat();
  2492. p1_->SetFilteringType(TestNat::PORT_DEPENDENT);
  2493. p1_->SetMappingType(TestNat::PORT_DEPENDENT);
  2494. p2_ = MakeUnique<IceTestPeer>("P2", test_utils_, false, false, false);
  2495. initted_ = true;
  2496. AddStream(1);
  2497. p1_->SetExpectedTypes(NrIceCandidate::Type::ICE_PEER_REFLEXIVE,
  2498. NrIceCandidate::Type::ICE_HOST);
  2499. p2_->SetExpectedTypes(NrIceCandidate::Type::ICE_HOST,
  2500. NrIceCandidate::Type::ICE_PEER_REFLEXIVE);
  2501. ASSERT_TRUE(Gather());
  2502. Connect();
  2503. }
  2504. TEST_F(WebRtcIceConnectTest, TestGatherNatBlocksUDP) {
  2505. if (turn_server_.empty())
  2506. return;
  2507. UseNat();
  2508. BlockUdp();
  2509. AddStream(1);
  2510. std::vector<NrIceTurnServer> turn_servers;
  2511. std::vector<unsigned char> password_vec(turn_password_.begin(),
  2512. turn_password_.end());
  2513. turn_servers.push_back(
  2514. *NrIceTurnServer::Create(turn_server_, kDefaultStunServerPort,
  2515. turn_user_, password_vec, kNrIceTransportTcp));
  2516. turn_servers.push_back(
  2517. *NrIceTurnServer::Create(turn_server_, kDefaultStunServerPort,
  2518. turn_user_, password_vec, kNrIceTransportUdp));
  2519. SetTurnServers(turn_servers);
  2520. // We have to wait for the UDP-based stuff to time out.
  2521. ASSERT_TRUE(Gather(kDefaultTimeout * 3));
  2522. }
  2523. TEST_F(WebRtcIceConnectTest, TestConnectNatBlocksUDP) {
  2524. if (turn_server_.empty())
  2525. return;
  2526. UseNat();
  2527. BlockUdp();
  2528. AddStream(1);
  2529. std::vector<NrIceTurnServer> turn_servers;
  2530. std::vector<unsigned char> password_vec(turn_password_.begin(),
  2531. turn_password_.end());
  2532. turn_servers.push_back(
  2533. *NrIceTurnServer::Create(turn_server_, kDefaultStunServerPort,
  2534. turn_user_, password_vec, kNrIceTransportTcp));
  2535. turn_servers.push_back(
  2536. *NrIceTurnServer::Create(turn_server_, kDefaultStunServerPort,
  2537. turn_user_, password_vec, kNrIceTransportUdp));
  2538. SetTurnServers(turn_servers);
  2539. p1_->SetExpectedTypes(NrIceCandidate::Type::ICE_RELAYED,
  2540. NrIceCandidate::Type::ICE_RELAYED,
  2541. kNrIceTransportTcp);
  2542. p2_->SetExpectedTypes(NrIceCandidate::Type::ICE_RELAYED,
  2543. NrIceCandidate::Type::ICE_RELAYED,
  2544. kNrIceTransportTcp);
  2545. ASSERT_TRUE(Gather(kDefaultTimeout * 3));
  2546. Connect();
  2547. }
  2548. TEST_F(WebRtcIceConnectTest, TestConnectTwoComponents) {
  2549. AddStream(2);
  2550. ASSERT_TRUE(Gather());
  2551. Connect();
  2552. }
  2553. TEST_F(WebRtcIceConnectTest, TestConnectTwoComponentsDisableSecond) {
  2554. AddStream(2);
  2555. ASSERT_TRUE(Gather());
  2556. p1_->DisableComponent(0, 2);
  2557. p2_->DisableComponent(0, 2);
  2558. Connect();
  2559. }
  2560. TEST_F(WebRtcIceConnectTest, TestConnectP2ThenP1) {
  2561. AddStream(1);
  2562. ASSERT_TRUE(Gather());
  2563. ConnectP2();
  2564. PR_Sleep(1000);
  2565. ConnectP1();
  2566. WaitForConnectedStreams();
  2567. }
  2568. TEST_F(WebRtcIceConnectTest, TestConnectP2ThenP1Trickle) {
  2569. AddStream(1);
  2570. ASSERT_TRUE(Gather());
  2571. ConnectP2();
  2572. PR_Sleep(1000);
  2573. ConnectP1(TRICKLE_SIMULATE);
  2574. SimulateTrickleP1(0);
  2575. WaitForConnectedStreams();
  2576. }
  2577. TEST_F(WebRtcIceConnectTest, TestConnectP2ThenP1TrickleTwoComponents) {
  2578. AddStream(1);
  2579. AddStream(2);
  2580. ASSERT_TRUE(Gather());
  2581. ConnectP2();
  2582. PR_Sleep(1000);
  2583. ConnectP1(TRICKLE_SIMULATE);
  2584. SimulateTrickleP1(0);
  2585. std::cerr << "Sleeping between trickle streams" << std::endl;
  2586. PR_Sleep(1000); // Give this some time to settle but not complete
  2587. // all of ICE.
  2588. SimulateTrickleP1(1);
  2589. WaitForConnectedStreams(2);
  2590. }
  2591. TEST_F(WebRtcIceConnectTest, TestConnectAutoPrioritize) {
  2592. Init(false, false);
  2593. AddStream(1);
  2594. ASSERT_TRUE(Gather());
  2595. Connect();
  2596. }
  2597. TEST_F(WebRtcIceConnectTest, TestConnectTrickleOneStreamOneComponent) {
  2598. AddStream(1);
  2599. ASSERT_TRUE(Gather());
  2600. ConnectTrickle();
  2601. SimulateTrickle(0);
  2602. WaitForConnected(1000);
  2603. AssertCheckingReached();
  2604. }
  2605. TEST_F(WebRtcIceConnectTest, TestConnectTrickleTwoStreamsOneComponent) {
  2606. AddStream(1);
  2607. AddStream(1);
  2608. ASSERT_TRUE(Gather());
  2609. ConnectTrickle();
  2610. SimulateTrickle(0);
  2611. SimulateTrickle(1);
  2612. WaitForConnected(1000);
  2613. AssertCheckingReached();
  2614. }
  2615. void RealisticTrickleDelay(
  2616. std::vector<SchedulableTrickleCandidate*>& candidates) {
  2617. for (size_t i = 0; i < candidates.size(); ++i) {
  2618. SchedulableTrickleCandidate* cand = candidates[i];
  2619. if (cand->IsHost()) {
  2620. cand->Schedule(i*10);
  2621. } else if (cand->IsReflexive()) {
  2622. cand->Schedule(i*10 + 100);
  2623. } else if (cand->IsRelay()) {
  2624. cand->Schedule(i*10 + 200);
  2625. }
  2626. }
  2627. }
  2628. void DelayRelayCandidates(
  2629. std::vector<SchedulableTrickleCandidate*>& candidates,
  2630. unsigned int ms) {
  2631. for (auto i = candidates.begin(); i != candidates.end(); ++i) {
  2632. if ((*i)->IsRelay()) {
  2633. (*i)->Schedule(ms);
  2634. } else {
  2635. (*i)->Schedule(0);
  2636. }
  2637. }
  2638. }
  2639. void AddNonPairableCandidates(
  2640. std::vector<SchedulableTrickleCandidate*>& candidates,
  2641. IceTestPeer *peer, size_t stream, int net_type,
  2642. MtransportTestUtils* test_utils_) {
  2643. for (int i=1; i<5; i++) {
  2644. if (net_type == i)
  2645. continue;
  2646. switch (i) {
  2647. case 1:
  2648. candidates.push_back(new SchedulableTrickleCandidate(peer, stream,
  2649. "candidate:0 1 UDP 2113601790 10.0.0.1 12345 typ host",
  2650. test_utils_));
  2651. break;
  2652. case 2:
  2653. candidates.push_back(new SchedulableTrickleCandidate(peer, stream,
  2654. "candidate:0 1 UDP 2113601791 172.16.1.1 12345 typ host",
  2655. test_utils_));
  2656. break;
  2657. case 3:
  2658. candidates.push_back(new SchedulableTrickleCandidate(peer, stream,
  2659. "candidate:0 1 UDP 2113601792 192.168.0.1 12345 typ host",
  2660. test_utils_));
  2661. break;
  2662. case 4:
  2663. candidates.push_back(new SchedulableTrickleCandidate(peer, stream,
  2664. "candidate:0 1 UDP 2113601793 100.64.1.1 12345 typ host",
  2665. test_utils_));
  2666. break;
  2667. default:
  2668. UNIMPLEMENTED;
  2669. }
  2670. }
  2671. for (auto i = candidates.rbegin(); i != candidates.rend(); ++i) {
  2672. std::cerr << "Scheduling candidate: " << (*i)->Candidate().c_str() << std::endl;
  2673. (*i)->Schedule(0);
  2674. }
  2675. }
  2676. void DropTrickleCandidates(
  2677. std::vector<SchedulableTrickleCandidate*>& candidates) {
  2678. }
  2679. TEST_F(WebRtcIceConnectTest, TestConnectTrickleAddStreamDuringICE) {
  2680. AddStream(1);
  2681. ASSERT_TRUE(Gather());
  2682. ConnectTrickle();
  2683. RealisticTrickleDelay(p1_->ControlTrickle(0));
  2684. RealisticTrickleDelay(p2_->ControlTrickle(0));
  2685. AddStream(1);
  2686. RealisticTrickleDelay(p1_->ControlTrickle(1));
  2687. RealisticTrickleDelay(p2_->ControlTrickle(1));
  2688. WaitForConnected(1000);
  2689. AssertCheckingReached();
  2690. }
  2691. TEST_F(WebRtcIceConnectTest, TestConnectTrickleAddStreamAfterICE) {
  2692. AddStream(1);
  2693. ASSERT_TRUE(Gather());
  2694. ConnectTrickle();
  2695. RealisticTrickleDelay(p1_->ControlTrickle(0));
  2696. RealisticTrickleDelay(p2_->ControlTrickle(0));
  2697. WaitForConnected(1000);
  2698. AddStream(1);
  2699. ASSERT_TRUE(Gather());
  2700. ConnectTrickle();
  2701. RealisticTrickleDelay(p1_->ControlTrickle(1));
  2702. RealisticTrickleDelay(p2_->ControlTrickle(1));
  2703. WaitForConnected(1000);
  2704. AssertCheckingReached();
  2705. }
  2706. TEST_F(WebRtcIceConnectTest, RemoveStream) {
  2707. AddStream(1);
  2708. AddStream(1);
  2709. ASSERT_TRUE(Gather());
  2710. ConnectTrickle();
  2711. RealisticTrickleDelay(p1_->ControlTrickle(0));
  2712. RealisticTrickleDelay(p2_->ControlTrickle(0));
  2713. RealisticTrickleDelay(p1_->ControlTrickle(1));
  2714. RealisticTrickleDelay(p2_->ControlTrickle(1));
  2715. WaitForConnected(1000);
  2716. RemoveStream(0);
  2717. ASSERT_TRUE(Gather());
  2718. ConnectTrickle();
  2719. }
  2720. TEST_F(WebRtcIceConnectTest, P1NoTrickle) {
  2721. AddStream(1);
  2722. ASSERT_TRUE(Gather());
  2723. ConnectTrickle();
  2724. DropTrickleCandidates(p1_->ControlTrickle(0));
  2725. RealisticTrickleDelay(p2_->ControlTrickle(0));
  2726. WaitForConnected(1000);
  2727. }
  2728. TEST_F(WebRtcIceConnectTest, P2NoTrickle) {
  2729. AddStream(1);
  2730. ASSERT_TRUE(Gather());
  2731. ConnectTrickle();
  2732. RealisticTrickleDelay(p1_->ControlTrickle(0));
  2733. DropTrickleCandidates(p2_->ControlTrickle(0));
  2734. WaitForConnected(1000);
  2735. }
  2736. TEST_F(WebRtcIceConnectTest, RemoveAndAddStream) {
  2737. AddStream(1);
  2738. AddStream(1);
  2739. ASSERT_TRUE(Gather());
  2740. ConnectTrickle();
  2741. RealisticTrickleDelay(p1_->ControlTrickle(0));
  2742. RealisticTrickleDelay(p2_->ControlTrickle(0));
  2743. RealisticTrickleDelay(p1_->ControlTrickle(1));
  2744. RealisticTrickleDelay(p2_->ControlTrickle(1));
  2745. WaitForConnected(1000);
  2746. RemoveStream(0);
  2747. AddStream(1);
  2748. ASSERT_TRUE(Gather());
  2749. ConnectTrickle();
  2750. RealisticTrickleDelay(p1_->ControlTrickle(2));
  2751. RealisticTrickleDelay(p2_->ControlTrickle(2));
  2752. WaitForConnected(1000);
  2753. }
  2754. TEST_F(WebRtcIceConnectTest, RemoveStreamBeforeGather) {
  2755. AddStream(1);
  2756. AddStream(1);
  2757. ASSERT_TRUE(Gather(0));
  2758. RemoveStream(0);
  2759. WaitForGather();
  2760. ConnectTrickle();
  2761. RealisticTrickleDelay(p1_->ControlTrickle(1));
  2762. RealisticTrickleDelay(p2_->ControlTrickle(1));
  2763. WaitForConnected(1000);
  2764. }
  2765. TEST_F(WebRtcIceConnectTest, RemoveStreamDuringGather) {
  2766. AddStream(1);
  2767. AddStream(1);
  2768. RemoveStream(0);
  2769. ASSERT_TRUE(Gather());
  2770. ConnectTrickle();
  2771. RealisticTrickleDelay(p1_->ControlTrickle(1));
  2772. RealisticTrickleDelay(p2_->ControlTrickle(1));
  2773. WaitForConnected(1000);
  2774. }
  2775. TEST_F(WebRtcIceConnectTest, RemoveStreamDuringConnect) {
  2776. AddStream(1);
  2777. AddStream(1);
  2778. ASSERT_TRUE(Gather());
  2779. ConnectTrickle();
  2780. RealisticTrickleDelay(p1_->ControlTrickle(0));
  2781. RealisticTrickleDelay(p2_->ControlTrickle(0));
  2782. RealisticTrickleDelay(p1_->ControlTrickle(1));
  2783. RealisticTrickleDelay(p2_->ControlTrickle(1));
  2784. RemoveStream(0);
  2785. WaitForConnected(1000);
  2786. }
  2787. TEST_F(WebRtcIceConnectTest, TestConnectRealTrickleOneStreamOneComponent) {
  2788. AddStream(1);
  2789. AddStream(1);
  2790. ASSERT_TRUE(Gather(0));
  2791. ConnectTrickle(TRICKLE_REAL);
  2792. WaitForConnected();
  2793. WaitForGather(); // ICE can complete before we finish gathering.
  2794. AssertCheckingReached();
  2795. }
  2796. TEST_F(WebRtcIceConnectTest, TestSendReceive) {
  2797. AddStream(1);
  2798. ASSERT_TRUE(Gather());
  2799. Connect();
  2800. SendReceive();
  2801. }
  2802. TEST_F(WebRtcIceConnectTest, TestSendReceiveTcp) {
  2803. Init(false, true);
  2804. AddStream(1);
  2805. ASSERT_TRUE(Gather());
  2806. SetCandidateFilter(IsTcpCandidate);
  2807. SetExpectedTypes(NrIceCandidate::Type::ICE_HOST,
  2808. NrIceCandidate::Type::ICE_HOST, kNrIceTransportTcp);
  2809. Connect();
  2810. SendReceive();
  2811. }
  2812. //TCP SO tests works on localhost only with delay applied:
  2813. // tc qdisc add dev lo root netem delay 10ms
  2814. TEST_F(WebRtcIceConnectTest, DISABLED_TestSendReceiveTcpSo) {
  2815. Init(false, true);
  2816. AddStream(1);
  2817. ASSERT_TRUE(Gather());
  2818. SetCandidateFilter(IsTcpSoCandidate);
  2819. SetExpectedTypes(NrIceCandidate::Type::ICE_HOST,
  2820. NrIceCandidate::Type::ICE_HOST, kNrIceTransportTcp);
  2821. Connect();
  2822. SendReceive();
  2823. }
  2824. TEST_F(WebRtcIceConnectTest, TestConsent) {
  2825. AddStream(1);
  2826. SetupAndCheckConsent();
  2827. PR_Sleep(1500);
  2828. AssertConsentRefresh();
  2829. SendReceive();
  2830. }
  2831. TEST_F(WebRtcIceConnectTest, TestConsentTcp) {
  2832. Init(false, true);
  2833. AddStream(1);
  2834. SetCandidateFilter(IsTcpCandidate);
  2835. SetExpectedTypes(NrIceCandidate::Type::ICE_HOST,
  2836. NrIceCandidate::Type::ICE_HOST, kNrIceTransportTcp);
  2837. SetupAndCheckConsent();
  2838. PR_Sleep(1500);
  2839. AssertConsentRefresh();
  2840. SendReceive();
  2841. }
  2842. TEST_F(WebRtcIceConnectTest, TestConsentIntermittent) {
  2843. AddStream(1);
  2844. SetupAndCheckConsent();
  2845. p1_->SetBlockStun(true);
  2846. p2_->SetBlockStun(true);
  2847. WaitForDisconnected();
  2848. AssertConsentRefresh(CONSENT_STALE);
  2849. SendReceive();
  2850. p1_->SetBlockStun(false);
  2851. p2_->SetBlockStun(false);
  2852. WaitForConnected();
  2853. AssertConsentRefresh();
  2854. SendReceive();
  2855. p1_->SetBlockStun(true);
  2856. p2_->SetBlockStun(true);
  2857. WaitForDisconnected();
  2858. AssertConsentRefresh(CONSENT_STALE);
  2859. SendReceive();
  2860. p1_->SetBlockStun(false);
  2861. p2_->SetBlockStun(false);
  2862. WaitForConnected();
  2863. AssertConsentRefresh();
  2864. }
  2865. TEST_F(WebRtcIceConnectTest, TestConsentTimeout) {
  2866. AddStream(1);
  2867. SetupAndCheckConsent();
  2868. p1_->SetBlockStun(true);
  2869. p2_->SetBlockStun(true);
  2870. WaitForDisconnected();
  2871. AssertConsentRefresh(CONSENT_STALE);
  2872. SendReceive();
  2873. WaitForFailed();
  2874. AssertConsentRefresh(CONSENT_EXPIRED);
  2875. SendFailure();
  2876. }
  2877. TEST_F(WebRtcIceConnectTest, TestConsentDelayed) {
  2878. AddStream(1);
  2879. SetupAndCheckConsent();
  2880. /* Note: We don't have a list of STUN transaction IDs of the previously timed
  2881. out consent requests. Thus responses after sending the next consent
  2882. request are ignored. */
  2883. p1_->SetStunResponseDelay(300);
  2884. p2_->SetStunResponseDelay(300);
  2885. PR_Sleep(1000);
  2886. AssertConsentRefresh();
  2887. SendReceive();
  2888. }
  2889. TEST_F(WebRtcIceConnectTest, TestConnectTurn) {
  2890. if (turn_server_.empty())
  2891. return;
  2892. AddStream(1);
  2893. SetTurnServer(turn_server_, kDefaultStunServerPort,
  2894. turn_user_, turn_password_);
  2895. ASSERT_TRUE(Gather());
  2896. Connect();
  2897. }
  2898. TEST_F(WebRtcIceConnectTest, TestConnectTurnWithDelay) {
  2899. if (turn_server_.empty())
  2900. return;
  2901. AddStream(1);
  2902. SetTurnServer(turn_server_, kDefaultStunServerPort,
  2903. turn_user_, turn_password_);
  2904. SetCandidateFilter(SabotageHostCandidateAndDropReflexive);
  2905. p1_->Gather();
  2906. PR_Sleep(500);
  2907. p2_->Gather();
  2908. ConnectTrickle(TRICKLE_REAL);
  2909. WaitForGather();
  2910. WaitForConnectedStreams();
  2911. }
  2912. TEST_F(WebRtcIceConnectTest, TestConnectTurnWithNormalTrickleDelay) {
  2913. if (turn_server_.empty())
  2914. return;
  2915. AddStream(1);
  2916. SetTurnServer(turn_server_, kDefaultStunServerPort,
  2917. turn_user_, turn_password_);
  2918. ASSERT_TRUE(Gather());
  2919. ConnectTrickle();
  2920. RealisticTrickleDelay(p1_->ControlTrickle(0));
  2921. RealisticTrickleDelay(p2_->ControlTrickle(0));
  2922. WaitForConnected();
  2923. AssertCheckingReached();
  2924. }
  2925. TEST_F(WebRtcIceConnectTest, TestConnectTurnWithNormalTrickleDelayOneSided) {
  2926. if (turn_server_.empty())
  2927. return;
  2928. AddStream(1);
  2929. SetTurnServer(turn_server_, kDefaultStunServerPort,
  2930. turn_user_, turn_password_);
  2931. ASSERT_TRUE(Gather());
  2932. ConnectTrickle();
  2933. RealisticTrickleDelay(p1_->ControlTrickle(0));
  2934. p2_->SimulateTrickle(0);
  2935. WaitForConnected();
  2936. AssertCheckingReached();
  2937. }
  2938. TEST_F(WebRtcIceConnectTest, TestConnectTurnWithLargeTrickleDelay) {
  2939. if (turn_server_.empty())
  2940. return;
  2941. AddStream(1);
  2942. SetTurnServer(turn_server_, kDefaultStunServerPort,
  2943. turn_user_, turn_password_);
  2944. SetCandidateFilter(SabotageHostCandidateAndDropReflexive);
  2945. ASSERT_TRUE(Gather());
  2946. ConnectTrickle();
  2947. // Trickle host candidates immediately, but delay relay candidates
  2948. DelayRelayCandidates(p1_->ControlTrickle(0), 3700);
  2949. DelayRelayCandidates(p2_->ControlTrickle(0), 3700);
  2950. WaitForConnected();
  2951. AssertCheckingReached();
  2952. }
  2953. TEST_F(WebRtcIceConnectTest, TestConnectTurnTcp) {
  2954. if (turn_server_.empty())
  2955. return;
  2956. AddStream(1);
  2957. SetTurnServer(turn_server_, kDefaultStunServerPort,
  2958. turn_user_, turn_password_, kNrIceTransportTcp);
  2959. ASSERT_TRUE(Gather());
  2960. Connect();
  2961. }
  2962. TEST_F(WebRtcIceConnectTest, TestConnectTurnOnly) {
  2963. if (turn_server_.empty())
  2964. return;
  2965. AddStream(1);
  2966. SetTurnServer(turn_server_, kDefaultStunServerPort,
  2967. turn_user_, turn_password_);
  2968. ASSERT_TRUE(Gather());
  2969. SetCandidateFilter(IsRelayCandidate);
  2970. SetExpectedTypes(NrIceCandidate::Type::ICE_RELAYED,
  2971. NrIceCandidate::Type::ICE_RELAYED);
  2972. Connect();
  2973. }
  2974. TEST_F(WebRtcIceConnectTest, TestConnectTurnTcpOnly) {
  2975. if (turn_server_.empty())
  2976. return;
  2977. AddStream(1);
  2978. SetTurnServer(turn_server_, kDefaultStunServerPort,
  2979. turn_user_, turn_password_, kNrIceTransportTcp);
  2980. ASSERT_TRUE(Gather());
  2981. SetCandidateFilter(IsRelayCandidate);
  2982. SetExpectedTypes(NrIceCandidate::Type::ICE_RELAYED,
  2983. NrIceCandidate::Type::ICE_RELAYED,
  2984. kNrIceTransportTcp);
  2985. Connect();
  2986. }
  2987. TEST_F(WebRtcIceConnectTest, TestSendReceiveTurnOnly) {
  2988. if (turn_server_.empty())
  2989. return;
  2990. AddStream(1);
  2991. SetTurnServer(turn_server_, kDefaultStunServerPort,
  2992. turn_user_, turn_password_);
  2993. ASSERT_TRUE(Gather());
  2994. SetCandidateFilter(IsRelayCandidate);
  2995. SetExpectedTypes(NrIceCandidate::Type::ICE_RELAYED,
  2996. NrIceCandidate::Type::ICE_RELAYED);
  2997. Connect();
  2998. SendReceive();
  2999. }
  3000. TEST_F(WebRtcIceConnectTest, TestSendReceiveTurnTcpOnly) {
  3001. if (turn_server_.empty())
  3002. return;
  3003. AddStream(1);
  3004. SetTurnServer(turn_server_, kDefaultStunServerPort,
  3005. turn_user_, turn_password_, kNrIceTransportTcp);
  3006. ASSERT_TRUE(Gather());
  3007. SetCandidateFilter(IsRelayCandidate);
  3008. SetExpectedTypes(NrIceCandidate::Type::ICE_RELAYED,
  3009. NrIceCandidate::Type::ICE_RELAYED,
  3010. kNrIceTransportTcp);
  3011. Connect();
  3012. SendReceive();
  3013. }
  3014. TEST_F(WebRtcIceConnectTest, TestSendReceiveTurnBothOnly) {
  3015. if (turn_server_.empty())
  3016. return;
  3017. AddStream(1);
  3018. std::vector<NrIceTurnServer> turn_servers;
  3019. std::vector<unsigned char> password_vec(turn_password_.begin(),
  3020. turn_password_.end());
  3021. turn_servers.push_back(*NrIceTurnServer::Create(
  3022. turn_server_, kDefaultStunServerPort,
  3023. turn_user_, password_vec, kNrIceTransportTcp));
  3024. turn_servers.push_back(*NrIceTurnServer::Create(
  3025. turn_server_, kDefaultStunServerPort,
  3026. turn_user_, password_vec, kNrIceTransportUdp));
  3027. SetTurnServers(turn_servers);
  3028. ASSERT_TRUE(Gather());
  3029. SetCandidateFilter(IsRelayCandidate);
  3030. // UDP is preferred.
  3031. SetExpectedTypes(NrIceCandidate::Type::ICE_RELAYED,
  3032. NrIceCandidate::Type::ICE_RELAYED,
  3033. kNrIceTransportUdp);
  3034. Connect();
  3035. SendReceive();
  3036. }
  3037. TEST_F(WebRtcIceConnectTest, TestConnectShutdownOneSide) {
  3038. AddStream(1);
  3039. ASSERT_TRUE(Gather());
  3040. ConnectThenDelete();
  3041. }
  3042. TEST_F(WebRtcIceConnectTest, TestPollCandPairsBeforeConnect) {
  3043. AddStream(1);
  3044. ASSERT_TRUE(Gather());
  3045. std::vector<NrIceCandidatePair> pairs;
  3046. nsresult res = p1_->GetCandidatePairs(0, &pairs);
  3047. // There should be no candidate pairs prior to calling Connect()
  3048. ASSERT_EQ(NS_OK, res);
  3049. ASSERT_EQ(0U, pairs.size());
  3050. res = p2_->GetCandidatePairs(0, &pairs);
  3051. ASSERT_EQ(NS_OK, res);
  3052. ASSERT_EQ(0U, pairs.size());
  3053. }
  3054. TEST_F(WebRtcIceConnectTest, TestPollCandPairsAfterConnect) {
  3055. AddStream(1);
  3056. ASSERT_TRUE(Gather());
  3057. Connect();
  3058. std::vector<NrIceCandidatePair> pairs;
  3059. nsresult r = p1_->GetCandidatePairs(0, &pairs);
  3060. ASSERT_EQ(NS_OK, r);
  3061. // How detailed of a check do we want to do here? If the turn server is
  3062. // functioning, we'll get at least two pairs, but this is probably not
  3063. // something we should assume.
  3064. ASSERT_NE(0U, pairs.size());
  3065. ASSERT_TRUE(p1_->CandidatePairsPriorityDescending(pairs));
  3066. ASSERT_TRUE(ContainsSucceededPair(pairs));
  3067. pairs.clear();
  3068. r = p2_->GetCandidatePairs(0, &pairs);
  3069. ASSERT_EQ(NS_OK, r);
  3070. ASSERT_NE(0U, pairs.size());
  3071. ASSERT_TRUE(p2_->CandidatePairsPriorityDescending(pairs));
  3072. ASSERT_TRUE(ContainsSucceededPair(pairs));
  3073. }
  3074. // TODO Bug 1259842 - disabled until we find a better way to handle two
  3075. // candidates from different RFC1918 ranges
  3076. TEST_F(WebRtcIceConnectTest, DISABLED_TestHostCandPairingFilter) {
  3077. Init(false, false, false);
  3078. AddStream(1);
  3079. ASSERT_TRUE(Gather());
  3080. SetCandidateFilter(IsIpv4Candidate);
  3081. int host_net = p1_->GetCandidatesPrivateIpv4Range(0);
  3082. if (host_net <= 0) {
  3083. // TODO bug 1226838: make this work with multiple private IPs
  3084. FAIL() << "This test needs exactly one private IPv4 host candidate to work" << std::endl;
  3085. }
  3086. ConnectTrickle();
  3087. AddNonPairableCandidates(p1_->ControlTrickle(0), p1_.get(), 0, host_net, test_utils_);
  3088. AddNonPairableCandidates(p2_->ControlTrickle(0), p2_.get(), 0, host_net, test_utils_);
  3089. std::vector<NrIceCandidatePair> pairs;
  3090. p1_->GetCandidatePairs(0, &pairs);
  3091. for (auto p : pairs) {
  3092. std::cerr << "Verifying pair:" << std::endl;
  3093. p1_->DumpCandidatePair(p);
  3094. nr_transport_addr addr;
  3095. nr_str_port_to_transport_addr(p.local.local_addr.host.c_str(), 0, IPPROTO_UDP, &addr);
  3096. ASSERT_TRUE(nr_transport_addr_get_private_addr_range(&addr) == host_net);
  3097. nr_str_port_to_transport_addr(p.remote.cand_addr.host.c_str(), 0, IPPROTO_UDP, &addr);
  3098. ASSERT_TRUE(nr_transport_addr_get_private_addr_range(&addr) == host_net);
  3099. }
  3100. }
  3101. // TODO Bug 1226838 - See Comment 2 - this test can't work as written
  3102. TEST_F(WebRtcIceConnectTest, DISABLED_TestSrflxCandPairingFilter) {
  3103. if (stun_server_address_.empty()) {
  3104. return;
  3105. }
  3106. Init(false, false, false);
  3107. AddStream(1);
  3108. ASSERT_TRUE(Gather());
  3109. SetCandidateFilter(IsSrflxCandidate);
  3110. if (p1_->GetCandidatesPrivateIpv4Range(0) <= 0) {
  3111. // TODO bug 1226838: make this work with public IP addresses
  3112. std::cerr << "Don't run this test at IETF meetings!" << std::endl;
  3113. FAIL() << "This test needs one private IPv4 host candidate to work" << std::endl;
  3114. }
  3115. ConnectTrickle();
  3116. SimulateTrickleP1(0);
  3117. SimulateTrickleP2(0);
  3118. std::vector<NrIceCandidatePair> pairs;
  3119. p1_->GetCandidatePairs(0, &pairs);
  3120. for (auto p : pairs) {
  3121. std::cerr << "Verifying P1 pair:" << std::endl;
  3122. p1_->DumpCandidatePair(p);
  3123. nr_transport_addr addr;
  3124. nr_str_port_to_transport_addr(p.local.local_addr.host.c_str(), 0, IPPROTO_UDP, &addr);
  3125. ASSERT_TRUE(nr_transport_addr_get_private_addr_range(&addr) != 0);
  3126. nr_str_port_to_transport_addr(p.remote.cand_addr.host.c_str(), 0, IPPROTO_UDP, &addr);
  3127. ASSERT_TRUE(nr_transport_addr_get_private_addr_range(&addr) == 0);
  3128. }
  3129. p2_->GetCandidatePairs(0, &pairs);
  3130. for (auto p : pairs) {
  3131. std::cerr << "Verifying P2 pair:" << std::endl;
  3132. p2_->DumpCandidatePair(p);
  3133. nr_transport_addr addr;
  3134. nr_str_port_to_transport_addr(p.local.local_addr.host.c_str(), 0, IPPROTO_UDP, &addr);
  3135. ASSERT_TRUE(nr_transport_addr_get_private_addr_range(&addr) != 0);
  3136. nr_str_port_to_transport_addr(p.remote.cand_addr.host.c_str(), 0, IPPROTO_UDP, &addr);
  3137. ASSERT_TRUE(nr_transport_addr_get_private_addr_range(&addr) == 0);
  3138. }
  3139. }
  3140. TEST_F(WebRtcIceConnectTest, TestPollCandPairsDuringConnect) {
  3141. AddStream(1);
  3142. ASSERT_TRUE(Gather());
  3143. p2_->Connect(p1_.get(), TRICKLE_NONE, false);
  3144. p1_->Connect(p2_.get(), TRICKLE_NONE, false);
  3145. std::vector<NrIceCandidatePair> pairs1;
  3146. std::vector<NrIceCandidatePair> pairs2;
  3147. p1_->StartChecks();
  3148. p1_->UpdateAndValidateCandidatePairs(0, &pairs1);
  3149. p2_->UpdateAndValidateCandidatePairs(0, &pairs2);
  3150. p2_->StartChecks();
  3151. p1_->UpdateAndValidateCandidatePairs(0, &pairs1);
  3152. p2_->UpdateAndValidateCandidatePairs(0, &pairs2);
  3153. WaitForConnectedStreams();
  3154. p1_->UpdateAndValidateCandidatePairs(0, &pairs1);
  3155. p2_->UpdateAndValidateCandidatePairs(0, &pairs2);
  3156. ASSERT_TRUE(ContainsSucceededPair(pairs1));
  3157. ASSERT_TRUE(ContainsSucceededPair(pairs2));
  3158. }
  3159. TEST_F(WebRtcIceConnectTest, TestRLogConnector) {
  3160. AddStream(1);
  3161. ASSERT_TRUE(Gather());
  3162. p2_->Connect(p1_.get(), TRICKLE_NONE, false);
  3163. p1_->Connect(p2_.get(), TRICKLE_NONE, false);
  3164. std::vector<NrIceCandidatePair> pairs1;
  3165. std::vector<NrIceCandidatePair> pairs2;
  3166. p1_->StartChecks();
  3167. p1_->UpdateAndValidateCandidatePairs(0, &pairs1);
  3168. p2_->UpdateAndValidateCandidatePairs(0, &pairs2);
  3169. p2_->StartChecks();
  3170. p1_->UpdateAndValidateCandidatePairs(0, &pairs1);
  3171. p2_->UpdateAndValidateCandidatePairs(0, &pairs2);
  3172. WaitForConnectedStreams();
  3173. p1_->UpdateAndValidateCandidatePairs(0, &pairs1);
  3174. p2_->UpdateAndValidateCandidatePairs(0, &pairs2);
  3175. ASSERT_TRUE(ContainsSucceededPair(pairs1));
  3176. ASSERT_TRUE(ContainsSucceededPair(pairs2));
  3177. for (auto p = pairs1.begin(); p != pairs1.end(); ++p) {
  3178. std::deque<std::string> logs;
  3179. std::string substring("CAND-PAIR(");
  3180. substring += p->codeword;
  3181. RLogConnector::GetInstance()->Filter(substring, 0, &logs);
  3182. ASSERT_NE(0U, logs.size());
  3183. }
  3184. for (auto p = pairs2.begin(); p != pairs2.end(); ++p) {
  3185. std::deque<std::string> logs;
  3186. std::string substring("CAND-PAIR(");
  3187. substring += p->codeword;
  3188. RLogConnector::GetInstance()->Filter(substring, 0, &logs);
  3189. ASSERT_NE(0U, logs.size());
  3190. }
  3191. }
  3192. TEST_F(WebRtcIcePrioritizerTest, TestPrioritizer) {
  3193. SetPriorizer(::mozilla::CreateInterfacePrioritizer());
  3194. AddInterface("0", NR_INTERFACE_TYPE_VPN, 100); // unknown vpn
  3195. AddInterface("1", NR_INTERFACE_TYPE_VPN | NR_INTERFACE_TYPE_WIRED, 100); // wired vpn
  3196. AddInterface("2", NR_INTERFACE_TYPE_VPN | NR_INTERFACE_TYPE_WIFI, 100); // wifi vpn
  3197. AddInterface("3", NR_INTERFACE_TYPE_VPN | NR_INTERFACE_TYPE_MOBILE, 100); // wifi vpn
  3198. AddInterface("4", NR_INTERFACE_TYPE_WIRED, 1000); // wired, high speed
  3199. AddInterface("5", NR_INTERFACE_TYPE_WIRED, 10); // wired, low speed
  3200. AddInterface("6", NR_INTERFACE_TYPE_WIFI, 10); // wifi, low speed
  3201. AddInterface("7", NR_INTERFACE_TYPE_WIFI, 1000); // wifi, high speed
  3202. AddInterface("8", NR_INTERFACE_TYPE_MOBILE, 10); // mobile, low speed
  3203. AddInterface("9", NR_INTERFACE_TYPE_MOBILE, 1000); // mobile, high speed
  3204. AddInterface("10", NR_INTERFACE_TYPE_UNKNOWN, 10); // unknown, low speed
  3205. AddInterface("11", NR_INTERFACE_TYPE_UNKNOWN, 1000); // unknown, high speed
  3206. // expected preference "4" > "5" > "1" > "7" > "6" > "2" > "9" > "8" > "3" > "11" > "10" > "0"
  3207. HasLowerPreference("0", "10");
  3208. HasLowerPreference("10", "11");
  3209. HasLowerPreference("11", "3");
  3210. HasLowerPreference("3", "8");
  3211. HasLowerPreference("8", "9");
  3212. HasLowerPreference("9", "2");
  3213. HasLowerPreference("2", "6");
  3214. HasLowerPreference("6", "7");
  3215. HasLowerPreference("7", "1");
  3216. HasLowerPreference("1", "5");
  3217. HasLowerPreference("5", "4");
  3218. }
  3219. TEST_F(WebRtcIcePacketFilterTest, TestSendNonStunPacket) {
  3220. const unsigned char data[] = "12345abcde";
  3221. TestOutgoing(data, sizeof(data), 123, 45, false);
  3222. TestOutgoingTcp(data, sizeof(data), false);
  3223. }
  3224. TEST_F(WebRtcIcePacketFilterTest, TestRecvNonStunPacket) {
  3225. const unsigned char data[] = "12345abcde";
  3226. TestIncoming(data, sizeof(data), 123, 45, false);
  3227. TestIncomingTcp(data, sizeof(data), true);
  3228. }
  3229. TEST_F(WebRtcIcePacketFilterTest, TestSendStunPacket) {
  3230. nr_stun_message *msg;
  3231. ASSERT_EQ(0, nr_stun_build_req_no_auth(NULL, &msg));
  3232. msg->header.type = NR_STUN_MSG_BINDING_REQUEST;
  3233. ASSERT_EQ(0, nr_stun_encode_message(msg));
  3234. TestOutgoing(msg->buffer, msg->length, 123, 45, true);
  3235. TestOutgoingTcp(msg->buffer, msg->length, true);
  3236. TestOutgoingTcpFramed(msg->buffer, msg->length, true);
  3237. ASSERT_EQ(0, nr_stun_message_destroy(&msg));
  3238. }
  3239. TEST_F(WebRtcIcePacketFilterTest, TestRecvStunPacketWithoutAPendingId) {
  3240. nr_stun_message *msg;
  3241. ASSERT_EQ(0, nr_stun_build_req_no_auth(NULL, &msg));
  3242. msg->header.id.octet[0] = 1;
  3243. msg->header.type = NR_STUN_MSG_BINDING_REQUEST;
  3244. ASSERT_EQ(0, nr_stun_encode_message(msg));
  3245. TestOutgoing(msg->buffer, msg->length, 123, 45, true);
  3246. TestOutgoingTcp(msg->buffer, msg->length, true);
  3247. msg->header.id.octet[0] = 0;
  3248. msg->header.type = NR_STUN_MSG_BINDING_RESPONSE;
  3249. ASSERT_EQ(0, nr_stun_encode_message(msg));
  3250. TestIncoming(msg->buffer, msg->length, 123, 45, true);
  3251. TestIncomingTcp(msg->buffer, msg->length, true);
  3252. ASSERT_EQ(0, nr_stun_message_destroy(&msg));
  3253. }
  3254. TEST_F(WebRtcIcePacketFilterTest, TestRecvStunPacketWithoutAPendingIdTcpFramed) {
  3255. nr_stun_message *msg;
  3256. ASSERT_EQ(0, nr_stun_build_req_no_auth(NULL, &msg));
  3257. msg->header.id.octet[0] = 1;
  3258. msg->header.type = NR_STUN_MSG_BINDING_REQUEST;
  3259. ASSERT_EQ(0, nr_stun_encode_message(msg));
  3260. TestOutgoingTcpFramed(msg->buffer, msg->length, true);
  3261. msg->header.id.octet[0] = 0;
  3262. msg->header.type = NR_STUN_MSG_BINDING_RESPONSE;
  3263. ASSERT_EQ(0, nr_stun_encode_message(msg));
  3264. TestIncomingTcpFramed(msg->buffer, msg->length, true);
  3265. ASSERT_EQ(0, nr_stun_message_destroy(&msg));
  3266. }
  3267. TEST_F(WebRtcIcePacketFilterTest, TestRecvStunPacketWithoutAPendingAddress) {
  3268. nr_stun_message *msg;
  3269. ASSERT_EQ(0, nr_stun_build_req_no_auth(NULL, &msg));
  3270. msg->header.type = NR_STUN_MSG_BINDING_REQUEST;
  3271. ASSERT_EQ(0, nr_stun_encode_message(msg));
  3272. TestOutgoing(msg->buffer, msg->length, 123, 45, true);
  3273. // nothing to test here for the TCP filter
  3274. msg->header.type = NR_STUN_MSG_BINDING_RESPONSE;
  3275. ASSERT_EQ(0, nr_stun_encode_message(msg));
  3276. TestIncoming(msg->buffer, msg->length, 123, 46, false);
  3277. TestIncoming(msg->buffer, msg->length, 124, 45, false);
  3278. ASSERT_EQ(0, nr_stun_message_destroy(&msg));
  3279. }
  3280. TEST_F(WebRtcIcePacketFilterTest, TestRecvStunPacketWithPendingIdAndAddress) {
  3281. nr_stun_message *msg;
  3282. ASSERT_EQ(0, nr_stun_build_req_no_auth(NULL, &msg));
  3283. msg->header.type = NR_STUN_MSG_BINDING_REQUEST;
  3284. ASSERT_EQ(0, nr_stun_encode_message(msg));
  3285. TestOutgoing(msg->buffer, msg->length, 123, 45, true);
  3286. TestOutgoingTcp(msg->buffer, msg->length, true);
  3287. msg->header.type = NR_STUN_MSG_BINDING_RESPONSE;
  3288. ASSERT_EQ(0, nr_stun_encode_message(msg));
  3289. TestIncoming(msg->buffer, msg->length, 123, 45, true);
  3290. TestIncomingTcp(msg->buffer, msg->length, true);
  3291. // Test whitelist by filtering non-stun packets.
  3292. const unsigned char data[] = "12345abcde";
  3293. // 123:45 is white-listed.
  3294. TestOutgoing(data, sizeof(data), 123, 45, true);
  3295. TestOutgoingTcp(data, sizeof(data), true);
  3296. TestIncoming(data, sizeof(data), 123, 45, true);
  3297. TestIncomingTcp(data, sizeof(data), true);
  3298. // Indications pass as well.
  3299. msg->header.type = NR_STUN_MSG_BINDING_INDICATION;
  3300. ASSERT_EQ(0, nr_stun_encode_message(msg));
  3301. TestOutgoing(msg->buffer, msg->length, 123, 45, true);
  3302. TestOutgoingTcp(msg->buffer, msg->length, true);
  3303. TestIncoming(msg->buffer, msg->length, 123, 45, true);
  3304. TestIncomingTcp(msg->buffer, msg->length, true);
  3305. // Packets from and to other address are still disallowed.
  3306. // Note: this doesn't apply for TCP connections
  3307. TestOutgoing(data, sizeof(data), 123, 46, false);
  3308. TestIncoming(data, sizeof(data), 123, 46, false);
  3309. TestOutgoing(data, sizeof(data), 124, 45, false);
  3310. TestIncoming(data, sizeof(data), 124, 45, false);
  3311. ASSERT_EQ(0, nr_stun_message_destroy(&msg));
  3312. }
  3313. TEST_F(WebRtcIcePacketFilterTest, TestRecvStunPacketWithPendingIdTcpFramed) {
  3314. nr_stun_message *msg;
  3315. ASSERT_EQ(0, nr_stun_build_req_no_auth(NULL, &msg));
  3316. msg->header.type = NR_STUN_MSG_BINDING_REQUEST;
  3317. ASSERT_EQ(0, nr_stun_encode_message(msg));
  3318. TestOutgoingTcpFramed(msg->buffer, msg->length, true);
  3319. msg->header.type = NR_STUN_MSG_BINDING_RESPONSE;
  3320. ASSERT_EQ(0, nr_stun_encode_message(msg));
  3321. TestIncomingTcpFramed(msg->buffer, msg->length, true);
  3322. // Test whitelist by filtering non-stun packets.
  3323. const unsigned char data[] = "12345abcde";
  3324. TestOutgoingTcpFramed(data, sizeof(data), true);
  3325. TestIncomingTcpFramed(data, sizeof(data), true);
  3326. ASSERT_EQ(0, nr_stun_message_destroy(&msg));
  3327. }
  3328. TEST_F(WebRtcIcePacketFilterTest, TestSendNonRequestStunPacket) {
  3329. nr_stun_message *msg;
  3330. ASSERT_EQ(0, nr_stun_build_req_no_auth(NULL, &msg));
  3331. msg->header.type = NR_STUN_MSG_BINDING_RESPONSE;
  3332. ASSERT_EQ(0, nr_stun_encode_message(msg));
  3333. TestOutgoing(msg->buffer, msg->length, 123, 45, false);
  3334. TestOutgoingTcp(msg->buffer, msg->length, false);
  3335. // Send a packet so we allow the incoming request.
  3336. msg->header.type = NR_STUN_MSG_BINDING_REQUEST;
  3337. ASSERT_EQ(0, nr_stun_encode_message(msg));
  3338. TestOutgoing(msg->buffer, msg->length, 123, 45, true);
  3339. TestOutgoingTcp(msg->buffer, msg->length, true);
  3340. // This packet makes us able to send a response.
  3341. msg->header.type = NR_STUN_MSG_BINDING_REQUEST;
  3342. ASSERT_EQ(0, nr_stun_encode_message(msg));
  3343. TestIncoming(msg->buffer, msg->length, 123, 45, true);
  3344. TestIncomingTcp(msg->buffer, msg->length, true);
  3345. msg->header.type = NR_STUN_MSG_BINDING_RESPONSE;
  3346. ASSERT_EQ(0, nr_stun_encode_message(msg));
  3347. TestOutgoing(msg->buffer, msg->length, 123, 45, true);
  3348. TestOutgoingTcp(msg->buffer, msg->length, true);
  3349. ASSERT_EQ(0, nr_stun_message_destroy(&msg));
  3350. }
  3351. TEST_F(WebRtcIcePacketFilterTest, TestRecvDataPacketWithAPendingAddress) {
  3352. nr_stun_message *msg;
  3353. ASSERT_EQ(0, nr_stun_build_req_no_auth(NULL, &msg));
  3354. msg->header.type = NR_STUN_MSG_BINDING_REQUEST;
  3355. ASSERT_EQ(0, nr_stun_encode_message(msg));
  3356. TestOutgoing(msg->buffer, msg->length, 123, 45, true);
  3357. TestOutgoingTcp(msg->buffer, msg->length, true);
  3358. const unsigned char data[] = "12345abcde";
  3359. TestIncoming(data, sizeof(data), 123, 45, true);
  3360. TestIncomingTcp(data, sizeof(data), true);
  3361. ASSERT_EQ(0, nr_stun_message_destroy(&msg));
  3362. }
  3363. TEST(WebRtcIceInternalsTest, TestAddBogusAttribute) {
  3364. nr_stun_message *req;
  3365. ASSERT_EQ(0, nr_stun_message_create(&req));
  3366. Data *data;
  3367. ASSERT_EQ(0, r_data_alloc(&data, 3000));
  3368. memset(data->data, 'A', data->len);
  3369. ASSERT_TRUE(nr_stun_message_add_message_integrity_attribute(req, data));
  3370. ASSERT_EQ(0, r_data_destroy(&data));
  3371. ASSERT_EQ(0, nr_stun_message_destroy(&req));
  3372. }