package Ġio . the land scape Ċ Ċ /** Ċ Ġ* ĠCreated Ġby Ġb rian . a . m add en @ gmail . com Ġon Ġ 1 2 / 4 / 1 6 . Ċ Ġ* Ċ Ġ* ĠCopyright Ġ( c ) Ġ< 2 0 1 6 > Ġ< H , Ġl lc > Ċ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ġof Ġthis Ġsoftware Ġand Ġassociated Ċ Ġ* Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ċ Ġ* Ġrights Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ċ Ġ* Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ġall Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe Ċ Ġ* ĠSoftware . Ċ Ġ* Ċ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE Ċ Ġ* ĠWARRANTIES ĠOF ĠMERCHANTABILITY , ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE ĠAUTHORS ĠOR Ċ Ġ* ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR Ċ Ġ* ĠOTHERWISE , ĠARISING ĠFROM , ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN ĠTHE ĠSOFTWARE . Ċ Ġ*/ Ċ Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . mock Ċ import Ġio . the land scape . k rawler . crawler . History . K rawl History Entry Ċ import Ġio . the land scape . k rawler . crawler . History . K rawl History If Ċ import Ġio . the land scape . k rawler . crawler . K rawl Config Ċ import Ġio . the land scape . k rawler . crawler . K rawl Queue . K rawl Queue Entry Ċ import Ġio . the land scape . k rawler . crawler . K rawl Queue . K rawl Queue If Ċ import Ġio . the land scape . k rawler . crawler . K rawler Ċ import Ġio . the land scape . k rawler . http . K rawl Document Ċ import Ġio . the land scape . k rawler . http . K rawl Url Ċ import Ġio . the land scape . k rawler . http . Request Provider If Ċ import Ġio . the land scape . k rawler . robots . Ro bo Min der If Ċ import Ġio . the land scape . k rawler . robots . Robot s Config Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . Global Scope Ċ import Ġkotlinx . coroutines . Job Ċ import Ġkotlinx . coroutines . channels . produce Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġorg . apache . http . client . protocol . HttpClient Context Ċ import Ġorg . junit . Before Ċ import Ġorg . junit . Test Ċ import Ġkotlin . test . assertEquals Ċ import Ġkotlin . test . assertTrue Ċ Ċ class ĠK rawler Test Ġ{ ĊĊĠĠĠ Ġval Ġexample Url Ġ= ĠK rawl Url . new (" http :// www . example . org ") ĊĠĠĠ Ġval Ġmock Config Ġ= ĠK rawl Config ( empty Queue Wait Time Ġ= Ġ 1 , Ġtotal Pages Ġ= Ġ 1 , Ġmax Depth Ġ= Ġ 4 ) ĊĠĠĠ Ġval Ġmock History Ġ= Ġmock < K rawl History If >() ĊĠĠĠ Ġval Ġmock Queue Ġ= ĠlistOf ( mock < K rawl Queue If >()) ĊĠĠĠ Ġval Ġmock Requests Ġ= Ġmock < Request Provider If >() ĊĠĠĠ Ġval Ġmock Job Ġ= ĠJob () ĊĠĠĠ Ġval Ġmock Min der Ġ= Ġmock < Ro bo Min der If >() ĊĠĠĠ Ġval Ġmock Context Ġ= Ġmock < HttpClient Context >() ĊĊĠĠĠ Ġval Ġprepared Response Ġ= ĠK rawl Document ( example Url , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprepare Response ( 2 0 0 , Ġ"< html >< head >< title > Test </ title ></ head >< body >" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"< div >< a Ġhref =\" http :// www . test one . com \"> Test ĠOne </ a >" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"< img Ġsrc =\" img one . jpg \" Ġ/></ div ></ body ></ html > "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmock Context ) ĊĊĠĠĠ Ġclass Ġtest Crawler ( x : ĠK rawl Config , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġw : ĠK rawl History If , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġy : ĠList < K rawl Queue If >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġu : ĠRobot s Config ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv : ĠRequest Provider If , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġz : ĠJob ): ĠK rawler ( x , Ġw , Ġy , Ġu , Ġv , Ġz ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġcapture : ĠMutable List < String > Ġ= Ġmutable ListOf () ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġshould Visit ( url : ĠK rawl Url ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġshould Check ( url : ĠK rawl Url ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit ( url : ĠK rawl Url , Ġdoc : ĠK rawl Document ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcapture . add (" VISIT Ġ- Ġ${ url . raw Url }") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcheck ( url : ĠK rawl Url , ĠstatusCode : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcapture . add (" CHECK Ġ- Ġ${ url . raw Url }") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġtest K rawler Ġ= Ġtest Crawler ( mock Config , Ġmock History , Ġmock Queue , Ġnull , Ġmock Requests , Ġmock Job ) ĊĊĠĠĠ Ġ@ Before Ġfun ĠsetUp () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠMockito . register Instance Creator Ġ{ ĠK rawl Url . new ("") Ġ} ĊĠĠĠĠĠĠĠ Ġtest K rawler . minder Ġ= Ġmock Min der ĊĠĠĠĠĠĠĠ Ġtest K rawler . capture . clear () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠTest Ġthe Ġdo C rawl Ġmethod ĊĠĠĠĠ Ġ*/ ĊĊĠĠĠ Ġ@ Test Ġfun Ġtest Do C rawl () Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġall Three Ġ= ĠGlobal Scope . produce ( Dispatch ers . Default ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( a Ġin ĠlistOf ( K rawler . K rawl Action . No op , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠK rawler . K rawl Action . Visit ( example Url , Ġprepared Response ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠK rawler . K rawl Action . Check ( example Url , Ġprepared Response . statusCode ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend ( a ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtest K rawler . do C rawl ( all Three ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( test K rawler . capture . contains (" VISIT Ġ- Ġhttp :// www . example . org ")) ĊĠĠĠĠĠĠĠ ĠassertTrue ( test K rawler . capture . contains (" CHECK Ġ- Ġhttp :// www . example . org ")) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġtest K rawler . capture . size ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠTODO : ĠAdd Ġthis Ġtest Ġwhen Ġthere Ġis Ġbetter Ġsupport Ġfor Ġcor outines Ġin Ġmock ito ĊĠĠĠ Ġ@ Test Ġfun Ġtest Fetch () Ġ= Ġrun Blocking Ġ{ ĊĊĠĠĠĠĠĠĠ Ġwhenever ( mock Min der . is Safe To Visit ( any ())). thenReturn ( true ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠDepth Ġtests Ġ( max Ġdepth Ġwas Ġset Ġto Ġ 4 ) ĊĠĠĠĠĠĠĠ Ġvar Ġresp Ġ= Ġtest K rawler . fetch ( example Url , Ġ 5 , Ġexample Url ). await () ĊĠĠĠĠĠĠĠ ĠassertTrue Ġ{ Ġresp Ġis ĠK rawler . K rawl Action . No op Ġ} ĊĊĠĠĠĠĠĠĠ Ġresp Ġ= Ġtest K rawler . fetch ( example Url , Ġ 3 , Ġexample Url ). await () ĊĊĠĠĠĠĠĠĠ ĠassertTrue Ġ{ Ġresp Ġis ĠK rawler . K rawl Action . Visit Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġ*/ ĊĊĠĠĠ Ġ@ Test Ġfun Ġtest Har vest Links () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlinks : ĠList < K rawl Queue Entry > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ Ġtest K rawler . har vest Links ( prepared Response , Ġexample Url , ĠK rawl History Entry (), Ġ 0 , Ġ 0 ) Ġ} ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġlinks . size ) ĊĠĠĠĠĠĠĠ Ġval Ġlinks Text Ġ= Ġlinks . map Ġ{ Ġit . url Ġ} ĊĠĠĠĠĠĠĠ ĠassertTrue Ġ{ Ġ" http :// www . test one . com /" Ġin Ġlinks Text Ġ} ĊĠĠĠĠĠĠĠ ĠassertTrue Ġ{ Ġ" http :// www . example . org / img one . jpg " Ġin Ġlinks Text Ġ} ĊĠĠĠ Ġ} Ċ } Ċ