multiple generic agents for xmlaw luiz fernando rodrigues
TRANSCRIPT
Multiple Generic Agents for XMLaw
Luiz Fernando Rodrigues
Laboratório de Engenharia de Software – PUC-Rio
Agenda
• XMLaw– Using a XMLaw agent– Developing a XMLaw agent
• Scenario Simulation– Number of Stub agents analysis
• Generic Agents– Commands and Requests– Environment Variables– Stream approach
• Multiple Generic Agents– Example
• Conclusion
Laboratório de Engenharia de Software – PUC-Rio
Using a XMLaw Agent
Agent Agent
MyAgent Client ClientMyAgent
Agent
Use DirectlyInheritance Delegation
Laboratório de Engenharia de Software – PUC-Rio
Developing a XMLaw Agent
Agent
send(message : Message)waitForMessage() : MessagewaitForMessage(milisec : long) : Message
LawFacade
informOrganization()enterOrganization()performRole()startScece()enterScene()
Laboratório de Engenharia de Software – PUC-Rio
Simulating Scenarios
• Agents– Foo– Bar
• Organization– Fubar Organization
• Foo and Bar exchange messages• Stub Agents
– FooStub– BarStub
• Test Agents– Scenario 1
• Executes Foo with BarStub and verifies the expected behavior
– Scenario 2• Executes Bar with FooStub and verifies the expected behavior
Laboratório de Engenharia de Software – PUC-Rio
Scenario 1 - BarStub
... Message addLawReply = getMediatorFacade().informOrganizationToMediator(lawURL.toString()); String orgExec = addLawReply.getContentValue(MessageContentConstants.KEY_ORGANIZATION_EXECUTION_ID); Message enterOrgReply = getMediatorFacade().enterOrganization(orgExec); Message performRoleReply = getMediatorFacade().performRole(orgExec,"bar"); Message startSceneReply = getMediatorFacade().startScene("game",orgExec); String sceneExec = startSceneReply.getContentValue(MessageContentConstants.KEY_SCENE_EXECUTION_ID); Message enterSceneReply = getMediatorFacade().enterInScene(sceneExec,orgExec,"bar");
Message barStubMsg = new Message(Message.INFORM); barStubMsg.setContentValue(MessageContentConstants.KEY_ORGANIZATION_EXECUTION_ID,orgExec); barStubMsg.setContentValue(MessageContentConstants.KEY_SCENE_EXECUTION_ID,sceneExec); barStubMsg.setContentValue("hello","Hello foo, how bar you?"); barStubMsg.setReceiver(fooId,"bar"); send(barStubMsg,"bar"); Message answer = waitForMessage(); ...
System Interaction
Create, set and send the message
Laboratório de Engenharia de Software – PUC-Rio
Number of Stub Agents Analysis
• Each agent may need s scenarios to be tested
• Each scenario implies in n-1 Stub Agents
• In a system with n agents, the number of Stub agents is, in the worst case:
n
kksnntsnumStubAge
1
)1(
Where Sk is the number of scenarios for the agent k
• If each agent has only 1 scenario:
nnntsnumStubAge 2
Laboratório de Engenharia de Software – PUC-Rio
Generic Agents
• Is a XMLaw agent
• Make stub creation easier
• Important Features– Commands and Requests– Environment Variables– Stream approach
Laboratório de Engenharia de Software – PUC-Rio
Generic Agents - Structural View
CommandResponse
Agent
AbstractCommand
execute()
CommandManager AbstractView
Laboratório de Engenharia de Software – PUC-Rio
Commands and Requests
• Command– Execute an operation on the agent
• Request– Inform the command to execute– Inform arguments to the command– Example:
• performRole 171 bar• Ask the system to perform the role bar in the organization 171
• Extensions– Developer may create domain specific commands
Laboratório de Engenharia de Software – PUC-Rio
Environment Variables
• Shared variables• Storage of any string value• Storage of messages
– A message is a set of variables• Example:
– the message barMsg is represented by the set:– barMsg– barMsg.sender– barMsg.senderRole– barMsg.receiver– barMsg.receiverRole– barMsg.performative– barMsg.id– barMsg.protocol
• The content of a variable is identified when the character $ is used before a String
• The variable “last”
Laboratório de Engenharia de Software – PUC-Rio
The Stream Approach
InputStream
read()
Agent
CommandManager
CommandManager(in:InputStream,out:OutputStream,ctrl:OutputStream,model:Agent)()
OutputStream
write()
output
control
input
Laboratório de Engenharia de Software – PUC-Rio
The Stream Approach
• Input Stream– Receives requests
• Output Stream– Write command responses
• Control Stream– Assert Command– Automated tests
• Several Streams Implementations available– Console– File– Socket– Stub– Composite– Piped
• The GA implementation don’t know the Stream type it is using– Flexibility
Laboratório de Engenharia de Software – PUC-Rio
GA example 1 - Command Line
...
GenericAgent agent = new GenericAgent("command line agent"); CommandManager manager = new CommandManager( System.in,
System.out, new StubOutputStream(),agent);
...
• User inputs commands in the command line• User reads responses in the command line• Control Stream is not used• Useful for a first contact with open system• Hard to repeat
Laboratório de Engenharia de Software – PUC-Rio
GA example 2– Script File
• User inputs commands in the script file• User reads responses in the output file• Control Stream is not used• Easy to repeat• User must know the commands
... FileInputStream scriptStream = new FileInputStream("script.txt"); FileOutputStream outputStream = new FileOutputStream("output.txt"); GenericAgent agent = new GenericAgent("script agent"); CommandManager manager = new CommandManager( scriptStream,
outputStream, new StubOutputStream(),agent);
...
Laboratório de Engenharia de Software – PUC-Rio
GA example 3 – Test Application
Script TestApp CommandManager output
in
out
control
• Test application uses a piped stream• Uses the control stream to assert expected behavior
Laboratório de Engenharia de Software – PUC-Rio
GA example 3 - Test Application
... FileInputStream scriptStream = new FileInputStream("script.txt"); PipedInputStream pipeInScript = new PipedInputStream(); PipedOutputStream pipeOutScript = new PipedOutputStream(pipeInScript);
PipedInputStream pipeInCtrl = new PipedInputStream(); PipedOutputStream pipeOutCtrl = new PipedOutputStream(pipeInCtrl);
TestApp app = new TestApp(scriptStream, pipeOutScript, pipeInCtrl);
FileOutputStream outputStream = new FileOutputStream("output.txt"); GenericAgent agent = new GenericAgent("tested agent"); CommandManager manager = new CommandManager( pipeInScript,
outputStream, pipeOutCtrl, agent);
...
Laboratório de Engenharia de Software – PUC-Rio
Multiple Generic Agents - MuGA
• Single agent approach– Hard to create scenarios– Hard to execute
• Asynchronous execution
• Multiple agent approach– Several agents in a single script– Easy to execute
• Synchronous execution
– Easy to assert behaviors
Laboratório de Engenharia de Software – PUC-Rio
Multiple Generic Agents
InputStream
read()
ScriptInterpreter
CommandManager
1..*1..*
Laboratório de Engenharia de Software – PUC-Rio
Script Format
agent1 agent2
#comments
agent1:#requests for agent 1
agent2:#requests for agent 2
agent1:#requests for agent 1
…
Laboratório de Engenharia de Software – PUC-Rio
Example – Airport Law
• Four agents– Announcer– Customer– Seller– Bank
• Four scenes– Announcement Scene– Selection Scene– Negotiation Scene– Payment Scene
Laboratório de Engenharia de Software – PUC-Rio
Example
announcer customer seller bank
announcer:addLaw http://www.les.inf.puc-rio.br/xmlaw/leis/airport-law.xmlset airportOrgId $last.orgExecutionIdenterOrg $airportOrgIdperformRole $airportOrgId announcer
customer:enterOrg $airportOrgIdperformRole $airportOrgId customer
seller:enterOrg $airportOrgIdperformRole $airportOrgId seller
bank:enterOrg $airportOrgIdperformRole $airportOrgId bank
Laboratório de Engenharia de Software – PUC-Rio
Example (cont)
###################################ANNOUNCEMENT SCENE##################################
customer:startScene $airportOrgId announcementset announcementSceneId $last.sceneExecutionIdenterScene $airportOrgId $announcementSceneId customermsg m1 requestset m1.hello helloset m1.orgExecutionId $airportOrgIdset m1.sceneExecutionId $announcementSceneIdset m1.receiver announcersend $m1
announcer:receive 5 rm1enterScene $airportOrgId $announcementSceneId announcermsg m2 informset m2.services movies;date;foodset m2.orgExecutionId $airportOrgIdset m2.sceneExecutionId $announcementSceneIdset m2.receiver customersend $m2
customer:receive 5 rm2assert $rm2.services movies;date;food
Laboratório de Engenharia de Software – PUC-Rio
Conclusions
• Instead of:
n
kksnntsnumStubAge
1
)1(
• We have:
n
kksnumScripts
1
• If each agent has only 1 scenario
nnumScripts