Configuration: Gracefully handle invalid integer values
If an invalid value is configured, log an error message and
fall back to the default value.
Change-Id: Ic4047b94ece39e2472bc7b954a1ea93cc83ad65c
diff --git a/src/main/java/com/ericsson/gerrit/plugins/highavailability/Configuration.java b/src/main/java/com/ericsson/gerrit/plugins/highavailability/Configuration.java
index bd1caea..30d035c 100644
--- a/src/main/java/com/ericsson/gerrit/plugins/highavailability/Configuration.java
+++ b/src/main/java/com/ericsson/gerrit/plugins/highavailability/Configuration.java
@@ -14,6 +14,9 @@
package com.ericsson.gerrit.plugins.highavailability;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
import com.google.common.base.CharMatcher;
import com.google.common.base.Strings;
import com.google.gerrit.extensions.annotations.PluginName;
@@ -24,6 +27,8 @@
@Singleton
public class Configuration {
+ private static final Logger log = LoggerFactory.getLogger(Configuration.class);
+
private static final int DEFAULT_TIMEOUT_MS = 5000;
private static final int DEFAULT_MAX_TRIES = 5;
private static final int DEFAULT_RETRY_INTERVAL = 1000;
@@ -46,14 +51,24 @@
url = Strings.nullToEmpty(cfg.getString("url"));
user = Strings.nullToEmpty(cfg.getString("user"));
password = Strings.nullToEmpty(cfg.getString("password"));
- connectionTimeout = cfg.getInt("connectionTimeout", DEFAULT_TIMEOUT_MS);
- socketTimeout = cfg.getInt("socketTimeout", DEFAULT_TIMEOUT_MS);
- maxTries = cfg.getInt("maxTries", DEFAULT_MAX_TRIES);
- retryInterval = cfg.getInt("retryInterval", DEFAULT_RETRY_INTERVAL);
+ connectionTimeout = getInt(cfg, "connectionTimeout", DEFAULT_TIMEOUT_MS);
+ socketTimeout = getInt(cfg, "socketTimeout", DEFAULT_TIMEOUT_MS);
+ maxTries = getInt(cfg, "maxTries", DEFAULT_MAX_TRIES);
+ retryInterval = getInt(cfg, "retryInterval", DEFAULT_RETRY_INTERVAL);
indexThreadPoolSize =
- cfg.getInt("indexThreadPoolSize", DEFAULT_THREAD_POOL_SIZE);
+ getInt(cfg, "indexThreadPoolSize", DEFAULT_THREAD_POOL_SIZE);
eventThreadPoolSize =
- cfg.getInt("eventThreadPoolSize", DEFAULT_THREAD_POOL_SIZE);
+ getInt(cfg, "eventThreadPoolSize", DEFAULT_THREAD_POOL_SIZE);
+ }
+
+ private int getInt(PluginConfig cfg, String name, int defaultValue) {
+ try {
+ return cfg.getInt(name, defaultValue);
+ } catch (IllegalArgumentException e) {
+ log.error(String.format(
+ "invalid value for %s; using default value %d", name, defaultValue));
+ return defaultValue;
+ }
}
public int getConnectionTimeout() {
diff --git a/src/test/java/com/ericsson/gerrit/plugins/highavailability/ConfigurationTest.java b/src/test/java/com/ericsson/gerrit/plugins/highavailability/ConfigurationTest.java
index 10b4211..22f9792 100644
--- a/src/test/java/com/ericsson/gerrit/plugins/highavailability/ConfigurationTest.java
+++ b/src/test/java/com/ericsson/gerrit/plugins/highavailability/ConfigurationTest.java
@@ -15,13 +15,13 @@
package com.ericsson.gerrit.plugins.highavailability;
import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.when;
import com.google.gerrit.server.config.PluginConfig;
import com.google.gerrit.server.config.PluginConfigFactory;
-import com.ericsson.gerrit.plugins.highavailability.Configuration;
-
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -93,6 +93,20 @@
assertThat(configuration.getUrl()).isEqualTo(URL);
}
+ @Test
+ public void testIllegalArgumentExceptionReturnDefaultValue() throws Exception {
+ when(configMock.getInt(anyString(), anyInt()))
+ .thenThrow(new IllegalArgumentException("some message"));
+
+ configuration = new Configuration(cfgFactoryMock, pluginName);
+ assertThat(configuration.getConnectionTimeout()).isEqualTo(5000);
+ assertThat(configuration.getSocketTimeout()).isEqualTo(5000);
+ assertThat(configuration.getMaxTries()).isEqualTo(5);
+ assertThat(configuration.getRetryInterval()).isEqualTo(1000);
+ assertThat(configuration.getIndexThreadPoolSize()).isEqualTo(1);
+ assertThat(configuration.getEventThreadPoolSize()).isEqualTo(1);
+ }
+
private void buildMocks(boolean values) {
when(configMock.getString("url")).thenReturn(values ? URL : null);
when(configMock.getString("user")).thenReturn(values ? USER : null);