FreeCAD

Форк
0
/
test_workers_startup.py 
200 строк · 8.5 Кб
1
# SPDX-License-Identifier: LGPL-2.1-or-later
2
# ***************************************************************************
3
# *                                                                         *
4
# *   Copyright (c) 2022-2023 FreeCAD Project Association                   *
5
# *                                                                         *
6
# *   This file is part of FreeCAD.                                         *
7
# *                                                                         *
8
# *   FreeCAD is free software: you can redistribute it and/or modify it    *
9
# *   under the terms of the GNU Lesser General Public License as           *
10
# *   published by the Free Software Foundation, either version 2.1 of the  *
11
# *   License, or (at your option) any later version.                       *
12
# *                                                                         *
13
# *   FreeCAD is distributed in the hope that it will be useful, but        *
14
# *   WITHOUT ANY WARRANTY; without even the implied warranty of            *
15
# *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      *
16
# *   Lesser General Public License for more details.                       *
17
# *                                                                         *
18
# *   You should have received a copy of the GNU Lesser General Public      *
19
# *   License along with FreeCAD. If not, see                               *
20
# *   <https://www.gnu.org/licenses/>.                                      *
21
# *                                                                         *
22
# ***************************************************************************
23

24
import json
25
import unittest
26
import os
27
import tempfile
28

29
import FreeCAD
30

31
from PySide import QtCore
32

33
import NetworkManager
34
from Addon import Addon
35
from addonmanager_workers_startup import (
36
    CreateAddonListWorker,
37
    LoadPackagesFromCacheWorker,
38
    LoadMacrosFromCacheWorker,
39
)
40

41
run_slow_tests = False
42

43

44
class TestWorkersStartup(unittest.TestCase):
45

46
    MODULE = "test_workers_startup"  # file name without extension
47

48
    @unittest.skipUnless(run_slow_tests, "This integration test is slow and uses the network")
49
    def setUp(self):
50
        """Set up the test"""
51
        self.test_dir = os.path.join(
52
            FreeCAD.getHomePath(), "Mod", "AddonManager", "AddonManagerTest", "data"
53
        )
54

55
        self.saved_mod_directory = Addon.mod_directory
56
        self.saved_cache_directory = Addon.cache_directory
57
        Addon.mod_directory = os.path.join(tempfile.gettempdir(), "FreeCADTesting", "Mod")
58
        Addon.cache_directory = os.path.join(tempfile.gettempdir(), "FreeCADTesting", "Cache")
59

60
        os.makedirs(Addon.mod_directory, mode=0o777, exist_ok=True)
61
        os.makedirs(Addon.cache_directory, mode=0o777, exist_ok=True)
62

63
        url = "https://api.github.com/zen"
64
        NetworkManager.InitializeNetworkManager()
65
        result = NetworkManager.AM_NETWORK_MANAGER.blocking_get(url)
66
        if result is None:
67
            self.skipTest("No active internet connection detected")
68

69
        self.addon_list = []
70
        self.macro_counter = 0
71
        self.workbench_counter = 0
72
        self.prefpack_counter = 0
73
        self.addon_from_cache_counter = 0
74
        self.macro_from_cache_counter = 0
75

76
        self.package_cache = {}
77
        self.macro_cache = []
78

79
        self.package_cache_filename = os.path.join(Addon.cache_directory, "packages.json")
80
        self.macro_cache_filename = os.path.join(Addon.cache_directory, "macros.json")
81

82
        # Store the user's preference for whether git is enabled or disabled
83
        pref = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Addons")
84
        self.saved_git_disabled_status = pref.GetBool("disableGit", False)
85

86
    def tearDown(self):
87
        """Tear down the test"""
88
        Addon.mod_directory = self.saved_mod_directory
89
        Addon.cache_directory = self.saved_cache_directory
90
        pref = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Addons")
91
        pref.SetBool("disableGit", self.saved_git_disabled_status)
92

93
    def test_create_addon_list_worker(self):
94
        """Test whether any addons are added: runs the full query, so this potentially is a SLOW
95
        test."""
96
        worker = CreateAddonListWorker()
97
        worker.addon_repo.connect(self._addon_added)
98
        worker.start()
99
        while worker.isRunning():
100
            QtCore.QCoreApplication.processEvents(QtCore.QEventLoop.AllEvents, 50)
101
        QtCore.QCoreApplication.processEvents(QtCore.QEventLoop.AllEvents)
102

103
        self.assertGreater(self.macro_counter, 0, "No macros returned")
104
        self.assertGreater(self.workbench_counter, 0, "No workbenches returned")
105

106
        # Make sure there are no duplicates:
107
        addon_name_set = set()
108
        for addon in self.addon_list:
109
            addon_name_set.add(addon.name)
110
        self.assertEqual(
111
            len(addon_name_set), len(self.addon_list), "Duplicate names are not allowed"
112
        )
113

114
        # Write the cache data
115
        if hasattr(self, "package_cache"):
116
            with open(self.package_cache_filename, "w", encoding="utf-8") as f:
117
                f.write(json.dumps(self.package_cache, indent="  "))
118
        if hasattr(self, "macro_cache"):
119
            with open(self.macro_cache_filename, "w", encoding="utf-8") as f:
120
                f.write(json.dumps(self.macro_cache, indent="  "))
121

122
        original_macro_counter = self.macro_counter
123
        original_addon_list = self.addon_list.copy()
124
        self.macro_counter = 0
125
        self.workbench_counter = 0
126
        self.addon_list.clear()
127

128
        # Now try loading the same data from the cache we just created
129
        worker = LoadPackagesFromCacheWorker(self.package_cache_filename)
130
        worker.override_metadata_cache_path(os.path.join(Addon.cache_directory, "PackageMetadata"))
131
        worker.addon_repo.connect(self._addon_added)
132

133
        worker.start()
134
        while worker.isRunning():
135
            QtCore.QCoreApplication.processEvents(QtCore.QEventLoop.AllEvents, 50)
136
        QtCore.QCoreApplication.processEvents(QtCore.QEventLoop.AllEvents)
137

138
        worker = LoadMacrosFromCacheWorker(self.macro_cache_filename)
139
        worker.add_macro_signal.connect(self._addon_added)
140

141
        worker.start()
142
        while worker.isRunning():
143
            QtCore.QCoreApplication.processEvents(QtCore.QEventLoop.AllEvents, 50)
144
        QtCore.QCoreApplication.processEvents(QtCore.QEventLoop.AllEvents)
145

146
        # Make sure that every addon in the original list is also in the new list
147
        fail_counter = 0
148
        for original_addon in original_addon_list:
149
            found = False
150
            for addon in self.addon_list:
151
                if addon.name == original_addon.name:
152
                    found = True
153
                    break
154
            if not found:
155
                print(f"Failed to load {addon.name} from cache")
156
                fail_counter += 1
157
        self.assertEqual(fail_counter, 0)
158

159
        # Make sure there are no duplicates:
160
        addon_name_set.clear()
161
        for addon in self.addon_list:
162
            addon_name_set.add(addon.name)
163

164
        self.assertEqual(len(addon_name_set), len(self.addon_list))
165
        self.assertEqual(len(original_addon_list), len(self.addon_list))
166

167
        self.assertEqual(
168
            original_macro_counter,
169
            self.macro_counter,
170
            "Cache loaded a different number of macros",
171
        )
172
        # We can't check workbench and preference pack counting at this point, because that relies
173
        # on the package.xml metadata file, which this test does not download.
174

175
    def test_create_addon_list_git_disabled(self):
176
        """If the user has git enabled, also test the addon manager with git disabled"""
177
        if self.saved_git_disabled_status:
178
            self.skipTest("Git is disabled, this test is redundant")
179

180
        pref = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Addons")
181
        pref.SetBool("disableGit", True)
182

183
        self.test_create_addon_list_worker()
184

185
    def _addon_added(self, addon: Addon):
186
        """Callback for adding an Addon: tracks the list, and counts the various types"""
187
        print(f"Addon added: {addon.name}")
188
        self.addon_list.append(addon)
189
        if addon.contains_workbench():
190
            self.workbench_counter += 1
191
        if addon.contains_macro():
192
            self.macro_counter += 1
193
        if addon.contains_preference_pack():
194
            self.prefpack_counter += 1
195

196
        # Also record the information for cache purposes
197
        if addon.macro is None:
198
            self.package_cache[addon.name] = addon.to_cache()
199
        else:
200
            self.macro_cache.append(addon.macro.to_cache())
201

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.