ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/RecursiveActionTest.java
(Generate patch)

Comparing jsr166/src/test/tck/RecursiveActionTest.java (file contents):
Revision 1.32 by dl, Tue May 31 10:28:06 2011 UTC vs.
Revision 1.43 by jsr166, Sun Feb 22 19:16:38 2015 UTC

# Line 4 | Line 4
4   * http://creativecommons.org/publicdomain/zero/1.0/
5   */
6  
7 < import junit.framework.*;
7 > import static java.util.concurrent.TimeUnit.SECONDS;
8 >
9 > import java.util.Arrays;
10 > import java.util.HashSet;
11   import java.util.concurrent.CancellationException;
9 import java.util.concurrent.SynchronousQueue;
12   import java.util.concurrent.ExecutionException;
13   import java.util.concurrent.ForkJoinPool;
14   import java.util.concurrent.ForkJoinTask;
15   import java.util.concurrent.ForkJoinWorkerThread;
16   import java.util.concurrent.RecursiveAction;
17 < import java.util.concurrent.TimeUnit;
17 > import java.util.concurrent.SynchronousQueue;
18 > import java.util.concurrent.ThreadLocalRandom;
19   import java.util.concurrent.TimeoutException;
20 < import static java.util.concurrent.TimeUnit.SECONDS;
21 < import java.util.HashSet;
20 >
21 > import junit.framework.Test;
22 > import junit.framework.TestSuite;
23  
24   public class RecursiveActionTest extends JSR166TestCase {
25  
# Line 171 | Line 175 | public class RecursiveActionTest extends
175          final int number;
176          int result;
177          FibAction(int n) { number = n; }
178 <        public void realCompute() {
178 >        protected void realCompute() {
179              int n = number;
180              if (n <= 1)
181                  result = n;
# Line 209 | Line 213 | public class RecursiveActionTest extends
213       */
214      public void testInvoke() {
215          RecursiveAction a = new CheckedRecursiveAction() {
216 <            public void realCompute() {
216 >            protected void realCompute() {
217                  FibAction f = new FibAction(8);
218                  assertNull(f.invoke());
219                  assertEquals(21, f.result);
# Line 225 | Line 229 | public class RecursiveActionTest extends
229       */
230      public void testQuietlyInvoke() {
231          RecursiveAction a = new CheckedRecursiveAction() {
232 <            public void realCompute() {
232 >            protected void realCompute() {
233                  FibAction f = new FibAction(8);
234                  f.quietlyInvoke();
235                  assertEquals(21, f.result);
# Line 239 | Line 243 | public class RecursiveActionTest extends
243       */
244      public void testForkJoin() {
245          RecursiveAction a = new CheckedRecursiveAction() {
246 <            public void realCompute() {
246 >            protected void realCompute() {
247                  FibAction f = new FibAction(8);
248                  assertSame(f, f.fork());
249                  assertNull(f.join());
# Line 254 | Line 258 | public class RecursiveActionTest extends
258       */
259      public void testJoinIgnoresInterrupts() {
260          RecursiveAction a = new CheckedRecursiveAction() {
261 <            public void realCompute() {
261 >            protected void realCompute() {
262                  FibAction f = new FibAction(8);
263                  final Thread myself = Thread.currentThread();
264  
# Line 334 | Line 338 | public class RecursiveActionTest extends
338          final SynchronousQueue<FibAction[]> sq =
339              new SynchronousQueue<FibAction[]>();
340          RecursiveAction a = new CheckedRecursiveAction() {
341 <            public void realCompute() throws InterruptedException {
341 >            protected void realCompute() throws InterruptedException {
342                  FibAction[] fibActions = new FibAction[6];
343                  for (int i = 0; i < fibActions.length; i++)
344                      fibActions[i] = new FibAction(8);
# Line 434 | Line 438 | public class RecursiveActionTest extends
438       */
439      public void testForkGet() {
440          RecursiveAction a = new CheckedRecursiveAction() {
441 <            public void realCompute() throws Exception {
441 >            protected void realCompute() throws Exception {
442                  FibAction f = new FibAction(8);
443                  assertSame(f, f.fork());
444                  assertNull(f.get());
# Line 449 | Line 453 | public class RecursiveActionTest extends
453       */
454      public void testForkTimedGet() {
455          RecursiveAction a = new CheckedRecursiveAction() {
456 <            public void realCompute() throws Exception {
456 >            protected void realCompute() throws Exception {
457                  FibAction f = new FibAction(8);
458                  assertSame(f, f.fork());
459                  assertNull(f.get(5L, SECONDS));
# Line 464 | Line 468 | public class RecursiveActionTest extends
468       */
469      public void testForkTimedGetNPE() {
470          RecursiveAction a = new CheckedRecursiveAction() {
471 <            public void realCompute() throws Exception {
471 >            protected void realCompute() throws Exception {
472                  FibAction f = new FibAction(8);
473                  assertSame(f, f.fork());
474                  try {
# Line 480 | Line 484 | public class RecursiveActionTest extends
484       */
485      public void testForkQuietlyJoin() {
486          RecursiveAction a = new CheckedRecursiveAction() {
487 <            public void realCompute() {
487 >            protected void realCompute() {
488                  FibAction f = new FibAction(8);
489                  assertSame(f, f.fork());
490                  f.quietlyJoin();
# Line 496 | Line 500 | public class RecursiveActionTest extends
500       */
501      public void testForkHelpQuiesce() {
502          RecursiveAction a = new CheckedRecursiveAction() {
503 <            public void realCompute() {
503 >            protected void realCompute() {
504                  FibAction f = new FibAction(8);
505                  assertSame(f, f.fork());
506                  helpQuiesce();
507 +                while (!f.isDone()) // wait out race
508 +                    ;
509                  assertEquals(21, f.result);
510                  assertEquals(0, getQueuedTaskCount());
511                  checkCompletedNormally(f);
# Line 512 | Line 518 | public class RecursiveActionTest extends
518       */
519      public void testAbnormalInvoke() {
520          RecursiveAction a = new CheckedRecursiveAction() {
521 <            public void realCompute() {
521 >            protected void realCompute() {
522                  FailingFibAction f = new FailingFibAction(8);
523                  try {
524                      f.invoke();
# Line 529 | Line 535 | public class RecursiveActionTest extends
535       */
536      public void testAbnormalQuietlyInvoke() {
537          RecursiveAction a = new CheckedRecursiveAction() {
538 <            public void realCompute() {
538 >            protected void realCompute() {
539                  FailingFibAction f = new FailingFibAction(8);
540                  f.quietlyInvoke();
541                  assertTrue(f.getException() instanceof FJException);
# Line 543 | Line 549 | public class RecursiveActionTest extends
549       */
550      public void testAbnormalForkJoin() {
551          RecursiveAction a = new CheckedRecursiveAction() {
552 <            public void realCompute() {
552 >            protected void realCompute() {
553                  FailingFibAction f = new FailingFibAction(8);
554                  assertSame(f, f.fork());
555                  try {
# Line 561 | Line 567 | public class RecursiveActionTest extends
567       */
568      public void testAbnormalForkGet() {
569          RecursiveAction a = new CheckedRecursiveAction() {
570 <            public void realCompute() throws Exception {
570 >            protected void realCompute() throws Exception {
571                  FailingFibAction f = new FailingFibAction(8);
572                  assertSame(f, f.fork());
573                  try {
# Line 581 | Line 587 | public class RecursiveActionTest extends
587       */
588      public void testAbnormalForkTimedGet() {
589          RecursiveAction a = new CheckedRecursiveAction() {
590 <            public void realCompute() throws Exception {
590 >            protected void realCompute() throws Exception {
591                  FailingFibAction f = new FailingFibAction(8);
592                  assertSame(f, f.fork());
593                  try {
594 <                    f.get(5L, TimeUnit.SECONDS);
594 >                    f.get(5L, SECONDS);
595                      shouldThrow();
596                  } catch (ExecutionException success) {
597                      Throwable cause = success.getCause();
# Line 601 | Line 607 | public class RecursiveActionTest extends
607       */
608      public void testAbnormalForkQuietlyJoin() {
609          RecursiveAction a = new CheckedRecursiveAction() {
610 <            public void realCompute() {
610 >            protected void realCompute() {
611                  FailingFibAction f = new FailingFibAction(8);
612                  assertSame(f, f.fork());
613                  f.quietlyJoin();
# Line 616 | Line 622 | public class RecursiveActionTest extends
622       */
623      public void testCancelledInvoke() {
624          RecursiveAction a = new CheckedRecursiveAction() {
625 <            public void realCompute() {
625 >            protected void realCompute() {
626                  FibAction f = new FibAction(8);
627                  assertTrue(f.cancel(true));
628                  try {
# Line 634 | Line 640 | public class RecursiveActionTest extends
640       */
641      public void testCancelledForkJoin() {
642          RecursiveAction a = new CheckedRecursiveAction() {
643 <            public void realCompute() {
643 >            protected void realCompute() {
644                  FibAction f = new FibAction(8);
645                  assertTrue(f.cancel(true));
646                  assertSame(f, f.fork());
# Line 653 | Line 659 | public class RecursiveActionTest extends
659       */
660      public void testCancelledForkGet() {
661          RecursiveAction a = new CheckedRecursiveAction() {
662 <            public void realCompute() throws Exception {
662 >            protected void realCompute() throws Exception {
663                  FibAction f = new FibAction(8);
664                  assertTrue(f.cancel(true));
665                  assertSame(f, f.fork());
# Line 672 | Line 678 | public class RecursiveActionTest extends
678       */
679      public void testCancelledForkTimedGet() {
680          RecursiveAction a = new CheckedRecursiveAction() {
681 <            public void realCompute() throws Exception {
681 >            protected void realCompute() throws Exception {
682                  FibAction f = new FibAction(8);
683                  assertTrue(f.cancel(true));
684                  assertSame(f, f.fork());
# Line 691 | Line 697 | public class RecursiveActionTest extends
697       */
698      public void testCancelledForkQuietlyJoin() {
699          RecursiveAction a = new CheckedRecursiveAction() {
700 <            public void realCompute() {
700 >            protected void realCompute() {
701                  FibAction f = new FibAction(8);
702                  assertTrue(f.cancel(true));
703                  assertSame(f, f.fork());
# Line 707 | Line 713 | public class RecursiveActionTest extends
713      public void testGetPool() {
714          final ForkJoinPool mainPool = mainPool();
715          RecursiveAction a = new CheckedRecursiveAction() {
716 <            public void realCompute() {
716 >            protected void realCompute() {
717                  assertSame(mainPool, getPool());
718              }};
719          testInvokeOnPool(mainPool, a);
# Line 718 | Line 724 | public class RecursiveActionTest extends
724       */
725      public void testGetPool2() {
726          RecursiveAction a = new CheckedRecursiveAction() {
727 <            public void realCompute() {
727 >            protected void realCompute() {
728                  assertNull(getPool());
729              }};
730          assertNull(a.invoke());
# Line 729 | Line 735 | public class RecursiveActionTest extends
735       */
736      public void testInForkJoinPool() {
737          RecursiveAction a = new CheckedRecursiveAction() {
738 <            public void realCompute() {
738 >            protected void realCompute() {
739                  assertTrue(inForkJoinPool());
740              }};
741          testInvokeOnPool(mainPool(), a);
# Line 740 | Line 746 | public class RecursiveActionTest extends
746       */
747      public void testInForkJoinPool2() {
748          RecursiveAction a = new CheckedRecursiveAction() {
749 <            public void realCompute() {
749 >            protected void realCompute() {
750                  assertFalse(inForkJoinPool());
751              }};
752          assertNull(a.invoke());
# Line 752 | Line 758 | public class RecursiveActionTest extends
758      public void testWorkerGetPool() {
759          final ForkJoinPool mainPool = mainPool();
760          RecursiveAction a = new CheckedRecursiveAction() {
761 <            public void realCompute() {
761 >            protected void realCompute() {
762                  ForkJoinWorkerThread w =
763                      (ForkJoinWorkerThread) Thread.currentThread();
764                  assertSame(mainPool, w.getPool());
# Line 766 | Line 772 | public class RecursiveActionTest extends
772      public void testWorkerGetPoolIndex() {
773          final ForkJoinPool mainPool = mainPool();
774          RecursiveAction a = new CheckedRecursiveAction() {
775 <            public void realCompute() {
775 >            protected void realCompute() {
776                  ForkJoinWorkerThread w =
777                      (ForkJoinWorkerThread) Thread.currentThread();
778                  assertTrue(w.getPoolIndex() >= 0);
# Line 781 | Line 787 | public class RecursiveActionTest extends
787       */
788      public void testSetRawResult() {
789          RecursiveAction a = new CheckedRecursiveAction() {
790 <            public void realCompute() {
790 >            protected void realCompute() {
791                  setRawResult(null);
792                  assertNull(getRawResult());
793              }};
# Line 789 | Line 795 | public class RecursiveActionTest extends
795      }
796  
797      /**
798 <     * A reinitialized task may be re-invoked
798 >     * A reinitialized normally completed task may be re-invoked
799       */
800      public void testReinitialize() {
801          RecursiveAction a = new CheckedRecursiveAction() {
802 <            public void realCompute() {
802 >            protected void realCompute() {
803                  FibAction f = new FibAction(8);
804                  checkNotDone(f);
805  
# Line 809 | Line 815 | public class RecursiveActionTest extends
815      }
816  
817      /**
818 +     * A reinitialized abnormally completed task may be re-invoked
819 +     */
820 +    public void testReinitializeAbnormal() {
821 +        RecursiveAction a = new CheckedRecursiveAction() {
822 +            protected void realCompute() {
823 +                FailingFibAction f = new FailingFibAction(8);
824 +                checkNotDone(f);
825 +
826 +                for (int i = 0; i < 3; i++) {
827 +                    try {
828 +                        f.invoke();
829 +                        shouldThrow();
830 +                    } catch (FJException success) {
831 +                        checkCompletedAbnormally(f, success);
832 +                    }
833 +                    f.reinitialize();
834 +                    checkNotDone(f);
835 +                }
836 +            }};
837 +        testInvokeOnPool(mainPool(), a);
838 +    }
839 +
840 +    /**
841       * invoke task throws exception after invoking completeExceptionally
842       */
843      public void testCompleteExceptionally() {
844          RecursiveAction a = new CheckedRecursiveAction() {
845 <            public void realCompute() {
845 >            protected void realCompute() {
846                  FibAction f = new FibAction(8);
847                  f.completeExceptionally(new FJException());
848                  try {
# Line 831 | Line 860 | public class RecursiveActionTest extends
860       */
861      public void testComplete() {
862          RecursiveAction a = new CheckedRecursiveAction() {
863 <            public void realCompute() {
863 >            protected void realCompute() {
864                  FibAction f = new FibAction(8);
865                  f.complete(null);
866                  assertNull(f.invoke());
# Line 846 | Line 875 | public class RecursiveActionTest extends
875       */
876      public void testInvokeAll2() {
877          RecursiveAction a = new CheckedRecursiveAction() {
878 <            public void realCompute() {
878 >            protected void realCompute() {
879                  FibAction f = new FibAction(8);
880                  FibAction g = new FibAction(9);
881                  invokeAll(f, g);
# Line 863 | Line 892 | public class RecursiveActionTest extends
892       */
893      public void testInvokeAll1() {
894          RecursiveAction a = new CheckedRecursiveAction() {
895 <            public void realCompute() {
895 >            protected void realCompute() {
896                  FibAction f = new FibAction(8);
897                  invokeAll(f);
898                  checkCompletedNormally(f);
# Line 877 | Line 906 | public class RecursiveActionTest extends
906       */
907      public void testInvokeAll3() {
908          RecursiveAction a = new CheckedRecursiveAction() {
909 <            public void realCompute() {
909 >            protected void realCompute() {
910                  FibAction f = new FibAction(8);
911                  FibAction g = new FibAction(9);
912                  FibAction h = new FibAction(7);
# Line 900 | Line 929 | public class RecursiveActionTest extends
929       */
930      public void testInvokeAllCollection() {
931          RecursiveAction a = new CheckedRecursiveAction() {
932 <            public void realCompute() {
932 >            protected void realCompute() {
933                  FibAction f = new FibAction(8);
934                  FibAction g = new FibAction(9);
935                  FibAction h = new FibAction(7);
# Line 927 | Line 956 | public class RecursiveActionTest extends
956       */
957      public void testInvokeAllNPE() {
958          RecursiveAction a = new CheckedRecursiveAction() {
959 <            public void realCompute() {
959 >            protected void realCompute() {
960                  FibAction f = new FibAction(8);
961                  FibAction g = new FibAction(9);
962                  FibAction h = null;
# Line 944 | Line 973 | public class RecursiveActionTest extends
973       */
974      public void testAbnormalInvokeAll2() {
975          RecursiveAction a = new CheckedRecursiveAction() {
976 <            public void realCompute() {
976 >            protected void realCompute() {
977                  FibAction f = new FibAction(8);
978                  FailingFibAction g = new FailingFibAction(9);
979                  try {
# Line 962 | Line 991 | public class RecursiveActionTest extends
991       */
992      public void testAbnormalInvokeAll1() {
993          RecursiveAction a = new CheckedRecursiveAction() {
994 <            public void realCompute() {
994 >            protected void realCompute() {
995                  FailingFibAction g = new FailingFibAction(9);
996                  try {
997                      invokeAll(g);
# Line 979 | Line 1008 | public class RecursiveActionTest extends
1008       */
1009      public void testAbnormalInvokeAll3() {
1010          RecursiveAction a = new CheckedRecursiveAction() {
1011 <            public void realCompute() {
1011 >            protected void realCompute() {
1012                  FibAction f = new FibAction(8);
1013                  FailingFibAction g = new FailingFibAction(9);
1014                  FibAction h = new FibAction(7);
# Line 998 | Line 1027 | public class RecursiveActionTest extends
1027       */
1028      public void testAbnormalInvokeAllCollection() {
1029          RecursiveAction a = new CheckedRecursiveAction() {
1030 <            public void realCompute() {
1030 >            protected void realCompute() {
1031                  FailingFibAction f = new FailingFibAction(8);
1032                  FibAction g = new FibAction(9);
1033                  FibAction h = new FibAction(7);
# Line 1022 | Line 1051 | public class RecursiveActionTest extends
1051       */
1052      public void testTryUnfork() {
1053          RecursiveAction a = new CheckedRecursiveAction() {
1054 <            public void realCompute() {
1054 >            protected void realCompute() {
1055                  FibAction g = new FibAction(9);
1056                  assertSame(g, g.fork());
1057                  FibAction f = new FibAction(8);
# Line 1041 | Line 1070 | public class RecursiveActionTest extends
1070       */
1071      public void testGetSurplusQueuedTaskCount() {
1072          RecursiveAction a = new CheckedRecursiveAction() {
1073 <            public void realCompute() {
1073 >            protected void realCompute() {
1074                  FibAction h = new FibAction(7);
1075                  assertSame(h, h.fork());
1076                  FibAction g = new FibAction(9);
# Line 1063 | Line 1092 | public class RecursiveActionTest extends
1092       */
1093      public void testPeekNextLocalTask() {
1094          RecursiveAction a = new CheckedRecursiveAction() {
1095 <            public void realCompute() {
1095 >            protected void realCompute() {
1096                  FibAction g = new FibAction(9);
1097                  assertSame(g, g.fork());
1098                  FibAction f = new FibAction(8);
# Line 1084 | Line 1113 | public class RecursiveActionTest extends
1113       */
1114      public void testPollNextLocalTask() {
1115          RecursiveAction a = new CheckedRecursiveAction() {
1116 <            public void realCompute() {
1116 >            protected void realCompute() {
1117                  FibAction g = new FibAction(9);
1118                  assertSame(g, g.fork());
1119                  FibAction f = new FibAction(8);
# Line 1102 | Line 1131 | public class RecursiveActionTest extends
1131       */
1132      public void testPollTask() {
1133          RecursiveAction a = new CheckedRecursiveAction() {
1134 <            public void realCompute() {
1134 >            protected void realCompute() {
1135                  FibAction g = new FibAction(9);
1136                  assertSame(g, g.fork());
1137                  FibAction f = new FibAction(8);
# Line 1120 | Line 1149 | public class RecursiveActionTest extends
1149       */
1150      public void testPeekNextLocalTaskAsync() {
1151          RecursiveAction a = new CheckedRecursiveAction() {
1152 <            public void realCompute() {
1152 >            protected void realCompute() {
1153                  FibAction g = new FibAction(9);
1154                  assertSame(g, g.fork());
1155                  FibAction f = new FibAction(8);
# Line 1140 | Line 1169 | public class RecursiveActionTest extends
1169       */
1170      public void testPollNextLocalTaskAsync() {
1171          RecursiveAction a = new CheckedRecursiveAction() {
1172 <            public void realCompute() {
1172 >            protected void realCompute() {
1173                  FibAction g = new FibAction(9);
1174                  assertSame(g, g.fork());
1175                  FibAction f = new FibAction(8);
# Line 1159 | Line 1188 | public class RecursiveActionTest extends
1188       */
1189      public void testPollTaskAsync() {
1190          RecursiveAction a = new CheckedRecursiveAction() {
1191 <            public void realCompute() {
1191 >            protected void realCompute() {
1192                  FibAction g = new FibAction(9);
1193                  assertSame(g, g.fork());
1194                  FibAction f = new FibAction(8);
# Line 1172 | Line 1201 | public class RecursiveActionTest extends
1201          testInvokeOnPool(asyncSingletonPool(), a);
1202      }
1203  
1204 +    /** Demo from RecursiveAction javadoc */
1205 +    static class SortTask extends RecursiveAction {
1206 +        final long[] array; final int lo, hi;
1207 +        SortTask(long[] array, int lo, int hi) {
1208 +            this.array = array; this.lo = lo; this.hi = hi;
1209 +        }
1210 +        SortTask(long[] array) { this(array, 0, array.length); }
1211 +        protected void compute() {
1212 +            if (hi - lo < THRESHOLD)
1213 +                sortSequentially(lo, hi);
1214 +            else {
1215 +                int mid = (lo + hi) >>> 1;
1216 +                invokeAll(new SortTask(array, lo, mid),
1217 +                          new SortTask(array, mid, hi));
1218 +                merge(lo, mid, hi);
1219 +            }
1220 +        }
1221 +        // implementation details follow:
1222 +        static final int THRESHOLD = 100;
1223 +        void sortSequentially(int lo, int hi) {
1224 +            Arrays.sort(array, lo, hi);
1225 +        }
1226 +        void merge(int lo, int mid, int hi) {
1227 +            long[] buf = Arrays.copyOfRange(array, lo, mid);
1228 +            for (int i = 0, j = lo, k = mid; i < buf.length; j++)
1229 +                array[j] = (k == hi || buf[i] < array[k]) ?
1230 +                    buf[i++] : array[k++];
1231 +        }
1232 +    }
1233 +
1234 +    /**
1235 +     * SortTask demo works as advertised
1236 +     */
1237 +    public void testSortTaskDemo() {
1238 +        ThreadLocalRandom rnd = ThreadLocalRandom.current();
1239 +        long[] array = new long[1007];
1240 +        for (int i = 0; i < array.length; i++)
1241 +            array[i] = rnd.nextLong();
1242 +        long[] arrayClone = array.clone();
1243 +        testInvokeOnPool(mainPool(), new SortTask(array));
1244 +        Arrays.sort(arrayClone);
1245 +        assertTrue(Arrays.equals(array, arrayClone));
1246 +    }
1247   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines