mirror of https://gitlab.com/openlp/openlp.git
Merge branch 'Remove-zero' into 'master'
Remove ZeroConf as not used See merge request openlp/openlp!481
This commit is contained in:
commit
18261b4352
|
@ -188,11 +188,6 @@ class ApiTab(SettingsTab):
|
|||
self.server_websocket_state = QtWidgets.QLabel(self.server_state_group_box)
|
||||
self.server_websocket_state.setObjectName('server_websocket_state')
|
||||
self.server_state_layout.addRow(self.server_websocket_state_title, self.server_websocket_state)
|
||||
self.server_zeroconf_state_title = QtWidgets.QLabel(self.server_state_group_box)
|
||||
self.server_zeroconf_state_title.setObjectName('server_zeroconf_state_title')
|
||||
self.server_zeroconf_state = QtWidgets.QLabel(self.server_state_group_box)
|
||||
self.server_zeroconf_state.setObjectName('server_zeroconf_state')
|
||||
self.server_state_layout.addRow(self.server_zeroconf_state_title, self.server_zeroconf_state)
|
||||
self.left_layout.addStretch()
|
||||
self.right_layout.addStretch()
|
||||
|
||||
|
@ -233,7 +228,6 @@ class ApiTab(SettingsTab):
|
|||
self.server_state_group_box.setTitle(translate('RemotePlugin.RemoteTab', 'Server Status'))
|
||||
self.server_http_state_title.setText(translate('RemotePlugin.RemoteTab', 'HTTP Server:'))
|
||||
self.server_websocket_state_title.setText(translate('RemotePlugin.RemoteTab', 'Websocket Server:'))
|
||||
self.server_zeroconf_state_title.setText(translate('RemotePlugin.RemoteTab', 'Zeroconf Server:'))
|
||||
self._server_up = translate('RemotePlugin.RemoteTab', 'Active', 'Server is active')
|
||||
self._server_down = translate('RemotePlugin.RemoteTab', 'Failed', 'Server failed')
|
||||
self._server_disabled = translate('RemotePlugin.RemoteTab', 'Disabled', 'Server is disabled')
|
||||
|
@ -316,13 +310,6 @@ class ApiTab(SettingsTab):
|
|||
else:
|
||||
self.server_websocket_state.setText(self._server_down)
|
||||
|
||||
if not is_thread_finished('api_zeroconf'):
|
||||
self.server_zeroconf_state.setText(self._server_up)
|
||||
elif Registry().get_flag('no_web_server'):
|
||||
self.server_zeroconf_state.setText(self._server_disabled)
|
||||
else:
|
||||
self.server_zeroconf_state.setText(self._server_down)
|
||||
|
||||
def get_ip_address(self, ip_address):
|
||||
"""
|
||||
returns the IP address in dependency of the passed address
|
||||
|
|
|
@ -1,117 +0,0 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
|
||||
##########################################################################
|
||||
# OpenLP - Open Source Lyrics Projection #
|
||||
# ---------------------------------------------------------------------- #
|
||||
# Copyright (c) 2008-2022 OpenLP Developers #
|
||||
# ---------------------------------------------------------------------- #
|
||||
# This program is free software: you can redistribute it and/or modify #
|
||||
# it under the terms of the GNU General Public License as published by #
|
||||
# the Free Software Foundation, either version 3 of the License, or #
|
||||
# (at your option) any later version. #
|
||||
# #
|
||||
# This program is distributed in the hope that it will be useful, #
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of #
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
|
||||
# GNU General Public License for more details. #
|
||||
# #
|
||||
# You should have received a copy of the GNU General Public License #
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>. #
|
||||
##########################################################################
|
||||
"""
|
||||
The :mod:`~openlp.core.api.zeroconf` module runs a Zerconf server so that OpenLP can advertise the
|
||||
RESTful API for devices on the network to discover.
|
||||
"""
|
||||
import socket
|
||||
from time import sleep
|
||||
|
||||
from zeroconf import ServiceInfo, Zeroconf, Error, NonUniqueNameException
|
||||
|
||||
from openlp.core.common import get_network_interfaces
|
||||
from openlp.core.common.i18n import UiStrings
|
||||
from openlp.core.common.registry import Registry
|
||||
from openlp.core.threading import ThreadWorker, run_thread
|
||||
|
||||
|
||||
def _get_error_message(exc):
|
||||
"""
|
||||
Zeroconf doesn't have error messages, so we have to make up our own
|
||||
"""
|
||||
error_message = UiStrings().ZeroconfErrorIntro + '\n\n'
|
||||
if isinstance(exc, NonUniqueNameException):
|
||||
error_message += UiStrings().ZeroconfNonUniqueError
|
||||
else:
|
||||
error_message += UiStrings().ZeroconfGenericError
|
||||
return error_message
|
||||
|
||||
|
||||
class ZeroconfWorker(ThreadWorker):
|
||||
"""
|
||||
This thread worker runs a Zeroconf service
|
||||
"""
|
||||
ip_address = None
|
||||
http_port = 4316
|
||||
ws_port = 4317
|
||||
_can_run = False
|
||||
|
||||
def __init__(self, addresses, http_port=4316, ws_port=4317):
|
||||
"""
|
||||
Create the worker for the Zeroconf service
|
||||
"""
|
||||
super().__init__()
|
||||
self.addresses = addresses
|
||||
self.http_port = http_port
|
||||
self.ws_port = ws_port
|
||||
|
||||
def can_run(self):
|
||||
"""
|
||||
Check if the worker can continue to run. This is mostly so that we can override this method
|
||||
and test the class.
|
||||
"""
|
||||
return self._can_run
|
||||
|
||||
def start(self):
|
||||
"""
|
||||
Start the service
|
||||
"""
|
||||
addresses = [socket.inet_aton(addr) for addr in self.addresses]
|
||||
http_info = ServiceInfo('_http._tcp.local.', 'OpenLP._http._tcp.local.',
|
||||
addresses=addresses, port=self.http_port, properties={})
|
||||
ws_info = ServiceInfo('_ws._tcp.local.', 'OpenLP._ws._tcp.local.',
|
||||
addresses=addresses, port=self.ws_port, properties={})
|
||||
zc = None
|
||||
try:
|
||||
zc = Zeroconf()
|
||||
zc.register_service(http_info)
|
||||
zc.register_service(ws_info)
|
||||
self._can_run = True
|
||||
while self.can_run():
|
||||
sleep(0.1)
|
||||
except Error as e:
|
||||
self.error.emit('Cannot start Zeroconf service', _get_error_message(e))
|
||||
except OSError as e:
|
||||
self.error.emit('Cannot start Zeroconf service', str(e))
|
||||
finally:
|
||||
if zc is not None:
|
||||
zc.unregister_all_services()
|
||||
zc.close()
|
||||
self.quit.emit()
|
||||
|
||||
def stop(self):
|
||||
"""
|
||||
Stop the service
|
||||
"""
|
||||
self._can_run = False
|
||||
|
||||
|
||||
def start_zeroconf():
|
||||
"""
|
||||
Start the Zeroconf service
|
||||
"""
|
||||
# When we're running tests, just skip this set up if this flag is set
|
||||
if Registry().get_flag('no_web_server'):
|
||||
return
|
||||
http_port = Registry().get('settings_thread').value('api/port')
|
||||
ws_port = Registry().get('settings_thread').value('api/websocket port')
|
||||
worker = ZeroconfWorker([iface['ip'] for iface in get_network_interfaces().values()], http_port, ws_port)
|
||||
run_thread(worker, 'api_zeroconf')
|
|
@ -30,7 +30,6 @@ from PyQt5 import QtCore, QtGui, QtWidgets
|
|||
|
||||
from openlp.core.api.http.server import HttpServer
|
||||
from openlp.core.api.websockets import WebSocketServer
|
||||
from openlp.core.api.zeroconf import start_zeroconf
|
||||
from openlp.core.common import add_actions
|
||||
from openlp.core.common.actions import ActionList, CategoryOrder
|
||||
from openlp.core.common.applocation import AppLocation
|
||||
|
@ -484,7 +483,6 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow, LogMixin, RegistryPropert
|
|||
self.ws_server = WebSocketServer()
|
||||
self.ws_server.start()
|
||||
self.http_server = HttpServer(self)
|
||||
start_zeroconf()
|
||||
SettingsForm(self)
|
||||
self.formatting_tag_form = FormattingTagForm(self)
|
||||
self.shortcut_form = ShortcutListForm(self)
|
||||
|
|
|
@ -243,7 +243,6 @@ def test_set_server_states_up(mock_is_thread_finished, registry, settings, api_t
|
|||
# THEN: The servers should all be "up"
|
||||
assert api_tab.server_http_state.text() == 'Active'
|
||||
assert api_tab.server_websocket_state.text() == 'Active'
|
||||
assert api_tab.server_zeroconf_state.text() == 'Active'
|
||||
|
||||
|
||||
@patch('openlp.core.api.tab.is_thread_finished')
|
||||
|
@ -259,7 +258,6 @@ def test_set_server_states_disabled(mock_is_thread_finished, registry, settings,
|
|||
# THEN: The servers should all be "up"
|
||||
assert api_tab.server_http_state.text() == 'Disabled'
|
||||
assert api_tab.server_websocket_state.text() == 'Disabled'
|
||||
assert api_tab.server_zeroconf_state.text() == 'Disabled'
|
||||
|
||||
|
||||
@patch('openlp.core.api.tab.is_thread_finished')
|
||||
|
@ -275,7 +273,6 @@ def test_set_server_states_down(mock_is_thread_finished, registry, settings, api
|
|||
# THEN: The servers should all be "up"
|
||||
assert api_tab.server_http_state.text() == 'Failed'
|
||||
assert api_tab.server_websocket_state.text() == 'Failed'
|
||||
assert api_tab.server_zeroconf_state.text() == 'Failed'
|
||||
|
||||
|
||||
@patch('openlp.core.api.tab.download_version_info')
|
||||
|
|
|
@ -1,107 +0,0 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
|
||||
##########################################################################
|
||||
# OpenLP - Open Source Lyrics Projection #
|
||||
# ---------------------------------------------------------------------- #
|
||||
# Copyright (c) 2008-2022 OpenLP Developers #
|
||||
# ---------------------------------------------------------------------- #
|
||||
# This program is free software: you can redistribute it and/or modify #
|
||||
# it under the terms of the GNU General Public License as published by #
|
||||
# the Free Software Foundation, either version 3 of the License, or #
|
||||
# (at your option) any later version. #
|
||||
# #
|
||||
# This program is distributed in the hope that it will be useful, #
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of #
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
|
||||
# GNU General Public License for more details. #
|
||||
# #
|
||||
# You should have received a copy of the GNU General Public License #
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>. #
|
||||
##########################################################################
|
||||
from unittest.mock import MagicMock, call, patch
|
||||
|
||||
from openlp.core.api.zeroconf import ZeroconfWorker, start_zeroconf
|
||||
|
||||
|
||||
def test_zeroconf_worker_constructor():
|
||||
"""Test creating the Zeroconf worker object"""
|
||||
# GIVEN: A ZeroconfWorker class
|
||||
# WHEN: An instance of the ZeroconfWorker is created
|
||||
worker = ZeroconfWorker(['127.0.0.1'], 8000, 8001)
|
||||
|
||||
# THEN: The inet_aton function should have been called and the attrs should be set
|
||||
assert worker.addresses == ['127.0.0.1']
|
||||
assert worker.http_port == 8000
|
||||
assert worker.ws_port == 8001
|
||||
|
||||
|
||||
@patch('openlp.core.api.zeroconf.ServiceInfo')
|
||||
@patch('openlp.core.api.zeroconf.Zeroconf')
|
||||
def test_zeroconf_worker_start(MockedZeroconf, MockedServiceInfo):
|
||||
"""Test the start() method of ZeroconfWorker"""
|
||||
# GIVEN: A few mocks and a ZeroconfWorker instance with a mocked can_run method
|
||||
mocked_http_info = MagicMock()
|
||||
mocked_ws_info = MagicMock()
|
||||
mocked_zc = MagicMock()
|
||||
MockedServiceInfo.side_effect = [mocked_http_info, mocked_ws_info]
|
||||
MockedZeroconf.return_value = mocked_zc
|
||||
worker = ZeroconfWorker(['127.0.0.1'], 8000, 8001)
|
||||
|
||||
# WHEN: The start() method is called
|
||||
with patch.object(worker, 'can_run') as mocked_can_run:
|
||||
mocked_can_run.side_effect = [True, False]
|
||||
worker.start()
|
||||
|
||||
# THEN: The correct calls are made
|
||||
assert MockedServiceInfo.call_args_list == [
|
||||
call('_http._tcp.local.', 'OpenLP._http._tcp.local.', addresses=[b'\x7f\x00\x00\x01'], port=8000,
|
||||
properties={}),
|
||||
call('_ws._tcp.local.', 'OpenLP._ws._tcp.local.', addresses=[b'\x7f\x00\x00\x01'], port=8001,
|
||||
properties={})
|
||||
]
|
||||
assert MockedZeroconf.call_count == 1
|
||||
assert mocked_zc.register_service.call_args_list == [call(mocked_http_info), call(mocked_ws_info)]
|
||||
assert mocked_can_run.call_count == 2
|
||||
mocked_zc.unregister_all_services.assert_called_once_with()
|
||||
mocked_zc.close.assert_called_once_with()
|
||||
|
||||
|
||||
def test_zeroconf_worker_stop():
|
||||
"""Test that the ZeroconfWorker.stop() method correctly stops the service"""
|
||||
# GIVEN: A worker object with _can_run set to True
|
||||
worker = ZeroconfWorker(['127.0.0.1'], 8000, 8001)
|
||||
worker._can_run = True
|
||||
|
||||
# WHEN: stop() is called
|
||||
worker.stop()
|
||||
|
||||
# THEN: _can_run should be False
|
||||
assert worker.can_run() is False
|
||||
|
||||
|
||||
@patch('openlp.core.api.zeroconf.get_network_interfaces')
|
||||
@patch('openlp.core.api.zeroconf.Registry')
|
||||
@patch('openlp.core.api.zeroconf.ZeroconfWorker')
|
||||
@patch('openlp.core.api.zeroconf.run_thread')
|
||||
def test_start_zeroconf(mocked_run_thread, MockedZeroconfWorker, MockedRegistry, mocked_get_network_interfaces):
|
||||
"""Test the start_zeroconf() function"""
|
||||
# GIVEN: A whole bunch of stuff that's mocked out
|
||||
mocked_get_network_interfaces.return_value = {
|
||||
'eth0': {
|
||||
'ip': '192.168.1.191',
|
||||
'broadcast': '192.168.1.255',
|
||||
'netmask': '255.255.255.0',
|
||||
'prefix': 24,
|
||||
'localnet': '192.168.1.0'
|
||||
}
|
||||
}
|
||||
MockedRegistry.return_value.get_flag.return_value = False
|
||||
MockedRegistry.settings.return_value.value.side_effect = [8000, 8001]
|
||||
mocked_worker = MagicMock()
|
||||
MockedZeroconfWorker.return_value = mocked_worker
|
||||
|
||||
# WHEN: start_zeroconf() is called
|
||||
start_zeroconf()
|
||||
|
||||
# THEN: A worker is added to the list of threads
|
||||
mocked_run_thread.assert_called_once_with(mocked_worker, 'api_zeroconf')
|
|
@ -99,7 +99,6 @@ def main_window_reduced(settings, state):
|
|||
patch('openlp.core.ui.mainwindow.ProjectorManager'), \
|
||||
patch('openlp.core.ui.mainwindow.HttpServer'), \
|
||||
patch('openlp.core.ui.mainwindow.WebSocketServer'), \
|
||||
patch('openlp.core.ui.mainwindow.start_zeroconf'), \
|
||||
patch('openlp.core.ui.mainwindow.PluginForm'):
|
||||
return MainWindow()
|
||||
|
||||
|
|
Loading…
Reference in New Issue