/* Ċ Ġ* ĠUnless Ġexplicitly Ġstated Ġotherwise Ġall Ġfiles Ġin Ġthis Ġrepository Ġare Ġlicensed Ġunder Ġthe ĠApache ĠLicense ĠVersion Ġ 2 . 0 . Ċ Ġ* ĠThis Ġproduct Ġincludes Ġsoftware Ġdeveloped Ġat ĠDat adog Ġ( https :// www . datadog hq . com /). Ċ Ġ* ĠCopyright Ġ 2 0 1 6 - Present ĠDat adog , ĠInc . Ċ Ġ*/ Ċ Ċ package Ġcom . datadog . android . rum . internal . nd k Ċ Ċ import Ġandroid . content . Context Ċ import Ġcom . datadog . android . core . internal . persistence . Data Writer Ċ import Ġcom . datadog . android . core . internal . persistence . Deserializer Ċ import Ġcom . datadog . android . core . model . Network Info Ċ import Ġcom . datadog . android . core . model . UserInfo Ċ import Ġcom . datadog . android . log . Log Attributes Ċ import Ġcom . datadog . android . log . Logger Ċ import Ġcom . datadog . android . log . internal . domain . Log Ċ import Ġcom . datadog . android . log . internal . domain . Log Generator Ċ import Ġcom . datadog . android . log . internal . logger . Log Handler Ċ import Ġcom . datadog . android . rum . R um Error Source Ċ import Ġcom . datadog . android . rum . assertj . Error Event Assert . Companion . assertThat Ċ import Ġcom . datadog . android . rum . internal . domain . event . R um Event Ċ import Ġcom . datadog . android . rum . model . Error Event Ċ import Ġcom . datadog . android . rum . model . View Event Ċ import Ġcom . datadog . android . utils . forge . Configurator Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . argument Captor Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . at Least Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . do Return Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . first Value Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . times Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . verify Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . verify Zero Interactions Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . wh enever Ċ import Ġfr . xg ou chet . el my r . annotation . F org ery Ċ import Ġfr . xg ou chet . el my r . annotation . String F org ery Ċ import Ġfr . xg ou chet . el my r . junit 5 . Forge Configuration Ċ import Ġfr . xg ou chet . el my r . junit 5 . Forge Extension Ċ import Ġjava . io . File Ċ import Ġjava . util . Locale Ċ import Ġjava . util . concurrent . ExecutorService Ċ import Ġorg . assertj . core . api . Assertions . assertThat Ċ import Ġorg . junit . jupiter . api . BeforeEach Ċ import Ġorg . junit . jupiter . api . Test Ċ import Ġorg . junit . jupiter . api . extension . Extend With Ċ import Ġorg . junit . jupiter . api . extension . Extensions Ċ import Ġorg . junit . jupiter . api . io . TempDir Ċ import Ġorg . mockito . Argument Captor Ċ import Ġorg . mockito . Captor Ċ import Ġorg . mockito . Mock Ċ import Ġorg . mockito . junit . jupiter . Mockito Extension Ċ import Ġorg . mockito . junit . jupiter . Mockito Settings Ċ import Ġorg . mockito . quality . Strict ness Ċ Ċ @ Extensions ( ĊĠĠĠ ĠExtend With ( Mockito Extension :: class ), ĊĠĠĠ ĠExtend With ( Forge Extension :: class ) Ċ ) Ċ @ Mockito Settings ( strict ness Ġ= ĠStrict ness . LEN IENT ) Ċ @ Forge Configuration ( Configurator :: class ) Ċ internal Ġclass ĠDat adog N dk Crash Handler Test Ġ{ ĊĊĠĠĠ Ġlateinit Ġvar Ġtested Handler : ĠDat adog N dk Crash Handler ĊĊĠĠĠ Ġ@ TempDir ĊĠĠĠ Ġlateinit Ġvar Ġfake Files Dir : ĠFile ĊĊĠĠĠ Ġ@ Mock ĊĠĠĠ Ġlateinit Ġvar Ġmock Context : ĠContext ĊĊĠĠĠ Ġ@ Mock ĊĠĠĠ Ġlateinit Ġvar Ġmock ExecutorService : ĠExecutor Service ĊĊĠĠĠ Ġ@ Mock ĊĠĠĠ Ġlateinit Ġvar Ġmock Log Generator : ĠLog Generator ĊĊĠĠĠ Ġ@ Mock ĊĠĠĠ Ġlateinit Ġvar Ġmock N dk Crash Log Deserializer : ĠDeserial izer < N dk Crash Log > ĊĊĠĠĠ Ġ@ Mock ĊĠĠĠ Ġlateinit Ġvar Ġmock R um Event Deserializer : ĠDeserial izer < R um Event > ĊĊĠĠĠ Ġ@ Mock ĊĠĠĠ Ġlateinit Ġvar Ġmock Network Info Deserializer : ĠDeserial izer < Network Info > ĊĊĠĠĠ Ġ@ Mock ĊĠĠĠ Ġlateinit Ġvar Ġmock UserInfo Deserializer : ĠDeserial izer < UserInfo > ĊĊĠĠĠ Ġ@ Mock ĊĠĠĠ Ġlateinit Ġvar Ġmock Log Writer : ĠData Writer < Log > ĊĊĠĠĠ Ġ@ Mock ĊĠĠĠ Ġlateinit Ġvar Ġmock R um Writer : ĠData Writer < R um Event > ĊĊĠĠĠ Ġ@ Mock ĊĠĠĠ Ġlateinit Ġvar Ġmock Log Handler : ĠLog Handler ĊĊĠĠĠ Ġlateinit Ġvar Ġfake N dk Files Dir : ĠFile ĊĊĠĠĠ Ġ@ F org ery ĊĠĠĠ Ġlateinit Ġvar Ġfake Log : ĠLog ĊĊĠĠĠ Ġ@ Captor ĊĠĠĠ Ġlateinit Ġvar Ġcapture Runnable : ĠArgument Captor < Runnable > ĊĊĠĠĠ Ġ@ BeforeEach ĊĠĠĠ Ġfun Ġ` set Ġup `() Ġ{ ĊĠĠĠĠĠĠĠ Ġwhenever ( mock Context . files Dir ) Ġdo Return Ġfake Files Dir ĊĠĠĠĠĠĠĠ Ġfake N dk Files Dir Ġ= ĠFile ( fake Files Dir , ĠDat adog N dk Crash Handler . N DK _ CR ASH _ REPORT S _ FOLDER _ NAME ) ĊĊĠĠĠĠĠĠĠ Ġtested Handler Ġ= ĠDat adog N dk Crash Handler ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmock Context , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmock ExecutorService , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmock Log Generator , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmock N dk Crash Log Deserializer , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmock R um Event Deserializer , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmock Network Info Deserializer , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmock UserInfo Deserializer , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogger ( mock Log Handler ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` ðĿ ķ Ħ Ġread Ġcrash Ġdata Ġ ðĿ ķ İ Ġprepare Data ()` ( ĊĠĠĠĠĠĠĠ Ġ@ String F org ery Ġcrash Data : ĠString ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠ Ġfake N dk Files Dir . mkdir s () ĊĠĠĠĠĠĠĠ ĠFile ( fake N dk Files Dir , ĠDat adog N dk Crash Handler . CR ASH _ DATA _ FILE _ NAME ). write Text ( crash Data ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠ Ġtested Handler . prepare Data () ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠ ĠassertThat ( tested Handler . last Serialized N dk Crash Log ). isNull () ĊĠĠĠĠĠĠĠ Ġverify ( mock ExecutorService ). submit ( capture Runnable . capture ()) ĊĠĠĠĠĠĠĠ Ġcapture Runnable . first Value . run () ĊĠĠĠĠĠĠĠ ĠassertThat ( tested Handler . last Serialized N dk Crash Log ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. isEqualTo ( crash Data ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` ðĿ ķ Ħ Ġread Ġlast ĠR UM ĠView Ġevent Ġ ðĿ ķ İ Ġprepare Data ()` ( ĊĠĠĠĠĠĠĠ Ġ@ String F org ery Ġr um Event : ĠString ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠ Ġfake N dk Files Dir . mkdir s () ĊĠĠĠĠĠĠĠ ĠFile ( fake N dk Files Dir , ĠDat adog N dk Crash Handler . R UM _ VIEW _ EVENT _ FILE _ NAME ). write Text ( rum Event ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠ Ġtested Handler . prepare Data () ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠ ĠassertThat ( tested Handler . last Serialized R um View Event ). isNull () ĊĠĠĠĠĠĠĠ Ġverify ( mock ExecutorService ). submit ( capture Runnable . capture ()) ĊĠĠĠĠĠĠĠ Ġcapture Runnable . first Value . run () ĊĠĠĠĠĠĠĠ ĠassertThat ( tested Handler . last Serialized R um View Event ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. isEqualTo ( rum Event ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` ðĿ ķ Ħ Ġread Ġnetwork Ġinfo Ġ ðĿ ķ İ Ġprepare Data ()` ( ĊĠĠĠĠĠĠĠ Ġ@ String F org ery Ġnetwork Info : ĠString ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠ Ġfake N dk Files Dir . mkdir s () ĊĠĠĠĠĠĠĠ ĠFile ( fake N dk Files Dir , ĠDat adog N dk Crash Handler . NETWORK _ INFO _ FILE _ NAME ). write Text ( network Info ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠ Ġtested Handler . prepare Data () ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠ ĠassertThat ( tested Handler . last Serialized Network Information ). isNull () ĊĠĠĠĠĠĠĠ Ġverify ( mock ExecutorService ). submit ( capture Runnable . capture ()) ĊĠĠĠĠĠĠĠ Ġcapture Runnable . first Value . run () ĊĠĠĠĠĠĠĠ ĠassertThat ( tested Handler . last Serialized Network Information ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. isEqualTo ( network Info ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` ðĿ ķ Ħ Ġread Ġuser Ġinfo Ġ ðĿ ķ İ Ġprepare Data ()` ( ĊĠĠĠĠĠĠĠ Ġ@ String F org ery ĠuserInfo : ĠString ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠ Ġfake N dk Files Dir . mkdir s () ĊĠĠĠĠĠĠĠ ĠFile ( fake N dk Files Dir , ĠDat adog N dk Crash Handler . USER _ INFO _ FILE _ NAME ). write Text ( userInfo ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠ Ġtested Handler . prepare Data () ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠ ĠassertThat ( tested Handler . last Serialized User Information ). isNull () ĊĠĠĠĠĠĠĠ Ġverify ( mock ExecutorService ). submit ( capture Runnable . capture ()) ĊĠĠĠĠĠĠĠ Ġcapture Runnable . first Value . run () ĊĠĠĠĠĠĠĠ ĠassertThat ( tested Handler . last Serialized User Information ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. isEqualTo ( userInfo ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` ðĿ ķ Ħ Ġdo Ġnothing Ġ ðĿ ķ İ Ġprepare Data Ġ{ directory Ġdoes Ġnot Ġexist }` () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠ Ġtested Handler . prepare Data () ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠ Ġverify ( mock ExecutorService ). submit ( capture Runnable . capture ()) ĊĠĠĠĠĠĠĠ Ġcapture Runnable . first Value . run () ĊĠĠĠĠĠĠĠ ĠassertThat ( tested Handler . last Serialized R um View Event ). isNull () ĊĠĠĠĠĠĠĠ ĠassertThat ( tested Handler . last Serialized N dk Crash Log ). isNull () ĊĠĠĠĠĠĠĠ ĠassertThat ( tested Handler . last Serialized User Information ). isNull () ĊĠĠĠĠĠĠĠ ĠassertThat ( tested Handler . last Serialized Network Information ). isNull () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` ðĿ ķ Ħ Ġdo Ġnothing Ġ ðĿ ķ İ Ġhandle N dk Crash () Ġ{ no Ġcrash Ġdata }` ( ĊĠĠĠĠĠĠĠ Ġ@ String F org ery Ġr um Event : ĠString , ĊĠĠĠĠĠĠĠ Ġ@ String F org ery Ġnetwork Info : ĠString , ĊĠĠĠĠĠĠĠ Ġ@ String F org ery ĠuserInfo : ĠString ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠ Ġfake N dk Files Dir . mkdir s () ĊĠĠĠĠĠĠĠ ĠFile ( fake N dk Files Dir , ĠDat adog N dk Crash Handler . R UM _ VIEW _ EVENT _ FILE _ NAME ). write Text ( rum Event ) ĊĠĠĠĠĠĠĠ ĠFile ( fake N dk Files Dir , ĠDat adog N dk Crash Handler . NETWORK _ INFO _ FILE _ NAME ). write Text ( network Info ) ĊĠĠĠĠĠĠĠ ĠFile ( fake N dk Files Dir , ĠDat adog N dk Crash Handler . USER _ INFO _ FILE _ NAME ). write Text ( userInfo ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠ Ġtested Handler . handle N dk Crash ( mock Log Writer , Ġmock R um Writer ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠ Ġverify ( mock ExecutorService ). submit ( capture Runnable . capture ()) ĊĠĠĠĠĠĠĠ Ġcapture Runnable . first Value . run () ĊĠĠĠĠĠĠĠ Ġverify Zero Interactions ( mock Log Writer , Ġmock R um Writer ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` ðĿ ķ Ħ Ġdo Ġnothing Ġ ðĿ ķ İ Ġhandle N dk Crash () Ġ{ crash Ġdata Ġcan 't Ġbe Ġdeserialized }` ( ĊĠĠĠĠĠĠĠ Ġ@ String F org ery Ġcrash Data : ĠString , ĊĠĠĠĠĠĠĠ Ġ@ String F org ery Ġr um Event : ĠString , ĊĠĠĠĠĠĠĠ Ġ@ String F org ery Ġnetwork Info : ĠString , ĊĠĠĠĠĠĠĠ Ġ@ String F org ery ĠuserInfo : ĠString ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠ Ġfake N dk Files Dir . mkdir s () ĊĠĠĠĠĠĠĠ ĠFile ( fake N dk Files Dir , ĠDat adog N dk Crash Handler . R UM _ VIEW _ EVENT _ FILE _ NAME ). write Text ( rum Event ) ĊĠĠĠĠĠĠĠ ĠFile ( fake N dk Files Dir , ĠDat adog N dk Crash Handler . NETWORK _ INFO _ FILE _ NAME ). write Text ( network Info ) ĊĠĠĠĠĠĠĠ ĠFile ( fake N dk Files Dir , ĠDat adog N dk Crash Handler . USER _ INFO _ FILE _ NAME ). write Text ( userInfo ) ĊĠĠĠĠĠĠĠ ĠFile ( fake N dk Files Dir , ĠDat adog N dk Crash Handler . CR ASH _ DATA _ FILE _ NAME ). write Text ( crash Data ) ĊĠĠĠĠĠĠĠ Ġwhenever ( mock N dk Crash Log Deserializer . deserialize ( crash Data )) Ġdo Return Ġnull ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠ Ġtested Handler . handle N dk Crash ( mock Log Writer , Ġmock R um Writer ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠ Ġverify ( mock ExecutorService ). submit ( capture Runnable . capture ()) ĊĠĠĠĠĠĠĠ Ġcapture Runnable . first Value . run () ĊĠĠĠĠĠĠĠ Ġverify Zero Interactions ( mock Log Writer , Ġmock R um Writer , Ġmock Log Handler ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` ðĿ ķ Ħ Ġsend Ġlog Ġ ðĿ ķ İ Ġhandle N dk Crash () Ġ{ missing ĠR UM Ġlast Ġview , Ġno Ġinfo }` ( ĊĠĠĠĠĠĠĠ Ġ@ String F org ery Ġcrash Data : ĠString , ĊĠĠĠĠĠĠĠ Ġ@ F org ery Ġn dk Crash Log : ĠN dk Crash Log ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠ Ġtested Handler . last Serialized N dk Crash Log Ġ= Ġcrash Data ĊĠĠĠĠĠĠĠ Ġwhenever ( mock N dk Crash Log Deserializer . deserialize ( crash Data )) Ġdo Return Ġn dk Crash Log ĊĠĠĠĠĠĠĠ Ġstub Log Generator ( nd k Crash Log , Ġnull , Ġnull , Ġnull ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠ Ġtested Handler . handle N dk Crash ( mock Log Writer , Ġmock R um Writer ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠ Ġverify ( mock ExecutorService ). submit ( capture Runnable . capture ()) ĊĠĠĠĠĠĠĠ Ġverify Zero Interactions ( mock Log Writer ) ĊĠĠĠĠĠĠĠ Ġcapture Runnable . first Value . run () ĊĠĠĠĠĠĠĠ Ġverify ( mock Log Writer ). write ( fake Log ) ĊĠĠĠĠĠĠĠ Ġverify Zero Interactions ( mock R um Writer , Ġmock Log Handler ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` ðĿ ķ Ħ Ġsend Ġlog Ġ ðĿ ķ İ Ġhandle N dk Crash () Ġ{ missing ĠR UM Ġlast Ġview , Ġwith Ġinfo }` ( ĊĠĠĠĠĠĠĠ Ġ@ String F org ery Ġcrash Data : ĠString , ĊĠĠĠĠĠĠĠ Ġ@ String F org ery Ġnetwork Info Str : ĠString , ĊĠĠĠĠĠĠĠ Ġ@ String F org ery ĠuserInfo Str : ĠString , ĊĠĠĠĠĠĠĠ Ġ@ F org ery Ġn dk Crash Log : ĠN dk Crash Log , ĊĠĠĠĠĠĠĠ Ġ@ F org ery Ġnetwork Info : ĠNetwork Info , ĊĠĠĠĠĠĠĠ Ġ@ F org ery ĠuserInfo : ĠUserInfo ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠ Ġtested Handler . last Serialized N dk Crash Log Ġ= Ġcrash Data ĊĠĠĠĠĠĠĠ Ġtested Handler . last Serialized Network Information Ġ= Ġnetwork Info Str ĊĠĠĠĠĠĠĠ Ġtested Handler . last Serialized User Information Ġ= ĠuserInfo Str ĊĠĠĠĠĠĠĠ Ġwhenever ( mock N dk Crash Log Deserializer . deserialize ( crash Data )) Ġdo Return Ġn dk Crash Log ĊĠĠĠĠĠĠĠ Ġwhenever ( mock Network Info Deserializer . deserialize ( network Info Str )) Ġdo Return Ġnetwork Info ĊĠĠĠĠĠĠĠ Ġwhenever ( mock UserInfo Deserializer . deserialize ( userInfo Str )) Ġdo Return ĠuserInfo ĊĠĠĠĠĠĠĠ Ġstub Log Generator ( nd k Crash Log , Ġnetwork Info , ĠuserInfo , Ġnull ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠ Ġtested Handler . handle N dk Crash ( mock Log Writer , Ġmock R um Writer ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠ Ġverify ( mock ExecutorService ). submit ( capture Runnable . capture ()) ĊĠĠĠĠĠĠĠ Ġverify Zero Interactions ( mock Log Writer ) ĊĠĠĠĠĠĠĠ Ġcapture Runnable . first Value . run () ĊĠĠĠĠĠĠĠ Ġverify ( mock Log Writer ). write ( fake Log ) ĊĠĠĠĠĠĠĠ Ġverify Zero Interactions ( mock R um Writer , Ġmock Log Handler ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` ðĿ ķ Ħ Ġsend Ġlog Ġ ðĿ ķ İ Ġhandle N dk Crash () Ġ{ missing ĠR UM Ġlast Ġview , Ġcorrupted Ġinfo }` ( ĊĠĠĠĠĠĠĠ Ġ@ String F org ery Ġcrash Data : ĠString , ĊĠĠĠĠĠĠĠ Ġ@ String F org ery Ġnetwork Info Str : ĠString , ĊĠĠĠĠĠĠĠ Ġ@ String F org ery ĠuserInfo Str : ĠString , ĊĠĠĠĠĠĠĠ Ġ@ F org ery Ġn dk Crash Log : ĠN dk Crash Log ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠ Ġtested Handler . last Serialized N dk Crash Log Ġ= Ġcrash Data ĊĠĠĠĠĠĠĠ Ġtested Handler . last Serialized Network Information Ġ= Ġnetwork Info Str ĊĠĠĠĠĠĠĠ Ġtested Handler . last Serialized User Information Ġ= ĠuserInfo Str ĊĠĠĠĠĠĠĠ Ġwhenever ( mock N dk Crash Log Deserializer . deserialize ( crash Data )) Ġdo Return Ġn dk Crash Log ĊĠĠĠĠĠĠĠ Ġwhenever ( mock Network Info Deserializer . deserialize ( network Info Str )) Ġdo Return Ġnull ĊĠĠĠĠĠĠĠ Ġwhenever ( mock UserInfo Deserializer . deserialize ( userInfo Str )) Ġdo Return Ġnull ĊĠĠĠĠĠĠĠ Ġstub Log Generator ( nd k Crash Log , Ġnull , Ġnull , Ġnull ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠ Ġtested Handler . handle N dk Crash ( mock Log Writer , Ġmock R um Writer ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠ Ġverify ( mock ExecutorService ). submit ( capture Runnable . capture ()) ĊĠĠĠĠĠĠĠ Ġverify Zero Interactions ( mock Log Writer ) ĊĠĠĠĠĠĠĠ Ġcapture Runnable . first Value . run () ĊĠĠĠĠĠĠĠ Ġverify ( mock Log Writer ). write ( fake Log ) ĊĠĠĠĠĠĠĠ Ġverify Zero Interactions ( mock R um Writer , Ġmock Log Handler ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` ðĿ ķ Ħ Ġsend Ġlog Ġ ðĿ ķ İ Ġhandle N dk Crash () Ġ{ with ĠR UM Ġlast Ġview }` ( ĊĠĠĠĠĠĠĠ Ġ@ String F org ery Ġcrash Data : ĠString , ĊĠĠĠĠĠĠĠ Ġ@ String F org ery Ġr um Event Str : ĠString , ĊĠĠĠĠĠĠĠ Ġ@ F org ery Ġn dk Crash Log : ĠN dk Crash Log , ĊĠĠĠĠĠĠĠ Ġ@ F org ery Ġr um Event : ĠR um Event , ĊĠĠĠĠĠĠĠ Ġ@ F org ery Ġr um View Event : ĠView Event ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠĠĠ Ġtested Handler . last Serialized N dk Crash Log Ġ= Ġcrash Data ĊĠĠĠĠĠĠĠ Ġtested Handler . last Serialized R um View Event Ġ= Ġr um Event Str ĊĠĠĠĠĠĠĠ Ġwhenever ( mock N dk Crash Log Deserializer . deserialize ( crash Data )) Ġdo Return Ġn dk Crash Log ĊĠĠĠĠĠĠĠ Ġwhenever ( mock R um Event Deserializer . deserialize ( rum Event Str )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. do Return ( rum Event . copy ( event Ġ= Ġr um View Event )) ĊĠĠĠĠĠĠĠ Ġstub Log Generator ( nd k Crash Log , Ġnull , Ġnull , Ġr um View Event ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠĠĠ Ġtested Handler . handle N dk Crash ( mock Log Writer , Ġmock R um Writer ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠĠĠ Ġverify ( mock ExecutorService ). submit ( capture Runnable . capture ()) ĊĠĠĠĠĠĠĠ Ġverify Zero Interactions ( mock Log Writer ) ĊĠĠĠĠĠĠĠ Ġcapture Runnable . first Value . run () ĊĠĠĠĠĠĠĠ Ġargument Captor < R um Event > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( mock R um Writer , Ġat Least ( 1 )). write ( capture ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( first Value . event Ġas ĠError Event ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. has Application Id ( rum View Event . application . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. has SessionId ( rum View Event . session . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. has View ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġr um View Event . view . id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġr um View Event . view . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġr um View Event . view . url ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. has Message ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDat adog N dk Crash Handler . LOG _ CR ASH _ MSG . format ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLocale . US , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġn dk Crash Log . signal Name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. has StackTrace ( nd k Crash Log . stack trace ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. is Crash ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. has Source ( R um Error Source . SOURCE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. has Timestamp ( nd k Crash Log . timestamp ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. has UserInfo ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUserInfo ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġr um View Event . usr ?. id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġr um View Event . usr ?. name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġr um View Event . usr ?. email ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. has ErrorType ( nd k Crash Log . signal Name ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġverify ( mock Log Writer ). write ( fake Log ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġregion ĠInternal ĊĊĠĠĠ Ġprivate Ġfun Ġstub Log Generator ( ĊĠĠĠĠĠĠĠ Ġn dk Crash Log : ĠN dk Crash Log , ĊĠĠĠĠĠĠĠ Ġnetwork Info : ĠNetwork Info ?, ĊĠĠĠĠĠĠĠ ĠuserInfo : ĠUserInfo ?, ĊĠĠĠĠĠĠĠ Ġr um View Event : ĠView Event ? Ġ= Ġnull ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġattributes Ġ= Ġif Ġ( rum View Event Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog Attributes . ERROR _ STACK Ġto Ġn dk Crash Log . stack trace ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog Attributes . R UM _ VIEW _ ID Ġto Ġr um View Event . view . id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog Attributes . R UM _ SESSION _ ID Ġto Ġr um View Event . session . id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog Attributes . R UM _ APPLICATION _ ID Ġto Ġr um View Event . application . id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog Attributes . ERROR _ STACK Ġto Ġn dk Crash Log . stack trace ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġwhenever ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmock Log Generator . generate Log ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . CR ASH , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDat adog N dk Crash Handler . LOG _ CR ASH _ MSG . format ( Locale . US , Ġn dk Crash Log . signal Name ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrowable Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattributes Ġ= Ġattributes , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtags Ġ= Ġempty Set (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimestamp Ġ= Ġn dk Crash Log . timestamp , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthread Name Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbundle With Tr aces Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbundle With R um Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnetwork Info Ġ= Ġnetwork Info , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠuserInfo Ġ= ĠuserInfo ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) Ġdo Return Ġfake Log ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġend region Ċ } Ċ