blob: 1110fc381312afbf726b02a6fce7b5526c1af400 [file] [log] [blame]
// Copyright (C) 2022 The Android Open Source Project
//
// 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 com.ericsson.gerrit.plugins.highavailability.peers.jgroups;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Answers.RETURNS_DEEP_STUBS;
import static org.mockito.Mockito.when;
import com.ericsson.gerrit.plugins.highavailability.Configuration;
import com.ericsson.gerrit.plugins.highavailability.peers.PeerInfo;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import org.jgroups.Address;
import org.jgroups.JChannel;
import org.jgroups.Message;
import org.jgroups.View;
import org.jgroups.stack.IpAddress;
import org.junit.Before;
import org.junit.Test;
import org.junit.Test.None;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
@RunWith(MockitoJUnitRunner.class)
public class JGroupsPeerInfoProviderTest {
@Mock(answer = RETURNS_DEEP_STUBS)
private Configuration pluginConfigurationMock;
private InetAddressFinder finder;
private JGroupsPeerInfoProvider jGroupsPeerInfoProvider;
private Optional<PeerInfo> peerInfo;
@Mock private JChannel channel;
@Mock private MyUrlProvider myUrlProviderTest;
@Mock private Message message;
@Mock private Address peerAddress;
@Mock private View view;
@Mock private List<Address> members;
@Before
public void setUp() throws Exception {
finder = new InetAddressFinder(pluginConfigurationMock);
jGroupsPeerInfoProvider =
new JGroupsPeerInfoProvider(pluginConfigurationMock, finder, myUrlProviderTest);
peerInfo = Optional.of(new PeerInfo("test message"));
channel.setName("testChannel");
}
@Test
public void testRecieveWhenPeerAddressIsNull() {
when(message.getSrc()).thenReturn(peerAddress);
when(message.getObject()).thenReturn("test message");
jGroupsPeerInfoProvider.receive(message);
assertThat(jGroupsPeerInfoProvider.getPeerAddress()).isEqualTo(peerAddress);
Set<PeerInfo> testPeerInfoSet = jGroupsPeerInfoProvider.get();
for (PeerInfo testPeerInfo : testPeerInfoSet) {
assertThat(testPeerInfo.getDirectUrl()).contains("test message");
}
assertThat(testPeerInfoSet.size()).isEqualTo(1);
}
@Test
public void testReceiveWhenPeerAddressIsNotNull() throws Exception {
jGroupsPeerInfoProvider.setPeerAddress(new IpAddress("checkAddress.com"));
jGroupsPeerInfoProvider.receive(message);
Set<PeerInfo> testPeerInfoSet = jGroupsPeerInfoProvider.get();
assertThat(testPeerInfoSet.isEmpty()).isTrue();
assertThat(testPeerInfoSet.size()).isEqualTo(0);
}
@Test(expected = None.class)
public void testViewAcceptedWithNoExceptionThrown() throws Exception {
when(view.getMembers()).thenReturn(members);
when(view.size()).thenReturn(3);
when(members.size()).thenReturn(3);
jGroupsPeerInfoProvider.setChannel(channel);
jGroupsPeerInfoProvider.viewAccepted(view);
}
@Test(expected = NullPointerException.class)
public void testViewAcceptedWithExceptionThrown() throws Exception {
when(view.getMembers()).thenReturn(members);
when(view.size()).thenReturn(2);
when(members.size()).thenReturn(2);
jGroupsPeerInfoProvider.viewAccepted(view);
}
@Test
public void testViewAcceptedWhenPeerAddressIsNotNullAndIsNotMemberOfView() {
when(view.getMembers()).thenReturn(members);
when(view.size()).thenReturn(2);
when(members.size()).thenReturn(2);
when(members.contains(peerAddress)).thenReturn(false);
jGroupsPeerInfoProvider.setPeerAddress(peerAddress);
jGroupsPeerInfoProvider.setPeerInfo(peerInfo);
jGroupsPeerInfoProvider.setChannel(channel);
jGroupsPeerInfoProvider.viewAccepted(view);
assertThat(jGroupsPeerInfoProvider.getPeerAddress()).isEqualTo(null);
Set<PeerInfo> testPeerInfoSet = jGroupsPeerInfoProvider.get();
assertThat(testPeerInfoSet.isEmpty()).isTrue();
assertThat(testPeerInfoSet.size()).isEqualTo(0);
}
@Test
public void testConnect() throws NoSuchFieldException, IllegalAccessException {
jGroupsPeerInfoProvider.connect();
Set<PeerInfo> testPeerInfoSet = jGroupsPeerInfoProvider.get();
assertThat(testPeerInfoSet.isEmpty()).isTrue();
assertThat(testPeerInfoSet.size()).isEqualTo(0);
}
@Test
public void testGetWhenPeerInfoIsOptionalEmpty() {
Set<PeerInfo> testPeerInfoSet = jGroupsPeerInfoProvider.get();
assertThat(testPeerInfoSet.isEmpty()).isTrue();
assertThat(testPeerInfoSet.size()).isEqualTo(0);
}
@Test
public void testGetWhenPeerInfoIsPresent() {
jGroupsPeerInfoProvider.setPeerInfo(peerInfo);
Set<PeerInfo> testPeerInfoSet = jGroupsPeerInfoProvider.get();
for (PeerInfo testPeerInfo : testPeerInfoSet) {
assertThat(testPeerInfo.getDirectUrl()).contains("test message");
}
assertThat(testPeerInfoSet.size()).isEqualTo(1);
}
@Test
public void testStop() throws Exception {
jGroupsPeerInfoProvider.setPeerAddress(peerAddress);
jGroupsPeerInfoProvider.setPeerInfo(peerInfo);
jGroupsPeerInfoProvider.stop();
assertThat(jGroupsPeerInfoProvider.getPeerAddress()).isEqualTo(null);
Set<PeerInfo> testPeerInfoSet = jGroupsPeerInfoProvider.get();
assertThat(testPeerInfoSet.isEmpty()).isTrue();
assertThat(testPeerInfoSet.size()).isEqualTo(0);
}
}