Completed
Push — master ( 8d80e2...82fff3 )
by
unknown
45s
created

CrashModelTest.tearDown()   A

Complexity

Conditions 1

Size

Total Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
c 0
b 0
f 0
dl 0
loc 3
rs 10
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
23
from django import test
24
from django.core.files.uploadedfile import SimpleUploadedFile
25
from django.core.files.storage import DefaultStorage
26
27
from clom.shell import CommandError
28
from mock import patch
29
from freezegun import freeze_time
30
31
from crash.models import Crash
32
from crash.tasks import processing_crash_dump, get_sentry_link
33
from omaha.tests.utils import temporary_media_root
34
35
36
BASE_DIR = os.path.dirname(__file__)
37
TEST_DATA_DIR = os.path.join(BASE_DIR, 'testdata')
38
SYM_FILE = os.path.join(TEST_DATA_DIR, 'BreakpadTestApp.sym')
39
CRASH_DUMP_FILE = os.path.join(TEST_DATA_DIR, '7b05e196-7e23-416b-bd13-99287924e214.dmp')
40
INCORRECT_CRASH_DUMP_FILE = os.path.join(TEST_DATA_DIR, 'incorrect_minidump.dmp')
41
SYMBOLS_PATH = os.path.join(TEST_DATA_DIR, 'symbols')
42
STACKTRACE_PATH = os.path.join(TEST_DATA_DIR, 'stacktrace.txt')
43
44
45
class CrashModelTest(test.TestCase):
46
    def setUp(self):
47
        self._file_field = Crash._meta.get_field_by_name('upload_file_minidump')[0]
48
        self._archive_field = Crash._meta.get_field_by_name('archive')[0]
49
        self._default_storage = self._file_field.storage
50
        test_storage = DefaultStorage()
51
        self._file_field.storage = test_storage
52
        self._archive_field.storage = test_storage
53
54
    def tearDown(self):
55
        self._file_field.storage = self._default_storage
56
        self._archive_field.storage = self._default_storage
57
58
    @temporary_media_root(
59
        MEDIA_URL='http://omaha-test.s3.amazonaws.com/',
60
        CRASH_S3_MOUNT_PATH=TEST_DATA_DIR,
61
        CRASH_SYMBOLS_PATH=SYMBOLS_PATH,
62
    )
63
    @test.override_settings(CELERY_EAGER_PROPAGATES_EXCEPTIONS=False,)
64
    @freeze_time("2014-12-11")
65
    @patch('crash.utils.send_stacktrace_sentry')
66
    @patch('crash.utils.client')
67
    @patch('uuid.uuid4', lambda: '92d51f8b-f67a-4d80-ac7f-9ab8018297d9')
68
    def test_model(self, mock_send_stacktrace_sentry, mock_client):
69
        meta = dict(
70
            lang='en',
71
            ver='1.0.0.1',
72
            channel='alpha'
73
        )
74
        app_id = '{D0AB2EBC-931B-4013-9FEB-C9C4C2225C8C}'
75
        user_id = '{2882CF9B-D9C2-4edb-9AAF-8ED5FCF366F7}'
76
        with open(CRASH_DUMP_FILE, 'rb') as f:
77
            obj = Crash.objects.create(
78
                appid=app_id,
79
                userid=user_id,
80
                upload_file_minidump=SimpleUploadedFile('7b05e196-7e23-416b-bd13-99287924e214.dmp', f.read()),
81
                meta=meta,
82
            )
83
84
        self.assertIsNone(obj.stacktrace)
85
        processing_crash_dump(obj.pk)
86
87
        with open(STACKTRACE_PATH, 'rb') as f:
88
            stacktrace = f.read()
89
90
        crash = Crash.objects.get(pk=obj.pk)
91
        self.assertEqual(crash.stacktrace, stacktrace.decode())
92
        self.assertIsNotNone(crash.stacktrace_json)
93
        self.assertEqual(crash.stacktrace_json['crash_info']['type'], 'EXCEPTION_ACCESS_VIOLATION_WRITE')
94
        self.assertEqual(crash.signature, 'crashedFunc()')
95
        self.assertEqual(crash.os, 'Windows NT')
96
        self.assertEqual(crash.build_number, '1.0.0.1')
97
        self.assertEqual(crash.channel, 'alpha')
98
99
    @temporary_media_root(
100
        MEDIA_URL='http://omaha-test.s3.amazonaws.com/',
101
        CRASH_S3_MOUNT_PATH=TEST_DATA_DIR,
102
        CRASH_SYMBOLS_PATH=SYMBOLS_PATH,
103
    )
104
    @freeze_time("2014-12-11")
105
    @patch('crash.utils.send_stacktrace_sentry')
106
    @patch('crash.utils.client')
107
    @patch('uuid.uuid4', lambda: '92d51f8b-f67a-4d80-ac7f-9ab8018297d9')
108
    def test_incorrect_dump(self, mock_send_stacktrace_sentry, mock_client):
109
        meta = dict(
110
            lang='en',
111
            ver='1.0.0.1',
112
        )
113
        app_id = '{D0AB2EBC-931B-4013-9FEB-C9C4C2225C8C}'
114
        user_id = '{2882CF9B-D9C2-4edb-9AAF-8ED5FCF366F7}'
115
        with open(INCORRECT_CRASH_DUMP_FILE, 'rb') as f:
116
            obj = dict(
117
                appid=app_id,
118
                userid=user_id,
119
                upload_file_minidump=SimpleUploadedFile('incorrect_minidump.dmp', f.read()),
120
                meta=meta,
121
            )
122
            self.assertRaises(CommandError, Crash.objects.create, **obj)
123
124
    @temporary_media_root(
125
        MEDIA_URL='http://omaha-test.s3.amazonaws.com/',
126
        CRASH_S3_MOUNT_PATH=TEST_DATA_DIR,
127
        CRASH_SYMBOLS_PATH=SYMBOLS_PATH,
128
    )
129
    @test.override_settings(CELERY_ALWAYS_EAGER=False,)
130
    @freeze_time("2014-12-11")
131
    @patch('crash.utils.send_stacktrace_sentry', lambda: None)
132
    @patch('crash.utils.client')
133
    @patch('uuid.uuid4', lambda: '92d51f8b-f67a-4d80-ac7f-9ab8018297d9')
134
    def test_get_sentry_link(self, mock_client):
135
        meta = dict(
136
            lang='en',
137
            ver='1.0.0.1',
138
        )
139
        app_id = '{D0AB2EBC-931B-4013-9FEB-C9C4C2225C8C}'
140
        user_id = '{2882CF9B-D9C2-4edb-9AAF-8ED5FCF366F7}'
141
        with open(CRASH_DUMP_FILE, 'rb') as f:
142
            obj = Crash.objects.create(
143
                appid=app_id,
144
                userid=user_id,
145
                upload_file_minidump=SimpleUploadedFile('7b05e196-7e23-416b-bd13-99287924e214.dmp', f.read()),
146
                meta=meta,
147
            )
148
        with patch('requests.get') as mocked:
149
            instance = mocked.return_value
150
            instance.json.return_value = {'groupID': '1', 'id': '2'}
151
            get_sentry_link(obj.pk, '123')
152
        obj = Crash.objects.get(id=obj.id)
153
        self.assertEqual(obj.eventid, '2')
154
        self.assertEqual(obj.groupid, '1')
155