/*
 * 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.logging.log4j.jdbc.appender;

import java.sql.Connection;
import java.sql.SQLException;

import org.apache.logging.log4j.core.config.Property;
import org.apache.logging.log4j.jdbc.appender.DriverManagerConnectionSource;
import org.junit.Assert;
import org.junit.Test;

public class DriverManagerConnectionSourceTest {

    @Test
    public void testH2Properties() throws SQLException {
        Property[] properties = new Property[] {
                // @formatter:off
                Property.createProperty("username", JdbcH2TestHelper.USER_NAME),
                Property.createProperty("password", JdbcH2TestHelper.PASSWORD),
                // @formatter:on
        };
        // @formatter:off
        DriverManagerConnectionSource source = DriverManagerConnectionSource.newBuilder()
            .setConnectionString(JdbcH2TestHelper.CONNECTION_STRING)
            .setProperties(properties)
            .build();
        // @formatter:on
        try (Connection conn = source.getConnection()) {
            Assert.assertFalse(conn.isClosed());
        }
    }

    @Test
    public void testH2UserAndPassword() throws SQLException {
        // @formatter:off
        DriverManagerConnectionSource source = DriverManagerConnectionSource.newBuilder()
            .setConnectionString(JdbcH2TestHelper.CONNECTION_STRING)
            .setUserName(JdbcH2TestHelper.USER_NAME.toCharArray())
            .setPassword(JdbcH2TestHelper.PASSWORD.toCharArray())
            .build();
        // @formatter:on
        try (Connection conn = source.getConnection()) {
            Assert.assertFalse(conn.isClosed());
        }
    }
}
