blob: 8b40440ec5ff88f6ae9c39e9b317415aa330d570 [file] [log] [blame]
/*----------------------------------------------------------------------------*/
/* Copyright (c) 2018 FIRST. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
/*----------------------------------------------------------------------------*/
#pragma once
#include <cstdio>
#include <memory>
#include <vector>
#include "gtest/gtest.h"
#include "wpi/ArrayRef.h"
#include "wpi/uv/Loop.h"
#include "wpi/uv/Pipe.h"
#include "wpi/uv/Timer.h"
namespace wpi {
class WebSocketTest : public ::testing::Test {
public:
static const char* pipeName;
static void SetUpTestCase();
WebSocketTest() {
loop = uv::Loop::Create();
clientPipe = uv::Pipe::Create(loop);
serverPipe = uv::Pipe::Create(loop);
serverPipe->Bind(pipeName);
#if 0
auto debugTimer = uv::Timer::Create(loop);
debugTimer->timeout.connect([this] {
std::printf("Active handles:\n");
uv_print_active_handles(loop->GetRaw(), stdout);
});
debugTimer->Start(uv::Timer::Time{100}, uv::Timer::Time{100});
debugTimer->Unreference();
#endif
auto failTimer = uv::Timer::Create(loop);
failTimer->timeout.connect([this] {
loop->Stop();
FAIL() << "loop failed to terminate";
});
failTimer->Start(uv::Timer::Time{1000});
failTimer->Unreference();
}
~WebSocketTest() { Finish(); }
void Finish() {
loop->Walk([](uv::Handle& it) { it.Close(); });
}
static std::vector<uint8_t> BuildHeader(uint8_t opcode, bool fin,
bool masking, uint64_t len);
static std::vector<uint8_t> BuildMessage(uint8_t opcode, bool fin,
bool masking,
ArrayRef<uint8_t> data);
static void AdjustMasking(MutableArrayRef<uint8_t> message);
static const uint8_t testMask[4];
std::shared_ptr<uv::Loop> loop;
std::shared_ptr<uv::Pipe> clientPipe;
std::shared_ptr<uv::Pipe> serverPipe;
};
} // namespace wpi