/** * Refactored from AbstractAction.java * * @param tree */ public static void ConvertSubTree(HashTree tree) { LinkedList<Object> copyList = new LinkedList<Object>(tree.list()); foreach (Object obj in copyList) { if (typeof(TestElement).IsAssignableFrom(obj.GetType())) { TestElement item = (TestElement) obj; if (item.isEnabled()) { if (typeof(ReplaceableController).IsAssignableFrom(item.GetType())) { ReplaceableController rc; // TODO this bit of code needs to be tidied up // Unfortunately ModuleController is in components, not core if (item.GetType().Name.Equals("org.apache.jmeter.control.ModuleController")) { // Bug 47165 rc = (ReplaceableController) item; } else { // HACK: force the controller to load its tree rc = (ReplaceableController) item.Clone(); } HashTree subTree = tree.GetTree(item); if (subTree != null) { HashTree replacementTree = rc.getReplacementSubTree(); if (replacementTree != null) { ConvertSubTree(replacementTree); tree.Replace(item, rc); tree.Set(rc, replacementTree); } } else { // null subTree ConvertSubTree(tree.GetTree(item)); } } else { // not Replaceable Controller ConvertSubTree(tree.GetTree(item)); } } else { // Not enabled tree.Remove(item); } } else { // Not a TestElement NetMeterTreeNode item = (NetMeterTreeNode) obj; if (item.isEnabled()) { // Replacement only needs to occur when starting the engine // @see StandardJMeterEngine.run() if (item.getUserObject() is ReplaceableController) { ReplaceableController rc = (ReplaceableController) item.getTestElement(); HashTree subTree = tree.GetTree(item); if (subTree != null) { HashTree replacementTree = rc.getReplacementSubTree(); if (replacementTree != null) { ConvertSubTree(replacementTree); tree.Replace(item, rc); tree.Set(rc, replacementTree); } } } else { // Not a ReplaceableController ConvertSubTree(tree.GetTree(item)); TestElement testElement = item.getTestElement(); tree.Replace(item, testElement); } } else { // Not enabled tree.Remove(item); } } } }
public void Run() { log.Info("Running the test!"); running = true; NetMeterContextManager.StartTest(); //try //{ // PreCompiler compiler = new PreCompiler(); // test.Traverse(compiler); //} //catch (Exception ex) //{ // log.Error(String.Format("Error occurred compiling the tree: {0}", ex.Message)); // return; // no point continuing //} /** * Notification of test listeners needs to happen after function * replacement, but before setting RunningVersion to true. */ SearchByType <TestStateListener> testListeners = new SearchByType <TestStateListener>(); // TL - S&E test.Traverse(testListeners); // Merge in any additional test listeners // currently only used by the function parser testListeners.GetSearchResults().AddRange(testList); testList.Clear(); // no longer needed //if (!startListenersLater ) //{ // NotifyTestListenersOfStart(testListeners); //} test.Traverse(new TurnElementsOn()); //if (startListenersLater) //{ // NotifyTestListenersOfStart(testListeners); //} LinkedList <Object> testLevelElements = new LinkedList <Object>(test.list(test.GetArray()[0])); RemoveThreadGroups(testLevelElements); SearchByType <AbstractThreadGroup> searcher = new SearchByType <AbstractThreadGroup>(); test.Traverse(searcher); TestCompiler.Initialize(); ListenerNotifier notifier = new ListenerNotifier(); int groupCount = 0; NetMeterContextManager.ClearTotalThreads(); /* * Here's where the test really starts. Run a Full GC now: it's no harm * at all (just delays test start by a tiny amount) and hitting one too * early in the test can impair results for short tests. */ NetMeterUtils.helpGC(); NetMeterContextManager.GetContext().SetSamplingStarted(true); Boolean mainGroups = running; // still running at this point, i.e. setUp was not cancelled while (running) { foreach (AbstractThreadGroup group in searcher.GetSearchResults()) { groupCount++; String groupName = group.GetName(); log.Info(String.Format("Starting ThreadGroup: {0} : {1}", groupCount, groupName)); StartThreadGroup(group, groupCount, searcher, testLevelElements, notifier); if (serialized) { log.Info(String.Format("Waiting for thread group: {0} to finish before starting next group", groupName)); group.WaitThreadsStopped(); } } } if (groupCount == 0) { // No TGs found log.Info("No enabled thread groups found"); } else { if (running) { log.Info("All thread groups have been started"); } else { log.Info("Test stopped - no more thread groups will be started"); } } //wait for all Test Threads To Exit WaitThreadsStopped(); NotifyTestListenersOfEnd(testListeners); }
/** * Refactored from AbstractAction.java * * @param tree */ public static void ConvertSubTree(HashTree tree) { LinkedList <Object> copyList = new LinkedList <Object>(tree.list()); foreach (Object obj in copyList) { if (typeof(TestElement).IsAssignableFrom(obj.GetType())) { TestElement item = (TestElement)obj; if (item.isEnabled()) { if (typeof(ReplaceableController).IsAssignableFrom(item.GetType())) { ReplaceableController rc; // TODO this bit of code needs to be tidied up // Unfortunately ModuleController is in components, not core if (item.GetType().Name.Equals("org.apache.jmeter.control.ModuleController")) { // Bug 47165 rc = (ReplaceableController)item; } else { // HACK: force the controller to load its tree rc = (ReplaceableController)item.Clone(); } HashTree subTree = tree.GetTree(item); if (subTree != null) { HashTree replacementTree = rc.getReplacementSubTree(); if (replacementTree != null) { ConvertSubTree(replacementTree); tree.Replace(item, rc); tree.Set(rc, replacementTree); } } else { // null subTree ConvertSubTree(tree.GetTree(item)); } } else { // not Replaceable Controller ConvertSubTree(tree.GetTree(item)); } } else { // Not enabled tree.Remove(item); } } else { // Not a TestElement NetMeterTreeNode item = (NetMeterTreeNode)obj; if (item.isEnabled()) { // Replacement only needs to occur when starting the engine // @see StandardJMeterEngine.run() if (item.getUserObject() is ReplaceableController) { ReplaceableController rc = (ReplaceableController)item.getTestElement(); HashTree subTree = tree.GetTree(item); if (subTree != null) { HashTree replacementTree = rc.getReplacementSubTree(); if (replacementTree != null) { ConvertSubTree(replacementTree); tree.Replace(item, rc); tree.Set(rc, replacementTree); } } } else { // Not a ReplaceableController ConvertSubTree(tree.GetTree(item)); TestElement testElement = item.getTestElement(); tree.Replace(item, testElement); } } else { // Not enabled tree.Remove(item); } } } }