From b6d9ef8445c66d71a3527c0a9c75104523b4fe40 Mon Sep 17 00:00:00 2001 From: Gabriel Roldan Date: Sun, 26 Jan 2025 23:30:14 -0300 Subject: [PATCH] Avoid log flooding with exceptions on catalog events tests Catalog events tests are not running off a full GeoServer instance, and the GeoServerLoader is trying to find unavailable service loaders, resulting in unnecessary log flooding. --- ...esourcePoolCleanupUpAutoConfiguration.java | 5 +- ...rcePoolCleanupUpAutoConfigurationTest.java | 5 +- ...eoServerSecurityAutoConfigurationTest.java | 14 ++++- .../TestConfigurationAutoConfiguration.java | 57 +++++++++++++++++-- .../TestConfigurationAutoConfiguration.java | 54 +++++++++++++++--- 5 files changed, 115 insertions(+), 20 deletions(-) diff --git a/src/catalog/backends/common/src/main/java/org/geoserver/cloud/autoconfigure/catalog/backend/core/RemoteEventResourcePoolCleanupUpAutoConfiguration.java b/src/catalog/backends/common/src/main/java/org/geoserver/cloud/autoconfigure/catalog/backend/core/RemoteEventResourcePoolCleanupUpAutoConfiguration.java index 832bbb3b7..6018083e8 100644 --- a/src/catalog/backends/common/src/main/java/org/geoserver/cloud/autoconfigure/catalog/backend/core/RemoteEventResourcePoolCleanupUpAutoConfiguration.java +++ b/src/catalog/backends/common/src/main/java/org/geoserver/cloud/autoconfigure/catalog/backend/core/RemoteEventResourcePoolCleanupUpAutoConfiguration.java @@ -4,8 +4,8 @@ */ package org.geoserver.cloud.autoconfigure.catalog.backend.core; +import org.geoserver.catalog.Catalog; import org.geoserver.catalog.ResourcePool; -import org.geoserver.catalog.plugin.CatalogPlugin; import org.geoserver.cloud.autoconfigure.catalog.event.ConditionalOnCatalogEvents; import org.geoserver.cloud.event.info.InfoEvent; import org.geoserver.cloud.event.remote.resourcepool.RemoteEventResourcePoolProcessor; @@ -25,8 +25,7 @@ public class RemoteEventResourcePoolCleanupUpAutoConfiguration { @Bean - RemoteEventResourcePoolProcessor remoteEventResourcePoolProcessor( - @Qualifier("rawCatalog") CatalogPlugin rawCatalog) { + RemoteEventResourcePoolProcessor remoteEventResourcePoolProcessor(@Qualifier("rawCatalog") Catalog rawCatalog) { return new RemoteEventResourcePoolProcessor(rawCatalog); } diff --git a/src/catalog/backends/common/src/test/java/org/geoserver/cloud/autoconfigure/catalog/backend/core/RemoteEventResourcePoolCleanupUpAutoConfigurationTest.java b/src/catalog/backends/common/src/test/java/org/geoserver/cloud/autoconfigure/catalog/backend/core/RemoteEventResourcePoolCleanupUpAutoConfigurationTest.java index 359e478b4..7f741fd3b 100644 --- a/src/catalog/backends/common/src/test/java/org/geoserver/cloud/autoconfigure/catalog/backend/core/RemoteEventResourcePoolCleanupUpAutoConfigurationTest.java +++ b/src/catalog/backends/common/src/test/java/org/geoserver/cloud/autoconfigure/catalog/backend/core/RemoteEventResourcePoolCleanupUpAutoConfigurationTest.java @@ -6,9 +6,10 @@ import static org.assertj.core.api.Assertions.assertThat; -import org.geoserver.catalog.plugin.CatalogPlugin; +import org.geoserver.catalog.Catalog; import org.geoserver.cloud.event.info.InfoEvent; import org.junit.jupiter.api.Test; +import org.mockito.Mockito; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.test.context.FilteredClassLoader; import org.springframework.boot.test.context.runner.ApplicationContextRunner; @@ -16,7 +17,7 @@ class RemoteEventResourcePoolCleanupUpAutoConfigurationTest { private final ApplicationContextRunner runner = new ApplicationContextRunner() - .withBean("rawCatalog", CatalogPlugin.class) + .withBean("rawCatalog", Catalog.class, () -> Mockito.mock(Catalog.class)) .withConfiguration(AutoConfigurations.of(RemoteEventResourcePoolCleanupUpAutoConfiguration.class)); @Test diff --git a/src/catalog/backends/common/src/test/java/org/geoserver/cloud/autoconfigure/security/GeoServerSecurityAutoConfigurationTest.java b/src/catalog/backends/common/src/test/java/org/geoserver/cloud/autoconfigure/security/GeoServerSecurityAutoConfigurationTest.java index e41564561..042776fd0 100644 --- a/src/catalog/backends/common/src/test/java/org/geoserver/cloud/autoconfigure/security/GeoServerSecurityAutoConfigurationTest.java +++ b/src/catalog/backends/common/src/test/java/org/geoserver/cloud/autoconfigure/security/GeoServerSecurityAutoConfigurationTest.java @@ -9,6 +9,7 @@ import java.io.File; import java.util.List; +import lombok.SneakyThrows; import org.geoserver.catalog.Catalog; import org.geoserver.cloud.config.factory.FilteringXmlBeanDefinitionReader; import org.geoserver.cloud.security.CloudGeoServerSecurityManager; @@ -20,6 +21,9 @@ import org.geoserver.platform.config.UpdateSequence; import org.geoserver.platform.resource.FileSystemResourceStore; import org.geoserver.platform.resource.ResourceStore; +import org.geoserver.security.ResourceAccessManager; +import org.geoserver.security.SecureCatalogImpl; +import org.geoserver.security.TestResourceAccessManager; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; @@ -46,8 +50,11 @@ void setUp() { runner = createContextRunner(tempDir); } + @SneakyThrows(Exception.class) static ApplicationContextRunner createContextRunner(File tempDir) { - Catalog catalog = mock(Catalog.class); + Catalog rawCatalog = mock(Catalog.class); + ResourceAccessManager resourceAccessManager = new TestResourceAccessManager(); + SecureCatalogImpl secureCatalog = new SecureCatalogImpl(rawCatalog, resourceAccessManager); GeoServer geoserver = mock(GeoServer.class); ResourceStore resourceStore = new FileSystemResourceStore(tempDir); GeoServerResourceLoader resourceLoader = new GeoServerResourceLoader(resourceStore); @@ -60,8 +67,9 @@ static ApplicationContextRunner createContextRunner(File tempDir) { .withBean(ResourceStore.class, () -> resourceStore) .withBean(GeoServerResourceLoader.class, () -> resourceLoader) .withBean("dataDirectory", GeoServerDataDirectory.class, () -> datadir) - .withBean("catalog", Catalog.class, () -> catalog) - .withBean("rawCatalog", Catalog.class, () -> catalog) + .withBean("rawCatalog", Catalog.class, () -> rawCatalog) + .withBean("catalog", Catalog.class, () -> secureCatalog) + .withBean("secureCatalog", Catalog.class, () -> secureCatalog) .withBean("geoServer", GeoServer.class, () -> geoserver) .withBean("updateSequence", UpdateSequence.class, () -> updateSequence) .withPropertyValues("logging.level.org.geoserver.platform: off"); diff --git a/src/catalog/event-bus/src/test/java/org/geoserver/cloud/event/bus/TestConfigurationAutoConfiguration.java b/src/catalog/event-bus/src/test/java/org/geoserver/cloud/event/bus/TestConfigurationAutoConfiguration.java index adc5e45ff..291f9a283 100644 --- a/src/catalog/event-bus/src/test/java/org/geoserver/cloud/event/bus/TestConfigurationAutoConfiguration.java +++ b/src/catalog/event-bus/src/test/java/org/geoserver/cloud/event/bus/TestConfigurationAutoConfiguration.java @@ -4,24 +4,57 @@ */ package org.geoserver.cloud.event.bus; +import java.io.File; +import java.io.IOException; +import java.io.UncheckedIOException; +import java.util.Optional; import org.geoserver.catalog.Catalog; import org.geoserver.catalog.plugin.CatalogPlugin; +import org.geoserver.config.ConfigurationListener; import org.geoserver.config.DefaultGeoServerLoader; import org.geoserver.config.GeoServer; +import org.geoserver.config.GeoServerConfigPersister; import org.geoserver.config.GeoServerLoader; +import org.geoserver.config.ServicePersister; import org.geoserver.config.plugin.GeoServerImpl; import org.geoserver.config.util.XStreamPersisterFactory; +import org.geoserver.platform.GeoServerExtensions; import org.geoserver.platform.GeoServerResourceLoader; import org.geoserver.platform.config.DefaultUpdateSequence; import org.geoserver.platform.config.UpdateSequence; +import org.geoserver.util.IOUtils; +import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.SpringBootConfiguration; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.context.ApplicationListener; import org.springframework.context.annotation.Bean; +import org.springframework.context.event.ContextClosedEvent; @EnableAutoConfiguration @SpringBootConfiguration -public class TestConfigurationAutoConfiguration { +public class TestConfigurationAutoConfiguration implements InitializingBean, ApplicationListener { + + private File tmpDir; + + @Override + public void afterPropertiesSet() throws Exception { + this.tmpDir = java.nio.file.Files.createTempDirectory("gs").toFile(); + } + + @Override + public void onApplicationEvent(ContextClosedEvent event) { + try { + IOUtils.delete(tmpDir, true); + } catch (IOException e) { + throw new UncheckedIOException(e); + } + } + + @Bean + GeoServerResourceLoader geoServerResourceLoader() { + return new GeoServerResourceLoader(tmpDir); + } @Bean UpdateSequence testUpdateSequence(GeoServer gs) { @@ -34,8 +67,9 @@ XStreamPersisterFactory xStreamPersisterFactory() { } @Bean(name = {"catalog", "rawCatalog"}) - public Catalog catalog() { - return new CatalogPlugin(false); + Catalog catalog() { + final boolean isolated = false; + return new CatalogPlugin(isolated); } @Bean @@ -46,8 +80,8 @@ GeoServer geoServer(@Qualifier("catalog") Catalog catalog) { } @Bean - GeoServerResourceLoader geoServerResourceLoader() { - return new GeoServerResourceLoader(); + GeoServerExtensions geoserverExtensions() { + return new GeoServerExtensions(); } @Bean @@ -56,6 +90,19 @@ GeoServerLoader geoserverLoader( @Qualifier("geoServerResourceLoader") GeoServerResourceLoader geoServerResourceLoader) { DefaultGeoServerLoader loader = new DefaultGeoServerLoader(geoServerResourceLoader); loader.postProcessBeforeInitialization(geoServer, "geoserver"); + + removeListener(geoServer, ServicePersister.class); + removeListener(geoServer, GeoServerConfigPersister.class); + return loader; } + + private void removeListener(GeoServer geoServer, Class type) { + Optional listener = + geoServer.getListeners().stream().filter(type::isInstance).findFirst(); + + if (listener.isPresent()) { + geoServer.removeListener(listener.orElseThrow()); + } + } } diff --git a/src/catalog/events/src/test/java/org/geoserver/cloud/config/catalog/events/TestConfigurationAutoConfiguration.java b/src/catalog/events/src/test/java/org/geoserver/cloud/config/catalog/events/TestConfigurationAutoConfiguration.java index a22b002c6..fe21c06d5 100644 --- a/src/catalog/events/src/test/java/org/geoserver/cloud/config/catalog/events/TestConfigurationAutoConfiguration.java +++ b/src/catalog/events/src/test/java/org/geoserver/cloud/config/catalog/events/TestConfigurationAutoConfiguration.java @@ -4,25 +4,57 @@ */ package org.geoserver.cloud.config.catalog.events; +import java.io.File; +import java.io.IOException; +import java.io.UncheckedIOException; +import java.util.Optional; import org.geoserver.catalog.Catalog; import org.geoserver.catalog.plugin.CatalogPlugin; +import org.geoserver.config.ConfigurationListener; import org.geoserver.config.DefaultGeoServerLoader; import org.geoserver.config.GeoServer; +import org.geoserver.config.GeoServerConfigPersister; import org.geoserver.config.GeoServerLoader; +import org.geoserver.config.ServicePersister; import org.geoserver.config.plugin.GeoServerImpl; import org.geoserver.config.util.XStreamPersisterFactory; import org.geoserver.platform.GeoServerExtensions; import org.geoserver.platform.GeoServerResourceLoader; import org.geoserver.platform.config.DefaultUpdateSequence; import org.geoserver.platform.config.UpdateSequence; +import org.geoserver.util.IOUtils; +import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.SpringBootConfiguration; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.context.ApplicationListener; import org.springframework.context.annotation.Bean; +import org.springframework.context.event.ContextClosedEvent; @EnableAutoConfiguration @SpringBootConfiguration -class TestConfigurationAutoConfiguration { +public class TestConfigurationAutoConfiguration implements InitializingBean, ApplicationListener { + + private File tmpDir; + + @Override + public void afterPropertiesSet() throws Exception { + this.tmpDir = java.nio.file.Files.createTempDirectory("gs").toFile(); + } + + @Override + public void onApplicationEvent(ContextClosedEvent event) { + try { + IOUtils.delete(tmpDir, true); + } catch (IOException e) { + throw new UncheckedIOException(e); + } + } + + @Bean + GeoServerResourceLoader geoServerResourceLoader() { + return new GeoServerResourceLoader(tmpDir); + } @Bean UpdateSequence testUpdateSequence(GeoServer gs) { @@ -35,7 +67,7 @@ XStreamPersisterFactory xStreamPersisterFactory() { } @Bean(name = {"catalog", "rawCatalog"}) - public Catalog catalog() { + Catalog catalog() { final boolean isolated = false; return new CatalogPlugin(isolated); } @@ -52,17 +84,25 @@ GeoServerExtensions geoserverExtensions() { return new GeoServerExtensions(); } - @Bean - GeoServerResourceLoader geoServerResourceLoader() { - return new GeoServerResourceLoader(); - } - @Bean GeoServerLoader geoserverLoader( @Qualifier("geoServer") GeoServer geoServer, @Qualifier("geoServerResourceLoader") GeoServerResourceLoader geoServerResourceLoader) { DefaultGeoServerLoader loader = new DefaultGeoServerLoader(geoServerResourceLoader); loader.postProcessBeforeInitialization(geoServer, "geoserver"); + + removeListener(geoServer, ServicePersister.class); + removeListener(geoServer, GeoServerConfigPersister.class); + return loader; } + + private void removeListener(GeoServer geoServer, Class type) { + Optional listener = + geoServer.getListeners().stream().filter(type::isInstance).findFirst(); + + if (listener.isPresent()) { + geoServer.removeListener(listener.orElseThrow()); + } + } }