/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 8 ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġcom . android . build . gradle . integration . connected . feature Ċ Ċ import Ġcom . android . build . gradle . integration . common . fixture . Gradle Test Project Ċ import Ġcom . android . build . gradle . integration . common . fixture . SUPPORT _ LIB _ VERSION Ċ import Ġcom . android . build . gradle . integration . common . fixture . TEST _ SUPPORT _ LIB _ VERSION Ċ import Ġcom . android . build . gradle . integration . common . fixture . app . Minimal Sub Project Ċ import Ġcom . android . build . gradle . integration . common . fixture . app . Multi Module Test Project Ċ import Ġcom . android . build . gradle . integration . common . fixture . app . Test SourceFile Ċ import Ġcom . android . build . gradle . integration . connected . utils . get Em ulator Ċ import Ġorg . junit . Before Ċ import Ġorg . junit . Class Rule Ċ import Ġorg . junit . Ignore Ċ import Ġorg . junit . Rule Ċ import Ġorg . junit . Test Ċ import Ġjava . io . IOException Ċ Ċ class ĠDynamic Feature Connected Test Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġbuild Ġ= ĠMulti Module Test Project . builder (). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġapp Ġ= ĠMin imal Sub Project . app (" com . example . app ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. appendTo Build ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" android . dynamic Features Ġ= Ġ[ ': dynamic Feature '] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| android . default Config . version Code Ġ= Ġ 4 """. trim Margin () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. with File ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" src / main / java / com / example / app / My Production Class . java ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" package Ġcom . example . app ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| public Ġclass ĠMy Production Class Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġpublic Ġstatic Ġint Ġget Three () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠ Ġreturn Ġ 3 ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġ}; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| } """. trim Margin ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. with File ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" src / main / res / values / strings . xml ", Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|< resources > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġ< string Ġname =" df _ title "> Dynamic ĠFeature ĠTitle </ string > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġ< string Ġname =" app _ title "> App ĠTitle </ string > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| </ resources > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Margin ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ Ġreplace File ( Test SourceFile (" src / main / Android Manifest . xml ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" < manifest Ġxmlns : android =" http :// schemas . android . com / apk / res / android " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠ Ġxmlns : dist =" http :// schemas . android . com / apk / distribution " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠ Ġpackage =" com . example . app "> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġ< dist : module Ġdist : title ="@ string / app _ title "> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġ</ dist : module > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġ< application Ġ/> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| </ manifest > """. trim Margin ())) } ĊĊĠĠĠĠĠĠĠ Ġval Ġdynamic Feature Ġ= ĠMin imal Sub Project . dynamic Feature (" com . example . app . dynamic . feature ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. appendTo Build (" android . default Config . test Instrumentation Runner Ġ' android . support . test . runner . Android JUnit Runner '") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ Ġreplace File ( Test SourceFile (" src / main / Android Manifest . xml ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" < manifest Ġxmlns : android =" http :// schemas . android . com / apk / res / android " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠ Ġxmlns : dist =" http :// schemas . android . com / apk / distribution " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠ Ġpackage =" com . example . app . dynamic . feature "> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġ< dist : module Ġdist : on Demand =" true " Ġdist : title ="@ string / df _ title "> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠ Ġ< dist : f using Ġdist : include =" true " Ġ/> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġ</ dist : module > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġ< application Ġ/> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| </ manifest > """. trim Margin ())) } ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. with File (" src / main / java / com / example / dynamic / feature / Feature Production Class . java ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" package Ġcom . example . dynamic . feature ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| public Ġclass ĠFeature Production Class Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġpublic Ġstatic Ġint Ġget Four () Ġ{ Ġreturn Ġ 4 ; Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| } """. trim Margin ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. with File ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" src / android Test / java / com / example / dynamic / feature / test / My Test . java ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" package Ġcom . example . dynamic . feature . test ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| import Ġandroid . support . test . runner . Android JUnit 4 ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| import Ġcom . example . app . My Production Class ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| import Ġcom . example . dynamic . feature . Feature Production Class ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| import Ġorg . junit . Assert ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| import Ġorg . junit . Test ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| import Ġorg . junit . internal . runners . JUnit 4 Class Runner ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| import Ġorg . junit . runner . RunWith ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| import Ġorg . junit . runners . Block JUnit 4 Class Runner ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| @ RunWith ( Android JUnit 4 . class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| public Ġclass ĠMy Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġpublic Ġvoid Ġuse Base Class () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠ Ġ// ĠCheck Ġboth Ġcompiles Ġand Ġruns Ġagainst Ġa Ġproduction Ġclass Ġin ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠ Ġ// Ġthe Ġbase Ġfeature ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠ ĠAssert . assertEquals ( 3 , ĠMy Production Class . get Three ()); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġpublic Ġvoid Ġuse Feature Class () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠ Ġ// ĠCheck Ġboth Ġcompiles Ġand Ġruns Ġagainst Ġa Ġproduction Ġclass Ġin ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠ Ġ// Ġthis Ġdynamic Ġfeature ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠĠĠĠĠ ĠAssert . assertEquals ( 4 , ĠFeature Production Class . get Four ()); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| } ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Margin ()) ĊĊĠĠĠĠĠĠĠ Ġsub project (": app ", Ġapp ) ĊĠĠĠĠĠĠĠ Ġsub project (": dynamic Feature ", Ġdynamic Feature ) ĊĠĠĠĠĠĠĠ Ġdependency ( dynamic Feature , Ġapp ) ĊĠĠĠĠĠĠĠ Ġandroid Test Dependency ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdynamic Feature , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" com . android . support . test : runner :$ TEST _ SUPPORT _ LIB _ VERSION " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġandroid Test Dependency ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdynamic Feature , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" com . android . support . test : rules :$ TEST _ SUPPORT _ LIB _ VERSION " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġandroid Test Dependency ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdynamic Feature , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" com . android . support : support - annotations :$ SUPPORT _ LIB _ VERSION " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠ Ġ@ get : Rule ĊĠĠĠ Ġval Ġproject Ġ= ĠGradle Test Project . builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. from Test App ( build ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. create () ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Field ĊĠĠĠĠĠĠĠ Ġ@ Class Rule ĊĠĠĠĠĠĠĠ Ġval Ġemulator Ġ= Ġget Em ulator () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Before ĊĠĠĠ Ġ@ Throws ( IOException :: class , ĠInterruptedException :: class ) ĊĠĠĠ Ġfun ĠsetUp () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġfail Ġfast Ġif Ġno Ġresponse ĊĠĠĠĠĠĠĠ Ġproject . add A db Timeout (); ĊĠĠĠĠĠĠĠ Ġ// Ġrun Ġthe Ġuninstall Ġtasks Ġin Ġorder Ġto Ġ( 1 ) Ġmake Ġsure Ġnothing Ġis Ġinstalled Ġat Ġthe Ġbeginning ĊĠĠĠĠĠĠĠ Ġ// Ġof Ġeach Ġtest Ġand Ġ( 2 ) Ġcheck Ġthe Ġa db Ġconnection Ġbefore Ġtaking Ġthe Ġtime Ġto Ġbuild Ġanything . ĊĠĠĠĠĠĠĠ Ġproject . execute (" uninstall All ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Ignore (" b / 1 7 7 3 7 0 2 5 6 ") ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġrun Test In Dynamic Feature () Ġ{ ĊĠĠĠĠĠĠĠ Ġproject . executor (). run (": dynamic Feature : connected Android Test ") ĊĠĠĠ Ġ} Ċ } Ċ