1 5 package com.tctest; 6 7 import com.tc.object.config.ConfigVisitor; 8 import com.tc.object.config.DSOClientConfigHelper; 9 import com.tc.object.config.TransparencyClassSpec; 10 import com.tc.simulator.app.ApplicationConfig; 11 import com.tc.simulator.listener.ListenerProvider; 12 import com.tc.util.Assert; 13 import com.tctest.runner.AbstractErrorCatchingTransparentApp; 14 15 import java.util.EnumMap ; 16 import java.util.LinkedList ; 17 import java.util.concurrent.BrokenBarrierException ; 18 import java.util.concurrent.CyclicBarrier ; 19 20 public final class EnumMapTestApp extends AbstractErrorCatchingTransparentApp { 21 22 enum Fruit { 23 APPLE("Apple"), ORANGE("Orange"), BANANA("Banana"), PEAR("Pear"); 24 25 private final String name; 26 27 Fruit(final String name) { 28 this.name = name; 29 } 30 31 public String getName() { 32 return name; 33 } 34 35 } 36 37 private static final LinkedList <String > AVAILABLE_FRUIT = new LinkedList <String >(); 38 39 private static void createAvailableFruit() { 40 synchronized (AVAILABLE_FRUIT) { 41 if (AVAILABLE_FRUIT.isEmpty()) { 42 for (Fruit fruit : Fruit.values()) { 43 AVAILABLE_FRUIT.add(fruit.getName()); 44 } 45 } 46 } 47 } 48 49 static { 50 createAvailableFruit(); 51 } 52 53 private final EnumMap <Fruit, String > clusteredFruitBasket; 54 private final CyclicBarrier barrier; 55 56 public static void visitL1DSOConfig(final ConfigVisitor visitor, final DSOClientConfigHelper config) { 57 final String testClass = EnumMapTestApp.class.getName(); 58 config.addIncludePattern(testClass + "$*"); 59 config.addWriteAutolock("* " + testClass + "*.*(..)"); 60 61 final TransparencyClassSpec spec = config.getOrCreateSpec(testClass); 62 spec.addRoot("AVAILABLE_FRUIT", "AVAILABLE_FRUIT"); 63 spec.addRoot("clusteredFruitBasket", "clusteredFruitBasket"); 64 spec.addRoot("barrier", "barrier"); 65 } 66 67 public EnumMapTestApp(final String appId, final ApplicationConfig cfg, final ListenerProvider listenerProvider) { 68 super(appId, cfg, listenerProvider); 69 clusteredFruitBasket = new EnumMap <Fruit, String >(Fruit.class); 70 barrier = new CyclicBarrier (getParticipantCount()); 71 } 72 73 protected void runTest() throws Throwable { 74 barrier.await(); 75 addFruitToBasket(getNextPieceOfFruit()); 76 waitForBasketToFill(); 77 verifyBasketOperations(); 78 } 79 80 private Fruit getNextPieceOfFruit() { 81 final Fruit fruitToAddToBasket; 82 synchronized (AVAILABLE_FRUIT) { 83 final String fruitName = AVAILABLE_FRUIT.remove(); 84 Fruit foundFruit = null; 85 for (Fruit f : Fruit.values()) { 86 if (f.getName().equals(fruitName)) { 87 foundFruit = f; 88 break; 89 } 90 } 91 Assert.assertNotNull(foundFruit); 92 fruitToAddToBasket = foundFruit; 93 } 94 return fruitToAddToBasket; 95 } 96 97 private void addFruitToBasket(final Fruit fruit) { 98 synchronized (clusteredFruitBasket) { 99 clusteredFruitBasket.put(fruit, fruit.getName()); 100 } 101 } 102 103 private void waitForBasketToFill() throws InterruptedException , BrokenBarrierException { 104 barrier.await(); 105 } 106 107 private void verifyBasketOperations() { 108 synchronized (clusteredFruitBasket) { 109 Assert.assertEquals(Fruit.values().length, clusteredFruitBasket.size()); 110 final EnumMap <Fruit, String > equivalentBasket = new EnumMap <Fruit, String >(Fruit.class); 111 for (Fruit fruit : Fruit.values()) { 112 Assert.assertEquals(fruit.getName(), clusteredFruitBasket.remove(fruit)); 114 Assert.assertFalse(clusteredFruitBasket.containsKey(fruit)); 115 Assert.assertFalse(clusteredFruitBasket.keySet().contains(fruit)); 116 Assert.assertFalse(clusteredFruitBasket.containsValue(fruit.getName())); 117 Assert.assertFalse(clusteredFruitBasket.values().contains(fruit.getName())); 118 clusteredFruitBasket.put(fruit, fruit.getName()); 119 120 Assert.assertTrue(clusteredFruitBasket.containsKey(fruit)); 122 Assert.assertTrue(clusteredFruitBasket.keySet().contains(fruit)); 123 Assert.assertTrue(clusteredFruitBasket.containsValue(fruit.getName())); 124 Assert.assertTrue(clusteredFruitBasket.values().contains(fruit.getName())); 125 Assert.assertEquals(fruit.getName(), clusteredFruitBasket.get(fruit)); 126 127 equivalentBasket.put(fruit, fruit.getName()); 129 } 130 Assert.assertTrue(clusteredFruitBasket.equals(equivalentBasket)); 131 clusteredFruitBasket.clear(); 132 Assert.assertTrue(clusteredFruitBasket.isEmpty()); 133 clusteredFruitBasket.putAll(equivalentBasket); 134 Assert.assertTrue(clusteredFruitBasket.equals(equivalentBasket)); 135 } 136 } 137 138 } 139 | Popular Tags |