/*
* ProActive Parallel Suite(TM):
* The Open Source library for parallel and distributed
* Workflows & Scheduling, Orchestration, Cloud Automation
* and Big Data Analysis on Enterprise Grids & Clouds.
*
* Copyright (c) 2007 - 2017 ActiveEon
* Contact: contact@activeeon.com
*
* This library is free software: you can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License
* as published by the Free Software Foundation: version 3 of
* the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* If needed, contact us to obtain a release under GPL Version 2 or 3
* or a different license than the AGPL.
*/
package org.ow2.proactive_grid_cloud_portal.scheduler;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.*;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
import org.ow2.proactive.scheduler.common.Page;
import org.ow2.proactive.scheduler.common.SortSpecifierContainer;
import org.ow2.proactive.scheduler.common.job.JobState;
import org.ow2.proactive.scheduler.common.task.TaskId;
import org.ow2.proactive.scheduler.common.task.TaskState;
import org.ow2.proactive.scheduler.common.util.SchedulerProxyUserInterface;
import org.ow2.proactive_grid_cloud_portal.RestTestServer;
import org.ow2.proactive_grid_cloud_portal.common.SchedulerRestInterface;
import org.ow2.proactive_grid_cloud_portal.common.SharedSessionStoreTestUtils;
import org.ow2.proactive_grid_cloud_portal.scheduler.dto.RestPage;
import org.ow2.proactive_grid_cloud_portal.scheduler.dto.TaskStateData;
/**
* The [offset, limit[ boundaries and tag filtering are out of the scope of these tests
* because their control is done in the <code>SchedulerDBManager</code> class.
* We are only testing the REST interface methods providing the task-centric feature.
*
*/
public class SchedulerStateRestTaskCentricTest extends RestTestServer {
private SchedulerRestInterface restInterface = null;
private SchedulerProxyUserInterface mockOfScheduler = null;
private String sessionId = null;
@Before
public void setUp() throws Throwable {
restInterface = new SchedulerStateRest();
mockOfScheduler = mock(SchedulerProxyUserInterface.class);
sessionId = SharedSessionStoreTestUtils.createValidSession(mockOfScheduler);
}
@Test
public void testGetTaskIds() throws Throwable {
int nbTasks = 100;
String jobIdStr = "1";
Page<TaskId> expectedPage = RestTestUtils.newMockedTaskIdPage(jobIdStr, nbTasks, null);
when(mockOfScheduler.getTaskIds(null, 0, 0, false, true, true, true, 0, 50)).thenReturn(expectedPage);
RestPage<String> page = restInterface.getTaskIds(sessionId, 0, 0, false, true, true, true, 0, 50);
RestTestUtils.assertTasks(nbTasks, jobIdStr, page);
}
@Test
public void testGetTaskIdsByTag() throws Throwable {
int nbTasks = 100;
String jobIdStr = "500";
String tag = "TAG-TEST";
Page<TaskId> expectedPage = RestTestUtils.newMockedTaskIdPage(jobIdStr, nbTasks, tag);
when(mockOfScheduler.getTaskIds(tag, 0, 0, false, true, true, true, 0, nbTasks)).thenReturn(expectedPage);
RestPage<String> page = restInterface.getTaskIdsByTag(sessionId,
tag,
0,
0,
false,
true,
true,
true,
0,
nbTasks);
RestTestUtils.assertTasks(nbTasks, jobIdStr, page);
}
@Test
public void testGetTaskStates() throws Throwable {
int nbTasksInPage = 50;
int nbTotalTasks = 100;
String jobIdStr = "1";
String tag = null;
Page<TaskState> expectedPage = RestTestUtils.newMockedTaskStatePage(jobIdStr, tag, nbTasksInPage, nbTotalTasks);
when(mockOfScheduler.getTaskStates(anyString(),
anyLong(),
anyLong(),
anyBoolean(),
anyBoolean(),
anyBoolean(),
anyBoolean(),
anyInt(),
anyInt(),
any(SortSpecifierContainer.class))).thenReturn(expectedPage);
RestPage<TaskStateData> page = restInterface.getTaskStates(sessionId,
0,
0,
false,
true,
true,
true,
0,
nbTasksInPage,
null);
RestTestUtils.assertTaskStates(expectedPage, page);
}
@Test
public void testGetTaskStatesByTagNoSorting() throws Throwable {
int nbTasksInPage = 50;
int nbTotalTasks = 100;
String jobIdStr = "1";
String tag = "TAG-TEST";
Page<TaskState> expectedPage = RestTestUtils.newMockedTaskStatePage(jobIdStr, tag, nbTasksInPage, nbTotalTasks);
when(mockOfScheduler.getTaskStates(anyString(),
anyLong(),
anyLong(),
anyBoolean(),
anyBoolean(),
anyBoolean(),
anyBoolean(),
anyInt(),
anyInt(),
any(SortSpecifierContainer.class))).thenReturn(expectedPage);
RestPage<TaskStateData> page = restInterface.getTaskStatesByTag(sessionId,
tag,
0,
0,
false,
true,
true,
true,
0,
nbTasksInPage,
new SortSpecifierContainer());
RestTestUtils.assertTaskStates(expectedPage, page);
}
@Test
public void testGetTaskStatesByTagSortByTaskIdDesc() throws Throwable {
int nbTasksInPage = 50;
int nbTotalTasks = 100;
String jobIdStr = "1";
String tag = "TAG-TEST";
Page<TaskState> expectedPage = RestTestUtils.newMockedTaskStatePage(jobIdStr, tag, nbTasksInPage, nbTotalTasks);
when(mockOfScheduler.getTaskStates(anyString(),
anyLong(),
anyLong(),
anyBoolean(),
anyBoolean(),
anyBoolean(),
anyBoolean(),
anyInt(),
anyInt(),
any(SortSpecifierContainer.class))).thenReturn(expectedPage);
RestPage<TaskStateData> page = restInterface.getTaskStatesByTag(sessionId,
tag,
0,
0,
false,
true,
true,
true,
0,
nbTasksInPage,
new SortSpecifierContainer(".id.taskId,descending"));
RestTestUtils.assertTaskStates(expectedPage, page);
// let's check only the first two as the string comparison is not valid
// after that case : "JOB-1-TASK-1/50".compareTo("JOB-1-TASK-10/50")
List<TaskStateData> tasks = page.getList();
TaskStateData previousTask = tasks.get(0);
TaskStateData currentTask = tasks.get(1);
assertTrue(previousTask.getName().compareTo(currentTask.getName()) < 0);
}
@Test
public void testGetTaskStatesByTagSortByJobIdAsc() throws Throwable {
int nbTasksInPage = 6;
int nbTotalTasks = 6;
ArrayList<String> jobIds = new ArrayList<String>(Arrays.asList("1", "8", "4", "4", "6", "2"));
String tag = "TAG-TEST";
Page<TaskState> expectedPage = RestTestUtils.newMockedTaskStatePage(jobIds, tag, nbTasksInPage, nbTotalTasks);
when(mockOfScheduler.getTaskStates(anyString(),
anyLong(),
anyLong(),
anyBoolean(),
anyBoolean(),
anyBoolean(),
anyBoolean(),
anyInt(),
anyInt(),
any(SortSpecifierContainer.class))).thenReturn(expectedPage);
RestPage<TaskStateData> page = restInterface.getTaskStatesByTag(sessionId,
tag,
0,
0,
false,
true,
true,
true,
0,
nbTasksInPage,
new SortSpecifierContainer(".jobData.id,ascending"));
RestTestUtils.assertTaskStates(expectedPage, page);
}
@Test
public void testGetJobTasksIdsPaginated() throws Throwable {
int nbTasks = 50;
String jobIdStr = "1";
JobState job = RestTestUtils.newMockedJob(jobIdStr, "", nbTasks);
when(mockOfScheduler.getJobState(jobIdStr)).thenReturn(job);
RestPage<String> page = restInterface.getTasksNamesPaginated(sessionId, jobIdStr, 0, nbTasks);
RestTestUtils.assertTasks(nbTasks, jobIdStr, page);
}
@Test
public void testGetJobTasksIdsByTagPaginated() throws Throwable {
int nbTasks = 50;
String jobIdStr = "1";
JobState job = RestTestUtils.newMockedJob(jobIdStr, "", nbTasks);
when(mockOfScheduler.getJobState(jobIdStr)).thenReturn(job);
RestPage<String> page = restInterface.getTasksNamesPaginated(sessionId, jobIdStr, 0, nbTasks);
RestTestUtils.assertTasks(nbTasks, jobIdStr, page);
}
@Test
public void testGetJobTaskStatesPaginated() throws Throwable {
int nbTasks = 50;
String jobIdStr = "1";
JobState job = RestTestUtils.newMockedJob(jobIdStr, null, nbTasks);
when(mockOfScheduler.getJobState(jobIdStr)).thenReturn(job);
List<TaskStateData> res = restInterface.getJobTaskStatesPaginated(sessionId, jobIdStr, 0, nbTasks).getList();
assertEquals("Number of tasks is incorrect", nbTasks, res.size());
}
}