package crmdna.common; import com.google.appengine.tools.development.testing.LocalDatastoreServiceTestConfig; import com.google.appengine.tools.development.testing.LocalServiceTestHelper; import com.googlecode.objectify.ObjectifyFilter; import crmdna.client.Client; import crmdna.common.api.APIException; import crmdna.common.api.APIResponse.Status; import crmdna.user.User.ResourceType; import org.junit.After; import org.junit.Before; import org.junit.Test; import static crmdna.common.TestUtil.ensureAPIException; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; public class MemcacheLockTest { private final LocalServiceTestHelper datastoreHelper = new LocalServiceTestHelper( new LocalDatastoreServiceTestConfig().setApplyAllHighRepJobPolicy()); private String client1 = "client1"; private String client2 = "client2"; private String invalidClient = "invalidClient"; // local implementation / test harness implementation becomes HRD // only if setApplyAllHighRepJobPolicy is set. If the implementation is not HRD then // cross group transactions would fail (as master slave does not support it) @Before public void setUp() { datastoreHelper.setUp(); ObjectifyFilter.complete(); Client.create(client1); Client.create(client2); } @After public void tearDown() { ObjectifyFilter.complete(); datastoreHelper.tearDown(); } @SuppressWarnings("resource") @Test public void test() throws Exception { try (MemcacheLock lock = new MemcacheLock(client1, ResourceType.MEMBER, "sathya.t@ishafoundation.org")) { // cannot acquire the same lock again ensureAPIException(Status.ERROR_RESOURCE_ALREADY_EXISTS, new ICode() { @Override public void run() { new MemcacheLock(client1, ResourceType.MEMBER, "sathya.t@ishafoundation.org"); } }); // just try one more time // cannot acquire the same lock again ensureAPIException(Status.ERROR_RESOURCE_ALREADY_EXISTS, new ICode() { @Override public void run() { new MemcacheLock(client1, ResourceType.MEMBER, "sathya.t@ishafoundation.org"); } }); // can acquire lock for same resource for a different client try (MemcacheLock lock2 = new MemcacheLock(client2, ResourceType.MEMBER, "sathya.t@ishafoundation.org")) { } // can acquire lock for different resource try (MemcacheLock lock2 = new MemcacheLock(client1, ResourceType.MEMBER, "sathya.isha@gmail.com")) { } } // can acquire lock again try (MemcacheLock lock = new MemcacheLock(client1, ResourceType.MEMBER, "sathya.t@ishafoundation.org")) { } // can acquire repeated locks when uniqueKey is null try (MemcacheLock lock = new MemcacheLock(client1, ResourceType.MEMBER, null)) { try (MemcacheLock lock2 = new MemcacheLock(client1, ResourceType.MEMBER, null)) { try (MemcacheLock lock3 = new MemcacheLock(client1, ResourceType.MEMBER, null)) { } } new MemcacheLock(client1, ResourceType.MEMBER, null); new MemcacheLock(client1, ResourceType.MEMBER, null); new MemcacheLock(client1, ResourceType.MEMBER, null); } // client should be valid try (MemcacheLock lock4 = new MemcacheLock(invalidClient, ResourceType.MEMBER, null)) { assertTrue(false); } catch (APIException e) { assertEquals(Status.ERROR_RESOURCE_NOT_FOUND, e.statusCode); } } }