PageRenderTime 47ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

/src/test/java/fm/last/moji/tracker/pool/MultiHostTrackerPoolTest.java

https://gitlab.com/kidaa/moji
Java | 168 lines | 123 code | 29 blank | 16 comment | 0 complexity | 7779a7f11041f7e3c2d64fec7244657a MD5 | raw file
  1. /*
  2. * Copyright 2012 Last.fm
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. package fm.last.moji.tracker.pool;
  17. import static org.hamcrest.CoreMatchers.is;
  18. import static org.junit.Assert.assertThat;
  19. import static org.junit.Assert.fail;
  20. import static org.mockito.Matchers.any;
  21. import static org.mockito.Mockito.verify;
  22. import static org.mockito.Mockito.when;
  23. import java.net.InetSocketAddress;
  24. import java.util.Arrays;
  25. import java.util.HashSet;
  26. import java.util.List;
  27. import java.util.Set;
  28. import org.apache.commons.pool.impl.GenericKeyedObjectPool;
  29. import org.junit.Before;
  30. import org.junit.Test;
  31. import org.junit.runner.RunWith;
  32. import org.mockito.Mock;
  33. import org.mockito.Mockito;
  34. import org.mockito.invocation.InvocationOnMock;
  35. import org.mockito.runners.MockitoJUnitRunner;
  36. import org.mockito.stubbing.Answer;
  37. import fm.last.moji.impl.NetworkingConfiguration;
  38. import fm.last.moji.tracker.impl.CommunicationException;
  39. @RunWith(MockitoJUnitRunner.class)
  40. public class MultiHostTrackerPoolTest {
  41. @Mock
  42. private NetworkingConfiguration mockNetConfig;
  43. @Mock
  44. private GenericKeyedObjectPool<ManagedTrackerHost, BorrowedTracker> mockPool;
  45. @Mock
  46. private ManagedTrackerHost mockManagedHost1;
  47. @Mock
  48. private ManagedTrackerHost mockManagedHost2;
  49. @Mock
  50. private BorrowedTracker mockBorrowedTracker1;
  51. @Mock
  52. private BorrowedTracker mockBorrowedTracker2;
  53. private MultiHostTrackerPool trackerPool;
  54. private List<ManagedTrackerHost> managedHosts;
  55. private InetSocketAddress address1;
  56. private InetSocketAddress address2;
  57. @Before
  58. public void setup() {
  59. address1 = new InetSocketAddress(10001);
  60. address2 = new InetSocketAddress(10002);
  61. when(mockManagedHost1.getAddress()).thenReturn(address1);
  62. when(mockManagedHost2.getAddress()).thenReturn(address2);
  63. managedHosts = Arrays.asList(mockManagedHost1, mockManagedHost2);
  64. when(mockBorrowedTracker1.getHost()).thenReturn(mockManagedHost1);
  65. when(mockBorrowedTracker2.getHost()).thenReturn(mockManagedHost2);
  66. trackerPool = new MultiHostTrackerPool(managedHosts, mockNetConfig, mockPool);
  67. }
  68. @Test(expected = CommunicationException.class)
  69. public void getTrackerConvertsException() throws Exception {
  70. when(mockPool.borrowObject(any(ManagedTrackerHost.class))).thenThrow(new IllegalStateException());
  71. trackerPool.getTracker();
  72. }
  73. @Test
  74. public void getAddresses() {
  75. Set<InetSocketAddress> actual = trackerPool.getAddresses();
  76. Set<InetSocketAddress> expected = new HashSet<InetSocketAddress>(Arrays.asList(address1, address2));
  77. assertThat(actual, is(expected));
  78. }
  79. @Test
  80. public void expectedHostPreference() throws Exception {
  81. when(mockManagedHost1.getLastUsed()).thenReturn(2L);
  82. when(mockManagedHost1.getLastFailed()).thenReturn(1L);
  83. when(mockManagedHost2.getLastUsed()).thenReturn(2L);
  84. when(mockManagedHost2.getLastFailed()).thenReturn(0L);
  85. when(mockPool.borrowObject(mockManagedHost1)).thenReturn(mockBorrowedTracker1);
  86. when(mockPool.borrowObject(mockManagedHost2)).thenReturn(mockBorrowedTracker2);
  87. BorrowedTracker first = (BorrowedTracker) trackerPool.getTracker();
  88. assertThat(first, is(mockBorrowedTracker2));
  89. when(mockManagedHost2.getLastFailed()).thenReturn(10L);
  90. BorrowedTracker second = (BorrowedTracker) trackerPool.getTracker();
  91. assertThat(second, is(mockBorrowedTracker1));
  92. }
  93. @Test
  94. public void expectedTrackerIfFirstFail() throws Exception {
  95. when(mockManagedHost1.getLastUsed()).thenReturn(2L);
  96. when(mockManagedHost1.getLastFailed()).thenReturn(1L);
  97. when(mockManagedHost2.getLastUsed()).thenReturn(2L);
  98. when(mockManagedHost2.getLastFailed()).thenReturn(0L);
  99. Mockito.doAnswer(new Answer<Object>() {
  100. @Override
  101. public Object answer(InvocationOnMock invocation) throws Throwable {
  102. ManagedTrackerHost ms = (ManagedTrackerHost) invocation.getMock();
  103. when(ms.getLastFailed()).thenReturn(10L);
  104. return null;
  105. }
  106. }).when(mockManagedHost2).markAsFailed();
  107. when(mockPool.borrowObject(mockManagedHost1)).thenReturn(mockBorrowedTracker1);
  108. when(mockPool.borrowObject(mockManagedHost2)).thenThrow(new IllegalStateException());
  109. try {
  110. trackerPool.getTracker();
  111. fail("Not throw exception");
  112. } catch (CommunicationException e) {
  113. }
  114. BorrowedTracker first = (BorrowedTracker) trackerPool.getTracker();
  115. assertThat(first, is(mockBorrowedTracker1));
  116. BorrowedTracker second = (BorrowedTracker) trackerPool.getTracker();
  117. assertThat(second, is(mockBorrowedTracker1));
  118. // timer reset
  119. when(mockManagedHost2.getLastFailed()).thenReturn(0L);
  120. Mockito.doReturn(mockBorrowedTracker2).when(mockPool).borrowObject(mockManagedHost2);
  121. BorrowedTracker third = (BorrowedTracker) trackerPool.getTracker();
  122. assertThat(third, is(mockBorrowedTracker2));
  123. }
  124. @Test
  125. public void invalidateTracker() throws Exception {
  126. trackerPool.invalidateTracker(mockBorrowedTracker1);
  127. verify(mockPool).invalidateObject(mockManagedHost1, mockBorrowedTracker1);
  128. }
  129. @Test
  130. public void returnTracker() throws Exception {
  131. trackerPool.returnTracker(mockBorrowedTracker1);
  132. verify(mockPool).returnObject(mockManagedHost1, mockBorrowedTracker1);
  133. }
  134. @Test
  135. public void closeDelegates() throws Exception {
  136. trackerPool.close();
  137. verify(mockPool).close();
  138. }
  139. }