ore.tests.test_backends   A
last analyzed

Complexity

Total Complexity 16

Size/Duplication

Total Lines 189
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 16
eloc 137
dl 0
loc 189
rs 10
c 0
b 0
f 0

9 Methods

Rating   Name   Duplication   Size   Complexity  
A AnalysisFixtureTestCase.testResultOrdering() 0 26 3
A AnalysisFixtureTestCase.testPRDCFuzztree() 0 22 2
A InternalTestCase.test_result_parsing() 0 12 3
A BackendDaemonTestCase.setUp() 0 9 1
A AnalysisFixtureTestCase.testRateFaulttreeSimulation() 0 14 1
A MinCutFixtureTestCase.testMincutFaulttree() 0 17 1
A AnalysisFixtureTestCase.testFrontendAPIPdfExport() 0 6 2
A AnalysisFixtureTestCase.testFrontendAPIEpsExport() 0 8 2
A AnalysisFixtureTestCase.testRateFaulttree() 0 17 1
1
import unittest
2
import sys
3
import json
4
5
from ore.models import Graph, Job, Result
6
from .common import fixt_analysis, fixt_mincut, OreLiveServerTestCase
7
8
9
class BackendDaemonTestCase(OreLiveServerTestCase):
10
11
    """
12
        Base class for tests of backend functionality.
13
        This demands firing up the backend daemon in the setup phase, which
14
        is done here.
15
    """
16
17
    baseUrl = '/api/front'
18
19
    def setUp(self):
20
        # Start up backend daemon in testing mode so that it uses port 8081 of
21
        # the live test server
22
        # print "Starting backend daemon"
23
        # os.chdir("/ore-back")
24
        # self.backend = subprocess.Popen(["python", "daemon.py", "--force_server", self.live_server_url])
25
        # time.sleep(2)
26
        # os.chdir("..")
27
        self.setUpLogin()
28
29
#    def tearDown(self):
30
#        print "\nShutting down backend daemon"
31
        # self.backend.terminate()
32
33
34
class InternalTestCase(BackendDaemonTestCase):
35
36
    """
37
        The tests for internal functions that are not exposed directly via one of the APIs.
38
        Since some tests explicitely create job objects, a signal is always triggered to talk to
39
        the backend daemon. For this reason, we need to fire it up.
40
        #TODO: This is no longer needed when Django supports signal disabling in tests.
41
    """
42
    fixtures = fixt_analysis['files']
43
44
    def test_result_parsing(self):
45
        for graphPk, graphResult in fixt_analysis['results'].iteritems():
46
            graph = Graph.objects.get(pk=graphPk)
47
            job = Job(
48
                graph_modified=graph.modified,
49
                graph=graph,
50
                kind=Job.TOP_EVENT_JOB)
51
            job.save()
52
            job.parse_result(open('ore/fixtures/' + graphResult).read())
53
            for result in job.results.exclude(kind__exact=Result.GRAPH_ISSUES):
54
                print "Result"
55
                print result
56
57
58
class AnalysisFixtureTestCase(BackendDaemonTestCase):
59
60
    """
61
        Analysis engine tests.
62
    """
63
    fixtures = fixt_analysis['files']
64
65
    @unittest.skipUnless(
66
        sys.platform.startswith("linux"), "requires Linux")
67
    def testRateFaulttree(self):
68
        job_result = self.requestJob(
69
            self.baseUrl,
70
            fixt_analysis['rate_faulttree'],
71
            'topevent')
72
        job_result_info = json.loads(job_result.content)
73
        assert('issues' in job_result_info)
74
        assert('columns' in job_result_info)
75
        result_url = job_result['LOCATION']
76
        result = self.ajaxGet(
77
            result_url +
78
            '?sEcho=doo')   # Fetch result in datatables style
79
        self.assertEqual(result.status_code, 200)
80
        data = json.loads(result.content)
81
        self.assertEqual(data['aaData'][0]['peak'], 1.0)
82
83
    @unittest.skipUnless(
84
        sys.platform.startswith("linux"), "requires Linux")
85
    def testRateFaulttreeSimulation(self):
86
        job_result = self.requestJob(
87
            self.baseUrl,
88
            fixt_analysis['rate_faulttree'],
89
            'simulation')
90
        result_url = job_result['LOCATION']
91
        result = self.ajaxGet(
92
            result_url +
93
            '?sEcho=doo')   # Fetch result in datatables style
94
        self.assertEqual(result.status_code, 200)
95
        data = json.loads(result.content)
96
        assert(len(data['aaData']) > 0)
97
98
    @unittest.skipUnless(
99
        sys.platform.startswith("linux"), "requires Linux")
100
    def testPRDCFuzztree(self):
101
        job_result = self.requestJob(
102
            self.baseUrl,
103
            fixt_analysis['prdc_fuzztree'],
104
            'topevent')
105
        job_result_info = json.loads(job_result.content)
106
        assert('issues' in job_result_info)
107
        assert('columns' in job_result_info)
108
        print "\n" + str(job_result_info)
109
        result_url = job_result['LOCATION']
110
        result = self.ajaxGet(
111
            result_url +
112
            '?sEcho=doo')  # Fetch result in datatables style
113
        self.assertEqual(result.status_code, 200)
114
        data = json.loads(result.content)
115
        print "\n" + str(data)
116
        self.assertEqual(
117
            len(data['aaData']), fixt_analysis['prdc_configurations'])
118
        for conf in data['aaData']:
119
            assert (round(conf['peak'], 5) in fixt_analysis['prdc_peaks'])
120
121
    def testFrontendAPIPdfExport(self):
122
        for graphPk, graphType in fixt_analysis['graphs'].iteritems():
123
            job_result = self.requestJob(self.baseUrl, graphPk, 'pdf')
124
            pdf_url = job_result['LOCATION']
125
            pdf = self.get(pdf_url)
126
            self.assertEqual('application/pdf', pdf['CONTENT-TYPE'])
127
128
    @unittest.skipUnless(
129
        sys.platform.startswith("linux"), "requires Linux")
130
    def testFrontendAPIEpsExport(self):
131
        for graphPk, graphType in fixt_analysis['graphs'].iteritems():
132
            job_result = self.requestJob(self.baseUrl, graphPk, 'eps')
133
            eps_url = job_result['LOCATION']
134
            eps = self.get(eps_url)
135
            self.assertEqual('application/postscript', eps['CONTENT-TYPE'])
136
137
    @unittest.skipUnless(
138
        sys.platform.startswith("linux"), "requires Linux")
139
    def testResultOrdering(self):
140
        job_result = self.requestJob(
141
            self.baseUrl,
142
            fixt_analysis['prdc_fuzztree'],
143
            'topevent')
144
        result_url = job_result['LOCATION']
145
        # Ordering in datatables style
146
        titles = Result.titles(Result.ANALYSIS_RESULT, 'fuzztree')
147
        print "\nFields being supported in the result: %s\n" % str(titles)
148
        for index, col_desc in enumerate(
149
                titles, start=0):      # Datatables starts at column 1
150
            field_name = col_desc[0]
151
            print "Fetching result sorted by " + field_name
152
            url = result_url + \
153
                '?sEcho=doo&iSortingCols=1&sSortDir_0=asc&iSortCol_0=' + \
154
                str(index)
155
            result = self.ajaxGet(url)
156
            data = json.loads(result.content)
157
            for i in xrange(0, len(data['aaData']), 2):
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable xrange does not seem to be defined.
Loading history...
158
                prec = data['aaData'][i][field_name]
159
                succ = data['aaData'][i + 1][field_name]
160
                print prec
161
                print succ
162
                assert(prec <= succ)
163
164
165
class MinCutFixtureTestCase(BackendDaemonTestCase):
166
167
    """
168
        Mincut engine tests.
169
    """
170
    fixtures = fixt_mincut['files']
171
172
    @unittest.skip("")
173
#    @unittest.skipUnless(sys.platform.startswith("linux"), "requires Linux")
174
    def testMincutFaulttree(self):
175
        job_result = self.requestJob(
176
            self.baseUrl,
177
            fixt_mincut['mincut_faulttree'],
178
            'mincut')
179
        result_url = job_result['LOCATION']
180
        result = self.ajaxGet(
181
            result_url +
182
            '?sEcho=doo')   # Fetch result in datatables style
183
        self.assertEqual(result.status_code, 200)
184
        data = json.loads(result.content)
185
        assert(len(data['aaData']) > 0)
186
        assert('mincutResults' in data['aaData'][0])
187
        mincut_results = data['aaData'][0]['mincutResults']
188
        self.assertEqual(len(mincut_results), fixt_mincut['mincut_numcuts'])
189