/*
* Licensed to Luca Cavanna (the "Author") under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. Elastic Search 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.elasticsearch.shell;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import org.elasticsearch.common.inject.*;
import org.elasticsearch.shell.client.*;
import org.elasticsearch.shell.command.Command;
import org.elasticsearch.shell.command.CommandModule;
import org.elasticsearch.shell.command.ExecutableCommand;
import org.testng.Assert;
import org.testng.annotations.Test;
/**
* @author Luca Cavanna
*/
public class MessagesProviderTest {
private static final List<String> HELP_METHODS_EXCLUDE = new ArrayList<String>();
static {
HELP_METHODS_EXCLUDE.add("toString");
HELP_METHODS_EXCLUDE.add("close");
HELP_METHODS_EXCLUDE.add("wait");
HELP_METHODS_EXCLUDE.add("notify");
HELP_METHODS_EXCLUDE.add("notifyAll");
HELP_METHODS_EXCLUDE.add("equals");
HELP_METHODS_EXCLUDE.add("hashCode");
HELP_METHODS_EXCLUDE.add("getClass");
}
@Test
public void testLoadHelpFile() throws Exception {
MessagesProvider provider = new MessagesProvider();
provider.load(MessagesProvider.MESSAGES_FILE);
}
@Test(expectedExceptions = IOException.class)
public void testLoadFileNotFound() throws Exception {
MessagesProvider provider = new MessagesProvider();
provider.load("not found");
}
@Test
public void testAllCommandsHaveHelp() {
Injector injector = Guice.createInjector(new ShellModule(), new JLineModule(), new RhinoShellModule(), new CommandModule(), new Module() {
@Override
public void configure(Binder binder) {
binder.bind(CommandRegistry.class).asEagerSingleton();
}
});
CommandRegistry registry = injector.getInstance(CommandRegistry.class);
for (Command command : registry.commands) {
String help = MessagesProvider.getHelp(command);
Assert.assertNotNull(help);
Assert.assertTrue(help.trim().length() > 0);
}
}
@Test
public void testHelpMessageContainsAllCommands() {
Injector injector = Guice.createInjector(new ShellModule(), new JLineModule(), new RhinoShellModule(), new CommandModule(), new Module() {
@Override
public void configure(Binder binder) {
binder.bind(CommandRegistry.class).asEagerSingleton();
}
});
String help = MessagesProvider.getHelp("help");
CommandRegistry registry = injector.getInstance(CommandRegistry.class);
List<String> missingCommands = new ArrayList<String>();
for (Command command : registry.commands) {
ExecutableCommand annotation = command.getClass().getAnnotation(ExecutableCommand.class);
boolean found = false;
for (String alias : annotation.aliases()) {
//pretty basic but works for now, a regex might be better here
if (help.contains(alias)) {
found = true;
break;
}
}
if (!found) {
missingCommands.add(command.getClass().getSimpleName());
}
}
Assert.assertTrue(missingCommands.isEmpty(),
"The help message doesn't mention commands " + missingCommands);
}
@Test
public void testAllAbstractClientPublicMethodsHaveHelp() {
testAllPublicMethodsHaveHelp(AbstractClient.class);
}
@Test
public void testAllIndicesApiClientPublicMethodsHaveHelp() {
testAllPublicMethodsHaveHelp(IndicesApiClient.class);
}
@Test
public void testAllClusterApiClientPublicMethodsHaveHelp() {
testAllPublicMethodsHaveHelp(ClusterApiClient.class);
}
@Test
public void testAllInternalIndexClientPublicMethodsHaveHelp() {
testAllPublicMethodsHaveHelp(InternalIndexClient.class);
}
@Test
public void testAllInternalTypeClientPublicMethodsHaveHelp() {
testAllPublicMethodsHaveHelp(InternalTypeClient.class);
}
private void testAllPublicMethodsHaveHelp(Class<?> clazz) {
for (Method method : clazz.getMethods()) {
if (!HELP_METHODS_EXCLUDE.contains(method.getName())) {
String help = MessagesProvider.getHelp(clazz, method.getName());
Assert.assertNotNull(help, "Method " + method.getName() + " doesn't have a help message");
Assert.assertTrue(help.trim().length() > 0, "Method " + method.getName() + " has an empty help message");
}
}
}
private static class CommandRegistry {
final Set<Command> commands;
@Inject
CommandRegistry(Set<Command> commands) {
this.commands = commands;
}
}
}