blob: f01ecb47d2f3c5beb77bf63a0659cd078b8a3bc5 [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
*
* https://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.jupiter.api.Assertions.assertIterableEquals;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertSame;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.when;
import java.net.URL;
import java.util.Arrays;
import java.util.Collection;
import java.util.LinkedList;
import org.apache.commons.configuration2.ConfigurationAssert;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.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;
@BeforeAll
public static void setUpOnce() throws Exception {
locator = FileLocatorUtils.fileLocator().fileName("testFile.tst").create();
locateURL = ConfigurationAssert.getTestURL("test.xml");
}
/** A mock for the file system. */
private FileSystem fileSystem;
/** An array with mock sub strategies. */
private FileLocationStrategy[] subStrategies;
/**
* 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();
assertIterableEquals(Arrays.asList(getSubStrategies()), subs);
}
/**
* 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()));
}
/**
* Returns the mock file system. It is created on demand.
*
* @return the mock file system
*/
private FileSystem getFileSystem() {
if (fileSystem == null) {
fileSystem = mock(FileSystem.class);
}
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] = mock(FileLocationStrategy.class);
}
}
return subStrategies;
}
/**
* Tests that the collection with sub strategies cannot be modified.
*/
@Test
void testGetSubStrategiesModify() {
final CombinedLocationStrategy strategy = createCombinedStrategy();
final Collection<FileLocationStrategy> strategies = strategy.getSubStrategies();
assertThrows(UnsupportedOperationException.class, strategies::clear);
}
/**
* Tries to create an instance containing a null element.
*/
@Test
void testInitCollectionWithNullEntries() {
final Collection<FileLocationStrategy> col = new LinkedList<>(Arrays.asList(getSubStrategies()));
col.add(null);
assertThrows(IllegalArgumentException.class, () -> new CombinedLocationStrategy(col));
}
/**
* Tests whether a defensive copy of the collection with sub strategies is made.
*/
@Test
void testInitDefensiveCopy() {
final Collection<FileLocationStrategy> col = new LinkedList<>(Arrays.asList(getSubStrategies()));
final CombinedLocationStrategy strategy = new CombinedLocationStrategy(col);
col.add(mock(FileLocationStrategy.class));
checkSubStrategies(strategy);
}
/**
* Tries to create an instance with a null collection.
*/
@Test
void testInitNullCollection() {
assertThrows(IllegalArgumentException.class, () -> new CombinedLocationStrategy(null));
}
/**
* Tests a failed locate() operation.
*/
@Test
void testLocateFailed() {
when(getSubStrategies()[0].locate(getFileSystem(), locator)).thenReturn(null);
when(getSubStrategies()[1].locate(getFileSystem(), locator)).thenReturn(null);
final CombinedLocationStrategy strategy = createCombinedStrategy();
assertNull(strategy.locate(getFileSystem(), locator));
verify(getSubStrategies()[0]).locate(getFileSystem(), locator);
verify(getSubStrategies()[1]).locate(getFileSystem(), locator);
verifyNoMoreSubCategoryInteractions();
}
/**
* Tests a successful locate() operation if the first sub strategy can locate the file.
*/
@Test
void testLocateSuccessFirstSubStrategy() {
when(getSubStrategies()[0].locate(getFileSystem(), locator)).thenReturn(locateURL);
final CombinedLocationStrategy strategy = createCombinedStrategy();
assertSame(locateURL, strategy.locate(getFileSystem(), locator));
verify(getSubStrategies()[0]).locate(getFileSystem(), locator);
verifyNoMoreSubCategoryInteractions();
}
/**
* Tests a successful locate() operation if the 2nd sub strategy can locate the file.
*/
@Test
void testLocateSuccessSecondSubStrategy() {
when(getSubStrategies()[0].locate(getFileSystem(), locator)).thenReturn(null);
when(getSubStrategies()[1].locate(getFileSystem(), locator)).thenReturn(locateURL);
final CombinedLocationStrategy strategy = createCombinedStrategy();
assertSame(locateURL, strategy.locate(getFileSystem(), locator));
verify(getSubStrategies()[0]).locate(getFileSystem(), locator);
verify(getSubStrategies()[1]).locate(getFileSystem(), locator);
verifyNoMoreSubCategoryInteractions();
}
/**
* Helper method for verifying that no more interactions have been performed on the sub categories.
*/
private void verifyNoMoreSubCategoryInteractions() {
verifyNoMoreInteractions((Object[]) getSubStrategies());
}
}