/**
 * 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 com.cloudera.sqoop.metastore.postgres;

import com.cloudera.sqoop.metastore.SavedJobsTestBase;
import org.apache.sqoop.manager.JdbcDrivers;

/**
 * Test of GenericJobStorage compatibility with PostgreSQL
 *
 * This uses JDBC to store and retrieve metastore data from a Postgres server
 *
 * Since this requires a Postgres installation,
 * this class is named in such a way that Sqoop's default QA process does
 * not run it. You need to run this manually with
 * -Dtestcase=PostgresSavedJobsTest or -Dthirdparty=true.
 *
 *   Once you have a running Postgres database,
 *   Set server URL, database name, username, and password with system variables
 *   -Dsqoop.test.postgresql.connectstring.host_url, -Dsqoop.test.postgresql.database,
 *   -Dsqoop.test.postgresql.username and -Dsqoop.test.postgresql.password respectively
 */

public class PostgresSavedJobsTest extends SavedJobsTestBase {

    private static final String HOST_URL = System.getProperty("sqoop.test.postgresql.connectstring.host_url",
        "jdbc:postgresql://localhost/");
    private static final String DATABASE_USER = System.getProperty(
        "sqoop.test.postgresql.username", "sqooptest");
    private static final String DATABASE_NAME = System.getProperty(
        "sqoop.test.postgresql.database", "sqooptest");
    private static final String PASSWORD = System.getProperty("sqoop.test.postgresql.password");
    private static final String CONNECT_STRING = HOST_URL + DATABASE_NAME;

    public PostgresSavedJobsTest() {
        super(CONNECT_STRING, DATABASE_USER, PASSWORD, JdbcDrivers.POSTGRES.getDriverClass());
    }
}
