/*
* Zed Attack Proxy (ZAP) and its related class files.
*
* ZAP is an HTTP/HTTPS proxy for assessing web application security.
*
* Copyright 2016 The ZAP Development Team
*
* 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.zaproxy.zap.extension.ext;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.not;
import static org.junit.Assert.assertThat;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.configuration.FileConfiguration;
import org.apache.log4j.Logger;
import org.apache.log4j.varia.NullAppender;
import org.junit.BeforeClass;
import org.junit.Test;
import org.zaproxy.zap.utils.ZapXmlConfiguration;
/**
* Unit test for {@link ExtensionParam}.
*/
public class ExtensionParamUnitTest {
@BeforeClass
public static void suppressLogging() {
Logger.getRootLogger().addAppender(new NullAppender());
}
@Test
public void shouldNotHaveConfigByDefault() {
// Given / When
ExtensionParam param = new ExtensionParam();
// Then
assertThat(param.getConfig(), is(equalTo(null)));
}
@Test
public void shouldBeCloneableByDefault() {
// Given
ExtensionParam param = new ExtensionParam();
// When
ExtensionParam clone = param.clone();
// Then
assertThat(clone, is(not(equalTo(null))));
}
@Test
public void shouldParseLoadedFileConfiguration() {
// Given
ExtensionParam param = new ExtensionParam();
FileConfiguration config = createTestConfig(false, true, false, true, true);
// When
param.load(config);
// Then
assertThat(param.isExtensionEnabled("Extension 1"), is(equalTo(false)));
assertThat(param.isExtensionEnabled("Extension 2"), is(equalTo(true)));
assertThat(param.isExtensionEnabled("Extension 3"), is(equalTo(false)));
assertThat(param.isExtensionEnabled("Extension 4"), is(equalTo(true)));
assertThat(param.isExtensionEnabled("Extension 5"), is(equalTo(true)));
}
@Test
public void shouldDefaultToAllExtensionsEnabledIfLoadingMalformedFileConfiguration() {
// Given
ExtensionParam param = new ExtensionParam();
// When
param.load(createMalformedTestConfig());
// Then
assertThat(param.isExtensionEnabled("Extension 1"), is(equalTo(true)));
assertThat(param.isExtensionEnabled("Extension 2"), is(equalTo(true)));
assertThat(param.isExtensionEnabled("Extension 3"), is(equalTo(true)));
}
@Test
public void shouldHaveLoadedConfigsAfterCloning() {
// Given
ExtensionParam param = new ExtensionParam();
FileConfiguration config = createTestConfig(false, true, false);
param.load(config);
// When
ExtensionParam clone = param.clone();
// Then
assertThat(clone.isExtensionEnabled("Extension 1"), is(equalTo(false)));
assertThat(clone.isExtensionEnabled("Extension 2"), is(equalTo(true)));
assertThat(clone.isExtensionEnabled("Extension 3"), is(equalTo(false)));
}
@Test(expected = IllegalArgumentException.class)
public void shouldFailToPersistNullExtensionsState() {
// Given
ExtensionParam param = new ExtensionParam();
// When
param.setExtensionsState(null);
// Then = IllegalArgumentException
}
@Test(expected = NullPointerException.class)
public void shouldFailToPersistExtensionsStateWithoutConfigurationFile() {
// Given
ExtensionParam param = new ExtensionParam();
// When
param.setExtensionsState(Collections.<String, Boolean> emptyMap());
// Then = NullPointerException
}
@Test
public void shouldSetExtensionsState() {
// Given
ExtensionParam param = new ExtensionParam();
FileConfiguration config = createTestConfig();
param.load(config);
Map<String, Boolean> states = extensionsState(true, false, true, false, true, true);
// When
param.setExtensionsState(states);
// Then
assertThat(param.isExtensionEnabled("Extension 1"), is(equalTo(true)));
assertThat(param.isExtensionEnabled("Extension 2"), is(equalTo(false)));
assertThat(param.isExtensionEnabled("Extension 3"), is(equalTo(true)));
assertThat(param.isExtensionEnabled("Extension 4"), is(equalTo(false)));
assertThat(param.isExtensionEnabled("Extension 5"), is(equalTo(true)));
assertThat(param.isExtensionEnabled("Extension 6"), is(equalTo(true)));
}
@Test
public void shouldPersistDisabledExtensions() {
// Given
ExtensionParam param = new ExtensionParam();
FileConfiguration config = createTestConfig();
param.load(config);
Map<String, Boolean> states = extensionsState(true, false, true, false, true, true);
// When
param.setExtensionsState(states);
// Then
assertThat(config.getString("extensions.extension(0).name"), is(equalTo("Extension 2")));
assertThat(config.getBoolean("extensions.extension(0).enabled"), is(equalTo(false)));
assertThat(config.getString("extensions.extension(1).name"), is(equalTo("Extension 4")));
assertThat(config.getBoolean("extensions.extension(1).enabled"), is(equalTo(false)));
assertThat(config.containsKey("extensions.extension(2).name"), is(equalTo(false)));
assertThat(config.containsKey("extensions.extension(2).enabled"), is(equalTo(false)));
}
@Test
public void shouldNotPersistNullExtensionNamesOrNullEnabledState() {
// Given
ExtensionParam param = new ExtensionParam();
FileConfiguration config = createTestConfig();
param.load(config);
Map<String, Boolean> states = new HashMap<>();
states.put(null, Boolean.FALSE);
states.put("Extension 2", null);
// When
param.setExtensionsState(states);
// Then
assertThat(param.getConfig().getKeys().hasNext(), is(equalTo(false)));
}
private static Map<String, Boolean> extensionsState(boolean... states) {
Map<String, Boolean> extensionsState = new HashMap<>();
if (states == null || states.length == 0) {
return extensionsState;
}
for (int i = 0; i < states.length; ++i) {
extensionsState.put("Extension " + (i + 1), states[i]);
}
return extensionsState;
}
private static FileConfiguration createTestConfig(boolean... states) {
ZapXmlConfiguration config = new ZapXmlConfiguration();
if (states == null || states.length == 0) {
return config;
}
for (int i = 0; i < states.length; ++i) {
String elementBaseKey = "extensions.extension(" + i + ").";
config.setProperty(elementBaseKey + "name", "Extension " + (i + 1));
config.setProperty(elementBaseKey + "enabled", states[i]);
}
return config;
}
private static FileConfiguration createMalformedTestConfig() {
ZapXmlConfiguration config = new ZapXmlConfiguration();
for (int i = 0; i < 3; ++i) {
String elementBaseKey = "extensions.extension(" + i + ").";
config.setProperty(elementBaseKey, null);
config.setProperty(elementBaseKey + "enabled", "X");
}
return config;
}
}