/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2002-2005 Julian Hyde // Copyright (C) 2005-2010 Pentaho and others // All Rights Reserved. // */ package mondrian.test; import mondrian.olap.MondrianProperties; import mondrian.olap.Util; import mondrian.test.clearview.*; import junit.framework.*; import java.lang.reflect.Constructor; import java.util.*; /** * A copy of {@link ConcurrentMdxTest} with modifications to take * as input ref.xml files. This does not fully use {@link DiffRepository} * and does not generate log files. * This Class is not added to the Main test suite. * Purpose of this test is to simulate Concurrent access to Aggregation and data * load. Simulation will be more effective if we run this single test again and * again with a fresh connection. * * @author Khanh Vu */ public class CVConcurrentMdxTest extends FoodMartTestCase { private MondrianProperties props; public CVConcurrentMdxTest() { super(); props = MondrianProperties.instance(); } public CVConcurrentMdxTest(String name) { super(name); props = MondrianProperties.instance(); } public void testConcurrentQueriesInRandomOrder() { propSaver.set(props.UseAggregates, false); propSaver.set(props.ReadAggregates, false); propSaver.set(props.DisableCaching, false); // test partially filled aggregation cache // add test classes List<Class> testList = new ArrayList<Class>(); List<TestSuite> suiteList = new ArrayList<TestSuite>(); testList.add(PartialCacheTest.class); suiteList.add(PartialCacheTest.suite()); testList.add(MultiLevelTest.class); suiteList.add(MultiLevelTest.suite()); testList.add(QueryAllTest.class); suiteList.add(QueryAllTest.suite()); testList.add(MultiDimTest.class); suiteList.add(MultiDimTest.suite()); // sanity check assertTrue(sanityCheck(suiteList)); // generate list of queries and results QueryAndResult[] queryList = generateQueryArray(testList); assertTrue(ConcurrentValidatingQueryRunner.runTest( 3, 100, true, true, true, queryList).size() == 0); } public void testConcurrentQueriesInRandomOrderOnVirtualCube() { propSaver.set(props.UseAggregates, false); propSaver.set(props.ReadAggregates, false); propSaver.set(props.DisableCaching, false); // test partially filled aggregation cache // add test classes List<Class> testList = new ArrayList<Class>(); List<TestSuite> suiteList = new ArrayList<TestSuite>(); testList.add(PartialCacheVCTest.class); suiteList.add(PartialCacheVCTest.suite()); testList.add(MultiLevelTest.class); suiteList.add(MultiLevelTest.suite()); testList.add(QueryAllVCTest.class); suiteList.add(QueryAllVCTest.suite()); testList.add(MultiDimVCTest.class); suiteList.add(MultiDimVCTest.suite()); // sanity check assertTrue(sanityCheck(suiteList)); // generate list of queries and results QueryAndResult[] queryList = generateQueryArray(testList); assertTrue(ConcurrentValidatingQueryRunner.runTest( 3, 100, true, true, true, queryList).size() == 0); } public void testConcurrentCVQueriesInRandomOrder() { propSaver.set(props.UseAggregates, false); propSaver.set(props.ReadAggregates, false); propSaver.set(props.DisableCaching, false); // test partially filled aggregation cache // add test classes List<Class> testList = new ArrayList<Class>(); testList.add(CVBasicTest.class); testList.add(GrandTotalTest.class); testList.add(MetricFilterTest.class); testList.add(MiscTest.class); testList.add(PredicateFilterTest.class); testList.add(SubTotalTest.class); testList.add(SummaryMetricPercentTest.class); testList.add(SummaryTest.class); testList.add(TopBottomTest.class); // generate list of queries and results QueryAndResult[] queryList = generateQueryArray(testList); assertEquals( Collections.<Throwable>emptyList(), ConcurrentValidatingQueryRunner.runTest( 3, 100, true, true, true, queryList)); } protected void tearDown() throws Exception { super.tearDown(); } protected void setUp() throws Exception { super.setUp(); } /** * Runs one pass of all tests single-threaded using * {@link mondrian.test.clearview.ClearViewBase} mechanism * @param suiteList list of tests to be checked * @return true if all tests pass */ private boolean sanityCheck(List<TestSuite> suiteList) { TestSuite suite = new TestSuite(); for (int i = 0; i < suiteList.size(); i++) { suite.addTest(suiteList.get(i)); } TestResult tres = new TestResult(); suite.run(tres); return tres.wasSuccessful(); } /** * Generates an array of QueryAndResult objects from the list of * test classes * @param testList list of test classes * @return array of QueryAndResult */ private QueryAndResult[] generateQueryArray(List<Class> testList) { List<QueryAndResult> queryList = new ArrayList<QueryAndResult>(); for (int i = 0; i < testList.size(); i++) { Class testClass = testList.get(i); Class[] types = new Class[] { String.class }; try { Constructor cons = testClass.getConstructor(types); Object[] args = new Object[] { "" }; Test newCon = (Test) cons.newInstance(args); DiffRepository diffRepos = ((ClearViewBase) newCon).getDiffRepos(); List<String> testCaseNames = diffRepos.getTestCaseNames(); for (int j = 0; j < testCaseNames.size(); j++) { String testCaseName = testCaseNames.get(j); String query = diffRepos.get(testCaseName, "mdx"); String result = diffRepos.get(testCaseName, "result"); // current limitation: only run queries if // calculated members are not specified if (diffRepos.get(testCaseName, "calculatedMembers") == null) { // trim the starting newline char only if (result.startsWith(Util.nl)) { result = result.replaceFirst(Util.nl, ""); } QueryAndResult queryResult = new QueryAndResult(query, result); queryList.add(queryResult); } } } catch (Exception e) { throw new Error(e.getMessage()); } } QueryAndResult[] queryArray = new QueryAndResult[queryList.size()]; return queryList.toArray(queryArray); } } // End CVConcurrentMdxTest.java