/*
 * 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.sling.feature.io;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.fail;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLStreamHandler;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import java.util.jar.JarOutputStream;

import org.apache.sling.feature.io.IOUtils;
import org.junit.Test;

public class IOUtilsTest {

    @Test public void testFileSort() {
        final String[] files = new String[] {
            "/different/path/app.json",
            "/path/to/base.json",
            "/path/to/feature.json",
            "/path/to/amode/feature.json",
            "/path/to/later/feature.json",
            "http://sling.apache.org/features/one.json",
            "http://sling.apache.org/features/two.json",
            "http://sling.apache.org/features/amode/feature.json"
        };

        final List<String> l = new ArrayList<>(Arrays.asList(files));
        Collections.sort(l, IOUtils.FEATURE_PATH_COMP);
        for(int i=0; i<files.length; i++) {
            assertEquals(files[i], l.get(i));
        }
    }

    @Test public void testGetFileFromURL() throws IOException
    {
        File file = File.createTempFile("IOUtilsTest \\\\+%23öäü^^^°$::", ".test");

        try (PrintWriter writer = new PrintWriter(new OutputStreamWriter(new FileOutputStream(file), "UTF-8"))) {
            writer.println("Hello");
        }

        assertEquals(file, IOUtils.getFileFromURL(new URL("file:" + file.getPath()), false, null));

        assertEquals(file, IOUtils.getFileFromURL(file.toURI().toURL(), false, null));

        URL url = new URL(null,"bla:" + file.toURI().toURL(), new URLStreamHandler()
        {
            @Override
            protected URLConnection openConnection(URL u) throws IOException
            {
                return new URLConnection(u)
                {
                    @Override
                    public void connect() throws IOException
                    {

                    }

                    @Override
                    public InputStream getInputStream() throws IOException
                    {
                        return new FileInputStream(file);
                    }
                };
            }
        });

        assertNull(IOUtils.getFileFromURL(url, false, null));
        File tmp = IOUtils.getFileFromURL(url, true, null);

        assertNotEquals(file, tmp);
        try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(tmp), "UTF-8"))) {
            assertEquals("Hello", reader.readLine());
        }

        File jarFile = File.createTempFile("\"IOUtilsTest \\\\\\\\+%23öäü^^^°$::\"", ".jar");

        try (JarOutputStream output = new JarOutputStream(new FileOutputStream(jarFile))) {
            output.putNextEntry(new JarEntry("test"));
            output.write("Hello".getBytes());
            output.closeEntry();
        }

        assertEquals(jarFile, IOUtils.getFileFromURL(new URL("jar:file:" + jarFile.getPath() + "!/"), false, null));
        assertEquals(jarFile, IOUtils.getFileFromURL(new URL("jar:" + jarFile.toURI().toURL() + "!/"), false, null));
        assertNull(IOUtils.getFileFromURL(new URL("jar:file:" + jarFile.getPath() + "!/test"), false, null));
        File tmpJar = IOUtils.getFileFromURL(new URL("jar:" + jarFile.toURI().toURL() + "!/test"), true, null);
        assertNotNull(tmpJar);
        assertNotEquals(jarFile, tmpJar);
    }

    @Test public void testGetJarFileFromURL() throws IOException {
        File jarFile = File.createTempFile("\"IOUtilsTest \\\\\\\\+%23öäü^^^°$::\"", ".jar");

        try (JarOutputStream output = new JarOutputStream(new FileOutputStream(jarFile))) {
            output.putNextEntry(new JarEntry("test"));
            output.write("Hello".getBytes());
            output.closeEntry();
            output.putNextEntry(new JarEntry("test.jar"));
            try (JarOutputStream inner = new JarOutputStream(output))
            {
                inner.putNextEntry(new JarEntry("inner"));
                inner.write("Hello".getBytes());
                inner.closeEntry();
            }
        }

        JarFile jar = IOUtils.getJarFileFromURL(new URL("jar:" + jarFile.toURI().toURL() + "!/"), true, null);
        assertNotNull(jar);
        jar = IOUtils.getJarFileFromURL(jarFile.toURI().toURL(), true, null);
        assertNotNull(jar);

        assertNull(IOUtils.getFileFromURL(new URL("jar:" + jarFile.toURI().toURL() + "!/test"), false, null));

        JarFile tmpJar = IOUtils.getJarFileFromURL(new URL("jar:" + jarFile.toURI().toURL() + "!/test.jar"), true, null);
        assertNotNull(tmpJar);
        assertNotNull(tmpJar.getEntry("inner"));

        try
        {
            IOUtils.getJarFileFromURL(new URL("jar:" + jarFile.toURI().toURL() + "!/test"), true, null);
            fail();
        } catch (IOException ex) {
            // Expected
        }

        try
        {
            IOUtils.getJarFileFromURL(new URL("jar:" + jarFile.toURI().toURL() + "!/test.jar"), false, null);
            fail();
        } catch (IOException ex) {
            // Expected
        }
    }
}
