Skip to content
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,10 @@

package software.aws.toolkits.jetbrains.services.telemetry

import com.intellij.openapi.components.service
import com.intellij.openapi.Disposable
import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.util.Disposer
import com.intellij.testFramework.replaceService
import org.junit.jupiter.api.extension.AfterEachCallback
import org.junit.jupiter.api.extension.BeforeEachCallback
import org.junit.jupiter.api.extension.ExtensionContext
Expand All @@ -13,13 +16,17 @@ import org.mockito.kotlin.spy
import software.amazon.awssdk.services.toolkittelemetry.model.Sentiment
import software.aws.toolkits.core.telemetry.DefaultTelemetryBatcher
import software.aws.toolkits.core.telemetry.MetricEvent
import software.aws.toolkits.core.telemetry.TelemetryBatcher
import software.aws.toolkits.core.telemetry.TelemetryPublisher

class NoOpTelemetryService : TelemetryService(publisher, spy(DefaultTelemetryBatcher(publisher))) {
class NoOpTelemetryService : TelemetryService {
constructor(noOpPublisher: NoOpPublisher, batcher: TelemetryBatcher) : super(noOpPublisher, batcher)
constructor() : this(NO_OP_PUBLISHER, DefaultTelemetryBatcher(NO_OP_PUBLISHER))

fun batcher() = super.batcher

private companion object {
private val publisher: TelemetryPublisher by lazy { NoOpPublisher() }
companion object {
val NO_OP_PUBLISHER = NoOpPublisher()
}
}

Expand All @@ -32,11 +39,21 @@ class NoOpPublisher : TelemetryPublisher {
}

sealed class MockTelemetryServiceBase : ExternalResource() {
private val mockTelemetryService: NoOpTelemetryService
get() = service<TelemetryService>() as NoOpTelemetryService
protected val publisher: NoOpPublisher by lazy { NoOpTelemetryService.NO_OP_PUBLISHER }
protected val batcher: TelemetryBatcher by lazy { spy(DefaultTelemetryBatcher(publisher)) }
private lateinit var disposableParent: Disposable

private val mockTelemetryService: NoOpTelemetryService by lazy { NoOpTelemetryService(publisher, batcher) }

override fun before() {
// hack because @TestDisposable doesn't work here as it's not a test
disposableParent = Disposer.newDisposable()
ApplicationManager.getApplication().replaceService(TelemetryService::class.java, mockTelemetryService, disposableParent)
}

override fun after() {
reset(batcher())
Disposer.dispose(disposableParent)
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@rli is it sufficient for the purpose of reverting replaceService?

}

fun telemetryService() = mockTelemetryService
Expand Down
Loading