/* * Sonar XML Plugin * Copyright (C) 2010 Matthijs Galesloot * dev@sonar.codehaus.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.sonar.plugins.xml.checks; import static junit.framework.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import org.jfree.util.Log; import org.junit.Test; import org.sonar.api.rules.Violation; import org.sonar.api.utils.SonarException; import org.sonar.plugins.xml.SimpleRuleFinder; import org.sonar.plugins.xml.rules.XmlMessagesMatcher; /** * @author Matthijs Galesloot */ public class XmlSchemaCheckTest extends AbstractCheckTester { private static final String SRC_TEST_RESOURCES_CHECKS_GENERIC_TENDER_NED_AANKONDIGINGEN_XHTML = "src/test/resources/checks/generic/TenderNed - Aankondigingen.xhtml"; private static final String SCHEMAS = "schemas"; private static final String INCORRECT_NUMBER_OF_VIOLATIONS = "Incorrect number of violations"; private void checkViolationMessages(XmlSourceCode sourceCode) { XmlMessagesMatcher messagesMatcher = new XmlMessagesMatcher(); for (Violation v : sourceCode.getViolations()) { messagesMatcher.setRuleForViolation(new SimpleRuleFinder(createStandardRulesProfile()), v); assertFalse("Unresolved message: " + v.getMessage(), XmlSchemaCheck.class.getSimpleName().equals(v.getRule().getKey())); } } @Test(expected = SonarException.class) public void missingSchema() throws FileNotFoundException { String fileName = SRC_TEST_RESOURCES_CHECKS_GENERIC_TENDER_NED_AANKONDIGINGEN_XHTML; FileReader reader = new FileReader(fileName); parseAndCheck(reader, new File(fileName), null, XmlSchemaCheck.class, SCHEMAS, "does-not-exist"); } @Test public void schemaAsExternalPath() throws FileNotFoundException { String fileName = SRC_TEST_RESOURCES_CHECKS_GENERIC_TENDER_NED_AANKONDIGINGEN_XHTML; FileReader reader = new FileReader(fileName); XmlSourceCode sourceCode = parseAndCheck(reader, new File(fileName), null, XmlSchemaCheck.class, SCHEMAS, "src/main/resources/org/sonar/plugins/xml/schemas/xhtml1/xhtml1-frameset.xsd"); assertEquals(INCORRECT_NUMBER_OF_VIOLATIONS, 162, sourceCode.getViolations().size()); } @Test public void testFilePattern() throws FileNotFoundException { String fileName = "src/test/resources/checks/generic/catalog.xml"; FileReader reader = new FileReader(fileName); XmlSourceCode sourceCode = parseAndCheck(reader, new File(fileName), null, XmlSchemaCheck.class, "filePattern", "**/generic/**.xml", SCHEMAS, "src/test/resources/checks/generic/catalog.xsd"); assertEquals(INCORRECT_NUMBER_OF_VIOLATIONS, 1, sourceCode.getViolations().size()); } @Test public void validateMavenPom() throws FileNotFoundException { String fileName = "pom.xml"; FileReader reader = new FileReader(fileName); XmlSourceCode sourceCode = parseAndCheck(reader, new File(fileName), null, XmlSchemaCheck.class, SCHEMAS, "autodetect"); if (sourceCode.getViolations().size() > 0) { Log.error(sourceCode.getViolations().get(0).getMessage()); } checkViolationMessages(sourceCode); assertEquals(INCORRECT_NUMBER_OF_VIOLATIONS, 0, sourceCode.getViolations().size()); } @Test public void violateAutoDetectCheck() throws FileNotFoundException { String fileName = SRC_TEST_RESOURCES_CHECKS_GENERIC_TENDER_NED_AANKONDIGINGEN_XHTML; FileReader reader = new FileReader(fileName); XmlSourceCode sourceCode = parseAndCheck(reader, new File(fileName), null, XmlSchemaCheck.class, SCHEMAS, "autodetect"); assertEquals(INCORRECT_NUMBER_OF_VIOLATIONS, 164, sourceCode.getViolations().size()); } @Test public void violateWrongAmpersands() throws FileNotFoundException { String fileName = "src/test/resources/checks/generic/wrong-ampersand.xhtml"; FileReader reader = new FileReader(fileName); XmlSourceCode sourceCode = parseAndCheck(reader, new File(fileName), null, XmlSchemaCheck.class, SCHEMAS, "autodetect"); assertEquals(INCORRECT_NUMBER_OF_VIOLATIONS, 8, sourceCode.getViolations().size()); Violation v = sourceCode.getViolations().get(sourceCode.getViolations().size() - 1); assertTrue(v.getMessage().contains("reference to entity")); } // @Test(expected=NullPointerException.class) // public void failingParser() throws FileNotFoundException { // String fileName = "src/test/resources/checks/generic/header.html"; // FileReader reader = new FileReader(fileName); // XmlSourceCode sourceCode = parseAndCheck(reader, new File(fileName), null, XmlSchemaCheck.class, SCHEMAS, "autodetect"); // // assertEquals(INCORRECT_NUMBER_OF_VIOLATIONS, 164, sourceCode.getViolations().size()); // } @Test public void violateBuiltinXhtmlSchemaCheck() throws FileNotFoundException { String fileName = "src/test/resources/checks/generic/create-salesorder.xhtml"; FileReader reader = new FileReader(fileName); XmlSourceCode sourceCode = parseAndCheck(reader, new File(fileName), null, XmlSchemaCheck.class, SCHEMAS, "xhtml1-transitional"); assertEquals(INCORRECT_NUMBER_OF_VIOLATIONS, 2, sourceCode.getViolations().size()); assertEquals((Integer) 16, sourceCode.getViolations().get(0).getLineId()); // check if all violations resolved to messages checkViolationMessages(sourceCode); } @Test public void violateFaceletsSchema() throws FileNotFoundException { String fileName = "src/test/resources/checks/generic/create-salesorder2.xhtml"; FileReader reader = new FileReader(fileName); XmlSourceCode sourceCode = parseAndCheck(reader, new File(fileName), null, XmlSchemaCheck.class, SCHEMAS, "http://java.sun.com/jsf/core"); assertEquals(INCORRECT_NUMBER_OF_VIOLATIONS, 0, sourceCode.getViolations().size()); // assertEquals((Integer) , sourceCode.getViolations().get(0).getLineId()); } @Test public void violateJsfSchema() throws FileNotFoundException { String fileName = "src/test/resources/checks/generic/create-salesorder2.xhtml"; FileReader reader = new FileReader(fileName); XmlSourceCode sourceCode = parseAndCheck(reader, new File(fileName), null, XmlSchemaCheck.class, SCHEMAS, "http://java.sun.com/jsf/html"); assertEquals(INCORRECT_NUMBER_OF_VIOLATIONS, 1, sourceCode.getViolations().size()); assertEquals((Integer) 8, sourceCode.getViolations().get(0).getLineId()); } @Test public void violateLocalXmlSchemaCheck() throws FileNotFoundException { String fileName = "src/test/resources/checks/generic/catalog.xml"; FileReader reader = new FileReader(fileName); XmlSourceCode sourceCode = parseAndCheck(reader, new File(fileName), null, XmlSchemaCheck.class, SCHEMAS, "src/test/resources/checks/generic/catalog.xsd"); assertEquals(INCORRECT_NUMBER_OF_VIOLATIONS, 1, sourceCode.getViolations().size()); assertEquals((Integer) 5, sourceCode.getViolations().get(0).getLineId()); } @Test public void violateSonarSource() throws FileNotFoundException { String fileName = "src/test/resources/checks/generic/sonarsource.html"; FileReader reader = new FileReader(fileName); XmlSourceCode sourceCode = parseAndCheck(reader, new File(fileName), null, XmlSchemaCheck.class, SCHEMAS, "xhtml1-transitional"); // check if all violations resolved to messages checkViolationMessages(sourceCode); } @Test public void violateStrictHtml1heck() throws FileNotFoundException { String fileName = SRC_TEST_RESOURCES_CHECKS_GENERIC_TENDER_NED_AANKONDIGINGEN_XHTML; FileReader reader = new FileReader(fileName); XmlSourceCode sourceCode = parseAndCheck(reader, new File(fileName), null, XmlSchemaCheck.class, SCHEMAS, "xhtml1-strict"); assertEquals(INCORRECT_NUMBER_OF_VIOLATIONS, 164, sourceCode.getViolations().size()); // check if all violations resolved to messages checkViolationMessages(sourceCode); } }