package Ġorg . jetbrains . kotlin . gradle . plugin Ċ Ċ import Ġorg . gradle . api . Project Ċ import Ġorg . gradle . api . invocation . Gradle Ċ import Ġorg . gradle . api . logging . Logging Ċ import Ġorg . junit . Assert Ċ import Ġjava . util . HashSet Ċ Ċ public Ġclass ĠThread Tracker Ġ{ ĊĠĠĠ Ġval Ġlog Ġ= ĠLogging . getLogger ( this . java Class ) ĊĠĠĠ Ġprivate Ġvar Ġbefore : ĠCollection < Thread >? Ġ= Ġget Threads () ĊĊĠĠĠ Ġprivate Ġfun Ġget Threads (): ĠCollection < Thread > Ġ= ĠThread . getAll Stack Tr aces (). keySet () ĊĊĠĠĠ Ġpublic Ġfun Ġcheck Thread Leak ( gradle : ĠGradle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtest Threads Ġ= Ġgradle Ġ!= Ġnull Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgradle . getRoot Project (). has Property (" kotlin . gradle . test ") Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! gradle . getRoot Project (). has Property (" kotlin . gradle . no Thread Test ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠThread . sleep ( if Ġ( test Threads ) Ġ 2 0 0 L Ġelse Ġ 5 0 L ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġafter Ġ= ĠHashSet ( get Threads ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġafter . removeAll ( before !! ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( thread Ġin Ġafter ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( thread Ġ== ĠThread . currentThread ()) Ġcontinue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġthread . getName () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( test Threads ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Thread Ġle aked : Ġ$ thread : Ġ$ name \ n Ġ${ thread . get StackTrace (). join ToString ( separator Ġ= Ġ"\ n ", Ġprefix Ġ= Ġ" Ġat Ġ" )} ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info (" Thread Ġle aked : Ġ$ thread : Ġ$ name ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbefore Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }