Binary builds: Fix Qt TLS backends not included. Fixes #1981887 [Include SSL dlls in Calibre 6?](https://bugs.launchpad.net/calibre/+bug/1981887)

This commit is contained in:
Kovid Goyal 2022-07-17 08:55:39 +05:30
parent a4d8095496
commit dd69957517
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
2 changed files with 33 additions and 17 deletions

View File

@ -56,6 +56,7 @@ QT_DLLS = frozenset(
QT_PLUGINS = [ QT_PLUGINS = [
'imageformats', 'imageformats',
'iconengines', 'iconengines',
'tls',
# 'mediaservice', # 'mediaservice',
'platforms', 'platforms',
# 'playlistformats', # 'playlistformats',

View File

@ -9,9 +9,15 @@ __docformat__ = 'restructuredtext en'
Test a binary calibre build to ensure that all needed binary images/libraries have loaded. Test a binary calibre build to ensure that all needed binary images/libraries have loaded.
''' '''
import os, ctypes, sys, unittest, time, shutil, builtins import builtins
import ctypes
import os
import shutil
import sys
import time
import unittest
from calibre.constants import iswindows, islinux, ismacos, plugins_loc from calibre.constants import islinux, ismacos, iswindows, plugins_loc
from polyglot.builtins import iteritems from polyglot.builtins import iteritems
is_ci = os.environ.get('CI', '').lower() == 'true' is_ci = os.environ.get('CI', '').lower() == 'true'
@ -98,7 +104,8 @@ class BuildTest(unittest.TestCase):
parse('<p>xxx') parse('<p>xxx')
def test_bs4(self): def test_bs4(self):
import soupsieve, bs4 import bs4
import soupsieve
del soupsieve, bs4 del soupsieve, bs4
@unittest.skipUnless(islinux, 'Speech dispatcher only used on Linux') @unittest.skipUnless(islinux, 'Speech dispatcher only used on Linux')
@ -107,7 +114,9 @@ class BuildTest(unittest.TestCase):
del SSIPClient del SSIPClient
def test_zeroconf(self): def test_zeroconf(self):
import zeroconf as z, ifaddr import ifaddr
import zeroconf as z
from calibre.devices.smart_device_app.driver import monkeypatch_zeroconf from calibre.devices.smart_device_app.driver import monkeypatch_zeroconf
monkeypatch_zeroconf() monkeypatch_zeroconf()
del z del z
@ -143,8 +152,8 @@ class BuildTest(unittest.TestCase):
create_key_pair() create_key_pair()
def test_msgpack(self): def test_msgpack(self):
from calibre.utils.serialize import msgpack_dumps, msgpack_loads
from calibre.utils.date import utcnow from calibre.utils.date import utcnow
from calibre.utils.serialize import msgpack_dumps, msgpack_loads
for obj in ({1:1}, utcnow()): for obj in ({1:1}, utcnow()):
s = msgpack_dumps(obj) s = msgpack_dumps(obj)
self.assertEqual(obj, msgpack_loads(s)) self.assertEqual(obj, msgpack_loads(s))
@ -161,6 +170,7 @@ class BuildTest(unittest.TestCase):
@unittest.skipUnless(iswindows, 'winutil is windows only') @unittest.skipUnless(iswindows, 'winutil is windows only')
def test_winutil(self): def test_winutil(self):
import tempfile import tempfile
from calibre import strftime from calibre import strftime
from calibre_extensions import winutil from calibre_extensions import winutil
self.assertEqual(winutil.special_folder_path(winutil.CSIDL_APPDATA), winutil.known_folder_path(winutil.FOLDERID_RoamingAppData)) self.assertEqual(winutil.special_folder_path(winutil.CSIDL_APPDATA), winutil.known_folder_path(winutil.FOLDERID_RoamingAppData))
@ -242,7 +252,7 @@ class BuildTest(unittest.TestCase):
dh = winutil.create_file( dh = winutil.create_file(
dpath, winutil.FILE_LIST_DIRECTORY, winutil.FILE_SHARE_READ, winutil.OPEN_EXISTING, winutil.FILE_FLAG_BACKUP_SEMANTICS, dpath, winutil.FILE_LIST_DIRECTORY, winutil.FILE_SHARE_READ, winutil.OPEN_EXISTING, winutil.FILE_FLAG_BACKUP_SEMANTICS,
) )
from threading import Thread, Event from threading import Event, Thread
started = Event() started = Event()
events = [] events = []
@ -293,12 +303,13 @@ class BuildTest(unittest.TestCase):
def test_qt(self): def test_qt(self):
if is_sanitized: if is_sanitized:
raise unittest.SkipTest('Skipping Qt build test as sanitizer is enabled') raise unittest.SkipTest('Skipping Qt build test as sanitizer is enabled')
from qt.core import QTimer from qt.core import (
from qt.core import QApplication QApplication, QFontDatabase, QImageReader, QNetworkAccessManager, QTimer, QSslSocket
)
from qt.webengine import QWebEnginePage from qt.webengine import QWebEnginePage
from qt.core import QImageReader, QFontDatabase
from qt.core import QNetworkAccessManager
from calibre.utils.img import image_from_data, image_to_data, test from calibre.utils.img import image_from_data, image_to_data, test
# Ensure that images can be read before QApplication is constructed. # Ensure that images can be read before QApplication is constructed.
# Note that this requires QCoreApplication.libraryPaths() to return the # Note that this requires QCoreApplication.libraryPaths() to return the
# path to the Qt plugins which it always does in the frozen build, # path to the Qt plugins which it always does in the frozen build,
@ -318,7 +329,7 @@ class BuildTest(unittest.TestCase):
# Run the imaging tests # Run the imaging tests
test() test()
from calibre.gui2 import ensure_app, destroy_app from calibre.gui2 import destroy_app, ensure_app
from calibre.utils.webengine import setup_profile from calibre.utils.webengine import setup_profile
display_env_var = os.environ.pop('DISPLAY', None) display_env_var = os.environ.pop('DISPLAY', None)
try: try:
@ -332,6 +343,7 @@ class BuildTest(unittest.TestCase):
create_cover('xxx', ['yyy']) create_cover('xxx', ['yyy'])
na = QNetworkAccessManager() na = QNetworkAccessManager()
self.assertTrue(hasattr(na, 'sslErrors'), 'Qt not compiled with openssl') self.assertTrue(hasattr(na, 'sslErrors'), 'Qt not compiled with openssl')
self.assertTrue(QSslSocket.availableBackends(), 'Qt tls plugins missings')
p = QWebEnginePage() p = QWebEnginePage()
setup_profile(p.profile()) setup_profile(p.profile())
@ -370,10 +382,12 @@ class BuildTest(unittest.TestCase):
def test_imaging(self): def test_imaging(self):
from PIL import Image from PIL import Image
try: try:
import _imaging, _imagingmath, _imagingft import _imaging
import _imagingft
import _imagingmath
_imaging, _imagingmath, _imagingft _imaging, _imagingmath, _imagingft
except ImportError: except ImportError:
from PIL import _imaging, _imagingmath, _imagingft from PIL import _imaging, _imagingft, _imagingmath
_imaging, _imagingmath, _imagingft _imaging, _imagingmath, _imagingft
i = Image.open(I('lt.png', allow_user_override=False)) i = Image.open(I('lt.png', allow_user_override=False))
self.assertGreaterEqual(i.size, (20, 20)) self.assertGreaterEqual(i.size, (20, 20))
@ -409,8 +423,8 @@ class BuildTest(unittest.TestCase):
@unittest.skipUnless(getattr(sys, 'frozen', False), 'Only makes sense to test executables in frozen builds') @unittest.skipUnless(getattr(sys, 'frozen', False), 'Only makes sense to test executables in frozen builds')
def test_executables(self): def test_executables(self):
from calibre.utils.ipc.launch import Worker
from calibre.ebooks.pdf.pdftohtml import PDFTOHTML, PDFTOTEXT from calibre.ebooks.pdf.pdftohtml import PDFTOHTML, PDFTOTEXT
from calibre.utils.ipc.launch import Worker
w = Worker({}) w = Worker({})
self.assertTrue(os.path.exists(w.executable), 'calibre-parallel (%s) does not exist' % w.executable) self.assertTrue(os.path.exists(w.executable), 'calibre-parallel (%s) does not exist' % w.executable)
self.assertTrue(os.path.exists(w.gui_executable), 'calibre-parallel-gui (%s) does not exist' % w.gui_executable) self.assertTrue(os.path.exists(w.gui_executable), 'calibre-parallel-gui (%s) does not exist' % w.gui_executable)
@ -442,18 +456,19 @@ class BuildTest(unittest.TestCase):
del html2text del html2text
def test_markdown(self): def test_markdown(self):
from calibre.ebooks.txt.processor import create_markdown_object
from calibre.ebooks.conversion.plugins.txt_input import MD_EXTENSIONS from calibre.ebooks.conversion.plugins.txt_input import MD_EXTENSIONS
from calibre.ebooks.txt.processor import create_markdown_object
create_markdown_object(sorted(MD_EXTENSIONS)) create_markdown_object(sorted(MD_EXTENSIONS))
from calibre.library.comments import sanitize_comments_html from calibre.library.comments import sanitize_comments_html
sanitize_comments_html(b'''<script>moo</script>xxx<img src="http://moo.com/x.jpg">''') sanitize_comments_html(b'''<script>moo</script>xxx<img src="http://moo.com/x.jpg">''')
def test_feedparser(self): def test_feedparser(self):
from calibre.web.feeds.feedparser import parse
# sgmllib is needed for feedparser parsing malformed feeds # sgmllib is needed for feedparser parsing malformed feeds
# on python3 you can get it by taking it from python2 stdlib and # on python3 you can get it by taking it from python2 stdlib and
# running 2to3 on it # running 2to3 on it
import sgmllib import sgmllib
from calibre.web.feeds.feedparser import parse
sgmllib, parse sgmllib, parse
def test_openssl(self): def test_openssl(self):
@ -466,7 +481,7 @@ class BuildTest(unittest.TestCase):
def test_multiprocessing(): def test_multiprocessing():
from multiprocessing import get_context, get_all_start_methods from multiprocessing import get_all_start_methods, get_context
for stype in get_all_start_methods(): for stype in get_all_start_methods():
if stype == 'fork': if stype == 'fork':
continue continue