1 4 package com.tctest; 5 6 import EDU.oswego.cs.dl.util.concurrent.CyclicBarrier; 7 8 import com.tc.object.bytecode.ManagerUtil; 9 import com.tc.object.config.ConfigVisitor; 10 import com.tc.object.config.DSOClientConfigHelper; 11 import com.tc.object.config.spec.CyclicBarrierSpec; 12 import com.tc.object.lockmanager.api.LockLevel; 13 import com.tc.simulator.app.ApplicationConfig; 14 import com.tc.simulator.listener.ListenerProvider; 15 import com.tc.util.Assert; 16 import com.tctest.runner.AbstractTransparentApp; 17 18 import java.sql.Timestamp ; 19 import java.util.ArrayList ; 20 import java.util.Arrays ; 21 import java.util.Date ; 22 import java.util.HashMap ; 23 import java.util.HashSet ; 24 import java.util.Iterator ; 25 import java.util.List ; 26 import java.util.Map ; 27 import java.util.Set ; 28 import java.util.Map.Entry; 29 30 public class CloneTestApp extends AbstractTransparentApp { 31 32 public static final int NODE_COUNT = 2; 33 34 private MyStuff root; 35 private CyclicBarrier barrier = new CyclicBarrier(NODE_COUNT); 36 private int nodeCount[] = new int[1]; 37 38 public CloneTestApp(String appId, ApplicationConfig cfg, ListenerProvider listenerProvider) { 39 super(appId, cfg, listenerProvider); 40 } 41 42 public void run() { 43 int myId = 0; 44 synchronized (nodeCount) { 45 myId = nodeCount[0]++; 46 } 47 48 MyStuff copy = null; 49 if (myId == 0) { 50 MyStuff s = new MyStuff(null); 51 s.map = new HashMap (); 52 s.map.put(s, s); 53 s.one = 2; 54 s.list = new ArrayList (); 55 s.list.add(s.map); 56 s.set = new HashSet (); 57 s.set.add(s.list); 58 s.date = new Date (); 59 s.myStuffArray = new MyStuff[10]; 60 s.shortArray = new short[200]; 61 s.myStuffArray[3] = s; 62 s.myStuffArray[9] = new MyStuff(null); 63 s.shortArray[5] = 4; 64 65 root = new MyStuff(s); 66 67 synchronized (root) { 68 s.obj1 = root; 69 root.one = 1; 70 root.date = s.date; 71 } 72 73 test1(); 74 } 75 System.out.println("NODE:" + myId + " is about to enter"); 76 barrier(); 77 78 if (myId == 0) { 79 ManagerUtil.optimisticBegin(); 80 synchronized (root) { 81 copy = (MyStuff) ManagerUtil.deepCopy(root); 82 } 83 } 84 barrier(); 85 if (myId == 0) { 86 copy.obj1.one = 250; 87 copy.obj1.map.put("steve", "steve"); 88 copy.obj1.map.put("doh", copy); 89 copy.obj1.myStuffArray[7] = new MyStuff(null); 90 copy.obj1.myStuffArray[7].one = 7; 91 copy.obj1.myStuffArray[3] = copy; 92 93 short[] tmpShortArray = new short[20]; 95 Arrays.fill(tmpShortArray, (short) 99); 96 copy.shortArray = new short[20]; 97 System.arraycopy(tmpShortArray, 0, copy.shortArray, 0, 20); 98 copy.shortArray[1] = 5; 99 copy.shortArray[2] = 6; 100 101 MyStuff[] tmpMyStuffArray = new MyStuff[3]; 103 for (int i = 0; i < tmpMyStuffArray.length; i++) { 104 tmpMyStuffArray[i] = new MyStuff(null); 105 tmpMyStuffArray[i].one = 100 + i; 106 } 107 copy.myStuffArray = new MyStuff[10]; 108 System.arraycopy(tmpMyStuffArray, 0, copy.myStuffArray, 4, 3); 109 copy.myStuffArray[5] = new MyStuff(null); 110 copy.myStuffArray[5].one = 5; 111 copy.myStuffArray[6] = new MyStuff(null); 112 copy.myStuffArray[6].one = 6; 113 } 114 barrier(); 115 if (myId == 1) { 116 synchronized (root) { 117 root.obj1.one = 150; } 119 } 120 barrier(); 121 if (myId == 0) { 122 ManagerUtil.beginLock("test", LockLevel.WRITE); 123 ManagerUtil.optimisticCommit(); 124 ManagerUtil.commitLock("test"); 125 } 126 barrier(); 127 System.out.println("NODE:" + myId + " is about to exit"); 128 synchronized (root) { 129 System.out.println("NODE:" + myId + " Value:" + root.obj1.one); 130 Assert.eval(root.obj1.one == 250); 131 Assert.eval(root.obj1.myStuffArray[7] != null); 132 Assert.eval(root.obj1.myStuffArray[7].one == 7); 133 Assert.eval(root.obj1.map.get("steve").equals("steve")); 134 Assert.eval(root.obj1.map.get("doh") == root); 135 136 Assert.eval(root.shortArray[0] == 99); 138 Assert.eval(root.shortArray[1] == 5); 139 Assert.eval(root.shortArray[2] == 6); 140 Assert.eval(root.shortArray[3] == 99); 141 Assert.eval(root.shortArray[4] == 99); 142 143 Assert.eval(root.myStuffArray[4] != null); 145 Assert.eval(root.myStuffArray[4].one == 100); 146 Assert.eval(root.myStuffArray[5] != null); 147 Assert.eval(root.myStuffArray[5].one == 5); 148 Assert.eval(root.myStuffArray[6] != null); 149 Assert.eval(root.myStuffArray[6].one == 6); 150 } 151 } 152 153 private void test1() { 154 ManagerUtil.optimisticBegin(); 155 156 MyStuff copy = (MyStuff) ManagerUtil.deepCopy(root); 157 Assert.eval(copy != root); 158 Assert.eval(copy.obj1 != root.obj1); 159 160 System.out.println("Root:" + root); 161 System.out.println("Root obj:" + root.obj1 + " one:" + root.one); 162 System.out.println("sub Root obj:" + root.obj1.obj1 + " one:" + root.obj1.one); 163 164 System.out.println("Copy:" + copy); 165 System.out.println("Copy obj:" + copy.obj1 + " one:" + copy.one); 166 System.out.println("sub Copy obj:" + copy.obj1.obj1 + " one:" + copy.obj1.one); 167 168 Assert.eval(copy == copy.obj1.obj1); 169 Assert.eval(copy.inner != root.inner); 170 Assert.eval(copy.inner != null); 171 Assert.eval(copy.one == 1); 172 Assert.eval(copy.obj1.one == 2); 173 Assert.eval(copy.obj1.map != root.obj1.map); 174 Assert.eval(copy.obj1.myStuffArray[3] == copy.obj1); 175 Assert.eval(copy.obj1.myStuffArray[4] == null); 176 Assert.eval(copy.obj1.myStuffArray[2] == null); 177 Assert.eval(copy.obj1.myStuffArray != root.obj1.myStuffArray); 178 179 Assert.eval(copy.obj1.shortArray[4] != 4); 180 Assert.eval(copy.obj1.shortArray[5] == 4); 181 Assert.eval(copy.obj1.shortArray[6] != 4); 182 Assert.eval(copy.obj1.shortArray != root.obj1.shortArray); 183 184 int size = 0; 185 for (Iterator i = copy.obj1.map.entrySet().iterator(); i.hasNext();) { 186 size++; 187 Entry e = (Entry) i.next(); 188 Assert.eval(e.getValue() == copy.obj1); 189 Assert.eval(e.getKey() == copy.obj1); 190 191 Assert.eval(e.getValue() != root.obj1.map); 192 Assert.eval(e.getKey() != root.obj1); 193 } 194 195 Assert.eval(size == 1); 196 197 Assert.eval(copy.obj1.list != root.obj1.list); 198 Assert.eval(copy.obj1.set != root.obj1.set); 199 Assert.eval(copy.obj1.set.size() == root.obj1.set.size()); 200 Assert.eval(copy.obj1.set.iterator().next() == copy.obj1.list); 201 202 Assert.eval(copy.obj1.list.size() == root.obj1.list.size()); 203 Assert.eval(copy.obj1.list.iterator().next() == copy.obj1.map); 204 Assert.eval((copy.obj1.date != root.obj1.date)); 205 Assert.eval((copy.obj1.date.equals(root.obj1.date))); 206 Assert.eval(copy.obj1.date == copy.date); 207 208 Date d = new Date (); 210 copy.obj1.map.put("date", d); 211 copy.obj1.map.put(copy, d); 212 copy.date = d; 213 copy.one = 500; 214 215 Assert.eval(root.date != d); 216 Assert.eval(!root.obj1.map.containsKey("date")); 217 Assert.eval(root.one != 500); 218 219 ManagerUtil.beginLock("test", LockLevel.WRITE); 220 ManagerUtil.optimisticCommit(); 221 ManagerUtil.commitLock("test"); 222 223 Assert.eval(root.date == d); 224 Assert.eval(root.one == 500); 225 Assert.eval(root.obj1.map.get("date") == d); 226 } 227 228 private void barrier() { 229 try { 230 barrier.barrier(); 231 } catch (InterruptedException ie) { 232 throw new AssertionError (); 233 } 234 } 235 236 public static void visitL1DSOConfig(ConfigVisitor visitor, DSOClientConfigHelper config) { 237 String testClass = CloneTestApp.class.getName(); 238 239 config.getOrCreateSpec(testClass) .addRoot("barrier", "barrier") .addRoot("root", "root") .addRoot("nodeCount", "nodeCount"); 243 244 config.getOrCreateSpec(MyStuff.class.getName()); 245 config.getOrCreateSpec(MyStuff.MyInner.class.getName()); 246 247 config.addWriteAutolock("* " + testClass + "*.*(..)"); 248 new CyclicBarrierSpec().visit(visitor, config); 249 250 } 251 252 private static class MyStuff { 253 public MyStuff obj1; 254 public long one = 1; 255 public Map map; 256 public List list; 257 public Set set; 258 public Date date; 259 public Timestamp timestamp; 260 public MyStuff[] myStuffArray; 261 public short[] shortArray; 262 public MyInner inner = new MyInner(); 263 264 public MyStuff(MyStuff stuff) { 265 this.obj1 = stuff; 266 } 267 268 private class MyInner { 269 public int two; 270 } 271 } 272 } 273
| Popular Tags
|