package enhancedsnapshots.service.impl;
import com.sungardas.enhancedsnapshots.aws.dynamodb.model.NodeEntry;
import com.sungardas.enhancedsnapshots.aws.dynamodb.model.TaskEntry;
import com.sungardas.enhancedsnapshots.aws.dynamodb.repository.NodeRepository;
import com.sungardas.enhancedsnapshots.aws.dynamodb.repository.TaskRepository;
import com.sungardas.enhancedsnapshots.cluster.ClusterConfigurationService;
import com.sungardas.enhancedsnapshots.components.ConfigurationMediator;
import com.sungardas.enhancedsnapshots.service.SchedulerService;
import com.sungardas.enhancedsnapshots.service.impl.MasterServiceImpl;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import java.util.Arrays;
import java.util.List;
import static org.junit.Assert.*;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
//TODO fix
@Ignore
@RunWith(MockitoJUnitRunner.class)
public class MasterServiceImplTest {
@Mock
private ConfigurationMediator configurationMediator;
@Mock
private SchedulerService schedulerService;
@Mock
private TaskRepository taskRepository;
@Mock
private NodeRepository nodeRepository;
@Mock
private ClusterConfigurationService clusterConfigurationService;
@InjectMocks
private MasterServiceImpl masterService;
@Test
public void basicTaskDistributionTest() {
List<TaskEntry> unassignedTasks = Arrays.asList(new TaskEntry[]{
getTaskEntry(TaskEntry.TaskEntryType.BACKUP),
getTaskEntry(TaskEntry.TaskEntryType.BACKUP),
getTaskEntry(TaskEntry.TaskEntryType.RESTORE),
getTaskEntry(TaskEntry.TaskEntryType.RESTORE),
getTaskEntry(TaskEntry.TaskEntryType.RESTORE),
getTaskEntry(TaskEntry.TaskEntryType.DELETE),
getTaskEntry(TaskEntry.TaskEntryType.SYSTEM_BACKUP)
});
List<NodeEntry> nodes = Arrays.asList(new NodeEntry[]{
getNode("id1", 0, 5),
getNode("id2", 5, 0)
});
when(taskRepository.findByWorkerIsNull()).thenReturn(unassignedTasks);
when(nodeRepository.findAll()).thenReturn(nodes);
masterService.taskDistribution();
verify(taskRepository).save(unassignedTasks);
for (TaskEntry task : unassignedTasks) {
assertNotNull(task.getWorker());
}
}
@Test
public void TaskDistributionWithLimitedResourcesTest() {
List<TaskEntry> unassignedTasks = Arrays.asList(new TaskEntry[]{
getTaskEntry(TaskEntry.TaskEntryType.BACKUP),
getTaskEntry(TaskEntry.TaskEntryType.BACKUP),
getTaskEntry(TaskEntry.TaskEntryType.RESTORE),
getTaskEntry(TaskEntry.TaskEntryType.RESTORE),
getTaskEntry(TaskEntry.TaskEntryType.RESTORE),
getTaskEntry(TaskEntry.TaskEntryType.DELETE),
getTaskEntry(TaskEntry.TaskEntryType.SYSTEM_BACKUP)
});
List<NodeEntry> nodes = Arrays.asList(new NodeEntry[]{
getNode("id1", 0, 2),
getNode("id2", 5, 0)
});
when(taskRepository.findByWorkerIsNull()).thenReturn(unassignedTasks);
when(nodeRepository.findAll()).thenReturn(nodes);
masterService.taskDistribution();
verify(taskRepository).save(unassignedTasks);
assertNotNull(unassignedTasks.get(0).getWorker());
assertNotNull(unassignedTasks.get(1).getWorker());
assertNotNull(unassignedTasks.get(2).getWorker());
assertNotNull(unassignedTasks.get(3).getWorker());
assertNull(unassignedTasks.get(4).getWorker());
assertNotNull(unassignedTasks.get(5).getWorker());
assertNull(unassignedTasks.get(6).getWorker());
}
@Test
public void TaskDistributionWithLimitedResourcesTest2() {
List<TaskEntry> unassignedTasks = Arrays.asList(new TaskEntry[]{
getTaskEntry(TaskEntry.TaskEntryType.BACKUP),
getTaskEntry(TaskEntry.TaskEntryType.BACKUP),
getTaskEntry(TaskEntry.TaskEntryType.RESTORE),
getTaskEntry(TaskEntry.TaskEntryType.RESTORE),
getTaskEntry(TaskEntry.TaskEntryType.RESTORE),
getTaskEntry(TaskEntry.TaskEntryType.DELETE),
getTaskEntry(TaskEntry.TaskEntryType.SYSTEM_BACKUP)
});
List<NodeEntry> nodes = Arrays.asList(new NodeEntry[]{
getNode("id1", 0, 5),
getNode("id2", 1, 0)
});
when(taskRepository.findByWorkerIsNull()).thenReturn(unassignedTasks);
when(nodeRepository.findAll()).thenReturn(nodes);
masterService.taskDistribution();
verify(taskRepository).save(unassignedTasks);
assertNotNull(unassignedTasks.get(0).getWorker());
assertNull(unassignedTasks.get(1).getWorker());
assertNotNull(unassignedTasks.get(2).getWorker());
assertNotNull(unassignedTasks.get(3).getWorker());
assertNotNull(unassignedTasks.get(4).getWorker());
assertNull(unassignedTasks.get(5).getWorker());
assertNotNull(unassignedTasks.get(6).getWorker());
}
@Test
public void TaskDistributionResourcesTest() {
List<TaskEntry> unassignedTasks = Arrays.asList(new TaskEntry[]{
getTaskEntry(TaskEntry.TaskEntryType.BACKUP),
getTaskEntry(TaskEntry.TaskEntryType.BACKUP),
getTaskEntry(TaskEntry.TaskEntryType.BACKUP),
getTaskEntry(TaskEntry.TaskEntryType.RESTORE),
getTaskEntry(TaskEntry.TaskEntryType.RESTORE),
getTaskEntry(TaskEntry.TaskEntryType.RESTORE),
getTaskEntry(TaskEntry.TaskEntryType.DELETE),
getTaskEntry(TaskEntry.TaskEntryType.SYSTEM_BACKUP)
});
List<NodeEntry> nodes = Arrays.asList(new NodeEntry[]{
getNode("id1", 1, 1),
getNode("id2", 2, 1),
getNode("id3", 1, 2)
});
when(taskRepository.findByWorkerIsNull()).thenReturn(unassignedTasks);
when(nodeRepository.findAll()).thenReturn(nodes);
masterService.taskDistribution();
verify(taskRepository).save(unassignedTasks);
int id1 = 0, id2 = 0, id3 = 0;
for (TaskEntry task : unassignedTasks) {
assertNotNull(task.getWorker());
switch (task.getWorker()) {
case "id1":
id1++;
break;
case "id2":
id2++;
break;
case "id3":
id3++;
break;
}
}
assertEquals(2, id1);
assertEquals(3, id2);
assertEquals(3, id3);
}
private TaskEntry getTaskEntry(TaskEntry.TaskEntryType type) {
TaskEntry taskEntry = new TaskEntry();
taskEntry.setType(type.getType());
return taskEntry;
}
private NodeEntry getNode(String id, int backup, int restore) {
NodeEntry nodeEntry = new NodeEntry();
nodeEntry.setNodeId(id);
nodeEntry.setFreeBackupWorkers(backup);
nodeEntry.setFreeRestoreWorkers(restore);
return nodeEntry;
}
}