package Ġcom . web performance . m use . measure ments . steps Ċ Ċ import Ġcom . web performance . m use . measure ments . Measurement Ċ import Ġcom . web performance . m use . measure ments . Measure ments Ċ import Ġcom . web performance . m use . measure ments . Measure ments Producer Ċ import Ġcom . web performance . m use . measure ments . Task Duration Calculator Ċ import Ġcom . web performance . m use . measure ments . containers . Multiple Measurement Ċ import Ġorg . mu set est . core . M use Event Ċ import Ġorg . mu set est . core . M use EventListener Ċ import Ġorg . mu set est . core . M use ExecutionContext Ċ import Ġorg . mu set est . core . context . Ste pped Test ExecutionContext Ċ import Ġorg . mu set est . core . events .* Ċ import Ġorg . mu set est . core . plugins . Generic Configurable Plugin Ċ import Ġorg . mu set est . core . step . Step Configuration Ċ import Ġorg . mu set est . core . step . descriptor . Step Descriptors Ċ import Ġorg . mu set est . core . suite . TestSuite ExecutionContext Ċ import Ġorg . mu set est . core . test . Test Configuration Ċ Ċ /** Ċ Ġ* ĠCollect Ġstep Ġduration Ġmeasurements Ġfor Ġtagged Ġsteps . ĠExpect s Ġto Ġhave Ġthe Ġmeasurements Ġcollected Ġand Ġsent Ġto ĠMeasure ments Consumer ( s ). Ċ Ġ* Ċ Ġ* Ġ@ author ĠCh ristopher ĠL ĠM err ill Ġ( see ĠLICENSE . txt Ġfor Ġlicense Ġdetails ) Ċ Ġ*/ Ċ class ĠStep Duration Producer ( val Ġconfiguration : ĠStep Duration Producer Configuration ) Ġ: ĠGeneric Configurable Plugin ( configuration ), ĠMeasure ments Producer Ċ { Ċ ĉ private Ġval Ġcalculator Ġ= ĠTask Duration Calculator () Ċ ĉ private Ġvar Ġstep _ tag : ĠString ? Ġ= Ġnull Ċ ĉ private Ġvar Ġadd _ test _ id Ġ= Ġfalse Ċ ĉ private Ġvar Ġadd _ status Ġ= Ġfalse Ċ ĉ private Ġvar Ġinitialized Ġ= Ġfalse Ċ ĉ private Ġvar Ġmeasurements Ġ= ĠMultiple Measurement () Ċ ĉ private Ġlateinit Ġvar Ġdescriptors : ĠStep Descriptors Ċ ĉ private Ġlateinit Ġvar Ġsuite _ context Ġ: ĠTest Suite ExecutionContext ĊĉĊ ĉ override Ġfun Ġcondition ally AddTo Context ( context : ĠM use ExecutionContext , Ġautomatic : ĠBoolean ): ĠBoolean Ċ ĉ { Ċĉ ĉ if Ġ(! apply To Context Type ( context )) Ċĉĉ ĉ return Ġfalse Ċĉ ĉ if Ġ( automatic ) Ċĉ ĉ { Ċĉĉ ĉ if Ġ(! apply Autom atically ( context )) Ċĉĉĉ ĉ return Ġfalse Ċĉ ĉ } Ċĉ ĉ if Ġ(! apply To This Test ( context )) Ċĉĉ ĉ return Ġfalse Ċĉĉ ĊĠĠĠĠĠĠĠ Ġcontext . add Plugin ( this ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue Ċ ĉ } ĊĉĊ ĉ override Ġfun Ġapply To Context Type ( context : ĠM use ExecutionContext ?): ĠBoolean Ċ ĉ { Ċĉ ĉ return Ġcontext Ġis ĠTest Suite ExecutionContext Ċ ĉ } ĊĉĊ ĉ override Ġfun Ġinitialize ( context : ĠM use ExecutionContext ) Ċ ĉ { Ċĉ ĉ if Ġ( context Ġ! is ĠTest Suite ExecutionContext ) Ċĉĉ ĉ return ĊĉĉĊĉ ĉ initialized Ġ= Ġtrue Ċĉ ĉ suite _ context Ġ= Ġcontext Ċĉ ĉ step _ tag Ġ= Ġconfiguration . get Step Tag ( context ) Ċĉ ĉ add _ test _ id Ġ= Ġconfiguration . is Add TestId ( context ) Ċĉ ĉ add _ status Ġ= Ġconfiguration . is Add Step Status ( context ) Ċĉ ĉ descriptors Ġ= Ġcontext . getProject (). step Descriptors ĊĊĠĠĠĠĠĠĠ ĠTest Suite EventListener ( context ) Ċ ĉ } ĊĉĊ ĉ @ Synchron ized Ċ ĉ override Ġfun Ġget Measure ments (): ĠMeasure ments Ċ ĉ { Ċĉ ĉ val Ġcollected Ġ= Ġmeasurements Ċĉ ĉ measure ments Ġ= ĠMultiple Measurement () ĊĉĉĊĉ ĉ if Ġ( configuration . is Collect Running Steps ( suite _ context )) Ċĉ ĉ { Ċĉĉ ĉ val Ġtimestamp Ġ= ĠSystem . currentTimeMillis () Ċĉĉ ĉ val Ġcounts Ġ= Ġcalculator . get Running Task Counts () Ċĉĉ ĉ for Ġ( step _ id Ġin Ġcounts . keys ) Ċĉĉĉ ĉ collected . add ( create Measurement ( step _ id , Ġ" running ", Ġcounts . getValue ( step _ id ), Ġtimestamp , Ġnull )) Ċĉĉ ĉ val Ġdur ations Ġ= Ġcalculator . get Running Task Dur ations ( timestamp ) Ċĉĉ ĉ for Ġ( step _ id Ġin Ġdur ations . keys ) Ċĉĉĉ ĉ collected . add ( create Measurement ( step _ id , Ġ" running _ duration ", Ġdur ations . getValue ( step _ id ), Ġtimestamp , Ġnull )) Ċĉ ĉ } ĊĊĉ ĉ return Ġcollected Ċ ĉ } ĊĉĊ ĉ fun Ġprocess Event ( event : ĠM use Event , Ġstep : ĠStep Configuration , Ġcontext _ id : ĠString , Ġtest _ id : ĠString ) Ċ ĉ { Ċĉ ĉ if Ġ( Start Step EventType . TYPE _ ID Ġ== Ġevent . type Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcalculator . record StartTime ( context _ id , Ġstep . step Id . toString (), Ġevent . timestamp ) Ċĉ ĉ else Ġif Ġ( End Step EventType . TYPE _ ID Ġ== Ġevent . type Id ) Ċĉ ĉ { Ċĉĉ ĉ val Ġstep _ id Ġ= Ġstep . step Id . toString () Ċĉĉ ĉ val Ġduration Ġ= Ġcalculator . get Duration ( context _ id , Ġstep _ id , Ġevent . timestamp ) Ċĉĉ ĉ if Ġ( duration Ġ!= Ġnull ) Ċĉĉ ĉ { Ċĉĉĉ ĉ val Ġmeasurement Ġ= Ġcreate Measurement ( step _ id , Ġ" duration ", Ġduration , Ġevent . timestamp , Ġtest _ id ) Ċĉĉĉ ĉ if Ġ( add _ status ) Ċĉĉĉ ĉ { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent . has Tag ( M use Event . FAILURE ) Ġ-> Ġmeasurement . add Metadata ( Measurement . META _ STATUS , ĠFAILURE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent . has Tag ( M use Event . ERROR ) Ġ-> Ġmeasurement . add Metadata ( Measurement . META _ STATUS , ĠERROR ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġmeasurement . add Metadata ( Measurement . META _ STATUS , ĠSUCCESS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċĉĉĉ ĉ } Ċĉĉĉ ĉ measure ments . add ( measurement ) Ċĉĉ ĉ } Ċĉ ĉ } Ċ ĉ } ĊĉĊ ĉ private Ġfun Ġcreate Measurement ( step _ id : ĠString , Ġmeasurement : ĠString , Ġvalue : ĠNumber , Ġtimestamp : ĠLong , Ġtest _ id : ĠString ?): ĠMeasurement Ċ ĉ { Ċĉ ĉ val Ġmeasured Ġ= ĠMeasurement ( value ) Ċĉ ĉ meas ured . add Metadata ( Measurement . META _ SUBJECT , Ġstep _ id ) Ċĉ ĉ meas ured . add Metadata ( Measurement . META _ SUBJECT _ TYPE , ĠSUB JECT _ TYPE ) Ċĉ ĉ meas ured . add Metadata ( Measurement . META _ METRIC , Ġmeasurement ) Ċĉ ĉ meas ured . add Metadata ( Measurement . META _ TIMESTAMP , Ġtimestamp ) Ċĉ ĉ if Ġ( add _ test _ id Ġ&& Ġtest _ id Ġ!= Ġnull ) Ċĉĉ ĉ meas ured . add Metadata ( Measurement . META _ TEST , Ġtest _ id ) Ċĉ ĉ return Ġmeasured Ċ ĉ } ĊĊĠĠĠ Ġinner Ġclass ĠTest Suite EventListener ( val Ġcontext : ĠTest Suite ExecutionContext ) Ġ: ĠM use EventListener ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġinit ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . addEventListener ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġevent Raised ( event : ĠM use Event ) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Start Suite Test EventType . TYPE _ ID Ġ== Ġevent . type Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfig _ var Ġ= ĠStart Suite Test EventType . getConfig Variable Name ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= Ġcontext . get Variable ( config _ var ) Ġas ĠTest Configuration ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtest _ context Ġ= Ġconfig . context () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( test _ context Ġis ĠSte pped Test ExecutionContext ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTest EventListener ( test _ context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( End Suite EventType . TYPE _ ID Ġ== Ġevent . type Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . removeEventListener ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊ ĉ inner Ġclass ĠTest EventListener ( val Ġcontext : ĠSte pped Test ExecutionContext ) Ġ: ĠM use EventListener Ċ ĉ { Ċĉ ĉ init Ġ{ Ċĉĉ ĉ context . addEventListener ( this ) Ċĉ ĉ } ĊĉĉĊĉ ĉ override Ġfun Ġevent Raised ( event : ĠM use Event ) Ċĉ ĉ { Ċĉĉ ĉ if Ġ( End Test EventType . TYPE _ ID Ġ== Ġevent . type Id ) Ċĉĉĉ ĉ context . removeEventListener ( this ) Ċĉĉ ĉ else Ġif Ġ( Start Step EventType . TYPE _ ID Ġ== Ġevent . type Id Ċĉĉĉĉ ĉ || Ġ( End Step EventType . TYPE _ ID Ġ== Ġevent . type Id Ġ&& Ġ! event . has Tag ( Step EventType . IN COMPLETE ))) Ċĉĉ ĉ { Ċĉĉĉ ĉ val Ġstep Ġ= Ġcontext . step Locator . find Step ( Step EventType . get Step Id ( event )) Ċĉĉĉ ĉ if Ġ( step Ġ== Ġnull Ġ|| Ġ( step _ tag Ġ!= Ġnull Ġ&& Ġ! step . has Tag ( step _ tag ))) Ċĉĉĉĉ ĉ return Ċĉĉĉ ĉ process Event ( event , Ġstep , Ġcontext . hashCode (). toString (), Ġcontext . test . id ) Ċĉĉ ĉ } Ċĉ ĉ } Ċ ĉ } ĊĉĊ ĉ comp anion Ġobject Ċ ĉ { Ċĉ ĉ const Ġval ĠSUB JECT _ TYPE Ġ= Ġ" step " Ċĉ ĉ const Ġval ĠFAILURE Ġ= Ġ" failure " Ċĉ ĉ const Ġval ĠERROR Ġ= Ġ" error " Ċĉ ĉ const Ġval ĠSUCCESS Ġ= Ġ" success " Ċ ĉ } Ċ }