/*
* Copyright 2016 higherfrequencytrading.com
*
* Licensed 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 net.openhft.chronicle.engine;
import net.openhft.chronicle.core.threads.ThreadDump;
import net.openhft.chronicle.engine.api.map.MapEvent;
import net.openhft.chronicle.engine.api.pubsub.InvalidSubscriberException;
import net.openhft.chronicle.engine.api.pubsub.Subscriber;
import net.openhft.chronicle.engine.api.pubsub.TopicSubscriber;
import net.openhft.chronicle.engine.api.tree.AssetTree;
import net.openhft.chronicle.engine.tree.*;
import org.jetbrains.annotations.NotNull;
import org.junit.After;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import java.util.Collections;
import static org.easymock.EasyMock.*;
/**
* Created by peter on 11/06/15.
*/
public class AssetSubscriptionsTest {
private ThreadDump threadDump;
@Before
public void threadDump() {
threadDump = new ThreadDump();
}
@After
public void checkThreadDump() {
threadDump.assertNoNewThreads();
}
@After
public void afterMethod() {
}
@Ignore("todo fix")
@Test
public void testSubscriptionsAtEachLevel() throws InvalidSubscriberException {
// start at the top.
@NotNull AssetTree tree = new VanillaAssetTree().forTesting();
Subscriber<TopologicalEvent> rootTopoSubscriber = createMock("sub", Subscriber.class);
Subscriber<MapEvent> rootMapSubscriber = createMock(Subscriber.class);
Subscriber<String> rootNameSubscriber = createMock(Subscriber.class);
TopicSubscriber<String, String> rootTopicSubscriber = createMock(TopicSubscriber.class);
// the root asset
rootTopoSubscriber.onMessage(ExistingAssetEvent.of(null, "", Collections.emptySet()));
// the one added
rootTopoSubscriber.onMessage(ExistingAssetEvent.of("/", "queue", Collections.emptySet()));
rootTopoSubscriber.onMessage(AddedAssetEvent.of("/", "one", Collections.emptySet()));
// rootMapSubscriber - none
// rootNameSubscriber - none
// rootTopicSubscriber - none
replay(rootTopoSubscriber, rootMapSubscriber, rootNameSubscriber, rootTopicSubscriber);
tree.registerSubscriber("", TopologicalEvent.class, rootTopoSubscriber);
tree.registerSubscriber("", MapEvent.class, rootMapSubscriber);
tree.registerSubscriber("", String.class, rootNameSubscriber);
tree.registerTopicSubscriber("", String.class, String.class, rootTopicSubscriber);
// test adding an asset.
Subscriber<TopologicalEvent> rootTopoSubscriber1 = createMock("sub1", Subscriber.class);
Subscriber<MapEvent> rootMapSubscriber1 = createMock(Subscriber.class);
Subscriber<String> rootNameSubscriber1 = createMock(Subscriber.class);
TopicSubscriber<String, String> rootTopicSubscriber1 = createMock(TopicSubscriber.class);
// the root asset
// rootTopoSubscriber1.onMessage(ExistingAssetEvent.of(null, ""));
rootTopoSubscriber1.onMessage(ExistingAssetEvent.of("/", "one", Collections.emptySet()));
replay(rootTopoSubscriber1, rootMapSubscriber1, rootNameSubscriber1, rootTopicSubscriber1);
tree.registerSubscriber("one", TopologicalEvent.class, rootTopoSubscriber1);
tree.registerSubscriber("one", MapEvent.class, rootMapSubscriber1);
tree.registerSubscriber("one", String.class, rootNameSubscriber1);
tree.registerTopicSubscriber("one", String.class, String.class, rootTopicSubscriber1);
verify(rootTopoSubscriber, rootMapSubscriber, rootNameSubscriber, rootTopicSubscriber);
verify(rootTopoSubscriber1, rootMapSubscriber1, rootNameSubscriber1, rootTopicSubscriber1);
Subscriber<TopologicalEvent> rootTopoSubscriber0 = createMock("sub0", Subscriber.class);
rootTopoSubscriber0.onMessage(ExistingAssetEvent.of(null, "", Collections.emptySet()));
rootTopoSubscriber0.onMessage(ExistingAssetEvent.of("/", "queue", Collections.emptySet()));
rootTopoSubscriber0.onMessage(ExistingAssetEvent.of("/", "one", Collections.emptySet()));
replay(rootTopoSubscriber0);
tree.registerSubscriber("", TopologicalEvent.class, rootTopoSubscriber0);
verify(rootTopoSubscriber0);
// test removing an asset
reset(rootTopoSubscriber, rootTopoSubscriber0, rootTopoSubscriber1);
rootTopoSubscriber.onMessage(RemovedAssetEvent.of("/", "one", Collections.emptySet()));
rootTopoSubscriber0.onMessage(RemovedAssetEvent.of("/", "one", Collections.emptySet()));
rootTopoSubscriber1.onMessage(RemovedAssetEvent.of("/", "one", Collections.emptySet()));
replay(rootTopoSubscriber, rootTopoSubscriber0, rootTopoSubscriber1);
tree.getAsset("").removeChild("one");
verify(rootTopoSubscriber, rootTopoSubscriber0, rootTopoSubscriber1);
}
}