aboutsummaryrefslogtreecommitdiff
path: root/tests/utils/adbd-server.h
diff options
context:
space:
mode:
Diffstat (limited to 'tests/utils/adbd-server.h')
-rw-r--r--tests/utils/adbd-server.h148
1 files changed, 0 insertions, 148 deletions
diff --git a/tests/utils/adbd-server.h b/tests/utils/adbd-server.h
deleted file mode 100644
index 585380f..0000000
--- a/tests/utils/adbd-server.h
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Copyright 2016 Canonical Ltd.
- *
- * This program is free software: you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 3, as published
- * by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranties of
- * MERCHANTABILITY, SATISFACTORY QUALITY, 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 <http://www.gnu.org/licenses/>.
- *
- * Authors:
- * Charles Kerr <charles.kerr@canonical.com>
- */
-
-#include <gio/gio.h>
-#include <gio/gunixsocketaddress.h>
-
-#include <string>
-#include <thread>
-#include <vector>
-
-
-/**
- * A Mock ADBD server.
- *
- * Binds to a local domain socket, sends public key requests across it,
- * and reads back the client's responses.
- */
-class GAdbdServer
-{
-public:
-
- GAdbdServer(const std::string& socket_path,
- const std::vector<std::string>& requests):
- m_requests{requests},
- m_server_socket{create_server_socket(socket_path)},
- m_cancellable{g_cancellable_new()},
- m_worker_thread{&GAdbdServer::worker_func, this}
- {
- }
-
- ~GAdbdServer()
- {
- // tell the worker thread to stop whatever it's doing and exit.
- g_cancellable_cancel(m_cancellable);
- m_worker_thread.join();
- g_clear_object(&m_cancellable);
- g_clear_object(&m_server_socket);
- }
-
- const std::vector<std::string> m_requests;
- std::vector<std::string> m_responses;
-
-private:
-
- void worker_func() // runs in worker thread
- {
- auto requests = m_requests;
-
- while (!g_cancellable_is_cancelled(m_cancellable) && !requests.empty())
- {
- // wait for a client connection
- g_message("GAdbdServer::Impl::worker_func() calling g_socket_accept()");
- GError* error {};
- auto client_socket = g_socket_accept(m_server_socket, m_cancellable, &error);
- if (error != nullptr) {
- if (!g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
- g_message("GAdbdServer: Error accepting socket connection: %s", error->message);
- g_clear_error(&error);
- break;
- }
-
- // pop the next request off the stack
- auto request = requests.front();
-
- // send the request
- g_message("GAdbdServer::Impl::worker_func() sending req [%s]", request.c_str());
- g_socket_send(client_socket,
- request.c_str(),
- request.size(),
- m_cancellable,
- &error);
- if (error != nullptr) {
- if (!g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
- g_message("GAdbdServer: Error sending request: %s", error->message);
- g_clear_error(&error);
- g_clear_object(&client_socket);
- break;
- }
-
- // read the response
- g_message("GAdbdServer::Impl::worker_func() reading response");
- char buf[4096];
- const auto n_bytes = g_socket_receive(client_socket,
- buf,
- sizeof(buf),
- m_cancellable,
- &error);
- if (error != nullptr) {
- if (!g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
- g_message("GAdbdServer: Error reading response: %s", error->message);
- g_clear_error(&error);
- g_clear_object(&client_socket);
- continue;
- }
- const std::string response(buf, std::string::size_type(n_bytes));
- g_message("server read %d bytes, got response: '%s'", int(n_bytes), response.c_str());
- if (!response.empty()) {
- m_responses.push_back(response);
- requests.erase(requests.begin());
- }
-
- // cleanup
- g_clear_object(&client_socket);
- }
- }
-
- // bind to a local domain socket
- static GSocket* create_server_socket(const std::string& socket_path)
- {
- GError* error {};
- auto socket = g_socket_new(G_SOCKET_FAMILY_UNIX,
- G_SOCKET_TYPE_STREAM,
- G_SOCKET_PROTOCOL_DEFAULT,
- &error);
- g_assert_no_error(error);
- auto address = g_unix_socket_address_new (socket_path.c_str());
- g_socket_bind (socket, address, false, &error);
- g_assert_no_error (error);
- g_clear_object (&address);
-
- g_socket_listen (socket, &error);
- g_assert_no_error (error);
-
- return socket;
- }
-
- GSocket* m_server_socket {};
- GCancellable* m_cancellable {};
- std::thread m_worker_thread;
-};
-
-