/*
 *  IXTest.h
 *  Author: Benjamin Sergeant
 *  Copyright (c) 2018 Machine Zone. All rights reserved.
 */

#pragma once

#include <string>
#include <vector>
#include <sstream>
#include <iostream>
#include <mutex>

namespace ix
{
    // Sleep for ms milliseconds.
    void msleep(int ms);

    // Generate a relatively random string
    std::string generateSessionId();

    // Record and report websocket traffic
    void setupWebSocketTrafficTrackerCallback();
    void reportWebSocketTraffic();

    struct Logger
    {
        public:
            Logger& operator<<(const std::string& msg)
            {
                std::lock_guard<std::mutex> lock(_mutex);

                std::cerr << msg;
                std::cerr << std::endl;
                return *this;
            }

            template <typename T>
            Logger& operator<<(T const& obj)
            {
                std::lock_guard<std::mutex> lock(_mutex);

                std::cerr << obj;
                std::cerr << std::endl;
                return *this;
            }

        private:
            static std::mutex _mutex;
    };

    void log(const std::string& msg);

    bool computeFreePorts(int count);
    int getFreePort();
}