package com.dgrid.test.helpers; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Random; import java.util.concurrent.Callable; import com.dgrid.gen.Constants; import com.dgrid.gen.JOB_STATUS; import com.dgrid.gen.Joblet; import com.dgrid.gen.JobletResult; import com.dgrid.handlers.SystemJobletTypeHandler; import com.dgrid.helpers.ForkJoinHelper; import com.dgrid.test.BaseTestCase; import com.dgrid.util.io.HostnameDiscovery; @SuppressWarnings("unchecked") public class ForkJoinHelperTestCase extends BaseTestCase { public void testFJHelper() throws Exception { ForkJoinHelper fj = (ForkJoinHelper) super.getBean(ForkJoinHelper.NAME); Random random = new Random(); List<Callable> tasks = new ArrayList<Callable>(); int correctValue = 0; for (int i = 0; i < 11; ++i) { int[] data = generateRandomData(random, 1000, 10000); correctValue += sum(data); tasks.add(new Sum(data)); } List results = fj.executeConcurrently(tasks, 10); int sum = sumObjects(results); assertEquals(correctValue, sum); } public void testFJHelperJoblets() throws Exception { ForkJoinHelper fj = (ForkJoinHelper) super.getBean(ForkJoinHelper.NAME); List<Joblet> joblets = new ArrayList<Joblet>(1); Map<String, String> params = new HashMap<String, String>(1); params.put(SystemJobletTypeHandler.SAVE_OUTPUT_PARAM, Boolean .toString(true)); Joblet joblet = new Joblet(0, 0l, 0, 0, HostnameDiscovery.getHostname(), 1, Constants.SYSTEM_JOBLET, "Concurrency test", params, "expr 1 + 1", JOB_STATUS.RECEIVED); joblets.add(joblet); List results = fj.gridExecuteConcurrently(joblets, 10, 1); for (Object object : results) { assertTrue(object instanceof JobletResult); JobletResult jr = (JobletResult) object; assertEquals(jr.getStatus(), JOB_STATUS.COMPLETED); assertEquals(jr.getDetails().trim(), "2"); } } private int sum(int[] values) { int retval = 0; for (int i : values) { retval += i; } return retval; } private int sumObjects(List values) { int retval = 0; for (Object object : values) { retval += ((Integer) object).intValue(); } return retval; } private int[] generateRandomData(Random random, int length, int max) { int[] i = new int[length]; for (int x = 0; x < i.length; ++x) { i[x] = random.nextInt(max); } return i; } private static class Sum implements Callable<Integer> { private int[] data; public Sum(int[] data) { this.data = data; } public Integer call() throws Exception { int retval = 0; for (int i : data) { retval += i; } return new Integer(retval); } } }