Stop installing librairies during tests
[parser.git] / verigraph / service / src / mcnet / netobjs / PolitoEndHost.java
1 /*******************************************************************************
2  * Copyright (c) 2017 Politecnico di Torino and others.
3  *
4  * All rights reserved. This program and the accompanying materials
5  * are made available under the terms of the Apache License, Version 2.0
6  * which accompanies this distribution, and is available at
7  * http://www.apache.org/licenses/LICENSE-2.0
8  *******************************************************************************/
9
10 package mcnet.netobjs;
11
12 import java.util.ArrayList;
13 import java.util.List;
14
15 import com.microsoft.z3.BoolExpr;
16 import com.microsoft.z3.Context;
17 import com.microsoft.z3.DatatypeExpr;
18 import com.microsoft.z3.Expr;
19 import com.microsoft.z3.IntExpr;
20 import com.microsoft.z3.Solver;
21
22 import mcnet.components.NetContext;
23 import mcnet.components.Network;
24 import mcnet.components.NetworkObject;
25
26 public class PolitoEndHost extends NetworkObject {
27
28         List<BoolExpr> constraints = new ArrayList<BoolExpr>();
29         Context ctx;
30         DatatypeExpr politoEndHost;
31         Network net;
32         NetContext nctx;
33
34         public PolitoEndHost(Context ctx, Object[]... args) {
35                 super(ctx, args);
36         }
37
38         @Override
39         public DatatypeExpr getZ3Node() {
40                 return politoEndHost;
41         }
42
43         @Override
44         protected void init(Context ctx, Object[]... args) {
45                 this.ctx = ctx;
46                 this.isEndHost = true;
47                 this.politoEndHost = this.z3Node = ((NetworkObject)args[0][0]).getZ3Node();
48                 this.net = (Network)args[0][1];
49         this.nctx = (NetContext)args[0][2];
50         }
51
52         @Override
53         protected void addConstraints(Solver solver) {
54                 BoolExpr[] constr = new BoolExpr[constraints.size()];
55             solver.add(constraints.toArray(constr));
56         }
57
58         /*
59          * Fields that can be configured -> "dest","body","seq","proto","emailFrom","url","options"
60          */
61         public void installEndHost (PacketModel packet){
62                 System.out.println("Installing PolitoEndHost...");
63                 Expr n_0 = ctx.mkConst("PolitoEndHost_"+politoEndHost+"_n_0", nctx.node);
64         Expr p_0 = ctx.mkConst("PolitoEndHost_"+politoEndHost+"_p_0", nctx.packet);
65         IntExpr t_0 = ctx.mkIntConst("PolitoEndHost_"+politoEndHost+"_t_0");
66                 BoolExpr predicatesOnPktFields = ctx.mkTrue();
67
68                 if(packet.getIp_dest() != null)
69                         predicatesOnPktFields = ctx.mkAnd(predicatesOnPktFields, ctx.mkEq(nctx.pf.get("dest").apply(p_0), packet.getIp_dest()));
70                 if(packet.getBody() != null)
71                         predicatesOnPktFields = ctx.mkAnd(predicatesOnPktFields, ctx.mkEq(nctx.pf.get("body").apply(p_0), ctx.mkInt(packet.getBody())));
72                 if(packet.getEmailFrom() != null)
73                         predicatesOnPktFields = ctx.mkAnd(predicatesOnPktFields, ctx.mkEq(nctx.pf.get("emailFrom").apply(p_0), ctx.mkInt(packet.getEmailFrom())));
74                 if(packet.getOptions() != null)
75                         predicatesOnPktFields = ctx.mkAnd(predicatesOnPktFields, ctx.mkEq(nctx.pf.get("options").apply(p_0), ctx.mkInt(packet.getOptions())));
76                 if(packet.getProto() != null)
77                         predicatesOnPktFields = ctx.mkAnd(predicatesOnPktFields, ctx.mkEq(nctx.pf.get("proto").apply(p_0), ctx.mkInt(packet.getProto())));
78                 if(packet.getSeq() != null)
79                         predicatesOnPktFields = ctx.mkAnd(predicatesOnPktFields, ctx.mkEq(nctx.pf.get("seq").apply(p_0), ctx.mkInt(packet.getSeq())));
80                 if(packet.getUrl() != null)
81                         predicatesOnPktFields = ctx.mkAnd(predicatesOnPktFields, ctx.mkEq(nctx.pf.get("url").apply(p_0), ctx.mkInt(packet.getUrl())));
82
83                 //Constraint1           send(politoWebClient, n_0, p, t_0) -> p.origin == politoWebClient && p.orig_body == p.body && nodeHasAddr(politoWebClient,p.src)
84                 constraints.add( ctx.mkForall(new Expr[]{n_0, p_0, t_0},
85                 ctx.mkImplies((BoolExpr)nctx.send.apply(politoEndHost, n_0, p_0, t_0),
86                                 ctx.mkAnd(predicatesOnPktFields,
87                                                   ctx.mkEq(nctx.pf.get("orig_body").apply(p_0),nctx.pf.get("body").apply(p_0)),
88                                                   ctx.mkEq(nctx.pf.get("origin").apply(p_0),politoEndHost),
89                                                   (BoolExpr)nctx.nodeHasAddr.apply(politoEndHost,nctx.pf.get("src").apply(p_0)))),1,null,null,null,null));
90
91                 //Constraint2           recv(n_0, politoWebClient, p, t_0) -> nodeHasAddr(politoWebClient,p.dest)
92                 constraints.add( ctx.mkForall(new Expr[]{n_0, p_0, t_0},
93                 ctx.mkImplies((BoolExpr)nctx.recv.apply(n_0,politoEndHost, p_0, t_0),
94                                 (BoolExpr)nctx.nodeHasAddr.apply(politoEndHost,nctx.pf.get("dest").apply(p_0))),1,null,null,null,null));
95
96                 System.out.println("Done.");
97                 return;
98         }
99
100 }