samples/reentrant/test/org/apidesign/reentrant/CriticalSectionBase.java
author Jaroslav Tulach <jtulach@netbeans.org>
Sat, 14 Jun 2008 09:54:36 +0200
changeset 111 3905a2e66b9b
child 112 64308321f7bd
permissions -rw-r--r--
Sample code with various attempts to fight with reentrant code
     1 package org.apidesign.reentrant;
     2 
     3 import java.util.ArrayList;
     4 import java.util.Iterator;
     5 import java.util.List;
     6 import org.junit.Test;
     7 import static org.junit.Assert.*;
     8 
     9 public abstract class CriticalSectionBase {
    10     protected abstract CriticalSection<Integer> create();
    11 
    12     @Test
    13     public void testCriticalSectionWith15() {
    14         final CriticalSection<Integer> cs = create();
    15         testFor15(cs);
    16     }
    17     
    18     final void testFor15(CriticalSection<Integer> cs) {
    19         cs.assignPilot(15);
    20 
    21         List<Integer> ints = new ArrayList<Integer>();
    22         ints.add(8);
    23         ints.add(11);
    24         ints.add(10);
    25         ints.add(5);
    26         ints.add(12);
    27         ints.add(18);
    28         ints.add(13);
    29         ints.add(7);
    30 
    31         int cnt = cs.sumBigger(ints);
    32 
    33         assertEquals("18 is bigger than 15", 1, cnt);
    34         
    35     }
    36     
    37     @Test 
    38     public void teaseCriticalSectionWithReentrantCalls() {
    39         final CriticalSection<Integer> cs = create();
    40         
    41         cs.assignPilot(10);
    42         
    43         class ChangePilotTo15 implements Runnable {
    44             public void run() {
    45                 testFor15(cs);
    46             }
    47         }
    48         
    49         List<Integer> ints = new MyCollection(new ChangePilotTo15(), 3);
    50         ints.add(8);
    51         ints.add(11);
    52         ints.add(10);
    53         ints.add(5);
    54         ints.add(12);
    55         ints.add(18);
    56         ints.add(13);
    57         ints.add(7);
    58         
    59         int cnt = cs.sumBigger(ints);
    60         
    61         assertEquals("11, 12, 18, 13 are bigger than 10", 4, cnt);
    62         
    63         assertEquals("Global count is sum of ints(e.g. 4) plus result of testFor15(e.g. 1)", 5, cs.getCount());
    64     }
    65 
    66     class MyCollection extends ArrayList<Integer> {
    67         private final Runnable callback;
    68         private final int callbackBeforeIndex;
    69 
    70         public MyCollection(Runnable callback, int callbackAtIndex) {
    71             this.callback = callback;
    72             this.callbackBeforeIndex = callbackAtIndex;
    73         }
    74 
    75         @Override
    76         public Iterator<Integer> iterator() {
    77             final Iterator<Integer> delegate = super.iterator();
    78             class It implements Iterator<Integer> {
    79                 private int index;
    80                 
    81                 public boolean hasNext() {
    82                     return delegate.hasNext();
    83                 }
    84 
    85                 public Integer next() {
    86                     if (index++ == callbackBeforeIndex) {
    87                         callback.run();
    88                     }
    89                     
    90                     return delegate.next();
    91                 }
    92 
    93                 public void remove() {
    94                     delegate.remove();
    95                 }
    96             } // end of It
    97             
    98             return new It();
    99         }
   100     }
   101 }