Completed
Push — master ( b7eb8c...589bde )
by Egor
01:15
created

SizeExceedTest.test_crashes()   B

Complexity

Conditions 3

Size

Total Lines 27

Duplication

Lines 0
Ratio 0 %
Metric Value
cc 3
dl 0
loc 27
rs 8.8571
1
# coding: utf8
2
3
"""
4
This software is licensed under the Apache 2 license, quoted below.
5
6
Copyright 2014 Crystalnix Limited
7
8
Licensed under the Apache License, Version 2.0 (the "License"); you may not
9
use this file except in compliance with the License. You may obtain a copy of
10
the License at
11
12
    http://www.apache.org/licenses/LICENSE-2.0
13
14
Unless required by applicable law or agreed to in writing, software
15
distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
16
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
17
License for the specific language governing permissions and limitations under
18
the License.
19
"""
20
21
import uuid
22
23
from django.test import TestCase
24
25
from mock import patch
26
from freezegun import freeze_time
27
28
from crash.models import Crash, Symbols
29
from crash.factories import CrashFactory, SymbolsFactory
30
from feedback.models import Feedback
31
from feedback.factories import FeedbackFactory
32
from omaha.dynamic_preferences_registry import global_preferences_manager as gpm
33
from omaha_server.utils import is_private
34
from omaha.models import Version
35
from omaha.factories import VersionFactory
36
from omaha.tasks import (
37
    auto_delete_duplicate_crashes,
38
    auto_delete_older_than,
39
    auto_delete_size_is_exceeded,
40
    deferred_manual_cleanup
41
)
42
from omaha_server.utils import add_extra_to_log_message
43
from sparkle.models import SparkleVersion
44
from sparkle.factories import SparkleVersionFactory
45
46
class DuplicatedCrashesTest(TestCase):
47
    @freeze_time("2012-12-21 12:00:00")
48
    @patch('logging.getLogger')
49
    @is_private()
50
    def test_crashes(self, mocked_get_logger):
51
        gpm['Crash__duplicate_number'] = 2
52
        crashes = CrashFactory.create_batch(10, signature='test')
53
        deleted_crash = crashes[7]
54
        self.assertEqual(Crash.objects.all().count(), 10)
55
56
        extra_meta = dict(count=8, reason='duplicated', meta=True, log_id='36446dc3-ae7c-42ad-ae4e-6a826dcf0a00',
57
                          model='Crash', size=0.0)
58
        log_extra_msg = add_extra_to_log_message('Automatic cleanup', extra=extra_meta)
59
60
        extra = dict(id=deleted_crash.id, element_created=deleted_crash.created.strftime("%d. %B %Y %I:%M%p"),
61
                     signature=deleted_crash.signature, userid=deleted_crash.userid, appid=deleted_crash.appid,
62
                     log_id='36446dc3-ae7c-42ad-ae4e-6a826dcf0a00')
63
        log_msg = add_extra_to_log_message('Automatic cleanup element', extra=extra)
64
65
        mocked_logger = mocked_get_logger.return_value
66
        with patch('uuid.uuid4') as mocked_uuid4:
67
            mocked_uuid4.side_effect = (uuid.UUID('36446dc3-ae7c-42ad-ae4e-6a826dcf0a%02d' % x) for x in range(100))
68
            auto_delete_duplicate_crashes()
69
70
        self.assertEqual(mocked_logger.info.call_count, 9)
71
        mocked_logger.info.assert_any_call(log_extra_msg)
72
        mocked_logger.info.assert_any_call(log_msg)
73
74
75
class OldObjectsTest(TestCase):
76
    @patch('logging.getLogger')
77
    @is_private()
78
    def test_crashes(self, mocked_get_logger):
79
        gpm['Crash__limit_storage_days'] = 2
80
        with freeze_time("2012-12-21 12:00:00"):
81
            crashes = CrashFactory.create_batch(10, signature='test')
82
        deleted_crash = crashes[-1]
83
        self.assertEqual(Crash.objects.all().count(), 10)
84
85
        extra_meta = dict(count=10, reason='old', meta=True, log_id='36446dc3-ae7c-42ad-ae4e-6a826dcf0a00',
86
                          model='Crash', size=0.0)
87
        log_extra_msg = add_extra_to_log_message('Automatic cleanup', extra=extra_meta)
88
89
        extra = dict(id=deleted_crash.id, element_created=deleted_crash.created.strftime("%d. %B %Y %I:%M%p"),
90
                     signature=deleted_crash.signature, userid=deleted_crash.userid, appid=deleted_crash.appid,
91
                     log_id='36446dc3-ae7c-42ad-ae4e-6a826dcf0a00')
92
        log_msg = add_extra_to_log_message('Automatic cleanup element', extra=extra)
93
94
        mocked_logger = mocked_get_logger.return_value
95
        with patch('uuid.uuid4') as mocked_uuid4:
96
            mocked_uuid4.side_effect = (uuid.UUID('36446dc3-ae7c-42ad-ae4e-6a826dcf0a%02d' % x) for x in range(100))
97
            auto_delete_older_than()
98
99
        self.assertEqual(mocked_logger.info.call_count, 11)
100
        mocked_logger.info.assert_any_call(log_extra_msg)
101
        mocked_logger.info.assert_any_call(log_msg)
102
103
    @patch('logging.getLogger')
104
    @is_private()
105
    def test_feedbacks(self, mocked_get_logger):
106
        gpm['Feedback__limit_storage_days'] = 2
107
        with freeze_time("2012-12-21 12:00:00"):
108
            feedbacks = FeedbackFactory.create_batch(10)
109
        deleted_feedback = feedbacks[-1]
110
        self.assertEqual(Feedback.objects.all().count(), 10)
111
112
        extra_meta = dict(count=10, reason='old', meta=True, log_id='36446dc3-ae7c-42ad-ae4e-6a826dcf0a00',
113
                          model='Feedback', size=0.0)
114
        log_extra_msg = add_extra_to_log_message('Automatic cleanup', extra=extra_meta)
115
116
        extra = dict(id=deleted_feedback.id, element_created=deleted_feedback.created.strftime("%d. %B %Y %I:%M%p"),
117
                     log_id='36446dc3-ae7c-42ad-ae4e-6a826dcf0a00')
118
        log_msg = add_extra_to_log_message('Automatic cleanup element', extra=extra)
119
120
        mocked_logger = mocked_get_logger.return_value
121
        with patch('uuid.uuid4') as mocked_uuid4:
122
            mocked_uuid4.side_effect = (uuid.UUID('36446dc3-ae7c-42ad-ae4e-6a826dcf0a%02d' % x) for x in range(100))
123
            auto_delete_older_than()
124
125
        self.assertEqual(mocked_logger.info.call_count, 11)
126
        mocked_logger.info.assert_any_call(log_extra_msg)
127
        mocked_logger.info.assert_any_call(log_msg)
128
129
130
class SizeExceedTest(TestCase):
131
    @freeze_time("2012-12-21 12:00:00")
132
    @patch('logging.getLogger')
133
    @is_private()
134
    def test_crashes(self, mocked_get_logger):
135
        gpm['Crash__limit_size'] = 1
136
        crash_size = 10*1024*1023
137
        crashes = CrashFactory.create_batch(200, archive_size=crash_size, minidump_size=0)
138
        deleted_crash = crashes[97]
139
        self.assertEqual(Crash.objects.all().count(), 200)
140
141
        extra_meta = dict(count=98, reason='size_is_exceeded', meta=True, log_id='36446dc3-ae7c-42ad-ae4e-6a826dcf0a00',
142
                          model='Crash', size=979.04296875)
143
        log_extra_msg = add_extra_to_log_message('Automatic cleanup', extra=extra_meta)
144
145
        extra = dict(id=deleted_crash.id, element_created=deleted_crash.created.strftime("%d. %B %Y %I:%M%p"),
146
                     signature=deleted_crash.signature, userid=deleted_crash.userid, appid=deleted_crash.appid,
147
                     log_id='36446dc3-ae7c-42ad-ae4e-6a826dcf0a00')
148
        log_msg = add_extra_to_log_message('Automatic cleanup element', extra=extra)
149
150
        mocked_logger = mocked_get_logger.return_value
151
        with patch('uuid.uuid4') as mocked_uuid4:
152
            mocked_uuid4.side_effect = (uuid.UUID('36446dc3-ae7c-42ad-ae4e-6a826dcf0a%02d' % x) for x in range(100))
153
            auto_delete_size_is_exceeded()
154
155
        self.assertEqual(mocked_logger.info.call_count, 99)
156
        mocked_logger.info.assert_any_call(log_extra_msg)
157
        mocked_logger.info.assert_any_call(log_msg)
158
159
    @freeze_time("2012-12-21 12:00:00")
160
    @patch('logging.getLogger')
161
    @is_private()
162
    def test_feedbacks(self, mocked_get_logger):
163
        gpm['Feedback__limit_size'] = 1
164
        feedback_size = 10*1024*1023
165
        feedbacks = FeedbackFactory.create_batch(200, screenshot_size=feedback_size, system_logs_size=0, attached_file_size=0,
166
                                                 blackbox_size=0)
167
        deleted_feedback = feedbacks[97]
168
        self.assertEqual(Feedback.objects.all().count(), 200)
169
170
        extra_meta = dict(count=98, reason='size_is_exceeded', meta=True, log_id='36446dc3-ae7c-42ad-ae4e-6a826dcf0a00',
171
                          model='Feedback', size=979.04296875)
172
        log_extra_msg = add_extra_to_log_message('Automatic cleanup', extra=extra_meta)
173
174
        extra = dict(id=deleted_feedback.id, element_created=deleted_feedback.created.strftime("%d. %B %Y %I:%M%p"),
175
                     log_id='36446dc3-ae7c-42ad-ae4e-6a826dcf0a00')
176
        log_msg = add_extra_to_log_message('Automatic cleanup element', extra=extra)
177
178
        mocked_logger = mocked_get_logger.return_value
179
        with patch('uuid.uuid4') as mocked_uuid4:
180
            mocked_uuid4.side_effect = (uuid.UUID('36446dc3-ae7c-42ad-ae4e-6a826dcf0a%02d' % x) for x in range(100))
181
            auto_delete_size_is_exceeded()
182
        self.assertEqual(mocked_logger.info.call_count, 99)
183
        mocked_logger.info.assert_any_call(log_extra_msg)
184
        mocked_logger.info.assert_any_call(log_msg)
185
186
187
class ManualCleanupTest(TestCase):
188
    @freeze_time("2012-12-21 12:00:00")
189
    @patch('logging.getLogger')
190
    @is_private()
191
    def test_crashes(self, mocked_get_logger):
192
        gpm['Crash__duplicate_number'] = 2
193
        crashes = CrashFactory.create_batch(10, signature='test')
194
        deleted_crash = crashes[7]
195
        self.assertEqual(Crash.objects.count(), 10)
196
197
        extra_meta = dict(count=8, reason='manual', meta=True, log_id='36446dc3-ae7c-42ad-ae4e-6a826dcf0a00',
198
                          model='Crash', limit_duplicated=2, limit_size=None, limit_days=None, size=0.0)
199
        log_extra_msg = add_extra_to_log_message('Manual cleanup', extra=extra_meta)
200
201
        extra = dict(id=deleted_crash.id, element_created=deleted_crash.created.strftime("%d. %B %Y %I:%M%p"),
202
                     signature=deleted_crash.signature, userid=deleted_crash.userid, appid=deleted_crash.appid,
203
                     log_id='36446dc3-ae7c-42ad-ae4e-6a826dcf0a00')
204
        log_msg = add_extra_to_log_message('Manual cleanup element', extra=extra)
205
        mocked_logger = mocked_get_logger.return_value
206
207
        with patch('uuid.uuid4') as mocked_uuid4:
208
            mocked_uuid4.side_effect = (uuid.UUID('36446dc3-ae7c-42ad-ae4e-6a826dcf0a%02d' % x) for x in range(100))
209
            deferred_manual_cleanup(['crash', 'Crash'], limit_duplicated=2)
210
211
        self.assertEqual(mocked_logger.info.call_count, 9)
212
        mocked_logger.info.assert_any_call(log_extra_msg)
213
        mocked_logger.info.assert_any_call(log_msg)
214
215
    @freeze_time("2012-12-21 12:00:00")
216
    @patch('logging.getLogger')
217
    @is_private()
218
    def test_feedbacks(self, mocked_get_logger):
219
        gpm['Feedback__limit_size'] = 1
220
        feedback_size = 100*1024*1023
221
        feedbacks = FeedbackFactory.create_batch(20, screenshot_size=feedback_size, system_logs_size=0, attached_file_size=0,
222
                                                 blackbox_size=0)
223
        deleted_feedback = feedbacks[7]
224
        self.assertEqual(Feedback.objects.count(), 20)
225
226
        extra_meta = dict(count=10, reason='manual', meta=True, log_id='36446dc3-ae7c-42ad-ae4e-6a826dcf0a00',
227
                          model='Feedback', limit_duplicated=None, limit_size=1, limit_days=None, size=999.0234375)
228
        log_extra_msg = add_extra_to_log_message('Manual cleanup', extra=extra_meta)
229
230
        extra = dict(id=deleted_feedback.id, element_created=deleted_feedback.created.strftime("%d. %B %Y %I:%M%p"),
231
                     log_id='36446dc3-ae7c-42ad-ae4e-6a826dcf0a00')
232
        log_msg = add_extra_to_log_message('Manual cleanup element', extra=extra)
233
        mocked_logger = mocked_get_logger.return_value
234
235
        with patch('uuid.uuid4') as mocked_uuid4:
236
            mocked_uuid4.side_effect = (uuid.UUID('36446dc3-ae7c-42ad-ae4e-6a826dcf0a%02d' % x) for x in range(100))
237
            deferred_manual_cleanup(['feedback', 'Feedback'], limit_size=1)
238
        self.assertEqual(mocked_logger.info.call_count, 11)
239
        mocked_logger.info.assert_any_call(log_extra_msg)
240
        mocked_logger.info.assert_any_call(log_msg)
241
242
    @freeze_time("2012-12-21 12:00:00")
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
243
    @patch('logging.getLogger')
244
    @is_private()
245
    def test_symbols(self, mocked_get_logger):
246
        gpm['Feedback__limit_size'] = 1
247
        symbols_size = 100*1024*1023
248
        symbols = SymbolsFactory.create_batch(20, file_size=symbols_size)
249
        deleted_symbols = symbols[7]
250
        self.assertEqual(Symbols.objects.count(), 20)
251
252
        extra_meta = dict(count=10, reason='manual', meta=True, log_id='36446dc3-ae7c-42ad-ae4e-6a826dcf0a00',
253
                          model='Symbols', limit_duplicated=None, limit_size=1, limit_days=None, size=999.0234375)
254
        log_extra_msg = add_extra_to_log_message('Manual cleanup', extra=extra_meta)
255
256
        extra = dict(id=deleted_symbols.id, element_created=deleted_symbols.created.strftime("%d. %B %Y %I:%M%p"),
257
                     log_id='36446dc3-ae7c-42ad-ae4e-6a826dcf0a00')
258
        log_msg = add_extra_to_log_message('Manual cleanup element', extra=extra)
259
        mocked_logger = mocked_get_logger.return_value
260
261
        with patch('uuid.uuid4') as mocked_uuid4:
262
            mocked_uuid4.side_effect = (uuid.UUID('36446dc3-ae7c-42ad-ae4e-6a826dcf0a%02d' % x) for x in range(100))
263
            deferred_manual_cleanup(['crash', 'Symbols'], limit_size=1)
264
        self.assertEqual(mocked_logger.info.call_count, 11)
265
        mocked_logger.info.assert_any_call(log_extra_msg)
266
        mocked_logger.info.assert_any_call(log_msg)
267
268
    @freeze_time("2012-12-21 12:00:00")
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
269
    @patch('logging.getLogger')
270
    @is_private()
271
    def test_omaha_versions(self, mocked_get_logger):
272
        gpm['Version__limit_size'] = 1
273
        version_size = 1000*1024*1023
274
        versions = VersionFactory.create_batch(2, file_size=version_size)
275
        deleted_version = versions[0]
276
        self.assertEqual(Version.objects.count(), 2)
277
278
        extra_meta = dict(count=1, reason='manual', meta=True, log_id='36446dc3-ae7c-42ad-ae4e-6a826dcf0a00',
279
                          model='Version', limit_duplicated=None, limit_size=1, limit_days=None, size=999.0234375)
280
        log_extra_msg = add_extra_to_log_message('Manual cleanup', extra=extra_meta)
281
282
        extra = dict(id=deleted_version.id, element_created=deleted_version.created.strftime("%d. %B %Y %I:%M%p"),
283
                     log_id='36446dc3-ae7c-42ad-ae4e-6a826dcf0a00')
284
        log_msg = add_extra_to_log_message('Manual cleanup element', extra=extra)
285
        mocked_logger = mocked_get_logger.return_value
286
287
        with patch('uuid.uuid4') as mocked_uuid4:
288
            mocked_uuid4.side_effect = (uuid.UUID('36446dc3-ae7c-42ad-ae4e-6a826dcf0a%02d' % x) for x in range(100))
289
            deferred_manual_cleanup(['omaha', 'Version'], limit_size=1)
290
        self.assertEqual(mocked_logger.info.call_count, 2)
291
        mocked_logger.info.assert_any_call(log_extra_msg)
292
        mocked_logger.info.assert_any_call(log_msg)
293
294
    @freeze_time("2012-12-21 12:00:00")
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
295
    @patch('logging.getLogger')
296
    @is_private()
297
    def test_sparkle_versions(self, mocked_get_logger):
298
        gpm['SparkleVersion__limit_size'] = 1
299
        version_size = 1000*1024*1023
300
        versions = SparkleVersionFactory.create_batch(2, file_size=version_size)
301
        deleted_version = versions[0]
302
        self.assertEqual(SparkleVersion.objects.count(), 2)
303
304
        extra_meta = dict(count=1, reason='manual', meta=True, log_id='36446dc3-ae7c-42ad-ae4e-6a826dcf0a00',
305
                          model='SparkleVersion', limit_duplicated=None, limit_size=1, limit_days=None, size=999.0234375)
306
        log_extra_msg = add_extra_to_log_message('Manual cleanup', extra=extra_meta)
307
308
        extra = dict(id=deleted_version.id, element_created=deleted_version.created.strftime("%d. %B %Y %I:%M%p"),
309
                     log_id='36446dc3-ae7c-42ad-ae4e-6a826dcf0a00')
310
        log_msg = add_extra_to_log_message('Manual cleanup element', extra=extra)
311
        mocked_logger = mocked_get_logger.return_value
312
313
        with patch('uuid.uuid4') as mocked_uuid4:
314
            mocked_uuid4.side_effect = (uuid.UUID('36446dc3-ae7c-42ad-ae4e-6a826dcf0a%02d' % x) for x in range(100))
315
            deferred_manual_cleanup(['sparkle', 'SparkleVersion'], limit_size=1)
316
        self.assertEqual(mocked_logger.info.call_count, 2)
317
        mocked_logger.info.assert_any_call(log_extra_msg)
318
        mocked_logger.info.assert_any_call(log_msg)
319