This is an old revision of the document!
package demo.customPlugin;
import com.webmbt.Config;
import com.webmbt.MBTException;
import com.webmbt.ModelMgr;
import com.webmbt.TestOptimalServer;
import com.webmbt.plugin.MScriptInterface.TO_PLUGIN;
import com.webmbt.plugin.PluginAncestor;
import com.webmbt.scxml.ScxmlNode;
import com.webmbt.util.FileUtil;
/**
* Custom plugin to demonstrate how to perform Embedded System testing.
*
* This plugin provides a set of functions for MScript to call to interact with embedded systems.
*
* Any functions annotated with <code>@MSCRIPT_METHOD</code> are automatically exposed to MScript when
* the plugin is enabled for the model.
*
* All MScript function's parameters must be declared as String but the function can return int, long,
* double, String, String[] and List<String>.
*
*/
@TO_PLUGIN
public final class EmbeddedSysPlugin extends PluginAncestor {
/**
* ModelMgr provides access to model attributes.
*/
private ModelMgr modelMgr;
/**
* following static native function declarations map to JNI / dll library functions.
*/
public static native double add(double x, double y);
public static native double substract(double x, double y);
public static native double multiply(double x, double y);
public static native double divide(double x, double y);
/**
* load dll library once.
*/
static {
// change demo_64 to demo 32 if you are running Windows 32bit OS. DLL files must be
// placed in /lib/ folder within TO_IDE project.
String dllName = "demo_64";
String libFilePath = Config.getRootPath() + "/lib/" + dllName + ".dll";
try{
TestOptimalServer.logInfo("Loading library from " + libFilePath);
System.load(libFilePath);
TestOptimalServer.logInfo("Loaded library " + dllName);
} catch(Throwable e) {
TestOptimalServer.logError("Error loading library " + libFilePath, e);
}
}
/**
* Example MScript function.
*
* @param p1
* @param p2
* @return
* @throws MBTException
*/
@MSCRIPT_METHOD
public double add (String p1, String p2) throws MBTException {
try {
double p1Value = Double.parseDouble(p1);
double p2Value = Double.parseDouble(p2);
double result = add (p1Value, p2Value);
return result;
} catch (Throwable e) {
this.scriptExecutor.error("Embedded.add Errored: " + e.toString());
throw new MBTException (e.getMessage() + ": " + e.toString());
}
}
@MSCRIPT_METHOD
public double substract (String p1, String p2) throws MBTException {
try {
double p1Value = Double.parseDouble(p1);
double p2Value = Double.parseDouble(p2);
double result = substract (p1Value, p2Value);
return result;
} catch (Throwable e) {
this.scriptExecutor.error("Embedded.substract Errored: " + e.getMessage());
throw new MBTException (e.getMessage() + ": " + e.toString());
}
}
@MSCRIPT_METHOD
public double multiply (String p1, String p2) throws MBTException {
try {
double p1Value = Double.parseDouble(p1);
double p2Value = Double.parseDouble(p2);
double result = multiply (p1Value, p2Value);
return result;
} catch (Throwable e) {
this.scriptExecutor.error("Embedded.multiply Errored: " + e.getMessage());
throw new MBTException (e.getMessage() + ": " + e.toString());
}
}
@MSCRIPT_METHOD
public double divide (String p1, String p2) throws MBTException {
try {
double p1Value = Double.parseDouble(p1);
double p2Value = Double.parseDouble(p2);
double result = divide (p1Value, p2Value);
return result;
} catch (Throwable e) {
this.scriptExecutor.error("Embedded.divide Errored: " + e.getMessage());
throw new MBTException (e.getMessage() + ": " + e.toString());
}
}
/**
* Replace "Embedded" with your unique plugin id. Plugin ID is used in the namespace for MScript
* functions provided by this plugin.
*
*/
@Override
public String getPluginID() {
return "Embedded";
}
/**
* This function returns the plugin description/name to be displayed on the Model Property.
*/
@Override
public String getPluginDesc() {
return "Embedded: Embedded System Testing";
}
/**
*
* This function returns the type of plugin: DATA or AUT. Set it to "AUT" if the plugin
* interacts with AUT, else return DATA.
*
* For example, DATAGEN oplugin only provides a set of functions to generate random test data,
* so it is a DATA plugin while Selenium automates web applications, so it is an AUT plugin.
*
*/
@Override
public String getCatCode() {
return "AUT";
}
/**
* This function is called when model execution stops.
*
*/
@Override
public void close() {
try {
//
}
catch (Exception e) {
//ok
}
TestOptimalServer.logDebug(this.getPluginID() + ": closing all used resources.");
}
/**
* Initializes plugin. This function is called when the plugin object is instantialized and before
* model execution starts.
*
*/
@Override
public synchronized void init(ScxmlNode scxmlNode_p, String[] pluginParams_p) throws Exception {
this.setReady();
this.modelMgr = this.getScriptExecutor().getModelMgr();
// add your initialization code here.
return;
}
/**
* This function is called at the beginning of model execution before MBT_start trigger is executed.
*
*/
@Override
public void start() throws Exception {
// add your code here
}
/**
* This is an MScript function (accessible from MScript) as it is annotated with <code>@MScript_METHOD</code>.
* It's required for all plugins to take a screenshot of AUT and return the file name of the screenshot file.
*
* The screenshot file should be stored in model's <code>snapscreen</code> folder.
*
* If the plugin does not interact with AUT and can not take a screenshot of AUT, then it should return null.
*
*/
@Override
@MSCRIPT_METHOD
public String snapScreen(String fileName_p) throws Exception {
String modelFolderPath = Config.getModelFilePath(this.modelMgr.getModelName());
String screenshotFile = FileUtil.concatFilePath(modelFolderPath, fileName_p + ".png");
// generate screenshot and save it to screeshotFile.
screenshotFile = null; // return null if this plugin does not support snapScreen()
return screenshotFile;
}
}