package com.tngtech.archunit;
import java.io.File;
import java.io.FileOutputStream;
import java.lang.reflect.Constructor;
import java.util.Collections;
import java.util.Map;
import java.util.Properties;
import com.google.common.collect.ImmutableMap;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import static com.tngtech.archunit.testutil.Assertions.assertThat;
import static com.tngtech.archunit.testutil.ReflectionTestUtils.constructor;
public class ArchConfigurationTest {
private static final String PROPERTIES_FILE_NAME = "archconfigtest.properties";
private static final String PROPERTIES_RESOURCE_NAME = "/" + PROPERTIES_FILE_NAME;
private final File testPropsFile = new File(getClass().getResource("/").getFile(), PROPERTIES_FILE_NAME);
@Before
public void setUp() {
testPropsFile.delete();
}
@After
public void tearDown() {
testPropsFile.delete();
}
@Test
public void missing_property_file() {
ArchConfiguration configuration = testConfiguration("notThere");
assertDefault(configuration);
}
@Test
public void empty_property_file() {
writeProperties(Collections.<String, String>emptyMap());
assertDefault(testConfiguration(PROPERTIES_RESOURCE_NAME));
}
@Test
public void simple_properties_explicitly_set() {
writeProperties(ImmutableMap.of(
ArchConfiguration.RESOLVE_MISSING_DEPENDENCIES_FROM_CLASS_PATH, true,
ArchConfiguration.ENABLE_MD5_IN_CLASS_SOURCES, true
));
ArchConfiguration configuration = testConfiguration(PROPERTIES_RESOURCE_NAME);
assertThat(configuration.resolveMissingDependenciesFromClassPath()).isTrue();
assertThat(configuration.md5InClassSourcesEnabled()).isTrue();
assertThat(configuration.getClassResolver()).isAbsent();
assertThat(configuration.getClassResolverArguments()).isEmpty();
}
@Test
public void resolver_explicitly_set() {
writeProperties(ImmutableMap.of(
ArchConfiguration.CLASS_RESOLVER, "some.Resolver",
ArchConfiguration.CLASS_RESOLVER_ARGS, "one.foo,two.bar"
));
ArchConfiguration configuration = testConfiguration(PROPERTIES_RESOURCE_NAME);
assertThat(configuration.getClassResolver()).contains("some.Resolver");
assertThat(configuration.getClassResolverArguments()).containsExactly("one.foo", "two.bar");
}
@Test
public void reset_works() {
ArchConfiguration configuration = testConfiguration(PROPERTIES_RESOURCE_NAME);
assertThat(configuration.resolveMissingDependenciesFromClassPath()).isFalse();
configuration.setResolveMissingDependenciesFromClassPath(true);
assertThat(configuration.resolveMissingDependenciesFromClassPath()).isTrue();
configuration.reset();
assertThat(configuration.resolveMissingDependenciesFromClassPath()).isFalse();
}
@Test
public void global_access_to_configuration_has_no_error() {
ArchConfiguration configuration = ArchConfiguration.get();
configuration.setResolveMissingDependenciesFromClassPath(true);
assertThat(configuration.resolveMissingDependenciesFromClassPath()).isTrue();
}
private void writeProperties(Map<String, ?> props) {
Properties save = new Properties();
for (Map.Entry<String, ?> entry : props.entrySet()) {
save.setProperty(entry.getKey(), "" + entry.getValue());
}
try (FileOutputStream outputStream = new FileOutputStream(testPropsFile)) {
save.store(outputStream, "");
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private void assertDefault(ArchConfiguration configuration) {
assertThat(configuration.resolveMissingDependenciesFromClassPath()).isFalse();
assertThat(configuration.md5InClassSourcesEnabled()).isFalse();
}
private ArchConfiguration testConfiguration(String resourceName) {
Constructor<?> constructor = constructor(ArchConfiguration.class, String.class);
constructor.setAccessible(true);
try {
return (ArchConfiguration) constructor.newInstance(resourceName);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}