Read lock promotion
[music.git] / src / test / java / org / onap / music / unittests / TstRestMusicLockAPI.java
index ec7659a..e9321d2 100644 (file)
@@ -115,7 +115,7 @@ public class TstRestMusicLockAPI {
         System.out.println("Testing create lockref");
         createAndInsertIntoTable();
         Response response = lock.createLockReference(lockName, "1", "1", authorization,
-                "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", null, appName);
+                "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", null, null, appName);
         Map<String, Object> respMap = (Map<String, Object>) response.getEntity();
         System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
 
@@ -129,7 +129,7 @@ public class TstRestMusicLockAPI {
         System.out.println("Testing create bad lockref");
         createAndInsertIntoTable();
         Response response = lock.createLockReference("badlock", "1", "1", authorization,
-                "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", null, appName);
+                "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", null, null, appName);
         Map<String, Object> respMap = (Map<String, Object>) response.getEntity();
         System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
 
@@ -142,7 +142,7 @@ public class TstRestMusicLockAPI {
         createAndInsertIntoTable();
         JsonLock jsonLock = createJsonLock(LockType.READ);
         Response response = lock.createLockReference(lockName, "1", "1", authorization,
-                "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", jsonLock, appName);
+                "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", jsonLock, null, appName);
         Map<String, Object> respMap = (Map<String, Object>) response.getEntity();
         System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
 
@@ -157,7 +157,7 @@ public class TstRestMusicLockAPI {
         createAndInsertIntoTable();
         JsonLock jsonLock = createJsonLock(LockType.WRITE);
         Response response = lock.createLockReference(lockName, "1", "1", authorization,
-                "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", jsonLock, appName);
+                "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", jsonLock, null, appName);
         Map<String, Object> respMap = (Map<String, Object>) response.getEntity();
         System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
 
@@ -439,6 +439,178 @@ public class TstRestMusicLockAPI {
         assertEquals(400, response.getStatus());
     }
 
+    @SuppressWarnings("unchecked")
+    @Test
+    public void test_deadlock() throws Exception {
+        System.out.println("Testing deadlock");
+        createAndInsertIntoTable();
+        insertAnotherIntoTable();
+
+        // Process 1 creates and acquires a lock on row 1
+        JsonLock jsonLock = createJsonLock(LockType.WRITE);
+        Response responseCreate1 = lock.createLockReference(lockName, "1", "1", authorization,
+                "abcde001-d857-4e90-b1e5-df98a3d40ce6", jsonLock, "process1", appName);
+        Map<String, Object> respMapCreate1 = (Map<String, Object>) responseCreate1.getEntity();
+        String lockRefCreate1 = ((Map<String, String>) respMapCreate1.get("lock")).get("lock");
+
+        Response responseAcquire1 =
+                lock.accquireLock(lockRefCreate1, "1", "1", authorization, "abc66001-d857-4e90-b1e5-df98a3d40ce6", appName);
+
+        // Process 2 creates and acquires a lock on row 2
+        Response responseCreate2 = lock.createLockReference(lockName + "2", "1", "1", authorization,
+                "abcde002-d857-4e90-b1e5-df98a3d40ce6", jsonLock, "process2", appName);
+        Map<String, Object> respMapCreate2 = (Map<String, Object>) responseCreate2.getEntity();
+        String lockRefCreate2 = ((Map<String, String>) respMapCreate2.get("lock")).get("lock");
+
+        Response responseAcquire2 =
+                lock.accquireLock(lockRefCreate2, "1", "1", authorization, "abc66002-d857-4e90-b1e5-df98a3d40ce6", appName);
+
+        // Process 2 creates a lock on row 1
+        Response responseCreate3 = lock.createLockReference(lockName, "1", "1", authorization,
+                "abcde003-d857-4e90-b1e5-df98a3d40ce6", jsonLock, "process2", appName);
+
+        // Process 1 creates a lock on row 2, causing deadlock
+        Response responseCreate4 = lock.createLockReference(lockName + "2", "1", "1", authorization,
+                "abcde004-d857-4e90-b1e5-df98a3d40ce6", jsonLock, "process1", appName);
+        Map<String, Object> respMapCreate4 = (Map<String, Object>) responseCreate4.getEntity();
+
+        System.out.println("Status: " + responseCreate4.getStatus() + ". Entity " + responseCreate4.getEntity());
+        assertEquals(400, responseCreate4.getStatus());
+        assertTrue(respMapCreate4.containsKey("error"));
+        assertTrue( ((String)respMapCreate4.get("error")).toLowerCase().indexOf("deadlock") > -1 );
+    }
+
+    
+    @SuppressWarnings("unchecked")
+    @Test
+    public void test_lockPromotion() throws Exception {
+        System.out.println("Testing lock promotion");
+        createAndInsertIntoTable();
+        insertAnotherIntoTable();
+
+        // creates a lock 1
+        JsonLock jsonLock = createJsonLock(LockType.READ);
+        Response responseCreate1 = lock.createLockReference(lockName, "1", "1", authorization,
+                "abcde001-d857-4e90-b1e5-df98a3d40ce6", jsonLock, "process1", appName);
+        Map<String, Object> respMapCreate1 = (Map<String, Object>) responseCreate1.getEntity();
+        String lockRefCreate1 = ((Map<String, String>) respMapCreate1.get("lock")).get("lock");
+
+        Response respMapPromote = lock.promoteLock(lockRefCreate1, "1", "1", authorization);
+        System.out.println("Status: " + respMapPromote.getStatus() + ". Entity " + respMapPromote.getEntity());
+        
+        assertEquals(200, respMapPromote.getStatus());
+    }
+    
+    @SuppressWarnings("unchecked")
+    @Test
+    public void test_lockPromotionReadWrite() throws Exception {
+        System.out.println("Testing lock promotion with read and writes");
+        createAndInsertIntoTable();
+        insertAnotherIntoTable();
+
+        // creates a lock 1
+        JsonLock jsonLockRead = createJsonLock(LockType.READ);
+        Response responseCreate1 = lock.createLockReference(lockName, "1", "1", authorization,
+                "abcde001-d857-4e90-b1e5-df98a3d40ce6", jsonLockRead, "process1", appName);
+        Map<String, Object> respMapCreate1 = (Map<String, Object>) responseCreate1.getEntity();
+        String lockRefCreate1 = ((Map<String, String>) respMapCreate1.get("lock")).get("lock");
+        
+        JsonLock jsonLockWrite = createJsonLock(LockType.WRITE);
+        Response responseCreate2 = lock.createLockReference(lockName, "1", "1", authorization,
+                "abcde001-d857-4e90-b1e5-df98a3d40ce6", jsonLockWrite, "process1", appName);
+        Map<String, Object> respMapCreate2 = (Map<String, Object>) responseCreate2.getEntity();
+        String lockRefCreate2 = ((Map<String, String>) respMapCreate2.get("lock")).get("lock");
+
+        Response respMapPromote = lock.promoteLock(lockRefCreate1, "1", "1", authorization);
+        System.out.println("Status: " + respMapPromote.getStatus() + ". Entity " + respMapPromote.getEntity());
+        
+        assertEquals(200, respMapPromote.getStatus());
+    }
+    
+    @SuppressWarnings("unchecked")
+    @Test
+    public void test_lockPromotionWriteRead() throws Exception {
+        System.out.println("Testing lock promotion with reads not at top of queue");
+        createAndInsertIntoTable();
+        insertAnotherIntoTable();
+
+        // creates a lock 1
+        JsonLock jsonLockWrite = createJsonLock(LockType.WRITE);
+        Response responseCreate2 = lock.createLockReference(lockName, "1", "1", authorization,
+                "abcde001-d857-4e90-b1e5-df98a3d40ce6", jsonLockWrite, "process1", appName);
+        Map<String, Object> respMapCreate2 = (Map<String, Object>) responseCreate2.getEntity();
+        String lockRefCreate2 = ((Map<String, String>) respMapCreate2.get("lock")).get("lock");
+        
+        // creates a lock 2
+        JsonLock jsonLockRead = createJsonLock(LockType.READ);
+        Response responseCreate1 = lock.createLockReference(lockName, "1", "1", authorization,
+                "abcde001-d857-4e90-b1e5-df98a3d40ce6", jsonLockRead, "process1", appName);
+        Map<String, Object> respMapCreate1 = (Map<String, Object>) responseCreate1.getEntity();
+        String lockRefCreate1 = ((Map<String, String>) respMapCreate1.get("lock")).get("lock");
+
+        Response respMapPromote = lock.promoteLock(lockRefCreate1, "1", "1", authorization);
+        System.out.println("Status: " + respMapPromote.getStatus() + ". Entity " + respMapPromote.getEntity());
+
+        assertEquals(200, respMapPromote.getStatus());
+    }
+    
+    @SuppressWarnings("unchecked")
+    @Test
+    public void test_lockPromotion2Reads() throws Exception {
+        System.out.println("Testing lock promotion w/ 2 ReadLocks");
+        createAndInsertIntoTable();
+        insertAnotherIntoTable();
+
+        // creates a lock 1
+        JsonLock jsonLockRead = createJsonLock(LockType.READ);
+        Response responseCreate1 = lock.createLockReference(lockName, "1", "1", authorization,
+                "abcde001-d857-4e90-b1e5-df98a3d40ce6", jsonLockRead, "process1", appName);
+        Map<String, Object> respMapCreate1 = (Map<String, Object>) responseCreate1.getEntity();
+        String lockRefCreate1 = ((Map<String, String>) respMapCreate1.get("lock")).get("lock");
+        
+        Response responseCreate2 = lock.createLockReference(lockName, "1", "1", authorization,
+                "abcde001-d857-4e90-b1e5-df98a3d40ce6", jsonLockRead, "process1", appName);
+        Map<String, Object> respMapCreate2 = (Map<String, Object>) responseCreate1.getEntity();
+        String lockRefCreate2 = ((Map<String, String>) respMapCreate1.get("lock")).get("lock");
+
+        Response respMapPromote = lock.promoteLock(lockRefCreate1, "1", "1", authorization);
+        System.out.println("Status: " + respMapPromote.getStatus() + ". Entity " + respMapPromote.getEntity());
+        
+        assertEquals(400, respMapPromote.getStatus());
+    }
+    
+    @SuppressWarnings("unchecked")
+    @Test
+    public void test_2lockPromotions() throws Exception {
+        System.out.println("Testing 2 lock promotions");
+        createAndInsertIntoTable();
+        insertAnotherIntoTable();
+
+        // creates a lock 1
+        JsonLock jsonLockRead = createJsonLock(LockType.READ);
+        Response responseCreate1 = lock.createLockReference(lockName, "1", "1", authorization,
+                "abcde001-d857-4e90-b1e5-df98a3d40ce6", jsonLockRead, "process1", appName);
+        Map<String, Object> respMapCreate1 = (Map<String, Object>) responseCreate1.getEntity();
+        String lockRefCreate1 = ((Map<String, String>) respMapCreate1.get("lock")).get("lock");
+        
+        Response responseCreate2 = lock.createLockReference(lockName, "1", "1", authorization,
+                "abcde001-d857-4e90-b1e5-df98a3d40ce6", jsonLockRead, "process1", appName);
+        Map<String, Object> respMapCreate2 = (Map<String, Object>) responseCreate2.getEntity();
+        String lockRefCreate2 = ((Map<String, String>) respMapCreate2.get("lock")).get("lock");
+
+        Response respMapPromote = lock.promoteLock(lockRefCreate1, "1", "1", authorization);
+        System.out.println("Status: " + respMapPromote.getStatus() + ". Entity " + respMapPromote.getEntity());
+        
+        assertEquals(400, respMapPromote.getStatus());
+        
+        Response respMap2Promote = lock.promoteLock(lockRefCreate2, "1", "1", authorization);
+        System.out.println("Status: " + respMap2Promote.getStatus() + ". Entity " + respMap2Promote.getEntity());
+        
+        assertEquals(400, respMapPromote.getStatus());
+    }
+    
+    
+
     // Ignoring since this is now a duplicate of delete lock ref.
     @Test
     @Ignore
@@ -463,7 +635,7 @@ public class TstRestMusicLockAPI {
     @SuppressWarnings("unchecked")
     private String createLockReference() throws Exception {
         Response response = lock.createLockReference(lockName, "1", "1", authorization,
-                "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", null, appName);
+                "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", null, null, appName);
         Map<String, Object> respMap = (Map<String, Object>) response.getEntity();
         return ((Map<String, String>) respMap.get("lock")).get("lock");
     }
@@ -478,7 +650,7 @@ public class TstRestMusicLockAPI {
     private String createLockReference(LockType lockType) throws Exception {
         JsonLock jsonLock = createJsonLock(lockType);
         Response response = lock.createLockReference(lockName, "1", "1", authorization,
-                "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", jsonLock, appName);
+                "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", jsonLock, null, appName);
         Map<String, Object> respMap = (Map<String, Object>) response.getEntity();
         return ((Map<String, String>) respMap.get("lock")).get("lock");
     }
@@ -569,6 +741,24 @@ public class TstRestMusicLockAPI {
                 authorization, jsonInsert, keyspaceName, tableName);
     }
 
+    private void insertAnotherIntoTable() throws Exception {
+        createTable();
+
+        JsonInsert jsonInsert = new JsonInsert();
+        Map<String, String> consistencyInfo = new HashMap<>();
+        Map<String, Object> values = new HashMap<>();
+        values.put("uuid", "cccccccc-d857-4e90-b1e5-df98a3d40cd6");
+        values.put("emp_name", "testname2");
+        values.put("emp_salary", 700);
+        consistencyInfo.put("type", "eventual");
+        jsonInsert.setConsistencyInfo(consistencyInfo);
+        jsonInsert.setKeyspaceName(keyspaceName);
+        jsonInsert.setTableName(tableName);
+        jsonInsert.setValues(values);
+        Response response = data.insertIntoTable("1", "1", "1", "abcdef00-d857-4e90-b1e5-df98a3d40ce6", appName,
+                authorization, jsonInsert, keyspaceName, tableName);
+    }
+
     private JsonLock createJsonLock(LockType lockType) {
         JsonLock jsonLock = new JsonLock();
         jsonLock.setLockType(lockType);