Clover coverage report -
Coverage timestamp: Thu Jul 5 2007 20:02:32 EDT
file stats: LOC: 201   Methods: 5
NCLOC: 130   Classes: 1
 
 Source file Conditionals Statements Methods TOTAL
BuddyReplicationFailoverTest.java 100% 100% 100% 100%
coverage
 1    /*
 2    * JBoss, Home of Professional Open Source
 3    *
 4    * Distributable under LGPL license.
 5    * See terms of license at gnu.org.
 6    */
 7    package org.jboss.cache.buddyreplication;
 8   
 9    import org.jboss.cache.CacheImpl;
 10    import org.jboss.cache.Fqn;
 11    import org.jboss.cache.misc.TestingUtil;
 12   
 13    /**
 14    * Tests behaviour when data owners fail - essentially this tests data gravitation
 15    *
 16    * @author <a href="mailto:manik@jboss.org">Manik Surtani (manik@jboss.org)</a>
 17    */
 18    public class BuddyReplicationFailoverTest extends BuddyReplicationTestsBase
 19    {
 20    protected boolean optimisticLocks = false;
 21    private String key = "key";
 22    private String value = "value";
 23   
 24  3 public void testDataGravitationKillOwner() throws Exception
 25    {
 26  3 testDataGravitation(true);
 27    }
 28   
 29  3 public void testDataGravitationDontKillOwner() throws Exception
 30    {
 31  3 testDataGravitation(false);
 32    }
 33   
 34  6 private void testDataGravitation(boolean killOwner) throws Exception
 35    {
 36  6 caches = createCaches(3, false, true, optimisticLocks);
 37   
 38  6 Fqn fqn = Fqn.fromString("/test");
 39  6 Fqn backupFqn = BuddyManager.getBackupFqn(caches[0].getLocalAddress(), fqn);
 40   
 41  6 dumpCacheContents(caches);
 42   
 43  6 caches[0].put(fqn, key, value);
 44   
 45  6 dumpCacheContents(caches);
 46   
 47  6 assertEquals("Value should exist", value, caches[0].get(fqn, key));
 48   
 49  6 dumpCacheContents(caches);
 50   
 51    // use exists instead of get() to prevent going up the interceptor stack
 52  6 assertTrue("Should be false", !caches[1].exists(fqn));
 53  6 assertTrue("Should be false", !caches[2].exists(fqn));
 54   
 55  6 assertFalse("Should be false", caches[0].exists(backupFqn));
 56  6 assertTrue("Value be true", caches[1].exists(backupFqn));
 57  6 assertFalse("Should be false", caches[2].exists(backupFqn));
 58   
 59  6 if (killOwner)
 60    {
 61  3 System.out.println("***** About to kill original data owner (" + caches[0].getLocalAddress() + "). *****");
 62    // make sure the JGroups channel shutdown is forced.
 63    // System.setProperty("org.jboss.cache.shutdown.force", "true");
 64  3 caches[0].stop();
 65  3 caches[0] = null;
 66    // wait up to 5 mins? :S
 67  3 TestingUtil.blockUntilViewsReceived(5 * 60 * 1000, false, caches[1], caches[2]);
 68   
 69    // TestingUtil.sleepThread(600000);
 70    // TestingUtil.sleepThread(1000);
 71    }
 72   
 73  6 System.out.println("***** Killed original data owner, about to call a get on a different cache instance. *****");
 74   
 75    // according to data gravitation, a call to *any* cache should retrieve the data, and move the data to the new cache.
 76  6 assertEquals("Value should have gravitated", value, caches[2].get(fqn, key));
 77   
 78  6 TestingUtil.sleepThread(500);
 79   
 80  6 dumpCacheContents(caches);
 81   
 82    // now lets test the eviction part of gravitation
 83  6 Fqn newBackupFqn = BuddyManager.getBackupFqn(caches[2].getLocalAddress(), fqn);
 84   
 85    // use exists instead of get() to prevent going up the interceptor stack
 86  3 if (!killOwner) assertTrue("Should be false", !caches[0].exists(fqn));
 87  6 assertTrue("Should be false", !caches[1].exists(fqn));
 88   
 89    // the old backup should no longer exist
 90  3 if (!killOwner) assertFalse("Should be null", caches[0].exists(backupFqn));
 91  6 assertFalse("Should be null", caches[1].exists(backupFqn));
 92  6 assertFalse("Should be null", caches[2].exists(backupFqn));
 93   
 94    // and the backup should now exist in caches[2]'s buddy which is caches[0]
 95  6 if (killOwner)
 96    {
 97  3 assertEquals("Value should exist", value, caches[1].get(newBackupFqn, key));
 98    }
 99    else
 100    {
 101  3 assertEquals("Value should exist", value, caches[0].get(newBackupFqn, key));
 102  3 assertFalse("Should be null", caches[1].exists(newBackupFqn));
 103    }
 104  6 assertFalse("Should be null", caches[2].exists(newBackupFqn));
 105    }
 106   
 107  3 public void testDataReplicationSuppression() throws Exception
 108    {
 109  3 caches = createCaches(3, false, false, optimisticLocks);
 110   
 111  3 Fqn fqn = Fqn.fromString("/test");
 112  3 Fqn backupFqn = BuddyManager.getBackupFqn(caches[0].getLocalAddress(), fqn);
 113  3 caches[0].put(fqn, key, value);
 114   
 115  3 dumpCacheContents(caches);
 116   
 117  3 assertEquals("value", caches[0].get(fqn, key));
 118  3 assertFalse(caches[0].exists(backupFqn));
 119  3 assertEquals("value", caches[1].get(backupFqn, key));
 120  3 assertFalse(caches[1].exists(fqn));
 121  3 assertFalse(caches[2].exists(fqn));
 122  3 assertFalse(caches[2].exists(backupFqn));
 123   
 124  3 assertNoLocks(caches);
 125   
 126  3 backupFqn = BuddyManager.getBackupFqn(caches[1].getLocalAddress(), fqn);
 127   
 128  3 System.out.println("*** Calling get() on cache[1] with force option");
 129   
 130  3 caches[1].getInvocationContext().getOptionOverrides().setForceDataGravitation(true);
 131  3 assertEquals("value", caches[1].get(fqn, key));
 132   
 133  3 dumpCacheContents(caches);
 134   
 135  3 assertFalse(caches[1].exists(backupFqn));
 136  3 assertEquals("value", caches[2].get(backupFqn, key));
 137  3 assertFalse(caches[2].exists(fqn));
 138  3 assertFalse(caches[0].exists(fqn));
 139  3 assertFalse(caches[0].exists(backupFqn));
 140    }
 141   
 142  3 public void testSubtreeRetrieval() throws Exception
 143    {
 144  3 caches = createCaches(3, false, true, optimisticLocks);
 145   
 146  3 Fqn fqn = Fqn.fromString("/test");
 147  3 Fqn fqn2 = Fqn.fromString("/test/subtree");
 148   
 149  3 Fqn backupFqn = Fqn.fromString("/" + BuddyManager.BUDDY_BACKUP_SUBTREE + "/" + BuddyManager.getGroupNameFromAddress(caches[0].getLocalAddress()) + "/test");
 150  3 Fqn backupFqn2 = Fqn.fromString("/" + BuddyManager.BUDDY_BACKUP_SUBTREE + "/" + BuddyManager.getGroupNameFromAddress(caches[0].getLocalAddress()) + "/test/subtree");
 151   
 152   
 153  3 caches[0].put(fqn, key, value);
 154  3 caches[0].put(fqn2, key, value);
 155   
 156    // test backup replication to buddy
 157  3 assertEquals(value, caches[0].get(fqn, key));
 158  3 assertEquals(value, caches[0].get(fqn2, key));
 159  3 assertEquals(value, caches[1].get(backupFqn, key));
 160  3 assertEquals(value, caches[1].get(backupFqn2, key));
 161   
 162  3 assertTrue(!caches[0].exists(backupFqn));
 163  3 assertTrue(!caches[0].exists(backupFqn2));
 164  3 assertTrue(!caches[1].exists(fqn));
 165  3 assertTrue(!caches[1].exists(fqn2));
 166  3 assertTrue(!caches[2].exists(fqn));
 167  3 assertTrue(!caches[2].exists(fqn2));
 168  3 assertTrue(!caches[2].exists(backupFqn));
 169  3 assertTrue(!caches[2].exists(backupFqn2));
 170   
 171  3 assertNoLocks(caches);
 172   
 173    // gravitate to 2:
 174  3 caches[2].get(fqn); // expect entire subtree to gravitate.
 175   
 176  3 Fqn newBackupFqn = Fqn.fromString("/" + BuddyManager.BUDDY_BACKUP_SUBTREE + "/" + BuddyManager.getGroupNameFromAddress(caches[2].getLocalAddress()) + "/test");
 177  3 Fqn newBackupFqn2 = Fqn.fromString("/" + BuddyManager.BUDDY_BACKUP_SUBTREE + "/" + BuddyManager.getGroupNameFromAddress(caches[2].getLocalAddress()) + "/test/subtree");
 178   
 179  3 assertEquals(value, caches[2].get(fqn, key));
 180  3 assertTrue(caches[2].exists(fqn2));
 181  3 assertEquals(value, caches[0].get(newBackupFqn, key));
 182  3 assertTrue(caches[0].exists(newBackupFqn2));
 183   
 184  3 assertTrue(!caches[2].exists(newBackupFqn));
 185  3 assertTrue(!caches[2].exists(newBackupFqn2));
 186  3 assertTrue(!caches[0].exists(fqn));
 187  3 assertTrue(!caches[0].exists(fqn2));
 188  3 assertTrue(!caches[1].exists(fqn));
 189  3 assertTrue(!caches[1].exists(fqn2));
 190  3 assertTrue(!caches[1].exists(newBackupFqn));
 191  3 assertTrue(!caches[1].exists(newBackupFqn2));
 192   
 193  3 for (CacheImpl cache : caches)
 194    {
 195  9 assertTrue(!cache.exists(backupFqn));
 196  9 assertTrue(!cache.exists(backupFqn2));
 197    }
 198   
 199  3 assertNoLocks(caches);
 200    }
 201    }