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

import static org.junit.Assert.*;

import java.net.InetSocketAddress;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ha.HAServiceProtocol.HAServiceState;
import org.apache.hadoop.ha.SshFenceByTcpPort.Args;
import org.apache.hadoop.test.GenericTestUtils;
import org.junit.Assume;
import org.junit.Test;
import org.slf4j.event.Level;

public class TestSshFenceByTcpPort {

  static {
    GenericTestUtils.setLogLevel(SshFenceByTcpPort.LOG, Level.TRACE);
  }

  private static String TEST_FENCING_HOST = System.getProperty(
      "test.TestSshFenceByTcpPort.host", "localhost");
  private static final String TEST_FENCING_PORT = System.getProperty(
      "test.TestSshFenceByTcpPort.port", "8020");
  private static final String TEST_KEYFILE = System.getProperty(
      "test.TestSshFenceByTcpPort.key");

  private static final InetSocketAddress TEST_ADDR =
    new InetSocketAddress(TEST_FENCING_HOST,
      Integer.parseInt(TEST_FENCING_PORT));
  private static final HAServiceTarget TEST_TARGET =
    new DummyHAService(HAServiceState.ACTIVE, TEST_ADDR);

  /**
   *  Connect to Google's DNS server - not running ssh!
   */
  private static final HAServiceTarget UNFENCEABLE_TARGET =
    new DummyHAService(HAServiceState.ACTIVE,
        new InetSocketAddress("8.8.8.8", 1234));

  @Test(timeout=20000)
  public void testFence() throws BadFencingConfigurationException {
    Assume.assumeTrue(isConfigured());
    Configuration conf = new Configuration();
    conf.set(SshFenceByTcpPort.CONF_IDENTITIES_KEY, TEST_KEYFILE);
    SshFenceByTcpPort fence = new SshFenceByTcpPort();
    fence.setConf(conf);
    assertTrue(fence.tryFence(
        TEST_TARGET,
        null));
  }

  /**
   * Test connecting to a host which definitely won't respond.
   * Make sure that it times out and returns false, but doesn't throw
   * any exception
   */
  @Test(timeout=20000)
  public void testConnectTimeout() throws BadFencingConfigurationException {
    Configuration conf = new Configuration();
    conf.setInt(SshFenceByTcpPort.CONF_CONNECT_TIMEOUT_KEY, 3000);
    SshFenceByTcpPort fence = new SshFenceByTcpPort();
    fence.setConf(conf);
    assertFalse(fence.tryFence(UNFENCEABLE_TARGET, ""));
  }
  
  @Test
  public void testArgsParsing() throws BadFencingConfigurationException {
    Args args = new SshFenceByTcpPort.Args(null);
    assertEquals(System.getProperty("user.name"), args.user);
    assertEquals(22, args.sshPort);
    
    args = new SshFenceByTcpPort.Args("");
    assertEquals(System.getProperty("user.name"), args.user);
    assertEquals(22, args.sshPort);

    args = new SshFenceByTcpPort.Args("12345");
    assertEquals("12345", args.user);
    assertEquals(22, args.sshPort);

    args = new SshFenceByTcpPort.Args(":12345");
    assertEquals(System.getProperty("user.name"), args.user);
    assertEquals(12345, args.sshPort);

    args = new SshFenceByTcpPort.Args("foo:2222");
    assertEquals("foo", args.user);
    assertEquals(2222, args.sshPort);
  }
  
  @Test
  public void testBadArgsParsing() throws BadFencingConfigurationException {
    assertBadArgs(":");          // No port specified
    assertBadArgs("bar.com:");   // "
    assertBadArgs(":xx");        // Port does not parse
    assertBadArgs("bar.com:xx"); // "
  }
  
  private void assertBadArgs(String argStr) {
    try {
      new Args(argStr);
      fail("Did not fail on bad args: " + argStr);
    } catch (BadFencingConfigurationException e) {
      // Expected
    }
  }

  private boolean isConfigured() {
    return (TEST_FENCING_HOST != null && !TEST_FENCING_HOST.isEmpty()) &&
           (TEST_FENCING_PORT != null && !TEST_FENCING_PORT.isEmpty()) &&
           (TEST_KEYFILE != null && !TEST_KEYFILE.isEmpty());
  }
}
