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

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

/**
 * Test of GenericJobStorage compatibility with SQLServer
 *
 * This uses JDBC to store and retrieve metastore data from an SQLServer
 *
 * Since this requires an SQLServer 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=SqlServerJobToolTest or -Dthirdparty=true.
 *
 * You need to put SQL Server JDBC driver library (sqljdbc4.jar) in a location
 * where Sqoop will be able to access it (since this library cannot be checked
 * into Apache's tree for licensing reasons) and set it's path through -Dsqoop.thirdparty.lib.dir.
 *
 *   Once you have a running SQLServer database,
 *   Set server URL, database name, username, and password with system variables
 *   -Dsqoop.test.sqlserver.connectstring.host_url, -Dsqoop.test.sqlserver.database,
 *   -Dms.sqlserver.username and -Dms.sqlserver.password respectively
 */

public class SqlServerSavedJobsTest extends SavedJobsTestBase {

    private static MSSQLTestUtils msSQLTestUtils = new MSSQLTestUtils();

    public SqlServerSavedJobsTest() {
        super(msSQLTestUtils.getDBConnectString(),
                msSQLTestUtils.getDBUserName(),
                msSQLTestUtils.getDBPassWord(),
                JdbcDrivers.SQLSERVER.getDriverClass());
    }
}
