/** * Copyright 2011 LiveRamp * <p> * 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 * <p> * http://www.apache.org/licenses/LICENSE-2.0 * <p> * 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 com.liveramp.hank.ring_group_conductor; import java.io.IOException; import java.util.Collections; import java.util.Set; import java.util.SortedSet; import java.util.TreeSet; import org.junit.Test; import com.liveramp.hank.config.RingGroupConductorConfigurator; import com.liveramp.hank.coordinator.Coordinator; import com.liveramp.hank.coordinator.DomainAndVersion; import com.liveramp.hank.coordinator.DomainGroup; import com.liveramp.hank.coordinator.DomainVersion; import com.liveramp.hank.coordinator.Host; import com.liveramp.hank.coordinator.HostDomain; import com.liveramp.hank.coordinator.HostDomainPartition; import com.liveramp.hank.coordinator.PartitionServerAddress; import com.liveramp.hank.coordinator.Ring; import com.liveramp.hank.coordinator.RingGroup; import com.liveramp.hank.coordinator.mock.MockCoordinator; import com.liveramp.hank.coordinator.mock.MockDomain; import com.liveramp.hank.coordinator.mock.MockDomainGroup; import com.liveramp.hank.coordinator.mock.MockDomainVersion; import com.liveramp.hank.test.coordinator.MockHost; import com.liveramp.hank.test.coordinator.MockHostDomain; import com.liveramp.hank.test.coordinator.MockHostDomainPartition; import com.liveramp.hank.test.coordinator.MockRing; import com.liveramp.hank.test.coordinator.MockRingGroup; import static org.junit.Assert.assertNotNull; public class TestRingGroupConductor { public class MockRingGroupUpdateTransitionFunction implements RingGroupUpdateTransitionFunction { public RingGroup calledWithRingGroup; @Override public void manageTransitions(RingGroup ringGroup) { calledWithRingGroup = ringGroup; } } @Test public void testTriggersUpdates() throws Exception { final MockDomain domain = new MockDomain("domain") { @Override public DomainVersion getVersion(int version) { return new MockDomainVersion(0, 0l); } }; final MockDomainGroup domainGroup = new MockDomainGroup("myDomainGroup") { @Override public Set<DomainAndVersion> getDomainVersions() { SortedSet<DomainAndVersion> result = new TreeSet<DomainAndVersion>(); result.add(new DomainAndVersion(domain, 1)); return result; } }; final MockHostDomainPartition mockHostDomainPartition = new MockHostDomainPartition(0, 0); final MockHost mockHost = new MockHost(new PartitionServerAddress("locahost", 12345)) { @Override public Set<HostDomain> getAssignedDomains() throws IOException { return Collections.singleton((HostDomain)new MockHostDomain(domain) { @Override public HostDomainPartition addPartition(int partitionNumber) { return null; } @Override public Set<HostDomainPartition> getPartitions() { return Collections.singleton((HostDomainPartition)mockHostDomainPartition); } }); } }; final MockRing mockRing = new MockRing(null, null, 1) { @Override public Set<Host> getHosts() { return Collections.singleton((Host)mockHost); } }; final MockRingGroup mockRingGroup = new MockRingGroup(null, "myRingGroup", Collections.<Ring>emptySet()) { @Override public DomainGroup getDomainGroup() { return domainGroup; } @Override public Set<Ring> getRings() { return Collections.singleton((Ring)mockRing); } @Override public RingGroupConductorMode getRingGroupConductorMode() { return RingGroupConductorMode.ACTIVE; } }; RingGroupConductorConfigurator mockConfig = new RingGroupConductorConfigurator() { @Override public long getSleepInterval() { return 100; } @Override public RingGroupConductorMode getInitialMode() { return RingGroupConductorMode.ACTIVE; } @Override public int getMinRingFullyServingObservations() { return 0; } @Override public String getHostAvailabilityBucketFlag() { return null; } @Override public int getMinServingReplicas() { return 2; } @Override public int getAvailabilityBucketMinServingReplicas() { return 0; } @Override public String getRingGroupName() { return "myRingGroup"; } @Override public Coordinator createCoordinator() { return new MockCoordinator() { @Override public RingGroup getRingGroup(String ringGroupName) { return mockRingGroup; } }; } }; MockRingGroupUpdateTransitionFunction mockTransFunc = new MockRingGroupUpdateTransitionFunction(); RingGroupConductor daemon = new RingGroupConductor(mockConfig, mockTransFunc); daemon.processUpdates(mockRingGroup); assertNotNull(mockTransFunc.calledWithRingGroup); } }