/** * Copyright 2015 StreamSets Inc. * * Licensed under the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.streamsets.datacollector.util; import com.google.common.collect.ImmutableSet; import org.apache.commons.io.IOUtils; import org.junit.After; import org.junit.Assert; import org.junit.Test; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.Reader; import java.io.StringReader; import java.io.StringWriter; import java.io.Writer; import java.util.UUID; public class TestConfiguration { @After public void cleanUp() { Configuration.setFileRefsBaseDir(null); } @Test public void testBasicMethods() { Configuration conf = new Configuration(); Assert.assertTrue(conf.getNames().isEmpty()); conf.set("s", "S"); conf.set("b", true); conf.set("i", Integer.MAX_VALUE); conf.set("l", Long.MAX_VALUE); Assert.assertTrue(conf.hasName("s")); Assert.assertEquals(ImmutableSet.of("s", "b", "i", "l"), conf.getNames()); Assert.assertEquals("S", conf.get("s", "D")); Assert.assertEquals(true, conf.get("b", false)); Assert.assertEquals(Integer.MAX_VALUE, conf.get("i", 1)); Assert.assertEquals(Long.MAX_VALUE, conf.get("l", 2L)); Assert.assertEquals("D", conf.get("x", "D")); Assert.assertEquals(false, conf.get("x", false)); Assert.assertEquals(1, conf.get("x", 1)); Assert.assertEquals(2L, conf.get("x", 2L)); conf.unset("s"); Assert.assertFalse(conf.hasName("s")); Assert.assertEquals(null, conf.get("s", null)); } @Test(expected = NullPointerException.class) public void invalidCall1() { Configuration conf = new Configuration(); conf.set(null, null); } @Test(expected = NullPointerException.class) public void invalidCall2() { Configuration conf = new Configuration(); conf.set("a", null); } @Test(expected = NullPointerException.class) public void invalidCall3() { Configuration conf = new Configuration(); conf.unset(null); } @Test(expected = NullPointerException.class) public void invalidCall4() { Configuration conf = new Configuration(); conf.hasName(null); } @Test(expected = NullPointerException.class) public void invalidCall5() { Configuration conf = new Configuration(); conf.getSubSetConfiguration(null); } @Test(expected = NullPointerException.class) public void invalidCall6() throws IOException { Configuration conf = new Configuration(); conf.load(null); } @Test(expected = NullPointerException.class) public void invalidCall7() throws IOException { Configuration conf = new Configuration(); conf.save(null); } @Test public void testSubSet() { Configuration conf = new Configuration(); conf.set("a.s", "S"); conf.set("a.b", true); conf.set("x.i", Integer.MAX_VALUE); conf.set("x.l", Long.MAX_VALUE); Configuration subSet = conf.getSubSetConfiguration("a."); Assert.assertEquals(ImmutableSet.of("a.s", "a.b", "x.i", "x.l"), conf.getNames()); Assert.assertEquals(ImmutableSet.of("a.s", "a.b"), subSet.getNames()); } @Test public void testSaveLoad() throws IOException { Configuration conf = new Configuration(); conf.set("a.s", "S"); conf.set("a.b", true); conf.set("x.i", Integer.MAX_VALUE); conf.set("x.l", Long.MAX_VALUE); StringWriter writer = new StringWriter(); conf.save(writer); StringReader reader = new StringReader(writer.toString()); conf = new Configuration(); conf.set("a.s", "X"); conf.set("a.ss", "XX"); conf.load(reader); Assert.assertEquals(ImmutableSet.of("a.s", "a.b", "x.i", "x.l", "a.ss"), conf.getNames()); Assert.assertEquals("S", conf.get("a.s", "D")); Assert.assertEquals("XX", conf.get("a.ss", "D")); } @Test public void testFileRefs() throws IOException { File dir = new File("target", UUID.randomUUID().toString()); Assert.assertTrue(dir.mkdirs()); Configuration.setFileRefsBaseDir(dir); Writer writer = new FileWriter(new File(dir, "hello.txt")); IOUtils.write("secret\nfoo\n", writer); writer.close(); Configuration conf = new Configuration(); conf.set("a", "@hello.txt@"); Assert.assertEquals("secret\nfoo\n", conf.get("a", null)); conf.set("aa", "${file(\"hello.txt\")}"); Assert.assertEquals("secret\nfoo\n", conf.get("aa", null)); conf.set("aaa", "${file('hello.txt')}"); Assert.assertEquals("secret\nfoo\n", conf.get("aaa", null)); writer = new FileWriter(new File(dir, "config.properties")); conf.save(writer); writer.close(); conf = new Configuration(); Reader reader = new FileReader(new File(dir, "config.properties")); conf.load(reader); reader.close(); Assert.assertEquals("secret\nfoo\n", conf.get("a", null)); reader = new FileReader(new File(dir, "config.properties")); StringWriter stringWriter = new StringWriter(); IOUtils.copy(reader, stringWriter); reader.close(); Assert.assertTrue(stringWriter.toString().contains("@hello.txt@")); Assert.assertTrue(stringWriter.toString().contains("${file(\"hello.txt\")}")); Assert.assertTrue(stringWriter.toString().contains("${file('hello.txt')}")); Assert.assertFalse(stringWriter.toString().contains("secret\nfoo\n")); } @Test(expected = RuntimeException.class) public void testFileRefsNotConfigured() throws IOException { Configuration.setFileRefsBaseDir(null); Configuration conf = new Configuration(); conf.set("a", "@hello.txt@"); } @Test(expected = RuntimeException.class) public void testNewFileRefsNotConfigured() throws IOException { Configuration.setFileRefsBaseDir(null); Configuration conf = new Configuration(); conf.set("a", "${file(\"hello.txt\")}"); } @Test public void testRefsConfigs() throws IOException { File dir = new File("target", UUID.randomUUID().toString()); Assert.assertTrue(dir.mkdirs()); Configuration.setFileRefsBaseDir(dir); Writer writer = new FileWriter(new File(dir, "hello.txt")); IOUtils.write("secret", writer); writer.close(); Configuration conf = new Configuration(); String home = System.getenv("HOME"); conf.set("a", "@hello.txt@"); conf.set("aa", "${file(\"hello.txt\")}"); conf.set("aaa", "${file('hello.txt')}"); conf.set("b", "$HOME$"); conf.set("bb", "${env(\"HOME\")}"); conf.set("bbb", "${env('HOME')}"); conf.set("x", "X"); Assert.assertEquals("secret", conf.get("a", null)); Assert.assertEquals("secret", conf.get("aa", null)); Assert.assertEquals("secret", conf.get("aaa", null)); Assert.assertEquals(home, conf.get("b", null)); Assert.assertEquals(home, conf.get("bb", null)); Assert.assertEquals(home, conf.get("bbb", null)); Assert.assertEquals("X", conf.get("x", null)); Configuration uconf = conf.getUnresolvedConfiguration(); Assert.assertEquals("@hello.txt@", uconf.get("a", null)); Assert.assertEquals("${file(\"hello.txt\")}", uconf.get("aa", null)); Assert.assertEquals("${file('hello.txt')}", uconf.get("aaa", null)); Assert.assertEquals("$HOME$", uconf.get("b", null)); Assert.assertEquals("${env(\"HOME\")}", uconf.get("bb", null)); Assert.assertEquals("${env('HOME')}", uconf.get("bbb", null)); Assert.assertEquals("X", uconf.get("x", null)); writer = new FileWriter(new File(dir, "config.properties")); conf.save(writer); writer.close(); conf = new Configuration(); Reader reader = new FileReader(new File(dir, "config.properties")); conf.load(reader); reader.close(); uconf = conf.getUnresolvedConfiguration(); Assert.assertEquals("@hello.txt@", uconf.get("a", null)); Assert.assertEquals("${file(\"hello.txt\")}", uconf.get("aa", null)); Assert.assertEquals("${file('hello.txt')}", uconf.get("aaa", null)); Assert.assertEquals("$HOME$", uconf.get("b", null)); Assert.assertEquals("${env(\"HOME\")}", uconf.get("bb", null)); Assert.assertEquals("${env('HOME')}", uconf.get("bbb", null)); Assert.assertEquals("X", uconf.get("x", null)); } @Test public void testIncludes() throws Exception { File dir = new File("target", UUID.randomUUID().toString()); Assert.assertTrue(dir.mkdirs()); Configuration.setFileRefsBaseDir(dir); Writer writer = new FileWriter(new File(dir, "config.properties")); IOUtils.write("a=A\nconfig.includes=include1.properties , ", writer); writer.close(); writer = new FileWriter(new File(dir, "include1.properties")); IOUtils.write("b=B\nconfig.includes=include2.properties , ", writer); writer.close(); writer = new FileWriter(new File(dir, "include2.properties")); IOUtils.write("c=C\n", writer); writer.close(); Configuration conf = new Configuration(); Reader reader = new FileReader(new File(dir, "config.properties")); conf.load(reader); reader.close(); Assert.assertEquals("A", conf.get("a", null)); Assert.assertEquals("B", conf.get("b", null)); Assert.assertEquals("C", conf.get("c", null)); Assert.assertNull(conf.get(Configuration.CONFIG_INCLUDES, null)); } }