/* * JBoss, Home of Professional Open Source. * Copyright 2016 Red Hat, Inc., and individual contributors * as indicated by the @author tags. * * Licensed 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 org.jboss.as.domain.management.security; import java.io.File; import java.io.FileOutputStream; import java.util.Properties; import org.junit.Assert; import org.junit.Test; /** * A test case to for {@link PropertiesFileLoader}. * * @author <a href="mailto:kwills@redhat.com">Ken Wills</a> */ public class PropertiesFileLoaderTestCase { static final String[] properties = { "ABC=123", "DEF=456", "#this is a comment, not a property", "GHI=789" }; private File createTempFile() throws Exception { return File.createTempFile("PropertiesFileLoaderTestCase", ".properties"); } private void cleanupTempFile(final File tmpFile) { if (tmpFile != null) tmpFile.delete(); } private void writeTestDataToFile(final File tmpFile) throws Exception { FileOutputStream fos = new FileOutputStream(tmpFile); for (String s : properties) { fos.write(s.getBytes()); fos.write('\n'); } fos.flush(); fos.close(); } private void verifyProperties(final Properties props, final int expectedSize) { verifyProperties(props, expectedSize, null, null); } private void verifyProperties(final Properties props, final int expectedSize, final String changedKey, final String expectedValue) { for (String s : properties) { if (s.startsWith("#")) // skip comments, the persist methods on PropertiesFileLoader will re-read those and write them back out continue; String[] parts = s.split("="); String user = parts[0]; String password = parts[1]; if (changedKey != null && changedKey.equals(user)) { if (expectedValue == null) { Assert.assertNull(props.get(changedKey)); } else { Assert.assertEquals(expectedValue, props.get(changedKey)); } } else { Assert.assertNotNull(props.getProperty(user)); Assert.assertEquals(password, props.getProperty(user)); } } // if we added a value, verify it here, this uses a pretty naive method, but good enough for this test if (props.size() > properties.length - 1) { Assert.assertEquals(props.get(changedKey), expectedValue); } // -1 because we don't count the comment Assert.assertEquals(properties.length - 1, expectedSize); } @Test public void testLoad() throws Exception { File tmpFile = null; try { tmpFile = createTempFile(); writeTestDataToFile(tmpFile); PropertiesFileLoader loader = new PropertiesFileLoader(tmpFile.getAbsolutePath(), null); loader.start(null); Properties props = loader.getProperties(); verifyProperties(props, props.size()); loader.stop(null); } finally { cleanupTempFile(tmpFile); } } @Test public void testAdd() throws Exception { File tmpFile = null; try { tmpFile = createTempFile(); writeTestDataToFile(tmpFile); PropertiesFileLoader loader = new PropertiesFileLoader(tmpFile.getAbsolutePath(), null); loader.start(null); Properties props = loader.getProperties(); props.put("NEW", "VALUE"); loader.persistProperties(); loader.stop(null); // reload the file and make sure everything is there PropertiesFileLoader loader2 = new PropertiesFileLoader(tmpFile.getAbsolutePath(), null); loader2.start(null); Properties props2 = loader2.getProperties(); verifyProperties(props2, props2.size()-1, "NEW", "VALUE"); loader2.stop(null); } finally { cleanupTempFile(tmpFile); } } @Test public void testRemove() throws Exception { File tmpFile = null; try { tmpFile = createTempFile(); writeTestDataToFile(tmpFile); PropertiesFileLoader loader = new PropertiesFileLoader(tmpFile.getAbsolutePath(), null); loader.start(null); Properties props = loader.getProperties(); props.remove("ABC"); loader.persistProperties(); loader.stop(null); // reload the file and make sure the removed item has been removed PropertiesFileLoader loader2 = new PropertiesFileLoader(tmpFile.getAbsolutePath(), null); loader2.start(null); Properties props2 = loader2.getProperties(); verifyProperties(props2, props2.size()+1, "ABC", null); loader2.stop(null); } finally { cleanupTempFile(tmpFile); } } @Test public void testChangeValue() throws Exception { File tmpFile = null; try { tmpFile = createTempFile(); writeTestDataToFile(tmpFile); PropertiesFileLoader loader = new PropertiesFileLoader(tmpFile.getAbsolutePath(), null); loader.start(null); Properties props = loader.getProperties(); props.put("ABC", "321"); loader.persistProperties(); loader.stop(null); // reload the file and make sure the removed item has been removed PropertiesFileLoader loader2 = new PropertiesFileLoader(tmpFile.getAbsolutePath(), null); loader2.start(null); Properties props2 = loader2.getProperties(); verifyProperties(props2, props2.size(), "ABC", "321"); loader2.stop(null); } finally { cleanupTempFile(tmpFile); } } }