package com.taobao.tddl.atom.common; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import org.junit.Assert; import org.junit.Test; import com.taobao.tddl.atom.config.TAtomConfParser; import com.taobao.tddl.atom.utils.AtomDataSourceHelper; import com.taobao.tddl.atom.utils.ConnRestrictEntry; import com.taobao.tddl.atom.utils.ConnRestrictSlot; import com.taobao.tddl.atom.utils.ConnRestrictor; public class ConnRestrictorUnitTest { @Test public void findSlot_查找连接槽() { String connRestrictStr = "K1,K4,K7:80%; K2,K5,K8:60%; K3,K6,K9:70%; *:4,50%; ~:20;"; List<ConnRestrictEntry> connRestrictEntries = TAtomConfParser.parseConnRestrictEntries(connRestrictStr, 30); for (ConnRestrictEntry connRestrictEntry : connRestrictEntries) { System.out.println(connRestrictEntry.toString()); } ConnRestrictor connRestrictor = new ConnRestrictor("TEST", connRestrictEntries); ConnRestrictSlot slotK1 = connRestrictor.findSlot("K1"); ConnRestrictSlot slotK2 = connRestrictor.findSlot("K2"); ConnRestrictSlot slotK3 = connRestrictor.findSlot("K3"); ConnRestrictSlot slotK4 = connRestrictor.findSlot("K4"); ConnRestrictSlot slotK5 = connRestrictor.findSlot("K5"); ConnRestrictSlot slotK6 = connRestrictor.findSlot("K6"); ConnRestrictSlot slotK7 = connRestrictor.findSlot("K7"); ConnRestrictSlot slotK8 = connRestrictor.findSlot("K8"); ConnRestrictSlot slotK9 = connRestrictor.findSlot("K9"); ConnRestrictSlot slotK10 = connRestrictor.findSlot("K10"); ConnRestrictSlot slotK11 = connRestrictor.findSlot("K11"); ConnRestrictSlot slotNull = connRestrictor.findSlot(null); // 应该都有槽 Assert.assertNotNull(slotK1); Assert.assertNotNull(slotK2); Assert.assertNotNull(slotK3); Assert.assertNotNull(slotK4); Assert.assertNotNull(slotK5); Assert.assertNotNull(slotK6); Assert.assertNotNull(slotK7); Assert.assertNotNull(slotK8); Assert.assertNotNull(slotK9); Assert.assertNotNull(slotK10); Assert.assertNotNull(slotK11); Assert.assertNotNull(slotNull); // 同一组 Key 应该分配到相同的槽 Assert.assertSame(slotK1, slotK4); Assert.assertSame(slotK4, slotK7); Assert.assertSame(slotK2, slotK5); Assert.assertSame(slotK5, slotK8); Assert.assertSame(slotK3, slotK6); Assert.assertSame(slotK6, slotK9); // 每个 Key 的限制应该正确 Assert.assertEquals(24, slotK7.getLimits()); Assert.assertEquals(18, slotK8.getLimits()); Assert.assertEquals(21, slotK9.getLimits()); Assert.assertEquals(15, slotK10.getLimits()); Assert.assertEquals(15, slotK11.getLimits()); Assert.assertEquals(20, slotNull.getLimits()); } @Test public void findSlot_HASH槽测试() { String connRestrictStr = "*:80%"; List<ConnRestrictEntry> connRestrictEntries = TAtomConfParser.parseConnRestrictEntries(connRestrictStr, 30); for (ConnRestrictEntry connRestrictEntry : connRestrictEntries) { System.out.println(connRestrictEntry.toString()); } ConnRestrictor connRestrictor = new ConnRestrictor("TEST", connRestrictEntries); ConnRestrictSlot slotK1 = connRestrictor.findSlot("K1"); ConnRestrictSlot slotK2 = connRestrictor.findSlot("K2"); ConnRestrictSlot slotK3 = connRestrictor.findSlot("K3"); ConnRestrictSlot slotNull = connRestrictor.findSlot(null); Assert.assertNotNull(slotK1); Assert.assertNotNull(slotK2); Assert.assertNotNull(slotK3); Assert.assertNull(slotNull); Assert.assertSame(slotK1, slotK2); Assert.assertSame(slotK2, slotK3); Assert.assertEquals(24, slotK1.getLimits()); } @Test public void doRestrict_连接限制() { String connRestrictStr = "K1,K4,K7:80%; K2,K5,K8:60%; K3,K6,K9:70%; *:4,50%; ~:20;"; List<ConnRestrictEntry> connRestrictEntries = TAtomConfParser.parseConnRestrictEntries(connRestrictStr, 30); ConnRestrictor connRestrictor = new ConnRestrictor("TEST", connRestrictEntries); List<ConnRestrictSlot> slotList = new ArrayList<ConnRestrictSlot>(); int tries = 0; try { // K1 的分配检查 AtomDataSourceHelper.setConnRestrictKey("K1"); for (tries = 0; tries < 30; tries++) { slotList.add(connRestrictor.doRestrict(1)); } } catch (SQLException e) { // 分配异常检查 Assert.assertEquals(24, tries); } finally { // 分配数目检查 Assert.assertEquals(24, slotList.size()); AtomDataSourceHelper.removeConnRestrictKey(); for (ConnRestrictSlot connRestrictSlot : slotList) { connRestrictSlot.freeConnection(); } slotList.clear(); } try { // K5 的分配检查 AtomDataSourceHelper.setConnRestrictKey("K5"); for (tries = 0; tries < 30; tries++) { slotList.add(connRestrictor.doRestrict(1)); } } catch (SQLException e) { // 分配异常检查 Assert.assertEquals(18, tries); } finally { // 分配数目检查 Assert.assertEquals(18, slotList.size()); AtomDataSourceHelper.removeConnRestrictKey(); for (ConnRestrictSlot connRestrictSlot : slotList) { connRestrictSlot.freeConnection(); } slotList.clear(); } try { // K9 的分配检查 AtomDataSourceHelper.setConnRestrictKey("K9"); for (tries = 0; tries < 30; tries++) { slotList.add(connRestrictor.doRestrict(1)); } } catch (SQLException e) { // 分配异常检查 Assert.assertEquals(21, tries); } finally { // 分配数目检查 Assert.assertEquals(21, slotList.size()); AtomDataSourceHelper.removeConnRestrictKey(); for (ConnRestrictSlot connRestrictSlot : slotList) { connRestrictSlot.freeConnection(); } slotList.clear(); } try { // HASH 方式 K12 的分配检查 AtomDataSourceHelper.setConnRestrictKey("K12"); for (tries = 0; tries < 30; tries++) { slotList.add(connRestrictor.doRestrict(1)); } } catch (SQLException e) { // 分配异常检查 Assert.assertEquals(15, tries); } finally { // 分配数目检查 Assert.assertEquals(15, slotList.size()); AtomDataSourceHelper.removeConnRestrictKey(); for (ConnRestrictSlot connRestrictSlot : slotList) { connRestrictSlot.freeConnection(); } slotList.clear(); } try { // null Key 的分配检查 AtomDataSourceHelper.removeConnRestrictKey(); for (tries = 0; tries < 20; tries++) { slotList.add(connRestrictor.doRestrict(1)); } } catch (SQLException e) { // 分配异常检查 Assert.assertEquals(20, tries); } finally { // 分配数目检查 Assert.assertEquals(20, slotList.size()); for (ConnRestrictSlot connRestrictSlot : slotList) { connRestrictSlot.freeConnection(); } slotList.clear(); } } }