/* * 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.geode.management.internal.cli.commands; import static org.junit.Assert.*; import java.io.PrintWriter; import java.io.StringWriter; import java.util.Collections; import java.util.Set; import org.jmock.Expectations; import org.jmock.Mockery; import org.jmock.lib.legacy.ClassImposteriser; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.experimental.categories.Category; import org.apache.geode.cache.Cache; import org.apache.geode.cache.execute.Function; import org.apache.geode.cache.execute.FunctionService; import org.apache.geode.distributed.DistributedMember; import org.apache.geode.distributed.DistributedSystem; import org.apache.geode.internal.lang.StringUtils; import org.apache.geode.internal.util.CollectionUtils; import org.apache.geode.management.cli.CliMetaData; import org.apache.geode.management.internal.cli.i18n.CliStrings; import org.apache.geode.management.internal.cli.util.MemberNotFoundException; import org.apache.geode.test.junit.categories.UnitTest; /** * The AbstractCommandsSupportJUnitTest class is a test suite of test cases testing the contract and * functionality of the AbstractCommandsSupport class for implementing GemFire shell (Gfsh) * commands. * </p> * * @see org.apache.geode.management.internal.cli.commands.AbstractCommandsSupport * @see org.jmock.Expectations * @see org.jmock.Mockery * @see org.jmock.lib.legacy.ClassImposteriser * @see org.junit.Assert * @see org.junit.Test * @since GemFire 7.0 */ @Category(UnitTest.class) public class AbstractCommandsSupportJUnitTest { private Mockery mockContext; @Before public void setup() { mockContext = new Mockery(); mockContext.setImposteriser(ClassImposteriser.INSTANCE); } @After public void tearDown() { mockContext.assertIsSatisfied(); mockContext = null; } private AbstractCommandsSupport createAbstractCommandsSupport(final Cache cache) { return new TestCommands(cache); } private DistributedMember createMockMember(final String memberId, final String memberName) { final DistributedMember mockMember = mockContext.mock(DistributedMember.class, "DistributedMember " + memberId); mockContext.checking(new Expectations() { { allowing(mockMember).getName(); will(returnValue(memberName)); allowing(mockMember).getId(); will(returnValue(memberId)); } }); return mockMember; } @Test public void testAssertArgumentIsLegal() { AbstractCommandsSupport.assertArgument(true, ""); } @Test(expected = IllegalArgumentException.class) public void testAssertArgumentIsIllegal() { try { AbstractCommandsSupport.assertArgument(false, "The actual argument is %1$s!", "illegal"); } catch (IllegalArgumentException expected) { assertEquals("The actual argument is illegal!", expected.getMessage()); throw expected; } } @Test public void testAssetNotNullWithNonNullObject() { AbstractCommandsSupport.assertNotNull(new Object(), ""); } @Test(expected = NullPointerException.class) public void testAssertNotNullWithNullObject() { try { AbstractCommandsSupport.assertNotNull(null, "This is an %1$s message!", "expected"); } catch (NullPointerException expected) { assertEquals("This is an expected message!", expected.getMessage()); throw expected; } } @Test public void testAssertStateIsValid() { AbstractCommandsSupport.assertState(true, ""); } @Test(expected = IllegalStateException.class) public void testAssertStateIsInvalid() { try { AbstractCommandsSupport.assertState(false, "The actual state is %1$s!", "invalid"); } catch (IllegalStateException expected) { assertEquals("The actual state is invalid!", expected.getMessage()); throw expected; } } @Test public void testConvertDefaultValue() { assertNull(AbstractCommandsSupport.convertDefaultValue(null, StringUtils.EMPTY_STRING)); assertEquals(StringUtils.EMPTY_STRING, AbstractCommandsSupport.convertDefaultValue(StringUtils.EMPTY_STRING, "test")); assertEquals(StringUtils.SPACE, AbstractCommandsSupport.convertDefaultValue(StringUtils.SPACE, "testing")); assertEquals("tested", AbstractCommandsSupport .convertDefaultValue(CliMetaData.ANNOTATION_DEFAULT_VALUE, "tested")); } @Test public void testGetMemberWithMatchingMemberId() { final Cache mockCache = mockContext.mock(Cache.class, "Cache"); final DistributedSystem mockDistributedSystem = mockContext.mock(DistributedSystem.class, "DistributedSystem"); final DistributedMember mockMemberSelf = createMockMember("S", "Self"); final DistributedMember mockMemberOne = createMockMember("1", "One"); final DistributedMember mockMemberTwo = createMockMember("2", "Two"); mockContext.checking(new Expectations() { { oneOf(mockCache).getMembers(); will(returnValue(CollectionUtils.asSet(mockMemberOne, mockMemberTwo))); oneOf(mockCache).getDistributedSystem(); will(returnValue(mockDistributedSystem)); oneOf(mockDistributedSystem).getDistributedMember(); will(returnValue(mockMemberSelf)); } }); final AbstractCommandsSupport commands = createAbstractCommandsSupport(mockCache); assertSame(mockMemberTwo, commands.getMember(mockCache, "2")); } @Test public void testGetMemberWithMatchingMemberName() { final Cache mockCache = mockContext.mock(Cache.class, "Cache"); final DistributedSystem mockDistributedSystem = mockContext.mock(DistributedSystem.class, "DistributedSystem"); final DistributedMember mockMemberSelf = createMockMember("S", "Self"); final DistributedMember mockMemberOne = createMockMember("1", "One"); final DistributedMember mockMemberTwo = createMockMember("2", "Two"); mockContext.checking(new Expectations() { { oneOf(mockCache).getMembers(); will(returnValue(CollectionUtils.asSet(mockMemberOne, mockMemberTwo))); oneOf(mockCache).getDistributedSystem(); will(returnValue(mockDistributedSystem)); oneOf(mockDistributedSystem).getDistributedMember(); will(returnValue(mockMemberSelf)); } }); final AbstractCommandsSupport commands = createAbstractCommandsSupport(mockCache); assertSame(mockMemberOne, commands.getMember(mockCache, "One")); } @Test public void testGetMemberWithMatchingMemberNameCaseInsensitive() { final Cache mockCache = mockContext.mock(Cache.class, "Cache"); final DistributedSystem mockDistributedSystem = mockContext.mock(DistributedSystem.class, "DistributedSystem"); final DistributedMember mockMemberSelf = createMockMember("S", "Self"); final DistributedMember mockMemberOne = createMockMember("1", "One"); final DistributedMember mockMemberTwo = createMockMember("2", "Two"); mockContext.checking(new Expectations() { { oneOf(mockCache).getMembers(); will(returnValue(CollectionUtils.asSet(mockMemberOne, mockMemberTwo))); oneOf(mockCache).getDistributedSystem(); will(returnValue(mockDistributedSystem)); oneOf(mockDistributedSystem).getDistributedMember(); will(returnValue(mockMemberSelf)); } }); final AbstractCommandsSupport commands = createAbstractCommandsSupport(mockCache); assertSame(mockMemberSelf, commands.getMember(mockCache, "self")); } @Test(expected = MemberNotFoundException.class) public void testGetMemberThrowsMemberNotFoundException() { final Cache mockCache = mockContext.mock(Cache.class, "Cache"); final DistributedSystem mockDistributedSystem = mockContext.mock(DistributedSystem.class, "DistributedSystem"); final DistributedMember mockMemberSelf = createMockMember("S", "Self"); final DistributedMember mockMemberOne = createMockMember("1", "One"); final DistributedMember mockMemberTwo = createMockMember("2", "Two"); mockContext.checking(new Expectations() { { oneOf(mockCache).getMembers(); will(returnValue(CollectionUtils.asSet(mockMemberOne, mockMemberTwo))); oneOf(mockCache).getDistributedSystem(); will(returnValue(mockDistributedSystem)); oneOf(mockDistributedSystem).getDistributedMember(); will(returnValue(mockMemberSelf)); } }); final AbstractCommandsSupport commands = createAbstractCommandsSupport(mockCache); try { commands.getMember(mockCache, "zero"); } catch (MemberNotFoundException expected) { assertEquals(CliStrings.format(CliStrings.MEMBER_NOT_FOUND_ERROR_MESSAGE, "zero"), expected.getMessage()); throw expected; } } @Test public void testGetMembers() { final Cache mockCache = mockContext.mock(Cache.class, "Cache"); final DistributedSystem mockDistributedSystem = mockContext.mock(DistributedSystem.class, "DistributedSystem"); final DistributedMember mockMemberSelf = createMockMember("S", "Self"); final DistributedMember mockMemberOne = createMockMember("1", "One"); final DistributedMember mockMemberTwo = createMockMember("2", "Two"); mockContext.checking(new Expectations() { { oneOf(mockCache).getMembers(); will(returnValue(CollectionUtils.asSet(mockMemberOne, mockMemberTwo))); oneOf(mockCache).getDistributedSystem(); will(returnValue(mockDistributedSystem)); oneOf(mockDistributedSystem).getDistributedMember(); will(returnValue(mockMemberSelf)); } }); final AbstractCommandsSupport commands = createAbstractCommandsSupport(mockCache); final Set<DistributedMember> expectedMembers = CollectionUtils.asSet(mockMemberOne, mockMemberTwo, mockMemberSelf); final Set<DistributedMember> actualMembers = commands.getMembers(mockCache); assertNotNull(actualMembers); assertEquals(expectedMembers.size(), actualMembers.size()); assertTrue(actualMembers.containsAll(expectedMembers)); } @Test public void testGetMembersContainsOnlySelf() { final Cache mockCache = mockContext.mock(Cache.class, "Cache"); final DistributedSystem mockDistributedSystem = mockContext.mock(DistributedSystem.class, "DistributedSystem"); final DistributedMember mockMemberSelf = createMockMember("S", "Self"); mockContext.checking(new Expectations() { { oneOf(mockCache).getMembers(); will(returnValue(Collections.emptySet())); oneOf(mockCache).getDistributedSystem(); will(returnValue(mockDistributedSystem)); oneOf(mockDistributedSystem).getDistributedMember(); will(returnValue(mockMemberSelf)); } }); final AbstractCommandsSupport commands = createAbstractCommandsSupport(mockCache); final Set<DistributedMember> expectedMembers = CollectionUtils.asSet(mockMemberSelf); final Set<DistributedMember> actualMembers = commands.getMembers(mockCache); assertNotNull(actualMembers); assertEquals(expectedMembers.size(), actualMembers.size()); assertTrue(actualMembers.containsAll(expectedMembers)); } @Test public void testRegister() { try { final Function mockFunction = mockContext.mock(Function.class, "Function"); mockContext.checking(new Expectations() { { exactly(3).of(mockFunction).getId(); will(returnValue("testRegister")); oneOf(mockFunction).isHA(); will(returnValue(true)); oneOf(mockFunction).hasResult(); will(returnValue(true)); } }); final AbstractCommandsSupport commands = createAbstractCommandsSupport(mockContext.mock(Cache.class)); assertFalse(FunctionService.isRegistered("testRegister")); assertSame(mockFunction, commands.register(mockFunction)); assertTrue(FunctionService.isRegistered("testRegister")); } finally { FunctionService.unregisterFunction("testRegister"); } } @Test public void testRegisteredAlready() { try { final Function registeredFunction = mockContext.mock(Function.class, "Registered Function"); final Function unregisteredFunction = mockContext.mock(Function.class, "Unregistered Function"); mockContext.checking(new Expectations() { { exactly(2).of(registeredFunction).getId(); will(returnValue("testRegisteredAlready")); oneOf(registeredFunction).isHA(); will(returnValue(false)); exactly(2).of(unregisteredFunction).getId(); will(returnValue("testRegisteredAlready")); } }); final AbstractCommandsSupport commands = createAbstractCommandsSupport(mockContext.mock(Cache.class)); FunctionService.registerFunction(registeredFunction); assertTrue(FunctionService.isRegistered("testRegisteredAlready")); assertSame(registeredFunction, commands.register(unregisteredFunction)); assertTrue(FunctionService.isRegistered("testRegisteredAlready")); } finally { FunctionService.unregisterFunction("testRegisteredAlready"); } } @Test public void testToStringOnBoolean() { assertEquals("false", AbstractCommandsSupport.toString(null, null, null)); assertEquals("true", AbstractCommandsSupport.toString(true, null, null)); assertEquals("true", AbstractCommandsSupport.toString(Boolean.TRUE, null, null)); assertEquals("false", AbstractCommandsSupport.toString(false, null, null)); assertEquals("false", AbstractCommandsSupport.toString(Boolean.FALSE, null, null)); assertEquals("false", AbstractCommandsSupport.toString(true, "false", "true")); assertEquals("true", AbstractCommandsSupport.toString(false, "false", "true")); assertEquals("Yes", AbstractCommandsSupport.toString(true, "Yes", "No")); assertEquals("Yes", AbstractCommandsSupport.toString(false, "No", "Yes")); assertEquals("TRUE", AbstractCommandsSupport.toString(Boolean.TRUE, "TRUE", "FALSE")); assertEquals("FALSE", AbstractCommandsSupport.toString(Boolean.FALSE, "TRUE", "FALSE")); } @Test public void testToStringOnThrowable() { assertEquals("test", AbstractCommandsSupport.toString(new Throwable("test"), false)); } @Test public void testToStringOnThrowablePrintingStackTrace() { final StringWriter writer = new StringWriter(); final Throwable t = new Throwable("test"); t.printStackTrace(new PrintWriter(writer)); assertEquals(writer.toString(), AbstractCommandsSupport.toString(t, true)); } private static class TestCommands extends AbstractCommandsSupport { private final Cache cache; protected TestCommands(final Cache cache) { assert cache != null : "The Cache cannot be null!"; this.cache = cache; } @Override protected Cache getCache() { return this.cache; } } }