From 0d00735eb2a94d2ca055ad69307d6d1e9e94ad84 Mon Sep 17 00:00:00 2001 From: Xun Liu Date: Mon, 18 Sep 2023 15:26:00 +0800 Subject: [PATCH] [#390] improve(test): Consistency check in the graviton.conf file (#408) ### What changes were proposed in this pull request? + Add ServerConfigTest to keep consistency check in the graviton.conf file. + Use the JAVA reflect method to get all property names from `ServerConfig.java` and `Configs.java` files. ### Why are the changes needed? Because property names in the `graviton.conf.template` file need to be kept consistent with `com/datastrato/graviton/Configs.java` and `com/datastrato/graviton/server/ServerConfig.java`, Otherwise, Graviton will not be able to read `graviton.conf` file correctly. Fix: #390 ### Does this PR introduce _any_ user-facing change? N/A ### How was this patch tested? Added `ServerConfigTest` in the test cases. --- conf/graviton.conf.template | 2 +- server/build.gradle.kts | 4 + .../graviton/server/TestServerConfig.java | 73 +++++++++++++++++++ 3 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 server/src/test/java/com/datastrato/graviton/server/TestServerConfig.java diff --git a/conf/graviton.conf.template b/conf/graviton.conf.template index 9d99693a3d..e4a99421fb 100644 --- a/conf/graviton.conf.template +++ b/conf/graviton.conf.template @@ -30,7 +30,7 @@ graviton.entity.store = kv # The RocksDB entity store graviton.entity.store.kv = RocksDBKvBackend # The RocksDB backend path for entity store -graviton.entity.store.kv.rocskdb.path = /tmp/graviton +graviton.entity.store.kv.rocksdbPath = /tmp/graviton # THE CONFIGURATION FOR GRAVITON CATALOG # The interval in milliseconds to evict the catalog cache diff --git a/server/build.gradle.kts b/server/build.gradle.kts index c2276998bc..63749d1904 100644 --- a/server/build.gradle.kts +++ b/server/build.gradle.kts @@ -92,3 +92,7 @@ tasks.named("build") { throw GradleException("$propertiesFile file not generated!") } } + +tasks.test { + environment("GRAVITON_ROOT_DIR", rootDir.path) +} diff --git a/server/src/test/java/com/datastrato/graviton/server/TestServerConfig.java b/server/src/test/java/com/datastrato/graviton/server/TestServerConfig.java new file mode 100644 index 0000000000..0e67c9453a --- /dev/null +++ b/server/src/test/java/com/datastrato/graviton/server/TestServerConfig.java @@ -0,0 +1,73 @@ +/* + * Copyright 2023 Datastrato. + * This software is licensed under the Apache License version 2. + */ +package com.datastrato.graviton.server; + +import com.datastrato.graviton.Configs; +import com.datastrato.graviton.config.ConfigEntry; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.lang.reflect.Field; +import java.nio.file.Files; +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class TestServerConfig { + @Test + public void checkGravitonConfFile() + throws NoSuchFieldException, IllegalAccessException, IOException { + // Load all program config keys from `ServerConfig` and `Configs` into a map + Map configKeyMap = new HashMap<>(); + configKeyMap.putAll(getConfigEntryFromClass(ServerConfig.class)); + configKeyMap.putAll(getConfigEntryFromClass(Configs.class)); + + // Load all config keys from `graviton.conf.template` into a map + Properties properties = new Properties(); + String confFile = + System.getenv("GRAVITON_ROOT_DIR") + + File.separator + + "conf" + + File.separator + + "graviton.conf.template"; + InputStream in = Files.newInputStream(new File(confFile).toPath()); + properties.load(in); + + // Check if all config keys from `graviton.conf.template` are defined in `ServerConfig` and + // `Configs` + for (Map.Entry entry : properties.entrySet()) { + String propKey = (String) entry.getKey(); + Assertions.assertTrue( + configKeyMap.containsKey(propKey), + "Config key " + propKey + " is not defined in ConfigEntry"); + } + } + + // Get all ConfigEntry member variables from a config class + private Map getConfigEntryFromClass(Class configClazz) + throws NoSuchFieldException, IllegalAccessException { + Map configKeyMap = new HashMap<>(); + // Get all fields + Field[] fields = configClazz.getDeclaredFields(); + for (Field field : fields) { + String fieldName = field.getName(); + Class fieldType = field.getType(); + + if (!(fieldType == ConfigEntry.class)) { + continue; + } + Field memberConfigEntry = configClazz.getDeclaredField(fieldName); + memberConfigEntry.setAccessible(true); + + // Get all ConfigEntry member variables + ConfigEntry configEntry = (ConfigEntry) memberConfigEntry.get(null); + String configEntryKey = configEntry.getKey(); + configKeyMap.put(configEntryKey, fieldName); + } + return configKeyMap; + } +}