package org.apache.hadoop.tools; /** * 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. */ import static org.junit.Assert.*; import java.io.ByteArrayOutputStream; import java.io.PipedInputStream; import java.io.PipedOutputStream; import java.io.PrintStream; import org.apache.hadoop.hdfs.tools.DFSAdmin; import org.apache.hadoop.hdfs.tools.DelegationTokenFetcher; import org.apache.hadoop.hdfs.tools.JMXGet; import org.apache.hadoop.util.ExitUtil; import org.apache.hadoop.util.ToolRunner; import org.apache.hadoop.util.ExitUtil.ExitException; import org.junit.BeforeClass; import org.junit.Test; import com.google.common.collect.ImmutableSet; import com.google.common.io.ByteStreams; public class TestTools { private static final int PIPE_BUFFER_SIZE = 1024 * 5; private final static String INVALID_OPTION = "-invalidOption"; private static final String[] OPTIONS = new String[2]; @BeforeClass public static void before() { ExitUtil.disableSystemExit(); OPTIONS[1] = INVALID_OPTION; } @Test public void testDelegationTokenFetcherPrintUsage() { String pattern = "Options:"; checkOutput(new String[] { "-help" }, pattern, System.out, DelegationTokenFetcher.class); } @Test public void testDelegationTokenFetcherErrorOption() { String pattern = "ERROR: Only specify cancel, renew or print."; checkOutput(new String[] { "-cancel", "-renew" }, pattern, System.err, DelegationTokenFetcher.class); } @Test public void testJMXToolHelp() { String pattern = "usage: jmxget options are:"; checkOutput(new String[] { "-help" }, pattern, System.out, JMXGet.class); } @Test public void testJMXToolAdditionParameter() { String pattern = "key = -addition"; checkOutput(new String[] { "-service=NameNode", "-server=localhost", "-addition" }, pattern, System.err, JMXGet.class); } @Test public void testDFSAdminInvalidUsageHelp() { ImmutableSet<String> args = ImmutableSet.of("-report", "-saveNamespace", "-rollEdits", "-restoreFailedStorage", "-refreshNodes", "-finalizeUpgrade", "-metasave", "-refreshUserToGroupsMappings", "-printTopology", "-refreshNamenodes", "-deleteBlockPool", "-setBalancerBandwidth", "-fetchImage"); try { for (String arg : args) assertTrue(ToolRunner.run(new DFSAdmin(), fillArgs(arg)) == -1); assertTrue(ToolRunner.run(new DFSAdmin(), new String[] { "-help", "-some" }) == 0); } catch (Exception e) { fail("testDFSAdminHelp error" + e); } String pattern = "Usage: java DFSAdmin"; checkOutput(new String[] { "-cancel", "-renew" }, pattern, System.err, DFSAdmin.class); } private static String[] fillArgs(String arg) { OPTIONS[0] = arg; return OPTIONS; } private void checkOutput(String[] args, String pattern, PrintStream out, Class<?> clazz) { ByteArrayOutputStream outBytes = new ByteArrayOutputStream(); try { PipedOutputStream pipeOut = new PipedOutputStream(); PipedInputStream pipeIn = new PipedInputStream(pipeOut, PIPE_BUFFER_SIZE); if (out == System.out) { System.setOut(new PrintStream(pipeOut)); } else if (out == System.err) { System.setErr(new PrintStream(pipeOut)); } if (clazz == DelegationTokenFetcher.class) { expectDelegationTokenFetcherExit(args); } else if (clazz == JMXGet.class) { expectJMXGetExit(args); } else if (clazz == DFSAdmin.class) { expectDfsAdminPrint(args); } pipeOut.close(); ByteStreams.copy(pipeIn, outBytes); pipeIn.close(); assertTrue(new String(outBytes.toByteArray()).contains(pattern)); } catch (Exception ex) { fail("checkOutput error " + ex); } } private void expectDfsAdminPrint(String[] args) { try { ToolRunner.run(new DFSAdmin(), args); } catch (Exception ex) { fail("expectDelegationTokenFetcherExit ex error " + ex); } } private static void expectDelegationTokenFetcherExit(String[] args) { try { DelegationTokenFetcher.main(args); fail("should call exit"); } catch (ExitException e) { ExitUtil.resetFirstExitException(); } catch (Exception ex) { fail("expectDelegationTokenFetcherExit ex error " + ex); } } private static void expectJMXGetExit(String[] args) { try { JMXGet.main(args); fail("should call exit"); } catch (ExitException e) { ExitUtil.resetFirstExitException(); } catch (Exception ex) { fail("expectJMXGetExit ex error " + ex); } } }