summaryrefslogtreecommitdiffstats
path: root/verigraph/tester/test.py
blob: ad0b82a29026ecb7ddd3e3a1b68f74f4c3e3e5aa (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#!/usr/bin/python

##############################################################################
# Copyright (c) 2017 Politecnico di Torino and others.
#
# All rights reserved. This program and the accompanying materials
# are made available under the terms of the Apache License, Version 2.0
# which accompanies this distribution, and is available at
# http://www.apache.org/licenses/LICENSE-2.0
##############################################################################

from __future__ import print_function
from jsonschema import validate
from pprint import pprint
import sys
import requests
from requests.exceptions import *
from jsonschema.exceptions import *
import json
import getopt
import os
import subprocess

# Constants (change them, if appropriate)
VERIGRAPH_PORT = "8080"
TEST_CASES_DIR = "testcases"
BASE_URL = "http://localhost:"+VERIGRAPH_PORT+"/verify/api/graphs/"
SCHEMA_FILE = "testcase_schema.json"

# Variables
success = 0
run = 0

# Utils
def eprint(toPrint):
    sys.stdout.flush()
    print(toPrint, file=sys.stderr)
    sys.stderr.flush()

# Print PYTHON ver
print("PYTHON " + sys.version)

# Loading schema file
try:
    schema = json.load(open(SCHEMA_FILE))
except ValueError:
    eprint("Invalid json schema (check your "+SCHEMA_FILE+")!\nExiting.")
    exit(-1)

# Iterate over .json files contained in the TEST_CASES_DIR
for i in os.listdir(TEST_CASES_DIR):
    if i.endswith(".json"): 
        with open(TEST_CASES_DIR+os.path.sep+i) as data_file:
            try:
                # Load json file (raise exception if malformed)
                data = json.load(data_file)

                # Validate input json against schema (raise exception if invalid)
                validate(data, schema)

                run += 1
                print("Test case ID: "+str(data["id"]))
                print("\tFILE NAME: "+i)
                print("\tTEST NAME: "+data["name"])
                print("\tTEST DESCRIPTION: "+data["description"])

                # POST the graph
                r = requests.post(BASE_URL, json=data["graph"])
                if r.status_code == 201:
                    graph_id = r.json()["id"]
                    print("\tCreated Graph has ID " + str(graph_id) + " on VeriGraph")

                    # GET the policy verification result
                    policy = requests.get(BASE_URL+str(graph_id)+"/policy"+data["policy_url_parameters"])

                    # Check the response
                    if policy.status_code == 200:
                        print("\tVerification result is " + policy.json()["result"])

                        # Check the result with the expected one
                        if policy.json()["result"] == data["result"]:
                            # SUCCESS
                            print("\t+++ Test passed +++")
                            success += 1
                        else:
                            # FAIL
                            eprint("\t[ERROR] Expected result was " + data["result"] + " but VeriGraph returned " + policy.json()["result"])
                            print("\t--- Test failed ---")
                    else:
                        print("\tVeriGraph returned an unexpected response -> " + str(policy.status_code), policy.reason)
                        print("\t--- Test failed ---")
                print()
            except ValueError:
                print("Malformed json!\nSkipping "+i+" file")
                print("\t--- Test failed ---")
            except ValidationError:
                print("Invalid json (see Schema file)!\nSkipping "+i+" file")
                print("\t--- Test failed ---")
            except ConnectionError:
                print("Connection refused!")
                print("\t--- Test failed ---")
            except HTTPError:
                print("HTTP error!")
                print("\t--- Test failed ---")

# Final output
print("\nTest run = "+str(run))
print("Test succeded = "+str(success))
if run != 0:
    if success != run:
        print("\n --- Some tests failed. See the output. ---")
    else:
        print("\n +++ All tests passed +++")
else:
    print("\n\n +++ 0 tests executed +++")