UPPAAL_presentation2

advertisement
Workflow Verification Project
BY:
Toomas Kütt
Fraz Tabassam
Jens Kaae Christensen
Check
Order
a1_ch
a2_ch
AND
Get
Products
a3_ch
a2_ch
Save Order
Information in Archive
a7_ch
a4_ch
a11_ch
Assemble
Bundle
a10_ch
Test
Computer
a5_ch
OR
a9_ch
AND
OR
a8_ch
Test
Monitor
a5_ch
a2_ch
Check
Order
a1_ch
Get
Products
a3_ch
a2_ch
Save Order
Information in Archive
a7_ch
a4_ch
a11_ch
Assemble
Bundle
a10_ch
Test
Computer
a5_ch
a9_ch
a8_ch
Test
Monitor
a5_ch
Variable declarations:
Number of running activity nodes
int running;
Resources:
int r1, r2, r3, r4, r5, r6;
Global declaration of channels:
urgent chan letsstart, a1_channel, a2_channel,
a3_channel, a4_channel, a5_channel, a7_channel,
a8_channel, a9_channel, a10_channel, a11_channel;
Clocks
(local, one for each activity):
clock clock1, clock2, clock3, clock4, clock5, clock6;
Node declarations
(Communicating Finite Automatas)
Figure 2: Activity
Parameters:
- clock &processclock,
- const int mintime,
- const int maxtime,
- int &resource,
- urgent chan &in_channel,
- urgent chan &out_channel
System declarations:
- CheckOrder = Activity(clock1,1,2,r1, letsstart, a1_channel);
- Split1 = ANDsplit(a1_channel, a2_channel);
- GetProducts = Activity(clock2,1,2,r2, a2_channel, a3_channel);
- SaveOrderInformInArchive = Activity(clock3,1,2, r3, a2_channel, a4_channel);
- Split2 = ORsplit(a3_channel, a5_channel);
- TestComputer = Activity(clock4,1,2, r4, a5_channel,a7_channel);
- TestMonitor = Activity(clock5,1,2, r5, a5_channel, a8_channel);
- Join1 = ORjoin(a7_channel, a8_channel, a9_channel);
- Join2 = ANDjoin(a4_channel, a9_channel, a10_channel);
- AssembleBundle = Activity(clock6, 1, 2, r6, a10_channel, a11_channel);
- end = EndNode(a11_channel);
System definition:
StartNode,
CheckOrder,
GetProducts,
SaveOrderInformInArchive,
TestComputer,
TestMonitor,
AssembleBundle,
end,
Split1,
Split2,
Join1,
Join2;
Answers to questions:
• Use UPPAAL to verify that:
1) The end node will always be reached
- A<> p: p holds in some state along every path
- Query: A<> end.finished
2) When the end node is reached no activities are waiting to get finished
- A[] p: p holds in every reachable state
- Query: A[] end.finished imply running == 0
3) The workflow is structurally incorrect if the implicit join is modeled as a merge
- Query: A<> end.finished (deadlock)
4) Assemble bundle and get products may share a resource without conflict
- A[] p: p holds in every reachable state
- Query: A[] r6<2 : (property is satisfied)
5) There is a conflict if “get products” and “save order information” share a resource
- Query: A[] r2<2 : (property is not satisfied)
6) With time intervals [1,2] the entire workflow can be completed in 8 units
- E<> p: p holds in some reachable state.
- Query: E<> end.finished and clock1<=8
- Query: A<> end.finished and clock1<=8
7) This still holds even if “save order information” gets interval [2,3] (explain why)
- Same queries, “save order” set to [2,3]:
- Query: E<> end.finished and clock1<=8
8) Show that “get products” is always executed before “assemble bundle”
- A[] AssembleBundle.working imply GetProducts.finished
Thank You!
Download