/*
* 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.internal.cache.extension;
import static org.junit.Assert.*;
import java.util.Iterator;
import java.util.NoSuchElementException;
import java.util.concurrent.atomic.AtomicInteger;
import org.apache.geode.cache.Cache;
import org.apache.geode.test.fake.Fakes;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import org.apache.geode.internal.cache.xmlcache.XmlGenerator;
import org.apache.geode.test.junit.categories.UnitTest;
/**
* Unit tests for {@link SimpleExtensionPoint}.
*
* @since GemFire 8.1
*/
@Category(UnitTest.class)
public class SimpleExtensionPointJUnitTest {
/**
* Test method for {@link SimpleExtensionPoint#SimpleExtensionPoint(Extensible, Object)} .
*/
@Test
public void testSimpleExtensionPoint() {
final MockImpl m = new MockImpl();
assertSame(m.extensionPoint.extensible, m.extensionPoint.target);
assertNotNull(m.extensionPoint.extensions);
assertNotNull(m.extensionPoint.iterable);
}
/**
* Test method for {@link SimpleExtensionPoint#getExtensions()} .
*/
@Test
public void testGetExtensions() {
final MockImpl m = new MockImpl();
assertEquals(0, m.extensionPoint.extensions.size());
assertTrue(!m.extensionPoint.iterable.iterator().hasNext());
final Iterable<Extension<MockInterface>> extensions = m.getExtensionPoint().getExtensions();
assertNotNull(extensions);
// extensions should be empty
final Iterator<Extension<MockInterface>> iterator = extensions.iterator();
assertTrue(!iterator.hasNext());
try {
iterator.next();
fail("Expected NoSuchElementException.");
} catch (NoSuchElementException e) {
// ignore
}
}
/**
* Test method for {@link SimpleExtensionPoint#addExtension(Extension)} .
*/
@Test
public void testAddExtension() {
final MockImpl m = new MockImpl();
final MockExtension extension = new MockExtension();
m.getExtensionPoint().addExtension(extension);
assertEquals(1, m.extensionPoint.extensions.size());
final Iterable<Extension<MockInterface>> extensions = m.getExtensionPoint().getExtensions();
assertNotNull(extensions);
final Iterator<Extension<MockInterface>> iterator = extensions.iterator();
// first and only entry should be our extension.
final Extension<MockInterface> actual = iterator.next();
assertSame(extension, actual);
// should only be one extension in the iterator.
try {
iterator.next();
fail("Expected NoSuchElementException.");
} catch (NoSuchElementException e) {
// ignore
}
}
/**
* Test method for {@link SimpleExtensionPoint#removeExtension(Extension)} .
*/
@Test
public void testRemoveExtension() {
final MockImpl m = new MockImpl();
final MockExtension extension = new MockExtension();
m.getExtensionPoint().addExtension(extension);
final Iterable<Extension<MockInterface>> extensions = m.getExtensionPoint().getExtensions();
assertNotNull(extensions);
final Iterator<Extension<MockInterface>> i = extensions.iterator();
// first and only entry should be our extension.
final Extension<MockInterface> actual = i.next();
assertSame(extension, actual);
// should not be able to remove it via iterator.
try {
i.remove();
fail("Expected UnsupportedOperationException");
} catch (UnsupportedOperationException e) {
// ignore
}
m.getExtensionPoint().removeExtension(extension);
assertEquals(0, m.extensionPoint.extensions.size());
// extensions should be empty
final Iterable<Extension<MockInterface>> extensionsRemoved =
m.getExtensionPoint().getExtensions();
try {
extensionsRemoved.iterator().next();
fail("Expected NoSuchElementException");
} catch (NoSuchElementException e) {
// ignore
}
}
/**
* Test method for {@link SimpleExtensionPoint#getTarget()} .
*/
@Test
public void testGetTarget() {
final MockImpl m = new MockImpl();
final MockInterface a = m.getExtensionPoint().getTarget();
assertSame(m, a);
}
/**
* Test method for {@link SimpleExtensionPoint#fireCreate(Extensible)} .
*/
@Test
public void testFireCreate() {
final MockImpl m = new MockImpl();
final AtomicInteger counter = new AtomicInteger(0);
final MockExtension extension = new MockExtension() {
@Override
public void onCreate(Extensible<MockInterface> source, Extensible<MockInterface> target) {
counter.incrementAndGet();
}
};
counter.set(0);
m.getExtensionPoint().addExtension(extension);
// fire with itself as the target
m.extensionPoint.fireCreate(m);
assertEquals(1, counter.get());
counter.set(0);
m.getExtensionPoint().removeExtension(extension);
// fire with itself as the target
m.extensionPoint.fireCreate(m);
assertEquals(0, counter.get());
}
/**
* Test method for {@link SimpleExtensionPoint#beforeCreate(Cache)} .
*/
@Test
public void testBeforeCreate() {
final MockImpl m = new MockImpl();
final Cache c = Fakes.cache();
final AtomicInteger counter = new AtomicInteger(0);
final MockExtension extension = new MockExtension() {
@Override
public void beforeCreate(Extensible<MockInterface> source, Cache cache) {
counter.incrementAndGet();
}
};
counter.set(0);
m.getExtensionPoint().addExtension(extension);
// Verify beforeCreate is invoked when the extension is added
m.extensionPoint.beforeCreate(c);
assertEquals(1, counter.get());
counter.set(0);
m.getExtensionPoint().removeExtension(extension);
// Verify beforeCreate is not invoked when the extension is removed
m.extensionPoint.beforeCreate(c);
assertEquals(0, counter.get());
}
private interface MockInterface {
public void method1();
}
private static class MockImpl implements MockInterface, Extensible<MockInterface> {
private SimpleExtensionPoint<MockInterface> extensionPoint =
new SimpleExtensionPoint<SimpleExtensionPointJUnitTest.MockInterface>(this, this);
@Override
public ExtensionPoint<MockInterface> getExtensionPoint() {
return extensionPoint;
}
@Override
public void method1() {}
}
private static class MockExtension implements Extension<MockInterface> {
@Override
public XmlGenerator<MockInterface> getXmlGenerator() {
throw new UnsupportedOperationException();
}
@Override
public void beforeCreate(Extensible<MockInterface> source, Cache cache) {
throw new UnsupportedOperationException();
}
@Override
public void onCreate(Extensible<MockInterface> source, Extensible<MockInterface> target) {
throw new UnsupportedOperationException();
}
}
}