/**
 * Logback: the reliable, generic, fast and flexible logging framework.
 * Copyright (C) 1999-2015, QOS.ch. All rights reserved.
 *
 * This program and the accompanying materials are dual-licensed under
 * either the terms of the Eclipse Public License v1.0 as published by
 * the Eclipse Foundation
 *
 *   or (per the licensee's choosing)
 *
 * under the terms of the GNU Lesser General Public License version 2.1
 * as published by the Free Software Foundation.
 */
package ch.qos.logback.core.util;

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.MalformedURLException;
import java.net.URL;

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;

/**
 * Unit tests for {@link LocationUtil}.
 *
 * @author Carl Harris
 */
public class LocationUtilTest {

    private static final String TEST_CLASSPATH_RESOURCE = "util/testResource.txt";
    private static final String TEST_PATTERN = "TEST RESOURCE";

    @Test
    public void testImplicitClasspathUrl() throws Exception {
        URL url = LocationUtil.urlForResource(TEST_CLASSPATH_RESOURCE);
        validateResource(url);
    }

    @Test
    public void testExplicitClasspathUrl() throws Exception {
        URL url = LocationUtil.urlForResource(LocationUtil.CLASSPATH_SCHEME + TEST_CLASSPATH_RESOURCE);
        validateResource(url);
    }

    @Test
    public void testExplicitClasspathUrlWithLeadingSlash() throws Exception {
        URL url = LocationUtil.urlForResource(LocationUtil.CLASSPATH_SCHEME + "/" + TEST_CLASSPATH_RESOURCE);
        validateResource(url);
    }

    @Test
    public void testExplicitClasspathUrlEmptyPath() throws Exception {
        Assertions.assertThrows(MalformedURLException.class, () -> {
            LocationUtil.urlForResource(LocationUtil.CLASSPATH_SCHEME);
        });
    }

    @Test
    public void testExplicitClasspathUrlWithRootPath() throws Exception {
        Assertions.assertThrows(MalformedURLException.class, () -> {
            LocationUtil.urlForResource(LocationUtil.CLASSPATH_SCHEME + "/");
        });
    }

    @Test
    public void testFileUrl() throws Exception {
        File file = File.createTempFile("testResource", ".txt");
        file.deleteOnExit();
        PrintWriter writer = new PrintWriter(file);
        writer.println(TEST_PATTERN);
        writer.close();
        URL url = file.toURI().toURL();
        validateResource(url);
    }

    private void validateResource(URL url) throws IOException {
        InputStream inputStream = url.openStream();
        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
            String line = reader.readLine();
            Assertions.assertEquals(TEST_PATTERN, line);
        } finally {
            try {
                inputStream.close();
            } catch (IOException ex) {
                // ignore close exception
                ex.printStackTrace(System.err);
            }
        }
    }

}
