Merge
This commit is contained in:
commit
07faeeb7c4
|
@ -14,4 +14,4 @@
|
||||||
/WindowsMonitor/Monitor/x64
|
/WindowsMonitor/Monitor/x64
|
||||||
/WindowsMonitor/Native/Debug
|
/WindowsMonitor/Native/Debug
|
||||||
/WindowsMonitor/Native/Release
|
/WindowsMonitor/Native/Release
|
||||||
/WindowsMonitor/Native/x64
|
/WindowsMonitor/Native/x64
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
row1;10;11~row2;20;21~row3,30,31~
|
|
@ -0,0 +1,41 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||||
|
<runScenario>
|
||||||
|
<batches>
|
||||||
|
<batches>
|
||||||
|
<behaviors>
|
||||||
|
<behaviors>
|
||||||
|
<id>1</id>
|
||||||
|
<name>Get</name>
|
||||||
|
<parameters>
|
||||||
|
<parameter>
|
||||||
|
<key>url</key>
|
||||||
|
<value>http://www.baidu.com
|
||||||
|
</value>
|
||||||
|
</parameter>
|
||||||
|
<parameter>
|
||||||
|
<key>parameters</key>
|
||||||
|
<value></value>
|
||||||
|
</parameter>
|
||||||
|
</parameters>
|
||||||
|
<use>http</use>
|
||||||
|
</behaviors>
|
||||||
|
</behaviors>
|
||||||
|
<childId>-1</childId>
|
||||||
|
<id>0</id>
|
||||||
|
<parentId>-1</parentId>
|
||||||
|
</batches>
|
||||||
|
</batches>
|
||||||
|
<poolSize>0</poolSize>
|
||||||
|
<usePlugins>
|
||||||
|
<usePlugin>
|
||||||
|
<id>http</id>
|
||||||
|
<name>Http</name>
|
||||||
|
<parameters />
|
||||||
|
</usePlugin>
|
||||||
|
<usePlugin>
|
||||||
|
<id>timer</id>
|
||||||
|
<name>ConstantTimer</name>
|
||||||
|
<parameters />
|
||||||
|
</usePlugin>
|
||||||
|
</usePlugins>
|
||||||
|
</runScenario>
|
|
@ -0,0 +1,17 @@
|
||||||
|
<behaviorModel>
|
||||||
|
<id>0</id>
|
||||||
|
<name>Get</name>
|
||||||
|
<parameters>
|
||||||
|
<parameter>
|
||||||
|
<key>url</key>
|
||||||
|
<value>http://133.133.12.3:8080/Bench4QTestCase/testcase.html
|
||||||
|
</value>
|
||||||
|
</parameter>
|
||||||
|
<parameter>
|
||||||
|
<key>parameters</key>
|
||||||
|
<value></value>
|
||||||
|
</parameter>
|
||||||
|
</parameters>
|
||||||
|
<type>USERBEHAVIOR</type>
|
||||||
|
<use>http</use>
|
||||||
|
</behaviorModel>
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,146 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||||
|
<runScenario>
|
||||||
|
<batches>
|
||||||
|
<batch>
|
||||||
|
<behaviors>
|
||||||
|
<userBehavior>
|
||||||
|
<id>1</id>
|
||||||
|
<name>Get</name>
|
||||||
|
<parameters>
|
||||||
|
<parameter>
|
||||||
|
<key>url</key>
|
||||||
|
<value>http://133.133.12.3:8080/Bench4QTestCase/testcase.html
|
||||||
|
</value>
|
||||||
|
</parameter>
|
||||||
|
<parameter>
|
||||||
|
<key>parameters</key>
|
||||||
|
<value></value>
|
||||||
|
</parameter>
|
||||||
|
</parameters>
|
||||||
|
<use>http</use>
|
||||||
|
</userBehavior>
|
||||||
|
</behaviors>
|
||||||
|
<childId>2</childId>
|
||||||
|
<id>0</id>
|
||||||
|
<parentId>-1</parentId>
|
||||||
|
</batch>
|
||||||
|
<batch>
|
||||||
|
<behaviors>
|
||||||
|
<timerBehavior>
|
||||||
|
<id>0</id>
|
||||||
|
<name>Sleep</name>
|
||||||
|
<parameters>
|
||||||
|
<parameter>
|
||||||
|
<key>time</key>
|
||||||
|
<value>2500</value>
|
||||||
|
</parameter>
|
||||||
|
</parameters>
|
||||||
|
<use>timer</use>
|
||||||
|
</timerBehavior>
|
||||||
|
</behaviors>
|
||||||
|
<childId>-1</childId>
|
||||||
|
<id>1</id>
|
||||||
|
<parentId>-1</parentId>
|
||||||
|
</batch>
|
||||||
|
<batch>
|
||||||
|
<behaviors>
|
||||||
|
<userBehavior>
|
||||||
|
<id>3</id>
|
||||||
|
<name>Get</name>
|
||||||
|
<parameters>
|
||||||
|
<parameter>
|
||||||
|
<key>url</key>
|
||||||
|
<value>http://133.133.12.3:8080/Bench4QTestCase/images/3.jpg
|
||||||
|
</value>
|
||||||
|
</parameter>
|
||||||
|
<parameter>
|
||||||
|
<key>parameters</key>
|
||||||
|
<value></value>
|
||||||
|
</parameter>
|
||||||
|
</parameters>
|
||||||
|
<use>http</use>
|
||||||
|
</userBehavior>
|
||||||
|
<userBehavior>
|
||||||
|
<id>4</id>
|
||||||
|
<name>Get</name>
|
||||||
|
<parameters>
|
||||||
|
<parameter>
|
||||||
|
<key>url</key>
|
||||||
|
<value>http://133.133.12.3:8080/Bench4QTestCase/script/agentTable.js
|
||||||
|
</value>
|
||||||
|
</parameter>
|
||||||
|
<parameter>
|
||||||
|
<key>parameters</key>
|
||||||
|
<value></value>
|
||||||
|
</parameter>
|
||||||
|
</parameters>
|
||||||
|
<use>http</use>
|
||||||
|
</userBehavior>
|
||||||
|
<userBehavior>
|
||||||
|
<id>5</id>
|
||||||
|
<name>Get</name>
|
||||||
|
<parameters>
|
||||||
|
<parameter>
|
||||||
|
<key>url</key>
|
||||||
|
<value>http://133.133.12.3:8080/Bench4QTestCase/script/base.js
|
||||||
|
</value>
|
||||||
|
</parameter>
|
||||||
|
<parameter>
|
||||||
|
<key>parameters</key>
|
||||||
|
<value></value>
|
||||||
|
</parameter>
|
||||||
|
</parameters>
|
||||||
|
<use>http</use>
|
||||||
|
</userBehavior>
|
||||||
|
<userBehavior>
|
||||||
|
<id>6</id>
|
||||||
|
<name>Get</name>
|
||||||
|
<parameters>
|
||||||
|
<parameter>
|
||||||
|
<key>url</key>
|
||||||
|
<value>http://133.133.12.3:8080/Bench4QTestCase/images/1.jpg
|
||||||
|
</value>
|
||||||
|
</parameter>
|
||||||
|
<parameter>
|
||||||
|
<key>parameters</key>
|
||||||
|
<value></value>
|
||||||
|
</parameter>
|
||||||
|
</parameters>
|
||||||
|
<use>http</use>
|
||||||
|
</userBehavior>
|
||||||
|
<userBehavior>
|
||||||
|
<id>7</id>
|
||||||
|
<name>Get</name>
|
||||||
|
<parameters>
|
||||||
|
<parameter>
|
||||||
|
<key>url</key>
|
||||||
|
<value>http://133.133.12.3:8080/Bench4QTestCase/images/2.jpg
|
||||||
|
</value>
|
||||||
|
</parameter>
|
||||||
|
<parameter>
|
||||||
|
<key>parameters</key>
|
||||||
|
<value></value>
|
||||||
|
</parameter>
|
||||||
|
</parameters>
|
||||||
|
<use>http</use>
|
||||||
|
</userBehavior>
|
||||||
|
</behaviors>
|
||||||
|
<childId>-1</childId>
|
||||||
|
<id>2</id>
|
||||||
|
<parentId>0</parentId>
|
||||||
|
</batch>
|
||||||
|
</batches>
|
||||||
|
<poolSize>0</poolSize>
|
||||||
|
<usePlugins>
|
||||||
|
<usePlugin>
|
||||||
|
<id>http</id>
|
||||||
|
<name>Http</name>
|
||||||
|
<parameters />
|
||||||
|
</usePlugin>
|
||||||
|
<usePlugin>
|
||||||
|
<id>timer</id>
|
||||||
|
<name>ConstantTimer</name>
|
||||||
|
<parameters />
|
||||||
|
</usePlugin>
|
||||||
|
</usePlugins>
|
||||||
|
</runScenario>
|
|
@ -0,0 +1,234 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||||
|
<runScenario>
|
||||||
|
<pages>
|
||||||
|
<page>
|
||||||
|
<batches>
|
||||||
|
<batch>
|
||||||
|
<behaviors>
|
||||||
|
<behaviorModel>
|
||||||
|
<id>0</id>
|
||||||
|
<name>Get</name>
|
||||||
|
<parameters>
|
||||||
|
<parameter>
|
||||||
|
<key>url</key>
|
||||||
|
<value>
|
||||||
|
http://133.133.12.3:8080/Bench4QTestCase/testcase.html
|
||||||
|
</value>
|
||||||
|
</parameter>
|
||||||
|
<parameter>
|
||||||
|
<key>parameters</key>
|
||||||
|
<value></value>
|
||||||
|
</parameter>
|
||||||
|
</parameters>
|
||||||
|
<type>USERBEHAVIOR</type>
|
||||||
|
<use>http</use>
|
||||||
|
</behaviorModel>
|
||||||
|
</behaviors>
|
||||||
|
<childId>2</childId>
|
||||||
|
<id>0</id>
|
||||||
|
<parentId>-1</parentId>
|
||||||
|
</batch>
|
||||||
|
<batch>
|
||||||
|
<behaviors>
|
||||||
|
<behaviorModel>
|
||||||
|
<id>0</id>
|
||||||
|
<name>Sleep</name>
|
||||||
|
<parameters>
|
||||||
|
<parameter>
|
||||||
|
<key>time</key>
|
||||||
|
<value>230</value>
|
||||||
|
</parameter>
|
||||||
|
</parameters>
|
||||||
|
<type>TIMERBEHAVIOR</type>
|
||||||
|
<use>timer</use>
|
||||||
|
</behaviorModel>
|
||||||
|
</behaviors>
|
||||||
|
<childId>-1</childId>
|
||||||
|
<id>1</id>
|
||||||
|
<parentId>-1</parentId>
|
||||||
|
</batch>
|
||||||
|
<batch>
|
||||||
|
<behaviors>
|
||||||
|
<behaviorModel>
|
||||||
|
<id>1</id>
|
||||||
|
<name>Get</name>
|
||||||
|
<parameters>
|
||||||
|
<parameter>
|
||||||
|
<key>url</key>
|
||||||
|
<value>http://133.133.12.3:8080/Bench4QTestCase/script/agentTable.js
|
||||||
|
</value>
|
||||||
|
</parameter>
|
||||||
|
<parameter>
|
||||||
|
<key>parameters</key>
|
||||||
|
<value></value>
|
||||||
|
</parameter>
|
||||||
|
</parameters>
|
||||||
|
<type>USERBEHAVIOR</type>
|
||||||
|
<use>http</use>
|
||||||
|
</behaviorModel>
|
||||||
|
<behaviorModel>
|
||||||
|
<id>2</id>
|
||||||
|
<name>Get</name>
|
||||||
|
<parameters>
|
||||||
|
<parameter>
|
||||||
|
<key>url</key>
|
||||||
|
<value>http://133.133.12.3:8080/Bench4QTestCase/images/3.jpg
|
||||||
|
</value>
|
||||||
|
</parameter>
|
||||||
|
<parameter>
|
||||||
|
<key>parameters</key>
|
||||||
|
<value></value>
|
||||||
|
</parameter>
|
||||||
|
</parameters>
|
||||||
|
<type>USERBEHAVIOR</type>
|
||||||
|
<use>http</use>
|
||||||
|
</behaviorModel>
|
||||||
|
<behaviorModel>
|
||||||
|
<id>3</id>
|
||||||
|
<name>Get</name>
|
||||||
|
<parameters>
|
||||||
|
<parameter>
|
||||||
|
<key>url</key>
|
||||||
|
<value>http://133.133.12.3:8080/Bench4QTestCase/script/base.js
|
||||||
|
</value>
|
||||||
|
</parameter>
|
||||||
|
<parameter>
|
||||||
|
<key>parameters</key>
|
||||||
|
<value></value>
|
||||||
|
</parameter>
|
||||||
|
</parameters>
|
||||||
|
<type>USERBEHAVIOR</type>
|
||||||
|
<use>http</use>
|
||||||
|
</behaviorModel>
|
||||||
|
<behaviorModel>
|
||||||
|
<id>4</id>
|
||||||
|
<name>Get</name>
|
||||||
|
<parameters>
|
||||||
|
<parameter>
|
||||||
|
<key>url</key>
|
||||||
|
<value>http://133.133.12.3:8080/Bench4QTestCase/images/1.jpg
|
||||||
|
</value>
|
||||||
|
</parameter>
|
||||||
|
<parameter>
|
||||||
|
<key>parameters</key>
|
||||||
|
<value></value>
|
||||||
|
</parameter>
|
||||||
|
</parameters>
|
||||||
|
<type>USERBEHAVIOR</type>
|
||||||
|
<use>http</use>
|
||||||
|
</behaviorModel>
|
||||||
|
<behaviorModel>
|
||||||
|
<id>5</id>
|
||||||
|
<name>Get</name>
|
||||||
|
<parameters>
|
||||||
|
<parameter>
|
||||||
|
<key>url</key>
|
||||||
|
<value>http://133.133.12.3:8080/Bench4QTestCase/images/2.jpg
|
||||||
|
</value>
|
||||||
|
</parameter>
|
||||||
|
<parameter>
|
||||||
|
<key>parameters</key>
|
||||||
|
<value></value>
|
||||||
|
</parameter>
|
||||||
|
</parameters>
|
||||||
|
<type>USERBEHAVIOR</type>
|
||||||
|
<use>http</use>
|
||||||
|
</behaviorModel>
|
||||||
|
</behaviors>
|
||||||
|
<childId>-1</childId>
|
||||||
|
<id>2</id>
|
||||||
|
<parentId>0</parentId>
|
||||||
|
</batch>
|
||||||
|
<batch>
|
||||||
|
<behaviors>
|
||||||
|
<behaviorModel>
|
||||||
|
<id>0</id>
|
||||||
|
<name>Sleep</name>
|
||||||
|
<parameters>
|
||||||
|
<parameter>
|
||||||
|
<key>time</key>
|
||||||
|
<value>96</value>
|
||||||
|
</parameter>
|
||||||
|
</parameters>
|
||||||
|
<type>TIMERBEHAVIOR</type>
|
||||||
|
<use>timer</use>
|
||||||
|
</behaviorModel>
|
||||||
|
</behaviors>
|
||||||
|
<childId>-1</childId>
|
||||||
|
<id>3</id>
|
||||||
|
<parentId>-1</parentId>
|
||||||
|
</batch>
|
||||||
|
<batch>
|
||||||
|
<behaviors>
|
||||||
|
<behaviorModel>
|
||||||
|
<id>0</id>
|
||||||
|
<name>Sleep</name>
|
||||||
|
<parameters>
|
||||||
|
<parameter>
|
||||||
|
<key>time</key>
|
||||||
|
<value>3</value>
|
||||||
|
</parameter>
|
||||||
|
</parameters>
|
||||||
|
<type>TIMERBEHAVIOR</type>
|
||||||
|
<use>timer</use>
|
||||||
|
</behaviorModel>
|
||||||
|
</behaviors>
|
||||||
|
<childId>-1</childId>
|
||||||
|
<id>4</id>
|
||||||
|
<parentId>-1</parentId>
|
||||||
|
</batch>
|
||||||
|
<batch>
|
||||||
|
<behaviors>
|
||||||
|
<behaviorModel>
|
||||||
|
<id>0</id>
|
||||||
|
<name>Sleep</name>
|
||||||
|
<parameters>
|
||||||
|
<parameter>
|
||||||
|
<key>time</key>
|
||||||
|
<value>10</value>
|
||||||
|
</parameter>
|
||||||
|
</parameters>
|
||||||
|
<type>TIMERBEHAVIOR</type>
|
||||||
|
<use>timer</use>
|
||||||
|
</behaviorModel>
|
||||||
|
</behaviors>
|
||||||
|
<childId>-1</childId>
|
||||||
|
<id>5</id>
|
||||||
|
<parentId>-1</parentId>
|
||||||
|
</batch>
|
||||||
|
<batch>
|
||||||
|
<behaviors>
|
||||||
|
<behaviorModel>
|
||||||
|
<id>0</id>
|
||||||
|
<name>Sleep</name>
|
||||||
|
<parameters>
|
||||||
|
<parameter>
|
||||||
|
<key>time</key>
|
||||||
|
<value>6</value>
|
||||||
|
</parameter>
|
||||||
|
</parameters>
|
||||||
|
<type>TIMERBEHAVIOR</type>
|
||||||
|
<use>timer</use>
|
||||||
|
</behaviorModel>
|
||||||
|
</behaviors>
|
||||||
|
<childId>-1</childId>
|
||||||
|
<id>6</id>
|
||||||
|
<parentId>-1</parentId>
|
||||||
|
</batch>
|
||||||
|
</batches>
|
||||||
|
</page>
|
||||||
|
</pages>
|
||||||
|
<poolSize>0</poolSize>
|
||||||
|
<usePlugins>
|
||||||
|
<usePlugin>
|
||||||
|
<id>http</id>
|
||||||
|
<name>Http</name>
|
||||||
|
<parameters />
|
||||||
|
</usePlugin>
|
||||||
|
<usePlugin>
|
||||||
|
<id>timer</id>
|
||||||
|
<name>ConstantTimer</name>
|
||||||
|
<parameters />
|
||||||
|
</usePlugin>
|
||||||
|
</usePlugins>
|
||||||
|
</runScenario>
|
|
@ -0,0 +1,66 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||||
|
<runScenario>
|
||||||
|
<pages>
|
||||||
|
<page>
|
||||||
|
<batches>
|
||||||
|
<batch>
|
||||||
|
<behaviors>
|
||||||
|
<behaviorModel>
|
||||||
|
<id>0</id>
|
||||||
|
<name>Get</name>
|
||||||
|
<parameters>
|
||||||
|
<parameter>
|
||||||
|
<key>url</key>
|
||||||
|
<value>
|
||||||
|
http://www.baidu.com
|
||||||
|
</value>
|
||||||
|
</parameter>
|
||||||
|
<parameter>
|
||||||
|
<key>parameters</key>
|
||||||
|
<value></value>
|
||||||
|
</parameter>
|
||||||
|
</parameters>
|
||||||
|
<type>USERBEHAVIOR</type>
|
||||||
|
<use>http</use>
|
||||||
|
</behaviorModel>
|
||||||
|
</behaviors>
|
||||||
|
<childId>2</childId>
|
||||||
|
<id>0</id>
|
||||||
|
<parentId>-1</parentId>
|
||||||
|
</batch>
|
||||||
|
<batch>
|
||||||
|
<behaviors>
|
||||||
|
<behaviorModel>
|
||||||
|
<id>0</id>
|
||||||
|
<name>Sleep</name>
|
||||||
|
<parameters>
|
||||||
|
<parameter>
|
||||||
|
<key>time</key>
|
||||||
|
<value>230</value>
|
||||||
|
</parameter>
|
||||||
|
</parameters>
|
||||||
|
<type>TIMERBEHAVIOR</type>
|
||||||
|
<use>timer</use>
|
||||||
|
</behaviorModel>
|
||||||
|
</behaviors>
|
||||||
|
<childId>-1</childId>
|
||||||
|
<id>1</id>
|
||||||
|
<parentId>-1</parentId>
|
||||||
|
</batch>
|
||||||
|
</batches>
|
||||||
|
</page>
|
||||||
|
</pages>
|
||||||
|
<poolSize>0</poolSize>
|
||||||
|
<usePlugins>
|
||||||
|
<usePlugin>
|
||||||
|
<id>http</id>
|
||||||
|
<name>Http</name>
|
||||||
|
<parameters />
|
||||||
|
</usePlugin>
|
||||||
|
<usePlugin>
|
||||||
|
<id>timer</id>
|
||||||
|
<name>ConstantTimer</name>
|
||||||
|
<parameters />
|
||||||
|
</usePlugin>
|
||||||
|
</usePlugins>
|
||||||
|
</runScenario>
|
|
@ -0,0 +1 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><behaviorResultModel><behaviorId>1</behaviorId><behaviorName>Get</behaviorName><contentLength>1064</contentLength><contentType>text/html</contentType><endDate>2013-12-16T10:01:02.620+08:00</endDate><pluginId>http</pluginId><pluginName>Http</pluginName><responseTime>6</responseTime><shouldBeCountResponseTime>true</shouldBeCountResponseTime><startDate>2013-12-16T10:01:02.614+08:00</startDate><statusCode>200</statusCode><success>true</success></behaviorResultModel>
|
|
@ -0,0 +1 @@
|
||||||
|
test
|
|
@ -0,0 +1,3 @@
|
||||||
|
isToSaveDetailResult=false
|
||||||
|
servePort=6565
|
||||||
|
userDefinedParamFolder=userDefinedParams
|
|
@ -0,0 +1,25 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<assembly
|
||||||
|
xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
|
||||||
|
<id>publish</id>
|
||||||
|
<formats>
|
||||||
|
<format>tar.gz</format>
|
||||||
|
</formats>
|
||||||
|
<includeBaseDirectory>false</includeBaseDirectory>
|
||||||
|
<dependencySets>
|
||||||
|
<dependencySet>
|
||||||
|
<outputDirectory>lib</outputDirectory>
|
||||||
|
<useProjectArtifact>false</useProjectArtifact>
|
||||||
|
<unpack>false</unpack>
|
||||||
|
<scope>runtime</scope>
|
||||||
|
</dependencySet>
|
||||||
|
</dependencySets>
|
||||||
|
<files>
|
||||||
|
<file>
|
||||||
|
<source>target/bench4q-agent.jar</source>
|
||||||
|
<outputDirectory>/</outputDirectory>
|
||||||
|
</file>
|
||||||
|
</files>
|
||||||
|
</assembly>
|
|
@ -0,0 +1,124 @@
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<groupId>org.bench4q</groupId>
|
||||||
|
<artifactId>bench4q-agent</artifactId>
|
||||||
|
<packaging>jar</packaging>
|
||||||
|
<version>0.0.1-SNAPSHOT</version>
|
||||||
|
<name>Bench4Q Agent</name>
|
||||||
|
<description>Bench4Q Agent</description>
|
||||||
|
<organization>
|
||||||
|
<name>TCSE, ISCAS</name>
|
||||||
|
</organization>
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>junit</groupId>
|
||||||
|
<artifactId>junit</artifactId>
|
||||||
|
<version>4.11</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.eclipse.jetty</groupId>
|
||||||
|
<artifactId>jetty-server</artifactId>
|
||||||
|
<version>9.1.0.RC2</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.eclipse.jetty</groupId>
|
||||||
|
<artifactId>jetty-servlet</artifactId>
|
||||||
|
<version>9.1.0.RC2</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework</groupId>
|
||||||
|
<artifactId>spring-webmvc</artifactId>
|
||||||
|
<version>3.2.4.RELEASE</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.codehaus.jackson</groupId>
|
||||||
|
<artifactId>jackson-core-lgpl</artifactId>
|
||||||
|
<version>1.9.13</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.codehaus.jackson</groupId>
|
||||||
|
<artifactId>jackson-mapper-asl</artifactId>
|
||||||
|
<version>1.9.13</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.hadoop</groupId>
|
||||||
|
<artifactId>hadoop-core</artifactId>
|
||||||
|
<version>1.1.2</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>log4j</groupId>
|
||||||
|
<artifactId>log4j</artifactId>
|
||||||
|
<version>1.2.17</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.bench4q</groupId>
|
||||||
|
<artifactId>bench4q-share</artifactId>
|
||||||
|
<version>0.0.1-SNAPSHOT</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework</groupId>
|
||||||
|
<artifactId>spring-core</artifactId>
|
||||||
|
<version>3.2.5.RELEASE</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework</groupId>
|
||||||
|
<artifactId>spring-test</artifactId>
|
||||||
|
<version>3.2.5.RELEASE</version>
|
||||||
|
</dependency>
|
||||||
|
<!--Start: for upload file -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>commons-fileupload</groupId>
|
||||||
|
<artifactId>commons-fileupload</artifactId>
|
||||||
|
<version>1.2</version>
|
||||||
|
</dependency>
|
||||||
|
<!--End : for upload file -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>commons-io</groupId>
|
||||||
|
<artifactId>commons-io</artifactId>
|
||||||
|
<version>2.4</version>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<artifactId>maven-jar-plugin</artifactId>
|
||||||
|
<configuration>
|
||||||
|
<archive>
|
||||||
|
<manifest>
|
||||||
|
<mainClass>org.bench4q.agent.Main</mainClass>
|
||||||
|
<addClasspath>true</addClasspath>
|
||||||
|
<classpathPrefix>lib/</classpathPrefix>
|
||||||
|
</manifest>
|
||||||
|
</archive>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<artifactId>maven-assembly-plugin</artifactId>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>make-zip</id>
|
||||||
|
<phase>package</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>single</goal>
|
||||||
|
</goals>
|
||||||
|
<configuration>
|
||||||
|
<descriptors>
|
||||||
|
<descriptor>descriptor.xml</descriptor>
|
||||||
|
</descriptors>
|
||||||
|
</configuration>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-surefire-plugin</artifactId>
|
||||||
|
<configuration>
|
||||||
|
<skip>true</skip>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
<finalName>bench4q-agent</finalName>
|
||||||
|
</build>
|
||||||
|
</project>
|
|
@ -0,0 +1,64 @@
|
||||||
|
package org.bench4q.agent;
|
||||||
|
|
||||||
|
import org.eclipse.jetty.server.Server;
|
||||||
|
import org.eclipse.jetty.servlet.ServletContextHandler;
|
||||||
|
import org.eclipse.jetty.servlet.ServletHolder;
|
||||||
|
import org.springframework.web.servlet.DispatcherServlet;
|
||||||
|
|
||||||
|
public class AgentServer {
|
||||||
|
private Server server;
|
||||||
|
private int port;
|
||||||
|
|
||||||
|
private Server getServer() {
|
||||||
|
return server;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setServer(Server server) {
|
||||||
|
this.server = server;
|
||||||
|
}
|
||||||
|
|
||||||
|
private int getPort() {
|
||||||
|
return port;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setPort(int port) {
|
||||||
|
this.port = port;
|
||||||
|
}
|
||||||
|
|
||||||
|
public AgentServer(int port) {
|
||||||
|
this.setPort(port);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean start() {
|
||||||
|
try {
|
||||||
|
this.setServer(new Server(this.getPort()));
|
||||||
|
ServletContextHandler servletContextHandler = new ServletContextHandler();
|
||||||
|
ServletHolder servletHolder = servletContextHandler.addServlet(
|
||||||
|
DispatcherServlet.class, "/");
|
||||||
|
servletHolder
|
||||||
|
.setInitParameter("contextConfigLocation",
|
||||||
|
"classpath*:/org/bench4q/agent/config/application-context.xml");
|
||||||
|
servletHolder.setInitOrder(1);
|
||||||
|
this.getServer().setHandler(servletContextHandler);
|
||||||
|
this.getServer().start();
|
||||||
|
return true;
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean stop() {
|
||||||
|
try {
|
||||||
|
if (this.getServer() != null) {
|
||||||
|
this.getServer().stop();
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return false;
|
||||||
|
} finally {
|
||||||
|
this.setServer(null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,86 @@
|
||||||
|
package org.bench4q.agent;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.Properties;
|
||||||
|
|
||||||
|
import org.apache.log4j.Logger;
|
||||||
|
|
||||||
|
public class Main {
|
||||||
|
private static final String CONFIG_FILE_NAME = "agent-config.properties";
|
||||||
|
private static String DIR_PATH = "configure"
|
||||||
|
+ System.getProperty("file.separator");
|
||||||
|
private static Logger logger = Logger.getLogger(Main.class);
|
||||||
|
private static int PORT_TO_SERVE;
|
||||||
|
public static boolean IS_TO_SAVE_DETAIL;
|
||||||
|
public static String USER_DEFINED_PARAMS_FOLDER;
|
||||||
|
|
||||||
|
static {
|
||||||
|
init();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
AgentServer agentServer = new AgentServer(PORT_TO_SERVE);
|
||||||
|
agentServer.start();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void init() {
|
||||||
|
guardConfigureExists();
|
||||||
|
initProperties();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void guardConfigureExists() {
|
||||||
|
File dirFile = new File(DIR_PATH);
|
||||||
|
if (!dirFile.exists()) {
|
||||||
|
dirFile.mkdirs();
|
||||||
|
}
|
||||||
|
File configFile = new File(DIR_PATH + CONFIG_FILE_NAME);
|
||||||
|
if (!configFile.exists()) {
|
||||||
|
createDefaultConfig(configFile);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void createDefaultConfig(File configFile) {
|
||||||
|
try {
|
||||||
|
if (configFile.createNewFile()) {
|
||||||
|
FileOutputStream outputStream = new FileOutputStream(configFile);
|
||||||
|
String content = "isToSaveDetailResult=false" + "\n"
|
||||||
|
+ "servePort=6565" + "\n"
|
||||||
|
+ "userDefinedParamFolder=userDefinedParams";
|
||||||
|
outputStream.write(content.getBytes());
|
||||||
|
outputStream.flush();
|
||||||
|
outputStream.close();
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void initProperties() {
|
||||||
|
try {
|
||||||
|
FileInputStream inputStream = new FileInputStream(new File(DIR_PATH
|
||||||
|
+ CONFIG_FILE_NAME));
|
||||||
|
Properties properties = new Properties();
|
||||||
|
properties.load(inputStream);
|
||||||
|
PORT_TO_SERVE = Integer.parseInt((String) properties
|
||||||
|
.get("servePort"));
|
||||||
|
IS_TO_SAVE_DETAIL = Boolean.parseBoolean((String) properties
|
||||||
|
.get("isToSaveDetailResult"));
|
||||||
|
USER_DEFINED_PARAMS_FOLDER = properties
|
||||||
|
.getProperty("userDefinedParamFolder");
|
||||||
|
guardUserDefinedFolderExists();
|
||||||
|
} catch (IOException e) {
|
||||||
|
logger.error("There is an error when getPortToServe!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void guardUserDefinedFolderExists() {
|
||||||
|
File dirFile = new File(USER_DEFINED_PARAMS_FOLDER
|
||||||
|
+ System.getProperty("file.separator"));
|
||||||
|
if (!dirFile.exists()) {
|
||||||
|
dirFile.mkdirs();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,49 @@
|
||||||
|
package org.bench4q.agent.api;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
import org.bench4q.agent.scenario.ScenarioContext;
|
||||||
|
import org.bench4q.agent.scenario.ScenarioEngine;
|
||||||
|
import org.bench4q.share.models.agent.ServerStatusModel;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Controller;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMethod;
|
||||||
|
import org.springframework.web.bind.annotation.ResponseBody;
|
||||||
|
|
||||||
|
@Controller
|
||||||
|
@RequestMapping("/")
|
||||||
|
public class HomeController {
|
||||||
|
private ScenarioEngine scenarioEngine;
|
||||||
|
|
||||||
|
private ScenarioEngine getScenarioEngine() {
|
||||||
|
return scenarioEngine;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private void setScenarioEngine(ScenarioEngine scenarioEngine) {
|
||||||
|
this.scenarioEngine = scenarioEngine;
|
||||||
|
}
|
||||||
|
|
||||||
|
@RequestMapping(method = { RequestMethod.GET, RequestMethod.POST })
|
||||||
|
@ResponseBody
|
||||||
|
public ServerStatusModel index() {
|
||||||
|
ServerStatusModel serverStatusModel = new ServerStatusModel();
|
||||||
|
serverStatusModel.setFinishedTests(new ArrayList<UUID>());
|
||||||
|
serverStatusModel.setRunningTests(new ArrayList<UUID>());
|
||||||
|
Map<UUID, ScenarioContext> contexts = new HashMap<UUID, ScenarioContext>(
|
||||||
|
getScenarioEngine().getRunningTests());
|
||||||
|
for (UUID key : contexts.keySet()) {
|
||||||
|
ScenarioContext value = contexts.get(key);
|
||||||
|
if (value.isFinished()) {
|
||||||
|
serverStatusModel.getFinishedTests().add(key);
|
||||||
|
} else {
|
||||||
|
serverStatusModel.getRunningTests().add(key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return serverStatusModel;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,81 @@
|
||||||
|
package org.bench4q.agent.api;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.bench4q.agent.plugin.BehaviorInfo;
|
||||||
|
import org.bench4q.agent.plugin.ParameterInfo;
|
||||||
|
import org.bench4q.agent.plugin.PluginInfo;
|
||||||
|
import org.bench4q.agent.plugin.PluginManager;
|
||||||
|
import org.bench4q.share.models.agent.BehaviorInfoModel;
|
||||||
|
import org.bench4q.share.models.agent.ParameterInfoModel;
|
||||||
|
import org.bench4q.share.models.agent.PluginInfoListModel;
|
||||||
|
import org.bench4q.share.models.agent.PluginInfoModel;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Controller;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMethod;
|
||||||
|
import org.springframework.web.bind.annotation.ResponseBody;
|
||||||
|
|
||||||
|
@Controller
|
||||||
|
@RequestMapping("/plugin")
|
||||||
|
public class PluginController {
|
||||||
|
private PluginManager pluginManager;
|
||||||
|
|
||||||
|
public PluginManager getPluginManager() {
|
||||||
|
return pluginManager;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
public void setPluginManager(PluginManager pluginManager) {
|
||||||
|
this.pluginManager = pluginManager;
|
||||||
|
}
|
||||||
|
|
||||||
|
@RequestMapping(method = RequestMethod.GET)
|
||||||
|
@ResponseBody
|
||||||
|
public PluginInfoListModel list() {
|
||||||
|
List<PluginInfo> pluginInfos = this.getPluginManager().getPluginInfo();
|
||||||
|
PluginInfoListModel pluginInfoListModel = new PluginInfoListModel();
|
||||||
|
pluginInfoListModel.setPlugins(new ArrayList<PluginInfoModel>());
|
||||||
|
for (PluginInfo pluginInfo : pluginInfos) {
|
||||||
|
PluginInfoModel pluginInfoModel = buildPluginInfoModel(pluginInfo);
|
||||||
|
pluginInfoListModel.getPlugins().add(pluginInfoModel);
|
||||||
|
}
|
||||||
|
return pluginInfoListModel;
|
||||||
|
}
|
||||||
|
|
||||||
|
private PluginInfoModel buildPluginInfoModel(PluginInfo pluginInfo) {
|
||||||
|
PluginInfoModel pluginInfoModel = new PluginInfoModel();
|
||||||
|
pluginInfoModel.setName(pluginInfo.getName());
|
||||||
|
pluginInfoModel.setParameters(new ArrayList<ParameterInfoModel>());
|
||||||
|
for (ParameterInfo param : pluginInfo.getParameters()) {
|
||||||
|
ParameterInfoModel model = buildParameterInfoModel(param);
|
||||||
|
pluginInfoModel.getParameters().add(model);
|
||||||
|
}
|
||||||
|
pluginInfoModel.setBehaviors(new ArrayList<BehaviorInfoModel>());
|
||||||
|
for (BehaviorInfo behaviorInfo : pluginInfo.getBehaviors()) {
|
||||||
|
BehaviorInfoModel behaviorInfoModel = buildBehaviorInfoModel(behaviorInfo);
|
||||||
|
pluginInfoModel.getBehaviors().add(behaviorInfoModel);
|
||||||
|
}
|
||||||
|
return pluginInfoModel;
|
||||||
|
}
|
||||||
|
|
||||||
|
private BehaviorInfoModel buildBehaviorInfoModel(BehaviorInfo behaviorInfo) {
|
||||||
|
BehaviorInfoModel behaviorInfoModel = new BehaviorInfoModel();
|
||||||
|
behaviorInfoModel.setName(behaviorInfo.getName());
|
||||||
|
behaviorInfoModel.setParameters(new ArrayList<ParameterInfoModel>());
|
||||||
|
for (ParameterInfo param : behaviorInfo.getParameters()) {
|
||||||
|
ParameterInfoModel model = buildParameterInfoModel(param);
|
||||||
|
behaviorInfoModel.getParameters().add(model);
|
||||||
|
}
|
||||||
|
return behaviorInfoModel;
|
||||||
|
}
|
||||||
|
|
||||||
|
private ParameterInfoModel buildParameterInfoModel(ParameterInfo param) {
|
||||||
|
ParameterInfoModel model = new ParameterInfoModel();
|
||||||
|
model.setName(param.getName());
|
||||||
|
model.setType(param.getType());
|
||||||
|
return model;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,290 @@
|
||||||
|
package org.bench4q.agent.api;
|
||||||
|
|
||||||
|
import java.net.UnknownHostException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
import org.apache.log4j.Logger;
|
||||||
|
import org.bench4q.agent.datacollector.impl.BehaviorStatusCodeResult;
|
||||||
|
import org.bench4q.agent.parameterization.ParameterFileCollector;
|
||||||
|
import org.bench4q.agent.scenario.Scenario;
|
||||||
|
import org.bench4q.agent.scenario.ScenarioContext;
|
||||||
|
import org.bench4q.agent.scenario.ScenarioEngine;
|
||||||
|
import org.bench4q.agent.scenario.behavior.Behavior;
|
||||||
|
import org.bench4q.share.helper.MarshalHelper;
|
||||||
|
import org.bench4q.share.models.agent.BehaviorBriefModel;
|
||||||
|
import org.bench4q.share.models.agent.BehaviorStatusCodeResultModel;
|
||||||
|
import org.bench4q.share.models.agent.CleanTestResultModel;
|
||||||
|
import org.bench4q.share.models.agent.RunScenarioModel;
|
||||||
|
import org.bench4q.share.models.agent.RunScenarioResultModel;
|
||||||
|
import org.bench4q.share.models.agent.StopTestModel;
|
||||||
|
import org.bench4q.share.models.agent.TestBriefStatusModel;
|
||||||
|
import org.bench4q.share.models.agent.statistics.AgentBriefStatusModel;
|
||||||
|
import org.bench4q.share.models.agent.statistics.AgentBehaviorsBriefModel;
|
||||||
|
import org.bench4q.share.models.agent.statistics.AgentPageBriefModel;
|
||||||
|
import org.bench4q.share.models.agent.statistics.AgentPagesBriefModel;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Controller;
|
||||||
|
import org.springframework.web.bind.annotation.PathVariable;
|
||||||
|
import org.springframework.web.bind.annotation.RequestBody;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMethod;
|
||||||
|
import org.springframework.web.bind.annotation.RequestParam;
|
||||||
|
import org.springframework.web.bind.annotation.ResponseBody;
|
||||||
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
|
@Controller
|
||||||
|
@RequestMapping("/test")
|
||||||
|
public class TestController {
|
||||||
|
private ScenarioEngine scenarioEngine;
|
||||||
|
private ParameterFileCollector paramFileCollector;
|
||||||
|
private Logger logger = Logger.getLogger(TestController.class);
|
||||||
|
|
||||||
|
private Logger getLogger() {
|
||||||
|
return logger;
|
||||||
|
}
|
||||||
|
|
||||||
|
private ScenarioEngine getScenarioEngine() {
|
||||||
|
return scenarioEngine;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private void setScenarioEngine(ScenarioEngine scenarioEngine) {
|
||||||
|
this.scenarioEngine = scenarioEngine;
|
||||||
|
}
|
||||||
|
|
||||||
|
private ParameterFileCollector getParamFileCollector() {
|
||||||
|
return paramFileCollector;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private void setParamFileCollector(ParameterFileCollector paramFileCollector) {
|
||||||
|
this.paramFileCollector = paramFileCollector;
|
||||||
|
}
|
||||||
|
|
||||||
|
@RequestMapping(value = "/submitScenarioWithParams", method = RequestMethod.POST)
|
||||||
|
@ResponseBody
|
||||||
|
public String submitParams(
|
||||||
|
@RequestParam("files[]") List<MultipartFile> files,
|
||||||
|
@RequestParam("scenarioModel") String scenarioModel) {
|
||||||
|
try {
|
||||||
|
UUID runId = UUID.randomUUID();
|
||||||
|
this.getParamFileCollector().collectParamFiles(files, runId);
|
||||||
|
System.out.println(scenarioModel);
|
||||||
|
RunScenarioModel runScenarioModel = (RunScenarioModel) MarshalHelper
|
||||||
|
.unmarshal(RunScenarioModel.class, scenarioModel);
|
||||||
|
|
||||||
|
this.getScenarioEngine().submitScenario(runId,
|
||||||
|
Scenario.scenarioBuilder(runScenarioModel),
|
||||||
|
runScenarioModel.getPoolSize());
|
||||||
|
return MarshalHelper.tryMarshal(buildWith(runId));
|
||||||
|
} catch (Exception e) {
|
||||||
|
logger.error("/submitScenarioWithParams", e);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private RunScenarioResultModel buildWith(UUID runId) {
|
||||||
|
RunScenarioResultModel result = new RunScenarioResultModel();
|
||||||
|
result.setRunId(runId);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@RequestMapping(value = "/runWithParams/{runId}", method = RequestMethod.POST)
|
||||||
|
@ResponseBody
|
||||||
|
public RunScenarioResultModel runWithParams(@PathVariable UUID runId) {
|
||||||
|
return this.getScenarioEngine().runWith(runId) ? buildWith(runId)
|
||||||
|
: null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@RequestMapping(value = "/runWithoutParams", method = RequestMethod.POST)
|
||||||
|
@ResponseBody
|
||||||
|
public RunScenarioResultModel run(
|
||||||
|
@RequestBody RunScenarioModel runScenarioModel)
|
||||||
|
throws UnknownHostException {
|
||||||
|
Scenario scenario = Scenario.scenarioBuilder(runScenarioModel);
|
||||||
|
UUID runId = UUID.randomUUID();
|
||||||
|
System.out.println(runScenarioModel.getPoolSize());
|
||||||
|
this.getLogger().info(MarshalHelper.tryMarshal(runScenarioModel));
|
||||||
|
if (runScenarioModel.getPoolSize() <= 0) {
|
||||||
|
logger.info("This RunScenarioModel's pool size is L.E zero, so throw out");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
this.getScenarioEngine().submitScenario(runId, scenario,
|
||||||
|
runScenarioModel.getPoolSize());
|
||||||
|
|
||||||
|
this.getScenarioEngine().runWith(runId);
|
||||||
|
RunScenarioResultModel runScenarioResultModel = new RunScenarioResultModel();
|
||||||
|
runScenarioResultModel.setRunId(runId);
|
||||||
|
return runScenarioResultModel;
|
||||||
|
}
|
||||||
|
|
||||||
|
@RequestMapping(value = "/briefAll/{runId}", method = RequestMethod.GET)
|
||||||
|
@ResponseBody
|
||||||
|
public TestBriefStatusModel briefAll(@PathVariable UUID runId) {
|
||||||
|
TestBriefStatusModel result = new TestBriefStatusModel();
|
||||||
|
result.setScenarioBriefModel(this.brief(runId));
|
||||||
|
result.setPagesBriefModel(this.pagesBrief(runId));
|
||||||
|
result.setBehaviorsBriefModel(this.behaviorsBrief(runId));
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@RequestMapping(value = "/brief/{runId}/{behaviorId}", method = RequestMethod.GET)
|
||||||
|
@ResponseBody
|
||||||
|
public BehaviorBriefModel behaviorBrief(@PathVariable UUID runId,
|
||||||
|
@PathVariable int behaviorId) {
|
||||||
|
ScenarioContext scenarioContext = this.getScenarioEngine()
|
||||||
|
.getRunningTests().get(runId);
|
||||||
|
if (scenarioContext == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
Map<Integer, BehaviorStatusCodeResult> map = scenarioContext
|
||||||
|
.getDataStatistics().getBehaviorBriefStatistics(behaviorId);
|
||||||
|
return buildBehaviorBrief(runId, behaviorId, "", map);
|
||||||
|
}
|
||||||
|
|
||||||
|
private BehaviorBriefModel buildBehaviorBrief(UUID runId, int behaviorId,
|
||||||
|
String behaviorUrl, Map<Integer, BehaviorStatusCodeResult> map) {
|
||||||
|
List<BehaviorStatusCodeResultModel> detailStatusCodeResultModels = new ArrayList<BehaviorStatusCodeResultModel>();
|
||||||
|
for (int statusCode : map.keySet()) {
|
||||||
|
BehaviorStatusCodeResultModel behaviorStatusCodeResultModel = new BehaviorStatusCodeResultModel();
|
||||||
|
BehaviorStatusCodeResult detailStatusCodeResult = map
|
||||||
|
.get(statusCode);
|
||||||
|
behaviorStatusCodeResultModel.setStatusCode(statusCode);
|
||||||
|
behaviorStatusCodeResultModel
|
||||||
|
.setCount(detailStatusCodeResult.count);
|
||||||
|
behaviorStatusCodeResultModel
|
||||||
|
.setContentLength(detailStatusCodeResult.contentLength);
|
||||||
|
behaviorStatusCodeResultModel
|
||||||
|
.setMinResponseTime(detailStatusCodeResult.minResponseTime);
|
||||||
|
behaviorStatusCodeResultModel
|
||||||
|
.setMaxResponseTime(detailStatusCodeResult.maxResponseTime);
|
||||||
|
behaviorStatusCodeResultModel
|
||||||
|
.setContentType(detailStatusCodeResult.contentType);
|
||||||
|
behaviorStatusCodeResultModel
|
||||||
|
.setTotalResponseTimeThisTime(detailStatusCodeResult.totalResponseTimeThisTime);
|
||||||
|
detailStatusCodeResultModels.add(behaviorStatusCodeResultModel);
|
||||||
|
}
|
||||||
|
BehaviorBriefModel behaviorBriefModel = new BehaviorBriefModel();
|
||||||
|
behaviorBriefModel.setBehaviorId(behaviorId);
|
||||||
|
behaviorBriefModel
|
||||||
|
.setDetailStatusCodeResultModels(detailStatusCodeResultModels);
|
||||||
|
behaviorBriefModel.setBehaviorUrl(behaviorUrl);
|
||||||
|
return behaviorBriefModel;
|
||||||
|
}
|
||||||
|
|
||||||
|
@RequestMapping(value = "/pagesBrief/{runId}")
|
||||||
|
@ResponseBody
|
||||||
|
public AgentPagesBriefModel pagesBrief(@PathVariable UUID runId) {
|
||||||
|
ScenarioContext context = this.getScenarioEngine().getRunningTests()
|
||||||
|
.get(runId);
|
||||||
|
AgentPagesBriefModel result = new AgentPagesBriefModel();
|
||||||
|
List<AgentPageBriefModel> pageBrieves = new ArrayList<AgentPageBriefModel>();
|
||||||
|
|
||||||
|
if (context == null || context.isFinished()) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
for (int i = 0; i < context.getScenario().getPages().length; i++) {
|
||||||
|
pageBrieves.add((AgentPageBriefModel) context.getDataStatistics()
|
||||||
|
.getPageBriefStatistics(i));
|
||||||
|
}
|
||||||
|
result.setPageBriefModels(pageBrieves);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@RequestMapping(value = "/pageBrief/{runId}/{pageId}")
|
||||||
|
@ResponseBody
|
||||||
|
public AgentPageBriefModel pageBrief(@PathVariable UUID runId,
|
||||||
|
@PathVariable int pageId) {
|
||||||
|
ScenarioContext context = this.getScenarioEngine().getRunningTests()
|
||||||
|
.get(runId);
|
||||||
|
if (context == null || context.isFinished()) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return (AgentPageBriefModel) context.getDataStatistics()
|
||||||
|
.getPageBriefStatistics(pageId);
|
||||||
|
}
|
||||||
|
|
||||||
|
@RequestMapping(value = "/behaviorsBrief/{runId}")
|
||||||
|
@ResponseBody
|
||||||
|
public AgentBehaviorsBriefModel behaviorsBrief(@PathVariable UUID runId) {
|
||||||
|
AgentBehaviorsBriefModel ret = new AgentBehaviorsBriefModel();
|
||||||
|
List<BehaviorBriefModel> behaviorBriefModels = new ArrayList<BehaviorBriefModel>();
|
||||||
|
ScenarioContext scenarioContext = this.getScenarioEngine()
|
||||||
|
.getRunningTests().get(runId);
|
||||||
|
if (scenarioContext == null || scenarioContext.isFinished()) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
for (Behavior behavior : scenarioContext.getScenario()
|
||||||
|
.getAllBehaviorsInScenario()) {
|
||||||
|
int behaviorId = behavior.getId();
|
||||||
|
Map<Integer, BehaviorStatusCodeResult> map = behavior
|
||||||
|
.getBehaviorBriefResult(scenarioContext.getDataStatistics());
|
||||||
|
if (map == null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
behaviorBriefModels.add(buildBehaviorBrief(runId, behaviorId,
|
||||||
|
behavior.getUrl(), map));
|
||||||
|
}
|
||||||
|
ret.setBehaviorBriefModels(behaviorBriefModels);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
@RequestMapping(value = "/brief/{runId}", method = RequestMethod.GET)
|
||||||
|
@ResponseBody
|
||||||
|
public AgentBriefStatusModel brief(@PathVariable UUID runId) {
|
||||||
|
ScenarioContext scenarioContext = this.getScenarioEngine()
|
||||||
|
.getRunningTests().get(runId);
|
||||||
|
if (scenarioContext == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
AgentBriefStatusModel agentStatusModel = (AgentBriefStatusModel) scenarioContext
|
||||||
|
.getDataStatistics().getScenarioBriefStatistics();
|
||||||
|
agentStatusModel.setvUserCount(scenarioContext.getExecutor()
|
||||||
|
.getActiveCount());
|
||||||
|
return agentStatusModel;
|
||||||
|
}
|
||||||
|
|
||||||
|
@RequestMapping(value = "/stop/{runId}", method = { RequestMethod.GET,
|
||||||
|
RequestMethod.POST })
|
||||||
|
@ResponseBody
|
||||||
|
public StopTestModel stop(@PathVariable UUID runId) {
|
||||||
|
System.out.println("stop method");
|
||||||
|
ScenarioContext scenarioContext = this.getScenarioEngine()
|
||||||
|
.getRunningTests().get(runId);
|
||||||
|
if (scenarioContext == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
scenarioContext.setEndDate(new Date(System.currentTimeMillis()));
|
||||||
|
System.out.println("when before stop, classId:"
|
||||||
|
+ scenarioContext.getExecutor().toString());
|
||||||
|
scenarioContext.getExecutor().shutdown();
|
||||||
|
scenarioContext.getExecutor().shutdownNow();
|
||||||
|
System.out.println("when after stop, classId:"
|
||||||
|
+ scenarioContext.getExecutor().toString());
|
||||||
|
scenarioContext.setFinished(true);
|
||||||
|
StopTestModel stopTestModel = new StopTestModel();
|
||||||
|
stopTestModel.setSuccess(true);
|
||||||
|
clean(runId);
|
||||||
|
return stopTestModel;
|
||||||
|
}
|
||||||
|
|
||||||
|
@RequestMapping(value = "/clean/{runId}", method = RequestMethod.GET)
|
||||||
|
@ResponseBody
|
||||||
|
public CleanTestResultModel clean(@PathVariable UUID runId) {
|
||||||
|
ScenarioContext scenarioContext = this.getScenarioEngine()
|
||||||
|
.getRunningTests().get(runId);
|
||||||
|
if (scenarioContext == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
scenarioContext.getExecutor().shutdownNow();
|
||||||
|
this.getScenarioEngine().getRunningTests().remove(runId);
|
||||||
|
System.gc();
|
||||||
|
CleanTestResultModel cleanTestResultModel = new CleanTestResultModel();
|
||||||
|
cleanTestResultModel.setSuccess(true);
|
||||||
|
return cleanTestResultModel;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,20 @@
|
||||||
|
package org.bench4q.agent.datacollector;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.bench4q.agent.datacollector.impl.BehaviorStatusCodeResult;
|
||||||
|
import org.bench4q.agent.scenario.BehaviorResult;
|
||||||
|
import org.bench4q.agent.scenario.PageResult;
|
||||||
|
|
||||||
|
public interface DataCollector {
|
||||||
|
public void add(BehaviorResult behaviorResult);
|
||||||
|
|
||||||
|
public void add(PageResult pageResult);
|
||||||
|
|
||||||
|
public Object getScenarioBriefStatistics();
|
||||||
|
|
||||||
|
public Map<Integer, BehaviorStatusCodeResult> getBehaviorBriefStatistics(
|
||||||
|
int behaviorId);
|
||||||
|
|
||||||
|
public Object getPageBriefStatistics(int pageId);
|
||||||
|
}
|
|
@ -0,0 +1,82 @@
|
||||||
|
package org.bench4q.agent.datacollector.impl;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.concurrent.ExecutorService;
|
||||||
|
import java.util.concurrent.Executors;
|
||||||
|
|
||||||
|
import org.bench4q.agent.Main;
|
||||||
|
import org.bench4q.agent.datacollector.DataCollector;
|
||||||
|
import org.bench4q.agent.helper.ApplicationContextHelper;
|
||||||
|
import org.bench4q.agent.scenario.BehaviorResult;
|
||||||
|
import org.bench4q.agent.storage.StorageHelper;
|
||||||
|
import org.bench4q.share.models.agent.BehaviorResultModel;
|
||||||
|
|
||||||
|
public abstract class AbstractDataCollector implements DataCollector {
|
||||||
|
protected StorageHelper storageHelper;
|
||||||
|
|
||||||
|
protected StorageHelper getStorageHelper() {
|
||||||
|
return storageHelper;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setStorageHelper(StorageHelper storageHelper) {
|
||||||
|
this.storageHelper = storageHelper;
|
||||||
|
}
|
||||||
|
|
||||||
|
public AbstractDataCollector() {
|
||||||
|
mustDoWhenIniti();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Each sub class should call this in their constructor
|
||||||
|
protected void mustDoWhenIniti() {
|
||||||
|
this.setStorageHelper(ApplicationContextHelper.getContext().getBean(
|
||||||
|
StorageHelper.class));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void add(final BehaviorResult behaviorResult) {
|
||||||
|
if (!Main.IS_TO_SAVE_DETAIL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (behaviorResult == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Runnable runnable = new Runnable() {
|
||||||
|
public void run() {
|
||||||
|
storageHelper.getLocalStorage().writeFile(
|
||||||
|
buildBehaviorResultModel(behaviorResult)
|
||||||
|
.getModelString(),
|
||||||
|
calculateSavePath(behaviorResult));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
ExecutorService executorService = Executors
|
||||||
|
.newSingleThreadScheduledExecutor();
|
||||||
|
executorService.execute(runnable);
|
||||||
|
executorService.shutdown();
|
||||||
|
}
|
||||||
|
|
||||||
|
private BehaviorResultModel buildBehaviorResultModel(
|
||||||
|
BehaviorResult behaviorResult) {
|
||||||
|
BehaviorResultModel resultModel = new BehaviorResultModel();
|
||||||
|
resultModel.setBehaviorId(behaviorResult.getBehaviorId());
|
||||||
|
resultModel.setBehaviorName(behaviorResult.getBehaviorName());
|
||||||
|
resultModel.setContentLength(behaviorResult.getContentLength());
|
||||||
|
resultModel.setContentType(behaviorResult.getContentType());
|
||||||
|
resultModel.setEndDate(behaviorResult.getEndDate());
|
||||||
|
resultModel.setPluginId(behaviorResult.getPluginId());
|
||||||
|
resultModel.setPluginName(behaviorResult.getPluginName());
|
||||||
|
resultModel.setResponseTime(behaviorResult.getResponseTime());
|
||||||
|
resultModel.setShouldBeCountResponseTime(behaviorResult
|
||||||
|
.isShouldBeCountResponseTime());
|
||||||
|
resultModel.setStartDate(behaviorResult.getStartDate());
|
||||||
|
resultModel.setStatusCode(behaviorResult.getStatusCode());
|
||||||
|
resultModel.setSuccess(behaviorResult.isSuccess());
|
||||||
|
return resultModel;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected abstract String calculateSavePath(BehaviorResult behaviorResult);
|
||||||
|
|
||||||
|
public abstract Object getScenarioBriefStatistics();
|
||||||
|
|
||||||
|
public abstract Map<Integer, BehaviorStatusCodeResult> getBehaviorBriefStatistics(
|
||||||
|
int id);
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,5 @@
|
||||||
|
package org.bench4q.agent.datacollector.impl;
|
||||||
|
|
||||||
|
public class BehaviorResultCollector {
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,52 @@
|
||||||
|
package org.bench4q.agent.datacollector.impl;
|
||||||
|
|
||||||
|
import java.lang.reflect.Field;
|
||||||
|
|
||||||
|
public class BehaviorStatusCodeResult {
|
||||||
|
public long count;
|
||||||
|
public long contentLength;
|
||||||
|
public long minResponseTime;
|
||||||
|
public long maxResponseTime;
|
||||||
|
public long totalResponseTimeThisTime;
|
||||||
|
public String contentType;
|
||||||
|
|
||||||
|
public BehaviorStatusCodeResult(String contentType) {
|
||||||
|
this.totalResponseTimeThisTime = 0;
|
||||||
|
this.contentType = contentType;
|
||||||
|
this.count = 0;
|
||||||
|
this.contentLength = 0;
|
||||||
|
this.minResponseTime = Long.MAX_VALUE;
|
||||||
|
this.maxResponseTime = Long.MIN_VALUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isSuccess(int statusCode) {
|
||||||
|
return statusCode == 200;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean equals(Object expectedObj) {
|
||||||
|
Field[] fields = this.getClass().getDeclaredFields();
|
||||||
|
boolean equal = true;
|
||||||
|
try {
|
||||||
|
for (Field field : fields) {
|
||||||
|
field.setAccessible(true);
|
||||||
|
if (field.getName().equals("contentType")) {
|
||||||
|
field.get(expectedObj).equals(field.get(this));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (field.getLong(this) != field.getLong(expectedObj)) {
|
||||||
|
System.out.println(field.getName()
|
||||||
|
+ " is diferent, this is " + field.getLong(this)
|
||||||
|
+ ", and the expected is "
|
||||||
|
+ field.getLong(expectedObj));
|
||||||
|
equal = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
equal = false;
|
||||||
|
|
||||||
|
}
|
||||||
|
return equal;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,110 @@
|
||||||
|
package org.bench4q.agent.datacollector.impl;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.bench4q.agent.scenario.BehaviorResult;
|
||||||
|
import org.bench4q.agent.scenario.PageResult;
|
||||||
|
import org.bench4q.share.models.agent.statistics.AgentPageBriefModel;
|
||||||
|
|
||||||
|
public class PageResultCollector extends AbstractDataCollector {
|
||||||
|
Map<Integer, PageBrief> pageBriefMap;
|
||||||
|
|
||||||
|
private Map<Integer, PageBrief> getPageBriefMap() {
|
||||||
|
return pageBriefMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setPageBriefMap(Map<Integer, PageBrief> pageBriefMap) {
|
||||||
|
this.pageBriefMap = pageBriefMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
public PageResultCollector() {
|
||||||
|
this.setPageBriefMap(new HashMap<Integer, PageBrief>());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void add(PageResult pageResult) {
|
||||||
|
if (pageResult == null || pageResult.getPageId() < 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
PageBrief pageBrief = guardTheValueOfThePageIdExists(pageResult
|
||||||
|
.getPageId());
|
||||||
|
pageBrief.countThisTime++;
|
||||||
|
pageBrief.countFromBegin++;
|
||||||
|
pageBrief.totalResponseTimeThisTime += pageResult.getExecuteRange();
|
||||||
|
pageBrief.latesTimeResponseTime = pageResult.getExecuteRange();
|
||||||
|
if (pageResult.getExecuteRange() > pageBrief.maxResponseTimeFromBegin) {
|
||||||
|
pageBrief.maxResponseTimeFromBegin = pageResult.getExecuteRange();
|
||||||
|
}
|
||||||
|
if (pageResult.getExecuteRange() < pageBrief.minResponseTimeFromBegin) {
|
||||||
|
pageBrief.minResponseTimeFromBegin = pageResult.getExecuteRange();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private synchronized PageBrief guardTheValueOfThePageIdExists(int pageId) {
|
||||||
|
if (!this.getPageBriefMap().containsKey(pageId)) {
|
||||||
|
this.getPageBriefMap().put(pageId, new PageBrief());
|
||||||
|
}
|
||||||
|
return this.getPageBriefMap().get(pageId);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object getPageBriefStatistics(int pageId) {
|
||||||
|
PageBrief pageBrief = guardTheValueOfThePageIdExists(pageId);
|
||||||
|
AgentPageBriefModel result = new AgentPageBriefModel();
|
||||||
|
result.setCountFromBegin(pageBrief.countFromBegin);
|
||||||
|
result.setCountThisTime(pageBrief.countThisTime);
|
||||||
|
result.setMaxResponseTimeFromBegin(pageBrief.maxResponseTimeFromBegin);
|
||||||
|
result.setMinResponseTimeFromBegin(pageBrief.minResponseTimeFromBegin);
|
||||||
|
result.setTotalResponseTimeThisTime(pageBrief.totalResponseTimeThisTime);
|
||||||
|
result.setPageId(pageId);
|
||||||
|
long nowTime = new Date().getTime();
|
||||||
|
result.setTimeFrame(nowTime - pageBrief.lastSampleTime);
|
||||||
|
result.setLatestResponseTime(pageBrief.latesTimeResponseTime);
|
||||||
|
pageBrief.resetTemperatyField();
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void add(BehaviorResult behaviorResult) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String calculateSavePath(BehaviorResult behaviorResult) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object getScenarioBriefStatistics() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Map<Integer, BehaviorStatusCodeResult> getBehaviorBriefStatistics(
|
||||||
|
int id) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public class PageBrief {
|
||||||
|
public long lastSampleTime;
|
||||||
|
public long countThisTime;
|
||||||
|
public long totalResponseTimeThisTime;
|
||||||
|
public long maxResponseTimeFromBegin;
|
||||||
|
public long minResponseTimeFromBegin;
|
||||||
|
public long countFromBegin;
|
||||||
|
public long latesTimeResponseTime;
|
||||||
|
|
||||||
|
public PageBrief() {
|
||||||
|
resetTemperatyField();
|
||||||
|
this.maxResponseTimeFromBegin = Long.MIN_VALUE;
|
||||||
|
this.minResponseTimeFromBegin = Long.MAX_VALUE;
|
||||||
|
this.countFromBegin = 0;
|
||||||
|
this.latesTimeResponseTime = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void resetTemperatyField() {
|
||||||
|
this.lastSampleTime = new Date().getTime();
|
||||||
|
this.countThisTime = 0;
|
||||||
|
this.totalResponseTimeThisTime = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,278 @@
|
||||||
|
package org.bench4q.agent.datacollector.impl;
|
||||||
|
|
||||||
|
import java.text.SimpleDateFormat;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
import org.bench4q.agent.scenario.BehaviorResult;
|
||||||
|
import org.bench4q.agent.scenario.PageResult;
|
||||||
|
import org.bench4q.share.models.agent.statistics.AgentBriefStatusModel;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This class collect the behavior result and statistic it.
|
||||||
|
*
|
||||||
|
* @author coderfengyun
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class ScenarioResultCollector extends AbstractDataCollector {
|
||||||
|
private long timeOfPreviousCall;
|
||||||
|
private long failCountOfThisCall;
|
||||||
|
private long successCountOfThisCall;
|
||||||
|
private long totalResponseTimeOfThisCall;
|
||||||
|
private long maxResponseTimeOfThisCall;
|
||||||
|
private long minResponseTimeOfThisCall;
|
||||||
|
private long totalSqureResponseTimeOfThisCall;
|
||||||
|
private long cumulativeSucessfulCount;
|
||||||
|
private long cumulativeFailCount;
|
||||||
|
private static long TIME_UNIT = 1000;
|
||||||
|
private UUID testID;
|
||||||
|
private PageResultCollector pageResultCollector;
|
||||||
|
// The first integer is the behavior's id, and the second integer is
|
||||||
|
// the StatusCode of this behaviorResult.
|
||||||
|
private Map<Integer, Map<Integer, BehaviorStatusCodeResult>> detailMap;
|
||||||
|
|
||||||
|
private void setTimeOfPreviousCall(long timeOfPreviousCall) {
|
||||||
|
this.timeOfPreviousCall = timeOfPreviousCall;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setFailCountOfThisCall(long failCountOfThisCall) {
|
||||||
|
this.failCountOfThisCall = failCountOfThisCall;
|
||||||
|
}
|
||||||
|
|
||||||
|
private long getSuccessCountOfThisCall() {
|
||||||
|
return successCountOfThisCall;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setSuccessCountOfThisCall(long successCountOfThisCall) {
|
||||||
|
this.successCountOfThisCall = successCountOfThisCall;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setTotalResponseTimeOfThisCall(long totalResponseTimeOfThisCall) {
|
||||||
|
this.totalResponseTimeOfThisCall = totalResponseTimeOfThisCall;
|
||||||
|
}
|
||||||
|
|
||||||
|
private long getMaxResponseTimeOfThisCall() {
|
||||||
|
return maxResponseTimeOfThisCall;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setMaxResponseTimeOfThisCall(long maxResponseTimeOfThisCall) {
|
||||||
|
this.maxResponseTimeOfThisCall = maxResponseTimeOfThisCall;
|
||||||
|
}
|
||||||
|
|
||||||
|
private long getMinResponseTimeOfThisCall() {
|
||||||
|
return minResponseTimeOfThisCall;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setMinResponseTimeOfThisCall(long minResponseTimeOfThisCall) {
|
||||||
|
this.minResponseTimeOfThisCall = minResponseTimeOfThisCall;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setTotalSqureResponseTimeOfThisCall(
|
||||||
|
long totalSqureResponseTimeOfThisCall) {
|
||||||
|
this.totalSqureResponseTimeOfThisCall = totalSqureResponseTimeOfThisCall;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setCumulativeSucessfulCount(long cumulativeSucessfulCount) {
|
||||||
|
this.cumulativeSucessfulCount = cumulativeSucessfulCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setCumulativeFailCount(long cumulativeFailCount) {
|
||||||
|
this.cumulativeFailCount = cumulativeFailCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getTestID() {
|
||||||
|
return testID == null ? "default" : testID.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setTestID(UUID testID) {
|
||||||
|
this.testID = testID;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setDetailMap(
|
||||||
|
Map<Integer, Map<Integer, BehaviorStatusCodeResult>> detailMap) {
|
||||||
|
this.detailMap = detailMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
private PageResultCollector getPageResultCollector() {
|
||||||
|
return pageResultCollector;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setPageResultCollector(PageResultCollector pageResultCollector) {
|
||||||
|
this.pageResultCollector = pageResultCollector;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ScenarioResultCollector(UUID testId) {
|
||||||
|
this.setTestID(testId);
|
||||||
|
this.setPageResultCollector(new PageResultCollector());
|
||||||
|
init();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void init() {
|
||||||
|
reset();
|
||||||
|
this.setCumulativeFailCount(0);
|
||||||
|
this.setCumulativeSucessfulCount(0);
|
||||||
|
this.setDetailMap(new HashMap<Integer, Map<Integer, BehaviorStatusCodeResult>>());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void reset() {
|
||||||
|
this.setTimeOfPreviousCall(System.currentTimeMillis());
|
||||||
|
this.setFailCountOfThisCall(0);
|
||||||
|
this.setMaxResponseTimeOfThisCall(Long.MIN_VALUE);
|
||||||
|
this.setMinResponseTimeOfThisCall(Long.MAX_VALUE);
|
||||||
|
this.setSuccessCountOfThisCall(0);
|
||||||
|
this.setTotalResponseTimeOfThisCall(0);
|
||||||
|
this.setTotalSqureResponseTimeOfThisCall(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ///////////////////////////////
|
||||||
|
// DataStatistics Interface start
|
||||||
|
// ///////////////////////////////
|
||||||
|
|
||||||
|
public AgentBriefStatusModel getScenarioBriefStatistics() {
|
||||||
|
AgentBriefStatusModel result = new AgentBriefStatusModel();
|
||||||
|
result.setTimeFrame(System.currentTimeMillis()
|
||||||
|
- this.timeOfPreviousCall);
|
||||||
|
if (this.getSuccessCountOfThisCall() == 0) {
|
||||||
|
result.setMaxResponseTime(0);
|
||||||
|
result.setMinResponseTime(0);
|
||||||
|
} else {
|
||||||
|
result.setMinResponseTime(this.minResponseTimeOfThisCall);
|
||||||
|
result.setMaxResponseTime(this.maxResponseTimeOfThisCall);
|
||||||
|
}
|
||||||
|
this.cumulativeSucessfulCount += this.successCountOfThisCall;
|
||||||
|
result.setSuccessCountFromBegin(this.cumulativeSucessfulCount);
|
||||||
|
this.cumulativeFailCount += this.failCountOfThisCall;
|
||||||
|
result.setFailCountFromBegin(this.cumulativeFailCount);
|
||||||
|
if (result.getTimeFrame() == 0) {
|
||||||
|
result.setSuccessThroughputThisTime(0);
|
||||||
|
result.setFailThroughputThisTime(0);
|
||||||
|
} else {
|
||||||
|
result.setSuccessThroughputThisTime(this.successCountOfThisCall
|
||||||
|
* TIME_UNIT / result.getTimeFrame());
|
||||||
|
result.setFailThroughputThisTime(this.failCountOfThisCall
|
||||||
|
* TIME_UNIT / result.getTimeFrame());
|
||||||
|
}
|
||||||
|
result.setTotalResponseTimeThisTime(this.totalResponseTimeOfThisCall);
|
||||||
|
result.setSuccessCountThisTime(this.successCountOfThisCall);
|
||||||
|
result.setFailCountThisTime(this.failCountOfThisCall);
|
||||||
|
result.setTotalSqureResponseTimeThisTime(this.totalSqureResponseTimeOfThisCall);
|
||||||
|
reset();
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ///////////////////////////////
|
||||||
|
// DataStatistics Interface end
|
||||||
|
// ///////////////////////////////
|
||||||
|
/**
|
||||||
|
* For the failed one, only the fail count statistics will be added, Others
|
||||||
|
* of this failed one will be ignored.
|
||||||
|
*
|
||||||
|
* @param behaviorResult
|
||||||
|
*/
|
||||||
|
|
||||||
|
private void statisticScenarioBriefResult(BehaviorResult behaviorResult) {
|
||||||
|
if (behaviorResult.isSuccess()) {
|
||||||
|
this.successCountOfThisCall++;
|
||||||
|
this.totalResponseTimeOfThisCall += behaviorResult
|
||||||
|
.getResponseTime();
|
||||||
|
this.totalSqureResponseTimeOfThisCall += ((long) behaviorResult
|
||||||
|
.getResponseTime()) * behaviorResult.getResponseTime();
|
||||||
|
if (behaviorResult.getResponseTime() > this
|
||||||
|
.getMaxResponseTimeOfThisCall()) {
|
||||||
|
this.setMaxResponseTimeOfThisCall(behaviorResult
|
||||||
|
.getResponseTime());
|
||||||
|
}
|
||||||
|
if (behaviorResult.getResponseTime() < this
|
||||||
|
.getMinResponseTimeOfThisCall()) {
|
||||||
|
this.setMinResponseTimeOfThisCall(behaviorResult
|
||||||
|
.getResponseTime());
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
this.failCountOfThisCall++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void statisticBehaviorBriefResult(BehaviorResult behaviorResult) {
|
||||||
|
insertWhenNotExist(behaviorResult);
|
||||||
|
Map<Integer, BehaviorStatusCodeResult> detailStatusMap = this.detailMap
|
||||||
|
.get(behaviorResult.getBehaviorId());
|
||||||
|
// TODO: there's a problem about concurrency
|
||||||
|
guardStatusMapExists(behaviorResult, detailStatusMap);
|
||||||
|
BehaviorStatusCodeResult statusCodeResult = detailStatusMap
|
||||||
|
.get(behaviorResult.getStatusCode());
|
||||||
|
statusCodeResult.count++;
|
||||||
|
if (!behaviorResult.isSuccess()) {
|
||||||
|
statusCodeResult.maxResponseTime = 0;
|
||||||
|
statusCodeResult.minResponseTime = 0;
|
||||||
|
statusCodeResult.contentLength = 0;
|
||||||
|
statusCodeResult.totalResponseTimeThisTime = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
statusCodeResult.contentLength += behaviorResult.getContentLength();
|
||||||
|
statusCodeResult.totalResponseTimeThisTime += behaviorResult
|
||||||
|
.getResponseTime();
|
||||||
|
if (behaviorResult.getResponseTime() > statusCodeResult.maxResponseTime) {
|
||||||
|
statusCodeResult.maxResponseTime = behaviorResult.getResponseTime();
|
||||||
|
}
|
||||||
|
if (behaviorResult.getResponseTime() < statusCodeResult.minResponseTime) {
|
||||||
|
statusCodeResult.minResponseTime = behaviorResult.getResponseTime();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private synchronized void guardStatusMapExists(
|
||||||
|
BehaviorResult behaviorResult,
|
||||||
|
Map<Integer, BehaviorStatusCodeResult> detailStatusMap) {
|
||||||
|
if (!detailStatusMap.containsKey(behaviorResult.getStatusCode())) {
|
||||||
|
detailStatusMap.put(
|
||||||
|
new Integer(behaviorResult.getStatusCode()),
|
||||||
|
new BehaviorStatusCodeResult(behaviorResult
|
||||||
|
.getContentType()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private synchronized void insertWhenNotExist(BehaviorResult behaviorResult) {
|
||||||
|
if (!this.detailMap.containsKey(behaviorResult.getBehaviorId())) {
|
||||||
|
this.detailMap.put(new Integer(behaviorResult.getBehaviorId()),
|
||||||
|
new HashMap<Integer, BehaviorStatusCodeResult>());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String calculateSavePath(BehaviorResult behaviorResult) {
|
||||||
|
Date now = new Date();
|
||||||
|
|
||||||
|
return "DetailResults" + System.getProperty("file.separator")
|
||||||
|
+ new SimpleDateFormat("yyyyMMdd").format(now)
|
||||||
|
+ System.getProperty("file.separator") + this.getTestID() + "_"
|
||||||
|
+ behaviorResult.getBehaviorId() + "_"
|
||||||
|
+ new SimpleDateFormat("hhmm") + ".txt";
|
||||||
|
}
|
||||||
|
|
||||||
|
public void add(PageResult pageResult) {
|
||||||
|
this.getPageResultCollector().add(pageResult);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void add(BehaviorResult behaviorResult) {
|
||||||
|
super.add(behaviorResult);
|
||||||
|
statisticScenarioBriefResult(behaviorResult);
|
||||||
|
statisticBehaviorBriefResult(behaviorResult);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Map<Integer, BehaviorStatusCodeResult> getBehaviorBriefStatistics(
|
||||||
|
int behaviorId) {
|
||||||
|
if (!this.detailMap.containsKey(behaviorId)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return Collections.unmodifiableMap(this.detailMap.get(behaviorId));
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object getPageBriefStatistics(int pageId) {
|
||||||
|
return this.getPageResultCollector().getPageBriefStatistics(pageId);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,26 @@
|
||||||
|
package org.bench4q.agent.helper;
|
||||||
|
|
||||||
|
import org.springframework.beans.BeansException;
|
||||||
|
import org.springframework.context.ApplicationContext;
|
||||||
|
import org.springframework.context.ApplicationContextAware;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
@Component
|
||||||
|
public class ApplicationContextHelper implements ApplicationContextAware {
|
||||||
|
|
||||||
|
private static ApplicationContext context;
|
||||||
|
|
||||||
|
public static ApplicationContext getContext() {
|
||||||
|
return context;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setContext(ApplicationContext context) {
|
||||||
|
ApplicationContextHelper.context = context;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setApplicationContext(ApplicationContext applicationContext)
|
||||||
|
throws BeansException {
|
||||||
|
this.setContext(applicationContext);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,33 @@
|
||||||
|
package org.bench4q.agent.parameterization;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
|
@Component
|
||||||
|
public class ParameterFileCollector {
|
||||||
|
private static final String FILE_SEPARATOR = System
|
||||||
|
.getProperty("file.separator");
|
||||||
|
|
||||||
|
public void collectParamFiles(List<MultipartFile> files, UUID runId)
|
||||||
|
throws IOException {
|
||||||
|
for (MultipartFile file : files) {
|
||||||
|
file.transferTo(new File(guardDirExists(runId)
|
||||||
|
+ file.getOriginalFilename()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private String guardDirExists(UUID runId) {
|
||||||
|
String dirPath = "ScenarioParameters" + FILE_SEPARATOR
|
||||||
|
+ runId.toString() + FILE_SEPARATOR;
|
||||||
|
File dirFile = new File(dirPath);
|
||||||
|
if (!dirFile.exists()) {
|
||||||
|
dirFile.mkdirs();
|
||||||
|
}
|
||||||
|
return dirPath;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
package org.bench4q.agent.parameterization;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public interface SessionObject {
|
||||||
|
|
||||||
|
public String getParam(String name);
|
||||||
|
|
||||||
|
public void saveRuntimeParam(String name, String value);
|
||||||
|
|
||||||
|
public void doCleanUp();
|
||||||
|
|
||||||
|
public void saveRuntimeParams(Map<String, String> runTimeParams);
|
||||||
|
}
|
|
@ -0,0 +1,183 @@
|
||||||
|
package org.bench4q.agent.parameterization.impl;
|
||||||
|
|
||||||
|
import java.lang.reflect.InvocationTargetException;
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.UUID;
|
||||||
|
import java.util.concurrent.locks.ReentrantReadWriteLock;
|
||||||
|
|
||||||
|
import org.bench4q.agent.parameterization.SessionObject;
|
||||||
|
|
||||||
|
public class InstanceControler implements SessionObject {
|
||||||
|
private String userDefineParameterFolderPath = "/home/yxsh/git/Bench4Q-Agent/parameterClass/";
|
||||||
|
private UUID instandid = java.util.UUID.randomUUID();
|
||||||
|
private Set<String> usedClassName = new HashSet<String>();
|
||||||
|
private Map<String, Object> objMap = new HashMap<String, Object>();
|
||||||
|
private Map<String, String> runtimeParaMap = new HashMap<String, String>();
|
||||||
|
private Map<String, Object> cacheObjMap = new HashMap<String, Object>();
|
||||||
|
private ReentrantReadWriteLock mapRWLock = new ReentrantReadWriteLock();
|
||||||
|
|
||||||
|
String instanceLevelGetParameter(String name, String className,
|
||||||
|
String functionName, Object[] args) {
|
||||||
|
|
||||||
|
boolean hasThisClass = false;
|
||||||
|
mapRWLock.readLock().lock();
|
||||||
|
hasThisClass = objMap.containsKey(className);
|
||||||
|
mapRWLock.readLock().unlock();
|
||||||
|
if (false == hasThisClass) {
|
||||||
|
createObj(className);
|
||||||
|
}
|
||||||
|
Object instance = getObj(className);
|
||||||
|
Object result = null;
|
||||||
|
try {
|
||||||
|
Class<?>[] argTypeArr = new Class<?>[args.length + 2];
|
||||||
|
argTypeArr[0] = instandid.getClass();
|
||||||
|
argTypeArr[1] = this.cacheObjMap.getClass();
|
||||||
|
Object[] totalArgs = new Object[args.length + 2];
|
||||||
|
totalArgs[0] = instandid;
|
||||||
|
totalArgs[1] = this.cacheObjMap;
|
||||||
|
for (int i = 2; i < args.length + 2; i++) {
|
||||||
|
argTypeArr[i] = args[i - 2].getClass();
|
||||||
|
totalArgs[i] = args[i - 2];
|
||||||
|
}
|
||||||
|
Method m = instance.getClass().getMethod(functionName, argTypeArr);
|
||||||
|
result = m.invoke(instance, totalArgs);
|
||||||
|
} catch (Exception ex) {
|
||||||
|
System.out.println(ex.getMessage() + ex.getStackTrace());
|
||||||
|
System.out.println(((InvocationTargetException) ex)
|
||||||
|
.getTargetException().getMessage());
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
runtimeParaMap.put(name, (String) result);
|
||||||
|
return (String) result;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
String getParameterByContext(String name) {
|
||||||
|
if (false == this.runtimeParaMap.containsKey(name)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return runtimeParaMap.get(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean createObj(String className) {
|
||||||
|
try {
|
||||||
|
MyFileClassLoader cl = new MyFileClassLoader();
|
||||||
|
cl.setClassPath(userDefineParameterFolderPath);
|
||||||
|
Class<?> cls = cl.loadClass(className);
|
||||||
|
Object instance = cls.newInstance();
|
||||||
|
mapRWLock.writeLock().lock();
|
||||||
|
objMap.put(className, instance);
|
||||||
|
|
||||||
|
} catch (Exception ex) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
mapRWLock.writeLock().unlock();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Object getObj(String className) {
|
||||||
|
Object result = null;
|
||||||
|
mapRWLock.readLock().lock();
|
||||||
|
objMap.get(className);
|
||||||
|
mapRWLock.readLock().unlock();
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
String getParameter(String name, String className, String functionName,
|
||||||
|
Object[] args) {
|
||||||
|
|
||||||
|
ParametersFactory pf = ParametersFactory.getInstance();
|
||||||
|
boolean hasThisClass = pf.containObj(className);
|
||||||
|
if (false == hasThisClass) {
|
||||||
|
pf.createObj(className);
|
||||||
|
}
|
||||||
|
|
||||||
|
Object instance = pf.getObj(className);
|
||||||
|
Object result = null;
|
||||||
|
try {
|
||||||
|
Class<?>[] argTypeArr = new Class<?>[args.length + 2];
|
||||||
|
argTypeArr[0] = instandid.getClass();
|
||||||
|
argTypeArr[1] = this.cacheObjMap.getClass();
|
||||||
|
Object[] totalArgs = new Object[args.length + 2];
|
||||||
|
totalArgs[0] = instandid;
|
||||||
|
totalArgs[1] = this.cacheObjMap;
|
||||||
|
for (int i = 2; i < args.length + 2; i++) {
|
||||||
|
argTypeArr[i] = args[i - 2].getClass();
|
||||||
|
totalArgs[i] = args[i - 2];
|
||||||
|
}
|
||||||
|
|
||||||
|
Method m = instance.getClass().getMethod(functionName, argTypeArr);
|
||||||
|
|
||||||
|
result = m.invoke(instance, totalArgs);
|
||||||
|
|
||||||
|
} catch (Exception ex) {
|
||||||
|
System.out.println(ex.getMessage() + ex.getStackTrace());
|
||||||
|
System.out.println(((InvocationTargetException) ex)
|
||||||
|
.getTargetException().getMessage());
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
usedClassName.add(className);
|
||||||
|
runtimeParaMap.put(name, (String) result);
|
||||||
|
return (String) result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implement SessionObject begin
|
||||||
|
*/
|
||||||
|
|
||||||
|
public String getParam(String name) {
|
||||||
|
if (!(name.startsWith("<parameters") && name.endsWith("/>")))
|
||||||
|
return name;
|
||||||
|
return ParameterizationParser.parse(name, this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void saveRuntimeParam(String name, String value) {
|
||||||
|
runtimeParaMap.put(name, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void saveRuntimeParams(Map<String, String> runTimeParams) {
|
||||||
|
runtimeParaMap.putAll(runTimeParams);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void doCleanUp() {
|
||||||
|
this.releaseAll();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implement SessionObject end
|
||||||
|
*/
|
||||||
|
|
||||||
|
private void releaseAll() {
|
||||||
|
for (String xx : usedClassName) {
|
||||||
|
release(xx);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void release(String className) {
|
||||||
|
ParametersFactory pf = ParametersFactory.getInstance();
|
||||||
|
boolean hasThisClass = pf.containObj(className);
|
||||||
|
if (false == hasThisClass) {
|
||||||
|
pf.createObj(className);
|
||||||
|
}
|
||||||
|
|
||||||
|
Object instance = pf.getObj(className);
|
||||||
|
|
||||||
|
try {
|
||||||
|
|
||||||
|
Method m = instance.getClass().getMethod("unreg",
|
||||||
|
instandid.getClass());
|
||||||
|
|
||||||
|
m.invoke(instance, instandid);
|
||||||
|
|
||||||
|
} catch (Exception ex) {
|
||||||
|
System.out.println("realse failed");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,98 @@
|
||||||
|
package org.bench4q.agent.parameterization.impl;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.FileNotFoundException;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.lang.reflect.InvocationTargetException;
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
|
||||||
|
public class MyFileClassLoader extends ClassLoader {
|
||||||
|
|
||||||
|
private String classPath;
|
||||||
|
|
||||||
|
public static void main(String[] args) throws ClassNotFoundException,
|
||||||
|
InstantiationException, IllegalAccessException,
|
||||||
|
IllegalArgumentException, InvocationTargetException {
|
||||||
|
MyFileClassLoader fileClsLoader = new MyFileClassLoader();
|
||||||
|
fileClsLoader
|
||||||
|
.setClassPath("E:\\j2ee_proj\\skythink\\WebContent\\WEB-INF\\classes\\");
|
||||||
|
Class<?> cls = fileClsLoader
|
||||||
|
.loadClass("com.cmw.entity.sys.AccordionEntity");
|
||||||
|
Object obj = cls.newInstance();
|
||||||
|
Method[] mthds = cls.getMethods();
|
||||||
|
for (Method mthd : mthds) {
|
||||||
|
String methodName = mthd.getName();
|
||||||
|
System.out.println("mthd.name=" + methodName);
|
||||||
|
}
|
||||||
|
System.out.println("obj.class=" + obj.getClass().getName());
|
||||||
|
System.out.println("obj.class=" + cls.getClassLoader().toString());
|
||||||
|
System.out.println("obj.class="
|
||||||
|
+ cls.getClassLoader().getParent().toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ¼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>࣬<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
protected Class<?> findClass(String name) throws ClassNotFoundException {
|
||||||
|
byte[] classData = null;
|
||||||
|
try {
|
||||||
|
classData = loadClassData(name);
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return super.defineClass(name, classData, 0, classData.length);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> byte <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
*
|
||||||
|
* @param name
|
||||||
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>磺 com.cmw.entity.SysEntity
|
||||||
|
* @return <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD> byte <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
* @throws IOException
|
||||||
|
*/
|
||||||
|
private byte[] loadClassData(String name) throws IOException {
|
||||||
|
File file = getFile(name);
|
||||||
|
@SuppressWarnings("resource")
|
||||||
|
FileInputStream fis = new FileInputStream(file);
|
||||||
|
byte[] arrData = new byte[(int) file.length()];
|
||||||
|
fis.read(arrData);
|
||||||
|
return arrData;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD> File <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
*
|
||||||
|
* @param name
|
||||||
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD>
|
||||||
|
* @return File <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
* @throws FileNotFoundException
|
||||||
|
*/
|
||||||
|
private File getFile(String name) throws FileNotFoundException {
|
||||||
|
File dir = new File(classPath);
|
||||||
|
if (!dir.exists())
|
||||||
|
throw new FileNotFoundException(classPath + " Ŀ¼<C4BF><C2BC><EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD>");
|
||||||
|
String _classPath = classPath.replaceAll("[\\\\]", "/");
|
||||||
|
int offset = _classPath.lastIndexOf("/");
|
||||||
|
name = name.replaceAll("[.]", "/");
|
||||||
|
if (offset != -1 && offset < _classPath.length() - 1) {
|
||||||
|
_classPath += "/";
|
||||||
|
}
|
||||||
|
_classPath += name + ".class";
|
||||||
|
dir = new File(_classPath);
|
||||||
|
if (!dir.exists())
|
||||||
|
throw new FileNotFoundException(dir + " <20><><EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD>");
|
||||||
|
return dir;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getClassPath() {
|
||||||
|
return classPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setClassPath(String classPath) {
|
||||||
|
this.classPath = classPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,18 @@
|
||||||
|
package org.bench4q.agent.parameterization.impl;
|
||||||
|
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
public class Para_File {
|
||||||
|
|
||||||
|
@SuppressWarnings("unused")
|
||||||
|
private Map<String, BufferedReader> readBuffer = new HashMap<String, BufferedReader>();
|
||||||
|
|
||||||
|
public void getFromFile(UUID id, String fileName, String column,
|
||||||
|
String firstData, String byNumber) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,32 @@
|
||||||
|
package org.bench4q.agent.parameterization.impl;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.UUID;
|
||||||
|
import java.util.concurrent.locks.ReentrantReadWriteLock;
|
||||||
|
|
||||||
|
public class Para_GetEletronicCombine {
|
||||||
|
|
||||||
|
public class eletronicParas
|
||||||
|
{
|
||||||
|
String beginUser;
|
||||||
|
String endUser;
|
||||||
|
String beginTime;
|
||||||
|
String endTime;
|
||||||
|
}
|
||||||
|
public Map<UUID, Para_GetEletronicCombine> useInstanceMap = new HashMap<UUID, Para_GetEletronicCombine>();
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
|
Date currentTimeLoop = new Date("2014-01-01");
|
||||||
|
long currentUser = 10001;
|
||||||
|
ReentrantReadWriteLock timeRWLock = new ReentrantReadWriteLock();
|
||||||
|
|
||||||
|
public Para_GetEletronicCombine() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getBeginUser(UUID id) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,29 @@
|
||||||
|
package org.bench4q.agent.parameterization.impl;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
public class Para_IteratorNumber {
|
||||||
|
public Long iteratorNum = new Long(0);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* For all methods, they will has these two params
|
||||||
|
*
|
||||||
|
* @param id
|
||||||
|
* @param a
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public String getIteratorNumber(UUID id, Map<String, Object> a) {
|
||||||
|
long result = 0;
|
||||||
|
synchronized (iteratorNum) {
|
||||||
|
iteratorNum++;
|
||||||
|
result = iteratorNum;
|
||||||
|
}
|
||||||
|
String ret = String.valueOf(result);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void unreg(UUID id) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,28 @@
|
||||||
|
package org.bench4q.agent.parameterization.impl;
|
||||||
|
|
||||||
|
import java.util.Random;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
public class Para_RandomNumber {
|
||||||
|
|
||||||
|
public String getRandomIntegerNumber(UUID id,String begin, String end, String stringformat)
|
||||||
|
{
|
||||||
|
|
||||||
|
Random r = new Random();
|
||||||
|
int beginNum = Integer.parseInt(begin);
|
||||||
|
int endNum = Integer.parseInt(end);
|
||||||
|
|
||||||
|
int result = r.nextInt(endNum-beginNum) +beginNum;
|
||||||
|
return String.format(stringformat,result);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getRandomDouble(UUID id , String begin, String end , String stringformat)
|
||||||
|
{
|
||||||
|
Random r = new Random();
|
||||||
|
double beginNum = Integer.parseInt(begin);
|
||||||
|
double endNum = Integer.parseInt(end);
|
||||||
|
|
||||||
|
double result = r.nextDouble()*(endNum-beginNum) +beginNum;
|
||||||
|
return String.format(stringformat, result);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,271 @@
|
||||||
|
package org.bench4q.agent.parameterization.impl;
|
||||||
|
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Random;
|
||||||
|
import java.util.UUID;
|
||||||
|
import java.util.concurrent.ArrayBlockingQueue;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
|
||||||
|
public class Para_Table {
|
||||||
|
public final int cacheCap = 5000;// 1 sequence 2 random
|
||||||
|
public final int cacheSize = 1000;// 1 sequence 2 random
|
||||||
|
public final int readCharSize = 10000;
|
||||||
|
public ConcurrentHashMap<String, Reader> readerMap = new ConcurrentHashMap<String, Para_Table.Reader>();
|
||||||
|
|
||||||
|
public abstract class Reader {
|
||||||
|
public final Table t;
|
||||||
|
|
||||||
|
public Reader(Table table) {
|
||||||
|
this.t = table;
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract TableRow nextRow();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public class RandomReader extends Reader {
|
||||||
|
public ArrayBlockingQueue<TableRow> queue;
|
||||||
|
|
||||||
|
public RandomReader(ArrayBlockingQueue<TableRow> queue, Table t) {
|
||||||
|
super(t);
|
||||||
|
this.queue = queue;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TableRow nextRow() {
|
||||||
|
TableRow result = null;
|
||||||
|
do {
|
||||||
|
if (queue.size() == 0) {
|
||||||
|
synchronized (queue) {
|
||||||
|
if (queue.size() == 0) {
|
||||||
|
List<TableRow> rows = t.readRows();
|
||||||
|
int n = rows.size();
|
||||||
|
Random r = new Random();
|
||||||
|
for (int i = 0; i < n; i++) {
|
||||||
|
int next = r.nextInt(n);
|
||||||
|
TableRow tempRow = rows.get(i);
|
||||||
|
rows.set(i, rows.get(next));
|
||||||
|
rows.set(next, tempRow);
|
||||||
|
}
|
||||||
|
queue.addAll(rows);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
result = queue.poll();
|
||||||
|
} while (result == null);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public class SequenceReader extends Reader {
|
||||||
|
public ArrayBlockingQueue<TableRow> queue;
|
||||||
|
|
||||||
|
public SequenceReader(ArrayBlockingQueue<TableRow> queue, Table t) {
|
||||||
|
super(t);
|
||||||
|
this.queue = queue;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TableRow nextRow() {
|
||||||
|
TableRow result = null;
|
||||||
|
do {
|
||||||
|
if (queue.size() == 0) {
|
||||||
|
synchronized (queue) {
|
||||||
|
if (queue.size() == 0) {
|
||||||
|
List<TableRow> rows = t.readRows();
|
||||||
|
queue.addAll(rows);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
result = queue.poll();
|
||||||
|
} while (result == null);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract class Table {
|
||||||
|
String sourceValue;
|
||||||
|
int firstRow;
|
||||||
|
|
||||||
|
public Table(String sourceValue, int firstRow) {
|
||||||
|
this.sourceValue = sourceValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract List<TableRow> readRows();
|
||||||
|
|
||||||
|
public List<TableRow> rows = new ArrayList<TableRow>();
|
||||||
|
|
||||||
|
public int getTime = 0;
|
||||||
|
|
||||||
|
public boolean add(TableRow r) {
|
||||||
|
return rows.add(r);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class FileTable extends Table {
|
||||||
|
private BufferedReader bfr;
|
||||||
|
char splitChar;
|
||||||
|
char lineChar;
|
||||||
|
|
||||||
|
public FileTable(String sourceValue, int firstRow, char splitChar,
|
||||||
|
char lineChar) {
|
||||||
|
super(sourceValue, firstRow);
|
||||||
|
this.splitChar = splitChar;
|
||||||
|
this.lineChar = lineChar;
|
||||||
|
try {
|
||||||
|
createBFR();
|
||||||
|
} catch (IOException e) {
|
||||||
|
// TODO Auto-generated catch block
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void createBFR() throws IOException {
|
||||||
|
FileInputStream fis = new FileInputStream(sourceValue);
|
||||||
|
InputStreamReader ir = new InputStreamReader(fis);
|
||||||
|
bfr = new BufferedReader(ir);
|
||||||
|
for (int i = 0; i < firstRow;) {
|
||||||
|
char readChar = (char) bfr.read();
|
||||||
|
if (readChar == lineChar)
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<TableRow> readRows() {
|
||||||
|
StringBuilder target = new StringBuilder();
|
||||||
|
List<TableRow> result = new ArrayList<TableRow>();
|
||||||
|
TableRow tempTableRow = new TableRow();
|
||||||
|
try {
|
||||||
|
for (int i = 0; i < cacheSize;) {
|
||||||
|
int tt = bfr.read();
|
||||||
|
char readBuff = (char) tt;
|
||||||
|
if (tt == -1) {
|
||||||
|
createBFR();
|
||||||
|
break;
|
||||||
|
} else if (readBuff == this.splitChar) {
|
||||||
|
String cellString = target.toString();
|
||||||
|
tempTableRow.AddCell(cellString);
|
||||||
|
target = new StringBuilder();
|
||||||
|
continue;
|
||||||
|
} else if (readBuff == this.lineChar) {
|
||||||
|
tempTableRow.AddCell(target.toString());
|
||||||
|
result.add(tempTableRow);
|
||||||
|
tempTableRow = new TableRow();
|
||||||
|
target = new StringBuilder();
|
||||||
|
i++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
target.append(readBuff);
|
||||||
|
}
|
||||||
|
} catch (IOException ioex) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
if (target.length() > 0) {
|
||||||
|
tempTableRow.AddCell(target.toString());
|
||||||
|
result.add(tempTableRow);
|
||||||
|
target = new StringBuilder();
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public class StringTable extends Table {
|
||||||
|
|
||||||
|
char splitChar;
|
||||||
|
char lineChar;
|
||||||
|
|
||||||
|
public StringTable(String sourceValue, int firstRow, char splitChar,
|
||||||
|
char lineChar) {
|
||||||
|
super(sourceValue, firstRow);
|
||||||
|
this.splitChar = splitChar;
|
||||||
|
this.lineChar = lineChar;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<TableRow> readRows() {
|
||||||
|
String readStr = this.sourceValue;
|
||||||
|
String[] tokens = readStr.split(String.valueOf(lineChar));
|
||||||
|
List<TableRow> result = new ArrayList<TableRow>();
|
||||||
|
for (String line : tokens) {
|
||||||
|
TableRow tempRow = new TableRow();
|
||||||
|
String[] columns = line.split(String.valueOf(splitChar));
|
||||||
|
for (String column : columns) {
|
||||||
|
tempRow.AddCell(column);
|
||||||
|
}
|
||||||
|
result.add(tempRow);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public class TableRow {
|
||||||
|
public List<String> cells = new ArrayList<String>();
|
||||||
|
|
||||||
|
public void AddCell(String s) {
|
||||||
|
cells.add(s);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// org.bench4q.agent.parameterization.impl.Para_Table.getTableColumnValue(java.util.UUID,
|
||||||
|
// java.util.HashMap, java.lang.String, java.lang.String, java.lang.String,
|
||||||
|
// java.lang.String, java.lang.String, java.lang.String, java.lang.String)
|
||||||
|
|
||||||
|
public String getTableColumnValue(UUID id,
|
||||||
|
HashMap<String, Object> objCache, String source,
|
||||||
|
String sourceValue, String firstRow, String nextRow,
|
||||||
|
String splitChar, String lineChar, String column) {
|
||||||
|
int fRow = Integer.parseInt(firstRow);
|
||||||
|
char sChar = splitChar.charAt(0);
|
||||||
|
char lChar = lineChar.charAt(0);
|
||||||
|
int col = Integer.parseInt(column);
|
||||||
|
TableRow resultRow = null;
|
||||||
|
Table table = null;
|
||||||
|
Reader reader = null;
|
||||||
|
if (objCache.containsKey(sourceValue) == true) {
|
||||||
|
resultRow = (TableRow) objCache.get(sourceValue);
|
||||||
|
return resultRow.cells.get(col);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.readerMap.containsKey(sourceValue)) {
|
||||||
|
reader = readerMap.get(sourceValue);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
if (source.equals("file")) {
|
||||||
|
table = new FileTable(sourceValue, fRow, sChar, lChar);
|
||||||
|
} else if (source.equals("input")) {
|
||||||
|
table = new StringTable(sourceValue, fRow, sChar, lChar);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nextRow.equals("random")) {
|
||||||
|
ArrayBlockingQueue<TableRow> queue = new ArrayBlockingQueue<Para_Table.TableRow>(
|
||||||
|
cacheCap);
|
||||||
|
reader = new RandomReader(queue, table);
|
||||||
|
} else if (nextRow.equals("sequence")) {
|
||||||
|
|
||||||
|
ArrayBlockingQueue<TableRow> queue = new ArrayBlockingQueue<Para_Table.TableRow>(
|
||||||
|
cacheCap);
|
||||||
|
reader = new SequenceReader(queue, table);
|
||||||
|
}
|
||||||
|
readerMap.put(sourceValue, reader);
|
||||||
|
}
|
||||||
|
resultRow = reader.nextRow();
|
||||||
|
objCache.put(sourceValue, resultRow);
|
||||||
|
return resultRow.cells.get(col);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void unreg(UUID id) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,19 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<root>
|
||||||
|
<property name="source" type="option">
|
||||||
|
<value>file</value>
|
||||||
|
<value>input</value>
|
||||||
|
</property>
|
||||||
|
<property name="sourceValue" type="string">
|
||||||
|
</property>
|
||||||
|
<property name="firstRow" type="integer">
|
||||||
|
</property>
|
||||||
|
<property name="nextRow" type="option">
|
||||||
|
<value>sequence</value>
|
||||||
|
<value>random</value>
|
||||||
|
</property>
|
||||||
|
<property name="splitChar" type="char">
|
||||||
|
</property>
|
||||||
|
<property name="lineChar" type="char">
|
||||||
|
</property>
|
||||||
|
</root>
|
|
@ -0,0 +1,12 @@
|
||||||
|
package org.bench4q.agent.parameterization.impl;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
public class Para_UniqueNumber {
|
||||||
|
int currentNumber = 0;
|
||||||
|
|
||||||
|
synchronized String getNumber(UUID id)
|
||||||
|
{
|
||||||
|
return String.valueOf(currentNumber++);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,121 @@
|
||||||
|
package org.bench4q.agent.parameterization.impl;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.UUID;
|
||||||
|
import java.util.concurrent.locks.ReentrantReadWriteLock;
|
||||||
|
|
||||||
|
public class Para_UserNameAndPassword {
|
||||||
|
String[] Password = new String[] { "a", "b", "c", "d", "e" };
|
||||||
|
String[] userName = new String[] { "http://www.baidu.com/",
|
||||||
|
"http://www.163.com/", "http://baike.baidu.com/",
|
||||||
|
"http://zhidao.baidu.com/", "http://www.sina.com.cn/" };
|
||||||
|
UUID[] useUUID = new UUID[5];
|
||||||
|
|
||||||
|
Map<UUID, Integer> posMap = new HashMap<UUID, Integer>();
|
||||||
|
ReentrantReadWriteLock mapRWLock = new ReentrantReadWriteLock();
|
||||||
|
ReentrantReadWriteLock idposLock = new ReentrantReadWriteLock();
|
||||||
|
|
||||||
|
public String getUserName(UUID id) {
|
||||||
|
mapRWLock.readLock().lock();
|
||||||
|
if (posMap.containsKey(id)) {
|
||||||
|
mapRWLock.readLock().unlock();
|
||||||
|
return userName[posMap.get(id)];
|
||||||
|
}
|
||||||
|
mapRWLock.readLock().unlock();
|
||||||
|
|
||||||
|
int vaildPos = -1;
|
||||||
|
int tryNum = 0;
|
||||||
|
while (vaildPos < 0 && tryNum < 100) {
|
||||||
|
tryNum++;
|
||||||
|
idposLock.readLock().lock();
|
||||||
|
for (int i = 0; i < 5; i++) {
|
||||||
|
|
||||||
|
if (useUUID[i] == null) {
|
||||||
|
vaildPos = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
idposLock.readLock().unlock();
|
||||||
|
if (vaildPos < 0) {
|
||||||
|
try {
|
||||||
|
Thread.sleep(1000);
|
||||||
|
} catch (Exception ex) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
idposLock.writeLock().lock();
|
||||||
|
useUUID[vaildPos] = id;
|
||||||
|
idposLock.writeLock().unlock();
|
||||||
|
mapRWLock.writeLock().lock();
|
||||||
|
posMap.put(id, vaildPos);
|
||||||
|
mapRWLock.writeLock().unlock();
|
||||||
|
return userName[vaildPos];
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPassword(UUID id) {
|
||||||
|
mapRWLock.readLock().lock();
|
||||||
|
if (posMap.containsKey(id)) {
|
||||||
|
mapRWLock.readLock().unlock();
|
||||||
|
return Password[posMap.get(id)];
|
||||||
|
}
|
||||||
|
mapRWLock.readLock().unlock();
|
||||||
|
|
||||||
|
int vaildPos = -1;
|
||||||
|
int tryNum = 0;
|
||||||
|
while (vaildPos < 0 && tryNum < 100) {
|
||||||
|
tryNum++;
|
||||||
|
idposLock.readLock().lock();
|
||||||
|
for (int i = 0; i < 5; i++) {
|
||||||
|
|
||||||
|
if (useUUID[i] == null) {
|
||||||
|
vaildPos = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
idposLock.readLock().unlock();
|
||||||
|
if (vaildPos < 0) {
|
||||||
|
try {
|
||||||
|
Thread.sleep(1000);
|
||||||
|
} catch (Exception ex) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
idposLock.writeLock().lock();
|
||||||
|
useUUID[vaildPos] = id;
|
||||||
|
idposLock.writeLock().unlock();
|
||||||
|
mapRWLock.writeLock().lock();
|
||||||
|
posMap.put(id, vaildPos);
|
||||||
|
mapRWLock.writeLock().unlock();
|
||||||
|
return Password[vaildPos];
|
||||||
|
}
|
||||||
|
|
||||||
|
public void unreg(UUID id) {
|
||||||
|
try {
|
||||||
|
// System.out.println("1");
|
||||||
|
mapRWLock.writeLock().lock();
|
||||||
|
// System.out.println("2");
|
||||||
|
int pos = posMap.get(id);
|
||||||
|
// System.out.println("3");
|
||||||
|
posMap.remove(id);
|
||||||
|
// System.out.println("4");
|
||||||
|
mapRWLock.writeLock().unlock();
|
||||||
|
// System.out.println("5");
|
||||||
|
idposLock.writeLock().lock();
|
||||||
|
// System.out.println("6");
|
||||||
|
useUUID[pos] = null;
|
||||||
|
idposLock.writeLock().unlock();
|
||||||
|
} catch (Exception ex) {
|
||||||
|
System.out.println(ex.getClass().getName());
|
||||||
|
System.out.println(ex.getMessage());
|
||||||
|
System.out.println(ex.getStackTrace());
|
||||||
|
mapRWLock.writeLock().unlock();
|
||||||
|
idposLock.writeLock().unlock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,29 @@
|
||||||
|
package org.bench4q.agent.parameterization.impl;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public class ParameterThreadOption {
|
||||||
|
public final ParameterThreadOption instance = new ParameterThreadOption();
|
||||||
|
Map<String, List<String>> optionMap = new HashMap<String, List<String>>();
|
||||||
|
private List<String> all = Arrays.asList("crossThread", "inThread");
|
||||||
|
// private List<String> justIn = Arrays.asList("inThread");
|
||||||
|
private List<String> justCross = Arrays.asList("crossThread");
|
||||||
|
|
||||||
|
private ParameterThreadOption() {
|
||||||
|
|
||||||
|
optionMap.put("Para_File", all);
|
||||||
|
optionMap.put("Para_IteratorNumber", justCross);
|
||||||
|
optionMap.put("Para_RandomNumber", all);
|
||||||
|
optionMap.put("Para_UniqueNumber", all);
|
||||||
|
optionMap.put("Para_UserNameAndPassword", justCross);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<String> getThreadOption(String classname) {
|
||||||
|
if (this.optionMap.containsKey(classname) == false)
|
||||||
|
return all;
|
||||||
|
return optionMap.get(classname);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,53 @@
|
||||||
|
package org.bench4q.agent.parameterization.impl;
|
||||||
|
|
||||||
|
import java.io.StringReader;
|
||||||
|
|
||||||
|
import javax.xml.parsers.DocumentBuilder;
|
||||||
|
import javax.xml.parsers.DocumentBuilderFactory;
|
||||||
|
|
||||||
|
import org.w3c.dom.Document;
|
||||||
|
import org.w3c.dom.Element;
|
||||||
|
import org.xml.sax.InputSource;
|
||||||
|
|
||||||
|
public class ParameterizationParser {
|
||||||
|
|
||||||
|
public static String parse(String text, InstanceControler insCon) {
|
||||||
|
// Pattern pattern = Pattern.compile("<parameter className=""/>");
|
||||||
|
String result = "";
|
||||||
|
try {
|
||||||
|
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
|
||||||
|
DocumentBuilder db = dbf.newDocumentBuilder();
|
||||||
|
Document document = db
|
||||||
|
.parse(new InputSource(new StringReader(text)));
|
||||||
|
Element root = document.getDocumentElement();
|
||||||
|
String className = root.getAttribute("class");
|
||||||
|
String methodName = root.getAttribute("method");
|
||||||
|
String argString = root.getAttribute("args");
|
||||||
|
String type = root.getAttribute("type");
|
||||||
|
String[] args = argString.split(",");
|
||||||
|
if (argString.trim().equals(""))
|
||||||
|
args = new String[0];
|
||||||
|
|
||||||
|
String name = root.getAttribute("name");
|
||||||
|
result = insCon.getParameterByContext(name);
|
||||||
|
if (result != null)
|
||||||
|
return result;
|
||||||
|
if (type.equals("crossThread")) {
|
||||||
|
result = insCon.getParameter(name, getCurrentPackageFullName()
|
||||||
|
+ "." + className, methodName, args);
|
||||||
|
} else if (type.equals("inThread")) {
|
||||||
|
result = insCon.instanceLevelGetParameter(name, className,
|
||||||
|
methodName, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (Exception ex) {
|
||||||
|
return text;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String getCurrentPackageFullName() {
|
||||||
|
return ParameterizationParser.class.getName().substring(0,
|
||||||
|
ParameterizationParser.class.getName().lastIndexOf('.'));
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,57 @@
|
||||||
|
package org.bench4q.agent.parameterization.impl;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.concurrent.locks.ReentrantReadWriteLock;
|
||||||
|
|
||||||
|
public class ParametersFactory {
|
||||||
|
private ParametersFactory() {
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
static private final ParametersFactory instance = new ParametersFactory();
|
||||||
|
static String lockObj = "";
|
||||||
|
|
||||||
|
static public ParametersFactory getInstance() {
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Map<String, Object> objMap = new HashMap<String, Object>();
|
||||||
|
|
||||||
|
public boolean containObj(String className) {
|
||||||
|
boolean ret = false;
|
||||||
|
mapRWLock.readLock().lock();
|
||||||
|
ret = objMap.containsKey(className);
|
||||||
|
mapRWLock.readLock().unlock();
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object getObj(String className) {
|
||||||
|
Object result = null;
|
||||||
|
mapRWLock.readLock().lock();
|
||||||
|
result = objMap.get(className);
|
||||||
|
mapRWLock.readLock().unlock();
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String rootFilePath = "/home/yxsh/git/Bench4Q-Agent/parameterClass/";
|
||||||
|
|
||||||
|
ReentrantReadWriteLock mapRWLock = new ReentrantReadWriteLock();
|
||||||
|
|
||||||
|
public boolean createObj(String className) {
|
||||||
|
try {
|
||||||
|
MyFileClassLoader cl = new MyFileClassLoader();
|
||||||
|
cl.setClassPath(rootFilePath);
|
||||||
|
Class<?> cls = cl.loadClass(className);
|
||||||
|
Object instance = cls.newInstance();
|
||||||
|
mapRWLock.writeLock().lock();
|
||||||
|
objMap.put(className, instance);
|
||||||
|
|
||||||
|
} catch (Exception ex) {
|
||||||
|
System.out.println(ex.getMessage());
|
||||||
|
}
|
||||||
|
mapRWLock.writeLock().unlock();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,12 @@
|
||||||
|
package org.bench4q.agent.plugin;
|
||||||
|
|
||||||
|
import java.lang.annotation.ElementType;
|
||||||
|
import java.lang.annotation.Retention;
|
||||||
|
import java.lang.annotation.RetentionPolicy;
|
||||||
|
import java.lang.annotation.Target;
|
||||||
|
|
||||||
|
@Target(ElementType.METHOD)
|
||||||
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
|
public @interface Behavior {
|
||||||
|
String value();
|
||||||
|
}
|
|
@ -0,0 +1,23 @@
|
||||||
|
package org.bench4q.agent.plugin;
|
||||||
|
|
||||||
|
public class BehaviorInfo {
|
||||||
|
private String name;
|
||||||
|
private ParameterInfo[] parameters;
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ParameterInfo[] getParameters() {
|
||||||
|
return parameters;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setParameters(ParameterInfo[] parameters) {
|
||||||
|
this.parameters = parameters;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,124 @@
|
||||||
|
package org.bench4q.agent.plugin;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.net.URLClassLoader;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Enumeration;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.jar.JarEntry;
|
||||||
|
import java.util.jar.JarFile;
|
||||||
|
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
@Component
|
||||||
|
public class ClassHelper {
|
||||||
|
|
||||||
|
public List<String> getClassNames(String packageName,
|
||||||
|
boolean searchInChildPackage) {
|
||||||
|
try {
|
||||||
|
List<String> classNames = new ArrayList<String>();
|
||||||
|
URLClassLoader classLoader = (URLClassLoader) Thread
|
||||||
|
.currentThread().getContextClassLoader();
|
||||||
|
URL[] urls = classLoader.getURLs();
|
||||||
|
for (URL url : urls) {
|
||||||
|
if (url.getProtocol().equals("file")) {
|
||||||
|
File file = new File(url.getFile());
|
||||||
|
String root = file.getPath().replace("\\", "/");
|
||||||
|
if (file.isDirectory()) {
|
||||||
|
classNames.addAll(this.getClassNamesFromDirectory(root,
|
||||||
|
packageName, searchInChildPackage, file, true));
|
||||||
|
} else if (file.getName().endsWith(".jar")) {
|
||||||
|
classNames.addAll(this.getClassNameFromJar(packageName,
|
||||||
|
searchInChildPackage, file));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return classNames;
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<String> getClassNamesFromDirectory(String root,
|
||||||
|
String packageName, boolean searchInChildPackage, File directory,
|
||||||
|
boolean continueSearch) {
|
||||||
|
List<String> classNames = new ArrayList<String>();
|
||||||
|
File[] files = directory.listFiles();
|
||||||
|
for (File file : files) {
|
||||||
|
String filePath = file.getPath().replace("\\", "/");
|
||||||
|
if (file.isDirectory()) {
|
||||||
|
if (searchInChildPackage || continueSearch) {
|
||||||
|
boolean needToContinue = continueSearch;
|
||||||
|
if (filePath.endsWith(packageName.replace(".", "/"))) {
|
||||||
|
needToContinue = needToContinue & false;
|
||||||
|
}
|
||||||
|
classNames.addAll(this.getClassNamesFromDirectory(root,
|
||||||
|
packageName, searchInChildPackage, file,
|
||||||
|
needToContinue));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (filePath.endsWith(".class")) {
|
||||||
|
String classFileName = filePath.replace(root + "/", "");
|
||||||
|
if (classFileName.startsWith(packageName.replace(".", "/"))) {
|
||||||
|
String className = classFileName.substring(0,
|
||||||
|
classFileName.length() - ".class".length())
|
||||||
|
.replace("/", ".");
|
||||||
|
classNames.add(className);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return classNames;
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<String> getClassNameFromJar(String packageName,
|
||||||
|
boolean searchInChildPackage, File file) {
|
||||||
|
List<String> classNames = new ArrayList<String>();
|
||||||
|
JarFile jarFile = null;
|
||||||
|
try {
|
||||||
|
jarFile = new JarFile(file);
|
||||||
|
Enumeration<JarEntry> jarEntries = jarFile.entries();
|
||||||
|
while (jarEntries.hasMoreElements()) {
|
||||||
|
JarEntry jarEntry = jarEntries.nextElement();
|
||||||
|
String entryName = jarEntry.getName();
|
||||||
|
if (entryName.endsWith(".class")) {
|
||||||
|
String packagePath = packageName.replace(".", "/");
|
||||||
|
if (searchInChildPackage) {
|
||||||
|
if (entryName.startsWith(packagePath)) {
|
||||||
|
entryName = entryName.replace("/", ".").substring(
|
||||||
|
0, entryName.lastIndexOf("."));
|
||||||
|
classNames.add(entryName);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
int index = entryName.lastIndexOf("/");
|
||||||
|
String entryPath;
|
||||||
|
if (index != -1) {
|
||||||
|
entryPath = entryName.substring(0, index);
|
||||||
|
} else {
|
||||||
|
entryPath = entryName;
|
||||||
|
}
|
||||||
|
if (entryPath.equals(packagePath)) {
|
||||||
|
entryName = entryName.replace("/", ".").substring(
|
||||||
|
0, entryName.lastIndexOf("."));
|
||||||
|
classNames.add(entryName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
} finally {
|
||||||
|
if (jarFile != null) {
|
||||||
|
try {
|
||||||
|
jarFile.close();
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return classNames;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,12 @@
|
||||||
|
package org.bench4q.agent.plugin;
|
||||||
|
|
||||||
|
import java.lang.annotation.ElementType;
|
||||||
|
import java.lang.annotation.Retention;
|
||||||
|
import java.lang.annotation.RetentionPolicy;
|
||||||
|
import java.lang.annotation.Target;
|
||||||
|
|
||||||
|
@Target(ElementType.PARAMETER)
|
||||||
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
|
public @interface Parameter {
|
||||||
|
String value();
|
||||||
|
}
|
|
@ -0,0 +1,23 @@
|
||||||
|
package org.bench4q.agent.plugin;
|
||||||
|
|
||||||
|
public class ParameterInfo {
|
||||||
|
private String name;
|
||||||
|
private String type;
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getType() {
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setType(String type) {
|
||||||
|
this.type = type;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,12 @@
|
||||||
|
package org.bench4q.agent.plugin;
|
||||||
|
|
||||||
|
import java.lang.annotation.ElementType;
|
||||||
|
import java.lang.annotation.Retention;
|
||||||
|
import java.lang.annotation.RetentionPolicy;
|
||||||
|
import java.lang.annotation.Target;
|
||||||
|
|
||||||
|
@Target(ElementType.TYPE)
|
||||||
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
|
public @interface Plugin {
|
||||||
|
String value();
|
||||||
|
}
|
|
@ -0,0 +1,32 @@
|
||||||
|
package org.bench4q.agent.plugin;
|
||||||
|
|
||||||
|
public class PluginInfo {
|
||||||
|
private String name;
|
||||||
|
private ParameterInfo[] parameters;
|
||||||
|
private BehaviorInfo[] behaviors;
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ParameterInfo[] getParameters() {
|
||||||
|
return parameters;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setParameters(ParameterInfo[] parameters) {
|
||||||
|
this.parameters = parameters;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BehaviorInfo[] getBehaviors() {
|
||||||
|
return behaviors;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setBehaviors(BehaviorInfo[] behaviors) {
|
||||||
|
this.behaviors = behaviors;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,269 @@
|
||||||
|
package org.bench4q.agent.plugin;
|
||||||
|
|
||||||
|
import java.lang.annotation.Annotation;
|
||||||
|
import java.lang.reflect.Constructor;
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.apache.log4j.Logger;
|
||||||
|
import org.bench4q.agent.share.DealWithLog;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
@Component
|
||||||
|
public class PluginManager {
|
||||||
|
private ClassHelper classHelper;
|
||||||
|
private TypeConverter typeConverter;
|
||||||
|
private Map<String, Class<?>> plugins;
|
||||||
|
private Logger logger = Logger.getLogger(PluginManager.class);
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
public PluginManager(ClassHelper classHelper, TypeConverter typeConverter) {
|
||||||
|
this.setClassHelper(classHelper);
|
||||||
|
this.setTypeConverter(typeConverter);
|
||||||
|
this.setPlugins(this.loadPlugins("org.bench4q.agent.plugin"));
|
||||||
|
}
|
||||||
|
|
||||||
|
private ClassHelper getClassHelper() {
|
||||||
|
return classHelper;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setClassHelper(ClassHelper classHelper) {
|
||||||
|
this.classHelper = classHelper;
|
||||||
|
}
|
||||||
|
|
||||||
|
private TypeConverter getTypeConverter() {
|
||||||
|
return typeConverter;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setTypeConverter(TypeConverter typeConverter) {
|
||||||
|
this.typeConverter = typeConverter;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Map<String, Class<?>> getPlugins() {
|
||||||
|
return plugins;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setPlugins(Map<String, Class<?>> plugins) {
|
||||||
|
this.plugins = plugins;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Map<String, Class<?>> loadPlugins(String packageName) {
|
||||||
|
try {
|
||||||
|
List<String> classNames = this.getClassHelper().getClassNames(
|
||||||
|
packageName, true);
|
||||||
|
Map<String, Class<?>> ret = new HashMap<String, Class<?>>();
|
||||||
|
for (String className : classNames) {
|
||||||
|
Class<?> plugin = Class.forName(className);
|
||||||
|
if (plugin.isAnnotationPresent(Plugin.class)) {
|
||||||
|
ret.put(plugin.getAnnotation(Plugin.class).value(), plugin);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<PluginInfo> getPluginInfo() {
|
||||||
|
try {
|
||||||
|
Map<String, Class<?>> plugins = this.getPlugins();
|
||||||
|
List<PluginInfo> ret = new ArrayList<PluginInfo>();
|
||||||
|
for (Class<?> plugin : plugins.values()) {
|
||||||
|
PluginInfo pluginInfo = new PluginInfo();
|
||||||
|
pluginInfo
|
||||||
|
.setName((plugin.getAnnotation(Plugin.class)).value());
|
||||||
|
pluginInfo.setParameters(this.getParameters(plugin
|
||||||
|
.getConstructors()[0]));
|
||||||
|
Method[] behaviors = this.getBehaviors(plugin);
|
||||||
|
pluginInfo.setBehaviors(new BehaviorInfo[behaviors.length]);
|
||||||
|
int i = 0;
|
||||||
|
for (i = 0; i < behaviors.length; i++) {
|
||||||
|
Method behaviorMethod = behaviors[i];
|
||||||
|
BehaviorInfo behaviorInfo = buildBehaviorInfo(behaviorMethod);
|
||||||
|
pluginInfo.getBehaviors()[i] = behaviorInfo;
|
||||||
|
}
|
||||||
|
ret.add(pluginInfo);
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private BehaviorInfo buildBehaviorInfo(Method behaviorMethod)
|
||||||
|
throws ClassNotFoundException {
|
||||||
|
BehaviorInfo behaviorInfo = new BehaviorInfo();
|
||||||
|
behaviorInfo.setName((behaviorMethod.getAnnotation(Behavior.class))
|
||||||
|
.value());
|
||||||
|
behaviorInfo.setParameters(this.getParameters(behaviorMethod));
|
||||||
|
return behaviorInfo;
|
||||||
|
}
|
||||||
|
|
||||||
|
private ParameterInfo[] getParameters(Method behavior) {
|
||||||
|
try {
|
||||||
|
int parameterCount = behavior.getParameterTypes().length;
|
||||||
|
Annotation[][] parameterAnnotations = behavior
|
||||||
|
.getParameterAnnotations();
|
||||||
|
ParameterInfo[] parameterNames = new ParameterInfo[parameterCount];
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < parameterCount; i++) {
|
||||||
|
Annotation[] annotations = parameterAnnotations[i];
|
||||||
|
Parameter parameter = (Parameter) annotations[0];
|
||||||
|
Class<?> type = behavior.getParameterTypes()[i];
|
||||||
|
ParameterInfo parameterInfo = buildParameterInfo(
|
||||||
|
parameter.value(), type.getName());
|
||||||
|
parameterNames[i] = parameterInfo;
|
||||||
|
}
|
||||||
|
return parameterNames;
|
||||||
|
} catch (Exception e) {
|
||||||
|
logger.error(DealWithLog.getExceptionStackTrace(e));
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private ParameterInfo[] getParameters(Constructor<?> behavior) {
|
||||||
|
try {
|
||||||
|
int parameterCount = behavior.getParameterTypes().length;
|
||||||
|
Annotation[][] parameterAnnotations = behavior
|
||||||
|
.getParameterAnnotations();
|
||||||
|
ParameterInfo[] parameterNames = new ParameterInfo[parameterCount];
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < parameterCount; i++) {
|
||||||
|
Annotation[] annotations = parameterAnnotations[i];
|
||||||
|
Parameter parameter = (Parameter) annotations[0];
|
||||||
|
Class<?> type = behavior.getParameterTypes()[i];
|
||||||
|
ParameterInfo parameterInfo = buildParameterInfo(
|
||||||
|
parameter.value(), type.getName());
|
||||||
|
parameterNames[i] = parameterInfo;
|
||||||
|
}
|
||||||
|
return parameterNames;
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private ParameterInfo buildParameterInfo(String name, String type) {
|
||||||
|
ParameterInfo parameterInfo = new ParameterInfo();
|
||||||
|
parameterInfo.setName(name);
|
||||||
|
parameterInfo.setType(type);
|
||||||
|
return parameterInfo;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Method[] getBehaviors(Class<?> plugin) {
|
||||||
|
try {
|
||||||
|
Method[] methods = plugin.getMethods();
|
||||||
|
List<Method> ret = new ArrayList<Method>();
|
||||||
|
int i = 0;
|
||||||
|
for (i = 0; i < methods.length; i++) {
|
||||||
|
if (methods[i].isAnnotationPresent(Behavior.class)) {
|
||||||
|
ret.add(methods[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ret.toArray(new Method[0]);
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object initializePlugin(Class<?> plugin,
|
||||||
|
Map<String, String> parameters) {
|
||||||
|
try {
|
||||||
|
Constructor<?>[] ctConstructors = plugin.getConstructors();
|
||||||
|
if (ctConstructors.length != 1) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
Constructor<?> constructor = ctConstructors[0];
|
||||||
|
Object[] params = prepareParameters(constructor, parameters);
|
||||||
|
return plugin.getConstructors()[0].newInstance(params);
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Object[] prepareParameters(Constructor<?> behavior,
|
||||||
|
Map<String, String> parameters) {
|
||||||
|
try {
|
||||||
|
ParameterInfo[] parameterInfo = this.getParameters(behavior);
|
||||||
|
Object values[] = new Object[parameterInfo.length];
|
||||||
|
int i = 0;
|
||||||
|
for (i = 0; i < parameterInfo.length; i++) {
|
||||||
|
Object value = parameters.get(parameterInfo[i].getName());
|
||||||
|
if (value == null) {
|
||||||
|
values[i] = null;
|
||||||
|
} else {
|
||||||
|
values[i] = this.getTypeConverter().convert(value,
|
||||||
|
parameterInfo[i].getType());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return values;
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Object[] prepareParameters(Method behavior,
|
||||||
|
Map<String, String> parameters) {
|
||||||
|
try {
|
||||||
|
ParameterInfo[] parameterInfo = this.getParameters(behavior);
|
||||||
|
Object values[] = new Object[parameterInfo.length];
|
||||||
|
int i = 0;
|
||||||
|
for (i = 0; i < parameterInfo.length; i++) {
|
||||||
|
Object value = parameters.get(parameterInfo[i].getName());
|
||||||
|
if (value == null) {
|
||||||
|
values[i] = null;
|
||||||
|
} else {
|
||||||
|
values[i] = this.getTypeConverter().convert(value,
|
||||||
|
parameterInfo[i].getType());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return values;
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object doBehavior(Object plugin, String behaviorName,
|
||||||
|
Map<String, String> parameters) {
|
||||||
|
try {
|
||||||
|
Method method = findMethod(plugin, behaviorName);
|
||||||
|
if (method == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
Object[] params = prepareParameters(method, parameters);
|
||||||
|
return method.invoke(plugin, params);
|
||||||
|
} catch (Exception e) {
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Method findMethod(Object plugin, String behaviorName) {
|
||||||
|
try {
|
||||||
|
Method[] methods = plugin.getClass().getMethods();
|
||||||
|
int i = 0;
|
||||||
|
for (i = 0; i < methods.length; i++) {
|
||||||
|
if (methods[i].isAnnotationPresent(Behavior.class)) {
|
||||||
|
if (((Behavior) methods[i].getAnnotation(Behavior.class))
|
||||||
|
.value().equals(behaviorName)) {
|
||||||
|
return methods[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,44 @@
|
||||||
|
package org.bench4q.agent.plugin;
|
||||||
|
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
@Component
|
||||||
|
public class TypeConverter {
|
||||||
|
public Object convert(Object source, String targetClassName) {
|
||||||
|
if (targetClassName.equals("boolean")) {
|
||||||
|
return Boolean.parseBoolean(source.toString());
|
||||||
|
}
|
||||||
|
if (targetClassName.equals("char")) {
|
||||||
|
return source.toString().toCharArray()[0];
|
||||||
|
}
|
||||||
|
if (targetClassName.equals("byte")) {
|
||||||
|
return Byte.parseByte(source.toString());
|
||||||
|
}
|
||||||
|
if (targetClassName.equals("short")) {
|
||||||
|
return Short.parseShort(source.toString());
|
||||||
|
}
|
||||||
|
if (targetClassName.equals("int")) {
|
||||||
|
return Integer.parseInt(source.toString());
|
||||||
|
}
|
||||||
|
if (targetClassName.equals("long")) {
|
||||||
|
return Long.parseLong(source.toString());
|
||||||
|
}
|
||||||
|
if (targetClassName.equals("float")) {
|
||||||
|
return Float.parseFloat(source.toString());
|
||||||
|
}
|
||||||
|
if (targetClassName.equals("double")) {
|
||||||
|
return Double.parseDouble(source.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
Class<?> targetClass = Class.forName(targetClassName);
|
||||||
|
if (targetClass.isAssignableFrom(String.class)) {
|
||||||
|
return source.toString();
|
||||||
|
}
|
||||||
|
return targetClass.cast(source);
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,89 @@
|
||||||
|
package org.bench4q.agent.plugin.basic;
|
||||||
|
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
|
||||||
|
import org.bench4q.agent.plugin.Behavior;
|
||||||
|
import org.bench4q.agent.plugin.Parameter;
|
||||||
|
import org.bench4q.agent.plugin.Plugin;
|
||||||
|
import org.bench4q.agent.plugin.result.CommandLineReturn;
|
||||||
|
|
||||||
|
@Plugin("CommandLine")
|
||||||
|
public class CommandLinePlugin {
|
||||||
|
private String standardOutput;
|
||||||
|
private String standardError;
|
||||||
|
|
||||||
|
public String getStandardOutput() {
|
||||||
|
return standardOutput;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setStandardOutput(String standardOutput) {
|
||||||
|
this.standardOutput = standardOutput;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getStandardError() {
|
||||||
|
return standardError;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setStandardError(String standardError) {
|
||||||
|
this.standardError = standardError;
|
||||||
|
}
|
||||||
|
|
||||||
|
public CommandLinePlugin() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Behavior("Command")
|
||||||
|
public CommandLineReturn command(@Parameter("command") String command) {
|
||||||
|
try {
|
||||||
|
final Process process = Runtime.getRuntime().exec(command);
|
||||||
|
new Thread() {
|
||||||
|
public void run() {
|
||||||
|
try {
|
||||||
|
BufferedReader reader = new BufferedReader(
|
||||||
|
new InputStreamReader(process.getInputStream()));
|
||||||
|
String streamline = "";
|
||||||
|
try {
|
||||||
|
setStandardOutput("");
|
||||||
|
while ((streamline = reader.readLine()) != null) {
|
||||||
|
setStandardOutput(getStandardOutput()
|
||||||
|
+ streamline
|
||||||
|
+ System.getProperty("line.separator"));
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
reader.close();
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}.start();
|
||||||
|
new Thread() {
|
||||||
|
public void run() {
|
||||||
|
try {
|
||||||
|
BufferedReader reader = new BufferedReader(
|
||||||
|
new InputStreamReader(process.getErrorStream()));
|
||||||
|
String streamline = "";
|
||||||
|
try {
|
||||||
|
setStandardError("");
|
||||||
|
while ((streamline = reader.readLine()) != null) {
|
||||||
|
setStandardError(getStandardError()
|
||||||
|
+ streamline
|
||||||
|
+ System.getProperty("line.separator"));
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
reader.close();
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}.start();
|
||||||
|
process.waitFor();
|
||||||
|
return new CommandLineReturn(true);
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return new CommandLineReturn(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,27 @@
|
||||||
|
package org.bench4q.agent.plugin.basic;
|
||||||
|
|
||||||
|
import org.apache.log4j.Logger;
|
||||||
|
import org.bench4q.agent.plugin.Behavior;
|
||||||
|
import org.bench4q.agent.plugin.Parameter;
|
||||||
|
import org.bench4q.agent.plugin.Plugin;
|
||||||
|
import org.bench4q.agent.plugin.result.TimerReturn;
|
||||||
|
|
||||||
|
@Plugin("ConstantTimer")
|
||||||
|
public class ConstantTimerPlugin {
|
||||||
|
private Logger logger = Logger.getLogger(ConstantTimerPlugin.class);
|
||||||
|
|
||||||
|
public ConstantTimerPlugin() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Behavior("Sleep")
|
||||||
|
public TimerReturn sleep(@Parameter("time") int time) {
|
||||||
|
try {
|
||||||
|
Thread.sleep(time);
|
||||||
|
return new TimerReturn(true);
|
||||||
|
} catch (Exception e) {
|
||||||
|
logger.info("sleep interrupted!");
|
||||||
|
return new TimerReturn(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,19 @@
|
||||||
|
package org.bench4q.agent.plugin.basic;
|
||||||
|
|
||||||
|
import org.bench4q.agent.plugin.Behavior;
|
||||||
|
import org.bench4q.agent.plugin.Parameter;
|
||||||
|
import org.bench4q.agent.plugin.Plugin;
|
||||||
|
import org.bench4q.agent.plugin.result.LogReturn;
|
||||||
|
|
||||||
|
@Plugin("Log")
|
||||||
|
public class LogPlugin {
|
||||||
|
public LogPlugin() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Behavior("Log")
|
||||||
|
public LogReturn log(@Parameter("message") String message) {
|
||||||
|
System.out.println(message);
|
||||||
|
return new LogReturn(true);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,339 @@
|
||||||
|
/*
|
||||||
|
* Author Coderfengyun
|
||||||
|
*
|
||||||
|
* And th parmas has some special split.
|
||||||
|
* Like, QueryParams and bodyParams should be split by ';'
|
||||||
|
* And Headers should be split by '|;'
|
||||||
|
*/
|
||||||
|
package org.bench4q.agent.plugin.basic.http;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.UnsupportedEncodingException;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
import org.apache.commons.httpclient.Cookie;
|
||||||
|
import org.apache.commons.httpclient.Header;
|
||||||
|
import org.apache.commons.httpclient.HttpClient;
|
||||||
|
import org.apache.commons.httpclient.HttpException;
|
||||||
|
import org.apache.commons.httpclient.HttpMethod;
|
||||||
|
import org.apache.commons.httpclient.NameValuePair;
|
||||||
|
import org.apache.commons.httpclient.methods.DeleteMethod;
|
||||||
|
import org.apache.commons.httpclient.methods.GetMethod;
|
||||||
|
import org.apache.commons.httpclient.methods.PostMethod;
|
||||||
|
import org.apache.commons.httpclient.methods.PutMethod;
|
||||||
|
import org.apache.commons.httpclient.methods.StringRequestEntity;
|
||||||
|
import org.bench4q.agent.plugin.Behavior;
|
||||||
|
import org.bench4q.agent.plugin.Parameter;
|
||||||
|
import org.bench4q.agent.plugin.Plugin;
|
||||||
|
import org.bench4q.agent.plugin.result.HttpReturn;
|
||||||
|
import org.bench4q.agent.scenario.util.ParameterParser;
|
||||||
|
import org.bench4q.agent.scenario.util.Table;
|
||||||
|
|
||||||
|
@Plugin("Http")
|
||||||
|
public class HttpPlugin {
|
||||||
|
private HttpClient httpClient;
|
||||||
|
|
||||||
|
public HttpClient getHttpClient() {
|
||||||
|
return httpClient;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setHttpClient(HttpClient httpClient) {
|
||||||
|
this.httpClient = httpClient;
|
||||||
|
}
|
||||||
|
|
||||||
|
public HttpPlugin() {
|
||||||
|
this.setHttpClient(new HttpClient());
|
||||||
|
}
|
||||||
|
|
||||||
|
void setHeaders(HttpMethod method, String headers) {
|
||||||
|
if (headers != null) {
|
||||||
|
List<NameValuePair> nvPairs = parseHeaders(headers);
|
||||||
|
for (NameValuePair nv : nvPairs) {
|
||||||
|
method.addRequestHeader(nv.getName(), nv.getValue());
|
||||||
|
}
|
||||||
|
// New add
|
||||||
|
String cookieValue = "";
|
||||||
|
for (Cookie cookie : this.getHttpClient().getState().getCookies()) {
|
||||||
|
if (!cookieValue.isEmpty()) {
|
||||||
|
cookieValue += ";";
|
||||||
|
}
|
||||||
|
cookieValue += cookie.getName() + "=" + cookie.getValue();
|
||||||
|
}
|
||||||
|
if (!cookieValue.isEmpty()) {
|
||||||
|
method.addRequestHeader("Cookie", cookieValue);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
List<NameValuePair> parseHeaders(String value) {
|
||||||
|
List<NameValuePair> nvPairs = new LinkedList<NameValuePair>();
|
||||||
|
Table headerTable = ParameterParser.buildTable(value,
|
||||||
|
new LinkedList<String>() {
|
||||||
|
private static final long serialVersionUID = 3498984411571605459L;
|
||||||
|
{
|
||||||
|
add("header");
|
||||||
|
add("value");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
for (List<String> entry : headerTable.getRealContent()) {
|
||||||
|
if (entry.size() != headerTable.getColumnCount()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
nvPairs.add(new NameValuePair(entry.get(0).trim(), entry.get(1)
|
||||||
|
.trim()));
|
||||||
|
}
|
||||||
|
return nvPairs;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static NameValuePair[] setInputParameters(
|
||||||
|
List<String> inputParameters) {
|
||||||
|
Set<NameValuePair> res = new HashSet<NameValuePair>();
|
||||||
|
Iterator<String> paramIter = inputParameters.iterator();
|
||||||
|
|
||||||
|
while (paramIter.hasNext()) {
|
||||||
|
String token = paramIter.next();
|
||||||
|
int index = token.indexOf('=');
|
||||||
|
res.add(new NameValuePair(token.substring(0, index), token
|
||||||
|
.substring(index + 1)));
|
||||||
|
}
|
||||||
|
return res.toArray(new NameValuePair[res.size()]);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String completeUri(String uri) {
|
||||||
|
String scheme = uri.substring(0, 5);
|
||||||
|
if (!scheme.equals("http:") && !scheme.equals("https"))
|
||||||
|
uri = "http://" + uri;
|
||||||
|
return uri;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param url
|
||||||
|
* @param queryParams
|
||||||
|
* (NField) QueryParams should be split by ';'
|
||||||
|
* @param headers
|
||||||
|
* (Table)has two columns, such as header and value
|
||||||
|
*
|
||||||
|
* @param respVarsToSaveInSession
|
||||||
|
* (Table) has four columns, such as varName,
|
||||||
|
* varRegularExpression, leftBoundry, and rightBoundry
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@Behavior("Get")
|
||||||
|
public HttpReturn get(@Parameter("url") String url,
|
||||||
|
@Parameter("queryParams") String queryParams,
|
||||||
|
@Parameter("headers") String headers,
|
||||||
|
@Parameter("respVarsToSaveInSession") String respVarsToSaveInSession) {
|
||||||
|
|
||||||
|
GetMethod method = new GetMethod(completeUri(url));
|
||||||
|
if (isValid(queryParams)) {
|
||||||
|
method.setQueryString(queryParams);
|
||||||
|
}
|
||||||
|
setHeaders(method, headers);
|
||||||
|
method.getParams().makeLenient();
|
||||||
|
method.setFollowRedirects(false);
|
||||||
|
return excuteMethod(method, respVarsToSaveInSession);
|
||||||
|
}
|
||||||
|
|
||||||
|
private HttpReturn excuteMethod(HttpMethod method,
|
||||||
|
String respVarsToSaveInSession) {
|
||||||
|
int responseCode = -1;
|
||||||
|
long contentLength = 0;
|
||||||
|
String contentType = "";
|
||||||
|
Map<String, String> respVars = new LinkedHashMap<String, String>();
|
||||||
|
|
||||||
|
try {
|
||||||
|
responseCode = this.getHttpClient().executeMethod(method);
|
||||||
|
method.getStatusLine().toString();
|
||||||
|
Header[] responseHeaders = method.getResponseHeaders();
|
||||||
|
if (method.getResponseHeader("Content-Length") != null) {
|
||||||
|
contentLength = Long.parseLong(method.getResponseHeader(
|
||||||
|
"Content-Length").getValue());
|
||||||
|
}
|
||||||
|
if (method.getResponseHeader("Content-Type") != null) {
|
||||||
|
contentType = method.getResponseHeader("Content-Type")
|
||||||
|
.getValue();
|
||||||
|
}
|
||||||
|
if (isValid(respVarsToSaveInSession)) {
|
||||||
|
respVars = doExtractResponseVariables(respVarsToSaveInSession,
|
||||||
|
method.getResponseBodyAsString());
|
||||||
|
}
|
||||||
|
return new HttpReturn(responseCode > 0, responseCode,
|
||||||
|
contentLength, contentType, responseHeaders, respVars);
|
||||||
|
} catch (HttpException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return new HttpReturn(false, 400, contentLength, contentType);
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return new HttpReturn(false, 400, contentLength, contentType);
|
||||||
|
} finally {
|
||||||
|
method.releaseConnection();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Map<String, String> doExtractResponseVariables(
|
||||||
|
String respVarsToSaveInSession, String responseBodyAsString) {
|
||||||
|
Map<String, String> keyValues = new LinkedHashMap<String, String>();
|
||||||
|
List<List<String>> varExtractExpressionList = ParameterParser
|
||||||
|
.buildTable(respVarsToSaveInSession, new LinkedList<String>() {
|
||||||
|
private static final long serialVersionUID = -923211006660227362L;
|
||||||
|
{
|
||||||
|
add("varName");
|
||||||
|
add("varRegularExpression");
|
||||||
|
add("leftBoundry");
|
||||||
|
add("rightBoundry");
|
||||||
|
}
|
||||||
|
}).getRealContent();
|
||||||
|
for (List<String> row : varExtractExpressionList) {
|
||||||
|
keyValues.putAll(doExtractParamByRow(row, responseBodyAsString));
|
||||||
|
}
|
||||||
|
return keyValues;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Map<String, String> doExtractParamByRow(List<String> row,
|
||||||
|
String responseBody) {
|
||||||
|
Map<String, String> result = new LinkedHashMap<String, String>();
|
||||||
|
if (row.size() <= 3) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
String varName = row.get(0);
|
||||||
|
String varExpression = row.get(1);
|
||||||
|
String varLeftBoundry = row.get(2);
|
||||||
|
String varRightBoundry = row.get(3);
|
||||||
|
|
||||||
|
if (!isValid(varExpression)) {
|
||||||
|
result.put(
|
||||||
|
varName,
|
||||||
|
extractExactlyValueWith(varLeftBoundry, varRightBoundry,
|
||||||
|
responseBody));
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
Matcher matcher = Pattern.compile(varExpression).matcher(responseBody);
|
||||||
|
if (!matcher.find()) {
|
||||||
|
result.put(
|
||||||
|
varName,
|
||||||
|
extractExactlyValueWith(varLeftBoundry, varRightBoundry,
|
||||||
|
responseBody));
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
result.put(
|
||||||
|
varName,
|
||||||
|
extractExactlyValueWith(varLeftBoundry, varRightBoundry,
|
||||||
|
matcher.group()));
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String extractExactlyValueWith(String varLeftBoundry,
|
||||||
|
String varRightBoundry, String matchedVariable) {
|
||||||
|
int indexOfLB = matchedVariable.indexOf(varLeftBoundry);
|
||||||
|
int indexOfRB = matchedVariable.indexOf(varRightBoundry);
|
||||||
|
return matchedVariable.substring(indexOfLB + varLeftBoundry.length(),
|
||||||
|
indexOfRB);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param url
|
||||||
|
* @param queryParams
|
||||||
|
* @param headers
|
||||||
|
* @param bodyContent
|
||||||
|
* , when the Content-Length in header G.T. zero, then use this
|
||||||
|
* @param bodyParams
|
||||||
|
* , else use this
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@Behavior("Post")
|
||||||
|
public HttpReturn post(@Parameter("url") String url,
|
||||||
|
@Parameter("queryParams") String queryParams,
|
||||||
|
@Parameter("headers") String headers,
|
||||||
|
@Parameter("bodyContent") String bodyContent,
|
||||||
|
@Parameter("bodyparameters") String bodyParams,
|
||||||
|
@Parameter("respVarsToSaveInSession") String respVarToSaveInSession) {
|
||||||
|
PostMethod method = new PostMethod(completeUri(url));
|
||||||
|
setHeaders(method, headers);
|
||||||
|
if (isValid(queryParams)) {
|
||||||
|
method.setQueryString(setInputParameters(ParameterParser
|
||||||
|
.buildNField(queryParams)));
|
||||||
|
}
|
||||||
|
if (isValid(bodyParams)) {
|
||||||
|
method.setRequestBody(setInputParameters(ParameterParser
|
||||||
|
.buildNField(bodyParams)));
|
||||||
|
}
|
||||||
|
String contentType = getMethodContentType(method);
|
||||||
|
if (isValid(bodyContent) && isValid(contentType)) {
|
||||||
|
try {
|
||||||
|
method.setRequestEntity(new StringRequestEntity(bodyContent,
|
||||||
|
contentType, null));
|
||||||
|
} catch (Exception ex) {
|
||||||
|
ex.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
method.getParams().makeLenient();
|
||||||
|
method.setFollowRedirects(false);
|
||||||
|
return excuteMethod(method, respVarToSaveInSession);
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getMethodContentType(HttpMethod method) {
|
||||||
|
Header contentTypeHeader = method.getRequestHeader("Content-Type");
|
||||||
|
String contentType = null;
|
||||||
|
if (contentTypeHeader != null
|
||||||
|
&& !contentTypeHeader.toExternalForm().isEmpty()) {
|
||||||
|
contentType = contentTypeHeader.toExternalForm();
|
||||||
|
}
|
||||||
|
return contentType;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isValid(String content) {
|
||||||
|
return content != null && content.length() != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Behavior("Put")
|
||||||
|
public HttpReturn put(@Parameter("url") String url,
|
||||||
|
@Parameter("queryParams") String queryParams,
|
||||||
|
@Parameter("headers") String headers,
|
||||||
|
@Parameter("bodyContent") String bodyContent,
|
||||||
|
@Parameter("bodyparameters") String bodyParams,
|
||||||
|
@Parameter("respVarsToSaveInSession") String respVarToSaveInSession) {
|
||||||
|
PutMethod method = new PutMethod(completeUri(url));
|
||||||
|
setHeaders(method, headers);
|
||||||
|
if (isValid(queryParams)) {
|
||||||
|
method.setQueryString(setInputParameters(ParameterParser
|
||||||
|
.buildNField(queryParams)));
|
||||||
|
}
|
||||||
|
String contentType = getMethodContentType(method);
|
||||||
|
if (isValid(bodyContent) && isValid(contentType)) {
|
||||||
|
try {
|
||||||
|
method.setRequestEntity(new StringRequestEntity(bodyContent,
|
||||||
|
contentType, null));
|
||||||
|
} catch (UnsupportedEncodingException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
method.getParams().makeLenient();
|
||||||
|
return excuteMethod(method, respVarToSaveInSession);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Behavior("Delete")
|
||||||
|
public HttpReturn delete(@Parameter("url") String url,
|
||||||
|
@Parameter("queryParams") String queryParams,
|
||||||
|
@Parameter("headers") String headers,
|
||||||
|
@Parameter("respVarsToSaveInSession") String respVarToSaveInSession) {
|
||||||
|
DeleteMethod method = new DeleteMethod(completeUri(url));
|
||||||
|
setHeaders(method, headers);
|
||||||
|
if (isValid(queryParams)) {
|
||||||
|
method.setQueryString(setInputParameters(ParameterParser
|
||||||
|
.buildNField(queryParams)));
|
||||||
|
}
|
||||||
|
method.getParams().makeLenient();
|
||||||
|
return excuteMethod(method, respVarToSaveInSession);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,5 @@
|
||||||
|
package org.bench4q.agent.plugin.basic.http;
|
||||||
|
|
||||||
|
public class ParameterConstant {
|
||||||
|
public static final String escape = "\\";
|
||||||
|
}
|
|
@ -0,0 +1,7 @@
|
||||||
|
package org.bench4q.agent.plugin.result;
|
||||||
|
|
||||||
|
public class CommandLineReturn extends PluginReturn {
|
||||||
|
public CommandLineReturn(boolean success) {
|
||||||
|
this.setSuccess(success);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,66 @@
|
||||||
|
package org.bench4q.agent.plugin.result;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.apache.commons.httpclient.Header;
|
||||||
|
|
||||||
|
/***
|
||||||
|
* the contentLength's unit is Byte
|
||||||
|
*
|
||||||
|
* @author coderfengyun
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class HttpReturn extends PluginReturn {
|
||||||
|
private int statusCode;
|
||||||
|
private long contentLength;
|
||||||
|
private String contentType;
|
||||||
|
private Header[] headers;
|
||||||
|
|
||||||
|
public int getStatusCode() {
|
||||||
|
return statusCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setStatusCode(int statusCode) {
|
||||||
|
this.statusCode = statusCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getContentLength() {
|
||||||
|
return contentLength;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setContentLength(long contentLength) {
|
||||||
|
this.contentLength = contentLength;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getContentType() {
|
||||||
|
return contentType;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setContentType(String contentType) {
|
||||||
|
this.contentType = contentType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Header[] getHeaders() {
|
||||||
|
return headers;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setHeaders(Header[] headers) {
|
||||||
|
this.headers = headers;
|
||||||
|
}
|
||||||
|
|
||||||
|
public HttpReturn(boolean success, int statusCode, long contentLength,
|
||||||
|
String contentType) {
|
||||||
|
this.setSuccess(success);
|
||||||
|
this.setStatusCode(statusCode);
|
||||||
|
this.setContentLength(contentLength);
|
||||||
|
this.setContentType(contentType);
|
||||||
|
}
|
||||||
|
|
||||||
|
public HttpReturn(boolean success, int responseCode, long contentLength2,
|
||||||
|
String contentType2, Header[] responseHeaders,
|
||||||
|
Map<String, String> runTimeParams) {
|
||||||
|
this(success, responseCode, contentLength2, contentType2);
|
||||||
|
this.setHeaders(responseHeaders);
|
||||||
|
this.getRunTimeParams().putAll(runTimeParams);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,7 @@
|
||||||
|
package org.bench4q.agent.plugin.result;
|
||||||
|
|
||||||
|
public class LogReturn extends PluginReturn {
|
||||||
|
public LogReturn(boolean success) {
|
||||||
|
this.setSuccess(success);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,29 @@
|
||||||
|
package org.bench4q.agent.plugin.result;
|
||||||
|
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public abstract class PluginReturn {
|
||||||
|
private boolean success;
|
||||||
|
private Map<String, String> runTimeParams;
|
||||||
|
|
||||||
|
public boolean isSuccess() {
|
||||||
|
return success;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSuccess(boolean success) {
|
||||||
|
this.success = success;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Map<String, String> getRunTimeParams() {
|
||||||
|
return runTimeParams;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setRunTimeParams(Map<String, String> runTimeParams) {
|
||||||
|
this.runTimeParams = runTimeParams;
|
||||||
|
}
|
||||||
|
|
||||||
|
public PluginReturn() {
|
||||||
|
this.setRunTimeParams(new LinkedHashMap<String, String>());
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,12 @@
|
||||||
|
package org.bench4q.agent.plugin.result;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author coderfengyun
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class TimerReturn extends PluginReturn {
|
||||||
|
public TimerReturn(boolean success) {
|
||||||
|
this.setSuccess(success);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,43 @@
|
||||||
|
package org.bench4q.agent.scenario;
|
||||||
|
|
||||||
|
import org.bench4q.agent.scenario.behavior.Behavior;
|
||||||
|
|
||||||
|
public class Batch {
|
||||||
|
private int id;
|
||||||
|
private int parentId;
|
||||||
|
private int childId;
|
||||||
|
private Behavior[] behaviors;
|
||||||
|
|
||||||
|
public int getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(int id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getParentId() {
|
||||||
|
return parentId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setParentId(int parentId) {
|
||||||
|
this.parentId = parentId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getChildId() {
|
||||||
|
return childId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setChildId(int childId) {
|
||||||
|
this.childId = childId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Behavior[] getBehaviors() {
|
||||||
|
return behaviors;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setBehaviors(Behavior[] behaviors) {
|
||||||
|
this.behaviors = behaviors;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,125 @@
|
||||||
|
package org.bench4q.agent.scenario;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
public class BehaviorResult {
|
||||||
|
private String pluginId;
|
||||||
|
private String pluginName;
|
||||||
|
private String behaviorName;
|
||||||
|
private Date startDate;
|
||||||
|
private Date endDate;
|
||||||
|
private long responseTime;
|
||||||
|
private boolean success;
|
||||||
|
|
||||||
|
private int behaviorId;
|
||||||
|
private String behaviorUrl;
|
||||||
|
private long contentLength;
|
||||||
|
private int statusCode;
|
||||||
|
private String contentType;
|
||||||
|
private boolean shouldBeCountResponseTime;
|
||||||
|
|
||||||
|
public String getPluginId() {
|
||||||
|
return pluginId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPluginId(String pluginId) {
|
||||||
|
this.pluginId = pluginId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPluginName() {
|
||||||
|
return pluginName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPluginName(String pluginName) {
|
||||||
|
this.pluginName = pluginName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getBehaviorName() {
|
||||||
|
return behaviorName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setBehaviorName(String behaviorName) {
|
||||||
|
this.behaviorName = behaviorName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Date getStartDate() {
|
||||||
|
return startDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setStartDate(Date startDate) {
|
||||||
|
this.startDate = startDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Date getEndDate() {
|
||||||
|
return endDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setEndDate(Date endDate) {
|
||||||
|
this.endDate = endDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getResponseTime() {
|
||||||
|
return responseTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setResponseTime(long responseTime) {
|
||||||
|
this.responseTime = responseTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isSuccess() {
|
||||||
|
return success;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSuccess(boolean success) {
|
||||||
|
this.success = success;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getBehaviorId() {
|
||||||
|
return behaviorId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setBehaviorId(int behaviorId) {
|
||||||
|
this.behaviorId = behaviorId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getBehaviorUrl() {
|
||||||
|
return behaviorUrl;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setBehaviorUrl(String behaviorUrl) {
|
||||||
|
this.behaviorUrl = behaviorUrl;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getContentLength() {
|
||||||
|
return contentLength;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setContentLength(long contentLength) {
|
||||||
|
this.contentLength = contentLength;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getStatusCode() {
|
||||||
|
return statusCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setStatusCode(int statusCode) {
|
||||||
|
this.statusCode = statusCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getContentType() {
|
||||||
|
return contentType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setContentType(String contentType) {
|
||||||
|
this.contentType = contentType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isShouldBeCountResponseTime() {
|
||||||
|
return shouldBeCountResponseTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setShouldBeCountResponseTime(boolean shouldBeCountResponseTime) {
|
||||||
|
this.shouldBeCountResponseTime = shouldBeCountResponseTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,22 @@
|
||||||
|
package org.bench4q.agent.scenario;
|
||||||
|
|
||||||
|
import org.bench4q.agent.datacollector.DataCollector;
|
||||||
|
import org.bench4q.agent.datacollector.impl.PageResultCollector;
|
||||||
|
|
||||||
|
public class Page {
|
||||||
|
private Batch[] batches;
|
||||||
|
final private DataCollector dataCollector = new PageResultCollector();
|
||||||
|
|
||||||
|
public Batch[] getBatches() {
|
||||||
|
return batches;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setBatches(Batch[] batches) {
|
||||||
|
this.batches = batches;
|
||||||
|
}
|
||||||
|
|
||||||
|
public DataCollector getDataCollector() {
|
||||||
|
return dataCollector;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,77 @@
|
||||||
|
package org.bench4q.agent.scenario;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class PageResult {
|
||||||
|
private int pageId;
|
||||||
|
private long pageStartTime;
|
||||||
|
private long pageEndTime;
|
||||||
|
private long executeRange;
|
||||||
|
|
||||||
|
public int getPageId() {
|
||||||
|
return pageId;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setPageId(int pageId) {
|
||||||
|
this.pageId = pageId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getPageStartTime() {
|
||||||
|
return pageStartTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setPageStartTime(long pageStartTime) {
|
||||||
|
this.pageStartTime = pageStartTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getPageEndTime() {
|
||||||
|
return pageEndTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setPageEndTime(long pageEndTime) {
|
||||||
|
this.pageEndTime = pageEndTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getExecuteRange() {
|
||||||
|
return executeRange;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setExecuteRange(long executeRange) {
|
||||||
|
this.executeRange = executeRange;
|
||||||
|
}
|
||||||
|
|
||||||
|
private PageResult() {
|
||||||
|
init();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void init() {
|
||||||
|
this.setPageStartTime(Long.MAX_VALUE);
|
||||||
|
this.setPageEndTime(Long.MIN_VALUE);
|
||||||
|
this.setExecuteRange(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static PageResult buildPageResult(int pageId,
|
||||||
|
List<BehaviorResult> behaviorResults) {
|
||||||
|
PageResult result = new PageResult();
|
||||||
|
result.setPageId(pageId);
|
||||||
|
if (behaviorResults == null) {
|
||||||
|
behaviorResults = new ArrayList<BehaviorResult>();
|
||||||
|
}
|
||||||
|
for (BehaviorResult behaviorResult : behaviorResults) {
|
||||||
|
if (behaviorResult.getStartDate().getTime() < result
|
||||||
|
.getPageStartTime()) {
|
||||||
|
result.setPageStartTime(behaviorResult.getStartDate().getTime());
|
||||||
|
}
|
||||||
|
if (behaviorResult.getEndDate().getTime() > result.getPageEndTime()) {
|
||||||
|
result.setPageEndTime(behaviorResult.getEndDate().getTime());
|
||||||
|
}
|
||||||
|
// Page excuteRange rely on the behaviors' execute way, if it's
|
||||||
|
// executed in batch, i should take the longest behavior in batch
|
||||||
|
// to calculate this One.
|
||||||
|
}
|
||||||
|
result.setExecuteRange(result.getPageEndTime()
|
||||||
|
- result.getPageStartTime());
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,23 @@
|
||||||
|
package org.bench4q.agent.scenario;
|
||||||
|
|
||||||
|
public class Parameter {
|
||||||
|
private String key;
|
||||||
|
private String value;
|
||||||
|
|
||||||
|
public String getKey() {
|
||||||
|
return key;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setKey(String key) {
|
||||||
|
this.key = key;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getValue() {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setValue(String value) {
|
||||||
|
this.value = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,176 @@
|
||||||
|
package org.bench4q.agent.scenario;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.bench4q.agent.scenario.behavior.Behavior;
|
||||||
|
import org.bench4q.agent.scenario.behavior.BehaviorFactory;
|
||||||
|
import org.bench4q.share.helper.MarshalHelper;
|
||||||
|
import org.bench4q.share.models.agent.ParameterModel;
|
||||||
|
import org.bench4q.share.models.agent.RunScenarioModel;
|
||||||
|
import org.bench4q.share.models.agent.scriptrecord.BatchModel;
|
||||||
|
import org.bench4q.share.models.agent.scriptrecord.BehaviorModel;
|
||||||
|
import org.bench4q.share.models.agent.scriptrecord.PageModel;
|
||||||
|
import org.bench4q.share.models.agent.scriptrecord.UsePluginModel;
|
||||||
|
|
||||||
|
public class Scenario {
|
||||||
|
private UsePlugin[] usePlugins;
|
||||||
|
private Page[] pages;
|
||||||
|
private List<Behavior> behaviors;
|
||||||
|
|
||||||
|
public UsePlugin[] getUsePlugins() {
|
||||||
|
return usePlugins;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUsePlugins(UsePlugin[] usePlugins) {
|
||||||
|
this.usePlugins = usePlugins;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Page[] getPages() {
|
||||||
|
return pages;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPages(Page[] pages) {
|
||||||
|
this.pages = pages;
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<Behavior> getBehaviors() {
|
||||||
|
return behaviors;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setBehaviors(List<Behavior> behaviors) {
|
||||||
|
this.behaviors = behaviors;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Scenario() {
|
||||||
|
this.setBehaviors(new ArrayList<Behavior>());
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Behavior> getAllBehaviorsInScenario() {
|
||||||
|
if (this.getBehaviors().size() > 0) {
|
||||||
|
return Collections.unmodifiableList(this.getBehaviors());
|
||||||
|
}
|
||||||
|
List<Behavior> behaviors = new ArrayList<Behavior>();
|
||||||
|
for (Page page : this.getPages()) {
|
||||||
|
for (Batch batch : page.getBatches()) {
|
||||||
|
for (Behavior behavior : batch.getBehaviors()) {
|
||||||
|
behaviors.add(behavior);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return Collections.unmodifiableList(behaviors);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Scenario scenarioBuilder(String scenarioContent) {
|
||||||
|
return extractScenario((RunScenarioModel) MarshalHelper.tryUnmarshal(
|
||||||
|
RunScenarioModel.class, scenarioContent));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Scenario scenarioBuilder(RunScenarioModel scenarioModel) {
|
||||||
|
if (scenarioModel == null) {
|
||||||
|
throw new NullPointerException();
|
||||||
|
}
|
||||||
|
Scenario scenario = extractScenario(scenarioModel);
|
||||||
|
return scenario;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Scenario extractScenario(RunScenarioModel runScenarioModel) {
|
||||||
|
Scenario scenario = new Scenario();
|
||||||
|
scenario.setUsePlugins(new UsePlugin[runScenarioModel.getUsePlugins()
|
||||||
|
.size()]);
|
||||||
|
scenario.setPages(new Page[runScenarioModel.getPages().size()]);
|
||||||
|
extractUsePlugins(runScenarioModel, scenario);
|
||||||
|
extractPages(runScenarioModel, scenario);
|
||||||
|
return scenario;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void extractPages(RunScenarioModel runScenarioModel,
|
||||||
|
Scenario scenario) {
|
||||||
|
List<PageModel> pageModels = runScenarioModel.getPages();
|
||||||
|
for (int i = 0; i < pageModels.size(); i++) {
|
||||||
|
PageModel pageModel = pageModels.get(i);
|
||||||
|
scenario.getPages()[i] = extractPage(pageModel);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Page extractPage(PageModel pageModel) {
|
||||||
|
Page page = new Page();
|
||||||
|
page.setBatches(new Batch[pageModel.getBatches().size()]);
|
||||||
|
List<BatchModel> batches = pageModel.getBatches();
|
||||||
|
for (int i = 0; i < pageModel.getBatches().size(); i++) {
|
||||||
|
BatchModel batch = batches.get(i);
|
||||||
|
page.getBatches()[i] = extractBatch(batch);
|
||||||
|
}
|
||||||
|
return page;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Batch extractBatch(BatchModel batchModel) {
|
||||||
|
Batch batch = new Batch();
|
||||||
|
batch.setBehaviors(new Behavior[batchModel.getBehaviors().size()]);
|
||||||
|
batch.setId(batchModel.getId());
|
||||||
|
batch.setParentId(batchModel.getParentId());
|
||||||
|
batch.setChildId(batchModel.getChildId());
|
||||||
|
if (batchModel.getBehaviors() == null) {
|
||||||
|
return batch;
|
||||||
|
}
|
||||||
|
batch.setBehaviors(new Behavior[batchModel.getBehaviors().size()]);
|
||||||
|
for (int i = 0; i < batchModel.getBehaviors().size(); ++i) {
|
||||||
|
batch.getBehaviors()[i] = extractBehavior(batchModel.getBehaviors()
|
||||||
|
.get(i));
|
||||||
|
}
|
||||||
|
return batch;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void extractUsePlugins(RunScenarioModel runScenarioModel,
|
||||||
|
Scenario scenario) {
|
||||||
|
int i;
|
||||||
|
List<UsePluginModel> usePluginModels = runScenarioModel.getUsePlugins();
|
||||||
|
for (i = 0; i < runScenarioModel.getUsePlugins().size(); i++) {
|
||||||
|
UsePluginModel usePluginModel = usePluginModels.get(i);
|
||||||
|
UsePlugin usePlugin = extractUsePlugin(usePluginModel);
|
||||||
|
scenario.getUsePlugins()[i] = usePlugin;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Behavior extractBehavior(BehaviorModel behaviorModel) {
|
||||||
|
Behavior behavior = BehaviorFactory.getBuisinessObject(behaviorModel);
|
||||||
|
behavior.setName(behaviorModel.getName());
|
||||||
|
behavior.setUse(behaviorModel.getUse());
|
||||||
|
behavior.setId(behaviorModel.getId());
|
||||||
|
behavior.setParameters(new Parameter[behaviorModel.getParameters()
|
||||||
|
.size()]);
|
||||||
|
|
||||||
|
int k = 0;
|
||||||
|
for (k = 0; k < behaviorModel.getParameters().size(); k++) {
|
||||||
|
ParameterModel parameterModel = behaviorModel.getParameters()
|
||||||
|
.get(k);
|
||||||
|
Parameter parameter = extractParameter(parameterModel);
|
||||||
|
behavior.getParameters()[k] = parameter;
|
||||||
|
}
|
||||||
|
return behavior;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static UsePlugin extractUsePlugin(UsePluginModel usePluginModel) {
|
||||||
|
UsePlugin usePlugin = new UsePlugin();
|
||||||
|
usePlugin.setId(usePluginModel.getId());
|
||||||
|
usePlugin.setName(usePluginModel.getName());
|
||||||
|
usePlugin.setParameters(new Parameter[usePluginModel.getParameters()
|
||||||
|
.size()]);
|
||||||
|
int k = 0;
|
||||||
|
for (k = 0; k < usePluginModel.getParameters().size(); k++) {
|
||||||
|
ParameterModel parameterModel = usePluginModel.getParameters().get(
|
||||||
|
k);
|
||||||
|
Parameter parameter = extractParameter(parameterModel);
|
||||||
|
usePlugin.getParameters()[k] = parameter;
|
||||||
|
}
|
||||||
|
return usePlugin;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Parameter extractParameter(ParameterModel parameterModel) {
|
||||||
|
Parameter parameter = new Parameter();
|
||||||
|
parameter.setKey(parameterModel.getKey());
|
||||||
|
parameter.setValue(parameterModel.getValue());
|
||||||
|
return parameter;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,84 @@
|
||||||
|
package org.bench4q.agent.scenario;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.UUID;
|
||||||
|
import java.util.concurrent.SynchronousQueue;
|
||||||
|
import java.util.concurrent.ThreadPoolExecutor;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
import java.util.concurrent.ThreadPoolExecutor.DiscardPolicy;
|
||||||
|
|
||||||
|
import org.bench4q.agent.datacollector.DataCollector;
|
||||||
|
import org.bench4q.agent.datacollector.impl.ScenarioResultCollector;
|
||||||
|
|
||||||
|
public class ScenarioContext {
|
||||||
|
private static final long keepAliveTime = 10;
|
||||||
|
private Date startDate;
|
||||||
|
private Date endDate;
|
||||||
|
private ThreadPoolExecutor executor;
|
||||||
|
private Scenario scenario;
|
||||||
|
private boolean finished;
|
||||||
|
private DataCollector dataStatistics;
|
||||||
|
|
||||||
|
public Date getStartDate() {
|
||||||
|
return startDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setStartDate(Date saveStartDate) {
|
||||||
|
this.startDate = saveStartDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Date getEndDate() {
|
||||||
|
return endDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setEndDate(Date endDate) {
|
||||||
|
this.endDate = endDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ThreadPoolExecutor getExecutor() {
|
||||||
|
return executor;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setExecutorService(ThreadPoolExecutor executor) {
|
||||||
|
this.executor = executor;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Scenario getScenario() {
|
||||||
|
return scenario;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setScenario(Scenario scenario) {
|
||||||
|
this.scenario = scenario;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isFinished() {
|
||||||
|
return finished;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFinished(boolean finished) {
|
||||||
|
this.finished = finished;
|
||||||
|
}
|
||||||
|
|
||||||
|
public DataCollector getDataStatistics() {
|
||||||
|
return dataStatistics;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setDataStatistics(DataCollector dataStatistics) {
|
||||||
|
this.dataStatistics = dataStatistics;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ScenarioContext buildScenarioContext(UUID testId,
|
||||||
|
final Scenario scenario, int poolSize) {
|
||||||
|
ScenarioContext scenarioContext = new ScenarioContext();
|
||||||
|
final SynchronousQueue<Runnable> workQueue = new SynchronousQueue<Runnable>();
|
||||||
|
ThreadPoolExecutor executor = new ThreadPoolExecutor(poolSize,
|
||||||
|
poolSize, keepAliveTime, TimeUnit.MINUTES, workQueue,
|
||||||
|
new DiscardPolicy());
|
||||||
|
scenarioContext.setScenario(scenario);
|
||||||
|
scenarioContext.setStartDate(new Date(System.currentTimeMillis()));
|
||||||
|
scenarioContext.setExecutorService(executor);
|
||||||
|
scenarioContext.setDataStatistics(new ScenarioResultCollector(testId));
|
||||||
|
return scenarioContext;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,92 @@
|
||||||
|
package org.bench4q.agent.scenario;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.UUID;
|
||||||
|
import java.util.concurrent.ExecutorService;
|
||||||
|
import java.util.concurrent.Executors;
|
||||||
|
import org.apache.log4j.Logger;
|
||||||
|
import org.bench4q.agent.parameterization.impl.InstanceControler;
|
||||||
|
import org.bench4q.agent.storage.StorageHelper;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
@Component
|
||||||
|
public class ScenarioEngine {
|
||||||
|
private Map<UUID, ScenarioContext> runningTests;
|
||||||
|
private StorageHelper storageHelper;
|
||||||
|
private Logger logger;
|
||||||
|
|
||||||
|
@SuppressWarnings("unused")
|
||||||
|
private Logger getLogger() {
|
||||||
|
return logger;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setLogger(Logger logger) {
|
||||||
|
this.logger = logger;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ScenarioEngine() {
|
||||||
|
this.setRunningTests(new HashMap<UUID, ScenarioContext>());
|
||||||
|
this.setLogger(Logger.getLogger(ScenarioEngine.class));
|
||||||
|
}
|
||||||
|
|
||||||
|
public StorageHelper getStorageHelper() {
|
||||||
|
return storageHelper;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
public void setStorageHelper(StorageHelper storageHelper) {
|
||||||
|
this.storageHelper = storageHelper;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Map<UUID, ScenarioContext> getRunningTests() {
|
||||||
|
return runningTests;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setRunningTests(Map<UUID, ScenarioContext> runningTests) {
|
||||||
|
this.runningTests = runningTests;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void submitScenario(UUID runId, final Scenario scenario, int poolSize) {
|
||||||
|
try {
|
||||||
|
final ScenarioContext scenarioContext = ScenarioContext
|
||||||
|
.buildScenarioContext(runId, scenario, poolSize);
|
||||||
|
this.getRunningTests().put(runId, scenarioContext);
|
||||||
|
|
||||||
|
System.out.println(poolSize);
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean runWith(UUID runId) {
|
||||||
|
if (!this.getRunningTests().containsKey(runId)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
final ScenarioContext context = this.getRunningTests().get(runId);
|
||||||
|
return runWith(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean runWith(final ScenarioContext scenarioContext) {
|
||||||
|
if (scenarioContext == null) {
|
||||||
|
logger.error("The context required is null");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
ExecutorService taskMaker = Executors.newSingleThreadExecutor();
|
||||||
|
|
||||||
|
taskMaker.execute(new Runnable() {
|
||||||
|
public void run() {
|
||||||
|
while (!scenarioContext.isFinished()) {
|
||||||
|
scenarioContext.getExecutor()
|
||||||
|
.execute(
|
||||||
|
new Worker(scenarioContext,
|
||||||
|
new InstanceControler()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,28 @@
|
||||||
|
package org.bench4q.agent.scenario;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public class SessionContext {
|
||||||
|
Map<String, String> variables;
|
||||||
|
|
||||||
|
private Map<String, String> getVariables() {
|
||||||
|
return variables;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setVariables(Map<String, String> variables) {
|
||||||
|
this.variables = variables;
|
||||||
|
}
|
||||||
|
|
||||||
|
public SessionContext() {
|
||||||
|
this.setVariables(new HashMap<String, String>());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addAVariable(String entryName, String entryValue) {
|
||||||
|
this.getVariables().put(entryName, entryValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getVariable(String entryName) {
|
||||||
|
return this.getVariable(entryName);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,111 @@
|
||||||
|
package org.bench4q.agent.scenario;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
import javax.xml.bind.annotation.XmlElement;
|
||||||
|
import javax.xml.bind.annotation.XmlElementWrapper;
|
||||||
|
import javax.xml.bind.annotation.XmlRootElement;
|
||||||
|
|
||||||
|
@XmlRootElement(name = "testResult")
|
||||||
|
public class TestResult implements Serializable {
|
||||||
|
private static final long serialVersionUID = -370091935554266546L;
|
||||||
|
private UUID runId;
|
||||||
|
private int poolSize;
|
||||||
|
private int totalCount;
|
||||||
|
private Date startDate;
|
||||||
|
private long elapsedTime;
|
||||||
|
private int successCount;
|
||||||
|
private int failCount;
|
||||||
|
private int finishedCount;
|
||||||
|
private double averageResponseTime;
|
||||||
|
private List<TestResultItem> results;
|
||||||
|
|
||||||
|
@XmlElement
|
||||||
|
public UUID getRunId() {
|
||||||
|
return runId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setRunId(UUID runId) {
|
||||||
|
this.runId = runId;
|
||||||
|
}
|
||||||
|
|
||||||
|
@XmlElement
|
||||||
|
public int getPoolSize() {
|
||||||
|
return poolSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPoolSize(int poolSize) {
|
||||||
|
this.poolSize = poolSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
@XmlElement
|
||||||
|
public int getTotalCount() {
|
||||||
|
return totalCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTotalCount(int totalCount) {
|
||||||
|
this.totalCount = totalCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
@XmlElement
|
||||||
|
public Date getStartDate() {
|
||||||
|
return startDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setStartDate(Date startDate) {
|
||||||
|
this.startDate = startDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getElapsedTime() {
|
||||||
|
return elapsedTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setElapsedTime(long elapsedTime) {
|
||||||
|
this.elapsedTime = elapsedTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getSuccessCount() {
|
||||||
|
return successCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSuccessCount(int successCount) {
|
||||||
|
this.successCount = successCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getFailCount() {
|
||||||
|
return failCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFailCount(int failCount) {
|
||||||
|
this.failCount = failCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getFinishedCount() {
|
||||||
|
return finishedCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFinishedCount(int finishedCount) {
|
||||||
|
this.finishedCount = finishedCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getAverageResponseTime() {
|
||||||
|
return averageResponseTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAverageResponseTime(double averageResponseTime) {
|
||||||
|
this.averageResponseTime = averageResponseTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
@XmlElementWrapper(name = "results")
|
||||||
|
@XmlElement(name = "result")
|
||||||
|
public List<TestResultItem> getResults() {
|
||||||
|
return results;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setResults(List<TestResultItem> results) {
|
||||||
|
this.results = results;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,93 @@
|
||||||
|
package org.bench4q.agent.scenario;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
import javax.xml.bind.annotation.XmlElement;
|
||||||
|
import javax.xml.bind.annotation.XmlRootElement;
|
||||||
|
|
||||||
|
@XmlRootElement(name = "testResultItem")
|
||||||
|
public class TestResultItem implements Serializable {
|
||||||
|
private static final long serialVersionUID = 3307951299814477213L;
|
||||||
|
private UUID id;
|
||||||
|
private String pluginId;
|
||||||
|
private String pluginName;
|
||||||
|
private String behaviorName;
|
||||||
|
private Date startDate;
|
||||||
|
private Date endDate;
|
||||||
|
private long responseTime;
|
||||||
|
private boolean success;
|
||||||
|
|
||||||
|
@XmlElement
|
||||||
|
public UUID getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(UUID id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
@XmlElement
|
||||||
|
public String getPluginId() {
|
||||||
|
return pluginId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPluginId(String pluginId) {
|
||||||
|
this.pluginId = pluginId;
|
||||||
|
}
|
||||||
|
|
||||||
|
@XmlElement
|
||||||
|
public String getPluginName() {
|
||||||
|
return pluginName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPluginName(String pluginName) {
|
||||||
|
this.pluginName = pluginName;
|
||||||
|
}
|
||||||
|
|
||||||
|
@XmlElement
|
||||||
|
public String getBehaviorName() {
|
||||||
|
return behaviorName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setBehaviorName(String behaviorName) {
|
||||||
|
this.behaviorName = behaviorName;
|
||||||
|
}
|
||||||
|
|
||||||
|
@XmlElement
|
||||||
|
public Date getStartDate() {
|
||||||
|
return startDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setStartDate(Date startDate) {
|
||||||
|
this.startDate = startDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
@XmlElement
|
||||||
|
public Date getEndDate() {
|
||||||
|
return endDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setEndDate(Date endDate) {
|
||||||
|
this.endDate = endDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
@XmlElement
|
||||||
|
public long getResponseTime() {
|
||||||
|
return responseTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setResponseTime(long responseTime) {
|
||||||
|
this.responseTime = responseTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
@XmlElement
|
||||||
|
public boolean isSuccess() {
|
||||||
|
return success;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSuccess(boolean success) {
|
||||||
|
this.success = success;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,32 @@
|
||||||
|
package org.bench4q.agent.scenario;
|
||||||
|
|
||||||
|
public class UsePlugin {
|
||||||
|
private String id;
|
||||||
|
private String name;
|
||||||
|
private Parameter[] parameters;
|
||||||
|
|
||||||
|
public String getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(String id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Parameter[] getParameters() {
|
||||||
|
return parameters;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setParameters(Parameter[] parameters) {
|
||||||
|
this.parameters = parameters;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,168 @@
|
||||||
|
package org.bench4q.agent.scenario;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.bench4q.agent.datacollector.DataCollector;
|
||||||
|
import org.bench4q.agent.helper.ApplicationContextHelper;
|
||||||
|
import org.bench4q.agent.parameterization.SessionObject;
|
||||||
|
import org.bench4q.agent.plugin.Plugin;
|
||||||
|
import org.bench4q.agent.plugin.PluginManager;
|
||||||
|
import org.bench4q.agent.plugin.result.HttpReturn;
|
||||||
|
import org.bench4q.agent.plugin.result.PluginReturn;
|
||||||
|
import org.bench4q.agent.scenario.behavior.Behavior;
|
||||||
|
|
||||||
|
public class Worker implements Runnable {
|
||||||
|
private ScenarioContext scenarioContext;
|
||||||
|
private SessionObject sessionObject;
|
||||||
|
|
||||||
|
private PluginManager pluginManager;
|
||||||
|
|
||||||
|
private ScenarioContext getScenarioContext() {
|
||||||
|
return scenarioContext;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setScenarioContext(ScenarioContext scenarioContext) {
|
||||||
|
this.scenarioContext = scenarioContext;
|
||||||
|
}
|
||||||
|
|
||||||
|
private SessionObject getSessionObject() {
|
||||||
|
return sessionObject;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setSessionObject(SessionObject sessionObject) {
|
||||||
|
this.sessionObject = sessionObject;
|
||||||
|
}
|
||||||
|
|
||||||
|
private PluginManager getPluginManager() {
|
||||||
|
return pluginManager;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setPluginManager(PluginManager pluginManager) {
|
||||||
|
this.pluginManager = pluginManager;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Worker(ScenarioContext scenarioContext, SessionObject sessionObject) {
|
||||||
|
this.setScenarioContext(scenarioContext);
|
||||||
|
this.setPluginManager(ApplicationContextHelper.getContext().getBean(
|
||||||
|
PluginManager.class));
|
||||||
|
this.setSessionObject(sessionObject);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void run() {
|
||||||
|
doRunScenario(getScenarioContext());
|
||||||
|
doCleanUp();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void doCleanUp() {
|
||||||
|
this.sessionObject.doCleanUp();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void doRunScenario(ScenarioContext context) {
|
||||||
|
Map<String, Object> plugins = new HashMap<String, Object>();
|
||||||
|
preparePlugins(context.getScenario(), plugins);
|
||||||
|
for (int i = 0; i < context.getScenario().getPages().length; i++) {
|
||||||
|
Page page = context.getScenario().getPages()[i];
|
||||||
|
context.getDataStatistics().add(
|
||||||
|
PageResult.buildPageResult(
|
||||||
|
i,
|
||||||
|
doRunBatchesInPage(plugins, page,
|
||||||
|
context.getDataStatistics())));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<BehaviorResult> doRunBatchesInPage(
|
||||||
|
Map<String, Object> plugins, Page page, DataCollector dataCollector) {
|
||||||
|
List<BehaviorResult> results = new ArrayList<BehaviorResult>();
|
||||||
|
for (Batch batch : page.getBatches()) {
|
||||||
|
results.addAll(doRunBatch(plugins, batch, dataCollector));
|
||||||
|
}
|
||||||
|
return results;
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<BehaviorResult> doRunBatch(Map<String, Object> plugins,
|
||||||
|
Batch batch, DataCollector dataCollector) {
|
||||||
|
List<BehaviorResult> results = new ArrayList<BehaviorResult>();
|
||||||
|
for (Behavior behavior : batch.getBehaviors()) {
|
||||||
|
// each execution should call this
|
||||||
|
behavior.distillParams(this.getSessionObject());
|
||||||
|
Object plugin = plugins.get(behavior.getUse());
|
||||||
|
Map<String, String> behaviorParameters = prepareBehaviorParameters(behavior);
|
||||||
|
Date startDate = new Date(System.currentTimeMillis());
|
||||||
|
PluginReturn pluginReturn = (PluginReturn) this.getPluginManager()
|
||||||
|
.doBehavior(plugin, behavior.getName(), behaviorParameters);
|
||||||
|
extractRunTimeParams(pluginReturn);
|
||||||
|
Date endDate = new Date(System.currentTimeMillis());
|
||||||
|
if (!behavior.shouldBeCountResponseTime()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
BehaviorResult behaviorResult = buildBehaviorResult(behavior,
|
||||||
|
plugin, startDate, pluginReturn, endDate);
|
||||||
|
pluginReturn = null;
|
||||||
|
dataCollector.add(behaviorResult);
|
||||||
|
results.add(behaviorResult);
|
||||||
|
}
|
||||||
|
return results;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void extractRunTimeParams(PluginReturn pluginReturn) {
|
||||||
|
this.getSessionObject().saveRuntimeParams(
|
||||||
|
pluginReturn.getRunTimeParams());
|
||||||
|
}
|
||||||
|
|
||||||
|
private BehaviorResult buildBehaviorResult(Behavior behavior,
|
||||||
|
Object plugin, Date startDate, PluginReturn pluginReturn,
|
||||||
|
Date endDate) {
|
||||||
|
BehaviorResult result = new BehaviorResult();
|
||||||
|
result.setStartDate(startDate);
|
||||||
|
result.setEndDate(endDate);
|
||||||
|
result.setSuccess(pluginReturn.isSuccess());
|
||||||
|
result.setResponseTime(endDate.getTime() - startDate.getTime());
|
||||||
|
result.setBehaviorName(behavior.getName());
|
||||||
|
result.setPluginId(behavior.getUse());
|
||||||
|
result.setPluginName(plugin.getClass().getAnnotation(Plugin.class)
|
||||||
|
.value());
|
||||||
|
result.setShouldBeCountResponseTime(behavior
|
||||||
|
.shouldBeCountResponseTime());
|
||||||
|
if (pluginReturn instanceof HttpReturn) {
|
||||||
|
HttpReturn httpReturn = (HttpReturn) pluginReturn;
|
||||||
|
result.setBehaviorId(behavior.getId());
|
||||||
|
for (Parameter parameter : behavior.getParameters()) {
|
||||||
|
if (parameter.getKey().equals("url")) {
|
||||||
|
result.setBehaviorUrl(parameter.getValue());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
result.setContentLength(httpReturn.getContentLength());
|
||||||
|
result.setContentType(httpReturn.getContentType());
|
||||||
|
result.setStatusCode(httpReturn.getStatusCode());
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Map<String, String> prepareBehaviorParameters(Behavior behavior) {
|
||||||
|
Map<String, String> behaviorParameters = new HashMap<String, String>();
|
||||||
|
for (Parameter parameter : behavior.getParameters()) {
|
||||||
|
behaviorParameters.put(parameter.getKey(), parameter.getValue());
|
||||||
|
}
|
||||||
|
return behaviorParameters;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void preparePlugins(Scenario scenario, Map<String, Object> plugins) {
|
||||||
|
for (UsePlugin usePlugin : scenario.getUsePlugins()) {
|
||||||
|
String pluginId = usePlugin.getId();
|
||||||
|
Class<?> pluginClass = this.getPluginManager().getPlugins()
|
||||||
|
.get(usePlugin.getName());
|
||||||
|
Map<String, String> initParameters = new HashMap<String, String>();
|
||||||
|
for (Parameter parameter : usePlugin.getParameters()) {
|
||||||
|
initParameters.put(parameter.getKey(), parameter.getValue());
|
||||||
|
}
|
||||||
|
Object plugin = this.getPluginManager().initializePlugin(
|
||||||
|
pluginClass, initParameters);
|
||||||
|
plugins.put(pluginId, plugin);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,71 @@
|
||||||
|
package org.bench4q.agent.scenario.behavior;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.bench4q.agent.datacollector.DataCollector;
|
||||||
|
import org.bench4q.agent.datacollector.impl.BehaviorStatusCodeResult;
|
||||||
|
import org.bench4q.agent.parameterization.SessionObject;
|
||||||
|
import org.bench4q.agent.scenario.Parameter;
|
||||||
|
|
||||||
|
public abstract class Behavior {
|
||||||
|
private int id;
|
||||||
|
private String use;
|
||||||
|
private String name;
|
||||||
|
private Parameter[] parameters;
|
||||||
|
|
||||||
|
public int getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(int id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getUse() {
|
||||||
|
return use;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUse(String use) {
|
||||||
|
this.use = use;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Parameter[] getParameters() {
|
||||||
|
return parameters;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setParameters(Parameter[] parameters) {
|
||||||
|
this.parameters = parameters;
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract boolean shouldBeCountResponseTime();
|
||||||
|
|
||||||
|
public abstract Map<Integer, BehaviorStatusCodeResult> getBehaviorBriefResult(
|
||||||
|
DataCollector dataStatistics);
|
||||||
|
|
||||||
|
public String getUrl() {
|
||||||
|
for (Parameter parameter : this.getParameters()) {
|
||||||
|
if (parameter.getKey().equals("url")) {
|
||||||
|
return parameter.getValue();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
public void distillParams(SessionObject session) {
|
||||||
|
for (Parameter parameter : this.getParameters()) {
|
||||||
|
String s = parameter.getValue();
|
||||||
|
System.out.println("before Change :" + s);
|
||||||
|
String re = session.getParam(s);
|
||||||
|
System.out.println("after Change : " + re);
|
||||||
|
parameter.setValue(re);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
package org.bench4q.agent.scenario.behavior;
|
||||||
|
|
||||||
|
import org.bench4q.share.models.agent.scriptrecord.BehaviorModel;
|
||||||
|
|
||||||
|
public class BehaviorFactory {
|
||||||
|
public static Behavior getBuisinessObject(BehaviorModel modelInput) {
|
||||||
|
if (modelInput.getType().equalsIgnoreCase("TIMERBEHAVIOR")) {
|
||||||
|
return new TimerBehavior();
|
||||||
|
} else if (modelInput.getType().equalsIgnoreCase("USERBEHAVIOR")) {
|
||||||
|
return new UserBehavior();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,21 @@
|
||||||
|
package org.bench4q.agent.scenario.behavior;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.bench4q.agent.datacollector.DataCollector;
|
||||||
|
import org.bench4q.agent.datacollector.impl.BehaviorStatusCodeResult;
|
||||||
|
|
||||||
|
public class TimerBehavior extends Behavior {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean shouldBeCountResponseTime() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Map<Integer, BehaviorStatusCodeResult> getBehaviorBriefResult(
|
||||||
|
DataCollector dataStatistics) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,20 @@
|
||||||
|
package org.bench4q.agent.scenario.behavior;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.bench4q.agent.datacollector.DataCollector;
|
||||||
|
import org.bench4q.agent.datacollector.impl.BehaviorStatusCodeResult;
|
||||||
|
|
||||||
|
public class UserBehavior extends Behavior {
|
||||||
|
@Override
|
||||||
|
public boolean shouldBeCountResponseTime() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Map<Integer, BehaviorStatusCodeResult> getBehaviorBriefResult(
|
||||||
|
DataCollector dataStatistics) {
|
||||||
|
return dataStatistics.getBehaviorBriefStatistics(this.getId());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,122 @@
|
||||||
|
package org.bench4q.agent.scenario.util;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.StringTokenizer;
|
||||||
|
|
||||||
|
import org.bench4q.agent.plugin.basic.http.ParameterConstant;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author coderfengyun
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public abstract class ParameterParser {
|
||||||
|
private static final String RadioGroup_SEPARATOR = ";";
|
||||||
|
private static final String NFIELD_SEPARATOR = RadioGroup_SEPARATOR;
|
||||||
|
|
||||||
|
static public List<String> buildNField(String value) {
|
||||||
|
StringTokenizer st = new StringTokenizer(value, NFIELD_SEPARATOR, false);
|
||||||
|
List<String> result = new ArrayList<String>();
|
||||||
|
while (st.hasMoreTokens()) {
|
||||||
|
String token = st.nextToken();
|
||||||
|
result.add(token.trim());
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
static public String buildRadioGroup(String value) {
|
||||||
|
List<String> realTokens = getRealTokens(RadioGroup_SEPARATOR, value,
|
||||||
|
false);
|
||||||
|
if (realTokens.size() == 0) {
|
||||||
|
return "";
|
||||||
|
} else {
|
||||||
|
return unescape(realTokens.get(0));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static public List<String> buildCheckBox(String value) {
|
||||||
|
return buildNField(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
static public String buildCombo(String value) {
|
||||||
|
return buildRadioGroup(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
static public Table buildTable(String value, List<String> columnLables) {
|
||||||
|
return Table.buildTable(value, columnLables);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the number of escape character in the end of the string
|
||||||
|
*
|
||||||
|
* @param value
|
||||||
|
* The string to be analyzed
|
||||||
|
* @return 0 if no escape character was found, else the number
|
||||||
|
*/
|
||||||
|
private static int getNumberOfEscapeCharacter(String value) {
|
||||||
|
int result = 0;
|
||||||
|
if (value.length() > 0) {
|
||||||
|
int last = value.lastIndexOf(ParameterConstant.escape);
|
||||||
|
if (last == value.length() - 1) {
|
||||||
|
result = 1 + getNumberOfEscapeCharacter(value
|
||||||
|
.substring(0, last));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Split the string value with the separator, and check if there is no
|
||||||
|
* escape character before the separator
|
||||||
|
*
|
||||||
|
* @param separator
|
||||||
|
* The separator
|
||||||
|
* @param value
|
||||||
|
* The string value to be split
|
||||||
|
* @return The vector containing each token
|
||||||
|
*/
|
||||||
|
static List<String> getRealTokens(String separator, String value,
|
||||||
|
boolean toUnescapeSeparator) {
|
||||||
|
List<String> result = new ArrayList<String>();
|
||||||
|
for (String entry : value.split(separator)) {
|
||||||
|
if (getNumberOfEscapeCharacter(entry) % 2 != 0) {
|
||||||
|
if (toUnescapeSeparator) {
|
||||||
|
entry = entry.substring(0, entry.length() - 1)
|
||||||
|
+ unescape(separator);
|
||||||
|
} else {
|
||||||
|
entry = entry.substring(0, entry.length() - 1) + separator;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
result.add(entry);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Replaces every escape sequences by the corresponding original character
|
||||||
|
*
|
||||||
|
* @param value
|
||||||
|
* the string where some characters are escaped by '\' character
|
||||||
|
* @return the unescaped string
|
||||||
|
*/
|
||||||
|
static String unescape(String value) {
|
||||||
|
StringBuilder result = new StringBuilder();
|
||||||
|
char c;
|
||||||
|
boolean escape = false; // escape sequence
|
||||||
|
for (int i = 0; i < value.length(); ++i) {
|
||||||
|
c = value.charAt(i);
|
||||||
|
if (escape) {
|
||||||
|
result.append(c);
|
||||||
|
escape = false;
|
||||||
|
} else {
|
||||||
|
if (c == ParameterConstant.escape.charAt(0)) {
|
||||||
|
escape = true;
|
||||||
|
} else {
|
||||||
|
result.append(c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result.toString();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,115 @@
|
||||||
|
package org.bench4q.agent.scenario.util;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.bench4q.agent.plugin.basic.http.ParameterConstant;
|
||||||
|
|
||||||
|
public class Table {
|
||||||
|
public static final String ROW_SEPARATOR = "|;";
|
||||||
|
public static final String COLUMN_SEPARATOR = "|";
|
||||||
|
public static final String ROW_SEPARATOR_TAIL = ";";
|
||||||
|
|
||||||
|
public static final String ESCAPE_ROW_SEPARATOR = ParameterConstant.escape
|
||||||
|
+ ROW_SEPARATOR;
|
||||||
|
public static final String ESCAPE_COLUMN_SEPARATOR = ParameterConstant.escape
|
||||||
|
+ COLUMN_SEPARATOR;
|
||||||
|
private List<List<String>> realContent;
|
||||||
|
private List<String> columnLables;
|
||||||
|
|
||||||
|
public List<List<String>> getRealContent() {
|
||||||
|
return realContent;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setRealContent(List<List<String>> realContent) {
|
||||||
|
this.realContent = realContent;
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<String> getColumnLables() {
|
||||||
|
return columnLables;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setColumnLables(List<String> columnLables) {
|
||||||
|
this.columnLables = columnLables;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Table() {
|
||||||
|
this.setColumnLables(new LinkedList<String>());
|
||||||
|
}
|
||||||
|
|
||||||
|
static Table buildTable(String value, List<String> columnLablesInSequence) {
|
||||||
|
Table result = new Table();
|
||||||
|
result.setRealContent(buildTableContent(value));
|
||||||
|
result.setColumnLables(columnLablesInSequence);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method analyzes the value to be set in the table, and remove all
|
||||||
|
* escape characters
|
||||||
|
*
|
||||||
|
* @param value
|
||||||
|
* The value containing the serialization of all values of the
|
||||||
|
* table
|
||||||
|
* @return The vector containing all the entries, each entries is in a
|
||||||
|
* vector, which contains the string values
|
||||||
|
*/
|
||||||
|
private static List<List<String>> buildTableContent(String value) {
|
||||||
|
List<String> tempEntries = ParameterParser.getRealTokens(
|
||||||
|
Table.ESCAPE_ROW_SEPARATOR, value, false);
|
||||||
|
List<List<String>> allValues = new ArrayList<List<String>>();
|
||||||
|
for (int i = 0; i < tempEntries.size(); i++) {
|
||||||
|
String tempEntry = tempEntries.get(i);
|
||||||
|
List<String> values = ParameterParser.getRealTokens(
|
||||||
|
Table.ESCAPE_COLUMN_SEPARATOR, tempEntry, true);
|
||||||
|
arrangeTableWithRowSeparatorTail(values);
|
||||||
|
allValues.add(values);
|
||||||
|
}
|
||||||
|
// now analyze all values, and get the '=' separator
|
||||||
|
return extractValueFromWellFormedTable(allValues);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static List<List<String>> extractValueFromWellFormedTable(
|
||||||
|
List<List<String>> allValues) {
|
||||||
|
List<List<String>> result = new LinkedList<List<String>>();
|
||||||
|
for (int i = 0; i < allValues.size(); i++) {
|
||||||
|
List<String> resultValues = new ArrayList<String>();
|
||||||
|
List<String> tempValues = allValues.get(i);
|
||||||
|
for (int j = 0; j < tempValues.size(); j++) {
|
||||||
|
String v = tempValues.get(j);
|
||||||
|
List<String> temp = ParameterParser
|
||||||
|
.getRealTokens("=", v, false);
|
||||||
|
String res;
|
||||||
|
if (temp.size() <= 1) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
res = temp.get(1);
|
||||||
|
resultValues.add(res);
|
||||||
|
}
|
||||||
|
result.add(resultValues);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method check if the table_separator after escape is split by the
|
||||||
|
* table_entry_separator
|
||||||
|
*
|
||||||
|
* @param values
|
||||||
|
*/
|
||||||
|
private static void arrangeTableWithRowSeparatorTail(List<String> values) {
|
||||||
|
for (int i = 0; i < values.size(); i++) {
|
||||||
|
|
||||||
|
String currentToken = values.get(i);
|
||||||
|
if (currentToken.equals(Table.ROW_SEPARATOR_TAIL) && i > 0) {
|
||||||
|
values.set(i - 1, values.get(i - 1) + Table.ROW_SEPARATOR_TAIL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getColumnCount() {
|
||||||
|
return this.getColumnLables().size();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,13 @@
|
||||||
|
package org.bench4q.agent.share;
|
||||||
|
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
|
import java.io.PrintStream;
|
||||||
|
|
||||||
|
public class DealWithLog {
|
||||||
|
public static ByteArrayOutputStream getExceptionStackTrace(Exception e) {
|
||||||
|
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
|
||||||
|
PrintStream printStream = new PrintStream(outputStream);
|
||||||
|
e.printStackTrace(printStream);
|
||||||
|
return outputStream;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,57 @@
|
||||||
|
package org.bench4q.agent.storage;
|
||||||
|
|
||||||
|
public class Buffer {
|
||||||
|
private byte[] content;
|
||||||
|
private int currentPos;
|
||||||
|
private int totalSize;
|
||||||
|
|
||||||
|
public byte[] getContent() {
|
||||||
|
return content;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setContent(byte[] content) {
|
||||||
|
this.content = content;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getCurrentPos() {
|
||||||
|
return currentPos;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCurrentPos(int currentPos) {
|
||||||
|
this.currentPos = currentPos;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getTotalSize() {
|
||||||
|
return totalSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTotalSize(int totalSize) {
|
||||||
|
this.totalSize = totalSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Buffer createBuffer(int totalSize) {
|
||||||
|
Buffer buffer = new Buffer();
|
||||||
|
buffer.setContent(new byte[totalSize]);
|
||||||
|
buffer.setCurrentPos(0);
|
||||||
|
buffer.setTotalSize(totalSize);
|
||||||
|
return buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getRemainSize() {
|
||||||
|
return this.totalSize - this.currentPos;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void reset() {
|
||||||
|
this.setCurrentPos(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFull() {
|
||||||
|
this.setCurrentPos(this.getTotalSize());
|
||||||
|
}
|
||||||
|
|
||||||
|
void writeToCurrentBuffer(int size, byte[] cache) {
|
||||||
|
System.arraycopy(cache, 0, this.getContent(), this.getCurrentPos(),
|
||||||
|
size);
|
||||||
|
this.setCurrentPos(this.getCurrentPos() + size);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,157 @@
|
||||||
|
package org.bench4q.agent.storage;
|
||||||
|
|
||||||
|
import java.io.ByteArrayInputStream;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FilenameFilter;
|
||||||
|
import java.nio.charset.Charset;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.concurrent.ExecutorService;
|
||||||
|
import java.util.concurrent.Executors;
|
||||||
|
|
||||||
|
import org.bench4q.share.models.agent.CleanTestResultModel;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
@Component
|
||||||
|
public class DoubleBufferStorage {
|
||||||
|
private static final int THRESHOLD = 1024;
|
||||||
|
private static Charset charset = Charset.forName("utf-8");
|
||||||
|
private static int BUFFER_SIZE = 48 * 1024;
|
||||||
|
private List<Buffer> bufferList;
|
||||||
|
private int currentBufferIndex;
|
||||||
|
private LocalStorage localStorage;
|
||||||
|
public CleanTestResultModel forTest = new CleanTestResultModel();
|
||||||
|
|
||||||
|
private int getCurrentBufferIndex() {
|
||||||
|
return currentBufferIndex;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setCurrentBufferIndex(int currentBuffer) {
|
||||||
|
this.currentBufferIndex = currentBuffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<Buffer> getBufferList() {
|
||||||
|
return bufferList;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setBufferList(List<Buffer> bufferList) {
|
||||||
|
this.bufferList = bufferList;
|
||||||
|
}
|
||||||
|
|
||||||
|
private LocalStorage getLocalStorage() {
|
||||||
|
return localStorage;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private void setLocalStorage(LocalStorage localStorage) {
|
||||||
|
this.localStorage = localStorage;
|
||||||
|
}
|
||||||
|
|
||||||
|
public DoubleBufferStorage() {
|
||||||
|
this.setBufferList(new ArrayList<Buffer>());
|
||||||
|
this.getBufferList().add(Buffer.createBuffer(BUFFER_SIZE));
|
||||||
|
this.getBufferList().add(Buffer.createBuffer(BUFFER_SIZE));
|
||||||
|
this.setCurrentBufferIndex(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String readFiles(String pathPrefix) {
|
||||||
|
int pos = pathPrefix.lastIndexOf(System.getProperty("file.separator"));
|
||||||
|
String dirPath = pathPrefix.substring(0, pos);
|
||||||
|
final String prefix = pathPrefix.substring(pos + 1);
|
||||||
|
String result = new String();
|
||||||
|
|
||||||
|
File dirFile = new File(dirPath);
|
||||||
|
if (!dirFile.exists()) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
File[] files = dirFile.listFiles(new FilenameFilter() {
|
||||||
|
public boolean accept(File dir, String name) {
|
||||||
|
return name.contains(prefix);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
for (File file : files) {
|
||||||
|
if (!file.exists()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
result += this.getLocalStorage().readFile(file.getAbsolutePath());
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean writeFile(String content, String path) {
|
||||||
|
ByteArrayInputStream inputStream = new ByteArrayInputStream(
|
||||||
|
content.getBytes(charset));
|
||||||
|
int size = -1;
|
||||||
|
byte[] cache = new byte[THRESHOLD];
|
||||||
|
while ((size = inputStream.read(cache, 0, THRESHOLD)) != -1) {
|
||||||
|
if (isCurrentBufferFull(size)) {
|
||||||
|
doSave(calculateSavePath(path));
|
||||||
|
changeToTheMaxRemainBuffer();
|
||||||
|
}
|
||||||
|
this.getCurrentBuffer().writeToCurrentBuffer(size, cache);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isCurrentBufferFull(int size) {
|
||||||
|
return getCurrentBuffer().getRemainSize() <= THRESHOLD + size;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String calculateSavePath(String path, int index) {
|
||||||
|
return path.substring(0, path.lastIndexOf(".")) + "_" + index + ".xml";
|
||||||
|
}
|
||||||
|
|
||||||
|
private String calculateSavePath(String path) {
|
||||||
|
return calculateSavePath(path, this.getCurrentBufferIndex());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void doSave(final String path) {
|
||||||
|
final Buffer bufferUnderSave = this.getCurrentBuffer();
|
||||||
|
final String writeContent = this.getMeaningfulContent();
|
||||||
|
Runnable runnable = new Runnable() {
|
||||||
|
public void run() {
|
||||||
|
getLocalStorage().writeFile(writeContent, path);
|
||||||
|
bufferUnderSave.reset();
|
||||||
|
forTest.setSuccess(true);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
ExecutorService service = Executors.newFixedThreadPool(1);
|
||||||
|
service.execute(runnable);
|
||||||
|
service.shutdown();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getMeaningfulContent() {
|
||||||
|
byte[] meaningfulContent = new byte[getCurrentBuffer().getCurrentPos()];
|
||||||
|
System.arraycopy(getCurrentBuffer().getContent(), 0, meaningfulContent,
|
||||||
|
0, getCurrentBuffer().getCurrentPos());
|
||||||
|
return new String(meaningfulContent);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void changeToTheMaxRemainBuffer() {
|
||||||
|
int maxRemainSize = 2 * THRESHOLD;
|
||||||
|
int maxRemainSizeBufferIndex = -1;
|
||||||
|
for (int i = 0; i < this.getBufferList().size(); ++i) {
|
||||||
|
System.out.println(i + " remain : "
|
||||||
|
+ this.getBufferList().get(i).getRemainSize());
|
||||||
|
if (this.getBufferList().get(i).getRemainSize() > maxRemainSize) {
|
||||||
|
maxRemainSize = this.getBufferList().get(i).getRemainSize();
|
||||||
|
maxRemainSizeBufferIndex = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (maxRemainSizeBufferIndex == -1) {
|
||||||
|
this.getBufferList().add(Buffer.createBuffer(BUFFER_SIZE));
|
||||||
|
maxRemainSizeBufferIndex = this.getBufferList().size() - 1;
|
||||||
|
}
|
||||||
|
this.setCurrentBufferIndex(maxRemainSizeBufferIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Buffer getCurrentBuffer() {
|
||||||
|
return this.getBufferList().get(this.getCurrentBufferIndex());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void flush() {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,140 @@
|
||||||
|
package org.bench4q.agent.storage;
|
||||||
|
|
||||||
|
import java.io.ByteArrayInputStream;
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
|
||||||
|
import org.apache.hadoop.conf.Configuration;
|
||||||
|
import org.apache.hadoop.fs.FSDataInputStream;
|
||||||
|
import org.apache.hadoop.fs.FSDataOutputStream;
|
||||||
|
import org.apache.hadoop.fs.FileStatus;
|
||||||
|
import org.apache.hadoop.fs.FileSystem;
|
||||||
|
import org.apache.hadoop.fs.Path;
|
||||||
|
import org.apache.hadoop.io.IOUtils;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
@Component
|
||||||
|
public class HdfsStorage implements Storage {
|
||||||
|
private FileSystem getFileSystem() throws IOException {
|
||||||
|
Configuration conf = new Configuration();
|
||||||
|
conf.set("mapred.jop.tracker", "hdfs://133.133.12.21:9001");
|
||||||
|
conf.set("fs.default.name", "hdfs://133.133.12.21:9000");
|
||||||
|
return FileSystem.get(conf);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean uploadFile(String localPath, String remotePath) {
|
||||||
|
try {
|
||||||
|
FileSystem fs = this.getFileSystem();
|
||||||
|
fs.copyFromLocalFile(new Path(localPath), new Path(remotePath));
|
||||||
|
return true;
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean writeFile(String content, String remotePath) {
|
||||||
|
try {
|
||||||
|
InputStream in = new ByteArrayInputStream(content.getBytes());
|
||||||
|
FileSystem fs = this.getFileSystem();
|
||||||
|
OutputStream out = fs.create(new Path(remotePath));
|
||||||
|
IOUtils.copyBytes(in, out, 4096, true);
|
||||||
|
return true;
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean downloadFile(String localPath, String remotePath) {
|
||||||
|
try {
|
||||||
|
FileSystem fs = this.getFileSystem();
|
||||||
|
fs.copyToLocalFile(new Path(remotePath), new Path(localPath));
|
||||||
|
return true;
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public String readFile(String remotePath) {
|
||||||
|
try {
|
||||||
|
FileSystem fs = this.getFileSystem();
|
||||||
|
FSDataInputStream hdfsInStream = fs.open(new Path(remotePath));
|
||||||
|
OutputStream out = new ByteArrayOutputStream();
|
||||||
|
byte[] ioBuffer = new byte[1024];
|
||||||
|
int readLen = hdfsInStream.read(ioBuffer);
|
||||||
|
while (-1 != readLen) {
|
||||||
|
out.write(ioBuffer, 0, readLen);
|
||||||
|
readLen = hdfsInStream.read(ioBuffer);
|
||||||
|
}
|
||||||
|
out.close();
|
||||||
|
String ret = out.toString();
|
||||||
|
hdfsInStream.close();
|
||||||
|
return ret;
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean appendFile(String content, String remotePath) {
|
||||||
|
try {
|
||||||
|
FileSystem fs = this.getFileSystem();
|
||||||
|
FSDataOutputStream out = fs.append(new Path(remotePath));
|
||||||
|
int readLen = content.getBytes().length;
|
||||||
|
while (-1 != readLen) {
|
||||||
|
out.write(content.getBytes(), 0, readLen);
|
||||||
|
}
|
||||||
|
out.close();
|
||||||
|
return true;
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean deleteFile(String remotePath) {
|
||||||
|
try {
|
||||||
|
FileSystem fs = this.getFileSystem();
|
||||||
|
return fs.delete(new Path(remotePath), false);
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean deleteDirectory(String remotePath) {
|
||||||
|
try {
|
||||||
|
FileSystem fs = this.getFileSystem();
|
||||||
|
return fs.delete(new Path(remotePath), true);
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean renameFile(String fromPath, String toPath) {
|
||||||
|
try {
|
||||||
|
FileSystem fs = this.getFileSystem();
|
||||||
|
return fs.rename(new Path(fromPath), new Path(toPath));
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public FileStatus[] listFile(String remotePath) {
|
||||||
|
try {
|
||||||
|
FileSystem fs = this.getFileSystem();
|
||||||
|
FileStatus[] fileList = fs.listStatus(new Path(remotePath));
|
||||||
|
return fileList;
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,50 @@
|
||||||
|
package org.bench4q.agent.storage;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
import java.io.OutputStreamWriter;
|
||||||
|
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
@Component
|
||||||
|
public class LocalStorage implements Storage {
|
||||||
|
|
||||||
|
public String readFile(String path) {
|
||||||
|
try {
|
||||||
|
InputStreamReader inputStreamReader = new InputStreamReader(
|
||||||
|
new FileInputStream(new File(path)), "UTF-8");
|
||||||
|
StringBuffer ret = new StringBuffer();
|
||||||
|
int toRead;
|
||||||
|
while ((toRead = inputStreamReader.read()) != -1) {
|
||||||
|
ret.append((char) toRead);
|
||||||
|
}
|
||||||
|
inputStreamReader.close();
|
||||||
|
return ret.toString();
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean writeFile(String content, String path) {
|
||||||
|
try {
|
||||||
|
String dirPath = path.substring(0,
|
||||||
|
path.lastIndexOf(System.getProperty("file.separator")));
|
||||||
|
File file = new File(dirPath);
|
||||||
|
if (!file.exists()) {
|
||||||
|
file.mkdirs();
|
||||||
|
}
|
||||||
|
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(
|
||||||
|
new FileOutputStream(new File(path), true), "UTF-8");
|
||||||
|
outputStreamWriter.write(content);
|
||||||
|
outputStreamWriter.flush();
|
||||||
|
outputStreamWriter.close();
|
||||||
|
return true;
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,17 @@
|
||||||
|
package org.bench4q.agent.storage;
|
||||||
|
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
@Component
|
||||||
|
public class MooseStorage implements Storage {
|
||||||
|
|
||||||
|
public String readFile(String path) {
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean writeFile(String content, String path) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,7 @@
|
||||||
|
package org.bench4q.agent.storage;
|
||||||
|
|
||||||
|
public interface Storage {
|
||||||
|
public String readFile(String path);
|
||||||
|
|
||||||
|
public boolean writeFile(String content, String path);
|
||||||
|
}
|
|
@ -0,0 +1,39 @@
|
||||||
|
package org.bench4q.agent.storage;
|
||||||
|
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
@Component
|
||||||
|
public class StorageHelper {
|
||||||
|
private HdfsStorage hdfsStorage;
|
||||||
|
private LocalStorage localStorage;
|
||||||
|
private MooseStorage mooseStorage;
|
||||||
|
|
||||||
|
public HdfsStorage getHdfsStorage() {
|
||||||
|
return hdfsStorage;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
public void setHdfsStorage(HdfsStorage hdfsStorage) {
|
||||||
|
this.hdfsStorage = hdfsStorage;
|
||||||
|
}
|
||||||
|
|
||||||
|
public LocalStorage getLocalStorage() {
|
||||||
|
return localStorage;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
public void setLocalStorage(LocalStorage localStorage) {
|
||||||
|
this.localStorage = localStorage;
|
||||||
|
}
|
||||||
|
|
||||||
|
public MooseStorage getMooseStorage() {
|
||||||
|
return mooseStorage;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
public void setMooseStorage(MooseStorage mooseStorage) {
|
||||||
|
this.mooseStorage = mooseStorage;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,31 @@
|
||||||
|
log4j.rootLogger = INFO,WARN,ERROR,FALTAL,D
|
||||||
|
|
||||||
|
log4j.appender.WARN = org.apache.log4j.DailyRollingFileAppender
|
||||||
|
log4j.appender.WARN.File = logs/log.log
|
||||||
|
log4j.appender.WARN.Append = true
|
||||||
|
log4j.appender.WARN.Threshold = WARN
|
||||||
|
log4j.appender.WARN.layout = org.apache.log4j.PatternLayout
|
||||||
|
log4j.appender.WARN.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
|
||||||
|
|
||||||
|
log4j.appender.ERROR = org.apache.log4j.DailyRollingFileAppender
|
||||||
|
log4j.appender.ERROR.File = logs/log.log
|
||||||
|
log4j.appender.ERROR.Append = true
|
||||||
|
log4j.appender.ERROR.Threshold = ERROR
|
||||||
|
log4j.appender.ERROR.layout = org.apache.log4j.PatternLayout
|
||||||
|
log4j.appender.ERROR.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
|
||||||
|
|
||||||
|
log4j.appender.FALTAL = org.apache.log4j.DailyRollingFileAppender
|
||||||
|
log4j.appender.FALTAL.File = logs/log.log
|
||||||
|
log4j.appender.FALTAL.Append = true
|
||||||
|
log4j.appender.FALTAL.Threshold = ERROR
|
||||||
|
log4j.appender.FALTAL.layout = org.apache.log4j.PatternLayout
|
||||||
|
log4j.appender.FALTAL.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
|
||||||
|
|
||||||
|
|
||||||
|
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
|
||||||
|
log4j.appender.D.File = logs/log.log
|
||||||
|
log4j.appender.D.Append = true
|
||||||
|
log4j.appender.D.Threshold = INFO
|
||||||
|
log4j.appender.D.layout = org.apache.log4j.PatternLayout
|
||||||
|
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
|
||||||
|
|
|
@ -0,0 +1,18 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
|
||||||
|
xmlns:mvc="http://www.springframework.org/schema/mvc"
|
||||||
|
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
|
||||||
|
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
|
||||||
|
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
|
||||||
|
<context:component-scan base-package="org.bench4q" />
|
||||||
|
<mvc:annotation-driven />
|
||||||
|
|
||||||
|
|
||||||
|
<bean id="multipartResolver"
|
||||||
|
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
|
||||||
|
<property name="maxUploadSize" value="5000000" />
|
||||||
|
<property name="maxInMemorySize" value="5000000" />
|
||||||
|
</bean>
|
||||||
|
|
||||||
|
</beans>
|
|
@ -0,0 +1,27 @@
|
||||||
|
package org.bench4q.agent.test;
|
||||||
|
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import javax.xml.bind.JAXBException;
|
||||||
|
|
||||||
|
import org.apache.commons.io.FileUtils;
|
||||||
|
import org.bench4q.agent.scenario.Scenario;
|
||||||
|
import org.bench4q.share.helper.MarshalHelper;
|
||||||
|
import org.bench4q.share.models.agent.RunScenarioModel;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
public class ExtractScenarioTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test() throws JAXBException, IOException {
|
||||||
|
RunScenarioModel runScenarioModel = (RunScenarioModel) MarshalHelper
|
||||||
|
.unmarshal(RunScenarioModel.class, FileUtils
|
||||||
|
.readFileToString(new File("Scripts/goodForPage.xml")));
|
||||||
|
Scenario scenario = Scenario.scenarioBuilder(runScenarioModel);
|
||||||
|
|
||||||
|
assertTrue(scenario.getPages().length > 0);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,5 @@
|
||||||
|
package org.bench4q.agent.test;
|
||||||
|
|
||||||
|
public class HomeControllerTest {
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,37 @@
|
||||||
|
package org.bench4q.agent.test;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.Properties;
|
||||||
|
|
||||||
|
import org.bench4q.agent.Main;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
|
public class MainTest {
|
||||||
|
public MainTest() {
|
||||||
|
Main.init();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void initTest() {
|
||||||
|
Main.init();
|
||||||
|
assertTrue(new File("configure").exists());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getPropertiesTest() throws IOException {
|
||||||
|
FileInputStream inputStream = new FileInputStream(new File("configure"
|
||||||
|
+ System.getProperty("file.separator")
|
||||||
|
+ "agent-config.properties"));
|
||||||
|
Properties properties = new Properties();
|
||||||
|
properties.load(inputStream);
|
||||||
|
assertEquals(6565,
|
||||||
|
Integer.parseInt((String) properties.get("servePort")));
|
||||||
|
assertEquals(false, Boolean.parseBoolean((String) properties
|
||||||
|
.get("isToSaveDetailResult")));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,5 @@
|
||||||
|
package org.bench4q.agent.test;
|
||||||
|
|
||||||
|
public class PluginControllerTest {
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,243 @@
|
||||||
|
package org.bench4q.agent.test;
|
||||||
|
|
||||||
|
import java.io.ByteArrayInputStream;
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
|
import javax.xml.bind.JAXBContext;
|
||||||
|
import javax.xml.bind.JAXBException;
|
||||||
|
import javax.xml.bind.Unmarshaller;
|
||||||
|
|
||||||
|
import org.apache.commons.io.FileUtils;
|
||||||
|
import org.bench4q.agent.parameterization.ParameterFileCollector;
|
||||||
|
import org.bench4q.share.communication.HttpRequester;
|
||||||
|
import org.bench4q.share.communication.HttpRequester.HttpResponse;
|
||||||
|
import org.bench4q.share.helper.MarshalHelper;
|
||||||
|
import org.bench4q.share.helper.TestHelper;
|
||||||
|
import org.bench4q.share.models.agent.BehaviorBriefModel;
|
||||||
|
import org.bench4q.share.models.agent.RunScenarioModel;
|
||||||
|
import org.bench4q.share.models.agent.RunScenarioResultModel;
|
||||||
|
import org.bench4q.share.models.agent.statistics.AgentBriefStatusModel;
|
||||||
|
import org.bench4q.share.models.agent.statistics.AgentBehaviorsBriefModel;
|
||||||
|
import org.bench4q.share.models.agent.statistics.AgentPageBriefModel;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
public class TestWithScriptFile {
|
||||||
|
private HttpRequester httpRequester;
|
||||||
|
private String url = "http://localhost:6565/test";
|
||||||
|
private String filePath;
|
||||||
|
private UUID testId;
|
||||||
|
private static int load = 10;
|
||||||
|
|
||||||
|
private String getFilePath() {
|
||||||
|
return filePath;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setFilePath(String filePath) {
|
||||||
|
this.filePath = filePath;
|
||||||
|
}
|
||||||
|
|
||||||
|
private HttpRequester getHttpRequester() {
|
||||||
|
return httpRequester;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setHttpRequester(HttpRequester httpRequester) {
|
||||||
|
this.httpRequester = httpRequester;
|
||||||
|
}
|
||||||
|
|
||||||
|
private UUID getTestId() {
|
||||||
|
return testId;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setTestId(UUID testId) {
|
||||||
|
this.testId = testId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public TestWithScriptFile() {
|
||||||
|
this.setFilePath("Scripts" + System.getProperty("file.separator")
|
||||||
|
+ "forGoodRecord.xml");
|
||||||
|
this.setHttpRequester(new HttpRequester());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void startTest() throws JAXBException {
|
||||||
|
try {
|
||||||
|
RunScenarioModel runScenarioModel = getScenarioModel();
|
||||||
|
if (runScenarioModel == null) {
|
||||||
|
System.out.println("can't execute an invalid script");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
assertTrue(runScenarioModel.getPages().size() > 0);
|
||||||
|
assertTrue(runScenarioModel.getPages().get(0).getBatches().get(0)
|
||||||
|
.getBehaviors().size() > 0);
|
||||||
|
|
||||||
|
HttpResponse httpResponse = this.getHttpRequester().sendPostXml(
|
||||||
|
this.url + "/runWithoutParams",
|
||||||
|
marshalRunScenarioModel(runScenarioModel), null);
|
||||||
|
RunScenarioResultModel resultModel = (RunScenarioResultModel) MarshalHelper
|
||||||
|
.unmarshal(RunScenarioResultModel.class,
|
||||||
|
httpResponse.getContent());
|
||||||
|
this.setTestId(resultModel.getRunId());
|
||||||
|
} catch (IOException e) {
|
||||||
|
System.out.println("IO exception!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private RunScenarioModel getScenarioModel() throws IOException {
|
||||||
|
String scriptContent;
|
||||||
|
File file = new File(this.getFilePath());
|
||||||
|
if (!file.exists()) {
|
||||||
|
System.out.println("this script not exists!");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
scriptContent = FileUtils.readFileToString(file);
|
||||||
|
RunScenarioModel runScenarioModel = extractRunScenarioModel(scriptContent);
|
||||||
|
runScenarioModel.setPoolSize(load);
|
||||||
|
return runScenarioModel;
|
||||||
|
}
|
||||||
|
|
||||||
|
private RunScenarioModel extractRunScenarioModel(String scriptContent) {
|
||||||
|
try {
|
||||||
|
Unmarshaller unmarshaller = JAXBContext.newInstance(
|
||||||
|
RunScenarioModel.class).createUnmarshaller();
|
||||||
|
return (RunScenarioModel) unmarshaller
|
||||||
|
.unmarshal(new ByteArrayInputStream(scriptContent
|
||||||
|
.getBytes()));
|
||||||
|
} catch (JAXBException e) {
|
||||||
|
System.out.println("model unmarshal has an exception!");
|
||||||
|
e.printStackTrace();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private String marshalRunScenarioModel(RunScenarioModel model)
|
||||||
|
throws JAXBException {
|
||||||
|
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
|
||||||
|
JAXBContext.newInstance(RunScenarioModel.class).createMarshaller()
|
||||||
|
.marshal(model, outputStream);
|
||||||
|
return outputStream.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void stopTest() throws IOException {
|
||||||
|
System.out.println("Enter stopTest!");
|
||||||
|
this.getHttpRequester().sendGet(
|
||||||
|
this.url + "/stop/" + this.getTestId().toString(), null, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void scenarioBrief() throws IOException, JAXBException {
|
||||||
|
System.out.println("Enter brief!");
|
||||||
|
HttpResponse httpResponse = this.getHttpRequester().sendGet(
|
||||||
|
this.url + "/brief/" + this.getTestId().toString(), null, null);
|
||||||
|
System.out.println(httpResponse.getContent());
|
||||||
|
AgentBriefStatusModel briefModel = (AgentBriefStatusModel) MarshalHelper
|
||||||
|
.unmarshal(AgentBriefStatusModel.class,
|
||||||
|
httpResponse.getContent());
|
||||||
|
assertTrue(briefModel.getTimeFrame() > 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void behaviorsBrief() throws IOException, JAXBException {
|
||||||
|
System.out.println("Enter behaviorsBrief!");
|
||||||
|
HttpResponse httpResponse = this.getHttpRequester().sendGet(
|
||||||
|
this.url + "/behaviorsBrief/" + this.getTestId().toString(),
|
||||||
|
null, null);
|
||||||
|
System.out.println(httpResponse.getContent());
|
||||||
|
AgentBehaviorsBriefModel behaviorsBriefModel = (AgentBehaviorsBriefModel) MarshalHelper
|
||||||
|
.unmarshal(AgentBehaviorsBriefModel.class,
|
||||||
|
httpResponse.getContent());
|
||||||
|
assertTrue(behaviorsBriefModel.getBehaviorBriefModels().size() > 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void behaviorBrief() throws IOException, JAXBException {
|
||||||
|
System.out.println("Enter behaviorBrief!");
|
||||||
|
HttpResponse httpResponse = this.getHttpRequester().sendGet(
|
||||||
|
this.url + "/brief/" + this.getTestId().toString() + "/0",
|
||||||
|
null, null);
|
||||||
|
BehaviorBriefModel behaviorBriefModel = (BehaviorBriefModel) MarshalHelper
|
||||||
|
.unmarshal(BehaviorBriefModel.class, httpResponse.getContent());
|
||||||
|
assertTrue(behaviorBriefModel.getDetailStatusCodeResultModels().size() > 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void integrateTest() throws JAXBException, InterruptedException,
|
||||||
|
IOException {
|
||||||
|
try {
|
||||||
|
this.startTest();
|
||||||
|
Thread.sleep(5000);
|
||||||
|
this.scenarioBrief();
|
||||||
|
Thread.sleep(5000);
|
||||||
|
this.behaviorsBrief();
|
||||||
|
Thread.sleep(5000);
|
||||||
|
this.behaviorBrief();
|
||||||
|
Thread.sleep(5000);
|
||||||
|
this.pageBrief(0);
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
} finally {
|
||||||
|
this.stopTest();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSubmitParamsAndRun() throws Exception {
|
||||||
|
List<File> files = new ArrayList<File>();
|
||||||
|
files.add(new File("Scripts" + System.getProperty("file.separator")
|
||||||
|
+ "forGoodRecord.xml"));
|
||||||
|
files.add(new File("Scripts" + System.getProperty("file.separator")
|
||||||
|
+ "testJD.xml"));
|
||||||
|
HttpResponse httpResponse = this.getHttpRequester().postFiles(
|
||||||
|
url + "/submitScenarioWithParams", "files[]", files,
|
||||||
|
"scenarioModel", new LinkedList<String>() {
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
{
|
||||||
|
add(MarshalHelper.tryMarshal(getScenarioModel()));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
assertNotNull(httpResponse);
|
||||||
|
assertNotNull(httpResponse.getContent());
|
||||||
|
assertEquals(200, httpResponse.getCode());
|
||||||
|
RunScenarioResultModel resultModel = (RunScenarioResultModel) MarshalHelper
|
||||||
|
.tryUnmarshal(RunScenarioResultModel.class,
|
||||||
|
httpResponse.getContent());
|
||||||
|
String dirPath = (String) TestHelper.invokePrivate(
|
||||||
|
new ParameterFileCollector(), "guardDirExists",
|
||||||
|
new Class[] { UUID.class },
|
||||||
|
new Object[] { resultModel.getRunId() });
|
||||||
|
File file = new File(dirPath);
|
||||||
|
assertTrue(file.exists());
|
||||||
|
assertEquals(2, file.listFiles().length);
|
||||||
|
System.out.println(httpResponse.getContent());
|
||||||
|
|
||||||
|
httpResponse = this.getHttpRequester().sendPost(
|
||||||
|
this.url + "/runWithParams/"
|
||||||
|
+ resultModel.getRunId().toString(), null, null);
|
||||||
|
assertNotNull(httpResponse);
|
||||||
|
System.out.println(httpResponse.getContent());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void pageBrief(int i) throws IOException, JAXBException {
|
||||||
|
try {
|
||||||
|
HttpResponse httpResponse = this.getHttpRequester().sendGet(
|
||||||
|
url + "/pageBrief/" + this.getTestId() + "/" + i, null,
|
||||||
|
null);
|
||||||
|
if (httpResponse == null || httpResponse.getContent().isEmpty()) {
|
||||||
|
fail();
|
||||||
|
}
|
||||||
|
System.out.println(httpResponse);
|
||||||
|
AgentPageBriefModel pageBriefModel = (AgentPageBriefModel) MarshalHelper
|
||||||
|
.unmarshal(AgentPageBriefModel.class,
|
||||||
|
httpResponse.getContent());
|
||||||
|
assertTrue(pageBriefModel.getCountFromBegin() > 0);
|
||||||
|
} catch (Exception e) {
|
||||||
|
this.stopTest();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,139 @@
|
||||||
|
package org.bench4q.agent.test.datastatistics;
|
||||||
|
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
import org.bench4q.agent.datacollector.DataCollector;
|
||||||
|
import org.bench4q.agent.datacollector.impl.ScenarioResultCollector;
|
||||||
|
import org.bench4q.agent.datacollector.impl.BehaviorStatusCodeResult;
|
||||||
|
import org.bench4q.agent.scenario.BehaviorResult;
|
||||||
|
import org.bench4q.agent.storage.StorageHelper;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.springframework.context.ApplicationContext;
|
||||||
|
import org.springframework.context.support.ClassPathXmlApplicationContext;
|
||||||
|
|
||||||
|
public class DetailStatisticsTest {
|
||||||
|
private DataCollector detailStatistics;
|
||||||
|
|
||||||
|
private DataCollector getDetailStatistics() {
|
||||||
|
return detailStatistics;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setDetailStatistics(DataCollector detailStatistics) {
|
||||||
|
this.detailStatistics = detailStatistics;
|
||||||
|
}
|
||||||
|
|
||||||
|
public DetailStatisticsTest() {
|
||||||
|
init();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void init() {
|
||||||
|
@SuppressWarnings("resource")
|
||||||
|
ApplicationContext context = new ClassPathXmlApplicationContext(
|
||||||
|
"classpath*:/org/bench4q/agent/config/application-context.xml");
|
||||||
|
ScenarioResultCollector agentResultDataCollector = new ScenarioResultCollector(
|
||||||
|
UUID.randomUUID());
|
||||||
|
agentResultDataCollector.setStorageHelper((StorageHelper) context
|
||||||
|
.getBean(StorageHelper.class));
|
||||||
|
this.setDetailStatistics(agentResultDataCollector);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void addZeroTest() {
|
||||||
|
for (BehaviorResult behaviorResult : ScenarioStatisticsTest
|
||||||
|
.makeBehaviorList(0)) {
|
||||||
|
this.getDetailStatistics().add(behaviorResult);
|
||||||
|
}
|
||||||
|
|
||||||
|
Object object = this.detailStatistics.getBehaviorBriefStatistics(0);
|
||||||
|
assertEquals(null, object);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void addOneDetailTest() {
|
||||||
|
for (BehaviorResult behaviorResult : ScenarioStatisticsTest
|
||||||
|
.makeBehaviorList(1)) {
|
||||||
|
this.getDetailStatistics().add(behaviorResult);
|
||||||
|
}
|
||||||
|
Map<Integer, BehaviorStatusCodeResult> map = this.detailStatistics
|
||||||
|
.getBehaviorBriefStatistics(1);
|
||||||
|
|
||||||
|
BehaviorStatusCodeResult actualResult = map.get(200);
|
||||||
|
assertTrue(actualResult.equals(makeExpectedResultForOne()));
|
||||||
|
}
|
||||||
|
|
||||||
|
private BehaviorStatusCodeResult makeExpectedResultForOne() {
|
||||||
|
BehaviorStatusCodeResult ret = new BehaviorStatusCodeResult("");
|
||||||
|
ret.contentLength = 20;
|
||||||
|
ret.count = 1;
|
||||||
|
ret.maxResponseTime = 200;
|
||||||
|
ret.minResponseTime = 200;
|
||||||
|
ret.totalResponseTimeThisTime = 200;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void addTwoDetailTest() {
|
||||||
|
for (BehaviorResult behaviorResult : ScenarioStatisticsTest
|
||||||
|
.makeBehaviorList(2)) {
|
||||||
|
this.getDetailStatistics().add(behaviorResult);
|
||||||
|
}
|
||||||
|
Map<Integer, BehaviorStatusCodeResult> map = this.detailStatistics
|
||||||
|
.getBehaviorBriefStatistics(1);
|
||||||
|
assertTrue(mapEquals(map, makeExpectedMapForTwo()));
|
||||||
|
}
|
||||||
|
|
||||||
|
private Map<Integer, BehaviorStatusCodeResult> makeExpectedMapForTwo() {
|
||||||
|
Map<Integer, BehaviorStatusCodeResult> ret = new HashMap<Integer, BehaviorStatusCodeResult>();
|
||||||
|
ret.put(new Integer(200), buildCodeResult(20, 1, 200, 200, 200));
|
||||||
|
ret.put(new Integer(400), buildCodeResult(0, 1, 0, 0, 0));
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
private BehaviorStatusCodeResult buildCodeResult(long contentLength,
|
||||||
|
long count, long maxResponseTime, long minResponseTime,
|
||||||
|
long totalResponseTimeThisTime) {
|
||||||
|
BehaviorStatusCodeResult ret = new BehaviorStatusCodeResult("");
|
||||||
|
ret.contentLength = contentLength;
|
||||||
|
ret.count = count;
|
||||||
|
ret.maxResponseTime = maxResponseTime;
|
||||||
|
ret.minResponseTime = minResponseTime;
|
||||||
|
ret.totalResponseTimeThisTime = totalResponseTimeThisTime;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean mapEquals(Map<Integer, BehaviorStatusCodeResult> mapActual,
|
||||||
|
Map<Integer, BehaviorStatusCodeResult> mapExpected) {
|
||||||
|
boolean equal = true;
|
||||||
|
if (mapActual.size() != mapExpected.size()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
for (int i : mapActual.keySet()) {
|
||||||
|
if (!mapActual.get(i).equals(mapExpected.get(i))) {
|
||||||
|
equal = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return equal;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void addThreeTest() {
|
||||||
|
for (BehaviorResult behaviorResult : ScenarioStatisticsTest
|
||||||
|
.makeBehaviorList(3)) {
|
||||||
|
this.getDetailStatistics().add(behaviorResult);
|
||||||
|
}
|
||||||
|
Map<Integer, BehaviorStatusCodeResult> mapActual = this
|
||||||
|
.getDetailStatistics().getBehaviorBriefStatistics(1);
|
||||||
|
assertTrue(mapEquals(mapActual, makeExpectedMapForThree()));
|
||||||
|
}
|
||||||
|
|
||||||
|
private Map<Integer, BehaviorStatusCodeResult> makeExpectedMapForThree() {
|
||||||
|
Map<Integer, BehaviorStatusCodeResult> retMap = new HashMap<Integer, BehaviorStatusCodeResult>();
|
||||||
|
retMap.put(200, buildCodeResult(40, 2, 220, 200, 420));
|
||||||
|
retMap.put(400, buildCodeResult(0, 1, 0, 0, 0));
|
||||||
|
return retMap;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,133 @@
|
||||||
|
package org.bench4q.agent.test.datastatistics;
|
||||||
|
|
||||||
|
import org.bench4q.agent.datacollector.DataCollector;
|
||||||
|
import org.bench4q.agent.datacollector.impl.PageResultCollector;
|
||||||
|
import org.bench4q.agent.scenario.PageResult;
|
||||||
|
import org.bench4q.share.models.agent.statistics.AgentPageBriefModel;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
import org.springframework.context.support.ClassPathXmlApplicationContext;
|
||||||
|
import org.springframework.test.context.ContextConfiguration;
|
||||||
|
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
|
||||||
|
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
|
@RunWith(SpringJUnit4ClassRunner.class)
|
||||||
|
@ContextConfiguration(locations = { "classpath:test-storage-context.xml",
|
||||||
|
"classpath*:/org/bench4q/agent/config/application-context.xml" })
|
||||||
|
public class PageResultStatisticsTest {
|
||||||
|
private DataCollector dataCollector;
|
||||||
|
|
||||||
|
private DataCollector getDataCollector() {
|
||||||
|
return dataCollector;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setDataCollector(DataCollector dataCollector) {
|
||||||
|
this.dataCollector = dataCollector;
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("resource")
|
||||||
|
public PageResultStatisticsTest() {
|
||||||
|
new ClassPathXmlApplicationContext(
|
||||||
|
"classpath*:/org/bench4q/agent/config/application-context.xml");
|
||||||
|
this.setDataCollector(new PageResultCollector());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void pageResultTest() {
|
||||||
|
PageResult pageResult = PageResult.buildPageResult(2,
|
||||||
|
ScenarioStatisticsTest.makeBehaviorList(1));
|
||||||
|
assertEquals(2, pageResult.getPageId());
|
||||||
|
assertEquals(200, pageResult.getExecuteRange());
|
||||||
|
assertTrue(pageResult.getPageStartTime() > 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void pageResultWithTwoBehaviorTest() {
|
||||||
|
PageResult pageResult = PageResult.buildPageResult(2,
|
||||||
|
ScenarioStatisticsTest.makeBehaviorList(2));
|
||||||
|
assertEquals(2, pageResult.getPageId());
|
||||||
|
assertEquals(220, pageResult.getExecuteRange());
|
||||||
|
assertEquals(200, pageResult.getPageStartTime());
|
||||||
|
assertEquals(420, pageResult.getPageEndTime());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testNull() {
|
||||||
|
this.getDataCollector().add((PageResult) null);
|
||||||
|
assertNotNull(dataCollector.getPageBriefStatistics(0));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testOnePaegWithOneBehaviorResult() {
|
||||||
|
this.getDataCollector().add(
|
||||||
|
PageResult.buildPageResult(2,
|
||||||
|
ScenarioStatisticsTest.makeBehaviorList(1)));
|
||||||
|
AgentPageBriefModel pageBriefModel = (AgentPageBriefModel) this
|
||||||
|
.getDataCollector().getPageBriefStatistics(2);
|
||||||
|
assertEquals(2, pageBriefModel.getPageId());
|
||||||
|
assertEquals(1, pageBriefModel.getCountFromBegin());
|
||||||
|
assertEquals(1, pageBriefModel.getCountThisTime());
|
||||||
|
assertEquals(200, pageBriefModel.getMaxResponseTimeFromBegin());
|
||||||
|
assertEquals(200, pageBriefModel.getMinResponseTimeFromBegin());
|
||||||
|
assertTrue(pageBriefModel.getTimeFrame() >= 0);
|
||||||
|
assertEquals(200, pageBriefModel.getTotalResponseTimeThisTime());
|
||||||
|
assertEquals(200, pageBriefModel.getLatestResponseTime());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testOnePageWithTwoBehaviorResult() {
|
||||||
|
this.getDataCollector().add(
|
||||||
|
PageResult.buildPageResult(2,
|
||||||
|
ScenarioStatisticsTest.makeBehaviorList(2)));
|
||||||
|
AgentPageBriefModel pageBriefModel = (AgentPageBriefModel) this
|
||||||
|
.getDataCollector().getPageBriefStatistics(2);
|
||||||
|
System.out.println(pageBriefModel.getCountFromBegin());
|
||||||
|
assertEquals(2, pageBriefModel.getPageId());
|
||||||
|
assertEquals(1, pageBriefModel.getCountFromBegin());
|
||||||
|
assertEquals(1, pageBriefModel.getCountThisTime());
|
||||||
|
assertEquals(220, pageBriefModel.getMaxResponseTimeFromBegin());
|
||||||
|
assertEquals(220, pageBriefModel.getMinResponseTimeFromBegin());
|
||||||
|
assertTrue(pageBriefModel.getTimeFrame() >= 0);
|
||||||
|
assertEquals(220, pageBriefModel.getTotalResponseTimeThisTime());
|
||||||
|
assertEquals(220, pageBriefModel.getLatestResponseTime());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testTwoPageWithStatisticsAtLast() {
|
||||||
|
this.getDataCollector().add(
|
||||||
|
PageResult.buildPageResult(2,
|
||||||
|
ScenarioStatisticsTest.makeBehaviorList(1)));
|
||||||
|
this.getDataCollector().add(
|
||||||
|
PageResult.buildPageResult(2,
|
||||||
|
ScenarioStatisticsTest.makeBehaviorList(2)));
|
||||||
|
AgentPageBriefModel pageBriefModel = (AgentPageBriefModel) this
|
||||||
|
.getDataCollector().getPageBriefStatistics(2);
|
||||||
|
assertEquals(2, pageBriefModel.getPageId());
|
||||||
|
assertEquals(2, pageBriefModel.getCountFromBegin());
|
||||||
|
assertEquals(2, pageBriefModel.getCountThisTime());
|
||||||
|
assertEquals(220, pageBriefModel.getMaxResponseTimeFromBegin());
|
||||||
|
assertEquals(200, pageBriefModel.getMinResponseTimeFromBegin());
|
||||||
|
assertEquals(420, pageBriefModel.getTotalResponseTimeThisTime());
|
||||||
|
assertTrue(pageBriefModel.getTimeFrame() >= 0);
|
||||||
|
assertEquals(220, pageBriefModel.getLatestResponseTime());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testTwoPageWithStatisticsIndividually() {
|
||||||
|
testOnePaegWithOneBehaviorResult();
|
||||||
|
this.getDataCollector().add(
|
||||||
|
PageResult.buildPageResult(2,
|
||||||
|
ScenarioStatisticsTest.makeBehaviorList(2)));
|
||||||
|
AgentPageBriefModel model = (AgentPageBriefModel) this.getDataCollector()
|
||||||
|
.getPageBriefStatistics(2);
|
||||||
|
assertEquals(2, model.getPageId());
|
||||||
|
assertEquals(2, model.getCountFromBegin());
|
||||||
|
assertEquals(1, model.getCountThisTime());
|
||||||
|
assertEquals(220, model.getMaxResponseTimeFromBegin());
|
||||||
|
assertEquals(200, model.getMinResponseTimeFromBegin());
|
||||||
|
assertEquals(220, model.getTotalResponseTimeThisTime());
|
||||||
|
assertTrue(model.getTimeFrame() >= -0);
|
||||||
|
assertEquals(220, model.getLatestResponseTime());
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,173 @@
|
||||||
|
package org.bench4q.agent.test.datastatistics;
|
||||||
|
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
import org.bench4q.agent.datacollector.DataCollector;
|
||||||
|
import org.bench4q.agent.datacollector.impl.ScenarioResultCollector;
|
||||||
|
import org.bench4q.agent.scenario.BehaviorResult;
|
||||||
|
import org.bench4q.agent.scenario.PageResult;
|
||||||
|
import org.bench4q.agent.storage.StorageHelper;
|
||||||
|
import org.bench4q.share.models.agent.statistics.AgentBriefStatusModel;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.springframework.context.ApplicationContext;
|
||||||
|
import org.springframework.context.support.ClassPathXmlApplicationContext;
|
||||||
|
|
||||||
|
public class ScenarioStatisticsTest {
|
||||||
|
private DataCollector dataStatistics;
|
||||||
|
|
||||||
|
protected DataCollector getDataStatistics() {
|
||||||
|
return dataStatistics;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setDataStatistics(DataCollector dataStatistics) {
|
||||||
|
this.dataStatistics = dataStatistics;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ScenarioStatisticsTest() {
|
||||||
|
init();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void init() {
|
||||||
|
@SuppressWarnings("resource")
|
||||||
|
ApplicationContext context = new ClassPathXmlApplicationContext(
|
||||||
|
"classpath*:/org/bench4q/agent/config/application-context.xml");
|
||||||
|
ScenarioResultCollector agentResultDataCollector = new ScenarioResultCollector(
|
||||||
|
UUID.randomUUID());
|
||||||
|
agentResultDataCollector.setStorageHelper((StorageHelper) context
|
||||||
|
.getBean(StorageHelper.class));
|
||||||
|
this.setDataStatistics(agentResultDataCollector);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void addZeroBriefTest() {
|
||||||
|
for (BehaviorResult behaviorResult : makeBehaviorList(0)) {
|
||||||
|
this.getDataStatistics().add(behaviorResult);
|
||||||
|
}
|
||||||
|
AgentBriefStatusModel model = (AgentBriefStatusModel) this
|
||||||
|
.getDataStatistics().getScenarioBriefStatistics();
|
||||||
|
AgentBriefStatusModel modelExpect = makeAllZeroModel();
|
||||||
|
modelExpect.setTimeFrame(model.getTimeFrame());
|
||||||
|
assertTrue(model.equals(modelExpect));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void addOneBriefTest() throws InterruptedException {
|
||||||
|
for (BehaviorResult behaviorResult : makeBehaviorList(1)) {
|
||||||
|
this.getDataStatistics().add(behaviorResult);
|
||||||
|
}
|
||||||
|
|
||||||
|
Thread.sleep(100);
|
||||||
|
AgentBriefStatusModel model = (AgentBriefStatusModel) this
|
||||||
|
.getDataStatistics().getScenarioBriefStatistics();
|
||||||
|
AgentBriefStatusModel modelExpect = new AgentBriefStatusModel();
|
||||||
|
modelExpect.setTimeFrame(model.getTimeFrame());
|
||||||
|
makeUpStatusModelForOneBehavior(modelExpect);
|
||||||
|
assertTrue(model.equals(modelExpect));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void addTwoBriefTest() throws InterruptedException {
|
||||||
|
for (BehaviorResult behaviorResult : makeBehaviorList(2)) {
|
||||||
|
this.getDataStatistics().add(behaviorResult);
|
||||||
|
}
|
||||||
|
Thread.sleep(100);
|
||||||
|
AgentBriefStatusModel model = (AgentBriefStatusModel) this
|
||||||
|
.getDataStatistics().getScenarioBriefStatistics();
|
||||||
|
AgentBriefStatusModel modelExpect = makeUpStatusModelForTwoBehavior(model
|
||||||
|
.getTimeFrame());
|
||||||
|
assertTrue(model.equals(modelExpect));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static AgentBriefStatusModel makeUpStatusModelForTwoBehavior(
|
||||||
|
long timeFrame) {
|
||||||
|
AgentBriefStatusModel model = new AgentBriefStatusModel();
|
||||||
|
model.setTimeFrame(timeFrame);
|
||||||
|
model.setSuccessThroughputThisTime(1 * 1000 / timeFrame);
|
||||||
|
model.setFailCountFromBegin(1);
|
||||||
|
model.setFailThroughputThisTime(1 * 1000 / timeFrame);
|
||||||
|
model.setMaxResponseTime(200);
|
||||||
|
model.setMinResponseTime(200);
|
||||||
|
model.setSuccessCountFromBegin(1);
|
||||||
|
model.setSuccessCountThisTime(1);
|
||||||
|
model.setFailCountThisTime(1);
|
||||||
|
model.setTotalResponseTimeThisTime(200);
|
||||||
|
model.setTotalSqureResponseTimeThisTime(40000);
|
||||||
|
return model;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void makeUpStatusModelForOneBehavior(
|
||||||
|
AgentBriefStatusModel model) {
|
||||||
|
model.setSuccessThroughputThisTime(1 * 1000 / model.getTimeFrame());
|
||||||
|
model.setFailCountFromBegin(0);
|
||||||
|
model.setFailThroughputThisTime(0);
|
||||||
|
model.setMaxResponseTime(200);
|
||||||
|
model.setMinResponseTime(200);
|
||||||
|
model.setSuccessCountFromBegin(1);
|
||||||
|
model.setSuccessCountThisTime(1);
|
||||||
|
model.setFailCountThisTime(0);
|
||||||
|
model.setTotalResponseTimeThisTime(200);
|
||||||
|
model.setTotalSqureResponseTimeThisTime(40000);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static AgentBriefStatusModel makeAllZeroModel() {
|
||||||
|
AgentBriefStatusModel model = new AgentBriefStatusModel();
|
||||||
|
model.setSuccessThroughputThisTime(0);
|
||||||
|
model.setFailCountFromBegin(0);
|
||||||
|
model.setFailThroughputThisTime(0);
|
||||||
|
model.setMaxResponseTime(0);
|
||||||
|
model.setMinResponseTime(0);
|
||||||
|
model.setTimeFrame(0);
|
||||||
|
model.setSuccessCountFromBegin(0);
|
||||||
|
model.setTotalResponseTimeThisTime(0);
|
||||||
|
model.setSuccessCountThisTime(0);
|
||||||
|
model.setFailCountThisTime(0);
|
||||||
|
model.setTotalSqureResponseTimeThisTime(0);
|
||||||
|
return model;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static PageResult makePageResultWithBehaviorResult(int count) {
|
||||||
|
List<BehaviorResult> behaviorResults = makeBehaviorList(count);
|
||||||
|
return PageResult.buildPageResult(2, behaviorResults);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static List<BehaviorResult> makeBehaviorList(int count) {
|
||||||
|
List<BehaviorResult> behaviorResults = new ArrayList<BehaviorResult>();
|
||||||
|
for (int i = 0; i < count; i++) {
|
||||||
|
int statusCode = i % 2 == 0 ? 200 : 400;
|
||||||
|
behaviorResults.add(buildBehaviorResult(200 + 10 * i, i % 2 == 0,
|
||||||
|
statusCode, 1, 200 + 10 * i));
|
||||||
|
}
|
||||||
|
return behaviorResults;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static BehaviorResult buildBehaviorResult(long responseTime,
|
||||||
|
boolean success, int statusCode, int behaviorId, long startDateTime) {
|
||||||
|
Date date = new Date(startDateTime);
|
||||||
|
BehaviorResult result = new BehaviorResult();
|
||||||
|
result.setBehaviorName("");
|
||||||
|
result.setEndDate(new Date(date.getTime() + responseTime));
|
||||||
|
result.setPluginId("Get");
|
||||||
|
result.setPluginName("get");
|
||||||
|
result.setResponseTime(responseTime);
|
||||||
|
result.setStartDate(date);
|
||||||
|
result.setSuccess(success);
|
||||||
|
result.setShouldBeCountResponseTime(true);
|
||||||
|
|
||||||
|
result.setBehaviorId(behaviorId);
|
||||||
|
if (result.isSuccess()) {
|
||||||
|
result.setContentLength(20);
|
||||||
|
result.setContentType("image");
|
||||||
|
} else {
|
||||||
|
result.setContentLength(0);
|
||||||
|
result.setContentType("");
|
||||||
|
}
|
||||||
|
result.setStatusCode(statusCode);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,30 @@
|
||||||
|
package org.bench4q.agent.test.model;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import javax.xml.bind.JAXBContext;
|
||||||
|
import javax.xml.bind.JAXBException;
|
||||||
|
import javax.xml.bind.annotation.XmlRootElement;
|
||||||
|
|
||||||
|
import org.bench4q.share.models.agent.scriptrecord.BehaviorModel;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
|
@XmlRootElement(name = "modelTest")
|
||||||
|
public class ModelTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void unmarshalVerify() throws IOException, JAXBException {
|
||||||
|
Object object = JAXBContext
|
||||||
|
.newInstance(BehaviorModel.class)
|
||||||
|
.createUnmarshaller()
|
||||||
|
.unmarshal(
|
||||||
|
new File("Scripts"
|
||||||
|
+ System.getProperty("file.separator")
|
||||||
|
+ "behaviorModel.xml"));
|
||||||
|
assertTrue(object instanceof BehaviorModel);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,26 @@
|
||||||
|
package org.bench4q.agent.test.model;
|
||||||
|
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
|
||||||
|
import javax.xml.bind.JAXBContext;
|
||||||
|
import javax.xml.bind.JAXBException;
|
||||||
|
import javax.xml.bind.Unmarshaller;
|
||||||
|
|
||||||
|
import org.bench4q.share.models.agent.scriptrecord.BehaviorModel;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
public class UserBehaviorModelTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testUnmarshal() throws JAXBException {
|
||||||
|
Unmarshaller unmarshaller = JAXBContext.newInstance(
|
||||||
|
BehaviorModel.class).createUnmarshaller();
|
||||||
|
Object object = unmarshaller.unmarshal(new File("Scripts"
|
||||||
|
+ System.getProperty("file.separator") + "behaviorModel.xml"));
|
||||||
|
BehaviorModel userBehaviorModel = (BehaviorModel) object;
|
||||||
|
System.out.println(userBehaviorModel.getUse());
|
||||||
|
assertTrue(object instanceof BehaviorModel);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,64 @@
|
||||||
|
package org.bench4q.agent.test.parameterization;
|
||||||
|
|
||||||
|
import org.bench4q.agent.parameterization.impl.InstanceControler;
|
||||||
|
import org.bench4q.share.helper.TestHelper;
|
||||||
|
|
||||||
|
public class TEST_HelloThread extends Thread {
|
||||||
|
InstanceControler ic;
|
||||||
|
|
||||||
|
public TEST_HelloThread() {
|
||||||
|
ic = new InstanceControler();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void run() {
|
||||||
|
java.util.Random r = new java.util.Random();
|
||||||
|
int t = r.nextInt(10000);
|
||||||
|
System.out.print(Thread.currentThread().getId());
|
||||||
|
System.out.println(":" + t);
|
||||||
|
try {
|
||||||
|
Thread.sleep(t);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
// TODO Auto-generated catch block
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
System.out.print(Thread.currentThread().getId());
|
||||||
|
System.out.print("\t");
|
||||||
|
|
||||||
|
String userName = ic
|
||||||
|
.getParam("<parameters class=\"Para_UserNameAndPassword\" method=\"getUserName\" args=\"\" />");
|
||||||
|
String passwordName = ic
|
||||||
|
.getParam("<parameters class=\"Para_UserNameAndPassword\" method=\"getPassword\" args=\"\" />");
|
||||||
|
System.out.print(userName);
|
||||||
|
System.out.print("\t");
|
||||||
|
System.out.println(passwordName);
|
||||||
|
try {
|
||||||
|
Thread.sleep(r.nextInt(10000));
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
// TODO Auto-generated catch block
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
// ic.releaseAll();
|
||||||
|
try {
|
||||||
|
TestHelper.invokePrivate(ic, "releaseAll", null, null);
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
while (true) {
|
||||||
|
TEST_HelloThread h1 = new TEST_HelloThread();
|
||||||
|
|
||||||
|
h1.start();
|
||||||
|
try {
|
||||||
|
Thread.sleep(1000);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
// TODO Auto-generated catch block
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// private String name;
|
||||||
|
}
|
|
@ -0,0 +1,37 @@
|
||||||
|
package org.bench4q.agent.test.parameterization;
|
||||||
|
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
|
||||||
|
import org.bench4q.agent.parameterization.impl.InstanceControler;
|
||||||
|
import org.bench4q.agent.parameterization.impl.Para_Table;
|
||||||
|
import org.bench4q.share.helper.TestHelper;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
public class TEST_UserName {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGetParam() throws Exception {
|
||||||
|
Para_Table table = new Para_Table();
|
||||||
|
String ret = table.getTableColumnValue(java.util.UUID.randomUUID(),
|
||||||
|
new HashMap<String, Object>(), "file",
|
||||||
|
"ScenarioParameters\\param1.txt", "0", "sequence", ";", "~",
|
||||||
|
"2");
|
||||||
|
System.out.println(ret);
|
||||||
|
|
||||||
|
InstanceControler ic = new InstanceControler();
|
||||||
|
String passwordName = ic
|
||||||
|
.getParam("<parameters name=\"useNamePassword\" class=\"Para_Table\" type=\"crossThread\" method=\"getTableColumnValue\" args=\"file,ScenarioParameters\\param1.txt,0,sequence,;,~,2\" />");
|
||||||
|
System.out.println(passwordName);
|
||||||
|
assertNotNull(passwordName);
|
||||||
|
InstanceControler instanceControler = new InstanceControler();
|
||||||
|
String password2 = instanceControler
|
||||||
|
.getParam("<parameters name=\"useNamePassword\" class=\"Para_Table\" type=\"crossThread\" method=\"getTableColumnValue\" args=\"file,ScenarioParameters\\param1.txt,0,sequence,;,~,2\" />");
|
||||||
|
System.out.println(password2);
|
||||||
|
assertNotNull(password2);
|
||||||
|
assertEquals(Integer.parseInt(passwordName) + 10,
|
||||||
|
Integer.parseInt(password2));
|
||||||
|
TestHelper.invokePrivate(ic, "releaseAll", null, null);
|
||||||
|
}
|
||||||
|
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue