/*
 * 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.agent.standalone

import groovy.transform.CompileStatic
import groovy.util.logging.Slf4j
import org.apache.hadoop.yarn.api.records.ApplicationReport
import org.apache.hadoop.yarn.api.records.YarnApplicationState
import org.apache.slider.agent.AgentMiniClusterTestBase
import org.apache.slider.client.SliderClient
import org.apache.slider.common.SliderExitCodes
import org.apache.slider.common.SliderXmlConfKeys
import org.apache.slider.common.params.Arguments
import org.apache.slider.core.main.ServiceLaunchException
import org.apache.slider.core.main.ServiceLauncher
import org.junit.Test

@CompileStatic
@Slf4j

class TestBadYarnQueue extends AgentMiniClusterTestBase {

  /**
   * Test disabled because YARN queues don't get validated in the mini cluster
   * @throws Throwable
   */

  @Test
  public void testBadYarnQueue() throws Throwable {
    skip("untestable in minicluster")
    String clustername = "test_bad_yarn_queue"
    createMiniCluster(clustername, configuration, 1, true)

    describe "verify that a bad yarn queue fails the launch"

    try {
      ServiceLauncher<SliderClient> launcher =
          createMasterlessAMWithArgs(clustername,
              [
                  Arguments.ARG_DEFINE,
                  SliderXmlConfKeys.KEY_YARN_QUEUE + "=noqueue",

              ],
              true,
              false)

      SliderClient sliderClient = launcher.service
      addToTeardown(sliderClient);

      ApplicationReport report = waitForClusterLive(sliderClient)
      assert report.yarnApplicationState == YarnApplicationState.FAILED
      
    } catch (ServiceLaunchException e) {
      assertExceptionDetails(e, SliderExitCodes.EXIT_YARN_SERVICE_FAILED)
    }
    
  }

}
