Newer
Older
Sonia Zorba
committed
/*
* This file is part of vospace-rest
* Copyright (C) 2021 Istituto Nazionale di Astrofisica
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package it.inaf.oats.vospace;
Sonia Zorba
committed
import it.inaf.oats.vospace.datamodel.Views;
Sonia Zorba
committed
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
Sonia Zorba
committed
import net.ivoa.xml.uws.v1.JobSummary;
Sonia Zorba
committed
import net.ivoa.xml.vospace.v2.Param;
Sonia Zorba
committed
import net.ivoa.xml.vospace.v2.Transfer;
Sonia Zorba
committed
import net.ivoa.xml.vospace.v2.View;
Sonia Zorba
committed
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.fail;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyString;
import org.mockito.Mock;
Sonia Zorba
committed
import org.mockito.MockedConstruction;
import org.mockito.Mockito;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.when;
Sonia Zorba
committed
import org.mockito.junit.jupiter.MockitoExtension;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
Sonia Zorba
committed
@ExtendWith(MockitoExtension.class)
public class AsyncTransferServiceTest {
Sonia Zorba
committed
private static final String JSON_JOB = "{\"jobId\":\"job_id\",\"runId\":null,\"ownerId\":null,\"phase\":null,\"quote\":null,\"creationTime\":null,\"startTime\":null,\"endTime\":null,\"executionDuration\":0,\"destruction\":null,\"parameters\":null,\"results\":[],\"errorSummary\":null,\"jobInfo\":{\"transfer\":{\"target\":\"vos://example.com!vospace/my-node\",\"direction\":\"pullToVoSpace\",\"view\":{\"param\":[{\"value\":\"file1.txt\",\"uri\":\"ivo://ia2.inaf.it/vospace/views#async-recall/include\"},{\"value\":\"file2.txt\",\"uri\":\"ivo://ia2.inaf.it/vospace/views#async-recall/include\"}],\"uri\":\"ivo://ia2.inaf.it/vospace/views#async-recall\",\"original\":true},\"protocols\":[],\"keepBytes\":false,\"version\":null,\"param\":[]}},\"version\":null}";
Sonia Zorba
committed
@Mock
private Jedis mockedJedis;
Sonia Zorba
committed
@Test
public void testRedisRpc() {
doAnswer(invocation -> {
String requestId = invocation.getArgument(1);
List<String> result = new ArrayList<>();
result.add(requestId);
result.add(JSON_JOB);
return result;
}).when(mockedJedis).brpop(anyInt(), anyString());
testWithMockedJedis(asyncTransferService -> {
Sonia Zorba
committed
JobSummary result = asyncTransferService.startJob(getFakeJob());
assertEquals("job_id", result.getJobId());
Sonia Zorba
committed
}
@Test
public void testRedisError() {
when(mockedJedis.brpop(anyInt(), anyString())).thenReturn(List.of());
testWithMockedJedis(asyncTransferService -> {
Sonia Zorba
committed
try {
asyncTransferService.startJob(getFakeJob());
fail();
Sonia Zorba
committed
} catch (IllegalStateException ex) {
Sonia Zorba
committed
}
});
}
private void testWithMockedJedis(Consumer<AsyncTransferService> testAction) {
try (MockedConstruction<JedisPool> staticMock = Mockito.mockConstruction(JedisPool.class,
(mockedJedisPool, context) -> {
when(mockedJedisPool.getResource()).thenReturn(mockedJedis);
})) {
AsyncTransferService asyncTransferService = new AsyncTransferService("localhost", 6379);
testAction.accept(asyncTransferService);
Sonia Zorba
committed
}
}
Sonia Zorba
committed
Sonia Zorba
committed
private JobSummary getFakeJob() {
Transfer transfer = new Transfer();
transfer.setDirection("pullToVoSpace");
Sonia Zorba
committed
Sonia Zorba
committed
transfer.setTarget("vos://example.com!vospace/my-node");
Sonia Zorba
committed
Sonia Zorba
committed
View view = new View();
view.setUri(Views.ASYNC_RECALL_VIEW_URI);
Param p1 = new Param();
p1.setUri(Views.ASYNC_RECALL_VIEW_URI + "/include");
p1.setValue("file1.txt");
view.getParam().add(p1);
Param p2 = new Param();
p2.setUri(Views.ASYNC_RECALL_VIEW_URI + "/include");
p2.setValue("file2.txt");
view.getParam().add(p2);
transfer.setView(view);
Sonia Zorba
committed
JobSummary job = new JobSummary();
job.setJobId("job_id");
JobSummary.JobInfo jobInfo = new JobSummary.JobInfo();
jobInfo.getAny().add(transfer);
job.setJobInfo(jobInfo);
return job;
}
}