blob: 6c1507faf324e2a796041fe07c85eaa60b129c6d [file] [log] [blame]
Jae Hoon Kimb3c8cab2021-11-10 14:57:53 -08001#!/usr/bin/env python3
Amin Hassani2aa34282020-11-18 01:18:19 +00002# -*- coding: utf-8 -*-
Mike Frysinger8b0fc372022-09-08 03:24:24 -04003# Copyright 2010 The ChromiumOS Authors
Amin Hassani2aa34282020-11-18 01:18:19 +00004# Use of this source code is governed by a BSD-style license that can be
5# found in the LICENSE file.
6
7"""Unit tests for autoupdate.py."""
8
9from __future__ import print_function
10
Amin Hassani2aa34282020-11-18 01:18:19 +000011import shutil
12import socket
13import tempfile
14import unittest
Jae Hoon Kimb3c8cab2021-11-10 14:57:53 -080015import unittest.mock as mock
Amin Hassani2aa34282020-11-18 01:18:19 +000016
17import autoupdate
Jack Rosenthal8de609d2023-02-09 13:20:35 -070018import cherrypy # pylint: disable=import-error
Amin Hassani2aa34282020-11-18 01:18:19 +000019import setup_chromite # pylint: disable=unused-import
Jack Rosenthal8de609d2023-02-09 13:20:35 -070020
Amin Hassani2aa34282020-11-18 01:18:19 +000021from chromite.lib.xbuddy import common_util
22from chromite.lib.xbuddy import xbuddy
23
24
25_TEST_REQUEST = """<?xml version="1.0" encoding="UTF-8"?>
26<request protocol="3.0" updater="ChromeOSUpdateEngine" updaterversion="0.1.0.0">
27 <app appid="test-appid" version="%(version)s" track="%(track)s"
28 board="%(board)s" hardware_class="%(hwclass)s">
29 <updatecheck />
30 </app>
31</request>"""
32
Jack Rosenthal8de609d2023-02-09 13:20:35 -070033
Amin Hassani2aa34282020-11-18 01:18:19 +000034class AutoupdateTest(unittest.TestCase):
Jack Rosenthal8de609d2023-02-09 13:20:35 -070035 """Tests for the autoupdate.Autoupdate class."""
Amin Hassani2aa34282020-11-18 01:18:19 +000036
Jack Rosenthal8de609d2023-02-09 13:20:35 -070037 def setUp(self):
38 self.port = 8080
39 self.test_board = "test-board"
40 self.build_root = tempfile.mkdtemp("autoupdate_build_root")
41 self.tempdir = tempfile.mkdtemp("tempdir")
42 self.latest_dir = "12345_af_12-a1"
43 self.latest_verision = "12345_af_12"
44 self.static_image_dir = tempfile.mkdtemp("autoupdate_static_dir")
45 self.hostname = "%s:%s" % (socket.gethostname(), self.port)
46 self.test_dict = {
47 "version": "ForcedUpdate",
48 "track": "test-channel",
49 "board": self.test_board,
50 "hwclass": "test-hardware-class",
51 }
52 self.test_data = _TEST_REQUEST % self.test_dict
53 self.payload = "My payload"
54 cherrypy.request.base = "http://%s" % self.hostname
55 common_util.MkDirP(self.static_image_dir)
56 self._xbuddy = xbuddy.XBuddy(False, static_dir=self.static_image_dir)
57 mock.patch.object(xbuddy.XBuddy, "_GetArtifact")
Amin Hassani2aa34282020-11-18 01:18:19 +000058
Jack Rosenthal8de609d2023-02-09 13:20:35 -070059 def tearDown(self):
60 shutil.rmtree(self.build_root)
61 shutil.rmtree(self.tempdir)
62 shutil.rmtree(self.static_image_dir)
Amin Hassani2aa34282020-11-18 01:18:19 +000063
Jack Rosenthal8de609d2023-02-09 13:20:35 -070064 def _DummyAutoupdateConstructor(self, **kwargs):
65 """Creates a dummy autoupdater. Used to avoid using constructor."""
66 dummy = autoupdate.Autoupdate(
67 self._xbuddy, static_dir=self.static_image_dir, **kwargs
68 )
69 return dummy
Amin Hassani2aa34282020-11-18 01:18:19 +000070
Jack Rosenthal8de609d2023-02-09 13:20:35 -070071 def testChangeUrlPort(self):
72 # pylint: disable=protected-access
73 r = autoupdate._ChangeUrlPort("http://fuzzy:8080/static", 8085)
74 self.assertEqual(r, "http://fuzzy:8085/static")
Amin Hassani2aa34282020-11-18 01:18:19 +000075
Jack Rosenthal8de609d2023-02-09 13:20:35 -070076 r = autoupdate._ChangeUrlPort("http://fuzzy/static", 8085)
77 self.assertEqual(r, "http://fuzzy:8085/static")
Amin Hassani2aa34282020-11-18 01:18:19 +000078
Jack Rosenthal8de609d2023-02-09 13:20:35 -070079 r = autoupdate._ChangeUrlPort("ftp://fuzzy/static", 8085)
80 self.assertEqual(r, "ftp://fuzzy:8085/static")
Amin Hassani2aa34282020-11-18 01:18:19 +000081
Jack Rosenthal8de609d2023-02-09 13:20:35 -070082 r = autoupdate._ChangeUrlPort("ftp://fuzzy", 8085)
83 self.assertEqual(r, "ftp://fuzzy:8085")
Amin Hassani2aa34282020-11-18 01:18:19 +000084
Jack Rosenthal8de609d2023-02-09 13:20:35 -070085 @mock.patch.object(autoupdate.Autoupdate, "GetBuildID")
86 def testHandleUpdatePing(self, get_build_id):
87 """Tests HandleUpdatePing"""
88 au_mock = self._DummyAutoupdateConstructor()
89 get_build_id.return_value = ""
90 request = """<?xml version="1.0" encoding="UTF-8"?>
Amin Hassani2aa34282020-11-18 01:18:19 +000091<request protocol="3.0">
92 <os version="Indy" platform="Chrome OS" sp="10323.52.0_x86_64"></os>
93 <app appid="platform" version="1.0.0" delta_okay="true"
94 track="stable-channel" board="eve">
95 <ping active="1" a="1" r="1"></ping>
96 <updatecheck targetversionprefix=""></updatecheck>
97 </app>
98</request>"""
99
Jack Rosenthal8de609d2023-02-09 13:20:35 -0700100 self.assertIn(
101 b'<updatecheck status="noupdate"', au_mock.HandleUpdatePing(request)
102 )
Amin Hassani2aa34282020-11-18 01:18:19 +0000103
Jack Rosenthal8de609d2023-02-09 13:20:35 -0700104
105if __name__ == "__main__":
106 unittest.main()