use of org.apache.geode.pdx.internal.PeerTypeRegistration in project geode by apache.
the class PdxQueryDUnitTest method testLocalMapInPeerTypePdxRegistry.
/**
* In PeerTypeRegistration when a PdxType is updated, a local map of class => PdxTypes is
* populated. This map is used to search a field for a class in different versions (PdxTypes) This
* test verifies that the map is being updated by the cacheListener
*
* @throws CacheException
*/
@Test
public void testLocalMapInPeerTypePdxRegistry() throws CacheException {
final Host host = Host.getHost(0);
final VM vm0 = host.getVM(0);
final VM vm1 = host.getVM(1);
final VM vm2 = host.getVM(2);
final VM vm3 = host.getVM(3);
final int numberOfEntries = 10;
final String name = "/" + regionName;
final String[] qs = { "select * from " + name + " where pdxStatus = 'active'", "select pdxStatus from " + name + " where id > 4" };
// Start server1
final int port1 = (Integer) vm0.invoke(new SerializableCallable("Create Server1") {
@Override
public Object call() throws Exception {
Region r1 = getCache().createRegionFactory(RegionShortcut.REPLICATE).create(regionName);
CacheServer server = getCache().addCacheServer();
int port = AvailablePortHelper.getRandomAvailablePortForDUnitSite();
server.setPort(port);
server.start();
return port;
}
});
// Start server2
final int port2 = (Integer) vm1.invoke(new SerializableCallable("Create Server2") {
@Override
public Object call() throws Exception {
Region r1 = getCache().createRegionFactory(RegionShortcut.REPLICATE).create(regionName);
CacheServer server = getCache().addCacheServer();
int port = AvailablePortHelper.getRandomAvailablePortForDUnitSite();
server.setPort(port);
server.start();
return port;
}
});
// client1 loads version 1 objects on server1
vm2.invoke(new SerializableCallable("Create client") {
@Override
public Object call() throws Exception {
ClientCacheFactory cf = new ClientCacheFactory();
cf.addPoolServer(NetworkUtils.getServerHostName(vm0.getHost()), port1);
ClientCache cache = getClientCache(cf);
Region region = cache.createClientRegionFactory(ClientRegionShortcut.PROXY).create(regionName);
// Load version 1 objects
for (int i = 0; i < numberOfEntries; i++) {
PdxInstanceFactory pdxInstanceFactory = PdxInstanceFactoryImpl.newCreator("PdxVersionedNewPortfolio", false);
pdxInstanceFactory.writeInt("id", i);
pdxInstanceFactory.writeString("pdxStatus", (i % 2 == 0 ? "active" : "inactive"));
PdxInstance pdxInstance = pdxInstanceFactory.create();
region.put("key-" + i, pdxInstance);
}
return null;
}
});
// client 2 loads version 2 objects on server2
vm3.invoke(new SerializableCallable("Create client") {
@Override
public Object call() throws Exception {
ClientCacheFactory cf = new ClientCacheFactory();
cf.addPoolServer(NetworkUtils.getServerHostName(vm1.getHost()), port2);
ClientCache cache = getClientCache(cf);
Region region = cache.createClientRegionFactory(ClientRegionShortcut.PROXY).create(regionName);
// Load version 2 objects
for (int i = numberOfEntries; i < numberOfEntries * 2; i++) {
PdxInstanceFactory pdxInstanceFactory = PdxInstanceFactoryImpl.newCreator("PdxVersionedNewPortfolio", false);
pdxInstanceFactory.writeInt("id", i);
pdxInstanceFactory.writeString("status", (i % 2 == 0 ? "active" : "inactive"));
PdxInstance pdxInstance = pdxInstanceFactory.create();
region.put("key-" + i, pdxInstance);
}
return null;
}
});
// on server 1 verify local map in PeerTypeRegistration has fields
vm0.invoke(new SerializableCallable("Create client") {
@Override
public Object call() throws Exception {
TypeRegistration registration = GemFireCacheImpl.getForPdx("PDX registry is unavailable because the Cache has been closed.").getPdxRegistry().getTypeRegistration();
Assert.assertTrue(registration instanceof PeerTypeRegistration);
Map<String, Set<PdxType>> m = ((PeerTypeRegistration) registration).getClassToType();
assertEquals(1, m.size());
assertEquals("PdxVersionedNewPortfolio", m.keySet().iterator().next());
assertEquals(2, m.values().iterator().next().size());
for (PdxType p : m.values().iterator().next()) {
assertEquals("PdxVersionedNewPortfolio", p.getClassName());
}
return null;
}
});
// on server 2 verify local map in PeerTypeRegistration has fields
vm1.invoke(new SerializableCallable("Create client") {
@Override
public Object call() throws Exception {
TypeRegistration registration = GemFireCacheImpl.getForPdx("PDX registry is unavailable because the Cache has been closed.").getPdxRegistry().getTypeRegistration();
Assert.assertTrue(registration instanceof PeerTypeRegistration);
Map<String, Set<PdxType>> m = ((PeerTypeRegistration) registration).getClassToType();
assertEquals(1, m.size());
assertEquals("PdxVersionedNewPortfolio", m.keySet().iterator().next());
assertEquals(2, m.values().iterator().next().size());
for (PdxType p : m.values().iterator().next()) {
assertEquals("PdxVersionedNewPortfolio", p.getClassName());
}
return null;
}
});
Invoke.invokeInEveryVM(DistributedTestCase.class, "disconnectFromDS");
}
Aggregations