Skip to content

Commit

Permalink
Add a couple of tests for UpdateManagerImpl.
Browse files Browse the repository at this point in the history
  • Loading branch information
csmith committed Feb 28, 2016
1 parent a7dfd08 commit 8136bdb
Show file tree
Hide file tree
Showing 2 changed files with 58 additions and 18 deletions.
15 changes: 8 additions & 7 deletions src/com/dmdirc/updater/manager/UpdateManagerImpl.java
Expand Up @@ -55,9 +55,9 @@ public class UpdateManagerImpl implements UpdateManager {
/** Collection of known update checking strategies. */
private final List<UpdateCheckStrategy> checkers = new CopyOnWriteArrayList<>();
/** Collection of known update retrieval strategies. */
private final List<UpdateRetrievalStrategy> retrievers = new CopyOnWriteArrayList<>();
private final Collection<UpdateRetrievalStrategy> retrievers = new CopyOnWriteArrayList<>();
/** Collection of known update installation strategies. */
private final List<UpdateInstallationStrategy> installers = new CopyOnWriteArrayList<>();
private final Collection<UpdateInstallationStrategy> installers = new CopyOnWriteArrayList<>();
/** Map of known component names to their components. Guarded by {@link #componentsLock}. */
private final Map<String, UpdateComponent> components = new HashMap<>();
/** Listener used to proxy retrieval events. */
Expand Down Expand Up @@ -154,8 +154,8 @@ public void checkForUpdates() {
LOG.trace("Components: {}", components);
LOG.trace("Strategies: {}", checkers);

final List<UpdateComponent> enabledComponents = new ArrayList<>(components.size());
final List<UpdateComponent> disabledComponents = new ArrayList<>(components.size());
final Collection<UpdateComponent> enabledComponents = new ArrayList<>(components.size());
final Collection<UpdateComponent> disabledComponents = new ArrayList<>(components.size());

synchronized (componentsLock) {
for (UpdateComponent component : components.values()) {
Expand Down Expand Up @@ -233,7 +233,8 @@ public void retrieve(final UpdateComponent component) {
* @param install True to install automatically, false to just retrieve
*/
public void retrieve(final UpdateComponent component, final boolean install) {
if (!checkResults.containsKey(component) || !checkResults.get(component).isUpdateAvailable()) {
if (!checkResults.containsKey(component)
|| !checkResults.get(component).isUpdateAvailable()) {
LOG.warn("Tried to retrieve component with no update: {}", component);
return;
}
Expand Down Expand Up @@ -268,7 +269,7 @@ protected void setRetrievalResult(final UpdateRetrievalResult result) {
*
* @param result The result to find a strategy for
*
* @return A relevant strategy, or <code>null</code> if none are available
* @return A relevant strategy, or {@code null} if none are available
*/
protected UpdateRetrievalStrategy getStrategy(final UpdateCheckResult result) {
LOG.debug("Trying to find retrieval strategy for {}", result);
Expand All @@ -292,7 +293,7 @@ protected UpdateRetrievalStrategy getStrategy(final UpdateCheckResult result) {
*
* @param result The result to find a strategy for
*
* @return A relevant strategy, or <code>null</code> if none are available
* @return A relevant strategy, or {@code null} if none are available
*/
protected UpdateInstallationStrategy getStrategy(final UpdateRetrievalResult result) {
LOG.debug("Trying to find installation strategy for {}", result);
Expand Down
61 changes: 50 additions & 11 deletions test/com/dmdirc/updater/manager/UpdateManagerImplTest.java
Expand Up @@ -24,18 +24,22 @@

import com.dmdirc.updater.UpdateComponent;
import com.dmdirc.updater.checking.CheckResultConsolidator;
import com.dmdirc.updater.checking.UpdateCheckResult;
import com.dmdirc.updater.retrieving.UpdateRetrievalStrategy;

import java.util.concurrent.Executor;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.runners.MockitoJUnitRunner;
import org.mockito.stubbing.Answer;

import static org.mockito.Mockito.*;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.when;

@RunWith(MockitoJUnitRunner.class)
public class UpdateManagerImplTest {
Expand All @@ -47,6 +51,10 @@ public class UpdateManagerImplTest {
@Mock private UpdateComponent component2;
@Mock private UpdateComponent component3;
@Mock private UpdateStatusListener statusListener;
@Mock private UpdateCheckResult checkResult1;
@Mock private UpdateCheckResult checkResult2;
@Mock private UpdateRetrievalStrategy strategy1;
@Mock private UpdateRetrievalStrategy strategy2;
private UpdateManagerImpl manager;

@Before
Expand All @@ -64,19 +72,50 @@ public void testRemovingComponentInStatusChangeListener() {

manager.addUpdateStatusListener(statusListener);

doAnswer(new Answer<Void>() {
@Override
public Void answer(final InvocationOnMock invocation) throws Throwable {
// Add a new component from the manager while it's checking for updates.
// This potentially causes a CME, see CLIENT-404.
manager.addComponent(component3);
return null;
}
doAnswer(invocation -> {
// Add a new component from the manager while it's checking for updates.
// This potentially causes a CME, see CLIENT-404.
manager.addComponent(component3);
return null;
}).when(statusListener).updateStatusChanged(component1, UpdateStatus.CHECKING, 0);

when(updateComponentPolicy.canCheck(any(UpdateComponent.class))).thenReturn(true);

manager.checkForUpdates();
}

@Test
public void testGetSingleRetrievalStrategy() {
// Given a single retrieval strategy that can handle anything
when(strategy1.canHandle(any())).thenReturn(true);
manager.addRetrievalStrategy(strategy1);

// Then it is returned for any result.
assertSame(strategy1, manager.getStrategy(checkResult1));
assertSame(strategy1, manager.getStrategy(checkResult2));
}

@Test
public void testGetMultipleRetrievalStrategy() {
// Given two retrieval strategies that can handle different check results
when(strategy1.canHandle(checkResult1)).thenReturn(true);
when(strategy2.canHandle(checkResult2)).thenReturn(true);
manager.addRetrievalStrategy(strategy1);
manager.addRetrievalStrategy(strategy2);

// Then the corresponding strategy is returned for each result
assertSame(strategy1, manager.getStrategy(checkResult1));
assertSame(strategy2, manager.getStrategy(checkResult2));
}

@Test
public void testGetNoRetrievalStrategy() {
// Given a retrieval strategies that can handle a specific check result
when(strategy1.canHandle(checkResult1)).thenReturn(true);
manager.addRetrievalStrategy(strategy1);

// Then null is returned for other check results
assertNull(manager.getStrategy(checkResult2));
}

}

0 comments on commit 8136bdb

Please sign in to comment.