/*
 * 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.slider.funtest.abstracttests

import groovy.transform.CompileStatic
import groovy.util.logging.Slf4j
import org.apache.hadoop.conf.Configuration
import org.apache.hadoop.fs.Path
import org.apache.hadoop.security.UserGroupInformation
import org.apache.hadoop.yarn.conf.YarnConfiguration
import org.apache.slider.funtest.framework.ConfLoader
import org.apache.slider.funtest.framework.FuntestProperties
import org.apache.slider.common.tools.SliderUtils
import org.apache.slider.test.SliderTestUtils
import org.junit.Test
import org.apache.hadoop.fs.FileSystem as HadoopFS 

/**
 * Simple tests to verify that the build has been set up: if these
 * fail then the arguments to the test run are incomplete.
 *
 * This deliberately doesn't depend on SliderCommandTestBase,
 * so that individual tests fail with more diagnostics
 * than the @BeforeClass failing
 */
@CompileStatic
@Slf4j
abstract class AbstractTestBuildSetup extends SliderTestUtils implements FuntestProperties {


  String getRequiredSysprop(String name) {
    String val = System.getProperty(name)
    if (!val) {
      fail("System property not set : $name")

    }
    return val;
  }

  public String getSliderConfDirProp() {
    return getRequiredSysprop(SLIDER_CONF_DIR_PROP)
  }

  public File getSliderConfDirectory() {
    return getCanonicalFile(sliderConfDirProp)
  }

  File getCanonicalFile(String dir) {
    assert dir
    return new File(dir).canonicalFile
  }

  File getBinDirectory() {
    return getCanonicalFile(getBinDirProp())
  }

  public String getBinDirProp() {
    return getRequiredSysprop(SLIDER_BIN_DIR_PROP)
  }

  public File getConfXML() {
    new File(sliderConfDirectory, CLIENT_CONFIG_FILENAME).canonicalFile
  }

  public File getSliderScript() {
    new File(binDirectory, "bin/" + SCRIPT_NAME).canonicalFile
  }

  /**
   * Load the client XML file
   * @return
   */
  public Configuration loadSliderConf() {
    Configuration conf = (new ConfLoader()).loadSliderConf(confXML)
    return conf
  }

  @Test
  public void testConfDirSet() throws Throwable {
    assert getSliderConfDirProp()
    log.info("Slider Configuration directory $sliderConfDirProp")
  }

  @Test
  public void testConfDirExists() throws Throwable {
    assert sliderConfDirectory.exists()
  }


  @Test
  public void testConfDirHasClientXML() throws Throwable {
    File clientXMLFile = confXML
    assert clientXMLFile.exists()
    clientXMLFile.toString()
  }


  @Test
  public void testBinDirExists() throws Throwable {
    log.info("binaries dir = $binDirectory")
  }

  @Test
  public void testBinScriptExists() throws Throwable {
    assert sliderScript.exists()
  }

  @Test
  public void testConfLoad() throws Throwable {
    Configuration conf = loadSliderConf()
  }

  @Test
  public void testConfHasFileURL() throws Throwable {
    Configuration conf = loadSliderConf()
    assert conf.get(KEY_TEST_CONF_XML)
    String confXml = conf.get(KEY_TEST_CONF_XML)
    URL confURL = new URL(confXml)
    log.info("$KEY_TEST_CONF_XML = $confXML  -as URL: $confURL")
    Path path = new Path(confURL.toURI())
    
    def fs = HadoopFS.get(path.toUri(), conf)
    assert fs.exists(path)

  }

  @Test
  public void testConfHasDefaultFS() throws Throwable {
    Configuration conf = loadSliderConf()
    assumeBoolOption(conf, KEY_SLIDER_FUNTESTS_ENABLED, true)
    String fs = conf.get("fs.defaultFS")
    log.info("Test Filesystem $fs")
    assert fs != null
  }


  @Test
  public void testConfHasRM() throws Throwable {

    Configuration conf = loadSliderConf()
    assumeBoolOption(conf, KEY_SLIDER_FUNTESTS_ENABLED, true)
    String val = conf.get(YarnConfiguration.RM_ADDRESS)
    log.info("$YarnConfiguration.RM_ADDRESS = $val")
    assert val != YarnConfiguration.DEFAULT_RM_ADDRESS
  }

  @Test
  public void testSecuritySettingsValid() throws Throwable {
    Configuration conf = loadSliderConf();
    if (SliderUtils.maybeInitSecurity(conf)) {
      log.info("Security enabled")
      SliderUtils.forceLogin()
    }
    log.info("Login User = ${UserGroupInformation.loginUser}")
  }


}
