This commit is contained in:
Manoj Ampalam 2016-02-29 13:59:23 -08:00
parent 684470e9f2
commit c2cbcaab0b
8 changed files with 1134 additions and 277 deletions

View File

@ -1,220 +0,0 @@
#include "CppUnitTest.h"
extern "C" {
#include "..\win32posix\w32posix.h"
}
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
#define PORT "34912"
#define BACKLOG 2
int
unset_nonblock(int fd)
{
int val;
val = fcntl(fd, F_GETFL, 0);
if (val < 0) {
return (-1);
}
if (!(val & O_NONBLOCK)) {
return (0);
}
val &= ~O_NONBLOCK;
if (fcntl(fd, F_SETFL, val) == -1) {
return (-1);
}
return (0);
}
int
set_nonblock(int fd)
{
int val;
val = fcntl(fd, F_GETFL, 0);
if (val < 0) {
return (-1);
}
if (val & O_NONBLOCK) {
return (0);
}
val |= O_NONBLOCK;
if (fcntl(fd, F_SETFL, val) == -1) {
return (-1);
}
return (0);
}
int listen_fd = -1;
int accept_fd = -1;
int connect_fd = -1;
addrinfo *servinfo;
int socket_prepare(char* ip)
{
addrinfo hints;
memset(&hints, 0, sizeof(hints));
hints.ai_socktype = SOCK_STREAM;
if (getaddrinfo(ip, PORT, &hints, &servinfo) == -1)
return -1;
listen_fd = socket(servinfo->ai_family, servinfo->ai_socktype, servinfo->ai_protocol);
connect_fd = socket(servinfo->ai_family, servinfo->ai_socktype, servinfo->ai_protocol);
if ((listen_fd == -1) || (connect_fd == -1))
return -1;
if (-1 == bind(listen_fd, servinfo->ai_addr, servinfo->ai_addrlen))
return -1;
if (-1 == listen(listen_fd, BACKLOG))
return -1;
return 0;
}
#define READ_BUf_SIZE 1024 * 100
#define WRITE_BUF_SIZE 1024 * 100
namespace UnitTests
{
TEST_CLASS(SocketIOTests)
{
public:
TEST_METHOD_INITIALIZE(TestMethodInitialize)
{
w32posix_initialize();
listen_fd = -1;
accept_fd = -1;
connect_fd = -1;
servinfo = NULL;
}
TEST_METHOD_CLEANUP(TestMethodCleanup)
{
if (servinfo) freeaddrinfo(servinfo);
if (listen_fd != -1) close(listen_fd);
if (connect_fd != -1) close(connect_fd);
if (accept_fd != -1) close(accept_fd);
w32posix_done();
}
TEST_METHOD(socketio)
{
int ret;
ret = socket_prepare("127.0.0.1");
Assert::AreEqual(ret, 0, L"failed to prepare sockets", LINE_INFO());
ret = connect(connect_fd, servinfo->ai_addr, servinfo->ai_addrlen);
Assert::AreEqual(ret, 0, L"", LINE_INFO());
accept_fd = accept(listen_fd, NULL, NULL);
Assert::AreNotEqual(accept_fd, -1, L"", LINE_INFO());
//close(listen_fd);
//listen_fd = -1;
int c = connect_fd;
int s = accept_fd;
set_nonblock(c);
set_nonblock(s);
char *to_write = (char*)malloc(WRITE_BUF_SIZE);
char *read_to = (char*)malloc(READ_BUf_SIZE);
//write from c, read from s
fd_set read_set;
fd_set write_set;
FD_ZERO(&read_set);
FD_ZERO(&write_set);
FD_SET(s, &read_set);
FD_SET(c, &write_set);
int max_fd = max(c, s) + 1;
timeval time;
time.tv_sec = 60 * 60;
time.tv_usec = 0;
long long bytes_written = 0;
long long bytes_read = 0;
while (-1 != select(max_fd, &read_set, &write_set, NULL, &time))
{
BOOL read_ready = FD_ISSET(s, &read_set);
BOOL write_ready = FD_ISSET(c, &write_set);
FD_ZERO(&read_set);
FD_ZERO(&write_set);
FD_SET(s, &read_set);
if (write_ready)
{
#define WR_LIMIT WRITE_BUF_SIZE*5
int bw = 0;// send(c, to_write, WRITE_BUF_SIZE, 0);
while ((bw != -1) && (bytes_written < WR_LIMIT)) {
bw = send(c, to_write, WRITE_BUF_SIZE, 0);
if (bw > 0)
bytes_written += bw;
else {
ret = errno;
Assert::AreEqual(errno, EAGAIN, L"", LINE_INFO());
}
}
if (bytes_written >= WR_LIMIT)
{
ret = shutdown(c, SD_SEND), 0, L"", LINE_INFO();
Assert::AreEqual(ret, 0, L"", LINE_INFO());
}
else
FD_SET(c, &write_set);
}
if (read_ready)
{
int br = read(s, read_to, READ_BUf_SIZE);
while (br > 1) {
bytes_read += br;
br = read(s, read_to, READ_BUf_SIZE);
}
if (br == 0) //send from other side is done
break;
ret = errno;
Assert::AreEqual(errno, EAGAIN, L"", LINE_INFO());
}
}
Assert::AreEqual((bytes_written == bytes_read)? 1:0, TRUE, L"", LINE_INFO());
}
TEST_METHOD(TestMethod)
{
fd_set* set = (fd_set*)malloc(sizeof(fd_set));
FD_ZERO(set);
FD_SET(0, set);
FD_SET(1, set);
Assert::AreEqual(1, FD_ISSET(0, set), L"", LINE_INFO());
Assert::AreEqual(1, FD_ISSET(1, set), L"", LINE_INFO());
Assert::AreEqual(0, FD_ISSET(2, set), L"", LINE_INFO());
FD_CLR(0, set);
FD_CLR(1, set);
Assert::AreEqual(0, FD_ISSET(0, set), L"", LINE_INFO());
Assert::AreEqual(0, FD_ISSET(1, set), L"", LINE_INFO());
Assert::AreEqual(0, FD_ISSET(2, set), L"", LINE_INFO());
}
};
}

View File

@ -5,159 +5,154 @@
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{76AFACE0-9135-4D82-9A65-3B82084211E6}</ProjectGuid>
<ProjectGuid>{31E868FF-DE6C-4CF7-9BF0-2C9B51DB58AD}</ProjectGuid>
<Keyword>Win32Proj</Keyword>
<RootNamespace>Tests</RootNamespace>
<RootNamespace>UnitTests</RootNamespace>
<WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v140</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
<UseOfMfc>false</UseOfMfc>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v140</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
<UseOfMfc>false</UseOfMfc>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v140</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
<UseOfMfc>false</UseOfMfc>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v140</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v140</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
<UseOfMfc>false</UseOfMfc>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
<ImportGroup Label="Shared">
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<LinkIncremental>true</LinkIncremental>
<OutDir>$(SolutionDir)bin\tests\$(Platform)\$(Configuration)\</OutDir>
<OutDir>$(SolutionDir)bin\unittests\$(Platform)\$(Configuration)\</OutDir>
<IntDir>$(Platform)\$(Configuration)\$(TargetName)\</IntDir>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<LinkIncremental>true</LinkIncremental>
<OutDir>$(SolutionDir)bin\tests\$(Platform)\$(Configuration)\</OutDir>
<IntDir>$(SolutionDir)bin\int\$(Platform)\$(Configuration)\</IntDir>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>true</LinkIncremental>
<LinkIncremental>false</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<LinkIncremental>true</LinkIncremental>
<LinkIncremental>false</LinkIncremental>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<PrecompiledHeader>
</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>$(VCInstallDir)UnitTest\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<UseFullPaths>true</UseFullPaths>
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>$(SolutionDir)\win32posix</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalLibraryDirectories>$(VCInstallDir)UnitTest\lib;%(AdditionalLibraryDirectories);$(SolutionDir)bin\lib\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
<AdditionalDependencies>Ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);win32posix.lib</AdditionalDependencies>
<AdditionalLibraryDirectories>$(SolutionDir)bin\lib\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
<AdditionalDependencies>Ws2_32.lib;win32posix.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<PrecompiledHeader>
</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>$(VCInstallDir)UnitTest\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<UseFullPaths>true</UseFullPaths>
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalLibraryDirectories>$(VCInstallDir)UnitTest\lib;%(AdditionalLibraryDirectories);$(SolutionDir)bin\lib\$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
<AdditionalDependencies>Ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);win32posix.lib</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<PrecompiledHeader>Use</PrecompiledHeader>
<PrecompiledHeader>
</PrecompiledHeader>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<AdditionalIncludeDirectories>$(VCInstallDir)UnitTest\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<UseFullPaths>true</UseFullPaths>
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<AdditionalLibraryDirectories>$(VCInstallDir)UnitTest\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<PrecompiledHeader>Use</PrecompiledHeader>
<PrecompiledHeader>
</PrecompiledHeader>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<AdditionalIncludeDirectories>$(VCInstallDir)UnitTest\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<UseFullPaths>true</UseFullPaths>
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<AdditionalLibraryDirectories>$(VCInstallDir)UnitTest\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="socketiotests.cpp" />
<ClCompile Include="tests.c" />
<ClCompile Include="test_helper.c" />
<ClCompile Include="socket_tests.c" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="test_helper.h" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">

View File

@ -15,8 +15,19 @@
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="socketiotests.cpp">
<ClCompile Include="test_helper.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="tests.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="socket_tests.c">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="test_helper.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
</Project>

View File

@ -0,0 +1,202 @@
#include "w32posix.h"
#include "test_helper.h"
#define PORT "34912"
#define BACKLOG 2
int
unset_nonblock(int fd)
{
int val;
val = fcntl(fd, F_GETFL, 0);
if (val < 0) {
return (-1);
}
if (!(val & O_NONBLOCK)) {
return (0);
}
val &= ~O_NONBLOCK;
if (fcntl(fd, F_SETFL, val) == -1) {
return (-1);
}
return (0);
}
int
set_nonblock(int fd)
{
int val;
val = fcntl(fd, F_GETFL, 0);
if (val < 0) {
return (-1);
}
if (val & O_NONBLOCK) {
return (0);
}
val |= O_NONBLOCK;
if (fcntl(fd, F_SETFL, val) == -1) {
return (-1);
}
return (0);
}
int listen_fd = -1;
int accept_fd = -1;
int connect_fd = -1;
struct addrinfo *servinfo;
void socket_tests()
{
TEST_START("test 1");
ASSERT_INT_EQ(1, 1);
w32posix_initialize();
TEST_DONE();
TEST_START("test 1");
ASSERT_INT_EQ(1, 0);
TEST_DONE();
TEST_START("test 1");
ASSERT_INT_EQ(1, 1);
TEST_DONE();
TEST_START("test 1");
ASSERT_INT_EQ(1, 1);
TEST_DONE();
return;
}
int socket_prepare(char* ip)
{
struct addrinfo hints;
memset(&hints, 0, sizeof(hints));
hints.ai_socktype = SOCK_STREAM;
if (getaddrinfo(ip, PORT, &hints, &servinfo) == -1)
return -1;
listen_fd = socket(servinfo->ai_family, servinfo->ai_socktype, servinfo->ai_protocol);
connect_fd = socket(servinfo->ai_family, servinfo->ai_socktype, servinfo->ai_protocol);
if ((listen_fd == -1) || (connect_fd == -1))
return -1;
if (-1 == bind(listen_fd, servinfo->ai_addr, servinfo->ai_addrlen))
return -1;
if (-1 == listen(listen_fd, BACKLOG))
return -1;
return 0;
}
#define READ_BUf_SIZE 1024 * 100
#define WRITE_BUF_SIZE 1024 * 100
void sample()
{
w32posix_initialize();
listen_fd = -1;
accept_fd = -1;
connect_fd = -1;
servinfo = NULL;
int ret;
ret = socket_prepare("127.0.0.1");
//Assert::AreEqual(ret, 0);
ret = connect(connect_fd, servinfo->ai_addr, servinfo->ai_addrlen);
accept_fd = accept(listen_fd, NULL, NULL);
//Assert::AreNotEqual(accept_fd, -1, L"", LINE_INFO());
//close(listen_fd);
//listen_fd = -1;
int c = connect_fd;
int s = accept_fd;
set_nonblock(c);
set_nonblock(s);
char *to_write = (char*)malloc(WRITE_BUF_SIZE);
char *read_to = (char*)malloc(READ_BUf_SIZE);
//write from c, read from s
fd_set read_set;
fd_set write_set;
FD_ZERO(&read_set);
FD_ZERO(&write_set);
FD_SET(s, &read_set);
FD_SET(c, &write_set);
int max_fd = max(c, s) + 1;
struct timeval time;
time.tv_sec = 60 * 60;
time.tv_usec = 0;
long long bytes_written = 0;
long long bytes_read = 0;
while (-1 != select(max_fd, &read_set, &write_set, NULL, &time))
{
BOOL read_ready = FD_ISSET(s, &read_set);
BOOL write_ready = FD_ISSET(c, &write_set);
FD_ZERO(&read_set);
FD_ZERO(&write_set);
FD_SET(s, &read_set);
if (write_ready)
{
#define WR_LIMIT WRITE_BUF_SIZE*5
int bw = 0;// send(c, to_write, WRITE_BUF_SIZE, 0);
while ((bw != -1) && (bytes_written < WR_LIMIT)) {
bw = send(c, to_write, WRITE_BUF_SIZE, 0);
if (bw > 0)
bytes_written += bw;
else {
ret = errno;
//Assert::AreEqual(errno, EAGAIN, L"", LINE_INFO());
}
}
if (bytes_written >= WR_LIMIT)
{
ret = shutdown(c, SD_SEND);
//Assert::AreEqual(ret, 0, L"", LINE_INFO());
}
else
FD_SET(c, &write_set);
}
if (read_ready)
{
int br = read(s, read_to, READ_BUf_SIZE);
while (br > 1) {
bytes_read += br;
br = read(s, read_to, READ_BUf_SIZE);
}
if (br == 0) //send from other side is done
break;
ret = errno;
//Assert::AreEqual(errno, EAGAIN, L"", LINE_INFO());
}
}
//Assert::AreEqual((bytes_written == bytes_read) ? 1 : 0, TRUE, L"", LINE_INFO());
if (servinfo) freeaddrinfo(servinfo);
if (listen_fd != -1) close(listen_fd);
if (connect_fd != -1) close(connect_fd);
if (accept_fd != -1) close(accept_fd);
w32posix_done();
}

View File

@ -0,0 +1,535 @@
/* $OpenBSD: test_helper.c,v 1.6 2015/03/03 20:42:49 djm Exp $ */
/*
* Copyright (c) 2011 Damien Miller <djm@mindrot.org>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/* Utility functions/framework for regress tests */
//#include "includes.h"
#include <sys/types.h>
//#include <sys/param.h>
//#include <sys/uio.h>
#include <fcntl.h>
#include <stdio.h>
#ifdef HAVE_STDINT_H
# include <stdint.h>
#endif
#include <stdlib.h>
#include <string.h>
#include <assert.h>
//#include <unistd.h>
#include <signal.h>
//#include <openssl/bn.h>
#if defined(HAVE_STRNVIS) && defined(HAVE_VIS_H) && !defined(BROKEN_STRNVIS)
# include <vis.h>
#endif
#include "test_helper.h"
//#include "atomicio.h"
#define TEST_CHECK_INT(r, pred) do { \
switch (pred) { \
case TEST_EQ: \
if (r == 0) \
return; \
break; \
case TEST_NE: \
if (r != 0) \
return; \
break; \
case TEST_LT: \
if (r < 0) \
return; \
break; \
case TEST_LE: \
if (r <= 0) \
return; \
break; \
case TEST_GT: \
if (r > 0) \
return; \
break; \
case TEST_GE: \
if (r >= 0) \
return; \
break; \
default: \
abort(); \
} \
} while (0)
#define TEST_CHECK(x1, x2, pred) do { \
switch (pred) { \
case TEST_EQ: \
if (x1 == x2) \
return; \
break; \
case TEST_NE: \
if (x1 != x2) \
return; \
break; \
case TEST_LT: \
if (x1 < x2) \
return; \
break; \
case TEST_LE: \
if (x1 <= x2) \
return; \
break; \
case TEST_GT: \
if (x1 > x2) \
return; \
break; \
case TEST_GE: \
if (x1 >= x2) \
return; \
break; \
default: \
abort(); \
} \
} while (0)
char *__progname;
static int verbose_mode = 0;
static int quiet_mode = 0;
static char *active_test_name = NULL;
static u_int test_number = 0;
static test_onerror_func_t *test_onerror = NULL;
static void *onerror_ctx = NULL;
static const char *data_dir = NULL;
static char subtest_info[512];
#ifndef WIN32_FIXME
void fatal(const char *fmt,...) {/*stub*/}
void logit(const char *fmt,...) {/*stub*/}
void debug3(const char *fmt,...) {/*stub*/}
#endif
int
main(int argc, char **argv)
{
int ch;
__progname = NULL;
/* Handle systems without __progname */
if (__progname == NULL) {
__progname = strrchr(argv[0], '\\');
if (__progname == NULL || __progname[1] == '\0')
__progname = argv[0];
else
__progname++;
if ((__progname = strdup(__progname)) == NULL) {
fprintf(stderr, "strdup failed\n");
exit(1);
}
}
//while ((ch = getopt(argc, argv, "vqd:")) != -1) {
// switch (ch) {
// case 'd':
// //data_dir = optarg;
// break;
// case 'q':
// verbose_mode = 0;
// quiet_mode = 1;
// break;
// case 'v':
// verbose_mode = 1;
// quiet_mode = 0;
// break;
// default:
// fprintf(stderr, "Unrecognised command line option\n");
// fprintf(stderr, "Usage: %s [-v]\n", __progname);
// exit(1);
// }
//}
verbose_mode = 1;
quiet_mode = 0;
setvbuf(stdout, NULL, _IONBF, 0);
if (!quiet_mode)
printf("%s: ", __progname);
if (verbose_mode)
printf("\n");
tests();
if (!quiet_mode)
printf(" %u tests ok\n", test_number);
return 0;
}
#ifndef WIN32_FIXME
const char *
test_data_file(const char *name)
{
static char ret[PATH_MAX];
if (data_dir != NULL)
snprintf(ret, sizeof(ret), "%s/%s", data_dir, name);
else
strlcpy(ret, name, sizeof(ret));
if (access(ret, F_OK) != 0) {
fprintf(stderr, "Cannot access data file %s: %s\n",
ret, strerror(errno));
exit(1);
}
return ret;
}
#endif
void
test_info(char *s, size_t len)
{
snprintf(s, len, "In test %u: \"%s\"%s%s\n", test_number,
active_test_name == NULL ? "<none>" : active_test_name,
*subtest_info != '\0' ? " - " : "", subtest_info);
}
#ifdef SIGINFO
static void
siginfo(int unused __attribute__((__unused__)))
{
char buf[256];
test_info(buf, sizeof(buf));
atomicio(vwrite, STDERR_FILENO, buf, strlen(buf));
}
#endif
void
test_start(const char *n)
{
assert(active_test_name == NULL);
assert((active_test_name = strdup(n)) != NULL);
*subtest_info = '\0';
if (verbose_mode)
printf("test %u - \"%s\": ", test_number, active_test_name);
test_number++;
#ifdef SIGINFO
signal(SIGINFO, siginfo);
#endif
}
void
set_onerror_func(test_onerror_func_t *f, void *ctx)
{
test_onerror = f;
onerror_ctx = ctx;
}
void
test_done(void)
{
*subtest_info = '\0';
assert(active_test_name != NULL);
free(active_test_name);
active_test_name = NULL;
if (verbose_mode)
printf("OK\n");
else if (!quiet_mode) {
printf(".");
fflush(stdout);
}
}
void
test_subtest_info(const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
vsnprintf(subtest_info, sizeof(subtest_info), fmt, ap);
va_end(ap);
}
//void
//ssl_err_check(const char *file, int line)
//{
// long openssl_error = ERR_get_error();
//
// if (openssl_error == 0)
// return;
//
// fprintf(stderr, "\n%s:%d: uncaught OpenSSL error: %s",
// file, line, ERR_error_string(openssl_error, NULL));
// abort();
//}
static const char *
pred_name(enum test_predicate p)
{
switch (p) {
case TEST_EQ:
return "EQ";
case TEST_NE:
return "NE";
case TEST_LT:
return "LT";
case TEST_LE:
return "LE";
case TEST_GT:
return "GT";
case TEST_GE:
return "GE";
default:
return "UNKNOWN";
}
}
static void
test_die(void)
{
if (test_onerror != NULL)
test_onerror(onerror_ctx);
abort();
}
static void
test_header(const char *file, int line, const char *a1, const char *a2,
const char *name, enum test_predicate pred)
{
fprintf(stderr, "\n%s:%d test #%u \"%s\"%s%s\n",
file, line, test_number, active_test_name,
*subtest_info != '\0' ? " - " : "", subtest_info);
fprintf(stderr, "ASSERT_%s_%s(%s%s%s) failed:\n",
name, pred_name(pred), a1,
a2 != NULL ? ", " : "", a2 != NULL ? a2 : "");
}
//void
//assert_bignum(const char *file, int line, const char *a1, const char *a2,
// const BIGNUM *aa1, const BIGNUM *aa2, enum test_predicate pred)
//{
// int r = BN_cmp(aa1, aa2);
//
// TEST_CHECK_INT(r, pred);
// test_header(file, line, a1, a2, "BIGNUM", pred);
// fprintf(stderr, "%12s = 0x%s\n", a1, BN_bn2hex(aa1));
// fprintf(stderr, "%12s = 0x%s\n", a2, BN_bn2hex(aa2));
// test_die();
//}
void
assert_string(const char *file, int line, const char *a1, const char *a2,
const char *aa1, const char *aa2, enum test_predicate pred)
{
int r;
/* Verify pointers are not NULL */
assert_ptr(file, line, a1, "NULL", aa1, NULL, TEST_NE);
assert_ptr(file, line, a2, "NULL", aa2, NULL, TEST_NE);
r = strcmp(aa1, aa2);
TEST_CHECK_INT(r, pred);
test_header(file, line, a1, a2, "STRING", pred);
fprintf(stderr, "%12s = %s (len %zu)\n", a1, aa1, strlen(aa1));
fprintf(stderr, "%12s = %s (len %zu)\n", a2, aa2, strlen(aa2));
test_die();
}
static char *
tohex(const void *_s, size_t l)
{
u_int8_t *s = (u_int8_t *)_s;
size_t i, j;
const char *hex = "0123456789abcdef";
char *r = malloc((l * 2) + 1);
assert(r != NULL);
for (i = j = 0; i < l; i++) {
r[j++] = hex[(s[i] >> 4) & 0xf];
r[j++] = hex[s[i] & 0xf];
}
r[j] = '\0';
return r;
}
void
assert_mem(const char *file, int line, const char *a1, const char *a2,
const void *aa1, const void *aa2, size_t l, enum test_predicate pred)
{
int r;
if (l == 0)
return;
/* If length is >0, then verify pointers are not NULL */
assert_ptr(file, line, a1, "NULL", aa1, NULL, TEST_NE);
assert_ptr(file, line, a2, "NULL", aa2, NULL, TEST_NE);
r = memcmp(aa1, aa2, l);
TEST_CHECK_INT(r, pred);
test_header(file, line, a1, a2, "STRING", pred);
fprintf(stderr, "%12s = %s (len %zu)\n", a1, tohex(aa1, MIN(l, 256)), l);
fprintf(stderr, "%12s = %s (len %zu)\n", a2, tohex(aa2, MIN(l, 256)), l);
test_die();
}
static int
memvalcmp(const u_int8_t *s, u_char v, size_t l, size_t *where)
{
size_t i;
for (i = 0; i < l; i++) {
if (s[i] != v) {
*where = i;
return 1;
}
}
return 0;
}
void
assert_mem_filled(const char *file, int line, const char *a1,
const void *aa1, u_char v, size_t l, enum test_predicate pred)
{
size_t where = -1;
int r;
char tmp[64];
if (l == 0)
return;
/* If length is >0, then verify the pointer is not NULL */
assert_ptr(file, line, a1, "NULL", aa1, NULL, TEST_NE);
r = memvalcmp(aa1, v, l, &where);
TEST_CHECK_INT(r, pred);
test_header(file, line, a1, NULL, "MEM_ZERO", pred);
fprintf(stderr, "%20s = %s%s (len %zu)\n", a1,
tohex(aa1, MIN(l, 20)), l > 20 ? "..." : "", l);
snprintf(tmp, sizeof(tmp), "(%s)[%zu]", a1, where);
fprintf(stderr, "%20s = 0x%02x (expected 0x%02x)\n", tmp,
((u_char *)aa1)[where], v);
test_die();
}
void
assert_int(const char *file, int line, const char *a1, const char *a2,
int aa1, int aa2, enum test_predicate pred)
{
TEST_CHECK(aa1, aa2, pred);
test_header(file, line, a1, a2, "INT", pred);
fprintf(stderr, "%12s = %d\n", a1, aa1);
fprintf(stderr, "%12s = %d\n", a2, aa2);
test_die();
}
void
assert_size_t(const char *file, int line, const char *a1, const char *a2,
size_t aa1, size_t aa2, enum test_predicate pred)
{
TEST_CHECK(aa1, aa2, pred);
test_header(file, line, a1, a2, "SIZE_T", pred);
fprintf(stderr, "%12s = %zu\n", a1, aa1);
fprintf(stderr, "%12s = %zu\n", a2, aa2);
test_die();
}
void
assert_u_int(const char *file, int line, const char *a1, const char *a2,
u_int aa1, u_int aa2, enum test_predicate pred)
{
TEST_CHECK(aa1, aa2, pred);
test_header(file, line, a1, a2, "U_INT", pred);
fprintf(stderr, "%12s = %u / 0x%x\n", a1, aa1, aa1);
fprintf(stderr, "%12s = %u / 0x%x\n", a2, aa2, aa2);
test_die();
}
void
assert_long_long(const char *file, int line, const char *a1, const char *a2,
long long aa1, long long aa2, enum test_predicate pred)
{
TEST_CHECK(aa1, aa2, pred);
test_header(file, line, a1, a2, "LONG LONG", pred);
fprintf(stderr, "%12s = %lld / 0x%llx\n", a1, aa1, aa1);
fprintf(stderr, "%12s = %lld / 0x%llx\n", a2, aa2, aa2);
test_die();
}
void
assert_char(const char *file, int line, const char *a1, const char *a2,
char aa1, char aa2, enum test_predicate pred)
{
char buf[8];
TEST_CHECK(aa1, aa2, pred);
test_header(file, line, a1, a2, "CHAR", pred);
//fprintf(stderr, "%12s = '%s' / 0x02%x\n", a1,
// vis(buf, aa1, VIS_SAFE|VIS_NL|VIS_TAB|VIS_OCTAL, 0), aa1);
//fprintf(stderr, "%12s = '%s' / 0x02%x\n", a1,
// vis(buf, aa2, VIS_SAFE|VIS_NL|VIS_TAB|VIS_OCTAL, 0), aa2);
test_die();
}
void
assert_u8(const char *file, int line, const char *a1, const char *a2,
u_int8_t aa1, u_int8_t aa2, enum test_predicate pred)
{
TEST_CHECK(aa1, aa2, pred);
test_header(file, line, a1, a2, "U8", pred);
fprintf(stderr, "%12s = 0x%02x %u\n", a1, aa1, aa1);
fprintf(stderr, "%12s = 0x%02x %u\n", a2, aa2, aa2);
test_die();
}
void
assert_u16(const char *file, int line, const char *a1, const char *a2,
u_int16_t aa1, u_int16_t aa2, enum test_predicate pred)
{
TEST_CHECK(aa1, aa2, pred);
test_header(file, line, a1, a2, "U16", pred);
fprintf(stderr, "%12s = 0x%04x %u\n", a1, aa1, aa1);
fprintf(stderr, "%12s = 0x%04x %u\n", a2, aa2, aa2);
test_die();
}
void
assert_u32(const char *file, int line, const char *a1, const char *a2,
u_int32_t aa1, u_int32_t aa2, enum test_predicate pred)
{
TEST_CHECK(aa1, aa2, pred);
test_header(file, line, a1, a2, "U32", pred);
fprintf(stderr, "%12s = 0x%08x %u\n", a1, aa1, aa1);
fprintf(stderr, "%12s = 0x%08x %u\n", a2, aa2, aa2);
test_die();
}
void
assert_u64(const char *file, int line, const char *a1, const char *a2,
u_int64_t aa1, u_int64_t aa2, enum test_predicate pred)
{
TEST_CHECK(aa1, aa2, pred);
test_header(file, line, a1, a2, "U64", pred);
fprintf(stderr, "%12s = 0x%016llx %llu\n", a1,
(unsigned long long)aa1, (unsigned long long)aa1);
fprintf(stderr, "%12s = 0x%016llx %llu\n", a2,
(unsigned long long)aa2, (unsigned long long)aa2);
test_die();
}
void
assert_ptr(const char *file, int line, const char *a1, const char *a2,
const void *aa1, const void *aa2, enum test_predicate pred)
{
TEST_CHECK(aa1, aa2, pred);
test_header(file, line, a1, a2, "PTR", pred);
fprintf(stderr, "%12s = %p\n", a1, aa1);
fprintf(stderr, "%12s = %p\n", a2, aa2);
test_die();
}

View File

@ -0,0 +1,310 @@
/* $OpenBSD: test_helper.h,v 1.6 2015/01/18 19:52:44 djm Exp $ */
/*
* Copyright (c) 2011 Damien Miller <djm@mindrot.org>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/* Utility functions/framework for regress tests */
#ifndef _TEST_HELPER_H
#define _TEST_HELPER_H
#define WIN32_FIXME
#define __attribute__
#define u_int8_t unsigned char
#define u_int16_t unsigned short
#define u_int32_t unsigned int
#define u_int64_t unsigned __int64
#define MIN min
//#include "includes.h"
#include <Windows.h>
#include <sys/types.h>
#ifdef HAVE_STDINT_H
# include <stdint.h>
#endif
//#include <openssl/bn.h>
//#include <openssl/err.h>
enum test_predicate {
TEST_EQ, TEST_NE, TEST_LT, TEST_LE, TEST_GT, TEST_GE
};
typedef void (test_onerror_func_t)(void *);
/* Supplied by test suite */
void tests(void);
const char *test_data_file(const char *name);
void test_start(const char *n);
void test_info(char *s, size_t len);
void set_onerror_func(test_onerror_func_t *f, void *ctx);
void test_done(void);
void test_subtest_info(const char *fmt, ...);
// __attribute__((format(printf, 1, 2)));
void ssl_err_check(const char *file, int line);
//void assert_bignum(const char *file, int line,
// const char *a1, const char *a2,
// const BIGNUM *aa1, const BIGNUM *aa2, enum test_predicate pred);
void assert_string(const char *file, int line,
const char *a1, const char *a2,
const char *aa1, const char *aa2, enum test_predicate pred);
void assert_mem(const char *file, int line,
const char *a1, const char *a2,
const void *aa1, const void *aa2, size_t l, enum test_predicate pred);
void assert_mem_filled(const char *file, int line,
const char *a1,
const void *aa1, u_char v, size_t l, enum test_predicate pred);
void assert_int(const char *file, int line,
const char *a1, const char *a2,
int aa1, int aa2, enum test_predicate pred);
void assert_size_t(const char *file, int line,
const char *a1, const char *a2,
size_t aa1, size_t aa2, enum test_predicate pred);
void assert_u_int(const char *file, int line,
const char *a1, const char *a2,
u_int aa1, u_int aa2, enum test_predicate pred);
void assert_long_long(const char *file, int line,
const char *a1, const char *a2,
long long aa1, long long aa2, enum test_predicate pred);
void assert_char(const char *file, int line,
const char *a1, const char *a2,
char aa1, char aa2, enum test_predicate pred);
void assert_ptr(const char *file, int line,
const char *a1, const char *a2,
const void *aa1, const void *aa2, enum test_predicate pred);
void assert_u8(const char *file, int line,
const char *a1, const char *a2,
u_int8_t aa1, u_int8_t aa2, enum test_predicate pred);
void assert_u16(const char *file, int line,
const char *a1, const char *a2,
u_int16_t aa1, u_int16_t aa2, enum test_predicate pred);
void assert_u32(const char *file, int line,
const char *a1, const char *a2,
u_int32_t aa1, u_int32_t aa2, enum test_predicate pred);
void assert_u64(const char *file, int line,
const char *a1, const char *a2,
u_int64_t aa1, u_int64_t aa2, enum test_predicate pred);
#define TEST_START(n) test_start(n)
#define TEST_DONE() test_done()
#define TEST_ONERROR(f, c) set_onerror_func(f, c)
#define SSL_ERR_CHECK() ssl_err_check(__FILE__, __LINE__)
#define ASSERT_BIGNUM_EQ(a1, a2) \
assert_bignum(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_EQ)
#define ASSERT_STRING_EQ(a1, a2) \
assert_string(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_EQ)
#define ASSERT_MEM_EQ(a1, a2, l) \
assert_mem(__FILE__, __LINE__, #a1, #a2, a1, a2, l, TEST_EQ)
#define ASSERT_MEM_FILLED_EQ(a1, c, l) \
assert_mem_filled(__FILE__, __LINE__, #a1, a1, c, l, TEST_EQ)
#define ASSERT_MEM_ZERO_EQ(a1, l) \
assert_mem_filled(__FILE__, __LINE__, #a1, a1, '\0', l, TEST_EQ)
#define ASSERT_INT_EQ(a1, a2) \
assert_int(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_EQ)
#define ASSERT_SIZE_T_EQ(a1, a2) \
assert_size_t(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_EQ)
#define ASSERT_U_INT_EQ(a1, a2) \
assert_u_int(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_EQ)
#define ASSERT_LONG_LONG_EQ(a1, a2) \
assert_long_long(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_EQ)
#define ASSERT_CHAR_EQ(a1, a2) \
assert_char(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_EQ)
#define ASSERT_PTR_EQ(a1, a2) \
assert_ptr(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_EQ)
#define ASSERT_U8_EQ(a1, a2) \
assert_u8(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_EQ)
#define ASSERT_U16_EQ(a1, a2) \
assert_u16(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_EQ)
#define ASSERT_U32_EQ(a1, a2) \
assert_u32(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_EQ)
#define ASSERT_U64_EQ(a1, a2) \
assert_u64(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_EQ)
#define ASSERT_BIGNUM_NE(a1, a2) \
assert_bignum(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_NE)
#define ASSERT_STRING_NE(a1, a2) \
assert_string(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_NE)
#define ASSERT_MEM_NE(a1, a2, l) \
assert_mem(__FILE__, __LINE__, #a1, #a2, a1, a2, l, TEST_NE)
#define ASSERT_MEM_ZERO_NE(a1, l) \
assert_mem_filled(__FILE__, __LINE__, #a1, a1, '\0', l, TEST_NE)
#define ASSERT_INT_NE(a1, a2) \
assert_int(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_NE)
#define ASSERT_SIZE_T_NE(a1, a2) \
assert_size_t(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_NE)
#define ASSERT_U_INT_NE(a1, a2) \
assert_u_int(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_NE)
#define ASSERT_LONG_LONG_NE(a1, a2) \
assert_long_long(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_NE)
#define ASSERT_CHAR_NE(a1, a2) \
assert_char(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_NE)
#define ASSERT_PTR_NE(a1, a2) \
assert_ptr(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_NE)
#define ASSERT_U8_NE(a1, a2) \
assert_u8(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_NE)
#define ASSERT_U16_NE(a1, a2) \
assert_u16(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_NE)
#define ASSERT_U32_NE(a1, a2) \
assert_u32(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_NE)
#define ASSERT_U64_NE(a1, a2) \
assert_u64(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_NE)
#define ASSERT_BIGNUM_LT(a1, a2) \
assert_bignum(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_LT)
#define ASSERT_STRING_LT(a1, a2) \
assert_string(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_LT)
#define ASSERT_MEM_LT(a1, a2, l) \
assert_mem(__FILE__, __LINE__, #a1, #a2, a1, a2, l, TEST_LT)
#define ASSERT_INT_LT(a1, a2) \
assert_int(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_LT)
#define ASSERT_SIZE_T_LT(a1, a2) \
assert_size_t(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_LT)
#define ASSERT_U_INT_LT(a1, a2) \
assert_u_int(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_LT)
#define ASSERT_LONG_LONG_LT(a1, a2) \
assert_long_long(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_LT)
#define ASSERT_CHAR_LT(a1, a2) \
assert_char(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_LT)
#define ASSERT_PTR_LT(a1, a2) \
assert_ptr(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_LT)
#define ASSERT_U8_LT(a1, a2) \
assert_u8(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_LT)
#define ASSERT_U16_LT(a1, a2) \
assert_u16(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_LT)
#define ASSERT_U32_LT(a1, a2) \
assert_u32(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_LT)
#define ASSERT_U64_LT(a1, a2) \
assert_u64(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_LT)
#define ASSERT_BIGNUM_LE(a1, a2) \
assert_bignum(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_LE)
#define ASSERT_STRING_LE(a1, a2) \
assert_string(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_LE)
#define ASSERT_MEM_LE(a1, a2, l) \
assert_mem(__FILE__, __LINE__, #a1, #a2, a1, a2, l, TEST_LE)
#define ASSERT_INT_LE(a1, a2) \
assert_int(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_LE)
#define ASSERT_SIZE_T_LE(a1, a2) \
assert_size_t(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_LE)
#define ASSERT_U_INT_LE(a1, a2) \
assert_u_int(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_LE)
#define ASSERT_LONG_LONG_LE(a1, a2) \
assert_long_long(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_LE)
#define ASSERT_CHAR_LE(a1, a2) \
assert_char(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_LE)
#define ASSERT_PTR_LE(a1, a2) \
assert_ptr(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_LE)
#define ASSERT_U8_LE(a1, a2) \
assert_u8(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_LE)
#define ASSERT_U16_LE(a1, a2) \
assert_u16(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_LE)
#define ASSERT_U32_LE(a1, a2) \
assert_u32(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_LE)
#define ASSERT_U64_LE(a1, a2) \
assert_u64(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_LE)
#define ASSERT_BIGNUM_GT(a1, a2) \
assert_bignum(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_GT)
#define ASSERT_STRING_GT(a1, a2) \
assert_string(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_GT)
#define ASSERT_MEM_GT(a1, a2, l) \
assert_mem(__FILE__, __LINE__, #a1, #a2, a1, a2, l, TEST_GT)
#define ASSERT_INT_GT(a1, a2) \
assert_int(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_GT)
#define ASSERT_SIZE_T_GT(a1, a2) \
assert_size_t(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_GT)
#define ASSERT_U_INT_GT(a1, a2) \
assert_u_int(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_GT)
#define ASSERT_LONG_LONG_GT(a1, a2) \
assert_long_long(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_GT)
#define ASSERT_CHAR_GT(a1, a2) \
assert_char(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_GT)
#define ASSERT_PTR_GT(a1, a2) \
assert_ptr(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_GT)
#define ASSERT_U8_GT(a1, a2) \
assert_u8(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_GT)
#define ASSERT_U16_GT(a1, a2) \
assert_u16(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_GT)
#define ASSERT_U32_GT(a1, a2) \
assert_u32(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_GT)
#define ASSERT_U64_GT(a1, a2) \
assert_u64(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_GT)
#define ASSERT_BIGNUM_GE(a1, a2) \
assert_bignum(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_GE)
#define ASSERT_STRING_GE(a1, a2) \
assert_string(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_GE)
#define ASSERT_MEM_GE(a1, a2, l) \
assert_mem(__FILE__, __LINE__, #a1, #a2, a1, a2, l, TEST_GE)
#define ASSERT_INT_GE(a1, a2) \
assert_int(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_GE)
#define ASSERT_SIZE_T_GE(a1, a2) \
assert_size_t(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_GE)
#define ASSERT_U_INT_GE(a1, a2) \
assert_u_int(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_GE)
#define ASSERT_LONG_LONG_GE(a1, a2) \
assert_long_long(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_GE)
#define ASSERT_CHAR_GE(a1, a2) \
assert_char(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_GE)
#define ASSERT_PTR_GE(a1, a2) \
assert_ptr(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_GE)
#define ASSERT_U8_GE(a1, a2) \
assert_u8(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_GE)
#define ASSERT_U16_GE(a1, a2) \
assert_u16(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_GE)
#define ASSERT_U32_GE(a1, a2) \
assert_u32(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_GE)
#define ASSERT_U64_GE(a1, a2) \
assert_u64(__FILE__, __LINE__, #a1, #a2, a1, a2, TEST_GE)
/* Fuzzing support */
struct fuzz;
#define FUZZ_1_BIT_FLIP 0x00000001 /* Flip one bit at a time */
#define FUZZ_2_BIT_FLIP 0x00000002 /* Flip two bits at a time */
#define FUZZ_1_BYTE_FLIP 0x00000004 /* Flip one byte at a time */
#define FUZZ_2_BYTE_FLIP 0x00000008 /* Flip two bytes at a time */
#define FUZZ_TRUNCATE_START 0x00000010 /* Truncate from beginning */
#define FUZZ_TRUNCATE_END 0x00000020 /* Truncate from end */
#define FUZZ_BASE64 0x00000040 /* Try all base64 chars */
#define FUZZ_MAX FUZZ_BASE64
/* Start fuzzing a blob of data with selected strategies (bitmask) */
struct fuzz *fuzz_begin(u_int strategies, const void *p, size_t l);
/* Free a fuzz context */
void fuzz_cleanup(struct fuzz *fuzz);
/* Prepare the next fuzz case in the series */
void fuzz_next(struct fuzz *fuzz);
/*
* Check whether this fuzz case is identical to the original
* This is slow, but useful if the caller needs to ensure that all tests
* generated change the input (e.g. when fuzzing signatures).
*/
int fuzz_matches_original(struct fuzz *fuzz);
/* Determine whether the current fuzz sequence is exhausted (nonzero = yes) */
int fuzz_done(struct fuzz *fuzz);
/* Return the length and a pointer to the current fuzzed case */
size_t fuzz_len(struct fuzz *fuzz);
u_char *fuzz_ptr(struct fuzz *fuzz);
/* Dump the current fuzz case to stderr */
void fuzz_dump(struct fuzz *fuzz);
#endif /* _TEST_HELPER_H */

View File

@ -0,0 +1,11 @@
#include "test_helper.h"
void socket_tests();
void tests(void)
{
_set_abort_behavior(0, 1);
socket_tests();
return;
}

View File

@ -1,7 +1,7 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 14
VisualStudioVersion = 14.0.24720.0
VisualStudioVersion = 14.0.23107.0
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "win32posix", "win32posix\win32posix.vcxproj", "{D8744F47-1741-4FB8-97D3-EBB9C3A13E67}"
EndProject
@ -15,6 +15,11 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SampleServer", "SampleServe
{D8744F47-1741-4FB8-97D3-EBB9C3A13E67} = {D8744F47-1741-4FB8-97D3-EBB9C3A13E67}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "UnitTests", "UnitTests\UnitTests.vcxproj", "{31E868FF-DE6C-4CF7-9BF0-2C9B51DB58AD}"
ProjectSection(ProjectDependencies) = postProject
{D8744F47-1741-4FB8-97D3-EBB9C3A13E67} = {D8744F47-1741-4FB8-97D3-EBB9C3A13E67}
EndProjectSection
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32
@ -47,6 +52,14 @@ Global
{D52F8255-C3A9-4416-A0A6-8CE63A4D7E43}.Release|Win32.Build.0 = Release|Win32
{D52F8255-C3A9-4416-A0A6-8CE63A4D7E43}.Release|x64.ActiveCfg = Release|x64
{D52F8255-C3A9-4416-A0A6-8CE63A4D7E43}.Release|x64.Build.0 = Release|x64
{31E868FF-DE6C-4CF7-9BF0-2C9B51DB58AD}.Debug|Win32.ActiveCfg = Debug|Win32
{31E868FF-DE6C-4CF7-9BF0-2C9B51DB58AD}.Debug|Win32.Build.0 = Debug|Win32
{31E868FF-DE6C-4CF7-9BF0-2C9B51DB58AD}.Debug|x64.ActiveCfg = Debug|x64
{31E868FF-DE6C-4CF7-9BF0-2C9B51DB58AD}.Debug|x64.Build.0 = Debug|x64
{31E868FF-DE6C-4CF7-9BF0-2C9B51DB58AD}.Release|Win32.ActiveCfg = Release|Win32
{31E868FF-DE6C-4CF7-9BF0-2C9B51DB58AD}.Release|Win32.Build.0 = Release|Win32
{31E868FF-DE6C-4CF7-9BF0-2C9B51DB58AD}.Release|x64.ActiveCfg = Release|x64
{31E868FF-DE6C-4CF7-9BF0-2C9B51DB58AD}.Release|x64.Build.0 = Release|x64
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE