/* * 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.wicket.response.filter; import static org.apache.wicket.page.XmlPartialPageUpdate.END_ROOT_ELEMENT; import static org.apache.wicket.page.XmlPartialPageUpdate.START_ROOT_ELEMENT; import org.apache.wicket.util.string.AppendingStringBuffer; import org.junit.Assert; import org.junit.Test; /** * Tests for XmlCleaningResponseFilter */ public class XmlCleaningResponseFilterTest extends Assert { /** * Tests that invalid XML characters are removed * @throws Exception */ @Test public void filterInvalid() throws Exception { XmlCleaningResponseFilter filter = new XmlCleaningResponseFilter(); int[] invalidChars = new int[] {0x0008, 0x0010, 0xD800, 0xDDDD, 0xFFFE}; for (int invalidChar : invalidChars) { CharSequence text = createText(invalidChar); AppendingStringBuffer filtered = filter.filter(new AppendingStringBuffer(text)); assertEquals(String.format("checking Unicode codepoint 0x%X:", invalidChar), START_ROOT_ELEMENT+END_ROOT_ELEMENT, filtered.toString()); } } /** * Tests that invalid XML characters are removed * @throws Exception */ @Test public void filterMultipleInvalid() throws Exception { XmlCleaningResponseFilter filter = new XmlCleaningResponseFilter(); CharSequence text = new StringBuilder() .append(START_ROOT_ELEMENT) .append(new String(new int[]{0x0008}, 0, 1)) .append("a") .append(new String(new int[]{0x0010}, 0, 1)) .append("b") .append(new String(new int[]{0xD800}, 0, 1)) .append(END_ROOT_ELEMENT); AppendingStringBuffer filtered = filter.filter(new AppendingStringBuffer(text)); assertEquals(START_ROOT_ELEMENT+"ab"+END_ROOT_ELEMENT, filtered.toString()); } /** * Tests that valid XML characters are preserved * @throws Exception */ @Test public void filterValid() throws Exception { XmlCleaningResponseFilter filter = new XmlCleaningResponseFilter(); int[] validChars = new int[] {0x9, 0xA, 'a', 0xE000, 0xFFFC, 0x10400}; for (int validChar : validChars) { CharSequence text = createText(validChar); AppendingStringBuffer filtered = filter.filter(new AppendingStringBuffer(text)); assertEquals(String.format("checking Unicode codepoint 0x%X:", validChar), text.toString(), filtered.toString()); } } // using a int because a Java char cannot represent all Unicode characters; some require two chars. private CharSequence createText(int ch) { String character = new String(new int[] {ch}, 0, 1); return new StringBuilder() .append(START_ROOT_ELEMENT) .append(character) .append(END_ROOT_ELEMENT); } /** * Asserts that XmlCleaningResponseFilter#shouldFilter() returns true when * there is <ajax-response> in the text to filter * @throws Exception */ @Test public void shouldFilter() throws Exception { XmlFilter filter = new XmlFilter(); assertFalse(filter.shouldFilter(new AppendingStringBuffer("anything"))); assertTrue(filter.shouldFilter( new AppendingStringBuffer("<?xml version=\"1.0\" encoding=\"UTF-8\"" + " standalone=\"yes\"><ajax-response></ajax-response>"))); } /** * Makes #shouldFilter() method public */ private static class XmlFilter extends XmlCleaningResponseFilter { @Override public boolean shouldFilter(AppendingStringBuffer responseBuffer) { return super.shouldFilter(responseBuffer); } } }