mirror of
https://github.com/wpilibsuite/allwpilib
synced 2026-06-20 00:51:42 +00:00
wpiutil: Add WebSocket implementation (#1186)
This is a RFC 6455 compliant implementation with both client and server support.
This commit is contained in:
73
wpiutil/src/test/native/cpp/WebSocketTest.h
Normal file
73
wpiutil/src/test/native/cpp/WebSocketTest.h
Normal file
@@ -0,0 +1,73 @@
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* 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
|
||||
Reference in New Issue
Block a user