Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import no.nav.helse.flex.testconfig.FakesTestOppsett
import no.nav.helse.flex.testconfig.fakes.AaregClientFake
import no.nav.helse.flex.testconfig.fakes.EnvironmentTogglesFake
import no.nav.helse.flex.testconfig.fakes.EregClientFake
import no.nav.helse.flex.testutils.LoggLytter
import no.nav.helse.flex.testutils.fangLogger
import no.nav.helse.flex.utils.logger
import org.amshove.kluent.*
import org.junit.jupiter.api.AfterEach
Expand Down Expand Up @@ -99,13 +99,12 @@ class EksternArbeidsforholdHenterTest : FakesTestOppsett() {
@Test
fun `burde logge melding ved aareg timeout`() {
aaregClient.setArbeidsforholdoversikt(failure = ResourceAccessException("feilmelding"))
val loggLytter = LoggLytter(eksternArbeidsforholdHenter.logger())

invoking {
eksternArbeidsforholdHenter.hentEksterneArbeidsforholdForPerson("_")
}.shouldThrow(ResourceAccessException::class)

loggLytter.logEventer().shouldHaveSingleItem().run {
fangLogger(eksternArbeidsforholdHenter.logger()) {
invoking {
eksternArbeidsforholdHenter.hentEksterneArbeidsforholdForPerson("_")
}.shouldThrow(ResourceAccessException::class)
}.logEventer().shouldHaveSingleItem().run {
message shouldEndWith "feilmelding"
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,156 +1,142 @@
package no.nav.helse.flex.config.kafka

import ch.qos.logback.classic.spi.ILoggingEvent
import ch.qos.logback.core.read.ListAppender
import no.nav.helse.flex.testutils.fangLogger
import no.nav.helse.flex.utils.LogMarker
import no.nav.helse.flex.utils.logger
import org.amshove.kluent.*
import org.apache.kafka.clients.consumer.ConsumerRecord
import org.junit.jupiter.api.AfterEach
import org.junit.jupiter.api.Nested
import org.junit.jupiter.api.Test
import org.slf4j.Marker
import org.springframework.kafka.listener.ListenerExecutionFailedException
import ch.qos.logback.classic.Logger as LogbackLogger

class AivenKafkaErrorHandlerTest {
private val logger = AivenKafkaErrorHandler.logger()
private val logListAppender =
ListAppender<ILoggingEvent>()
.also {
(logger as? LogbackLogger)?.addAppender(it)
}.apply {
start()
}

@AfterEach
fun afterEach() {
logListAppender.list.clear()
}

@Test
fun `logger exception`() {
AivenKafkaErrorHandler.loggFeilende(
thrownException = RuntimeException(),
records = mutableListOf(Testdata.lagConsumerRecord()),
)
logListAppender.eventerUtenMarkers().shouldHaveSingleItem()
fangLogger(AivenKafkaErrorHandler.logger()) {
AivenKafkaErrorHandler.loggFeilende(
thrownException = RuntimeException(),
records = mutableListOf(Testdata.lagConsumerRecord()),
)
}.logEventerUtenMarkers().shouldHaveSingleItem()
}

@Test
fun `logger 'message' kun til secure logs`() {
AivenKafkaErrorHandler.loggFeilende(
thrownException = RuntimeException("Feil melding"),
records = mutableListOf(Testdata.lagConsumerRecord()),
)
logListAppender.eventerUtenMarkers().first().run {
message shouldNotContain "Feil melding"
}
logListAppender.eventerMedMarker(LogMarker.SECURE_LOGS).first().run {
message shouldContain "Feil melding"
fangLogger(AivenKafkaErrorHandler.logger()) {
AivenKafkaErrorHandler.loggFeilende(
thrownException = RuntimeException("Feil melding"),
records = mutableListOf(Testdata.lagConsumerRecord()),
)
}.run {
logEventerUtenMarkers().first().run {
message shouldNotContain "Feil melding"
}
logEventerMedMarker(LogMarker.SECURE_LOGS).first().run {
message shouldContain "Feil melding"
}
}
}

@Test
fun `logger også til secure logs`() {
AivenKafkaErrorHandler.loggFeilende(
thrownException = RuntimeException(),
records = mutableListOf(Testdata.lagConsumerRecord()),
)
logListAppender.eventerMedMarker(LogMarker.SECURE_LOGS).shouldHaveSingleItem()
fangLogger(AivenKafkaErrorHandler.logger()) {
AivenKafkaErrorHandler.loggFeilende(
thrownException = RuntimeException(),
records = mutableListOf(Testdata.lagConsumerRecord()),
)
}.logEventerMedMarker(LogMarker.SECURE_LOGS).shouldHaveSingleItem()
}

@Nested
inner class HandterKafkaErrorHandlerException {
@Test
fun `logger insensitiveMessage`() {
AivenKafkaErrorHandler.loggFeilende(
thrownException = KafkaErrorHandlerException(insensitiveMessage = "Usikker melding"),
records = mutableListOf(Testdata.lagConsumerRecord()),
)
logListAppender.eventerUtenMarkers().first().run {
fangLogger(AivenKafkaErrorHandler.logger()) {
AivenKafkaErrorHandler.loggFeilende(
thrownException = KafkaErrorHandlerException(insensitiveMessage = "Usikker melding"),
records = mutableListOf(Testdata.lagConsumerRecord()),
)
}.logEventerUtenMarkers().first().run {
message shouldStartWith "Usikker melding"
}
}

@Test
fun `logger kjede av insensitiveMessage`() {
AivenKafkaErrorHandler.loggFeilende(
thrownException =
KafkaErrorHandlerException(
insensitiveMessage = "Første melding",
cause =
KafkaErrorHandlerException(
insensitiveMessage = "Annen melding",
),
),
records = mutableListOf(Testdata.lagConsumerRecord()),
)
logListAppender.eventerUtenMarkers().first().run {
fangLogger(AivenKafkaErrorHandler.logger()) {
AivenKafkaErrorHandler.loggFeilende(
thrownException =
KafkaErrorHandlerException(
insensitiveMessage = "Første melding",
cause =
KafkaErrorHandlerException(
insensitiveMessage = "Annen melding",
),
),
records = mutableListOf(Testdata.lagConsumerRecord()),
)
}.logEventerUtenMarkers().first().run {
message shouldContain "Første melding"
message shouldContain "Annen melding"
}
}

@Test
fun `logger årsak type`() {
AivenKafkaErrorHandler.loggFeilende(
thrownException = KafkaErrorHandlerException(cause = RuntimeException()),
records = mutableListOf(Testdata.lagConsumerRecord()),
)
logListAppender.eventerUtenMarkers().first().run {
fangLogger(AivenKafkaErrorHandler.logger()) {
AivenKafkaErrorHandler.loggFeilende(
thrownException = KafkaErrorHandlerException(cause = RuntimeException()),
records = mutableListOf(Testdata.lagConsumerRecord()),
)
}.logEventerUtenMarkers().first().run {
message shouldNotContain "KafkaErrorHandlerException"
message shouldContain "RuntimeException"
}
}

@Test
fun `logger årsak type neders i kjede`() {
AivenKafkaErrorHandler.loggFeilende(
thrownException =
KafkaErrorHandlerException(
cause =
KafkaErrorHandlerException(cause = RuntimeException()),
),
records = mutableListOf(Testdata.lagConsumerRecord()),
)
logListAppender.eventerUtenMarkers().first().run {
fangLogger(AivenKafkaErrorHandler.logger()) {
AivenKafkaErrorHandler.loggFeilende(
thrownException =
KafkaErrorHandlerException(
cause =
KafkaErrorHandlerException(cause = RuntimeException()),
),
records = mutableListOf(Testdata.lagConsumerRecord()),
)
}.logEventerUtenMarkers().first().run {
message shouldNotContain "KafkaErrorHandlerException"
message shouldContain "RuntimeException"
}
}

@Test
fun `logger årsak melding til secure logs`() {
AivenKafkaErrorHandler.loggFeilende(
thrownException = KafkaErrorHandlerException(cause = RuntimeException("Årsak melding")),
records = mutableListOf(Testdata.lagConsumerRecord()),
)
logListAppender.eventerMedMarker(LogMarker.SECURE_LOGS).first().run {
fangLogger(AivenKafkaErrorHandler.logger()) {
AivenKafkaErrorHandler.loggFeilende(
thrownException = KafkaErrorHandlerException(cause = RuntimeException("Årsak melding")),
records = mutableListOf(Testdata.lagConsumerRecord()),
)
}.logEventerMedMarker(LogMarker.SECURE_LOGS).first().run {
throwableProxy.message shouldBeEqualTo "Årsak melding"
}
}

@Test
fun `logger kun årsak av ListenerExecutionFailedException`() {
AivenKafkaErrorHandler.loggFeilende(
thrownException = ListenerExecutionFailedException("", RuntimeException("Årsak melding")),
records = mutableListOf(Testdata.lagConsumerRecord()),
)
logListAppender.eventerUtenMarkers().first().run {
fangLogger(AivenKafkaErrorHandler.logger()) {
AivenKafkaErrorHandler.loggFeilende(
thrownException = ListenerExecutionFailedException("", RuntimeException("Årsak melding")),
records = mutableListOf(Testdata.lagConsumerRecord()),
)
}.logEventerUtenMarkers().first().run {
message shouldNotContain "ListenerExecutionFailedException"
message shouldContain "RuntimeException"
}
}
}

private fun ListAppender<ILoggingEvent>.eventerUtenMarkers(): List<ILoggingEvent> = this.list.filter { it.markerList.isNullOrEmpty() }

private fun ListAppender<ILoggingEvent>.eventerMedMarker(marker: Marker): List<ILoggingEvent> =
this.list.filter {
it.markerList != null && marker in it.markerList
}

private object Testdata {
fun lagConsumerRecord(): ConsumerRecord<String, String> =
ConsumerRecord(
Expand Down
23 changes: 21 additions & 2 deletions src/test/kotlin/no/nav/helse/flex/testutils/LoggLytter.kt
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import org.slf4j.Marker
import ch.qos.logback.classic.Logger as LogbackLogger

class LoggLytter(
logger: Logger,
private val logger: Logger,
) {
private val logListAppender = ListAppender<ILoggingEvent>()

Expand All @@ -16,12 +16,31 @@ class LoggLytter(
logListAppender.start()
}

fun logEventer(): List<ILoggingEvent> = logListAppender.list.filter { it.markerList.isNullOrEmpty() }
fun logEventer(): List<ILoggingEvent> = logListAppender.list.toList()

fun logEventerUtenMarkers(): List<ILoggingEvent> = logEventer().filter { it.markerList.isNullOrEmpty() }

fun logEventerMedMarker(marker: Marker): List<ILoggingEvent> =
logEventer().filter {
it.markerList != null && marker in it.markerList
}

fun clear() {
logListAppender.list.clear()
}

fun stop() {
logListAppender.stop()
(logger as? LogbackLogger)?.detachAppender(logListAppender)
}
}

fun fangLogger(
logger: Logger,
block: () -> Unit,
): LoggLytter {
val loggLytter = LoggLytter(logger)
block()
loggLytter.stop()
return loggLytter
}