/* * JBoss, Home of Professional Open Source * Copyright 2014, Red Hat and individual contributors * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. * * @authors Andrew Dinn */ /** * Copy of the test for TestNG functionality using BMUnitConfig * annotations to define configuration properties */ package test; import org.jboss.byteman.contrib.bmunit.BMNGListener; import org.jboss.byteman.contrib.bmunit.BMRule; import org.jboss.byteman.contrib.bmunit.BMRules; import org.jboss.byteman.contrib.bmunit.BMScript; import org.jboss.byteman.contrib.bmunit.BMScripts; import org.jboss.byteman.contrib.bmunit.BMUnitConfig; import org.testng.annotations.Listeners; import org.testng.annotations.Test; // this runner extends the BMNGRunner which allows it to be executed via TestNG @BMScript(dir="test/scripts") // You can also specify rules directly using annotations // either a one off rule using @BMRule(...) // or a set of rules using @BMRules( @BMRUle(...), ... @BMRule(...)) // but not both // note that rules defined using @BMRule get loaded and, hence, injected after rules defined using // @BMScript // clearly this is a little clumsy, especially when embedding literal strings in the rule text // a macro facility as per any bog standard Lisp would be a big help here // but this does ensure that the rule is right beside the test it applies @BMRule(name="NGUnitTest tryAlways trace rule", targetClass = "NGUnitConfigTest", targetMethod = "tryAlways", condition = "TRUE", action="traceln(\"Byteman: NG intercepted at entry in tryAlways from class @BMRules rule\");" ) // annottaing the class with BMNGListener mixes in the behaviour which processes // @BMRule and @BMScript annotations. ANother option is to have the test class // inherit from class BMNGRunner @Listeners(BMNGListener.class) // we use a config annoation to set the load dir, // switch on bmunit verbosity and use port 9191 // for the agent listener @BMUnitConfig(loadDirectory="test/scripts", bmunitVerbose=true, agentPort="9191") public class NGUnitConfigTest { @Test() // A method annotation identifies a rule script which is loaded before calling the test method and // then unloaded after the test has run @BMScript() // a method config annotation overrides the bmunit // verbosity and enables the Byteman verbose setting @BMUnitConfig(bmunitVerbose=false) public void testOne() { tryOne(); tryTwo(); tryThree(); tryAlways(); } @Test() // If you supply a value then this is used when looking for the script otherwise the method name is used @BMScript(value="two", dir="test/scripts") // another method config annotation overrides the script // lookup directory -- it should not change anything because // the script annotation specifies a dir @BMUnitConfig(loadDirectory="test", debug=true) public void testTwo() { tryOne(); tryTwo(); tryThree(); tryAlways(); } @Test() // you can load several scripts using the BMScripts annotation. this is useful if you want // several test to share some rules but also have their own specific rules @BMScripts( scripts = { @BMScript(value="three"), @BMScript(value="three-extra") } ) // BMRule and BMRules annotations can also be used at the method level // to configure rules specific to a given test method // note that rules defined using @BMRule get loaded and, hence, injected after rules defined using // @BMScript @BMRules( rules = { @BMRule(name="NGUnitTest.testThree tryThree trace rule", targetClass = "NGUnitConfigTest", targetMethod = "tryThree", condition = "TRUE", action="traceln(\"Byteman: NG intercepted at entry in tryThree from method @BMRule rule\");" ), @BMRule(name="NGUnitTest.testThree tryAlways trace rule", targetClass = "NGUnitConfigTest", targetMethod = "tryAlways", binding = "test = $0;", condition = "TRUE", action="traceln(\"Byteman: NG intercepted at entry in tryAlways from method @BMRule rule in test class \" + test.getClass().getName());" ) }) public void testThree() { tryOne(); tryTwo(); tryThree(); tryAlways(); } // The remaining methods have code injected into by the scripts for the class and test methods public void tryOne() { // message injected by Byteman in testOne } public void tryTwo() { // message injected by Byteman in testTwo } public void tryThree() { // eventually message will be injected by Byteman in testThree } public void tryAlways() { // message injected by Byteman in all tests } }