blob: 58b6b6e147ef6527d90a5e79ef6ed99b818c114d [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
*
* 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.netbeans.nbbuild;
import java.io.File;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* @author Jaroslav Tulach
*/
public class CheckLicenseTest extends TestBase {
public CheckLicenseTest(String testName) {
super(testName);
}
public void testWeCanSearchForSunPublicLicense() throws Exception {
java.io.File license = extractString(
"<!-- Sun Public License -->\n" +
"<head></head><body>\n" +
"<a href=\"http://www.netbeans.org/download/dev/javadoc/OpenAPIs/index.hml\">Forbidden link</a>\n" +
"</body>"
);
java.io.File f = extractString (
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
"<project name=\"Test\" basedir=\".\" default=\"all\" >" +
" <taskdef name=\"checkl\" classname=\"org.netbeans.nbbuild.CheckLicense\" classpath=\"${nbantext.jar}\"/>" +
"<target name=\"all\" >" +
" <checkl fragment='Sun Public' >" +
" <fileset dir='" + license.getParent() + "'>" +
" <include name=\"" + license.getName () + "\" />" +
" </fileset>\n" +
" </checkl>" +
"</target>" +
"</project>"
);
// success
execute (f, new String[] { });
if (getStdErr().indexOf(license.getPath()) > - 1) {
fail("file name shall not be there: " + getStdErr());
}
if (getStdErr().indexOf("no license") > - 1) {
fail("warning shall not be there: " + getStdErr());
}
}
public void testTheTaskFailsIfItIsPresent() throws Exception {
java.io.File license = extractString(
"<!-- Sun Public License -->\n" +
"<head></head><body>\n" +
"<a href=\"http://www.netbeans.org/download/dev/javadoc/OpenAPIs/index.hml\">Forbidden link</a>\n" +
"</body>"
);
java.io.File license2 = extractString(
"<!-- Sun Public License -->\n" +
"<head></head><body>\n" +
"<a href=\"http://www.netbeans.org/download/dev/javadoc/OpenAPIs/index.hml\">Forbidden link</a>\n" +
"</body>"
);
assertEquals(license.getParent(), license2.getParent());
java.io.File f = extractString (
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
"<project name=\"Test\" basedir=\".\" default=\"all\" >" +
" <taskdef name=\"checkl\" classname=\"org.netbeans.nbbuild.CheckLicense\" classpath=\"${nbantext.jar}\"/>" +
"<target name=\"all\" >" +
" <checkl fragment='Sun Public' fail='whenpresent' >" +
" <fileset dir='" + license.getParent() + "'>" +
" <include name=\"" + license.getName () + "\" />" +
" <include name=\"" + license2.getName () + "\" />" +
" </fileset>\n" +
" </checkl>" +
"</target>" +
"</project>"
);
try {
execute (f, new String[] { });
fail("Should fail as the license is missing");
} catch (ExecutionError ex) {
// ok
}
String out = getStdErr();
if (out.indexOf(license.getName()) == -1) {
fail(license.getName() + " should be there: " + out);
}
if (out.indexOf(license2.getName()) == -1) {
fail(license2.getName() + " should be there: " + out);
}
}
public void testTheTaskReportsIfItIsMissing() throws Exception {
java.io.File license = extractString(
"<head></head><body>\n" +
"<a href=\"http://www.netbeans.org/download/dev/javadoc/OpenAPIs/index.hml\">Forbidden link</a>\n" +
"</body>"
);
java.io.File f = extractString (
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
"<project name=\"Test\" basedir=\".\" default=\"all\" >" +
" <taskdef name=\"checkl\" classname=\"org.netbeans.nbbuild.CheckLicense\" classpath=\"${nbantext.jar}\"/>" +
"<target name=\"all\" >" +
" <checkl fragment='Sun Public' >" +
" <fileset dir='" + license.getParent() + "'>" +
" <include name=\"" + license.getName () + "\" />" +
" </fileset>\n" +
" </checkl>" +
"</target>" +
"</project>"
);
// success
execute (f, new String[] { });
if (getStdErr().indexOf(license.getPath()) == - 1) {
fail("file name shall be there: " + getStdErr());
}
if (getStdErr().indexOf("no license") == - 1) {
fail("warning shall be there: " + getStdErr());
}
}
public void testNoReportsWhenInFailMode() throws Exception {
java.io.File license = extractString(
"<head></head><body>\n" +
"<a href=\"http://www.netbeans.org/download/dev/javadoc/OpenAPIs/index.hml\">Forbidden link</a>\n" +
"</body>"
);
java.io.File f = extractString (
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
"<project name=\"Test\" basedir=\".\" default=\"all\" >" +
" <taskdef name=\"checkl\" classname=\"org.netbeans.nbbuild.CheckLicense\" classpath=\"${nbantext.jar}\"/>" +
"<target name=\"all\" >" +
" <checkl fragment='Sun Public' fail='whenpresent'>" +
" <fileset dir='" + license.getParent() + "'>" +
" <include name=\"" + license.getName () + "\" />" +
" </fileset>\n" +
" </checkl>" +
"</target>" +
"</project>"
);
// success
execute (f, new String[] { });
if (getStdErr().indexOf(license.getPath()) != - 1) {
fail("file name shall not be there: " + getStdErr());
}
if (getStdErr().indexOf("no license") != - 1) {
fail("warning shall not be there: " + getStdErr());
}
}
public void testTheTaskFailsIfItIsMissing() throws Exception {
java.io.File license = extractString(
"<head></head><body>\n" +
"<a href=\"http://www.netbeans.org/download/dev/javadoc/OpenAPIs/index.hml\">Forbidden link</a>\n" +
"</body>"
);
java.io.File f = extractString (
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
"<project name=\"Test\" basedir=\".\" default=\"all\" >" +
" <taskdef name=\"checkl\" classname=\"org.netbeans.nbbuild.CheckLicense\" classpath=\"${nbantext.jar}\"/>" +
"<target name=\"all\" >" +
" <checkl fragment='Sun Public' fail='whenmissing' >" +
" <fileset dir='" + license.getParent() + "'>" +
" <include name=\"" + license.getName () + "\" />" +
" </fileset>\n" +
" </checkl>" +
"</target>" +
"</project>"
);
try {
execute (f, new String[] { });
fail("Should fail as the license is missing");
} catch (ExecutionError ex) {
// ok
}
}
public void testReplaceJavaLicense() throws Exception {
java.io.File tmp = extractString(
"/**\n" +
" * Licensed to the Apache Software Foundation (ASF) under one\n" +
" * or more contributor license agreements. See the NOTICE file\n" +
" * distributed with this work for additional information\n" +
" * regarding copyright ownership. The ASF licenses this file\n" +
" * to you under the Apache License, Version 2.0 (the\n" +
" * \"License\"); you may not use this file except in compliance\n" +
" * with the License. You may obtain a copy of the License at\n" +
" *\n" +
" * http://www.apache.org/licenses/LICENSE-2.0\n" +
" *\n" +
" * Unless required by applicable law or agreed to in writing,\n" +
" * software distributed under the License is distributed on an\n" +
" * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n" +
" * KIND, either express or implied. See the License for the\n" +
" * specific language governing permissions and limitations\n" +
" * under the License.\n" +
" */"
);
File java = new File(tmp.getParentFile(), "MyTest.java");
tmp.renameTo(java);
assertTrue("File exists", java.exists());
java.io.File f = extractResource("CheckLicenseAnt.xml");
execute (f, new String[] {
"-verbose",
"-Ddir=" + java.getParent(),
"-Dinclude=" + java.getName(),
});
if (getStdOut().indexOf(java.getPath()) == - 1) {
fail("file name shall be there: " + getStdOut());
}
assertTrue("Still exists", java.exists());
String content = readFile(java);
{
Matcher m = Pattern.compile("\\* *Ahoj *\\* *Jardo").matcher(content.replace('\n', ' '));
if (!m.find()) {
fail("Replacement shall be there together with prefix:\n" + content);
}
}
{
Matcher m = Pattern.compile("^ \\*New. \\*Warning", Pattern.MULTILINE | Pattern.DOTALL).matcher(content);
if (!m.find()) {
fail("warning shall be there:\n" + content);
}
}
{
String[] lines = content.split("\n");
if (lines.length < 5) {
fail("There should be more than five lines: " + content);
}
for (int i = 0; i < lines.length; i++) {
if (lines[i].length() == 0) {
fail("There is an empty line: " + content);
}
if (lines[i].equals(" */")) {
break;
}
if (lines[i].endsWith(" ")) {
fail("Ends with space: '" + lines[i] + "' in:\n" + content);
}
}
}
}
public void testReplaceHTMLLicense() throws Exception {
java.io.File f = extractResource("CheckLicenseAnt.xml");
java.io.File tmp = extractResource("CheckLicenseHtmlExample.xml");
File html = new File(tmp.getParentFile(), "MyTest.html");
tmp.renameTo(html);
assertTrue("File exists", html.exists());
execute (f, new String[] {
"-verbose",
"-Ddir=" + html.getParent(),
"-Dinclude=" + html.getName(),
});
if (getStdOut().indexOf(html.getPath()) == - 1) {
fail("file name shall be there: " + getStdOut());
}
assertTrue("Still exists", html.exists());
String content = readFile(html);
{
Matcher m = Pattern.compile(" *- *Ahoj *- *Jardo").matcher(content.replace('\n', ' '));
if (!m.find()) {
fail("Replacement shall be there together with prefix:\n" + content);
}
}
{
Matcher m = Pattern.compile("^ *-New. *-Warning", Pattern.MULTILINE | Pattern.DOTALL).matcher(content);
if (!m.find()) {
fail("warning shall be there:\n" + content);
}
}
{
String[] lines = content.split("\n");
if (lines.length < 5) {
fail("There should be more than five lines: " + content);
}
for (int i = 0; i < lines.length; i++) {
if (lines[i].indexOf("-->") >= 0) {
break;
}
if (lines[i].endsWith(" ")) {
fail("Ends with space: '" + lines[i] + "' in:\n" + content);
}
}
}
}
public void testNoReplaceWhenNoHTMLLicense() throws Exception {
java.io.File f = extractResource("CheckLicenseAnt.xml");
java.io.File tmp = extractString(
"<head></head><body>\n" +
"<a href=\"http://www.netbeans.org/download/dev/javadoc/OpenAPIs/index.hml\">Forbidden link</a>\n" +
"1997-2006" +
"</body>"
);
File html = new File(tmp.getParentFile(), "MyTest.html");
tmp.renameTo(html);
assertTrue("File exists", html.exists());
execute (f, new String[] {
"-Ddir=" + html.getParent(),
"-Dinclude=" + html.getName(),
});
if (getStdOut().indexOf(html.getPath()) != - 1) {
fail("file name shall not be there: " + getStdOut());
}
}
public void testMayReplaces() throws Exception {
if (isWindows()) {
return;
}
java.io.File f = extractResource("CheckLicenseAnt.xml");
java.io.File tmp = extractString(
"<head></head><body>\n" +
"<a href=\"http://www.netbeans.org/download/dev/javadoc/OpenAPIs/index.hml\">Forbidden link</a>\n" +
"Original Code\n" +
"Original Code\n" +
"Original Code\n" +
"Original Code\n" +
"</body>"
);
File html = new File(tmp.getParentFile(), "MyTest.html");
tmp.renameTo(html);
assertTrue("File exists", html.exists());
execute (f, new String[] {
"-Ddir=" + html.getParent(),
"-Dinclude=" + html.getName(),
});
if (getStdOut().indexOf("Original Code") != - 1) {
fail("Original Code shall not be there: " + getStdOut());
}
String out = readFile(html);
int first = out.indexOf("Original Software");
if (first == - 1) {
fail("Original Software shall be there: " + out);
}
if (out.indexOf("Original Software", first + 1) == - 1) {
fail("Original Software shall be there: " + out);
}
}
public void testWrongLineBeginningsWhenNoPrefix() throws Exception {
String txt = "<!--\n" +
" Sun Public License Notice\n" +
"\n" +
"The contents of this file are subject to the Sun Public License\n" +
"Version 1.0 (the 'License'). You may not use this file except in\n" +
"compliance with the License. A copy of the License is available at\n" +
"http://www.sun.com/\n" +
"\n" +
"The Original Code is NetBeans. The Initial Developer of the Original\n" +
"Code is Sun Microsystems, Inc. Portions Copyright 1997-2005 Sun\n" +
"Microsystems, Inc. All Rights Reserved.\n" +
"-->\n";
String script = createScript();
File fileScript = extractString(script);
File fileTxt = extractString(txt);
execute (fileScript, new String[] {
"-Ddir=" + fileTxt.getParent(),
"-Dinclude=" + fileTxt.getName(),
});
if (getStdOut().indexOf("Original Code") != - 1) {
fail("Original Code shall not be there: " + getStdOut());
}
String out = readFile(fileTxt);
String[] arr = out.split("\n");
for (int i = 0; i < arr.length; i++) {
if (arr[i].endsWith(" ")) {
fail("Ends with space: '" + arr[i] + "' in:\n" + out);
}
if (arr[i].length() < 2) {
continue;
}
if (arr[i].charAt(0) != ' ') {
continue;
}
fail("This line seems to start with space:\n" + arr[i] + "\nwhich is wrong in whole output:\n" + out);
}
}
private static String createScript() {
String script =
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
"<project name=\"Test\" basedir=\".\" default=\"all\" >" +
" <taskdef name=\"checklicense\" classname=\"org.netbeans.nbbuild.CheckLicense\" classpath=\"${nbantext.jar}\"/>" +
"<target name=\"all\" >" +
" <checklicense >\n" +
" <fileset dir='${dir}'>\n" +
" <include name='${include}'/>" +
" </fileset>\n" +
"\n" +
" <convert \n" +
" token='^([ \\t]*[^ \\n]+[ \\t]?)?[ \\t]*Sun Public License Notice' \n" +
" prefix='true'\n" +
" >\n" +
" <line text='The contents of this file are subject to the terms of the Common Development'/>\n" +
" <line text='and Distribution License (the License). You may not use this file except in'/>\n" +
" <line text='compliance with the License.'/>\n" +
" </convert>\n" +
" <convert \n" +
" token='The *contents *of *this *file *are\n" +
" *subject *to *the *Sun *Public.*available.*at.*([hH][tT][tT][pP]://www.sun.com/|http://jalopy.sf.net/license-spl.html)'\n" +
" >\n" +
" <line text='You can obtain a copy of the License at http://www.netbeans.org/cddl.html'/>\n" +
" <line text='or http://www.netbeans.org/cddl.txt.'/>\n" +
" <line text=''/>\n" +
" <line text='When distributing Covered Code, include this CDDL Header Notice in each file'/>\n" +
" <line text='and include the License file at http://www.netbeans.org/cddl.txt.'/>\n" +
" <line text='If applicable, add the following below the CDDL Header, with the fields'/>\n" +
" <line text='enclosed by brackets [] replaced by your own identifying information:'/>\n" +
" <line text='\"Portions Copyrighted [year] [name of copyright owner]\"'/>\n" +
" </convert>\n" +
" <convert token='1997-[0-2][09][09][0-9]' replace='1997-2006'/>\n" +
" <convert token='Original\\n[^A-Za-z]*Code' replace='Original\\nSoftware' replaceall='true'/>\n" +
" <convert token='Original Code' replace='Original Software' replaceall='true'/>\n" +
" </checklicense>\n" +
" </target>\n" +
" </project>\n";
return script;
}
public void testReplacesTextSeparatedByNewLine() throws Exception {
if (isWindows()) {
return;
}
java.io.File f = extractResource("CheckLicenseAnt.xml");
java.io.File tmp = extractString(
"/*\n" +
" * Sun Public License Notice\n" +
" * \n" +
" * The contents of this file are subject to the Sun Public License\n" +
" * Version 1.0 (the 'License'). You may not use this file except in\n" +
" * compliance with the License. A copy of the License is available at\n" +
" * http://www.sun.com/\n" +
" * \n" +
" * The Original Code is NetBeans. The Initial Developer of the Original\n" +
" * Code is Sun Microsystems, Inc. Portions Copyright 1997-2004 Sun\n" +
" * Microsystems, Inc. All Rights Reserved.\n" +
" */\n" +
"\n" +
"\n" +
"package org.openide.text;\n"
);
File java = new File(tmp.getParentFile(), "MyTest.html");
tmp.renameTo(java);
assertTrue("File exists", java.exists());
execute (f, new String[] {
"-Ddir=" + java.getParent(),
"-Dinclude=" + java.getName(),
});
if (getStdOut().indexOf("Code") != - 1) {
fail("Original Code shall not be there: " + getStdOut());
}
String out = readFile(java);
int first = out.indexOf("Original Software");
if (first == - 1) {
fail("Original Software shall be there: " + out);
}
if (out.indexOf("Software", first + 25) == - 1) {
fail("Original Software shall be there: " + out);
}
String[] lines = out.split("\n");
for (int i = 0; i < lines.length; i++) {
if (lines[i].length() > 80) {
fail("Too long line:\n" + lines[i] + "\n in file:\n" + out);
}
if (lines[i].endsWith(" ")) {
fail("Ends with space: '" + lines[i] + "' in:\n" + out);
}
}
}
public void testWorksOnEmptyFile() throws Exception {
java.io.File f = extractResource("CheckLicenseAnt.xml");
java.io.File tmp = extractString("");
File html = new File(tmp.getParentFile(), "MyTest.html");
tmp.renameTo(html);
assertTrue("File exists", html.exists());
execute (f, new String[] {
"-Ddir=" + html.getParent(),
"-Dinclude=" + html.getName(),
});
if (getStdOut().indexOf(html.getPath()) != - 1) {
fail("file name shall not be there: " + getStdOut());
}
}
public void testReplacePropertiesLicense() throws Exception {
if (isWindows()) {
return;
}
java.io.File f = extractResource("CheckLicenseAnt.xml");
java.io.File tmp = extractResource("CheckLicensePropertiesExample.properties");
File html = new File(tmp.getParentFile(), "MyTest.html");
tmp.renameTo(html);
assertTrue("File exists", html.exists());
execute (f, new String[] {
"-verbose",
"-Ddir=" + html.getParent(),
"-Dinclude=" + html.getName(),
});
if (getStdOut().indexOf(html.getPath()) == - 1) {
fail("file name shall be there: " + getStdOut());
}
assertTrue("Still exists", html.exists());
String content = readFile(html);
if (!content.startsWith("#")) {
fail("Shall start with #:\n" + content);
}
{
Matcher m = Pattern.compile(" *\\# *Ahoj *\\# *Jardo").matcher(content.replace('\n', ' '));
if (!m.find()) {
fail("Replacement shall be there together with prefix:\n" + content);
}
}
{
Matcher m = Pattern.compile("^ *\\#New. *\\#Warning", Pattern.MULTILINE | Pattern.DOTALL).matcher(content);
if (!m.find()) {
fail("warning shall be there:\n" + content);
}
}
{
String[] lines = content.split("\n");
if (lines.length < 5) {
fail("There should be more than five lines: " + content);
}
for (int i = 0; i < lines.length; i++) {
if (lines[i].endsWith(" ")) {
fail("Ends with space: '" + lines[i] + "' in:\n" + content);
}
if (lines[i].length() == 0) {
fail("There is an empty line: " + content);
}
if (lines[i].indexOf("Portions Copyrighted 2012 Sun Microsystems") >= 0) {
break;
}
}
}
}
private static boolean isWindows() {
String name = System.getProperty("os.name");
return name != null && name.toLowerCase().indexOf("windows") >= 0;
}
public void testReplaceXMLLicense() throws Exception {
java.io.File f = extractResource("CheckLicenseAnt.xml");
java.io.File tmp = extractResource("CheckLicenseXmlExample.xml");
File xml = new File(tmp.getParentFile(), "MyTest.xml");
tmp.renameTo(xml);
assertTrue("File exists", xml.exists());
execute (f, new String[] {
"-verbose",
"-Ddir=" + xml.getParent(),
"-Dinclude=" + xml.getName(),
});
if (getStdOut().indexOf(xml.getPath()) == - 1) {
fail("file name shall be there: " + getStdOut());
}
assertTrue("Still exists", xml.exists());
String content = readFile(xml);
if (!content.startsWith("<")) {
fail("Shall start with <:\n" + content);
}
{
Matcher m = Pattern.compile(" *Ahoj *Jardo").matcher(content.replace('\n', ' '));
if (!m.find()) {
fail("Replacement shall be there together with prefix:\n" + content);
}
}
{
Matcher m = Pattern.compile("^ *New. *Warning", Pattern.MULTILINE | Pattern.DOTALL).matcher(content);
if (!m.find()) {
fail("warning shall be there:\n" + content);
}
}
}
public void testProblemsWithTermEmulator() throws Exception {
String txt =
"/* \n" +
" * Sun Public License Notice\n" +
" *\n" +
" * The contents of this file are subject to the Sun Public License Version\n" +
" * 1.0 (the \"License\"). You may not use this file except in compliance\n" +
" * with the License. A copy of the License is available at\n" +
" * http://www.sun.com/\n" +
" * \n" +
" * The Original Code is Terminal Emulator.\n" +
" * The Initial Developer of the Original Code is Sun Microsystems, Inc..\n" +
" * Portions created by Sun Microsystems, Inc. are Copyright (C) 2001.\n" +
" * All Rights Reserved.\n" +
" *\n" +
" * Contributor(s): Ivan Soleimanipour.\n" +
" */\n";
String script = createScript();
File fileScript = extractString(script);
File fileTxt = extractString(txt);
execute (fileScript, new String[] {
"-Ddir=" + fileTxt.getParent(),
"-Dinclude=" + fileTxt.getName(),
});
if (getStdOut().indexOf("Original Code") != - 1) {
fail("Original Code shall not be there: " + getStdOut());
}
String out = readFile(fileTxt);
if (out.indexOf("Sun Public") >= 0) {
fail(out);
}
}
public void testDoubleHtmlComments() throws Exception {
java.io.File f = extractString(createScript());
java.io.File tmp = extractString(
"<!--\n" +
" -- Sun Public License Notice\n" +
" --\n" +
" -- The contents of this file are subject to the Sun Public License\n" +
" -- Version 1.0 (the \"License\"). You may not use this file except in\n" +
" -- compliance with the License. A copy of the License is available at\n" +
" -- http://www.sun.com/\n" +
" --\n" +
" -- The Original Code is NetBeans. The Initial Developer of the Original\n" +
" -- Code is Sun Microsystems, Inc. Portions Copyright 1997-2005 Sun\n" +
" -- Microsystems, Inc. All Rights Reserved.\n" +
" -->\n"
);
File file = new File(tmp.getParentFile(), "MyTest.html");
tmp.renameTo(file);
assertTrue("File exists", file.exists());
execute (f, new String[] {
"-Ddir=" + file.getParent(),
"-Dinclude=" + file.getName(),
});
String out = readFile(file);
int first = out.indexOf("Sun Public");
if (first != - 1) {
fail("Sun Public shall not be there:\n" + out);
}
}
public void testDoNotReplaceSpacesBeyondTheLicense() throws Exception {
StringBuffer sb = new StringBuffer();
sb.append('A');
for (int i = 0; i < 10000; i++) {
sb.append(' ');
}
sb.append('B');
java.io.File license = extractString(
"<!-- Sun Public License Notice -->\n" +
"<head></head><body>\n" +
"<a href=\"http://www.netbeans.org/download/dev/javadoc/OpenAPIs/index.hml\">Forbidden link</a>\n" +
"</body>" +
sb
);
String script = createScript();
execute (
extractString(script),
new String[] {
"-Ddir=" + license.getParent(),
"-Dinclude=" + license.getName(),
});
String out = readFile(license);
if (out.indexOf("Sun Public") >= 0) {
fail(out);
}
Matcher m = Pattern.compile("A( *)B").matcher(out);
if (!m.find()) {
fail("There should be long line:\n" + out);
}
if (m.group(1).length() != 10000) {
fail("There should be 10000 spaces, but is only: " + m.group(1).length() + "\n" + out);
}
}
}