@@ -3,6 +3,10 @@ package io.github.dmitrysulman.logback.access.reactor.netty.autoconfigure
33import ch.qos.logback.core.status.OnConsoleStatusListener
44import io.github.dmitrysulman.logback.access.reactor.netty.ReactorNettyAccessLogFactory
55import io.kotest.matchers.booleans.shouldBeTrue
6+ import io.kotest.matchers.nulls.shouldNotBeNull
7+ import io.kotest.matchers.shouldBe
8+ import io.kotest.matchers.string.shouldEndWith
9+ import io.mockk.every
610import io.mockk.mockk
711import io.mockk.verify
812import org.assertj.core.api.AssertionsForInterfaceTypes.assertThat
@@ -16,7 +20,13 @@ import org.springframework.boot.test.context.runner.ReactiveWebApplicationContex
1620import org.springframework.boot.test.context.runner.WebApplicationContextRunner
1721import org.springframework.context.annotation.Bean
1822import org.springframework.context.annotation.Configuration
23+ import org.springframework.core.io.Resource
24+ import org.springframework.core.io.ResourceLoader
25+ import org.springframework.util.ResourceUtils
1926import reactor.netty.http.server.HttpServer
27+ import java.io.ByteArrayInputStream
28+ import java.net.URL
29+ import java.net.URLConnection
2030
2131class ReactorNettyAccessLogFactoryAutoConfigurationTests {
2232 @Test
@@ -136,6 +146,96 @@ class ReactorNettyAccessLogFactoryAutoConfigurationTests {
136146 }
137147 }
138148
149+ @Test
150+ fun `should load configuration from provided configuration file resource` () {
151+ ReactiveWebApplicationContextRunner ()
152+ .withConfiguration(AutoConfigurations .of(ReactorNettyAccessLogFactoryAutoConfiguration ::class .java))
153+ .withPropertyValues(" logback.access.reactor.netty.config=file:./src/test/resources/file/logback-access-file.xml" )
154+ .run { context ->
155+ val factory = context.getBean<ReactorNettyAccessLogFactory >()
156+ factory.accessContext.getAppender(" FILE" ).shouldNotBeNull()
157+ }
158+ }
159+
160+ @Test
161+ fun `should load configuration from provided configuration classpath resource` () {
162+ ReactiveWebApplicationContextRunner ()
163+ .withConfiguration(AutoConfigurations .of(ReactorNettyAccessLogFactoryAutoConfiguration ::class .java))
164+ .withPropertyValues(" logback.access.reactor.netty.config=classpath:logback-access-stdout.xml" )
165+ .run { context ->
166+ val factory = context.getBean<ReactorNettyAccessLogFactory >()
167+ factory.accessContext.getAppender(" CAPTURE" ).shouldNotBeNull()
168+ }
169+ }
170+
171+ @Test
172+ fun `should load configuration from default filename configuration file resource` () {
173+ val resourceLoaderMock = mockk<ResourceLoader >()
174+ val resourceMock = mockk<Resource >()
175+ val urlMock = mockk<URL >(relaxed = true )
176+ val urlConnectionMock = mockk<URLConnection >(relaxed = true )
177+ every { resourceMock.exists() } returns true
178+ every { resourceMock.url } returns urlMock
179+ every { urlMock.file } returns " default"
180+ every { urlMock.openConnection() } returns urlConnectionMock
181+ every { urlConnectionMock.inputStream } returns ByteArrayInputStream (" <configuration></configuration>" .toByteArray())
182+ every { resourceLoaderMock.getResource(" file:logback-access.xml" ) } returns resourceMock
183+ ReactiveWebApplicationContextRunner ()
184+ .withConfiguration(AutoConfigurations .of(ReactorNettyAccessLogFactoryAutoConfiguration ::class .java))
185+ .withBean(" resourceLoader" , ResourceLoader ::class .java, { resourceLoaderMock })
186+ .run { context ->
187+ val factory = context.getBean<ReactorNettyAccessLogFactory >()
188+ factory.accessContext.name shouldBe " default"
189+ }
190+ }
191+
192+ @Test
193+ fun `should load configuration from default filename configuration classpath resource` () {
194+ val resourceLoaderMock = mockk<ResourceLoader >()
195+ val filenameResourceMock = mockk<Resource >()
196+ val classpathResourceMock = mockk<Resource >()
197+ val urlMock = mockk<URL >(relaxed = true )
198+ val urlConnectionMock = mockk<URLConnection >(relaxed = true )
199+ every { filenameResourceMock.exists() } returns false
200+ every { classpathResourceMock.exists() } returns true
201+ every { classpathResourceMock.url } returns urlMock
202+ every { urlMock.file } returns " default"
203+ every { urlMock.openConnection() } returns urlConnectionMock
204+ every { urlConnectionMock.inputStream } returns ByteArrayInputStream (" <configuration></configuration>" .toByteArray())
205+ every { resourceLoaderMock.getResource(" file:logback-access.xml" ) } returns filenameResourceMock
206+ every { resourceLoaderMock.getResource(" classpath:logback-access.xml" ) } returns classpathResourceMock
207+ ReactiveWebApplicationContextRunner ()
208+ .withConfiguration(AutoConfigurations .of(ReactorNettyAccessLogFactoryAutoConfiguration ::class .java))
209+ .withBean(" resourceLoader" , ResourceLoader ::class .java, { resourceLoaderMock })
210+ .run { context ->
211+ val factory = context.getBean<ReactorNettyAccessLogFactory >()
212+ factory.accessContext.name shouldBe " default"
213+ }
214+ }
215+
216+ @Test
217+ fun `should load configuration from default configuration file` () {
218+ val resourceLoaderMock = mockk<ResourceLoader >()
219+ val filenameResourceMock = mockk<Resource >()
220+ val classpathResourceMock = mockk<Resource >()
221+ val defaultResourceMock = mockk<Resource >()
222+ every { filenameResourceMock.exists() } returns false
223+ every { classpathResourceMock.exists() } returns false
224+ every { defaultResourceMock.url } returns
225+ ResourceUtils .getURL(" classpath:logback-access-reactor-netty/logback-access-default-config.xml" )
226+ every { resourceLoaderMock.getResource(" file:logback-access.xml" ) } returns filenameResourceMock
227+ every { resourceLoaderMock.getResource(" classpath:logback-access.xml" ) } returns classpathResourceMock
228+ every { resourceLoaderMock.getResource(" classpath:logback-access-reactor-netty/logback-access-default-config.xml" ) } returns
229+ defaultResourceMock
230+ ReactiveWebApplicationContextRunner ()
231+ .withConfiguration(AutoConfigurations .of(ReactorNettyAccessLogFactoryAutoConfiguration ::class .java))
232+ .withBean(" resourceLoader" , ResourceLoader ::class .java, { resourceLoaderMock })
233+ .run { context ->
234+ val factory = context.getBean<ReactorNettyAccessLogFactory >()
235+ factory.accessContext.name shouldEndWith " logback-access-reactor-netty/logback-access-default-config.xml"
236+ }
237+ }
238+
139239 @Configuration(proxyBeanMethods = false )
140240 class CustomReactorNettyAccessLogFactoryConfiguration {
141241 @Bean
0 commit comments