/** * Copyright (c) 2010, 2013 Darmstadt University of Technology. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Marcel Bruch - initial API and implementation. */ package org.eclipse.recommenders.internal.models.rcp; import static org.junit.Assert.*; import static org.mockito.Matchers.*; import static org.mockito.Mockito.*; import java.util.Arrays; import java.util.List; import org.eclipse.core.runtime.IProgressMonitor; import org.hamcrest.Matchers; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.invocation.InvocationOnMock; import org.mockito.runners.MockitoJUnitRunner; import org.mockito.stubbing.Answer; @RunWith(MockitoJUnitRunner.class) public class MultipleDownloadCallbackTest { private static final int ONE_HUNDRED_PERCENT_UNITS = 100; private static final int MAXIMUM_DOWNLOADS = 2; private static final String MESSAGE = "Resolving model jre:jre:ovrp:zip:1.0.0"; private static final Double REMAINDER_SPLIT = 1.0; private static final String MAVEN_METADATA_XML = "org/eclipse/recommenders/index/0.0.0-SNAPSHOT/maven-metadata.xml"; private static final String INDEX_ZIP = "org/eclipse/recommenders/index/0.0.0-SNAPSHOT/index-0.0.0-20140605.014212-1.zip"; private static final String JRE_ZIP = "jre/jre/1.0.0-SNAPSHOT/jre-1.0.0-20140605.013426-1-call.zip"; @Mock private IProgressMonitor monitor; private ArgumentCaptor<Double> workedUnits; @Before public void setUp() { // Using @Captor would not work on kepler, which uses mockito 1.8.4 // Mockito 1.8.4 creates an ArgumentCaptor<Object> which is not able to handle the autoboxing // of captured primitives (double in this case). // Details at: https://code.google.com/p/mockito/issues/detail?id=188 // For that reason the captor is manually created. workedUnits = ArgumentCaptor.forClass(Double.class); // The callback uses a submonitor for downloads which will not call worked() but internalWorked() on the // callback's monitor. // Tests are only interested in the overall work units and not if they are passed by worked() or // internalWorked() to the monitor. For that reason the mock-object forwards all worked()-calls with the same // parameter to the internalWorked()-method (as most of the Monitor-Implementations do). doAnswer(new Answer<Object>() { @Override public Object answer(InvocationOnMock invocation) throws Throwable { monitor.internalWorked((Integer) invocation.getArguments()[0]); return invocation; } }).when(monitor).worked(anyInt()); } @Test public void testStartMonitorTask() { new MultipleDownloadCallback(monitor, MESSAGE, ONE_HUNDRED_PERCENT_UNITS, MAXIMUM_DOWNLOADS); verify(monitor).beginTask(eq(MESSAGE), eq(ONE_HUNDRED_PERCENT_UNITS)); } @Test public void testMonitorNotDoneByDefault() { new MultipleDownloadCallback(monitor, MESSAGE, ONE_HUNDRED_PERCENT_UNITS, MAXIMUM_DOWNLOADS); verify(monitor, never()).done(); } @Test public void testDownloadsFinishedDoesNotSetTheMonitorDone() { MultipleDownloadCallback sut = new MultipleDownloadCallback(monitor, MESSAGE, ONE_HUNDRED_PERCENT_UNITS, MAXIMUM_DOWNLOADS); sut.finish(); verify(monitor, never()).done(); } @Test public void testAllWorkDoneIfFinished() { MultipleDownloadCallback sut = new MultipleDownloadCallback(monitor, MESSAGE, ONE_HUNDRED_PERCENT_UNITS, MAXIMUM_DOWNLOADS); sut.finish(); verify(monitor, atLeastOnce()).internalWorked(workedUnits.capture()); assertCapturedSequence(workedUnits, skipped(50.0), skipped(50.0)); } @Test public void testAllWorkDoneIfFinishedWithOneDownload() { MultipleDownloadCallback sut = new MultipleDownloadCallback(monitor, MESSAGE, ONE_HUNDRED_PERCENT_UNITS, MAXIMUM_DOWNLOADS); sut.downloadInitiated(MAVEN_METADATA_XML); sut.downloadStarted(MAVEN_METADATA_XML); sut.downloadSucceeded(MAVEN_METADATA_XML); sut.finish(); verify(monitor, atLeastOnce()).internalWorked(workedUnits.capture()); assertCapturedSequence(workedUnits, download(50.0), skipped(50.0)); } @Test public void testFinishWithoutDownloadIsNoSuccess() { MultipleDownloadCallback sut = new MultipleDownloadCallback(monitor, MESSAGE, ONE_HUNDRED_PERCENT_UNITS, MAXIMUM_DOWNLOADS); sut.finish(); assertFalse(sut.isDownloadSucceeded()); } @Test public void testDownloadSucceeded() { int maximumNumberOfDownloads = 1; MultipleDownloadCallback sut = new MultipleDownloadCallback(monitor, MESSAGE, ONE_HUNDRED_PERCENT_UNITS, maximumNumberOfDownloads); sut.downloadInitiated(MAVEN_METADATA_XML); sut.downloadStarted(MAVEN_METADATA_XML); sut.downloadSucceeded(MAVEN_METADATA_XML); sut.finish(); assertTrue(sut.isDownloadSucceeded()); } @Test public void testSucceededWithOneFailedDownload() { MultipleDownloadCallback sut = new MultipleDownloadCallback(monitor, MESSAGE, ONE_HUNDRED_PERCENT_UNITS, MAXIMUM_DOWNLOADS); sut.downloadInitiated(MAVEN_METADATA_XML); sut.downloadStarted(MAVEN_METADATA_XML); sut.downloadSucceeded(MAVEN_METADATA_XML); sut.downloadInitiated(INDEX_ZIP); sut.downloadStarted(INDEX_ZIP); sut.downloadFailed(INDEX_ZIP); sut.finish(); assertTrue(sut.isDownloadSucceeded()); } @Test public void testNoDetailedProgressIfDownloadSizeNotKnown() { int numberOfDownloads = 1; MultipleDownloadCallback sut = new MultipleDownloadCallback(monitor, MESSAGE, ONE_HUNDRED_PERCENT_UNITS, numberOfDownloads); sut.downloadInitiated(MAVEN_METADATA_XML); sut.downloadStarted(MAVEN_METADATA_XML); sut.downloadProgressed(MAVEN_METADATA_XML, 512, -1); sut.downloadProgressed(MAVEN_METADATA_XML, 1024, -1); sut.downloadSucceeded(MAVEN_METADATA_XML); sut.finish(); verify(monitor, atLeastOnce()).internalWorked(workedUnits.capture()); assertCapturedSequence(workedUnits, download(100.0)); } @Test public void testFinishWithAllDownloads() { MultipleDownloadCallback sut = new MultipleDownloadCallback(monitor, MESSAGE, ONE_HUNDRED_PERCENT_UNITS, MAXIMUM_DOWNLOADS); sut.downloadInitiated(MAVEN_METADATA_XML); sut.downloadStarted(MAVEN_METADATA_XML); sut.downloadSucceeded(MAVEN_METADATA_XML); sut.downloadInitiated(INDEX_ZIP); sut.downloadStarted(INDEX_ZIP); sut.downloadSucceeded(INDEX_ZIP); sut.finish(); verify(monitor, atLeastOnce()).internalWorked(workedUnits.capture()); assertCapturedSequence(workedUnits, download(50.0), download(50.0)); } @Test public void testFinishedWithRemainderInWorkUnits() { int oneHundredPercentUnits = 13; MultipleDownloadCallback sut = new MultipleDownloadCallback(monitor, MESSAGE, oneHundredPercentUnits, MAXIMUM_DOWNLOADS); sut.finish(); verify(monitor, atLeastOnce()).internalWorked(workedUnits.capture()); assertCapturedSequence(workedUnits, download(6.0), download(6.0), REMAINDER_SPLIT); } @Test public void testDownloadProgressIfSizeKnown() { int maximumNumberOfDownloads = 1; MultipleDownloadCallback sut = new MultipleDownloadCallback(monitor, MESSAGE, ONE_HUNDRED_PERCENT_UNITS, maximumNumberOfDownloads); sut.downloadInitiated(MAVEN_METADATA_XML); sut.downloadProgressed(MAVEN_METADATA_XML, 256, 1024); sut.downloadProgressed(MAVEN_METADATA_XML, 512, 1024); sut.downloadProgressed(MAVEN_METADATA_XML, 1024, 1024); sut.downloadSucceeded(MAVEN_METADATA_XML); sut.finish(); verify(monitor, atLeastOnce()).internalWorked(workedUnits.capture()); assertCapturedSequence(workedUnits, progress(25.0), progress(25.0), progress(50.0)); } @Test public void testDownloadProgressWithMultipleDownloads() { MultipleDownloadCallback sut = new MultipleDownloadCallback(monitor, MESSAGE, ONE_HUNDRED_PERCENT_UNITS, MAXIMUM_DOWNLOADS); sut.downloadInitiated(MAVEN_METADATA_XML); sut.downloadStarted(MAVEN_METADATA_XML); sut.downloadProgressed(MAVEN_METADATA_XML, 256, 1024); sut.downloadProgressed(MAVEN_METADATA_XML, 512, 1024); sut.downloadProgressed(MAVEN_METADATA_XML, 1024, 1024); sut.downloadSucceeded(MAVEN_METADATA_XML); sut.downloadInitiated(INDEX_ZIP); sut.downloadStarted(INDEX_ZIP); sut.downloadSucceeded(INDEX_ZIP); sut.finish(); verify(monitor, atLeastOnce()).internalWorked(workedUnits.capture()); assertCapturedSequence(workedUnits, progress(12.0), progress(12.0), progress(25.0), REMAINDER_SPLIT, download(50.0)); } @Test public void testFinishedWorkWithFailedDownload() { int maximumNumberOfDownloads = 1; MultipleDownloadCallback sut = new MultipleDownloadCallback(monitor, MESSAGE, ONE_HUNDRED_PERCENT_UNITS, maximumNumberOfDownloads); sut.downloadInitiated(JRE_ZIP); sut.downloadStarted(JRE_ZIP); sut.downloadFailed(JRE_ZIP); sut.finish(); verify(monitor, atLeastOnce()).internalWorked(workedUnits.capture()); assertCapturedSequence(workedUnits, failed(100.0)); } @Test public void testWorkUnitRemainderSplit() { int oneHundredPercentUnits = 17; int maximumNumberOfDownloads = 3; MultipleDownloadCallback sut = new MultipleDownloadCallback(monitor, MESSAGE, oneHundredPercentUnits, maximumNumberOfDownloads); sut.downloadInitiated(MAVEN_METADATA_XML); sut.downloadStarted(MAVEN_METADATA_XML); sut.downloadSucceeded(MAVEN_METADATA_XML); sut.downloadInitiated(INDEX_ZIP); sut.downloadStarted(INDEX_ZIP); sut.downloadSucceeded(INDEX_ZIP); sut.downloadInitiated(JRE_ZIP); sut.downloadStarted(JRE_ZIP); sut.downloadSucceeded(JRE_ZIP); sut.finish(); verify(monitor, atLeastOnce()).internalWorked(workedUnits.capture()); assertCapturedSequence(workedUnits, download(5.0), REMAINDER_SPLIT, download(5.0), REMAINDER_SPLIT, download(5.0)); } @Test public void testMaximumDownloadsFinishWork() { MultipleDownloadCallback sut = new MultipleDownloadCallback(monitor, MESSAGE, ONE_HUNDRED_PERCENT_UNITS, MAXIMUM_DOWNLOADS); sut.downloadInitiated(MAVEN_METADATA_XML); sut.downloadStarted(MAVEN_METADATA_XML); sut.downloadSucceeded(MAVEN_METADATA_XML); sut.downloadInitiated(INDEX_ZIP); sut.downloadStarted(INDEX_ZIP); sut.downloadSucceeded(INDEX_ZIP); sut.finish(); verify(monitor, atLeastOnce()).internalWorked(workedUnits.capture()); assertCapturedSequence(workedUnits, download(50.0), download(50.0)); } private static void assertCapturedSequence(ArgumentCaptor<Double> captor, Double... expectedValues) { List<Double> allValues = captor.getAllValues(); assertThat(allValues, Matchers.equalTo(Arrays.asList(expectedValues))); } private static Double download(Double expectedValue) { return expectedValue; } private static Double progress(Double expectedValue) { return expectedValue; } private static Double skipped(Double expectedValue) { return expectedValue; } private static Double failed(Double expectedValue) { return expectedValue; } }