1 5 package com.tc.object; 6 7 import EDU.oswego.cs.dl.util.concurrent.CyclicBarrier; 8 9 import com.tc.exception.ImplementMe; 10 import com.tc.net.protocol.tcm.TestChannelIDProvider; 11 import com.tc.object.bytecode.MockClassProvider; 12 import com.tc.object.cache.EvictionPolicy; 13 import com.tc.object.cache.NullCache; 14 import com.tc.object.config.DSOClientConfigHelper; 15 import com.tc.object.dna.api.DNA; 16 import com.tc.object.dna.api.DNACursor; 17 import com.tc.object.dna.api.DNAException; 18 import com.tc.object.idprovider.api.ObjectIDProvider; 19 import com.tc.object.loaders.ClassProvider; 20 import com.tc.object.logging.NullRuntimeLogger; 21 import com.tc.object.logging.RuntimeLogger; 22 import com.tc.object.tx.MockTransactionManager; 23 import com.tc.util.concurrent.ThreadUtil; 24 25 import java.util.HashSet ; 26 27 public class ClientObjectManagerTest extends BaseDSOTestCase { 28 private ClientObjectManager mgr; 29 private TestRemoteObjectManager remoteObjectManager; 30 private DSOClientConfigHelper clientConfiguration; 31 private ObjectIDProvider idProvider; 32 private EvictionPolicy cache; 33 private RuntimeLogger runtimeLogger; 34 private ClassProvider classProvider; 35 private TCClassFactory classFactory; 36 private TestObjectFactory objectFactory; 37 private String rootName; 38 private Object object; 39 private ObjectID objectID; 40 private TCObject tcObject; 41 42 public void setUp() throws Exception { 43 remoteObjectManager = new TestRemoteObjectManager(); 44 classProvider = new MockClassProvider(); 45 clientConfiguration = configHelper(); 46 classFactory = new TestClassFactory(); 47 objectFactory = new TestObjectFactory(); 48 cache = new NullCache(); 49 runtimeLogger = new NullRuntimeLogger(); 50 51 rootName = "myRoot"; 52 object = new Object (); 53 objectID = new ObjectID(1); 54 tcObject = new MockTCObject(objectID, object); 55 objectFactory.peerObject = object; 56 objectFactory.tcObject = tcObject; 57 58 mgr = new ClientObjectManagerImpl(remoteObjectManager, clientConfiguration, idProvider, cache, runtimeLogger, 59 new TestChannelIDProvider(), classProvider, classFactory, objectFactory, 60 new PortabilityImpl(clientConfiguration), null); 61 mgr.setTransactionManager(new MockTransactionManager()); 62 } 63 64 67 public void testLookupOrCreateRootDoesntBlockReconnect() throws Exception { 68 TestDNA dna = newEmptyDNA(); 70 prepareObjectLookupResults(dna); 71 72 CyclicBarrier barrier = new CyclicBarrier(1); 74 LookupRootAgent lookup1 = new LookupRootAgent(barrier, mgr, rootName, object); 75 76 new Thread (lookup1).start(); 78 remoteObjectManager.retrieveRootIDCalls.take(); 80 assertNull(remoteObjectManager.retrieveRootIDCalls.poll(0)); 81 82 mgr.pause(); 84 mgr.starting(); 85 mgr.getAllObjectIDsAndClear(new HashSet ()); 86 } 87 88 91 public void testLookupOrCreateRootConcurrently() throws Exception { 92 93 TestDNA dna = newEmptyDNA(); 95 prepareObjectLookupResults(dna); 96 97 CyclicBarrier barrier = new CyclicBarrier(3); 99 LookupRootAgent lookup1 = new LookupRootAgent(barrier, mgr, rootName, object); 100 LookupRootAgent lookup2 = new LookupRootAgent(barrier, mgr, rootName, object); 101 102 new Thread (lookup1).start(); 104 remoteObjectManager.retrieveRootIDCalls.take(); 106 assertNull(remoteObjectManager.retrieveRootIDCalls.poll(0)); 107 108 new Thread (lookup2).start(); 110 ThreadUtil.reallySleep(5000); 111 assertNull(remoteObjectManager.retrieveRootIDCalls.poll(0)); 112 113 remoteObjectManager.retrieveRootIDResults.put(objectID); 115 116 barrier.barrier(); 118 119 assertTrue(lookup1.success() && lookup2.success()); 120 121 assertEquals(lookup1, lookup2); 123 124 assertNull(remoteObjectManager.retrieveRootIDCalls.poll(0)); 126 } 127 128 private TestDNA newEmptyDNA() { 129 TestDNA dna = new TestDNA(); 130 dna.type = Object .class; 131 dna.objectID = objectID; 132 dna.arraySize = 0; 133 return dna; 134 } 135 136 private void prepareObjectLookupResults(TestDNA dna) { 137 remoteObjectManager.retrieveResults.put(dna); 138 } 139 140 private static final class LookupRootAgent implements Runnable { 141 private final ClientObjectManager manager; 142 private final String rootName; 143 private final Object object; 144 public Object result; 145 public Throwable exception; 146 private final CyclicBarrier barrier; 147 148 private LookupRootAgent(CyclicBarrier barrier, ClientObjectManager manager, String rootName, Object object) { 149 this.barrier = barrier; 150 this.manager = manager; 151 this.rootName = rootName; 152 this.object = object; 153 } 154 155 public boolean success() { 156 return exception == null; 157 } 158 159 public void run() { 160 try { 161 result = manager.lookupOrCreateRoot(this.rootName, this.object); 162 } catch (Throwable t) { 163 t.printStackTrace(); 164 this.exception = t; 165 } finally { 166 try { 167 barrier.barrier(); 168 } catch (InterruptedException e) { 169 e.printStackTrace(); 170 } 171 } 172 } 173 174 public boolean equals(Object o) { 175 if (o instanceof LookupRootAgent) { 176 LookupRootAgent cmp = (LookupRootAgent) o; 177 if (result == null) return cmp.result == null; 178 return result.equals(cmp.result); 179 } else return false; 180 } 181 182 public int hashCode() { 183 throw new RuntimeException ("Don't ask me that."); 184 } 185 186 } 187 188 private static final class TestDNA implements DNA { 189 190 public Class type; 191 public ObjectID objectID; 192 public ObjectID parentObjectID = ObjectID.NULL_ID; 193 public int arraySize; 194 195 public long getVersion() { 196 throw new ImplementMe(); 197 } 198 199 public boolean hasLength() { 200 throw new ImplementMe(); 201 } 202 203 public int getArraySize() { 204 return this.arraySize; 205 } 206 207 public String getTypeName() { 208 return getClass().getName(); 209 } 210 211 public ObjectID getObjectID() throws DNAException { 212 return objectID; 213 } 214 215 public ObjectID getParentObjectID() throws DNAException { 216 return parentObjectID; 217 } 218 219 public DNACursor getCursor() { 220 throw new ImplementMe(); 221 } 222 223 public String getDefiningLoaderDescription() { 224 return ""; 225 } 226 227 public boolean isDelta() { 228 return false; 229 } 230 231 } 232 233 } 234 | Popular Tags |