diff --git a/README.md b/README.md index 6c67d7e4d541450cdd9234a5369e05eb0408882d..ec3883513962007be35aca7fd7df08d0c07c04cd 100644 --- a/README.md +++ b/README.md @@ -91,7 +91,8 @@ pip3 install -r requirements.txt You also need to build [Briar Headless](https://code.briarproject.org/briar/briar/-/tree/master/briar-headless). Check its readme to learn how to do it. You can also use -[builds provided by Nico Alt](https://media.dorfbrunnen.eu/briar/). +[builds provided by Nico Alt](https://media.dorfbrunnen.eu/briar/) +and put the .jar file at _~/.local/share/java/briar-headless.jar_. Make sure to have _java_ (e.g. `openjdk-11-jdk`) installed. Once you've done this, change the path to the Briar headless diff --git a/app.briar.gtk.json b/app.briar.gtk.json index 1568c2aa4ed3b7de1092e174ac0ca815599dd4cf..831bd84b3a65bc6b3b388737815ba20e5ef0310b 100644 --- a/app.briar.gtk.json +++ b/app.briar.gtk.json @@ -107,8 +107,8 @@ "name": "briar-headless", "buildsystem": "simple", "build-commands": [ - "mkdir -p /app/briar", - "install -Dm644 briar-headless.jar /app/briar/briar-headless.jar" + "mkdir -p /app/share/java", + "install -Dm644 briar-headless.jar /app/share/java/briar-headless.jar" ], "sources": [ { diff --git a/briar-gtk/briar_gtk/application.py b/briar-gtk/briar_gtk/application.py index 1dc959d37a4407c44d6a71f89f42a4249a4c2ef3..76040bdfded784ce9f0f7303ab498b029da1ebd0 100644 --- a/briar-gtk/briar_gtk/application.py +++ b/briar-gtk/briar_gtk/application.py @@ -16,7 +16,7 @@ from briar_wrapper.api import Api from briar_gtk.actions.application import ApplicationActions from briar_gtk.define import APPLICATION_ID, APPLICATION_NAME -from briar_gtk.define import APPLICATION_STYLING_PATH, BRIAR_HEADLESS_JAR +from briar_gtk.define import APPLICATION_STYLING_PATH, get_briar_headless_jar from briar_gtk.window import Window @@ -61,7 +61,7 @@ class Application(Gtk.Application): Gtk.STYLE_PROVIDER_PRIORITY_USER) def _setup_api(self): - self.api = Api(BRIAR_HEADLESS_JAR) + self.api = Api(get_briar_headless_jar()) # pylint: disable=access-member-before-definition def _setup_window(self): diff --git a/briar-gtk/briar_gtk/define.py b/briar-gtk/briar_gtk/define.py index 5a9811a40c2da1570218a69a47dc83316e7e53e1..6b323f6ed28b676c44037dda4b12239e48e97475 100644 --- a/briar-gtk/briar_gtk/define.py +++ b/briar-gtk/briar_gtk/define.py @@ -7,6 +7,7 @@ # https://gitlab.gnome.org/World/lollypop/blob/1.0.2/lollypop/define.py import os +import pathlib from gi.repository import Gio @@ -14,6 +15,25 @@ APPLICATION_ID = "app.briar.gtk" APPLICATION_NAME = "Briar" RESOURCES_DIR = os.path.join("/app", "briar", "gtk") APPLICATION_STYLING_PATH = "resource:///app/briar/gtk/application.css" -BRIAR_HEADLESS_JAR = os.path.join("/app", "briar", "briar-headless.jar") APP = Gio.Application.get_default + + +def get_briar_headless_jar(): + flatpak_path = "/app/share/java/briar-headless.jar" + if os.path.isfile(flatpak_path): + return flatpak_path + + debian_path = "/usr/share/java/briar-headless.jar" + if os.path.isfile(debian_path): + return debian_path + + local_path = os.path.join( + pathlib.Path.home(), + ".local", "share", "java", + "briar-headless.jar" + ) + if os.path.isfile(local_path): + return local_path + + raise FileNotFoundError("Couldn't find briar-headless.jar") diff --git a/briar-gtk/tests/briar_gtk/test_application.py b/briar-gtk/tests/briar_gtk/test_application.py index b19cbecb5ab4271646be2750dec88f4a546a9317..63eab4714721282a55d24b8235501becfab0e2b2 100644 --- a/briar-gtk/tests/briar_gtk/test_application.py +++ b/briar-gtk/tests/briar_gtk/test_application.py @@ -35,7 +35,7 @@ def test_api_at_startup(mocker): Application().do_startup() - api_mock.assert_called_once_with("/app/briar/briar-headless.jar") + api_mock.assert_called_once_with("/app/share/java/briar-headless.jar") def test_css_provider_at_startup(mocker): @@ -117,6 +117,14 @@ def test_window_hide_at_shutdown(mocker): window_mock.hide.assert_called_once() +@pytest.fixture(autouse=True) +def briar_headless_jar(is_file): + flatpak_path = "/app/share/java/briar-headless.jar" + return_values = {flatpak_path: True} + is_file.side_effect = return_values.get + return is_file + + @pytest.fixture(autouse=True) def gi_dependencies(mocker): gi_dependencies = ('Gdk', 'Gio', 'GLib', 'Gtk', 'Handy') diff --git a/briar-gtk/tests/briar_gtk/test_container.py b/briar-gtk/tests/briar_gtk/test_container.py index 853f7dd9f12a4bca4469519f41604a5c6701957a..8a28b7dfda68bef1d6cf8b842414c56712ef9dec 100644 --- a/briar-gtk/tests/briar_gtk/test_container.py +++ b/briar-gtk/tests/briar_gtk/test_container.py @@ -21,6 +21,14 @@ def test_builder_at_init(mocker): builder_mock.assert_called_once() +@pytest.fixture(autouse=True) +def briar_headless_jar(is_file): + flatpak_path = "/app/share/java/briar-headless.jar" + return_values = {flatpak_path: True} + is_file.side_effect = return_values.get + return is_file + + @pytest.fixture(autouse=True) def gi_dependencies(mocker): mocker.patch(MODULE % "Gtk") diff --git a/briar-gtk/tests/briar_gtk/test_define.py b/briar-gtk/tests/briar_gtk/test_define.py new file mode 100644 index 0000000000000000000000000000000000000000..83123166026e3defb84e10672e872c72076343ac --- /dev/null +++ b/briar-gtk/tests/briar_gtk/test_define.py @@ -0,0 +1,48 @@ +# Copyright (c) 2020 Nico Alt +# SPDX-License-Identifier: AGPL-3.0-only +# License-Filename: LICENSE.md + +import pytest + +from briar_gtk.define import get_briar_headless_jar + + +def test_headless_flatpak_path(is_file): + flatpak_path = "/app/share/java/briar-headless.jar" + return_values = {flatpak_path: True} + is_file.side_effect = return_values.get + + assert get_briar_headless_jar() == flatpak_path + is_file.assert_called_once_with(flatpak_path) + + +def test_headless_debian_path(is_file): + debian_path = "/usr/share/java/briar-headless.jar" + return_values = {debian_path: True} + is_file.side_effect = return_values.get + + assert get_briar_headless_jar() == debian_path + is_file.assert_called_with(debian_path) + + +def test_headless_local_path(is_file, mocker): + local_path = "/home/alice/.local/share/java/briar-headless.jar" + + home_mock = mocker.patch('pathlib.Path.home') + home_mock.return_value = "/home/alice" + + return_values = {local_path: True} + is_file.side_effect = return_values.get + + assert get_briar_headless_jar() == local_path + is_file.assert_called_with(local_path) + + +def test_headless_no_path(is_file): + is_file.return_value = False + + with pytest.raises(FileNotFoundError, + match="Couldn't find briar-headless.jar"): + get_briar_headless_jar() + + assert is_file.called is True diff --git a/briar-gtk/tests/briar_gtk/test_window.py b/briar-gtk/tests/briar_gtk/test_window.py index 4cef6376fe8af3ac817387966b9821d53929d363..157ca231b8593ce4659f72f28f9fec2139c376ed 100644 --- a/briar-gtk/tests/briar_gtk/test_window.py +++ b/briar-gtk/tests/briar_gtk/test_window.py @@ -79,6 +79,14 @@ def test_show_main_destroy_old(main_window_container, mocker, current_container_mock.destroy.assert_called_once() +@pytest.fixture(autouse=True) +def briar_headless_jar(is_file): + flatpak_path = "/app/share/java/briar-headless.jar" + return_values = {flatpak_path: True} + is_file.side_effect = return_values.get + return is_file + + @pytest.fixture(autouse=True) def gi_dependencies(mocker): mocker.patch(MODULE % "Gtk") diff --git a/briar-gtk/tests/conftest.py b/briar-gtk/tests/conftest.py index bb0bffd0ae3d8ece3a0467e712e8f611728d62b2..874250e6abaef267fda1ae472fda7532d0a28b1a 100644 --- a/briar-gtk/tests/conftest.py +++ b/briar-gtk/tests/conftest.py @@ -1,3 +1,10 @@ # Copyright (c) 2019 Nico Alt # SPDX-License-Identifier: AGPL-3.0-only # License-Filename: LICENSE.md + +import pytest + + +@pytest.fixture() +def is_file(mocker): + return mocker.patch('os.path.isfile')