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

import java.security.PrivilegedExceptionAction;

/**
 * Test killing of child processes spawned by the jobs with LinuxTaskController
 * running the jobs as a user different from the user running the cluster. 
 * See {@link ClusterWithLinuxTaskController}
 */

public class TestKillSubProcessesWithLinuxTaskController extends 
  ClusterWithLinuxTaskController {

  public void testKillSubProcess() throws Exception{
    if(!shouldRun()) {
      return;
    }
    startCluster();
    jobOwner.doAs(new PrivilegedExceptionAction<Object>() {
      public Object run() throws Exception {
        JobConf myConf = getClusterConf();
        JobTracker jt = mrCluster.getJobTrackerRunner().getJobTracker();

        TestKillSubProcesses.mr = mrCluster;
        TestKillSubProcesses sbProc = new TestKillSubProcesses();
        sbProc.runTests(myConf, jt);
        return null;
      }
    });
  }
}
