Skip to content

Commit

Permalink
Mock the daemon and run tests against prod builds (#9584)
Browse files Browse the repository at this point in the history
* Add mock daemon command
* Implement mocked peer handshake and status methods.
* Overwrite addresses to mock out connection health checks
* Parameterize path to LocalSocketController
* Add mock DNS utils and support private socket paths
* Remove DaemonLocalServer and move it into the platform versions
* Trim down some unnecessary Daemon::instance() calls.
* Replace DummyController with mock daemon via LocalSocketController
* Use the mocked daemon when running with the --testing option
* Emit signals at the end of Daemon::deactivate()
* Move MozillaVPN class init after command line parsing
* Derive the settings org from QCoreApplication::organizationName()
* Change app organization to "Mozilla Testing" when running in test
* Ensure inAppAuth feature is toggled in functional tests
* Add feature to enable/disable Balrog and turn it off in testing
* Run functional tests against MacOS prod binary
* Enable stderr logging when run with --testing
* Reset glean when run with --testing option
* Make VPNController.currentServerString prop available in all builds
* testAuthenticationInApp: use beforeEach hook to ensure consistent features
* testInitialize: Auth flow tests depend on auth feature flags
* Provide mocked AppListProvider when testing
* Flag split-tunneling on in functional tests
* Run Linux functional tests against prod binary
* Remove LinuxDependencies::checkDependencies()
* Remove assert in Linux system notification handler
* Wait for controller init in vpn.activate()
* Restore call to QLocalSocket::abort() during init
  • Loading branch information
oskirby committed Jun 25, 2024
1 parent 920492d commit 2c0ca14
Show file tree
Hide file tree
Showing 69 changed files with 912 additions and 592 deletions.
24 changes: 13 additions & 11 deletions .github/workflows/linux_tests.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -39,15 +39,17 @@ jobs:
shell: bash
run: |
mkdir -p build/cmake
mkdir -p build/profile
cmake -S $(pwd) -B build/cmake -GNinja
cmake --build build/cmake --target dummyvpn
cmake -S $(pwd) -B build/cmake -GNinja -DCMAKE_BUILD_TYPE=RelWithDebInfo
cmake --build build/cmake
cp ./build/cmake/src/mozillavpn build/
mkdir -p build/profile
rsync -a --include '*/' --include '*.gcno' --exclude '*' \
build/cmake/tests/dummyvpn/CMakeFiles/dummyvpn.dir/ build/profile/
cp ./build/cmake/tests/dummyvpn/dummyvpn build/
cp -r ./build/cmake/tests/dummyvpn/addons build/addons
- name: Compile test addons
shell: bash
run: |
mkdir -p build/addons
cmake -S $(pwd)/tests/functional/addons -B build/addons \
-DCMAKE_PREFIX_PATH=${{ github.workspace }}/qt_dist/lib/cmake
cmake --build build/addons
- uses: actions/upload-artifact@v4
with:
Expand Down Expand Up @@ -112,8 +114,8 @@ jobs:
- name: Check build
shell: bash
run: |
chmod +x ./build/dummyvpn
./build/dummyvpn -v
chmod +x ./build/mozillavpn
./build/mozillavpn -v
- name: Running ${{ matrix.test.name }} Tests
id: runTests
Expand All @@ -122,7 +124,7 @@ jobs:
TZ: Europe/London
HEADLESS: yes
ARTIFACT_DIR: ${{ runner.temp }}/artifacts
MVPN_BIN: ./build/dummyvpn
MVPN_BIN: ./build/mozillavpn
run: |
export PATH=$GECKOWEBDRIVER:$(npm bin):$PATH
mkdir -p $ARTIFACT_DIR
Expand Down
20 changes: 14 additions & 6 deletions .github/workflows/macos_tests.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -51,9 +51,16 @@ jobs:
mkdir -p build/cmake
cmake -S $(pwd) -B build/cmake -GNinja -DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DCMAKE_PREFIX_PATH=${{ github.workspace }}/qt_dist/lib/cmake
cmake --build build/cmake --target dummyvpn
cp ./build/cmake/tests/dummyvpn/dummyvpn build/
cp -r ./build/cmake/tests/dummyvpn/addons build/addons
cmake --build build/cmake
cp -r ./build/cmake/src/Mozilla\ VPN.app/ build/Mozilla\ VPN.app
- name: Compile test addons
shell: bash
run: |
mkdir -p build/addons
cmake -S $(pwd)/tests/functional/addons -B build/addons \
-DCMAKE_PREFIX_PATH=${{ github.workspace }}/qt_dist/lib/cmake
cmake --build build/addons
- uses: actions/upload-artifact@v4
with:
Expand Down Expand Up @@ -112,8 +119,8 @@ jobs:
- name: Check build
shell: bash
run: |
chmod +x ./build/dummyvpn
./build/dummyvpn -v
chmod +x ./build/Mozilla\ VPN.app/Contents/MacOS/Mozilla\ VPN
./build/Mozilla\ VPN.app/Contents/MacOS/Mozilla\ VPN -v
- name: Running ${{ matrix.test.name }} Tests
shell: bash
Expand All @@ -122,7 +129,8 @@ jobs:
TZ: Europe/London
HEADLESS: yes
ARTIFACT_DIR: ${{ runner.temp }}/artifacts
MVPN_BIN: ./build/dummyvpn
MVPN_ADDONS_PATH: ./build/addons
MVPN_BIN: ./build/Mozilla VPN.app/Contents/MacOS/Mozilla VPN
run: |
export PATH=$GECKOWEBDRIVER:$(npm bin):$PATH
mkdir -p $ARTIFACT_DIR
Expand Down
3 changes: 2 additions & 1 deletion src/app.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -48,9 +48,10 @@ void App::quit() {
logger.debug() << "quit";
TaskScheduler::forceDeleteTasks();

#if QT_VERSION < 0x060300
#if QT_VERSION < QT_VERSION_CHECK(6, 2, 4)
// Qt5Compat.GraphicalEffects makes the app crash on shutdown. Let's do a
// quick exit. See: https://bugreports.qt.io/browse/QTBUG-100687
// it is unknown when exactly this was fixed but aparently 6.2.4 is fine.

SettingsManager::instance()->sync();
exit(0);
Expand Down
35 changes: 21 additions & 14 deletions src/apppermission.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
#include "leakdetector.h"
#include "logger.h"
#include "mozillavpn.h"
#include "platforms/dummy/dummyapplistprovider.h"
#include "settingsholder.h"

#if defined(MZ_ANDROID)
Expand All @@ -21,8 +22,6 @@
# include "platforms/linux/linuxapplistprovider.h"
#elif defined(MZ_WINDOWS)
# include "platforms/windows/windowsapplistprovider.h"
#else
# include "platforms/dummy/dummyapplistprovider.h"
#endif

#include <QFileDialog>
Expand Down Expand Up @@ -50,21 +49,14 @@ bool sortApplicationCallback(const AppPermission::AppDescription& a,

} // namespace

AppPermission::AppPermission(QObject* parent) : QAbstractListModel(parent) {
AppPermission::AppPermission(AppListProvider* provider, QObject* parent)
: QAbstractListModel(parent) {
MZ_COUNT_CTOR(AppPermission);
Q_ASSERT(!s_instance);
s_instance = this;

m_listprovider =
#if defined(MZ_ANDROID)
new AndroidAppListProvider(this);
#elif defined(MZ_LINUX)
new LinuxAppListProvider(this);
#elif defined(MZ_WINDOWS)
new WindowsAppListProvider(this);
#else
new DummyAppListProvider(this);
#endif
m_listprovider = provider;
provider->setParent(this);

connect(SettingsHolder::instance(), &SettingsHolder::vpnDisabledAppsChanged,
this, [this]() {
Expand All @@ -75,20 +67,35 @@ AppPermission::AppPermission(QObject* parent) : QAbstractListModel(parent) {
connect(m_listprovider, &AppListProvider::newAppList, this,
&AppPermission::receiveAppList);
}

AppPermission::~AppPermission() {
MZ_COUNT_DTOR(AppPermission);
Q_ASSERT(s_instance = this);
s_instance = nullptr;
}

// static
AppPermission* AppPermission::instance() {
if (s_instance == nullptr) {
new AppPermission(qApp);
#if defined(MZ_ANDROID)
s_instance = new AppPermission(new AndroidAppListProvider(qApp));
#elif defined(MZ_LINUX)
s_instance = new AppPermission(new LinuxAppListProvider(qApp));
#elif defined(MZ_WINDOWS)
s_instance = new AppPermission(new WindowsAppListProvider(qApp));
#else
s_instance = new AppPermission(new DummyAppListProvider(qApp));
#endif
}
Q_ASSERT(s_instance);
return s_instance;
}

// static
void AppPermission::mock() {
s_instance = new AppPermission(new DummyAppListProvider(qApp));
}

QHash<int, QByteArray> AppPermission::roleNames() const {
QHash<int, QByteArray> roles;
roles[AppNameRole] = "appName";
Expand Down
3 changes: 2 additions & 1 deletion src/apppermission.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ class AppPermission final : public QAbstractListModel {
};

static AppPermission* instance();
static void mock();

// Returns count of disabled apps
Q_INVOKABLE int disabledAppCount();
Expand Down Expand Up @@ -76,7 +77,7 @@ class AppPermission final : public QAbstractListModel {
void receiveAppList(const QMap<QString, QString>& applist);

private:
explicit AppPermission(QObject* parent);
explicit AppPermission(AppListProvider* provider, QObject* parent = nullptr);

AppListProvider* m_listprovider = nullptr;
QList<AppDescription> m_applist;
Expand Down
13 changes: 0 additions & 13 deletions src/cmake/macos.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -38,19 +38,6 @@ target_link_libraries(mozillavpn PRIVATE ${FW_USER_NOTIFICATIONS})

# MacOS platform source files
target_sources(mozillavpn PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/daemon/daemon.cpp
${CMAKE_CURRENT_SOURCE_DIR}/daemon/daemon.h
${CMAKE_CURRENT_SOURCE_DIR}/daemon/daemonlocalserver.cpp
${CMAKE_CURRENT_SOURCE_DIR}/daemon/daemonlocalserver.h
${CMAKE_CURRENT_SOURCE_DIR}/daemon/daemonlocalserverconnection.cpp
${CMAKE_CURRENT_SOURCE_DIR}/daemon/daemonlocalserverconnection.h
${CMAKE_CURRENT_SOURCE_DIR}/daemon/daemonaccesscontrol.cpp
${CMAKE_CURRENT_SOURCE_DIR}/daemon/daemonaccesscontrol.h
${CMAKE_CURRENT_SOURCE_DIR}/daemon/dnsutils.h
${CMAKE_CURRENT_SOURCE_DIR}/daemon/iputils.h
${CMAKE_CURRENT_SOURCE_DIR}/daemon/wireguardutils.h
${CMAKE_CURRENT_SOURCE_DIR}/localsocketcontroller.cpp
${CMAKE_CURRENT_SOURCE_DIR}/localsocketcontroller.h
${CMAKE_CURRENT_SOURCE_DIR}/platforms/macos/daemon/dnsutilsmacos.cpp
${CMAKE_CURRENT_SOURCE_DIR}/platforms/macos/daemon/dnsutilsmacos.h
${CMAKE_CURRENT_SOURCE_DIR}/platforms/macos/daemon/iputilsmacos.cpp
Expand Down
20 changes: 20 additions & 0 deletions src/cmake/sources.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,25 @@ target_sources(mozillavpn-sources INTERFACE
${CMAKE_CURRENT_SOURCE_DIR}/constants.h
${CMAKE_CURRENT_SOURCE_DIR}/controller.cpp
${CMAKE_CURRENT_SOURCE_DIR}/controller.h
${CMAKE_CURRENT_SOURCE_DIR}/controllerimpl.cpp
${CMAKE_CURRENT_SOURCE_DIR}/controllerimpl.h
${CMAKE_CURRENT_SOURCE_DIR}/daemon/daemon.cpp
${CMAKE_CURRENT_SOURCE_DIR}/daemon/daemon.h
${CMAKE_CURRENT_SOURCE_DIR}/daemon/daemonlocalserverconnection.cpp
${CMAKE_CURRENT_SOURCE_DIR}/daemon/daemonlocalserverconnection.h
${CMAKE_CURRENT_SOURCE_DIR}/daemon/daemonaccesscontrol.cpp
${CMAKE_CURRENT_SOURCE_DIR}/daemon/daemonaccesscontrol.h
${CMAKE_CURRENT_SOURCE_DIR}/daemon/dnsutils.h
${CMAKE_CURRENT_SOURCE_DIR}/daemon/iputils.h
${CMAKE_CURRENT_SOURCE_DIR}/daemon/wireguardutils.h
${CMAKE_CURRENT_SOURCE_DIR}/daemon/mock/dnsutilsmock.cpp
${CMAKE_CURRENT_SOURCE_DIR}/daemon/mock/dnsutilsmock.h
${CMAKE_CURRENT_SOURCE_DIR}/daemon/mock/mockdaemon.cpp
${CMAKE_CURRENT_SOURCE_DIR}/daemon/mock/mockdaemon.h
${CMAKE_CURRENT_SOURCE_DIR}/daemon/mock/mockdaemonserver.cpp
${CMAKE_CURRENT_SOURCE_DIR}/daemon/mock/mockdaemonserver.h
${CMAKE_CURRENT_SOURCE_DIR}/daemon/mock/wireguardutilsmock.cpp
${CMAKE_CURRENT_SOURCE_DIR}/daemon/mock/wireguardutilsmock.h
${CMAKE_CURRENT_SOURCE_DIR}/dnshelper.cpp
${CMAKE_CURRENT_SOURCE_DIR}/dnshelper.h
${CMAKE_CURRENT_SOURCE_DIR}/dnspingsender.cpp
Expand All @@ -89,6 +107,8 @@ target_sources(mozillavpn-sources INTERFACE
${CMAKE_CURRENT_SOURCE_DIR}/ipaddresslookup.h
${CMAKE_CURRENT_SOURCE_DIR}/keyregenerator.cpp
${CMAKE_CURRENT_SOURCE_DIR}/keyregenerator.h
${CMAKE_CURRENT_SOURCE_DIR}/localsocketcontroller.cpp
${CMAKE_CURRENT_SOURCE_DIR}/localsocketcontroller.h
${CMAKE_CURRENT_SOURCE_DIR}/main.cpp
${CMAKE_CURRENT_SOURCE_DIR}/models/device.cpp
${CMAKE_CURRENT_SOURCE_DIR}/models/device.h
Expand Down
4 changes: 2 additions & 2 deletions src/cmake/wasm.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@
# file, You can obtain one at http://mozilla.org/MPL/2.0/.

target_sources(mozillavpn PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/platforms/dummy/dummycontroller.cpp
${CMAKE_CURRENT_SOURCE_DIR}/platforms/dummy/dummycontroller.h
${CMAKE_CURRENT_SOURCE_DIR}/platforms/macos/macosmenubar.cpp
${CMAKE_CURRENT_SOURCE_DIR}/platforms/macos/macosmenubar.h
${CMAKE_CURRENT_SOURCE_DIR}/platforms/wasm/wasmcontroller.cpp
${CMAKE_CURRENT_SOURCE_DIR}/platforms/wasm/wasmcontroller.h
${CMAKE_CURRENT_SOURCE_DIR}/platforms/wasm/wasmnetworkwatcher.cpp
${CMAKE_CURRENT_SOURCE_DIR}/platforms/wasm/wasmnetworkwatcher.h
${CMAKE_CURRENT_SOURCE_DIR}/platforms/wasm/wasmwindowcontroller.cpp
Expand Down
13 changes: 0 additions & 13 deletions src/cmake/windows.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -33,19 +33,6 @@ target_sources(mozillavpn PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/version.rc)

# Windows platform source files
target_sources(mozillavpn PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/daemon/daemon.cpp
${CMAKE_CURRENT_SOURCE_DIR}/daemon/daemon.h
${CMAKE_CURRENT_SOURCE_DIR}/daemon/daemonlocalserver.cpp
${CMAKE_CURRENT_SOURCE_DIR}/daemon/daemonlocalserver.h
${CMAKE_CURRENT_SOURCE_DIR}/daemon/daemonlocalserverconnection.cpp
${CMAKE_CURRENT_SOURCE_DIR}/daemon/daemonlocalserverconnection.h
${CMAKE_CURRENT_SOURCE_DIR}/daemon/daemonaccesscontrol.cpp
${CMAKE_CURRENT_SOURCE_DIR}/daemon/daemonaccesscontrol.h
${CMAKE_CURRENT_SOURCE_DIR}/daemon/dnsutils.h
${CMAKE_CURRENT_SOURCE_DIR}/daemon/iputils.h
${CMAKE_CURRENT_SOURCE_DIR}/daemon/wireguardutils.h
${CMAKE_CURRENT_SOURCE_DIR}/localsocketcontroller.cpp
${CMAKE_CURRENT_SOURCE_DIR}/localsocketcontroller.h
${CMAKE_CURRENT_SOURCE_DIR}/platforms/windows/windowsapplistprovider.cpp
${CMAKE_CURRENT_SOURCE_DIR}/platforms/windows/windowsapplistprovider.h
${CMAKE_CURRENT_SOURCE_DIR}/platforms/windows/windowsappimageprovider.cpp
Expand Down
9 changes: 0 additions & 9 deletions src/command.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -115,9 +115,6 @@ int Command::runCommandLineApp(std::function<int()>&& a_callback) {

QCoreApplication app(CommandLineParser::argc(), CommandLineParser::argv());

QCoreApplication::setApplicationName("Mozilla VPN");
QCoreApplication::setApplicationVersion(Constants::versionString());

Localizer localizer;
SimpleNetworkManager snm;

Expand All @@ -142,9 +139,6 @@ int Command::runGuiApp(std::function<int()>&& a_callback) {

QApplication app(CommandLineParser::argc(), CommandLineParser::argv());

QCoreApplication::setApplicationName("Mozilla VPN");
QCoreApplication::setApplicationVersion(Constants::versionString());

Localizer localizer;
SimpleNetworkManager snm;

Expand Down Expand Up @@ -197,9 +191,6 @@ int Command::runQmlApp(std::function<int()>&& a_callback) {

QApplication app(CommandLineParser::argc(), CommandLineParser::argv());

QCoreApplication::setApplicationName("Mozilla VPN");
QCoreApplication::setApplicationVersion(Constants::versionString());

Localizer localizer;

#ifdef MZ_MACOS
Expand Down
5 changes: 5 additions & 0 deletions src/commandlineparser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

#include "commandlineparser.h"

#include <QCoreApplication>
#include <QTextStream>

#include "command.h"
Expand Down Expand Up @@ -49,6 +50,10 @@ int CommandLineParser::parse(int argc, char* argv[]) {
tokens.append(QString(argv[i]));
}

QCoreApplication::setApplicationName("Mozilla VPN");
QCoreApplication::setOrganizationName("Mozilla");
QCoreApplication::setApplicationVersion(Constants::versionString());

QList<Option*> options;

Option hOption = helpOption();
Expand Down
Loading

0 comments on commit 2c0ca14

Please sign in to comment.