Fill test disk partitions with random noise to expose more bugs.
[dcpomatic.git] / test / socket_test.cc
index 562d106396bb193ff8beec53b6280938a4b9c973..bcdbcd7246f7cde15ffac522d3824260f13f90cb 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2020 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2020-2021 Carl Hetherington <cth@carlh.net>
 
     This file is part of DCP-o-matic.
 
 
 */
 
-#include "lib/server.h"
+
 #include "lib/dcpomatic_socket.h"
-#include <boost/thread.hpp>
+#include "lib/server.h"
+#include <dcp/raw_convert.h>
 #include <boost/test/unit_test.hpp>
-#include <boost/shared_ptr.hpp>
+#include <boost/thread.hpp>
 #include <cstring>
 #include <iostream>
 
-using boost::shared_ptr;
+
+using std::make_shared;
+using std::shared_ptr;
+using std::string;
 using boost::bind;
 
+
 #define TEST_SERVER_PORT 9142
 #define TEST_SERVER_BUFFER_LENGTH 1024
 
@@ -38,7 +43,7 @@ class TestServer : public Server
 public:
        TestServer (bool digest)
                : Server (TEST_SERVER_PORT, 30)
-               , _buffer (new uint8_t[TEST_SERVER_BUFFER_LENGTH])
+               , _buffer (TEST_SERVER_BUFFER_LENGTH)
                , _size (0)
                , _result (false)
                , _digest (digest)
@@ -48,9 +53,11 @@ public:
 
        ~TestServer ()
        {
+               boost::this_thread::disable_interruption dis;
                stop ();
-               _thread.join ();
-               delete[] _buffer;
+               try {
+                       _thread.join ();
+               } catch (...) {}
        }
 
        void expect (int size)
@@ -60,7 +67,7 @@ public:
        }
 
        uint8_t const * buffer() const {
-               return _buffer;
+               return _buffer.data();
        }
 
        void await ()
@@ -76,18 +83,18 @@ public:
        }
 
 private:
-       void handle (boost::shared_ptr<Socket> socket)
+       void handle (std::shared_ptr<Socket> socket) override
        {
                boost::mutex::scoped_lock lm (_mutex);
                BOOST_REQUIRE (_size);
                if (_digest) {
                        Socket::ReadDigestScope ds (socket);
-                       socket->read (_buffer, _size);
+                       socket->read (_buffer.data(), _size);
                        _size = 0;
                        _condition.notify_one ();
                        _result = ds.check();
                } else {
-                       socket->read (_buffer, _size);
+                       socket->read (_buffer.data(), _size);
                        _size = 0;
                        _condition.notify_one ();
                }
@@ -96,7 +103,7 @@ private:
        boost::thread _thread;
        boost::mutex _mutex;
        boost::condition _condition;
-       uint8_t* _buffer;
+       std::vector<uint8_t> _buffer;
        int _size;
        bool _result;
        bool _digest;
@@ -109,14 +116,22 @@ send (shared_ptr<Socket> socket, char const* message)
        socket->write (reinterpret_cast<uint8_t const *>(message), strlen(message) + 1);
 }
 
+
 /** Basic test to see if Socket can send and receive data */
 BOOST_AUTO_TEST_CASE (socket_basic_test)
 {
+       using boost::asio::ip::tcp;
+
        TestServer server(false);
        server.expect (13);
 
-       shared_ptr<Socket> socket (new Socket);
-       socket->connect (boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), TEST_SERVER_PORT));
+       boost::asio::io_service io_service;
+       tcp::resolver resolver (io_service);
+       tcp::resolver::query query ("127.0.0.1", dcp::raw_convert<string>(TEST_SERVER_PORT));
+       tcp::resolver::iterator endpoint_iterator = resolver.resolve (query);
+
+       auto socket = make_shared<Socket>();
+       socket->connect (*endpoint_iterator);
        send (socket, "Hello world!");
 
        server.await ();
@@ -127,11 +142,18 @@ BOOST_AUTO_TEST_CASE (socket_basic_test)
 /** Check that the socket "auto-digest" creation works */
 BOOST_AUTO_TEST_CASE (socket_digest_test1)
 {
+       using boost::asio::ip::tcp;
+
        TestServer server(false);
        server.expect (13 + 16);
 
+       boost::asio::io_service io_service;
+       tcp::resolver resolver (io_service);
+       tcp::resolver::query query ("127.0.0.1", dcp::raw_convert<string>(TEST_SERVER_PORT));
+       tcp::resolver::iterator endpoint_iterator = resolver.resolve (query);
+
        shared_ptr<Socket> socket(new Socket);
-       socket->connect (boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), TEST_SERVER_PORT));
+       socket->connect (*endpoint_iterator);
        {
                Socket::WriteDigestScope ds(socket);
                send (socket, "Hello world!");
@@ -149,11 +171,18 @@ BOOST_AUTO_TEST_CASE (socket_digest_test1)
 /** Check that the socket "auto-digest" round-trip works */
 BOOST_AUTO_TEST_CASE (socket_digest_test2)
 {
+       using boost::asio::ip::tcp;
+
        TestServer server(true);
        server.expect (13);
 
+       boost::asio::io_service io_service;
+       tcp::resolver resolver (io_service);
+       tcp::resolver::query query ("127.0.0.1", dcp::raw_convert<string>(TEST_SERVER_PORT));
+       tcp::resolver::iterator endpoint_iterator = resolver.resolve (query);
+
        shared_ptr<Socket> socket(new Socket);
-       socket->connect (boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), TEST_SERVER_PORT));
+       socket->connect (*endpoint_iterator);
        {
                Socket::WriteDigestScope ds(socket);
                send (socket, "Hello world!");