/* Ċ Ġ* Ġ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 . internal . dependency Ċ Ċ import Ġcom . android . build . gradle . internal . fixtures . Fake Configurable File Collection Ċ import Ġcom . android . build . gradle . internal . fixtures . Fake Gradle Directory Ċ import Ġcom . android . build . gradle . internal . fixtures . Fake Gradle Property Ċ import Ġcom . android . build . gradle . internal . fixtures . Fake Gradle Provider Ċ import Ġcom . android . build . gradle . internal . fixtures . Fake Gradle Regular File Ċ import Ġcom . android . build . gradle . internal . fixtures . Fake Transform Outputs Ċ import Ġcom . android . build . gradle . internal . transforms . testdata . Animal Ċ import Ġcom . android . build . gradle . internal . transforms . testdata . Carbon Form Ċ import Ġcom . android . build . gradle . internal . transforms . testdata . Cat Ċ import Ġcom . android . build . gradle . internal . transforms . testdata . To y Ċ import Ġcom . android . build . gradle . options . Sync Options Ċ import Ġcom . android . test utils . Test Classes Generator Ċ import Ġcom . android . test utils . Test Inputs Generator Ċ import Ġcom . android . test utils . apk . Dex Ċ import Ġcom . android . test utils . truth . Dex Subject . assertThat Ċ import Ġcom . android . test utils . truth . More Truth . assertThat Dex Ċ import Ġcom . google . common . truth . Truth . assertThat Ċ import Ġorg . gradle . api . file . FileSystem Location Ċ import Ġorg . gradle . api . provider . Property Ċ import Ġorg . gradle . api . provider . Provider Ċ import Ġorg . junit . Rule Ċ import Ġorg . junit . Test Ċ import Ġorg . junit . rules . Temporary Folder Ċ import Ġorg . object web . asm . Type Ċ import Ġjava . io . File Ċ import Ġjava . util . zip . Zip Entry Ċ import Ġjava . util . zip . Zip OutputStream Ċ import Ġkotlin . math . pow Ċ Ċ /** ĠTests Ġfor Ġde xing Ġartifact Ġtransform . Ġ*/ Ċ class ĠDex ing Transform Test Ġ{ ĊĊĠĠĠ Ġ@ Rule ĊĠĠĠ Ġ@ Jvm Field ĊĠĠĠ Ġval Ġtmp Ġ= ĠTemporary Folder () ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Dex ing Jar () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinput Ġ= Ġtmp . new File (" classes . jar ") ĊĠĠĠĠĠĠĠ Ġval Ġde xing Transform Ġ= ĠTest Dex ing Transform ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFake Gradle Provider ( Fake Gradle Regular File ( input )), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparameters Ġ= ĠTest Dex ing Transform . Test Parameters ( 1 2 , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġoutputs Ġ= ĠFake Transform Outputs ( tmp ) ĊĠĠĠĠĠĠĠ ĠTest Inputs Generator . jar With Empty Classes ( input . to Path (), ĠlistOf (" test / A ")) ĊĠĠĠĠĠĠĠ Ġde xing Transform . transform ( outputs ) ĊĠĠĠĠĠĠĠ ĠassertThat Dex ( outputs . output Directory . resolve (" classes . dex ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. contains Exactly Classes In ( listOf (" L test / A ; ")) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Dex ing Dir () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinput Ġ= Ġtmp . new Folder (" classes ") ĊĠĠĠĠĠĠĠ Ġval Ġde xing Transform Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTest Dex ing Transform ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFake Gradle Provider ( Fake Gradle Directory ( input )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameters Ġ= ĠTest Dex ing Transform . Test Parameters ( 1 2 , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġoutputs Ġ= ĠFake Transform Outputs ( tmp ) ĊĊĠĠĠĠĠĠĠ ĠTest Inputs Generator . dir With Empty Classes ( input . to Path (), ĠlistOf (" test / A ")) ĊĠĠĠĠĠĠĠ Ġde xing Transform . transform ( outputs ) ĊĠĠĠĠĠĠĠ ĠassertThat Dex ( outputs . output Directory . resolve (" classes . dex ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. contains Exactly Classes In ( listOf (" L test / A ; ")) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Dex ing Big Jar () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmethods Per Class Ġ= Ġ 2 0 0 ĊĠĠĠĠĠĠĠ Ġ// Ġmore Ġthan Ġ 6 4 K Ġmethods ĊĠĠĠĠĠĠĠ Ġval Ġtotal Methods Ġ= Ġ( 2 . 0 . pow ( 1 6 ) Ġ+ Ġmethods Per Class ). toInt () ĊĊĠĠĠĠĠĠĠ Ġval Ġinput Ġ= Ġtmp . new File (" classes . jar ") ĊĠĠĠĠĠĠĠ ĠZip OutputStream ( input . output Stream ()). use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġ( total Methods Ġ/ Ġmethods Per Class )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmethod Names Ġ= Ġ( 0 Ġuntil Ġmethods Per Class ). map Ġ{ Ġ" foo $ it : () V " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclass Content Ġ= ĠTest Classes Generator . class With Empty Methods ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" test / A $ i ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* method Names . to Typed Array () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . put Next Entry ( Zip Entry (" test / A $ i . class ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . write ( class Content ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . close Entry () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġtransform Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTest Dex ing Transform ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFake Gradle Provider ( Fake Gradle Regular File ( input )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameters Ġ= ĠTest Dex ing Transform . Test Parameters ( 1 2 , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġoutputs Ġ= ĠFake Transform Outputs ( tmp ) ĊĠĠĠĠĠĠĠ Ġtransform . transform ( outputs ) ĊĊĠĠĠĠĠĠĠ ĠassertThat ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDex ( outputs . output Directory . resolve (" classes . dex ")). classes . size Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDex ( outputs . output Directory . resolve (" classes 2 . dex ")). classes . size ĊĠĠĠĠĠĠĠ Ġ). isEqualTo ( total Methods Ġ/ Ġmethods Per Class ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Dex ing With Des ug aring () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinput Ġ= Ġtmp . new Folder (" classes ") ĊĠĠĠĠĠĠĠ Ġval Ġclasses Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( Animal :: class . java , ĠCarbon Form :: class . java , ĠTo y :: class . java , ĠCat :: class . java ) ĊĠĠĠĠĠĠĠ ĠTest Inputs Generator . path With Classes ( input . to Path (), Ġclasses ) ĊĠĠĠĠĠĠĠ Ġval Ġde xing Transform Ġ= ĠTest Dex ing Transform ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFake Gradle Provider ( Fake Gradle Directory ( input )), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclasspath Ġ= ĠlistOf (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparameters Ġ= ĠTest Dex ing Transform . Test Parameters ( 1 2 , Ġtrue , ĠlistOf (), Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġoutputs Ġ= ĠFake Transform Outputs ( tmp ) ĊĠĠĠĠĠĠĠ Ġde xing Transform . transform ( outputs ) ĊĠĠĠĠĠĠĠ Ġval Ġdex Ġ= ĠDex ( outputs . output Directory . resolve (" classes . dex ")) ĊĠĠĠĠĠĠĠ ĠassertThat ( dex ). contains Classes In ( classes . map Ġ{ ĠType . get Descriptor ( it ) Ġ}) ĊĠĠĠĠĠĠĠ ĠassertThat ( dex . classes ). has Size ( classes . size Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġsynt hesized L amb das Ġ= Ġdex . classes . keys . filter Ġ{ Ġit . contains ("\ $\ $ Lambda \$ ") Ġ} ĊĠĠĠĠĠĠĠ ĠassertThat ( synt hesized L amb das ). has Size ( 1 ) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Dex ing With Des ug aring Boot classpath () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġboot classpath Ġ= Ġtmp . new File (" boot classpath . jar ") ĊĠĠĠĠĠĠĠ ĠTest Inputs Generator . path With Classes ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġboot classpath . to Path (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( Animal :: class . java , ĠCarbon Form :: class . java , ĠTo y :: class . java ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġinput Ġ= Ġtmp . new File (" classes . jar ") ĊĠĠĠĠĠĠĠ Ġval Ġclasses Ġ= ĠlistOf ( Cat :: class . java ) ĊĠĠĠĠĠĠĠ ĠTest Inputs Generator . path With Classes ( input . to Path (), Ġclasses ) ĊĠĠĠĠĠĠĠ Ġval Ġde xing Transform Ġ= ĠTest Dex ing Transform ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFake Gradle Provider ( Fake Gradle Regular File ( input )), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclasspath Ġ= ĠlistOf (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparameters Ġ= ĠTest Dex ing Transform . Test Parameters ( 1 2 , Ġtrue , ĠlistOf ( boot classpath ), Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġoutputs Ġ= ĠFake Transform Outputs ( tmp ) ĊĠĠĠĠĠĠĠ Ġde xing Transform . transform ( outputs ) ĊĊĠĠĠĠĠĠĠ Ġval Ġdex Ġ= ĠDex ( outputs . output Directory . resolve (" classes . dex ")) ĊĠĠĠĠĠĠĠ ĠassertThat ( dex ). contains Classes In ( classes . map Ġ{ ĠType . get Descriptor ( it ) Ġ}) ĊĠĠĠĠĠĠĠ ĠassertThat ( dex . classes ). has Size ( classes . size Ġ+ Ġ 1 ) ĊĊĠĠĠĠĠĠĠ Ġval Ġsynt hesized L amb das Ġ= Ġdex . classes . keys . filter Ġ{ Ġit . contains ("\ $\ $ Lambda \$ ") Ġ} ĊĠĠĠĠĠĠĠ ĠassertThat ( synt hesized L amb das ). has Size ( 1 ) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠTest Dex ing Transform ( ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġprimary Input : ĠProvider < FileSystem Location >, ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġparameters : ĠTest Parameters , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġclasspath : ĠList < File > Ġ= ĠlistOf () ĊĠĠĠ Ġ) Ġ: ĠBase Dex ing Transform () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcompute Classpath Files () Ġ= Ġclasspath . map ( File :: to Path ) ĊĊĠĠĠĠĠĠĠ Ġclass ĠTest Parameters ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmin Sdk Version : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdebug gable : ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġboot Classpath : ĠList < File > Ġ= ĠlistOf (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdes ug aring : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror Format : ĠSync Options . Error Format Mode Ġ= ĠSync Options . Error Format Mode . MACHINE _ PAR S ABLE ĊĠĠĠĠĠĠĠ Ġ) Ġ: ĠBase Dex ing Transform . Parameters Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġvar ĠprojectName Ġ= ĠFake Gradle Property (": test ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġvar Ġdebug gable Ġ= ĠFake Gradle Property ( debug gable ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġmin Sdk Version Ġ= ĠFake Gradle Property ( min Sdk Version ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġboot Classpath Ġ= ĠFake Configurable File Collection ( boot Classpath ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġerror Format Ġ= ĠFake Gradle Property ( error Format ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġenable Des ug aring Ġ= ĠFake Gradle Property ( des ug aring ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġlib Configuration : ĠProperty < String > Ġ= ĠFake Gradle Property () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Parameters (): ĠParameters Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġparameters ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} Ċ } Ċ