Skip to content

Commit

Permalink
Merge pull request #771 from basil/powermock
Browse files Browse the repository at this point in the history
Remove PowerMock
  • Loading branch information
res0nance authored Aug 24, 2022
2 parents da65b27 + 6c2360f commit 8c746e8
Show file tree
Hide file tree
Showing 7 changed files with 93 additions and 145 deletions.
2 changes: 1 addition & 1 deletion .mvn/extensions.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,6 @@
<extension>
<groupId>io.jenkins.tools.incrementals</groupId>
<artifactId>git-changelist-maven-extension</artifactId>
<version>1.3</version>
<version>1.4</version>
</extension>
</extensions>
44 changes: 3 additions & 41 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ THE SOFTWARE.
<parent>
<groupId>org.jenkins-ci.plugins</groupId>
<artifactId>plugin</artifactId>
<version>4.40</version>
<version>4.47</version>
<relativePath />
</parent>

Expand Down Expand Up @@ -69,7 +69,7 @@ THE SOFTWARE.
</developers>

<scm>
<connection>scm:git:git://github.com/${gitHubRepo}.git</connection>
<connection>scm:git:https://github.com/${gitHubRepo}.git</connection>
<developerConnection>scm:git:git@github.com:${gitHubRepo}.git</developerConnection>
<url>https://github.com/${gitHubRepo}</url>
<tag>${scmTag}</tag>
Expand All @@ -79,10 +79,7 @@ THE SOFTWARE.
<revision>1.69</revision>
<changelist>-SNAPSHOT</changelist>
<jenkins.version>2.289.3</jenkins.version>
<java.level>8</java.level>
<gitHubRepo>jenkinsci/${project.artifactId}-plugin</gitHubRepo>
<mockito.version>3.12.4</mockito.version>
<powermock.version>2.0.9</powermock.version>
</properties>

<dependencies>
Expand Down Expand Up @@ -144,21 +141,9 @@ THE SOFTWARE.
<groupId>org.jenkins-ci.plugins.workflow</groupId>
<artifactId>workflow-step-api</artifactId>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4</artifactId>
<version>${powermock.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-mockito2</artifactId>
<version>${powermock.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<artifactId>mockito-inline</artifactId>
<scope>test</scope>
</dependency>
<dependency>
Expand Down Expand Up @@ -195,17 +180,6 @@ THE SOFTWARE.
<groupId>io.jenkins.configuration-as-code</groupId>
<artifactId>test-harness</artifactId>
<scope>test</scope>
<!--
PCT fails on maven-enforcer-plugin:enforce
test-harness:1.46 puts joda-time:2.10.2
aws-java-sdk:1.11.821 puts 2.8.1
-->
<exclusions>
<exclusion>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.testcontainers</groupId>
Expand Down Expand Up @@ -239,17 +213,6 @@ THE SOFTWARE.
<scope>import</scope>
<type>pom</type>
</dependency>
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.10.14</version>
</dependency>
<dependency>
<!-- fix upper bound -->
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.13.2</version>
</dependency>
</dependencies>
</dependencyManagement>

Expand All @@ -274,7 +237,6 @@ THE SOFTWARE.
<extensions>true</extensions>
<configuration>
<compatibleSinceVersion>1.45</compatibleSinceVersion>
<minimumJavaVersion>8</minimumJavaVersion>
</configuration>
</plugin>
<plugin>
Expand Down
27 changes: 13 additions & 14 deletions src/test/java/hudson/plugins/ec2/AmazonEC2CloudUnitTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,25 +27,24 @@

import com.amazonaws.services.ec2.model.Tag;

import org.mockito.MockedStatic;
import org.mockito.Mockito;
import org.powermock.api.mockito.PowerMockito;
import org.mockito.junit.MockitoJUnitRunner;
import hudson.plugins.ec2.util.AmazonEC2FactoryMockImpl;
import jenkins.model.Jenkins;

import org.powermock.reflect.Whitebox;
import org.junit.runner.RunWith;
import org.powermock.modules.junit4.PowerMockRunner;
import org.powermock.core.classloader.annotations.PowerMockIgnore;
import org.powermock.core.classloader.annotations.PrepareForTest;
import com.amazonaws.services.ec2.model.Instance;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashSet;

import java.net.MalformedURLException;
import java.net.URL;
import java.util.Collections;
import java.util.List;
import java.util.Set;

import static hudson.plugins.ec2.EC2Cloud.DEFAULT_EC2_ENDPOINT;
import static org.junit.Assert.assertEquals;
Expand All @@ -56,9 +55,7 @@
/**
* Unit tests related to {@link AmazonEC2Cloud}, but do not require a Jenkins instance.
*/
@PowerMockIgnore({"javax.crypto.*", "org.hamcrest.*", "javax.net.ssl.*", "com.sun.org.apache.xerces.*", "javax.xml.*", "org.xml.*"})
@RunWith(PowerMockRunner.class)
@PrepareForTest({EC2Cloud.class, Jenkins.class})
@RunWith(MockitoJUnitRunner.Silent.class)
public class AmazonEC2CloudUnitTest {

@Test
Expand Down Expand Up @@ -90,15 +87,14 @@ public void testInstaceCap() throws Exception {
@Test
public void testSpotInstanceCount() throws Exception {
final int numberOfSpotInstanceRequests = 105;
AmazonEC2Cloud cloud = PowerMockito.spy(new AmazonEC2Cloud("us-east-1", true, "abc", "us-east-1",
AmazonEC2Cloud cloud = Mockito.spy(new AmazonEC2Cloud("us-east-1", true, "abc", "us-east-1",
null, "key", null, Collections.emptyList(),
"roleArn", "roleSessionName"));
PowerMockito.mockStatic(Jenkins.class);
Jenkins jenkinsMock = mock(Jenkins.class);
EC2SpotSlave spotSlaveMock = mock(EC2SpotSlave.class);

PowerMockito.when(Jenkins.get()).thenReturn(jenkinsMock);
PowerMockito.when(jenkinsMock.getNodes()).thenReturn(Collections.singletonList(spotSlaveMock));
try (MockedStatic<Jenkins> mocked = Mockito.mockStatic(Jenkins.class)) {
mocked.when(Jenkins::get).thenReturn(jenkinsMock);
Mockito.when(jenkinsMock.getNodes()).thenReturn(Collections.singletonList(spotSlaveMock));
when(spotSlaveMock.getSpotRequest()).thenReturn(null);
when(spotSlaveMock.getSpotInstanceRequestId()).thenReturn("sir-id");

Expand All @@ -111,11 +107,14 @@ public void testSpotInstanceCount() throws Exception {

Mockito.doReturn(AmazonEC2FactoryMockImpl.createAmazonEC2Mock(null)).when(cloud).connect();

Method countCurrentEC2SpotSlaves = EC2Cloud.class.getDeclaredMethod("countCurrentEC2SpotSlaves", SlaveTemplate.class, String.class, Set.class);
countCurrentEC2SpotSlaves.setAccessible(true);
Object[] params = {null, "jenkinsurl", new HashSet<String>()};
int n = Whitebox.invokeMethod(cloud, "countCurrentEC2SpotSlaves", params);
int n = (int) countCurrentEC2SpotSlaves.invoke(cloud, params);

// Should equal number of spot instance requests + 1 for spot nodes not having a spot instance request
assertEquals(numberOfSpotInstanceRequests+1, n);
}
}

@Test
Expand Down
76 changes: 29 additions & 47 deletions src/test/java/hudson/plugins/ec2/CloudHelperTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,6 @@
import com.amazonaws.services.ec2.model.DescribeInstancesResult;
import com.amazonaws.services.ec2.model.Instance;
import com.amazonaws.services.ec2.model.Reservation;
import jenkins.model.Jenkins;
import jenkins.model.JenkinsLocationConfiguration;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
Expand All @@ -16,21 +14,16 @@
import org.mockito.Mockito;

import org.mockito.invocation.InvocationOnMock;
import org.mockito.junit.MockitoJUnitRunner;
import org.mockito.stubbing.Answer;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PowerMockIgnore;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;


import java.util.Collections;
import java.util.List;

import static org.junit.Assert.assertEquals;

@RunWith(PowerMockRunner.class)
@PrepareForTest({JenkinsLocationConfiguration.class, CloudHelper.class, Jenkins.class, SlaveTemplate.class, DescribeInstancesResult.class, Instance.class, EC2AbstractSlave.class})
@PowerMockIgnore({"javax.crypto.*", "org.hamcrest.*", "javax.net.ssl.*", "com.sun.org.apache.xerces.*", "javax.xml.*", "org.xml.*", "javax.management.*"})
@RunWith(MockitoJUnitRunner.class)
public class CloudHelperTest {

@Mock
Expand All @@ -41,49 +34,38 @@ public void init() throws Exception {
cloud = new AmazonEC2Cloud("us-east-1", true,
"abc", "us-east-1", null, "ghi",
"3", Collections.emptyList(), "roleArn", "roleSessionName");

PowerMockito.mockStatic(Thread.class);
}

@Test
public void testGetInstanceHappyPath() throws Exception {
/* Mocked items */
EC2Cloud spyCloud = PowerMockito.spy(cloud);
AmazonEC2 mockEc2 = PowerMockito.mock(AmazonEC2.class);
DescribeInstancesResult mockedDIResult = PowerMockito.mock(DescribeInstancesResult.class);
Reservation mockedReservation = PowerMockito.mock(Reservation.class);
EC2Cloud spyCloud = Mockito.spy(cloud);
AmazonEC2 mockEc2 = Mockito.mock(AmazonEC2.class);
DescribeInstancesResult mockedDIResult = Mockito.mock(DescribeInstancesResult.class);
Reservation mockedReservation = Mockito.mock(Reservation.class);
List<Reservation> reservationResults = Collections.singletonList(mockedReservation);
Instance mockedInstance = PowerMockito.mock(Instance.class);
Instance mockedInstance = Mockito.mock(Instance.class);
List<Instance> instanceResults = Collections.singletonList(mockedInstance);

PowerMockito.doReturn(mockEc2).when(spyCloud).connect();
PowerMockito.doReturn(mockedDIResult).when(mockEc2).describeInstances(Mockito.any(DescribeInstancesRequest.class));
PowerMockito.doReturn(reservationResults).when(mockedDIResult).getReservations();
PowerMockito.doReturn(instanceResults).when(mockedReservation).getInstances();
Mockito.doReturn(mockEc2).when(spyCloud).connect();
Mockito.doReturn(mockedDIResult).when(mockEc2).describeInstances(Mockito.any(DescribeInstancesRequest.class));
Mockito.doReturn(reservationResults).when(mockedDIResult).getReservations();
Mockito.doReturn(instanceResults).when(mockedReservation).getInstances();

/* Actual call to test*/
Instance result = CloudHelper.getInstance("test-instance-id", spyCloud);
assertEquals(mockedInstance, result);
}

@Test
public void testGetInstanceWithRetryHappyPath() throws Exception {
Instance mockedInstance = PowerMockito.mock(Instance.class);
PowerMockito.stub(PowerMockito.method(CloudHelper.class, "getInstance")).toReturn(mockedInstance);

Instance result = CloudHelper.getInstanceWithRetry("test-instance-id", cloud);
assertEquals(mockedInstance, result);
}

@Test
public void testGetInstanceWithRetryInstanceNotFound() throws Exception {
/* Mocked items */
EC2Cloud spyCloud = PowerMockito.spy(cloud);
AmazonEC2 mockEc2 = PowerMockito.mock(AmazonEC2.class);
DescribeInstancesResult mockedDIResult = PowerMockito.mock(DescribeInstancesResult.class);
Reservation mockedReservation = PowerMockito.mock(Reservation.class);
EC2Cloud spyCloud = Mockito.spy(cloud);
AmazonEC2 mockEc2 = Mockito.mock(AmazonEC2.class);
DescribeInstancesResult mockedDIResult = Mockito.mock(DescribeInstancesResult.class);
Reservation mockedReservation = Mockito.mock(Reservation.class);
List<Reservation> reservationResults = Collections.singletonList(mockedReservation);
Instance mockedInstance = PowerMockito.mock(Instance.class);
Instance mockedInstance = Mockito.mock(Instance.class);
List<Instance> instanceResults = Collections.singletonList(mockedInstance);
AmazonServiceException amazonServiceException = new AmazonServiceException("test exception");
amazonServiceException.setErrorCode("InvalidInstanceID.NotFound");
Expand All @@ -99,10 +81,10 @@ public DescribeInstancesResult answer(InvocationOnMock invocation) throws Throwa
}
};

PowerMockito.doReturn(mockEc2).when(spyCloud).connect();
PowerMockito.doAnswer(answerWithRetry).when(mockEc2).describeInstances(Mockito.any(DescribeInstancesRequest.class));
PowerMockito.doReturn(reservationResults).when(mockedDIResult).getReservations();
PowerMockito.doReturn(instanceResults).when(mockedReservation).getInstances();
Mockito.doReturn(mockEc2).when(spyCloud).connect();
Mockito.doAnswer(answerWithRetry).when(mockEc2).describeInstances(Mockito.any(DescribeInstancesRequest.class));
Mockito.doReturn(reservationResults).when(mockedDIResult).getReservations();
Mockito.doReturn(instanceResults).when(mockedReservation).getInstances();

/* Actual call to test*/
Instance result = CloudHelper.getInstanceWithRetry("test-instance-id", spyCloud);
Expand All @@ -112,12 +94,12 @@ public DescribeInstancesResult answer(InvocationOnMock invocation) throws Throwa
@Test
public void testGetInstanceWithRetryRequestExpired() throws Exception {
/* Mocked items */
EC2Cloud spyCloud = PowerMockito.spy(cloud);
AmazonEC2 mockEc2 = PowerMockito.mock(AmazonEC2.class);
DescribeInstancesResult mockedDIResult = PowerMockito.mock(DescribeInstancesResult.class);
Reservation mockedReservation = PowerMockito.mock(Reservation.class);
EC2Cloud spyCloud = Mockito.spy(cloud);
AmazonEC2 mockEc2 = Mockito.mock(AmazonEC2.class);
DescribeInstancesResult mockedDIResult = Mockito.mock(DescribeInstancesResult.class);
Reservation mockedReservation = Mockito.mock(Reservation.class);
List<Reservation> reservationResults = Collections.singletonList(mockedReservation);
Instance mockedInstance = PowerMockito.mock(Instance.class);
Instance mockedInstance = Mockito.mock(Instance.class);
List<Instance> instanceResults = Collections.singletonList(mockedInstance);
AmazonServiceException amazonServiceException = new AmazonServiceException("test exception");
amazonServiceException.setErrorCode("RequestExpired");
Expand All @@ -134,10 +116,10 @@ public DescribeInstancesResult answer(InvocationOnMock invocation) throws Throwa
}
};

PowerMockito.doReturn(mockEc2).when(spyCloud).connect();
PowerMockito.doAnswer(answerWithRetry).when(mockEc2).describeInstances(Mockito.any(DescribeInstancesRequest.class));
PowerMockito.doReturn(reservationResults).when(mockedDIResult).getReservations();
PowerMockito.doReturn(instanceResults).when(mockedReservation).getInstances();
Mockito.doReturn(mockEc2).when(spyCloud).connect();
Mockito.doAnswer(answerWithRetry).when(mockEc2).describeInstances(Mockito.any(DescribeInstancesRequest.class));
Mockito.doReturn(reservationResults).when(mockedDIResult).getReservations();
Mockito.doReturn(instanceResults).when(mockedReservation).getInstances();

/* Actual call to test*/
Instance result = CloudHelper.getInstanceWithRetry("test-instance-id", spyCloud);
Expand Down
Loading

0 comments on commit 8c746e8

Please sign in to comment.