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

import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.instanceOf;
import static org.hamcrest.CoreMatchers.not;
import static org.hamcrest.CoreMatchers.nullValue;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.Assert.fail;

import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;

import org.apache.drill.exec.ExecConstants;
import org.apache.drill.test.DrillTest;
import org.apache.drill.categories.JdbcTest;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;

import com.google.common.io.Resources;
import org.junit.experimental.categories.Category;

/**
 * (Some) unit and integration tests for org.apache.drill.jdbc.Driver.
 */
@Category(JdbcTest.class)
public class DriverTest extends DrillTest {

  // TODO: Move Jetty status server disabling to DrillTest.
  private static final String STATUS_SERVER_PROPERTY_NAME =
      ExecConstants.HTTP_ENABLE;

  private static final String origJettyPropValue =
      System.getProperty( STATUS_SERVER_PROPERTY_NAME, "true" );

  // Disable Jetty status server so unit tests run (outside Maven setup).
  // (TODO:  Move this to base test class and/or have Jetty try other ports.)
  @BeforeClass
  public static void setUpClass() {
    System.setProperty( STATUS_SERVER_PROPERTY_NAME, "false" );
  }

  @AfterClass
  public static void tearDownClass() {
    System.setProperty( STATUS_SERVER_PROPERTY_NAME, origJettyPropValue );
  }

  private Driver uut = new Driver();


  ////////////////////////////////////////
  // Tests of methods defined by JDBC/java.sql.Driver:

  // Tests for connect() (defined by JDBC/java.sql.Driver):

  @Test
  public void test_connect_declinesEmptyUrl()
      throws SQLException
  {
    assertThat( uut.connect( "", null ), nullValue() );
  }

  @Test
  public void test_connect_declinesNonUrl()
      throws SQLException
  {
    assertThat( uut.connect( "whatever", null ), nullValue() );
  }

  @Test
  public void test_connect_declinesNonJdbcUrl()
      throws SQLException
  {
    assertThat( uut.connect( "file:///something", null ), nullValue() );
  }

  @Test
  public void test_connect_declinesNonDrillJdbcUrl()
      throws SQLException
  {
    assertThat( uut.connect( "jdbc:somedb:whatever", null ), nullValue() );
  }

  @Test
  public void test_connect_declinesNotQuiteDrillUrl()
      throws SQLException
  {
    assertThat( uut.connect( "jdbc:drill", null ), nullValue() );
  }

  // TODO  Determine whether this "jdbc:drill:" should be valid or error.
  @Ignore( "Just hangs, trying to connect to non-existent local zookeeper." )
  @Test
  public void test_connect_acceptsMinimalDrillJdbcUrl()
      throws SQLException
  {
    assertThat( uut.connect( "jdbc:drill:", null ), nullValue() );
    fail( "Not implemented yet" );
  }

  // TODO:  Determine rules for Drill JDBC URLs. (E.g., is "zk=..." always
  // required?  What other properties are allowed?  What is disallowed?)
  @Ignore( "Just hangs, trying to connect to non-existent local zookeeper." )
  @Test
  public void test_connect_DECIDEWHICHBogusDrillJdbcUrl()
      throws SQLException
  {
    assertThat( uut.connect( "jdbc:drill:x=y;z;;a=b=c=d;what=ever", null ),
                nullValue() );
    fail( "Not implemented yet" );
  }

  @Test
  public void test_connect_acceptsLocalZkDrillJdbcUrl()
      throws SQLException
  {
    Connection connection = uut.connect( "jdbc:drill:zk=local", null );
    assertThat( connection, not( nullValue() ) );
    connection.close();
  }

  @Test
  public void test_connect_acceptsLocalViaProperties()
      throws SQLException
  {
    Properties props = new Properties();
    props.put( "zk", "local" );

    Connection connection = uut.connect( "jdbc:drill:", props );
    assertThat( connection, not( nullValue() ) );
    connection.close();
  }

  // TODO:  Determine which other cases to test, including cases of Properties
  // parameter values to test.


  // Tests for acceptsURL(String) (defined by JDBC/java.sql.Driver):

  @Test
  public void test_acceptsURL_acceptsDrillUrlMinimal()
    throws SQLException
  {
    assertThat( uut.acceptsURL("jdbc:drill:"), equalTo( true ) );
  }

  @Test
  public void test_acceptsURL_acceptsDrillPlusJunk()
    throws SQLException
  {
    assertThat( uut.acceptsURL("jdbc:drill:should it check this?"),
                equalTo( true ) );
  }

  @Test
  public void test_acceptsURL_rejectsNonDrillJdbcUrl()
    throws SQLException
  {
    assertThat( uut.acceptsURL("jdbc:notdrill:whatever"), equalTo( false ) );
  }

  @Test
  public void test_acceptsURL_rejectsNonDrillJdbc2()
      throws SQLException
  {
    assertThat( uut.acceptsURL("jdbc:optiq:"), equalTo( false ) );
  }

  @Test
  public void test_acceptsURL_rejectsNonJdbcUrl()
      throws SQLException
  {
    assertThat( uut.acceptsURL("drill:"), equalTo( false ) );
  }


  // Tests for getPropertyInfo(String, Properties) (defined by
  // JDBC/java.sql.Driver):
  // TODO:  Determine what properties (if any) should be returned.
  @Ignore( "Deferred pending need." )
  @Test
  public void test_getPropertyInfo()
      throws SQLException
  {
    fail( "Not implemented yet" );
  }


  // Tests for getMajorVersion() (defined by JDBC/java.sql.Driver):
  @Test
  public void test_getMajorVersion() throws IOException {
    Properties properties = new Properties();
    properties.load(Resources.getResource("apache-drill-jdbc.properties").openStream());

    assertThat( uut.getMajorVersion(),
        org.hamcrest.CoreMatchers.is( Integer.parseInt(properties.getProperty("driver.version.major"))) );
  }


  // Tests for getMinorVersion() (defined by JDBC/java.sql.Driver):
  @Test
  public void test_getMinorVersion() throws IOException {
    Properties properties = new Properties();
    properties.load(Resources.getResource("apache-drill-jdbc.properties").openStream());

    assertThat( uut.getMinorVersion(),
        org.hamcrest.CoreMatchers.is( Integer.parseInt(properties.getProperty("driver.version.minor"))) );
  }


  // Tests for jdbcCompliant() (defined by JDBC/java.sql.Driver):
  // TODO  Determine what we choose to return.  If it doesn't match what
  // java.sql.Driver's documentation says, document that on DrillResultSet and
  // where users (programmers) can see it.
  @Ignore( "Seemingly: Bug: Returns true, but hasn't passed compliance tests." )
  @Test
  public void test_jdbcCompliant() {
    // Expect false because not known to have "[passed] the JDBC compliance
    // tests."
    assertThat( uut.jdbcCompliant(), equalTo( false ) );
  }

  // Tests for XXX (defined by JDBC/java.sql.Driver):
  // Defined by JDBC/java.sql.Driver: getParentLogger()
  @Ignore( "Deferred pending need." )
  @Test
  public void test_getParentLogger()
  {
    fail( "Not implemented yet" );
  }


  // Tests for XXX (defined by JDBC/java.sql.Driver):
  // Defined by JDBC/java.sql.Driver: "[driver] should create and instance of
  // itself and register it with the DriverManager.
  @Test
  public void test_Driver_registersWithManager()
    throws SQLException
  {
    assertThat( DriverManager.getDriver( "jdbc:drill:whatever" ),
                instanceOf( Driver.class ) );
  }


  ////////////////////////////////////////
  // Tests of methods defined by net.hydromatic.avatica.UnregisteredDriver.


  @Ignore( "Deferred pending need." )
  @Test
  public void test_load() {
    fail( "Not implemented yet" );
  }

  @Ignore( "Deferred pending need." )
  @Test
  public void test_getConnectStringPrefix() {
    fail( "Not implemented yet" );
  }

  @Ignore( "Deferred pending need." )
  @Test
  public void test_getFactoryClassNameJdbcVersion()
  {
    fail( "Not implemented yet" );
  }

  @Ignore( "Deferred pending need." )
  @Test
  public void test_createDriverVersion() {
    fail( "Not implemented yet" );
  }

  @Ignore( "Deferred pending need." )
  @Test
  public void test_createHandler() {
    fail( "Not implemented yet" );
  }

  @Ignore( "Deferred pending need." )
  @Test
  public void test_unregisteredDriver() {
    fail( "Not implemented yet" );
  }

  @Ignore( "Deferred pending need." )
  @Test
  public void test_createFactory() {
    fail( "Not implemented yet" );
  }

  @Ignore( "Deferred pending need." )
  @Test
  public void test_createHandler1() {
    fail( "Not implemented yet" );
  }

  @Ignore( "Deferred pending need." )
  @Test
  public void test_getFactoryClassNameJdbcVersion1()
  {
    fail( "Not implemented yet" );
  }

  @Ignore( "Deferred pending need." )
  @Test
  public void test_createDriverVersion1() {
    fail( "Not implemented yet" );
  }

  @Ignore( "Deferred pending need." )
  @Test
  public void test_getConnectionProperties() {
    fail( "Not implemented yet" );
  }

  @Ignore( "Deferred pending need." )
  @Test
  public void test_instantiateFactory() {
    fail( "Not implemented yet" );
  }

  @Ignore( "Deferred pending need." )
  @Test
  public void test_getConnectStringPrefix1() {
    fail( "Not implemented yet" );
  }

  @Ignore( "Deferred pending need." )
  @Test
  public void test_getDriverVersion() {
    fail( "Not implemented yet" );
  }

  @Ignore( "Deferred pending need." )
  @Test
  public void test_register() {
    fail( "Not implemented yet" );
  }

  ////////////////////////////////////////


  @Ignore( "Deferred pending need." )
  @Test
  public void test_hashCode() {
    fail( "Not implemented yet" );
  }

  @Ignore( "Deferred pending need." )
  @Test
  public void test_equals() {
    fail( "Not implemented yet" );
  }

  @Ignore( "Deferred pending need." )
  @Test
  public void test_toString() {
    fail( "Not implemented yet" );
  }

}
