blob: 74df8a9229ece7c70ab5c16b76b3b03bbf8b6521 [file] [log] [blame]
/*
* Licensed to 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 org.apache.commons.configuration2.io;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import java.net.URL;
import java.util.Arrays;
import java.util.Collection;
import java.util.LinkedList;
import org.apache.commons.configuration2.ConfigurationAssert;
import org.easymock.EasyMock;
import org.junit.BeforeClass;
import org.junit.Test;
/**
* Test class for {@code CombinedLocationStrategy}.
*
*/
public class TestCombinedLocationStrategy
{
/** A test locator. */
private static FileLocator locator;
/** A URL indicating a successful locate() operation. */
private static URL locateURL;
/** A mock for the file system. */
private FileSystem fileSystem;
/** An array with mock sub strategies. */
private FileLocationStrategy[] subStrategies;
@BeforeClass
public static void setUpOnce() throws Exception
{
locator =
FileLocatorUtils.fileLocator().fileName("testFile.tst")
.create();
locateURL = ConfigurationAssert.getTestURL("test.xml");
}
/**
* Returns the mock file system. It is created on demand.
*
* @return the mock file system
*/
private FileSystem getFileSystem()
{
if (fileSystem == null)
{
fileSystem = EasyMock.createMock(FileSystem.class);
EasyMock.replay(fileSystem);
}
return fileSystem;
}
/**
* Returns an array with mock objects for sub strategies.
*
* @return the array with mock strategies
*/
private FileLocationStrategy[] getSubStrategies()
{
if (subStrategies == null)
{
subStrategies = new FileLocationStrategy[2];
for (int i = 0; i < subStrategies.length; i++)
{
subStrategies[i] =
EasyMock.createMock(FileLocationStrategy.class);
}
}
return subStrategies;
}
/**
* Replays the mock objects for the sub strategies.
*/
private void replaySubStrategies()
{
EasyMock.replay((Object[]) getSubStrategies());
}
/**
* Verifies the mock objects for the sub strategies.
*/
private void verifySubStrategies()
{
EasyMock.verify((Object[]) getSubStrategies());
}
/**
* Checks whether the passed in combined strategy contains the expected sub
* strategies.
*
* @param strategy the combined strategy to check
*/
private void checkSubStrategies(final CombinedLocationStrategy strategy)
{
final Collection<FileLocationStrategy> subs = strategy.getSubStrategies();
assertEquals("Wrong number of strategies", getSubStrategies().length,
subs.size());
int idx = 0;
for (final FileLocationStrategy strat : subs)
{
assertEquals("Wrong sub strategy at " + idx,
getSubStrategies()[idx++], strat);
}
}
/**
* Helper method for creating a combined strategy with the mock sub
* strategies.
*
* @return the newly created combined strategy
*/
private CombinedLocationStrategy createCombinedStrategy()
{
return new CombinedLocationStrategy(Arrays.asList(getSubStrategies()));
}
/**
* Tries to create an instance with a null collection.
*/
@Test(expected = IllegalArgumentException.class)
public void testInitNullCollection()
{
new CombinedLocationStrategy(null);
}
/**
* Tries to create an instance containing a null element.
*/
@Test(expected = IllegalArgumentException.class)
public void testInitCollectionWithNullEntries()
{
final Collection<FileLocationStrategy> col =
new LinkedList<>(
Arrays.asList(getSubStrategies()));
col.add(null);
new CombinedLocationStrategy(col);
}
/**
* Tests whether a defensive copy of the collection with sub strategies is
* made.
*/
@Test
public void testInitDefensiveCopy()
{
final Collection<FileLocationStrategy> col =
new LinkedList<>(
Arrays.asList(getSubStrategies()));
final CombinedLocationStrategy strategy = new CombinedLocationStrategy(col);
col.add(EasyMock.createMock(FileLocationStrategy.class));
checkSubStrategies(strategy);
}
/**
* Tests that the collection with sub strategies cannot be modified.
*/
@Test(expected = UnsupportedOperationException.class)
public void testGetSubStrategiesModify()
{
final CombinedLocationStrategy strategy = createCombinedStrategy();
strategy.getSubStrategies().clear();
}
/**
* Tests a successful locate() operation if the first sub strategy can
* locate the file.
*/
@Test
public void testLocateSuccessFirstSubStrategy()
{
EasyMock.expect(getSubStrategies()[0].locate(getFileSystem(), locator))
.andReturn(locateURL);
replaySubStrategies();
final CombinedLocationStrategy strategy = createCombinedStrategy();
assertSame("Wrong result", locateURL,
strategy.locate(getFileSystem(), locator));
verifySubStrategies();
}
/**
* Tests a successful locate() operation if the 2nd sub strategy can locate
* the file.
*/
@Test
public void testLocateSuccessSecondSubStrategy()
{
EasyMock.expect(getSubStrategies()[0].locate(getFileSystem(), locator))
.andReturn(null);
EasyMock.expect(getSubStrategies()[1].locate(getFileSystem(), locator))
.andReturn(locateURL);
replaySubStrategies();
final CombinedLocationStrategy strategy = createCombinedStrategy();
assertSame("Wrong result", locateURL,
strategy.locate(getFileSystem(), locator));
verifySubStrategies();
}
/**
* Tests a failed locate() operation.
*/
@Test
public void testLocateFailed()
{
EasyMock.expect(getSubStrategies()[0].locate(getFileSystem(), locator))
.andReturn(null);
EasyMock.expect(getSubStrategies()[1].locate(getFileSystem(), locator))
.andReturn(null);
replaySubStrategies();
final CombinedLocationStrategy strategy = createCombinedStrategy();
assertNull("Got a URL", strategy.locate(getFileSystem(), locator));
verifySubStrategies();
}
}