package com.google.appengine.tools.pipeline.impl.backend; import com.google.appengine.api.datastore.Key; import com.google.appengine.api.datastore.KeyFactory; import com.google.appengine.api.taskqueue.TaskHandle; import com.google.appengine.tools.development.testing.LocalDatastoreServiceTestConfig; import com.google.appengine.tools.development.testing.LocalModulesServiceTestConfig; import com.google.appengine.tools.development.testing.LocalServiceTestHelper; import com.google.appengine.tools.development.testing.LocalTaskQueueTestConfig; import com.google.appengine.tools.pipeline.impl.QueueSettings; import com.google.appengine.tools.pipeline.impl.tasks.RunJobTask; import com.google.appengine.tools.pipeline.impl.tasks.Task; import com.google.appengine.tools.pipeline.impl.util.GUIDGenerator; import junit.framework.TestCase; import java.util.ArrayList; import java.util.Collections; import java.util.List; /** * @author tkaitchuck */ public class AppEngineTaskQueueTest extends TestCase { private LocalServiceTestHelper helper; @Override public void setUp() throws Exception { super.setUp(); LocalTaskQueueTestConfig taskQueueConfig = new LocalTaskQueueTestConfig(); taskQueueConfig.setDisableAutoTaskExecution(true); taskQueueConfig.setShouldCopyApiProxyEnvironment(true); helper = new LocalServiceTestHelper(new LocalDatastoreServiceTestConfig(), taskQueueConfig, new LocalModulesServiceTestConfig()); helper.setUp(); } @Override public void tearDown() throws Exception { helper.tearDown(); super.tearDown(); } public void testEnqueueSingleTask() { AppEngineTaskQueue queue = new AppEngineTaskQueue(); Task task = createTask(); List<TaskHandle> handles = queue.addToQueue(Collections.singletonList(task)); assertEquals(1, handles.size()); assertEquals(task.getName(), handles.get(0).getName()); handles = queue.addToQueue(Collections.singletonList(task)); assertEquals(0, handles.size()); } public void testEnqueueBatchTasks() { AppEngineTaskQueue queue = new AppEngineTaskQueue(); List<Task> tasks = new ArrayList<>(AppEngineTaskQueue.MAX_TASKS_PER_ENQUEUE); for (int i = 0; i < AppEngineTaskQueue.MAX_TASKS_PER_ENQUEUE; i++) { Task task = createTask(); tasks.add(task); } List<TaskHandle> handles = queue.addToQueue(tasks); assertEquals(AppEngineTaskQueue.MAX_TASKS_PER_ENQUEUE, handles.size()); for (int i = 0; i < AppEngineTaskQueue.MAX_TASKS_PER_ENQUEUE; i++) { assertEquals(tasks.get(i).getName(), handles.get(i).getName()); } handles = queue.addToQueue(tasks); assertEquals(0, handles.size()); } public void testEnqueueLargeBatchTasks() { AppEngineTaskQueue queue = new AppEngineTaskQueue(); int batchSize = AppEngineTaskQueue.MAX_TASKS_PER_ENQUEUE * 2 + 10; List<Task> tasks = new ArrayList<>(batchSize); for (int i = 0; i < batchSize; i++) { Task task = createTask(); tasks.add(task); } List<TaskHandle> handles = queue.addToQueue(tasks); assertEquals(tasks.size(), handles.size()); for (int i = 0; i < tasks.size(); i++) { assertEquals(tasks.get(i).getName(), handles.get(i).getName()); } handles = queue.addToQueue(tasks); assertEquals(0, handles.size()); } public void testEnqueueBatchTwoStages() { AppEngineTaskQueue queue = new AppEngineTaskQueue(); int batchSize = AppEngineTaskQueue.MAX_TASKS_PER_ENQUEUE * 2; List<Task> tasks = new ArrayList<>(batchSize); for (int i = 0; i < batchSize; i++) { Task task = createTask(); tasks.add(task); } int firstBatchSize = AppEngineTaskQueue.MAX_TASKS_PER_ENQUEUE; List<TaskHandle> handles = queue.addToQueue(tasks.subList(0, firstBatchSize)); assertEquals(firstBatchSize, handles.size()); for (int i = 0; i < firstBatchSize; i++) { assertEquals(tasks.get(i).getName(), handles.get(i).getName()); } handles = queue.addToQueue(tasks); // Duplicate is rejected (not counted) per batch. int expected = tasks.size() - firstBatchSize; assertEquals(expected, handles.size()); for (int i = 0; i < expected; i++) { assertEquals(tasks.get(firstBatchSize + i).getName(), handles.get(i).getName()); } } private Task createTask() { String name = GUIDGenerator.nextGUID(); Key key = KeyFactory.createKey("testType", name); Task task = new RunJobTask(key, new QueueSettings().setModuleVersion("m1")); return task; } }