Completed
Push — master ( 719867...30d2f4 )
by Ionel Cristian
01:05
created

MockStorage   A

Complexity

Total Complexity 1

Size/Duplication

Total Lines 6
Duplicated Lines 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
c 2
b 0
f 0
dl 0
loc 6
rs 10
wmc 1

1 Method

Rating   Name   Duplication   Size   Complexity  
A __init__() 0 5 1
1
from __future__ import absolute_import
2
3
import json
4
import logging
5
from io import BytesIO
6
from io import StringIO
7
8
import elasticsearch
9
import py
10
import pytest
11
from freezegun import freeze_time
12
13
from pytest_benchmark import plugin
14
from pytest_benchmark.plugin import BenchmarkSession
15
from pytest_benchmark.plugin import pytest_benchmark_compare_machine_info
16
from pytest_benchmark.plugin import pytest_benchmark_generate_json
17
from pytest_benchmark.plugin import pytest_benchmark_group_stats
18
from pytest_benchmark.storage.elasticsearch import ElasticsearchStorage
19
20
try:
21
    import unittest.mock as mock
22
except ImportError:
23
    import mock
24
25
logger = logging.getLogger(__name__)
26
27
THIS = py.path.local(__file__)
28
BENCHFILE = THIS.dirpath('test_storage/0030_5b78858eb718649a31fb93d8dc96ca2cee41a4cd_20150815_030419_uncommitted-changes.json')
29
SAVE_DATA = json.load(BENCHFILE.open('rU'))
30
SAVE_DATA["machine_info"] = {'foo': 'bar'}
31
SAVE_DATA["commit_info"] = {'foo': 'bar'}
32
33
tmp = SAVE_DATA.copy()
34
35
ES_DATA = tmp.pop("benchmarks")[0]
36
ES_DATA.update(tmp)
37
ES_DATA["benchmark_id"] = "FoobarOS_commitId"
38
39
40
class Namespace(object):
41
    def __init__(self, **kwargs):
42
        self.__dict__.update(kwargs)
43
44
    def __getitem__(self, item):
45
        return self.__dict__[item]
46
47
48
class LooseFileLike(BytesIO):
49
    def close(self):
50
        value = self.getvalue()
51
        super(LooseFileLike, self).close()
52
        self.getvalue = lambda: value
53
54
55
class MockStorage(ElasticsearchStorage):
56
    def __init__(self):
57
        self._es = mock.Mock(spec=elasticsearch.Elasticsearch)
58
        self._es_hosts = self._es_index = self._es_doctype = 'mocked'
59
        self.logger = logger
60
        self.default_machine_id = "FoobarOS"
61
62
63
class MockSession(BenchmarkSession):
64
    def __init__(self):
65
        self.verbose = False
66
        self.histogram = True
67
        self.benchmarks = []
68
        self.performance_regressions = []
69
        self.sort = u"min"
70
        self.compare = '0001'
71
        self.logger = logging.getLogger(__name__)
72
        self.machine_id = "FoobarOS"
73
        self.machine_info = {'foo': 'bar'}
74
        self.save = self.autosave = self.json = False
75
        self.options = {
76
            'min_rounds': 123,
77
            'min_time': 234,
78
            'max_time': 345,
79
        }
80
        self.compare_fail = []
81
        self.config = Namespace(hook=Namespace(
82
            pytest_benchmark_group_stats=pytest_benchmark_group_stats,
83
            pytest_benchmark_generate_machine_info=lambda **kwargs: {'foo': 'bar'},
84
            pytest_benchmark_update_machine_info=lambda **kwargs: None,
85
            pytest_benchmark_compare_machine_info=pytest_benchmark_compare_machine_info,
86
            pytest_benchmark_generate_json=pytest_benchmark_generate_json,
87
            pytest_benchmark_update_json=lambda **kwargs: None,
88
            pytest_benchmark_generate_commit_info=lambda **kwargs: {'foo': 'bar'},
89
            pytest_benchmark_update_commit_info=lambda **kwargs: None,
90
        ))
91
        self.elasticsearch_host = "localhost:9200"
92
        self.elasticsearch_index = "benchmark"
93
        self.elasticsearch_doctype = "benchmark"
94
        self.storage = MockStorage()
95
        self.group_by = 'group'
96
        self.columns = ['min', 'max', 'mean', 'stddev', 'median', 'iqr',
97
                        'outliers', 'rounds', 'iterations']
98
        self.benchmarks = []
99
        with BENCHFILE.open('rU') as fh:
100
            data = json.load(fh)
101
        self.benchmarks.extend(
102
            Namespace(
103
                as_dict=lambda include_data=False, stats=True, flat=False, _bench=bench:
104
                    dict(_bench, **_bench["stats"]) if flat else dict(_bench),
105
                name=bench['name'],
106
                fullname=bench['fullname'],
107
                group=bench['group'],
108
                options=bench['options'],
109
                has_error=False,
110
                params=None,
111
                **bench['stats']
112
            )
113
            for bench in data['benchmarks']
114
        )
115
116
117
try:
118
    text_type = unicode
119
except NameError:
120
    text_type = str
121
122
123
def force_text(text):
124
    if isinstance(text, text_type):
125
        return text
126
    else:
127
        return text.decode('utf-8')
128
129
130
def force_bytes(text):
131
    if isinstance(text, text_type):
132
        return text.encode('utf-8')
133
    else:
134
        return text
135
136
137 View Code Duplication
def make_logger(sess):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
138
    output = StringIO()
139
    sess.logger = Namespace(
140
        warn=lambda code, text, **opts: output.write(u"%s: %s %s\n" % (code, force_text(text), opts)),
141
        info=lambda text, **opts: output.write(force_text(text) + u'\n'),
142
        error=lambda text: output.write(force_text(text) + u'\n'),
143
    )
144
    sess.storage.logger = Namespace(
145
        warn=lambda code, text, **opts: output.write(u"%s: %s %s\n" % (code, force_text(text), opts)),
146
        info=lambda text, **opts: output.write(force_text(text) + u'\n'),
147
        error=lambda text: output.write(force_text(text) + u'\n'),
148
    )
149
    return output
150
151
152
@pytest.fixture
153
def sess():
154
    return MockSession()
155
156
157
@pytest.fixture
158
def logger_output(sess):
159
    return make_logger(sess)
160
161
162
@freeze_time("2015-08-15T00:04:18.687119")
163
def test_handle_saving(sess, logger_output, monkeypatch):
164
    monkeypatch.setattr(plugin, '__version__', '2.5.0')
165
    sess.save = "commitId"
166
    sess.autosave = True
167
    sess.json = None
168
    sess.save_data = False
169
    sess.handle_saving()
170
    sess.storage._es.index.assert_called_with(
171
        index='mocked',
172
        doc_type='mocked',
173
        body=ES_DATA,
174
        id='FoobarOS_commitId_tests/test_normal.py::test_xfast_parametrized[0]',
175
    )
176