Skip to content

Commit 3358960

Browse files
committed
Implement automated tests for plugin API HTTP Client
Implement automated tests for plugin API HTTP resource Add Mockito and Power Mock dependency Implement automated tests for ConfigurationsManager. Implement additional tests for HTTP Client and HTTP resource Exclude artifacts forbidden by maven enforce plugin
1 parent 7f8c534 commit 3358960

13 files changed

Lines changed: 576 additions & 66 deletions

pom.xml

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,31 @@
146146
<artifactId>lombok</artifactId>
147147
<version>1.16.4</version>
148148
</dependency>
149+
150+
<dependency>
151+
<groupId>org.mockito</groupId>
152+
<artifactId>mockito-core</artifactId>
153+
<version>1.10.19</version>
154+
<scope>test</scope>
155+
<exclusions>
156+
<exclusion>
157+
<groupId>org.hamcrest</groupId>
158+
<artifactId>hamcrest-core</artifactId>
159+
</exclusion>
160+
</exclusions>
161+
</dependency>
162+
<dependency>
163+
<groupId>org.powermock</groupId>
164+
<artifactId>powermock-api-mockito</artifactId>
165+
<version>1.6.2</version>
166+
<scope>test</scope>
167+
<exclusions>
168+
<exclusion>
169+
<groupId>org.mockito</groupId>
170+
<artifactId>mockito-all</artifactId>
171+
</exclusion>
172+
</exclusions>
173+
</dependency>
149174
</dependencies>
150175

151176
<build>

src/main/java/com/griddynamics/cd/nrp/internal/model/config/ReplicationPluginConfiguration.java

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
import javax.xml.bind.annotation.XmlElement;
2525
import javax.xml.bind.annotation.XmlElementWrapper;
2626
import javax.xml.bind.annotation.XmlRootElement;
27-
import java.util.HashSet;
27+
import java.util.LinkedHashSet;
2828
import java.util.Set;
2929

3030
/**
@@ -36,26 +36,24 @@
3636
public class ReplicationPluginConfiguration {
3737
@XmlElement(name = "server")
3838
@XmlElementWrapper(name = "servers")
39-
private final Set<NexusServer> servers = new HashSet<>();
39+
private final Set<NexusServer> servers = new LinkedHashSet<>();
4040
@Getter
4141
@NonNull
4242
@XmlAttribute(name = "myUrl")
4343
private String myUrl;
44+
@Getter
4445
@XmlAttribute(name = "requestsQueueSize")
4546
private Integer requestsQueueSize = 500;
4647
@XmlAttribute(name = "requestsSendingThreadsCount")
4748
private Integer requestsSendingThreadsCount = 1;
4849
@XmlAttribute(name = "queueDumpFileName")
50+
@NonNull
4951
private String queueDumpFileName;
5052

5153
public void addServer(NexusServer server) {
5254
servers.add(server);
5355
}
5456

55-
public Integer getRequestsQueueSize() {
56-
return requestsQueueSize;
57-
}
58-
5957
public String getQueueDumpFileName() {
6058
return queueDumpFileName;
6159
}

src/main/java/com/griddynamics/cd/nrp/internal/uploading/impl/ArtifactUpdateApiClientImpl.java

Lines changed: 13 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
import com.griddynamics.cd.nrp.internal.model.config.NexusServer;
2323
import com.griddynamics.cd.nrp.internal.uploading.ArtifactUpdateApiClient;
2424
import com.griddynamics.cd.nrp.internal.uploading.ConfigurationsManager;
25+
import com.griddynamics.cd.nrp.internal.uploading.impl.factories.AsyncWebResourceBuilderFactory;
26+
import com.griddynamics.cd.nrp.internal.uploading.impl.factories.FileBlockingQueueFactory;
2527
import com.sun.jersey.api.client.AsyncWebResource;
2628
import com.sun.jersey.api.client.Client;
2729
import com.sun.jersey.api.client.GenericType;
@@ -66,25 +68,21 @@ public class ArtifactUpdateApiClientImpl extends ComponentSupport implements Art
6668
* Provides access to the plugin configurations
6769
*/
6870
private final ConfigurationsManager configurationsManager;
69-
71+
private final FileBlockingQueueFactory fileBlockingQueueFactory;
72+
private final AsyncWebResourceBuilderFactory asyncWebResourceBuilderFactory;
7073
/**
7174
* ExecutorService shares between clients. All treads are created in the same executor
7275
*/
73-
private final ExecutorService jerseyHttpClientExecutor;
7476
private final FileBlockingQueue fileBlockingQueue;
7577

7678
@Inject
77-
public ArtifactUpdateApiClientImpl(ConfigurationsManager configurationsManager) {
79+
public ArtifactUpdateApiClientImpl(ConfigurationsManager configurationsManager,
80+
FileBlockingQueueFactory fileBlockingQueueFactory,
81+
AsyncWebResourceBuilderFactory asyncWebResourceBuilderFactory) {
7882
this.configurationsManager = configurationsManager;
83+
this.fileBlockingQueueFactory = fileBlockingQueueFactory;
84+
this.asyncWebResourceBuilderFactory = asyncWebResourceBuilderFactory;
7985
this.fileBlockingQueue = initFileBlockingQueue(configurationsManager.getConfiguration());
80-
this.jerseyHttpClientExecutor = new ThreadPoolExecutor(
81-
configurationsManager.getConfiguration().getRequestsSendingThreadsCount(),
82-
configurationsManager.getConfiguration().getRequestsSendingThreadsCount(),
83-
30,
84-
TimeUnit.SECONDS,
85-
new LinkedBlockingQueue<Runnable>(
86-
configurationsManager.getConfiguration().getRequestsQueueSize())
87-
);
8886
initBackgroundWorkers(configurationsManager.getConfiguration());
8987
}
9088

@@ -110,11 +108,8 @@ public void run() {
110108
}
111109

112110
private FileBlockingQueue initFileBlockingQueue(ReplicationPluginConfiguration replicationPluginConfiguration) {
113-
BlockingQueue<ArtifactMetaInfo> blockingQueue =
114-
new LinkedBlockingQueue<>(replicationPluginConfiguration.getRequestsQueueSize());
115111
String queueFileName = replicationPluginConfiguration.getQueueDumpFileName();
116-
FileBlockingQueue retVal = new FileBlockingQueue(blockingQueue,
117-
queueFileName);
112+
FileBlockingQueue retVal = fileBlockingQueueFactory.getFileBlockingQueue();
118113
try {
119114
File queueFile = new File(queueFileName);
120115
if (queueFile.exists()) {
@@ -147,7 +142,9 @@ public void offerRequest(ArtifactMetaInfo artifactMetaInfo) {
147142
*/
148143
public void sendRequest(ArtifactMetaInfo metaInfo) {
149144
for (NexusServer server : configurationsManager.getConfiguration().getServers()) {
150-
AsyncWebResource.Builder service = getService(server.getUrl(), server.getUser(), server.getPassword());
145+
AsyncWebResource.Builder service =
146+
asyncWebResourceBuilderFactory.getAsyncWebResourceBuilder(
147+
server.getUrl(), server.getUser(), server.getPassword());
151148
try {
152149
service.post(new ITypeListener<RestResponse>() {
153150
@Override
@@ -180,42 +177,4 @@ public GenericType<RestResponse> getGenericType() {
180177
}
181178
}
182179

183-
/**
184-
* Returns jersey HTTP resource to access to the remote replication servers
185-
*
186-
* @param nexusUrl URL of the remote server
187-
* @param login Username on the remote server
188-
* @param password User's password
189-
* @return Jersey HTTP client
190-
*/
191-
private AsyncWebResource.Builder getService(String nexusUrl, String login, String password) {
192-
Client client = getClient(login, password);
193-
client.setExecutorService(jerseyHttpClientExecutor);
194-
AsyncWebResource webResource = client.asyncResource(UriBuilder.fromUri(nexusUrl).build());
195-
webResource = webResource.path("service").path("local").path("artifact").path("maven").path("update");
196-
return webResource.accept(MediaType.APPLICATION_XML_TYPE)
197-
.type(MediaType.APPLICATION_XML_TYPE);
198-
}
199-
200-
/**
201-
* Creates jersey HTTP client
202-
*
203-
* @param login Username on the remote server
204-
* @param password User's password
205-
* @return HTTP client
206-
*/
207-
private Client getClient(String login, String password) {
208-
ClientConfig config = new DefaultClientConfig();
209-
config.getProperties().put(ClientConfig.PROPERTY_CONNECT_TIMEOUT, 1000);
210-
config.getProperties().put(ClientConfig.PROPERTY_READ_TIMEOUT, 2000);
211-
Client client = Client.create(config);
212-
client.setExecutorService(jerseyHttpClientExecutor);
213-
if (login != null && !login.isEmpty() && password != null) {
214-
log.debug("Creating HTTP client with authorized HTTPBasicAuthFilter.");
215-
client.addFilter(new HTTPBasicAuthFilter(login, password));
216-
} else {
217-
log.debug("Creating HTTP client with anonymous HTTPBasicAuthFilter.");
218-
}
219-
return client;
220-
}
221180
}

src/main/java/com/griddynamics/cd/nrp/internal/uploading/impl/ConfigurationsManagerImpl.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ public ConfigurationsManagerImpl(NexusConfiguration nexusConfiguration) {
6666
@PostConstruct
6767
public void init() {
6868
log.trace("Initializing plugin configurations");
69-
reloadConfigurations();
69+
reloadConfigurations(CONFIG_FILENAME);
7070
}
7171

7272
/**
@@ -78,7 +78,7 @@ public ReplicationPluginConfiguration getConfiguration() {
7878
if (config == null) {
7979
synchronized (this) {
8080
if (config == null) {
81-
reloadConfigurations();
81+
reloadConfigurations(CONFIG_FILENAME);
8282
}
8383
}
8484
}
@@ -89,8 +89,8 @@ public ReplicationPluginConfiguration getConfiguration() {
8989
* Reloads {@link ConfigurationsManagerImpl#config}
9090
* from XML plugin configurations file
9191
*/
92-
public void reloadConfigurations() {
93-
File file = getConfigurationFile();
92+
public void reloadConfigurations(String filename) {
93+
File file = getConfigurationFile(filename);
9494
try {
9595
JAXBContext jaxbContext = JAXBContext.newInstance(ReplicationPluginConfiguration.class);
9696

@@ -104,7 +104,7 @@ public void reloadConfigurations() {
104104
/**
105105
* Returns plugin configurations XML file
106106
*/
107-
private File getConfigurationFile() {
108-
return new File(nexusConfiguration.getConfigurationDirectory(), CONFIG_FILENAME);
107+
private File getConfigurationFile(String filename) {
108+
return new File(nexusConfiguration.getConfigurationDirectory(), filename);
109109
}
110110
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package com.griddynamics.cd.nrp.internal.uploading.impl.factories;
2+
3+
import com.sun.jersey.api.client.AsyncWebResource;
4+
import com.sun.jersey.api.client.Client;
5+
6+
import javax.inject.Inject;
7+
import javax.inject.Singleton;
8+
import javax.ws.rs.core.MediaType;
9+
import javax.ws.rs.core.UriBuilder;
10+
11+
@Singleton
12+
public class AsyncWebResourceBuilderFactory {
13+
14+
private final JerseyClientFactory jerseyClientFactory;
15+
16+
@Inject
17+
public AsyncWebResourceBuilderFactory(JerseyClientFactory jerseyClientFactory) {
18+
this.jerseyClientFactory = jerseyClientFactory;
19+
}
20+
21+
22+
/**
23+
* Returns jersey HTTP resource to access to the remote replication servers
24+
*
25+
* @param nexusUrl URL of the remote server
26+
* @param login Username on the remote server
27+
* @param password User's password
28+
* @return Jersey HTTP client
29+
*/
30+
public AsyncWebResource.Builder getAsyncWebResourceBuilder(String nexusUrl, String login, String password) {
31+
Client client = jerseyClientFactory.getClient(login, password);
32+
AsyncWebResource webResource = client.asyncResource(UriBuilder.fromUri(nexusUrl).build());
33+
webResource = webResource.path("service").path("local").path("artifact").path("maven").path("update");
34+
return webResource.accept(MediaType.APPLICATION_XML_TYPE)
35+
.type(MediaType.APPLICATION_XML_TYPE);
36+
}
37+
38+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package com.griddynamics.cd.nrp.internal.uploading.impl.factories;
2+
3+
import com.griddynamics.cd.nrp.internal.model.api.ArtifactMetaInfo;
4+
import com.griddynamics.cd.nrp.internal.uploading.ConfigurationsManager;
5+
import com.griddynamics.cd.nrp.internal.uploading.impl.FileBlockingQueue;
6+
7+
import javax.inject.Inject;
8+
import javax.inject.Singleton;
9+
import java.util.concurrent.BlockingQueue;
10+
import java.util.concurrent.LinkedBlockingQueue;
11+
12+
@Singleton
13+
public class FileBlockingQueueFactory {
14+
15+
private final ConfigurationsManager configurationsManager;
16+
17+
@Inject
18+
public FileBlockingQueueFactory(ConfigurationsManager configurationsManager) {
19+
this.configurationsManager = configurationsManager;
20+
}
21+
22+
public FileBlockingQueue getFileBlockingQueue() {
23+
BlockingQueue<ArtifactMetaInfo> blockingQueue =
24+
new LinkedBlockingQueue<>(configurationsManager.
25+
getConfiguration().getRequestsQueueSize());
26+
String blockingQueueDumpFileName = configurationsManager.getConfiguration().getQueueDumpFileName();
27+
28+
return new FileBlockingQueue(blockingQueue,
29+
blockingQueueDumpFileName);
30+
}
31+
32+
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package com.griddynamics.cd.nrp.internal.uploading.impl.factories;
2+
3+
import com.griddynamics.cd.nrp.internal.uploading.ConfigurationsManager;
4+
import com.sun.jersey.api.client.Client;
5+
import com.sun.jersey.api.client.config.ClientConfig;
6+
import com.sun.jersey.api.client.config.DefaultClientConfig;
7+
import com.sun.jersey.api.client.filter.HTTPBasicAuthFilter;
8+
import org.slf4j.Logger;
9+
import org.slf4j.LoggerFactory;
10+
11+
import javax.inject.Inject;
12+
import javax.inject.Singleton;
13+
import java.util.concurrent.ExecutorService;
14+
import java.util.concurrent.LinkedBlockingQueue;
15+
import java.util.concurrent.ThreadPoolExecutor;
16+
import java.util.concurrent.TimeUnit;
17+
18+
@Singleton
19+
public class JerseyClientFactory {
20+
21+
private Logger log = LoggerFactory.getLogger(JerseyClientFactory.class);
22+
23+
private final ExecutorService executorService;
24+
25+
@Inject
26+
public JerseyClientFactory(ConfigurationsManager configurationsManager) {
27+
this.executorService = new ThreadPoolExecutor(
28+
configurationsManager.getConfiguration().getRequestsSendingThreadsCount(),
29+
configurationsManager.getConfiguration().getRequestsSendingThreadsCount(),
30+
30,
31+
TimeUnit.SECONDS,
32+
new LinkedBlockingQueue<Runnable>(
33+
configurationsManager.getConfiguration().getRequestsQueueSize()));
34+
}
35+
36+
public Client getClient(String login, String password) {
37+
ClientConfig config = new DefaultClientConfig();
38+
config.getProperties().put(ClientConfig.PROPERTY_CONNECT_TIMEOUT, 1000);
39+
config.getProperties().put(ClientConfig.PROPERTY_READ_TIMEOUT, 2000);
40+
Client client = Client.create(config);
41+
client.setExecutorService(executorService);
42+
if (login != null && !login.isEmpty() && password != null) {
43+
log.debug("Creating HTTP client with authorized HTTPBasicAuthFilter.");
44+
client.addFilter(new HTTPBasicAuthFilter(login, password));
45+
} else {
46+
log.debug("Creating HTTP client with anonymous HTTPBasicAuthFilter.");
47+
}
48+
return client;
49+
}
50+
51+
}

0 commit comments

Comments
 (0)