Completed
Push — master ( 62a151...74c045 )
by
unknown
53s
created

DeleteDanglingTest   A

Complexity

Total Complexity 2

Size/Duplication

Total Lines 42
Duplicated Lines 92.86 %

Importance

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

2 Methods

Rating   Name   Duplication   Size   Complexity  
A test_dangling_delete_s3() 20 20 1
A test_dangling_delete_db() 19 19 1

How to fix   Duplicated Code   

Duplicated Code

Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.

Common duplication problems, and corresponding solutions are:

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 os
22
import uuid
23
24
from django.test import TestCase
25
26
from mock import patch
27
from freezegun import freeze_time
28
29
import omaha
30
31
from crash.models import Crash, Symbols
32
from crash.factories import CrashFactory, SymbolsFactory
33
from feedback.models import Feedback
34
from feedback.factories import FeedbackFactory
35
from omaha.dynamic_preferences_registry import global_preferences_manager as gpm
36
from omaha_server.utils import is_private, storage_with_spaces_instance
37
from omaha.models import Version
38
from omaha.factories import VersionFactory
39
from omaha.tasks import (
40
    auto_delete_duplicate_crashes,
41
    auto_delete_older_than,
42
    auto_delete_size_is_exceeded,
43
    deferred_manual_cleanup,
44
    auto_delete_dangling_files
45
)
46
from omaha_server.utils import add_extra_to_log_message
47 View Code Duplication
from sparkle.models import SparkleVersion
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
48
from sparkle.factories import SparkleVersionFactory
49
from omaha.tasks import get_prefix
50
51
52
class DuplicatedCrashesTest(TestCase):
53
    @freeze_time("2012-12-21 12:00:00")
54
    @patch('logging.getLogger')
55
    @is_private()
56
    def test_crashes(self, mocked_get_logger):
57
        gpm['Crash__duplicate_number'] = 2
58
        crashes = CrashFactory.create_batch(10, signature='test')
59
        deleted_crash = crashes[7]
60
        self.assertEqual(Crash.objects.all().count(), 10)
61
62
        extra_meta = dict(count=8, reason='duplicated', meta=True, log_id='36446dc3-ae7c-42ad-ae4e-6a826dcf0a00',
63
                          model='Crash', size='0 bytes')
64
        log_extra_msg = add_extra_to_log_message('Automatic cleanup', extra=extra_meta)
65
66
        extra = dict(Crash_id=deleted_crash.id, element_created=deleted_crash.created.strftime("%d. %B %Y %I:%M%p"),
67
                     signature=deleted_crash.signature, userid=deleted_crash.userid, appid=deleted_crash.appid,
68
                     log_id='36446dc3-ae7c-42ad-ae4e-6a826dcf0a00')
69
        log_msg = add_extra_to_log_message('Automatic cleanup element', extra=extra)
70
71
        mocked_logger = mocked_get_logger.return_value
72
        with patch('uuid.uuid4') as mocked_uuid4:
73
            mocked_uuid4.side_effect = (uuid.UUID('36446dc3-ae7c-42ad-ae4e-6a826dcf0a%02d' % x) for x in range(100))
74
            auto_delete_duplicate_crashes()
75
76 View Code Duplication
        self.assertEqual(mocked_logger.info.call_count, 10)
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
77
        mocked_logger.info.assert_any_call(log_extra_msg)
78
        mocked_logger.info.assert_any_call(log_msg)
79
80
81
class OldObjectsTest(TestCase):
82
    @patch('logging.getLogger')
83
    @is_private()
84
    def test_crashes(self, mocked_get_logger):
85
        gpm['Crash__limit_storage_days'] = 2
86
        with freeze_time("2012-12-21 12:00:00"):
87
            crashes = CrashFactory.create_batch(10, signature='test')
88
        deleted_crash = crashes[-1]
89
        self.assertEqual(Crash.objects.all().count(), 10)
90
91
        extra_meta = dict(count=10, reason='old', meta=True, log_id='36446dc3-ae7c-42ad-ae4e-6a826dcf0a00',
92
                          model='Crash', size='0 bytes')
93
        log_extra_msg = add_extra_to_log_message('Automatic cleanup', extra=extra_meta)
94
95
        extra = dict(Crash_id=deleted_crash.id, element_created=deleted_crash.created.strftime("%d. %B %Y %I:%M%p"),
96
                     signature=deleted_crash.signature, userid=deleted_crash.userid, appid=deleted_crash.appid,
97
                     log_id='36446dc3-ae7c-42ad-ae4e-6a826dcf0a00')
98
        log_msg = add_extra_to_log_message('Automatic cleanup element', extra=extra)
99
100
        mocked_logger = mocked_get_logger.return_value
101
        with patch('uuid.uuid4') as mocked_uuid4:
102
            mocked_uuid4.side_effect = (uuid.UUID('36446dc3-ae7c-42ad-ae4e-6a826dcf0a%02d' % x) for x in range(100))
103
            auto_delete_older_than()
104
105
        self.assertEqual(mocked_logger.info.call_count, 11)
106
        mocked_logger.info.assert_any_call(log_extra_msg)
107
        mocked_logger.info.assert_any_call(log_msg)
108
109
    @patch('logging.getLogger')
110
    @is_private()
111
    def test_feedbacks(self, mocked_get_logger):
112
        gpm['Feedback__limit_storage_days'] = 2
113
        with freeze_time("2012-12-21 12:00:00"):
114
            feedbacks = FeedbackFactory.create_batch(10)
115
        deleted_feedback = feedbacks[-1]
116
        self.assertEqual(Feedback.objects.all().count(), 10)
117
118
        extra_meta = dict(count=10, reason='old', meta=True, log_id='36446dc3-ae7c-42ad-ae4e-6a826dcf0a00',
119
                          model='Feedback', size='0 bytes')
120
        log_extra_msg = add_extra_to_log_message('Automatic cleanup', extra=extra_meta)
121
122
        extra = dict(Feedback_id=deleted_feedback.id, element_created=deleted_feedback.created.strftime("%d. %B %Y %I:%M%p"),
123
                     log_id='36446dc3-ae7c-42ad-ae4e-6a826dcf0a00')
124
        log_msg = add_extra_to_log_message('Automatic cleanup element', extra=extra)
125
126
        mocked_logger = mocked_get_logger.return_value
127
        with patch('uuid.uuid4') as mocked_uuid4:
128
            mocked_uuid4.side_effect = (uuid.UUID('36446dc3-ae7c-42ad-ae4e-6a826dcf0a%02d' % x) for x in range(100))
129
            auto_delete_older_than()
130
131 View Code Duplication
        self.assertEqual(mocked_logger.info.call_count, 11)
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
132
        mocked_logger.info.assert_any_call(log_extra_msg)
133
        mocked_logger.info.assert_any_call(log_msg)
134
135
136
class SizeExceedTest(TestCase):
137
    @freeze_time("2012-12-21 12:00:00")
138
    @patch('logging.getLogger')
139
    @is_private()
140
    def test_crashes(self, mocked_get_logger):
141
        gpm['Crash__limit_size'] = 1
142
        crash_size = 10*1024*1023
143
        crashes = CrashFactory.create_batch(200, archive_size=crash_size, minidump_size=0)
144
        deleted_crash = crashes[97]
145
        self.assertEqual(Crash.objects.all().count(), 200)
146
147
        extra_meta = dict(count=98, reason='size_is_exceeded', meta=True, log_id='36446dc3-ae7c-42ad-ae4e-6a826dcf0a00',
148
                          model='Crash', size='979.0 MB')
149
        log_extra_msg = add_extra_to_log_message('Automatic cleanup', extra=extra_meta)
150
151
        extra = dict(Crash_id=deleted_crash.id, element_created=deleted_crash.created.strftime("%d. %B %Y %I:%M%p"),
152
                     signature=deleted_crash.signature, userid=deleted_crash.userid, appid=deleted_crash.appid,
153
                     log_id='36446dc3-ae7c-42ad-ae4e-6a826dcf0a00')
154
        log_msg = add_extra_to_log_message('Automatic cleanup element', extra=extra)
155
156
        mocked_logger = mocked_get_logger.return_value
157
        with patch('uuid.uuid4') as mocked_uuid4:
158
            mocked_uuid4.side_effect = (uuid.UUID('36446dc3-ae7c-42ad-ae4e-6a826dcf0a%02d' % x) for x in range(100))
159 View Code Duplication
            auto_delete_size_is_exceeded()
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
160
161
        self.assertEqual(mocked_logger.info.call_count, 99)
162
        mocked_logger.info.assert_any_call(log_extra_msg)
163
        mocked_logger.info.assert_any_call(log_msg)
164
165
    @freeze_time("2012-12-21 12:00:00")
166
    @patch('logging.getLogger')
167
    @is_private()
168
    def test_feedbacks(self, mocked_get_logger):
169
        gpm['Feedback__limit_size'] = 1
170
        feedback_size = 10*1024*1023
171
        feedbacks = FeedbackFactory.create_batch(200, screenshot_size=feedback_size, system_logs_size=0, attached_file_size=0,
172
                                                 blackbox_size=0)
173
        deleted_feedback = feedbacks[97]
174
        self.assertEqual(Feedback.objects.all().count(), 200)
175
176
        extra_meta = dict(count=98, reason='size_is_exceeded', meta=True, log_id='36446dc3-ae7c-42ad-ae4e-6a826dcf0a00',
177
                          model='Feedback', size='979.0 MB')
178
        log_extra_msg = add_extra_to_log_message('Automatic cleanup', extra=extra_meta)
179
180
        extra = dict(Feedback_id=deleted_feedback.id, element_created=deleted_feedback.created.strftime("%d. %B %Y %I:%M%p"),
181
                     log_id='36446dc3-ae7c-42ad-ae4e-6a826dcf0a00')
182
        log_msg = add_extra_to_log_message('Automatic cleanup element', extra=extra)
183
184
        mocked_logger = mocked_get_logger.return_value
185
        with patch('uuid.uuid4') as mocked_uuid4:
186
            mocked_uuid4.side_effect = (uuid.UUID('36446dc3-ae7c-42ad-ae4e-6a826dcf0a%02d' % x) for x in range(100))
187
            auto_delete_size_is_exceeded()
188 View Code Duplication
        self.assertEqual(mocked_logger.info.call_count, 99)
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
189
        mocked_logger.info.assert_any_call(log_extra_msg)
190
        mocked_logger.info.assert_any_call(log_msg)
191
192
193
class ManualCleanupTest(TestCase):
194
    @freeze_time("2012-12-21 12:00:00")
195
    @patch('logging.getLogger')
196
    @is_private()
197
    def test_crashes(self, mocked_get_logger):
198
        gpm['Crash__duplicate_number'] = 2
199
        crashes = CrashFactory.create_batch(10, signature='test')
200
        deleted_crash = crashes[7]
201
        self.assertEqual(Crash.objects.count(), 10)
202
203
        extra_meta = dict(count=8, reason='manual', meta=True, log_id='36446dc3-ae7c-42ad-ae4e-6a826dcf0a00',
204
                          model='Crash', limit_duplicated=2, limit_size=None, limit_days=None, size='0 bytes')
205
        log_extra_msg = add_extra_to_log_message('Manual cleanup', extra=extra_meta)
206
207
        extra = dict(Crash_id=deleted_crash.id, element_created=deleted_crash.created.strftime("%d. %B %Y %I:%M%p"),
208
                     signature=deleted_crash.signature, userid=deleted_crash.userid, appid=deleted_crash.appid,
209
                     log_id='36446dc3-ae7c-42ad-ae4e-6a826dcf0a00')
210
        log_msg = add_extra_to_log_message('Manual cleanup element', extra=extra)
211
        mocked_logger = mocked_get_logger.return_value
212
213
        with patch('uuid.uuid4') as mocked_uuid4:
214
            mocked_uuid4.side_effect = (uuid.UUID('36446dc3-ae7c-42ad-ae4e-6a826dcf0a%02d' % x) for x in range(100))
215 View Code Duplication
            deferred_manual_cleanup(['crash', 'Crash'], limit_duplicated=2)
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
216
217
        self.assertEqual(mocked_logger.info.call_count, 10)
218
        mocked_logger.info.assert_any_call(log_extra_msg)
219
        mocked_logger.info.assert_any_call(log_msg)
220
221
    @freeze_time("2012-12-21 12:00:00")
222
    @patch('logging.getLogger')
223
    @is_private()
224
    def test_feedbacks(self, mocked_get_logger):
225
        gpm['Feedback__limit_size'] = 1
226
        feedback_size = 100*1024*1023
227
        feedbacks = FeedbackFactory.create_batch(20, screenshot_size=feedback_size, system_logs_size=0, attached_file_size=0,
228
                                                 blackbox_size=0)
229
        deleted_feedback = feedbacks[7]
230
        self.assertEqual(Feedback.objects.count(), 20)
231
232
        extra_meta = dict(count=10, reason='manual', meta=True, log_id='36446dc3-ae7c-42ad-ae4e-6a826dcf0a00',
233
                          model='Feedback', limit_duplicated=None, limit_size=1, limit_days=None, size='999.0 MB')
234
        log_extra_msg = add_extra_to_log_message('Manual cleanup', extra=extra_meta)
235
236
        extra = dict(Feedback_id=deleted_feedback.id, element_created=deleted_feedback.created.strftime("%d. %B %Y %I:%M%p"),
237
                     log_id='36446dc3-ae7c-42ad-ae4e-6a826dcf0a00')
238
        log_msg = add_extra_to_log_message('Manual cleanup element', extra=extra)
239
        mocked_logger = mocked_get_logger.return_value
240
241
        with patch('uuid.uuid4') as mocked_uuid4:
242
            mocked_uuid4.side_effect = (uuid.UUID('36446dc3-ae7c-42ad-ae4e-6a826dcf0a%02d' % x) for x in range(100))
243
            deferred_manual_cleanup(['feedback', 'Feedback'], limit_size=1)
244
        self.assertEqual(mocked_logger.info.call_count, 11)
245
        mocked_logger.info.assert_any_call(log_extra_msg)
246
        mocked_logger.info.assert_any_call(log_msg)
247
248
    @freeze_time("2012-12-21 12:00:00")
249
    @patch('logging.getLogger')
250
    @is_private()
251
    def test_symbols(self, mocked_get_logger):
252
        storage_with_spaces_instance._setup()
253
        gpm['Feedback__limit_size'] = 1
254
        symbols_size = 100*1024*1023
255
        symbols = SymbolsFactory.create_batch(20, file_size=symbols_size)
256
        deleted_symbols = symbols[7]
257
        self.assertEqual(Symbols.objects.count(), 20)
258
259
        extra_meta = dict(count=10, reason='manual', meta=True, log_id='36446dc3-ae7c-42ad-ae4e-6a826dcf0a00',
260
                          model='Symbols', limit_duplicated=None, limit_size=1, limit_days=None, size='999.0 MB')
261
        log_extra_msg = add_extra_to_log_message('Manual cleanup', extra=extra_meta)
262
263
        extra = dict(Symbols_id=deleted_symbols.id, element_created=deleted_symbols.created.strftime("%d. %B %Y %I:%M%p"),
264
                     log_id='36446dc3-ae7c-42ad-ae4e-6a826dcf0a00')
265
        log_msg = add_extra_to_log_message('Manual cleanup element', extra=extra)
266
        mocked_logger = mocked_get_logger.return_value
267
268 View Code Duplication
        with patch('uuid.uuid4') as mocked_uuid4:
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
269
            mocked_uuid4.side_effect = (uuid.UUID('36446dc3-ae7c-42ad-ae4e-6a826dcf0a%02d' % x) for x in range(100))
270
            deferred_manual_cleanup(['crash', 'Symbols'], limit_size=1)
271
        self.assertEqual(mocked_logger.info.call_count, 11)
272
        mocked_logger.info.assert_any_call(log_extra_msg)
273
        mocked_logger.info.assert_any_call(log_msg)
274
275
    @freeze_time("2012-12-21 12:00:00")
276
    @patch('logging.getLogger')
277
    @is_private()
278
    def test_omaha_versions(self, mocked_get_logger):
279
        gpm['Version__limit_size'] = 1
280
        version_size = 1000*1024*1023
281
        versions = VersionFactory.create_batch(2, file_size=version_size)
282
        deleted_version = versions[0]
283
        self.assertEqual(Version.objects.count(), 2)
284
285
        extra_meta = dict(count=1, reason='manual', meta=True, log_id='36446dc3-ae7c-42ad-ae4e-6a826dcf0a00',
286
                          model='Version', limit_duplicated=None, limit_size=1, limit_days=None, size='999.0 MB')
287
        log_extra_msg = add_extra_to_log_message('Manual cleanup', extra=extra_meta)
288
289
        extra = dict(Version_id=deleted_version.id, element_created=deleted_version.created.strftime("%d. %B %Y %I:%M%p"),
290
                     log_id='36446dc3-ae7c-42ad-ae4e-6a826dcf0a00')
291
        log_msg = add_extra_to_log_message('Manual cleanup element', extra=extra)
292
        mocked_logger = mocked_get_logger.return_value
293
294 View Code Duplication
        with patch('uuid.uuid4') as mocked_uuid4:
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
295
            mocked_uuid4.side_effect = (uuid.UUID('36446dc3-ae7c-42ad-ae4e-6a826dcf0a%02d' % x) for x in range(100))
296
            deferred_manual_cleanup(['omaha', 'Version'], limit_size=1)
297
        self.assertEqual(mocked_logger.info.call_count, 2)
298
        mocked_logger.info.assert_any_call(log_extra_msg)
299
        mocked_logger.info.assert_any_call(log_msg)
300
301
    @freeze_time("2012-12-21 12:00:00")
302
    @patch('logging.getLogger')
303
    @is_private()
304
    def test_sparkle_versions(self, mocked_get_logger):
305
        gpm['SparkleVersion__limit_size'] = 1
306
        version_size = 1000*1024*1023
307
        versions = SparkleVersionFactory.create_batch(2, file_size=version_size)
308
        deleted_version = versions[0]
309
        self.assertEqual(SparkleVersion.objects.count(), 2)
310
311
        extra_meta = dict(count=1, reason='manual', meta=True, log_id='36446dc3-ae7c-42ad-ae4e-6a826dcf0a00',
312
                          model='SparkleVersion', limit_duplicated=None, limit_size=1, limit_days=None, size='999.0 MB')
313
        log_extra_msg = add_extra_to_log_message('Manual cleanup', extra=extra_meta)
314
315
        extra = dict(SparkleVersion_id=deleted_version.id, element_created=deleted_version.created.strftime("%d. %B %Y %I:%M%p"),
316
                     log_id='36446dc3-ae7c-42ad-ae4e-6a826dcf0a00')
317
        log_msg = add_extra_to_log_message('Manual cleanup element', extra=extra)
318
        mocked_logger = mocked_get_logger.return_value
319
320
        with patch('uuid.uuid4') as mocked_uuid4:
321
            mocked_uuid4.side_effect = (uuid.UUID('36446dc3-ae7c-42ad-ae4e-6a826dcf0a%02d' % x) for x in range(100))
322
            deferred_manual_cleanup(['sparkle', 'SparkleVersion'], limit_size=1)
323
        self.assertEqual(mocked_logger.info.call_count, 2)
324
        mocked_logger.info.assert_any_call(log_extra_msg)
325
        mocked_logger.info.assert_any_call(log_msg)
326
327
328
class DeleteDanglingTest(TestCase):
329
330 View Code Duplication
    @patch('omaha.limitation.raven.captureMessage')
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
331
    @patch('logging.getLogger')
332
    @patch('omaha.tasks.handle_dangling_files')
333
    def test_dangling_delete_db(self, mock_obj, mocked_get_logger, mocked_raven):
334
        mocked_logger = mocked_get_logger.return_value
335
        mock_obj.return_value = {
336
            'mark': 'db',
337
            'status': 'Send notifications',
338
            'data': [],
339
            'count': 0,
340
            'cleaned_space': 0
341
        }
342
        auto_delete_dangling_files()
343
        self.assertEqual(mocked_logger.info.call_count, 5)
344
        self.assertEqual(mocked_raven.call_count, 5)
345
        log_msg = 'Dangling files detected in db [%d], files path: %s' % (
346
            mock_obj.return_value['count'], mock_obj.return_value['data']
347
        )
348
        mocked_logger.info.assert_any_call(log_msg)
349
350 View Code Duplication
    @patch('omaha.limitation.raven.captureMessage')
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
351
    @patch('logging.getLogger')
352
    @patch('omaha.tasks.handle_dangling_files')
353
    def test_dangling_delete_s3(self, mock_obj, mocked_get_logger, mocked_get_raven):
354
        mocked_logger = mocked_get_logger.return_value
355
        file_path = os.path.abspath('crash/tests/testdata/7b05e196-7e23-416b-bd13-99287924e214.dmp')
356
        mock_obj.return_value = {
357
            'mark': 's3',
358
            'status': 'Delete files',
359
            'data': ['minidump_archive%s' % file_path],
360
            'count': 1,
361
            'cleaned_space': 100
362
        }
363
        auto_delete_dangling_files()
364
        self.assertEqual(mocked_logger.info.call_count, 5)
365
        self.assertEqual(mocked_get_raven.call_count, 5)
366
        log_msg = 'Dangling files deleted from s3 [%d], files path: %s' % (
367
            mock_obj.return_value['count'], mock_obj.return_value['data']
368
        )
369
        mocked_logger.info.assert_any_call(log_msg)
370