/**
* Copyright 2005-2016 hdiv.org
*
* 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.hdiv.config.xml;
import java.util.List;
import java.util.Map;
import org.hdiv.config.HDIVConfig;
import org.hdiv.logs.IUserData;
import org.hdiv.regex.DefaultPatternMatcher;
import org.hdiv.regex.PatternMatcher;
import org.hdiv.session.StateCache;
import org.hdiv.state.scope.StateScope;
import org.hdiv.state.scope.StateScopeManager;
import org.hdiv.state.scope.StateScopeType;
import org.hdiv.util.Method;
import org.hdiv.validator.DefaultValidationRepository;
import org.hdiv.validator.EditableDataValidationProvider;
import org.hdiv.validator.EditableDataValidationResult;
import org.hdiv.validator.IValidation;
import org.hdiv.validator.Validation;
import org.hdiv.validator.ValidationTarget;
import org.hdiv.web.servlet.support.HdivRequestDataValueProcessor;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.security.web.servlet.support.csrf.CsrfRequestDataValueProcessor;
import org.springframework.web.servlet.support.RequestDataValueProcessor;
import junit.framework.TestCase;
public class CustomSchemaTest extends TestCase {
private ApplicationContext context;
@Override
protected void setUp() throws Exception {
context = new ClassPathXmlApplicationContext("org/hdiv/config/xml/hdiv-config-test-schema.xml");
}
public void testSchema() {
Validation validation = (Validation) context.getBean("id1");
assertNotNull(validation);
System.out.println(validation.toString());
System.out.println("-----------------------");
HDIVConfig hdivConfig = context.getBean(HDIVConfig.class);
assertNotNull(hdivConfig);
System.out.println(hdivConfig.toString());
System.out.println("-----------------------");
assertTrue(hdivConfig.isShowErrorPageOnEditableValidation());
EditableDataValidationProvider validationProvider = context.getBean(EditableDataValidationProvider.class);
assertNotNull(validationProvider);
System.out.println(validationProvider.toString());
}
public void testStartPages() {
HDIVConfig hdivConfig = context.getBean(HDIVConfig.class);
assertNotNull(hdivConfig);
boolean result = hdivConfig.isStartPage("/onlyGet.html", Method.GET);
assertTrue(result);
result = hdivConfig.isStartPage("/onlyGet.html", Method.POST);
assertFalse(result);
}
public void testExpiredSession() {
HDIVConfig hdivConfig = context.getBean(HDIVConfig.class);
assertNotNull(hdivConfig);
String result = hdivConfig.getSessionExpiredLoginPage();
assertEquals("/login.html", result);
}
public void testNames() {
HDIVConfig hdivConfig = context.getBean(HDIVConfig.class);
assertNotNull(hdivConfig);
String[] names = context.getBeanDefinitionNames();
for (int i = 0; i < names.length; i++) {
String name = names[i];
System.out.println(name);
}
}
public void testStateCache() {
StateCache stateCache = context.getBean(StateCache.class);
assertNotNull(stateCache);
}
public void testUserData() {
IUserData userData = (IUserData) context.getBean(ConfigBeanDefinitionParser.USER_DATA_NAME);
assertNotNull(userData);
assertTrue(userData instanceof TestUserData);
}
public void testEditableValidations() {
DefaultValidationRepository validationRepository = context.getBean(DefaultValidationRepository.class);
assertNotNull(validationRepository);
Map<ValidationTarget, List<IValidation>> validations = validationRepository.getValidations();
assertEquals(4, validations.size());
// First url
List<IValidation> vals = getValidations(validations, "a");
ValidationTarget target = getTarget(validations, "a");
assertEquals(0, vals.size());
assertNull(target.getParams());
// Second url
vals = getValidations(validations, "b");
target = getTarget(validations, "b");
List<PatternMatcher> params = target.getParams();
assertEquals(3, params.size());
assertEquals(new DefaultPatternMatcher("param1"), params.get(0));
assertEquals(new DefaultPatternMatcher("param2"), params.get(1));
assertEquals(new DefaultPatternMatcher("param3"), params.get(2));
assertEquals(1, vals.size());
// 1 custom rules
Validation val = (Validation) vals.get(0);
assertEquals("id1", val.getName());
assertFalse(val.isDefaultValidation());
// Third url
vals = getValidations(validations, "c");
target = getTarget(validations, "c");
assertNull(target.getParams());
assertEquals(8, vals.size());
// 2 custom rule + 6 default rules
val = (Validation) vals.get(0);
assertEquals("id2", val.getName());
val = (Validation) vals.get(1);
assertEquals("id3", val.getName());
val = (Validation) vals.get(2);
assertEquals("SQLInjection", val.getName());// first default rule
assertTrue(val.isDefaultValidation());
// Fourth url
vals = getValidations(validations, null);
target = getTarget(validations, null);
params = target.getParams();
assertEquals(2, params.size());
assertEquals(new DefaultPatternMatcher("param4"), params.get(0));
assertEquals(new DefaultPatternMatcher("param5"), params.get(1));
assertEquals(1, vals.size());
// 1 custom rule
val = (Validation) vals.get(0);
assertEquals("id3", val.getName());
assertFalse(val.isDefaultValidation());
}
public void testEditableValidationsOrder() {
DefaultValidationRepository validationRepository = context.getBean(DefaultValidationRepository.class);
assertNotNull(validationRepository);
Map<ValidationTarget, List<IValidation>> validations = validationRepository.getValidations();
assertEquals(4, validations.size());
Object[] ptrs = validations.keySet().toArray();
ValidationTarget vt0 = (ValidationTarget) ptrs[0];
ValidationTarget vt1 = (ValidationTarget) ptrs[1];
ValidationTarget vt2 = (ValidationTarget) ptrs[2];
ValidationTarget vt3 = (ValidationTarget) ptrs[3];
assertEquals(new DefaultPatternMatcher("a"), vt0.getUrl());
assertEquals(new DefaultPatternMatcher("b"), vt1.getUrl());
assertEquals(new DefaultPatternMatcher("c"), vt2.getUrl());
assertEquals(null, vt3.getUrl());
}
public void testEditableValidationsParams() {
HDIVConfig config = context.getBean(HDIVConfig.class);
// param1
String url = "b";
String parameter = "param1";
String[] values = { "<script>" };
String dataType = "text";
EditableDataValidationProvider provider = config.getEditableDataValidationProvider();
EditableDataValidationResult result = provider.validate(url, parameter, values, dataType);
assertFalse(result.isValid());
// param2
parameter = "param2";
result = provider.validate(url, parameter, values, dataType);
assertFalse(result.isValid());
// otherParam
parameter = "otherParam";
result = provider.validate(url, parameter, values, dataType);
assertTrue(result.isValid());
}
public void testReuseExistingPageInAjaxRequest() {
HDIVConfig hdivConfig = context.getBean(HDIVConfig.class);
assertNotNull(hdivConfig);
assertEquals(true, hdivConfig.isReuseExistingPageInAjaxRequest());
}
public void testRequestDataValueProcessor() {
HdivRequestDataValueProcessor processor = context.getBean(HdivRequestDataValueProcessor.class);
assertNotNull(processor);
// Spring security 'CsrfRequestDataValueProcessor' as inner processor.
RequestDataValueProcessor inner = processor.getInnerRequestDataValueProcessor();
assertNotNull(inner);
assertEquals(CsrfRequestDataValueProcessor.class, inner.getClass());
}
public void testStateScopeManager() {
StateScopeManager scopeManager = context.getBean(StateScopeManager.class);
assertNotNull(scopeManager);
StateScope appScope = scopeManager.getStateScope(StateScopeType.APP);
StateScope sessionScope = scopeManager.getStateScope(StateScopeType.USER_SESSION);
assertNotNull(appScope);
assertNotNull(sessionScope);
}
public void testIsLongLivingPages() {
HDIVConfig hdivConfig = context.getBean(HDIVConfig.class);
assertNotNull(hdivConfig);
StateScopeType result = hdivConfig.isLongLivingPages("/default.html");
assertEquals(StateScopeType.USER_SESSION, result);
result = hdivConfig.isLongLivingPages("/user.html");
assertEquals(StateScopeType.USER_SESSION, result);
result = hdivConfig.isLongLivingPages("/app.html");
assertEquals(StateScopeType.APP, result);
result = hdivConfig.isLongLivingPages("/other.html");
assertNull(result);
}
protected List<IValidation> getValidations(final Map<ValidationTarget, List<IValidation>> validations, final String pattern) {
for (ValidationTarget target : validations.keySet()) {
PatternMatcher urlPattern = target.getUrl();
if (pattern == null) {
if (urlPattern == null) {
return validations.get(target);
}
}
else if (urlPattern.matches(pattern)) {
return validations.get(target);
}
}
return null;
}
protected ValidationTarget getTarget(final Map<ValidationTarget, List<IValidation>> validations, final String pattern) {
for (ValidationTarget target : validations.keySet()) {
PatternMatcher urlPattern = target.getUrl();
if (pattern == null) {
if (urlPattern == null) {
return target;
}
}
else if (target.getUrl().matches(pattern)) {
return target;
}
}
return null;
}
}