Completed
Push — master ( 67eae9...f0f1ec )
by
unknown
01:23
created

UpdateViewTest.test_event()   A

Complexity

Conditions 1

Size

Total Lines 15

Duplication

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