// Copyright 2012 Citrix Systems, Inc. Licensed under the // Apache License, Version 2.0 (the "License"); you may not use this // file except in compliance with the License. Citrix Systems, Inc. // reserves all rights not expressly granted by the License. // You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // // Automatically generated by addcopyright.py at 04/03/2012 package com.cloud.async; import java.util.List; import org.apache.log4j.Logger; import junit.framework.Assert; import com.cloud.async.AsyncJobVO; import com.cloud.cluster.StackMaid; import com.cloud.cluster.CheckPointVO; import com.cloud.cluster.dao.StackMaidDao; import com.cloud.cluster.dao.StackMaidDaoImpl; import com.cloud.serializer.Param; import com.cloud.utils.ActionDelegate; import com.cloud.utils.Pair; import com.cloud.utils.db.Transaction; import com.cloud.utils.testcase.Log4jEnabledTestCase; public class TestAsync extends Log4jEnabledTestCase { private static final Logger s_logger = Logger.getLogger(TestAsync.class); /* public static class SampleAsyncResult { @Param(name="name", propName="name") private final String _name; @Param private final int count; public SampleAsyncResult(String name, int count) { _name = name; this.count = count; } public String getName() { return _name; } public int getCount() { return count; } } public void testDao() { AsyncJobDao dao = new AsyncJobDaoImpl(); AsyncJobVO job = new AsyncJobVO(1, 1, "TestCmd", null); job.setInstanceType("user_vm"); job.setInstanceId(1000L); char[] buf = new char[1024]; for(int i = 0; i < 1024; i++) buf[i] = 'a'; job.setResult(new String(buf)); dao.persist(job); AsyncJobVO jobVerify = dao.findById(job.getId()); Assert.assertTrue(jobVerify.getCmd().equals(job.getCmd())); Assert.assertTrue(jobVerify.getUserId() == 1); Assert.assertTrue(jobVerify.getAccountId() == 1); String result = jobVerify.getResult(); for(int i = 0; i < 1024; i++) Assert.assertTrue(result.charAt(i) == 'a'); jobVerify = dao.findInstancePendingAsyncJob("user_vm", 1000L); Assert.assertTrue(jobVerify != null); Assert.assertTrue(jobVerify.getCmd().equals(job.getCmd())); Assert.assertTrue(jobVerify.getUserId() == 1); Assert.assertTrue(jobVerify.getAccountId() == 1); } public void testSerialization() { List<Pair<String, Object>> l; int value = 1; l = SerializerHelper.toPairList(value, "result"); Assert.assertTrue(l.size() == 1); Assert.assertTrue(l.get(0).first().equals("result")); Assert.assertTrue(l.get(0).second().equals("1")); l.clear(); SampleAsyncResult result = new SampleAsyncResult("vmops", 1); l = SerializerHelper.toPairList(result, "result"); Assert.assertTrue(l.size() == 2); Assert.assertTrue(l.get(0).first().equals("name")); Assert.assertTrue(l.get(0).second().equals("vmops")); Assert.assertTrue(l.get(1).first().equals("count")); Assert.assertTrue(l.get(1).second().equals("1")); } public void testAsyncResult() { AsyncJobResult result = new AsyncJobResult(1); result.setResultObject(100); Assert.assertTrue(result.getResult().equals("java.lang.Integer/100")); Object obj = result.getResultObject(); Assert.assertTrue(obj instanceof Integer); Assert.assertTrue(((Integer)obj).intValue() == 100); } public void testTransaction() { Transaction txn = Transaction.open("testTransaction"); try { txn.start(); AsyncJobDao dao = new AsyncJobDaoImpl(); AsyncJobVO job = new AsyncJobVO(1, 1, "TestCmd", null); job.setInstanceType("user_vm"); job.setInstanceId(1000L); job.setResult(""); dao.persist(job); txn.rollback(); } finally { txn.close(); } } public void testMorevingian() { int threadCount = 10; final int testCount = 10; Thread[] threads = new Thread[threadCount]; for(int i = 0; i < threadCount; i++) { final int threadNum = i + 1; threads[i] = new Thread(new Runnable() { public void run() { for(int i = 0; i < testCount; i++) { Transaction txn = Transaction.open(Transaction.CLOUD_DB); try { AsyncJobDao dao = new AsyncJobDaoImpl(); s_logger.info("Thread " + threadNum + " acquiring lock"); AsyncJobVO job = dao.acquire(1L, 30); if(job != null) { s_logger.info("Thread " + threadNum + " acquired lock"); try { Thread.sleep(Log4jEnabledTestCase.getRandomMilliseconds(1000, 3000)); } catch (InterruptedException e) { } s_logger.info("Thread " + threadNum + " acquiring lock nestly"); AsyncJobVO job2 = dao.acquire(1L, 30); if(job2 != null) { s_logger.info("Thread " + threadNum + " acquired lock nestly"); try { Thread.sleep(Log4jEnabledTestCase.getRandomMilliseconds(1000, 3000)); } catch (InterruptedException e) { } s_logger.info("Thread " + threadNum + " releasing lock (nestly acquired)"); dao.release(1L); s_logger.info("Thread " + threadNum + " released lock (nestly acquired)"); } else { s_logger.info("Thread " + threadNum + " was unable to acquire lock nestly"); } s_logger.info("Thread " + threadNum + " releasing lock"); dao.release(1L); s_logger.info("Thread " + threadNum + " released lock"); } else { s_logger.info("Thread " + threadNum + " was unable to acquire lock"); } } finally { txn.close(); } try { Thread.sleep(Log4jEnabledTestCase.getRandomMilliseconds(1000, 10000)); } catch (InterruptedException e) { } } } }); } for(int i = 0; i < threadCount; i++) { threads[i].start(); } for(int i = 0; i < threadCount; i++) { try { threads[i].join(); } catch (InterruptedException e) { } } } */ public void testMaid() { Transaction txn = Transaction.open(Transaction.CLOUD_DB); StackMaidDao dao = new StackMaidDaoImpl(); dao.pushCleanupDelegate(1L, 0, "delegate1", "Hello, world"); dao.pushCleanupDelegate(1L, 1, "delegate2", new Long(100)); dao.pushCleanupDelegate(1L, 2, "delegate3", null); CheckPointVO item = dao.popCleanupDelegate(1L); Assert.assertTrue(item.getDelegate().equals("delegate3")); Assert.assertTrue(item.getContext() == null); item = dao.popCleanupDelegate(1L); Assert.assertTrue(item.getDelegate().equals("delegate2")); s_logger.info(item.getContext()); item = dao.popCleanupDelegate(1L); Assert.assertTrue(item.getDelegate().equals("delegate1")); s_logger.info(item.getContext()); txn.close(); } public void testMaidClear() { Transaction txn = Transaction.open(Transaction.CLOUD_DB); StackMaidDao dao = new StackMaidDaoImpl(); dao.pushCleanupDelegate(1L, 0, "delegate1", "Hello, world"); dao.pushCleanupDelegate(1L, 1, "delegate2", new Long(100)); dao.pushCleanupDelegate(1L, 2, "delegate3", null); dao.clearStack(1L); Assert.assertTrue(dao.popCleanupDelegate(1L) == null); txn.close(); } public void testMaidExitCleanup() { StackMaid.current().push(1L, "com.cloud.async.CleanupDelegate", "Hello, world1"); StackMaid.current().push(1L, "com.cloud.async.CleanupDelegate", "Hello, world2"); StackMaid.current().exitCleanup(1L); } public void testMaidLeftovers() { Thread[] threads = new Thread[3]; for(int i = 0; i < 3; i++) { final int threadNum = i+1; threads[i] = new Thread(new Runnable() { public void run() { Transaction txn = Transaction.open(Transaction.CLOUD_DB); StackMaidDao dao = new StackMaidDaoImpl(); dao.pushCleanupDelegate(1L, 0, "delegate-" + threadNum, "Hello, world"); dao.pushCleanupDelegate(1L, 1, "delegate-" + threadNum, new Long(100)); dao.pushCleanupDelegate(1L, 2, "delegate-" + threadNum, null); txn.close(); } }); threads[i].start(); } for(int i = 0; i < 3; i++) { try { threads[i].join(); } catch (InterruptedException e) { } } Transaction txn = Transaction.open(Transaction.CLOUD_DB); StackMaidDao dao = new StackMaidDaoImpl(); List<CheckPointVO> l = dao.listLeftoversByMsid(1L); for(CheckPointVO maid : l) { s_logger.info("" + maid.getThreadId() + " " + maid.getDelegate() + " " + maid.getContext()); } txn.close(); } }