Completed
Pull Request — master (#260)
by Kirill
01:25
created

test_updatecheck_positive_critical()   B

Complexity

Conditions 2

Size

Total Lines 46

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 2
c 1
b 0
f 0
dl 0
loc 46
rs 8.9411
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
from datetime import datetime, timedelta
22
23
from django.test import TestCase
24
from django.test.client import Client
25
from django.core.urlresolvers import reverse
26
from django.core.files.uploadedfile import SimpleUploadedFile
27
from django.db.models import signals
28
29
from xmlunittest import XmlTestMixin
30
from freezegun import freeze_time
31
from mock import patch
32
from bitmapist import DayEvents
33
import factory
34
35
from omaha.tests import fixtures
36
from omaha.tests.utils import temporary_media_root
37
38
from omaha.factories import ApplicationFactory, ChannelFactory, PlatformFactory, VersionFactory
39
from omaha.models import Action, Request, EVENT_DICT_CHOICES, Data, NAME_DATA_DICT_CHOICES
40
from omaha.utils import redis, get_id
41
42
class UpdateViewTest(TestCase, XmlTestMixin):
43
    def setUp(self):
44
        self.client = Client()
45
        redis.flushdb()
46
47
    def tearDown(self):
48
        redis.flushdb()
49
50
    @freeze_time('2014-01-01 15:41:48')  # 56508 sec
51
    def test_updatecheck_negative(self):
52
        response = self.client.post(reverse('update'),
53
                                    fixtures.request_update_check, content_type='text/xml')
54
55
        self.assertEqual(response.status_code, 200)
56
57
        self.assertXmlDocument(response.content)
58
        self.assertXmlEquivalentOutputs(response.content,
59
                                        fixtures.response_update_check_negative)
60
61
    @freeze_time('2014-01-01 15:41:48')  # 56508 sec
62
    @temporary_media_root(MEDIA_URL='http://cache.pack.google.com/edgedl/chrome/install/782.112/')
63
    @patch('omaha.models.version_upload_to', lambda o, f: f)
64
    def test_updatecheck_positive(self):
65
        app = ApplicationFactory.create(id='{D0AB2EBC-931B-4013-9FEB-C9C4C2225C8C}', name='chrome')
66
        platform = PlatformFactory.create(name='win')
67
        channel = ChannelFactory.create(name='stable')
68
        obj = VersionFactory.create(
69
            app=app,
70
            platform=platform,
71
            channel=channel,
72
            version='13.0.782.112',
73
            file=SimpleUploadedFile('./chrome_installer.exe', b'_' * 23963192),
74
            file_size=23963192)
75
        obj.file_hash = 'VXriGUVI0TNqfLlU02vBel4Q3Zo='
76
        obj.save()
77
78
        Action.objects.create(
79
            version=obj,
80
            arguments='--do-not-launch-chrome',
81
            event=EVENT_DICT_CHOICES['install'],
82
            run='chrome_installer.exe'
83
        )
84
85
        Action.objects.create(
86
            version=obj,
87
            event=EVENT_DICT_CHOICES['postinstall'],
88
            other=dict(
89
                version='13.0.782.112',
90
                onsuccess='exitsilentlyonlaunchcmd',
91
            )
92
        )
93
94
        response = self.client.post(reverse('update'),
95
                                    fixtures.request_update_check, content_type='text/xml')
96
97
        self.assertEqual(response.status_code, 200)
98
99
        self.assertXmlDocument(response.content)
100
        self.assertXmlEquivalentOutputs(response.content,
101
                                        fixtures.response_update_check_positive)
102
103
104
    @freeze_time('2014-01-01 15:41:48')  # 56508 sec
105
    @temporary_media_root(MEDIA_URL='http://cache.pack.google.com/edgedl/chrome/install/782.112/')
106
    @patch('omaha.models.version_upload_to', lambda o, f: f)
107
    def test_updatecheck_positive_critical(self):
108
        app = ApplicationFactory.create(id='{D0AB2EBC-931B-4013-9FEB-C9C4C2225C8C}', name='chrome')
109
        platform = PlatformFactory.create(name='win')
110
        channel = ChannelFactory.create(name='stable')
111
        first_version = VersionFactory.create(
112
            app=app,
113
            platform=platform,
114
            channel=channel,
115
            version='13.0.782.110',
116
            file=SimpleUploadedFile('./chrome_installer_first.exe', b'_' * 23963192),
117
            file_size=23963192)
118
        first_version.file_hash = 'VXriGUVI0TNqfLlU02vBel4Q3Zo='
119
        first_version.save()
120
121
        critical_version = VersionFactory.create(
122
            is_critical=True,
123
            app=app,
124
            platform=platform,
125
            channel=channel,
126
            version='13.0.782.111',
127
            file=SimpleUploadedFile('./chrome_installer_critical.exe', b'_' * 23963192),
128
            file_size=23963192)
129
        critical_version.file_hash = 'VXriGUVI0TNqfLlU02vBel4Q3Zo='
130
        critical_version.save()
131
132
        last_version = VersionFactory.create(
133
            app=app,
134
            platform=platform,
135
            channel=channel,
136
            version='13.0.782.112',
137
            file=SimpleUploadedFile('./chrome_installer.exe', b'_' * 23963192),
138
            file_size=23963192)
139
        last_version.file_hash = 'VXriGUVI0TNqfLlU02vBel4Q3Zo='
140
        last_version.save()
141
142
        response = self.client.post(reverse('update'),
143
                                    fixtures.request_update_check, content_type='text/xml')
144
145
        self.assertEqual(response.status_code, 200)
146
147
        self.assertXmlDocument(response.content)
148
        self.assertXmlEquivalentOutputs(response.content,
149
                                        fixtures.response_update_check_postitive_critical)
150
151
152
153
    @temporary_media_root(MEDIA_URL='http://cache.pack.google.com/edgedl/chrome/install/782.112/')
154
    @patch('omaha.models.version_upload_to', lambda o, f: f)
155
    def test_userid_counting(self):
156
        now = datetime.utcnow()
157
        userid = '{D0BBD725-742D-44ae-8D46-0231E881D58E}'
158
        user_id = get_id(userid)
159
        appid1 = '{430FD4D0-B729-4F61-AA34-91526481799D}'
160
        appid2 = '{D0AB2EBC-931B-4013-9FEB-C9C4C2225C8C}'
161
        install_date = datetime(year=2014, month=1, day=1, hour=15, minute=41, second=48)
162
        update_date = install_date + timedelta(days=31)
163
164
        request_events = DayEvents('request', install_date.year, install_date.month, install_date.day)
165
        app1_install_events = DayEvents('new_install:%s' % appid1, install_date.year, install_date.month, install_date.day)
166
        app2_install_events = DayEvents('new_install:%s' % appid2, install_date.year, install_date.month, install_date.day)
167
        app1_update_events = DayEvents('request:%s' % appid1, update_date.year, update_date.month, update_date.day)
168
        app2_update_events = DayEvents('request:%s' % appid2, update_date.year, update_date.month, update_date.day)
169
170
        self.assertEqual(len(request_events), 0)
171
        self.assertEqual(len(app1_install_events), 0)
172
        self.assertEqual(len(app2_install_events), 0)
173
174
        app = ApplicationFactory.create(id='{D0AB2EBC-931B-4013-9FEB-C9C4C2225C8C}', name='chrome')
175
        platform = PlatformFactory.create(name='win')
176
        channel = ChannelFactory.create(name='stable')
177
        obj = VersionFactory.create(
178
            app=app,
179
            platform=platform,
180
            channel=channel,
181
            version='13.0.782.112',
182
            file=SimpleUploadedFile('./chrome_installer.exe', b'_' * 23963192))
183
        obj.file_hash = 'VXriGUVI0TNqfLlU02vBel4Q3Zo='
184
        obj.save()
185
186
        Action.objects.create(
187
            version=obj,
188
            arguments='--do-not-launch-chrome',
189
            event=EVENT_DICT_CHOICES['install'],
190
            run='chrome_installer.exe'
191
        )
192
193
        Action.objects.create(
194
            version=obj,
195
            event=EVENT_DICT_CHOICES['postinstall'],
196
            other=dict(
197
                version='13.0.782.112',
198
                onsuccess='exitsilentlyonlaunchcmd',
199
            )
200
        )
201
202
        with freeze_time(install_date):  # 56508 sec
203
            self.client.post(reverse('update'),
204
                             fixtures.request_update_check, content_type='text/xml')
205
            self.client.post(reverse('update'),
206
                             fixtures.request_event_install_success, content_type='text/xml')
207
208
        self.assertEqual(len(request_events), 1)
209
        self.assertEqual(len(app1_install_events), 0)
210
        self.assertEqual(len(app2_install_events), 1)
211
        self.assertEqual(len(app1_update_events), 0)
212
        self.assertEqual(len(app2_update_events), 0)
213
        self.assertTrue(user_id in request_events)
214
        self.assertFalse(user_id in app1_install_events)
215
        self.assertTrue(user_id in app2_install_events)
216
217
        with freeze_time(update_date):
218
            self.client.post(reverse('update'),
219
                             fixtures.request_update_check, content_type='text/xml')
220
221
        self.assertEqual(len(app1_update_events), 0)
222
        self.assertEqual(len(app2_update_events), 1)
223
        self.assertFalse(user_id in app1_update_events)
224
        self.assertTrue(user_id in app2_update_events)
225
226
    @freeze_time('2014-01-01 15:45:54')  # 56754 sec
227
    def test_event(self):
228
        response = self.client.post(reverse('update'),
229
                                    fixtures.request_event,
230
                                    REMOTE_ADDR="8.8.8.8",
231
                                    content_type='text/xml')
232
233
        self.assertEqual(response.status_code, 200)
234
235
        self.assertXmlDocument(response.content)
236
        self.assertXmlEquivalentOutputs(response.content,
237
                                        fixtures.response_event)
238
239
        request = Request.objects.get()
240
        self.assertEqual(request.ip, '8.8.8.8')
241
242
    @freeze_time('2014-01-01 15:45:54')  # 56754 sec
243
    @temporary_media_root(MEDIA_URL='http://cache.pack.google.com/edgedl/chrome/install/782.112/')
244
    @patch('omaha.models.version_upload_to', lambda o, f: f)
245
    def test_data(self):
246
        app = ApplicationFactory.create(id='{430FD4D0-B729-4F61-AA34-91526481799D}', name='chrome')
247
        platform = PlatformFactory.create(name='win')
248
        channel = ChannelFactory.create(name='stable')
249
        obj = VersionFactory.create(
250
            app=app,
251
            platform=platform,
252
            channel=channel,
253
            version='13.0.782.112',
254
            file=SimpleUploadedFile('./chrome_installer.exe', b'_' * 23963192),
255
            file_size=23963192)
256
        obj.file_hash = 'VXriGUVI0TNqfLlU02vBel4Q3Zo='
257
        obj.save()
258
259
        Data.objects.create(
260
            app=app,
261
            name=NAME_DATA_DICT_CHOICES['install'],
262
            index='verboselogging',
263
            value='app-specific values here')
264
265
        Data.objects.create(
266
            app=app,
267
            name=NAME_DATA_DICT_CHOICES['untrusted'])
268
269
        response = self.client.post(reverse('update'),
270
                                    fixtures.request_data, content_type='text/xml')
271
272
        self.assertEqual(response.status_code, 200)
273
274
        self.assertXmlDocument(response.content)
275
        self.assertXmlEquivalentOutputs(response.content,
276
                                        fixtures.response_data)
277
278
    def test_bad_request(self):
279
        response = self.client.post(reverse('update'))
280
281
        msg = b"""<?xml version="1.0" encoding="utf-8"?>
282
<data>
283
    <message>
284
        Bad Request
285
    </message>
286
</data>"""
287
        self.assertEqual(response.status_code, 400)
288
        self.assertEqual(response.content, msg)
289