/*
 * 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.rat.annotation;

import org.apache.commons.io.IOUtils;
import org.apache.rat.test.utils.Resources;
import org.junit.ClassRule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;

public class TestLicenseAppender {
    @ClassRule
    public static TemporaryFolder baseTempFolder = new TemporaryFolder();

    private static final String FIRST_LICENSE_LINE = " Licensed to the Apache Software Foundation (ASF) under one";

    private interface FileCreator {
        void createFile(Writer w) throws IOException;
    }

    private interface NewFileReader {
        void readFile(BufferedReader r) throws IOException;
    }

    private static String getTemporaryFileWithName(String fileName) throws IOException {
        if (fileName != null) {
            return baseTempFolder.newFile(fileName).getAbsolutePath();
        } else {
            return baseTempFolder.newFile().getAbsolutePath();
        }
    }

    private static void createTestFile(String fileName,
                                       FileCreator creator)
            throws IOException {
        FileWriter w = null;
        try {
            creator.createFile(w = new FileWriter(fileName));
        } finally {
            IOUtils.closeQuietly(w);
        }
    }

    private static void tryToDelete(File f) {
        if (f != null && f.exists() && !f.delete()) {
            f.deleteOnExit();
        }
    }

    private static void commonTestTemplate(String relativeName,
                                           FileCreator creator,
                                           NewFileReader reader)
            throws IOException {
        String name = getTemporaryFileWithName(relativeName);
        try {
            createTestFile(name, creator);

            ApacheV2LicenseAppender appender =
                    new ApacheV2LicenseAppender();
            appender.append(new File(name));

            BufferedReader r = null;
            try {
                r = new BufferedReader(new FileReader(name + ".new"));
                reader.readFile(r);
            } finally {
                IOUtils.closeQuietly(r);
            }
        } finally {
            tryToDelete(new File(name));
            tryToDelete(new File(name + ".new"));
        }
    }

    private static NewFileReader checkLines(final String firstLine,
                                            final String secondLine) {
        return new NewFileReader() {
            public void readFile(BufferedReader r) throws IOException {
                String line = r.readLine();
                assertEquals("First line is incorrect",
                        firstLine, line);
                if (secondLine != null) {
                    line = r.readLine();
                    assertEquals("Second line is incorrect",
                            secondLine, line);
                }
            }
        };
    }

    private static NewFileReader checkLines(final String firstLine,
                                            final String secondLine,
                                            final String thirdLine) {
        return new NewFileReader() {
            public void readFile(BufferedReader r) throws IOException {
                String line = r.readLine();
                assertEquals("First line is incorrect",
                        firstLine, line);
                if (secondLine != null) {
                    line = r.readLine();
                    assertEquals("Second line is incorrect",
                            secondLine, line);
                }
                if (thirdLine != null) {
                    line = r.readLine();
                    assertEquals("Third line is incorrect",
                            thirdLine, line);
                }
            }
        };
    }

    @Test
    public void addLicenseToUnknownFile() throws IOException {
        String filename = getTemporaryFileWithName(null);
        createTestFile(filename, new FileCreator() {
            public void createFile(Writer writer)
                    throws IOException {
                writer.write("Unknown file type\n");
            }
        });

        File file = new File(filename);
        file.deleteOnExit();
        ApacheV2LicenseAppender appender =
                new ApacheV2LicenseAppender();
        appender.append(file);

        File newFile = new File(filename + ".new");
        newFile.deleteOnExit();
        assertFalse("No new file should have been written",
                newFile.exists());
    }

    @Test
    public void addLicenseToJava() throws IOException {
        String filename = "tmp.java";
        final String firstLine = "package foo;";
        final String secondLine = "";
        final String thirdLine = "/*";
        commonTestTemplate(filename, new FileCreator() {
                    public void createFile(Writer writer)
                            throws IOException {
                        writer.write(firstLine + "\n");
                        writer.write("\n");
                        writer.write("public class test {\n");
                        writer.write("}\n");
                    }
                },
                checkLines(firstLine, secondLine, thirdLine));
    }

    @Test
    public void addLicenseToJavaWithoutPackage() throws IOException {
        String filename = "tmp.java";
        String commentLine = "/*";
        commonTestTemplate(filename, new FileCreator() {
                    public void createFile(Writer writer)
                            throws IOException {
                        writer.write("public class test {\n");
                        writer.write("}\n");
                    }
                },
                checkLines(commentLine, null));
    }

    @Test
    public void addLicenseToXML() throws IOException {
        String filename = "tmp.xml";
        final String firstLine = "<?xml version='1.0'?>";
        final String secondLine = "";
        final String thirdLine = "<!--";

        commonTestTemplate(filename, new FileCreator() {
                    public void createFile(Writer writer)
                            throws IOException {
                        writer.write(firstLine + "\n");
                        writer.write("\n");
                        writer.write("<xml>\n");
                        writer.write("</xml>\n");
                    }
                },
                checkLines(firstLine, secondLine, thirdLine));
    }

    @Test
    public void addLicenseToXMLWithoutDecl() throws IOException {
        String filename = "tmp.xml";
        final String firstLine = "<?xml version='1.0'?>";
        final String secondLine = "<!--";

        commonTestTemplate(filename, new FileCreator() {
                    public void createFile(Writer writer)
                            throws IOException {
                        writer.write("<xml>\n");
                        writer.write("</xml>\n");
                    }
                },
                checkLines(firstLine, secondLine));
    }

    @Test
    public void addLicenseToHTML() throws IOException {
        String filename = "tmp.html";
        String commentLine = "<!--";

        commonTestTemplate(filename, new FileCreator() {
                    public void createFile(Writer writer)
                            throws IOException {
                        writer.write("<html>\n");
                        writer.write("\n");
                        writer.write("</html>\n");
                    }
                },
                checkLines(commentLine, null));
    }

    @Test
    public void addLicenseToCSS() throws IOException {
        String filename = "tmp.css";
        String firstLine = "/*";

        commonTestTemplate(filename, new FileCreator() {
                    public void createFile(Writer writer)
                            throws IOException {
                        writer.write(".class {\n");
                        writer.write(" background-color: red;");
                        writer.write("}\n");
                    }
                },
                checkLines(firstLine, null));
    }

    @Test
    public void addLicenseToJavascript() throws IOException {
        String filename = "tmp.js";
        String firstLine = "/*";

        commonTestTemplate(filename, new FileCreator() {
                    public void createFile(Writer writer)
                            throws IOException {
                        writer.write("if (a ==b) {>\n");
                        writer.write(" alert(\"how useful!\");");
                        writer.write("}\n");
                    }
                },
                checkLines(firstLine, null));
    }

    @Test
    public void addLicenseToAPT() throws IOException {
        String filename = "tmp.apt";
        String firstLine = "~~" + FIRST_LICENSE_LINE;

        commonTestTemplate(filename, new FileCreator() {
                    public void createFile(Writer writer)
                            throws IOException {
                        writer.write("A Simple APT file");
                        writer.write(" This file contains nothing\n");
                        writer.write(" of any importance\n");
                    }
                },
                checkLines(firstLine, null));
    }

    @Test
    public void addLicenseToProperties() throws IOException {
        String filename = "tmp.properties";
        String firstLine = "#" + FIRST_LICENSE_LINE;

        commonTestTemplate(filename, new FileCreator() {
                    public void createFile(Writer writer)
                            throws IOException {
                        writer.write("property = value\n");
                        writer.write("fun = true\n");
                        writer.write("cool = true\n");
                    }
                },
                checkLines(firstLine, null));
    }

    @Test
    public void addLicenseToScala() throws IOException {
        String filename = "tmp.scala";
        final String firstLine = "package foo {";
        final String newFirstLine = "/*";

        commonTestTemplate(filename, new FileCreator() {
                    public void createFile(Writer writer)
                            throws IOException {
                        writer.write(firstLine + "\n");
                        writer.write("\n");
                        writer.write("    object X { val x = 1; }\n");
                        writer.write("}\n");
                    }
                },
                new NewFileReader() {
                    public void readFile(BufferedReader reader)
                            throws IOException {
                        String line = reader.readLine();
                        assertEquals("First line is incorrect",
                                newFirstLine, line);
                        while ((line = reader.readLine()) != null) {
                            if (line.length() == 0) {
                                line = reader.readLine();
                                break;
                            }
                        }
                        assertEquals("Package line is incorrect",
                                firstLine, line);
                    }
                });
    }

    @Test
    public void addLicenseToRubyWithoutHashBang()
            throws IOException {
        String filename = "tmp.rb";
        String firstLine = "#" + FIRST_LICENSE_LINE;

        commonTestTemplate(filename, new FileCreator() {
                    public void createFile(Writer writer)
                            throws IOException {
                        writer.write("class Foo\n");
                        writer.write("end\n");
                    }
                },
                checkLines(firstLine, null));
    }

    @Test
    public void addLicenseToRubyWithHashBang() throws IOException {
        String filename = "tmp.rb";
        final String firstLine = "#!/usr/bin/env ruby";
        String secondLine = "#" + FIRST_LICENSE_LINE;

        commonTestTemplate(filename, new FileCreator() {
                    public void createFile(Writer writer)
                            throws IOException {
                        writer.write(firstLine + "\n");
                        writer.write("class Foo\n");
                        writer.write("end\n");
                    }
                },
                checkLines(firstLine, secondLine));
    }

    @Test
    public void addLicenseToPerlWithoutHashBang()
            throws IOException {
        String filename = "tmp.pl";
        String firstLine = "#" + FIRST_LICENSE_LINE;

        commonTestTemplate(filename, new FileCreator() {
                    public void createFile(Writer writer)
                            throws IOException {
                        writer.write("print \"Hello world\"\n");
                    }
                },
                checkLines(firstLine, null));
    }

    @Test
    public void addLicenseToPerlWithHashBang() throws IOException {
        String filename = "tmp.pl";
        final String firstLine = "#!/usr/bin/env perl";
        String secondLine = "#" + FIRST_LICENSE_LINE;

        commonTestTemplate(filename, new FileCreator() {
                    public void createFile(Writer writer)
                            throws IOException {
                        writer.write(firstLine + "\n");
                        writer.write("print \"Hello world\"\n");
                    }
                },
                checkLines(firstLine, secondLine));
    }

    @Test
    public void addLicenseToTclWithoutHashBang()
            throws IOException {
        String filename = "tmp.tcl";
        String firstLine = "#" + FIRST_LICENSE_LINE;

        commonTestTemplate(filename, new FileCreator() {
                    public void createFile(Writer writer)
                            throws IOException {
                        writer.write("puts \"Hello world\"\n");
                    }
                },
                checkLines(firstLine, null));
    }

    @Test
    public void addLicenseToTclWithHashBang() throws IOException {
        String filename = "tmp.tcl";
        final String firstLine = "#!/usr/bin/env tcl";
        String secondLine = "#" + FIRST_LICENSE_LINE;

        commonTestTemplate(filename, new FileCreator() {
                    public void createFile(Writer writer)
                            throws IOException {
                        writer.write(firstLine + "\n");
                        writer.write("puts \"Hello world\"\n");
                    }
                },
                checkLines(firstLine, secondLine));
    }

    @Test
    public void addLicenseToPHP() throws IOException {
        String filename = "tmp.php";
        final String firstLine = "<?php";
        final String secondLine = "";
        final String thirdLine = "/*";

        commonTestTemplate(filename, new FileCreator() {
                    public void createFile(Writer writer)
                            throws IOException {
                        writer.write(firstLine + "\n");
                        writer.write("echo 'Hello World'\n");
                        writer.write("?>\n");
                    }
                },
                checkLines(firstLine, secondLine, thirdLine));
    }

    @Test
    public void addLicenseToCSharp() throws IOException {
        String filename = "tmp.cs";
        String firstLine = "/*";

        commonTestTemplate(filename, new FileCreator() {
                    public void createFile(Writer writer)
                            throws IOException {
                        writer.write("namespace org.example {\n");
                        writer.write("    public class Foo {\n");
                        writer.write("    }\n");
                        writer.write("}\n");
                    }
                },
                checkLines(firstLine, null));
    }

    @Test
    public void addLicenseToGroovy() throws IOException {
        String filename = "tmp.groovy";
        String firstLine = "/*";

        commonTestTemplate(filename, new FileCreator() {
                    public void createFile(Writer writer)
                            throws IOException {
                        writer.write("package org.example \n");
                        writer.write("    class Foo {\n");
                        writer.write("    }\n");
                    }
                },
                checkLines(firstLine, null));
    }

    @Test
    public void addLicenseToCPlusPlus() throws IOException {
        String filename = "tmp.cpp";
        String firstLine = "/*";

        commonTestTemplate(filename, new FileCreator() {
                    public void createFile(Writer writer)
                            throws IOException {
                        writer.write("namespace org.example {\n");
                        writer.write("    public class Foo {\n");
                        writer.write("    }\n");
                        writer.write("}\n");
                    }
                },
                checkLines(firstLine, null));
    }

    @Test
    public void fileWithBOM() throws IOException {
        File f = Resources.getResourceFile("violations/FilterTest.cs");
        try {
            ApacheV2LicenseAppender appender =
                    new ApacheV2LicenseAppender();
            appender.append(f);

            BufferedReader r = null;
            try {
                r = new BufferedReader(new FileReader(f.getAbsolutePath()
                        + ".new"));
                assertEquals("/*", r.readLine());
                String line = null;
                while ((line = r.readLine()) != null) {
                    if (line.trim().length() == 0) {
                        break;
                    }
                }
                assertEquals("#if NET_2_0", r.readLine());
            } finally {
                IOUtils.closeQuietly(r);
            }
        } finally {
            tryToDelete(new File(f.getAbsolutePath() + ".new"));
        }
    }

    @Test
    public void addLicenseToVS2003solution() throws IOException {
        String filename = "tmp.sln";
        final String firstLine = "Microsoft Visual Studio Solution File,"
                + " Format Version 8.0";
        String secondLine = "#" + FIRST_LICENSE_LINE;

        commonTestTemplate(filename, new FileCreator() {
                    public void createFile(Writer writer)
                            throws IOException {
                        writer.write(firstLine + "\n");
                        writer.write("Project(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ConsoleApp\", \"Tutorials\\ConsoleApp\\cs\\src\\ConsoleApp.csproj\", \"{933969DF-2BC5-44E6-8B1A-400FC276A23F}\"\n");
                        writer.write("\tProjectSection(WebsiteProperties) = preProject\n");
                        writer.write("\t\tDebug.AspNetCompiler.Debug = \"True\"\n");
                        writer.write("\t\tRelease.AspNetCompiler.Debug = \"False\"\n");
                        writer.write("\tEndProjectSection\n");
                        writer.write("EndProject\n");
                    }
                },
                checkLines(firstLine, secondLine));
    }

    @Test
    public void addLicenseToVS2005solution() throws IOException {
        String filename = "tmp.sln";
        final String firstLine = "Microsoft Visual Studio Solution File,"
                + " Format Version 9.0";
        final String secondLine = "# Visual Studio 2005";
        final String thirdLine = "#" + FIRST_LICENSE_LINE;

        commonTestTemplate(filename, new FileCreator() {
                    public void createFile(Writer writer)
                            throws IOException {
                        writer.write(firstLine + "\n");
                        writer.write(secondLine + "\n");
                        writer.write("Project(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ConsoleApp\", \"Tutorials\\ConsoleApp\\cs\\src\\ConsoleApp.csproj\", \"{933969DF-2BC5-44E6-8B1A-400FC276A23F}\"\n");
                        writer.write("\tProjectSection(WebsiteProperties) = preProject\n");
                        writer.write("\t\tDebug.AspNetCompiler.Debug = \"True\"\n");
                        writer.write("\t\tRelease.AspNetCompiler.Debug = \"False\"\n");
                        writer.write("\tEndProjectSection\n");
                        writer.write("EndProject\n");
                    }
                },
                new NewFileReader() {
                    public void readFile(BufferedReader r) throws IOException {
                        String line = r.readLine();
                        assertEquals("First line is incorrect",
                                firstLine, line);
                        line = r.readLine();
                        assertEquals("Second line is incorrect",
                                secondLine, line);
                        line = r.readLine();
                        assertEquals("Third line is incorrect",
                                thirdLine, line);
                    }
                });
    }

    @Test
    public void addLicenseToVS2010ExpressSolution() throws IOException {
        String filename = "tmp.sln";
        final String firstLine = "Microsoft Visual Studio Solution File, "
                + "Format Version 11.00";
        final String secondLine = "# Visual C# Express 2010";
        final String thirdLine = "#" + FIRST_LICENSE_LINE;

        commonTestTemplate(filename, new FileCreator() {
                    public void createFile(Writer writer)
                            throws IOException {
                        writer.write(firstLine + "\n");
                        writer.write(secondLine + "\n");
                        writer.write("Project(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Lucene.Net\", \"..\\..\\..\\src\\core\\Lucene.Net.csproj\", \"{5D4AD9BE-1FFB-41AB-9943-25737971BF57}\"\n");
                        writer.write("EndProject\n");
                        writer.write("Project(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Contrib.Highlighter\", \"..\\..\\..\\src\\contrib\\Highlighter\\Contrib.Highlighter.csproj\", \"{901D5415-383C-4AA6-A256-879558841BEA}\"\n");
                        writer.write("EndProject\n");
                        writer.write("Global\n");
                        writer.write("GlobalSection(SolutionConfigurationPlatforms) = preSolution\n");
                        writer.write("Debug|Any CPU = Debug|Any CPU\n");
                        writer.write("Release|Any CPU = Release|Any CPU\n");
                        writer.write("EndGlobalSection\n");
                        writer.write("GlobalSection(ProjectConfigurationPlatforms) = postSolution\n");
                        writer.write("{5D4AD9BE-1FFB-41AB-9943-25737971BF57}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n");
                        writer.write("{5D4AD9BE-1FFB-41AB-9943-25737971BF57}.Debug|Any CPU.Build.0 = Debug|Any CPU\n");
                        writer.write("{5D4AD9BE-1FFB-41AB-9943-25737971BF57}.Release|Any CPU.ActiveCfg = Release|Any CPU\n");
                        writer.write("{5D4AD9BE-1FFB-41AB-9943-25737971BF57}.Release|Any CPU.Build.0 = Release|Any CPU\n");
                        writer.write("{901D5415-383C-4AA6-A256-879558841BEA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n");
                        writer.write("{901D5415-383C-4AA6-A256-879558841BEA}.Debug|Any CPU.Build.0 = Debug|Any CPU\n");
                        writer.write("{901D5415-383C-4AA6-A256-879558841BEA}.Release|Any CPU.ActiveCfg = Release|Any CPU\n");
                        writer.write("{901D5415-383C-4AA6-A256-879558841BEA}.Release|Any CPU.Build.0 = Release|Any CPU\n");
                        writer.write("EndGlobalSection\n");
                        writer.write("GlobalSection(SolutionProperties) = preSolution\n");
                        writer.write("HideSolutionNode = FALSE\n");
                        writer.write("EndGlobalSection\n");
                        writer.write("EndGlobal \n");
                    }
                },
                new NewFileReader() {
                    public void readFile(BufferedReader r) throws IOException {
                        String line = r.readLine();
                        assertEquals("First line is incorrect",
                                firstLine, line);
                        line = r.readLine();
                        assertEquals("Second line is incorrect",
                                secondLine, line);
                        line = r.readLine();
                        assertEquals("Third line is incorrect",
                                thirdLine, line);
                    }
                });
    }

    @Test
    public void addLicenseToVS2010SolutionWithBlankLine() throws IOException {
        String filename = "tmp.sln";
        final String firstLine = "";
        final String secondLine = "Microsoft Visual Studio Solution File, "
                + "Format Version 11.00";
        final String thirdLine = "# Visual C# Express 2010";
        final String forthLine = "#" + FIRST_LICENSE_LINE;

        commonTestTemplate(filename, new FileCreator() {
                    public void createFile(Writer writer)
                            throws IOException {
                        writer.write(firstLine + "\n");
                        writer.write(secondLine + "\n");
                        writer.write(thirdLine + "\n");
                        writer.write("Project(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Lucene.Net\", \"..\\..\\..\\src\\core\\Lucene.Net.csproj\", \"{5D4AD9BE-1FFB-41AB-9943-25737971BF57}\"\n");
                        writer.write("EndProject\n");
                        writer.write("Project(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Contrib.Highlighter\", \"..\\..\\..\\src\\contrib\\Highlighter\\Contrib.Highlighter.csproj\", \"{901D5415-383C-4AA6-A256-879558841BEA}\"\n");
                        writer.write("EndProject\n");
                        writer.write("Global\n");
                        writer.write("GlobalSection(SolutionConfigurationPlatforms) = preSolution\n");
                        writer.write("Debug|Any CPU = Debug|Any CPU\n");
                        writer.write("Release|Any CPU = Release|Any CPU\n");
                        writer.write("EndGlobalSection\n");
                        writer.write("GlobalSection(ProjectConfigurationPlatforms) = postSolution\n");
                        writer.write("{5D4AD9BE-1FFB-41AB-9943-25737971BF57}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n");
                        writer.write("{5D4AD9BE-1FFB-41AB-9943-25737971BF57}.Debug|Any CPU.Build.0 = Debug|Any CPU\n");
                        writer.write("{5D4AD9BE-1FFB-41AB-9943-25737971BF57}.Release|Any CPU.ActiveCfg = Release|Any CPU\n");
                        writer.write("{5D4AD9BE-1FFB-41AB-9943-25737971BF57}.Release|Any CPU.Build.0 = Release|Any CPU\n");
                        writer.write("{901D5415-383C-4AA6-A256-879558841BEA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n");
                        writer.write("{901D5415-383C-4AA6-A256-879558841BEA}.Debug|Any CPU.Build.0 = Debug|Any CPU\n");
                        writer.write("{901D5415-383C-4AA6-A256-879558841BEA}.Release|Any CPU.ActiveCfg = Release|Any CPU\n");
                        writer.write("{901D5415-383C-4AA6-A256-879558841BEA}.Release|Any CPU.Build.0 = Release|Any CPU\n");
                        writer.write("EndGlobalSection\n");
                        writer.write("GlobalSection(SolutionProperties) = preSolution\n");
                        writer.write("HideSolutionNode = FALSE\n");
                        writer.write("EndGlobalSection\n");
                        writer.write("EndGlobal \n");
                    }
                },
                new NewFileReader() {
                    public void readFile(BufferedReader r) throws IOException {
                        String line = r.readLine();
                        assertEquals("First line is incorrect",
                                firstLine, line);
                        line = r.readLine();
                        assertEquals("Second line is incorrect",
                                secondLine, line);
                        line = r.readLine();
                        assertEquals("Third line is incorrect",
                                thirdLine, line);
                        line = r.readLine();
                        assertEquals("Forth line is incorrect",
                                forthLine, line);
                    }
                });
    }
}
