diff --git a/test/address_tests.cpp b/test/address_tests.cpp
index 7e8bf412010f9912acc0122b5e7cd4c6ef35d8e2..867be3e901d52fb880b4882235be4f2e9e402343 100644
--- a/test/address_tests.cpp
+++ b/test/address_tests.cpp
@@ -62,3 +62,8 @@ BOOST_AUTO_TEST_CASE(Socketaddr_comparison) {
     BOOST_CHECK_NE(get_first_general_socketaddr("[::1]", "443"), get_first_general_socketaddr("::1", "80"));
     BOOST_CHECK_EQUAL(get_first_general_socketaddr("[::1]", "443"), get_first_general_socketaddr("::1", "443"));
 }
+
+BOOST_AUTO_TEST_CASE(Unix_socket_construction_test) {
+    const auto sa = get_first_general_socketaddr("/tmp/9Lq7BNBnBycd6nxy.socket", "", socket_t::UNIX);
+    BOOST_CHECK_EQUAL(sa.str(), "FileSocket /tmp/9Lq7BNBnBycd6nxy.socket");
+}
diff --git a/test/socket_test.cpp b/test/socket_test.cpp
index b19bf9f476172fa1291ad0216bb93d6db6882a68..14c89f5520fdbdbc9e413fa8ef12a48827b217a6 100644
--- a/test/socket_test.cpp
+++ b/test/socket_test.cpp
@@ -15,6 +15,7 @@
 #include "net/socketaddress.hpp"
 #include "net/sock_address_factory.hpp"
 #include "net/tcp_server_socket.hpp"
+#include "net/unix_socket_server.hpp"
 
 #include "lib/ev/ev.hpp"
 #include "mumta/evloop.hpp"
@@ -27,6 +28,7 @@ const std::string udp_test_string = "TEST UDP PACKET";
 
 volatile bool tcp_called = false;
 volatile bool udp_called = false;
+volatile bool unix_called = false;
 
 int udp_source_family;
 
@@ -118,6 +120,38 @@ void run_tcp_test(const socketaddr& interface_addr) {
     server.reset();
 }
 
+void run_unix_test() {
+    using namespace std::chrono_literals;
+
+    const socketaddr socket_name = get_first_general_socketaddr("/tmp/9Lq7BNBnBycd6nxy.socket", "", socket_t::UNIX);
+
+    auto server = std::make_shared<unix_socket_server>(socket_name,
+        [](std::shared_ptr<async_server_socket> s, std::shared_ptr<connection_client> c) {
+            BOOST_REQUIRE(s);
+            BOOST_REQUIRE(c);
+            c->set_incomming_data_callback(
+                [c](const iorecord& data) {
+                    c->write_data(data);
+                });
+        });
+
+    auto client = connect(socket_name);
+    client->set_incomming_data_callback(
+        [](const iorecord& data) {
+            BOOST_CHECK_EQUAL(data.str(), "Moin, von UNIX");
+            unix_called = true;
+        });
+
+    const std::string moin_string("Moin, von UNIX");
+    client->write_data(iorecord(moin_string.c_str(), moin_string.length()));
+
+    std::this_thread::yield();
+    std::this_thread::sleep_for(100ms);
+
+    client.reset();
+    server.reset();
+}
+
 BOOST_AUTO_TEST_CASE(Netio_Socket_TCP) {
     using namespace std::chrono_literals;
 
@@ -149,3 +183,18 @@ BOOST_AUTO_TEST_CASE(Netio_Socket_UDP) {
 
     BOOST_CHECK(udp_called);
 }
+
+BOOST_AUTO_TEST_CASE(Netio_Socket_UNIX) {
+    using namespace std::chrono_literals;
+
+    std::thread ev_thread(ev_thread_callable);
+
+    BOOST_CHECK_NO_THROW(run_unix_test()); // TODO put in own test while keeping same ev loop setup
+
+    // Sleep one second without using ev timer
+    std::this_thread::sleep_for(500ms);
+
+    ev_thread.join();
+
+    BOOST_CHECK(unix_called);
+}