Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
60 commits
Select commit Hold shift + click to select a range
50e4182
workshop2
prepas May 2, 2018
0687034
change workshop #3
prepas May 9, 2018
f3221cf
03_armstrong_number
prepas May 10, 2018
d20ec51
added 04_roman_numerals task for workshop
Vv-git May 15, 2018
ab6da91
04_roman_numerals
prepas May 16, 2018
fb18071
04_roman_numerals
prepas May 16, 2018
b41c628
fix build
May 23, 2018
c7fe024
add bank ocr
May 23, 2018
429bf52
update readme
May 23, 2018
302c6c8
05_bank_ocr
May 23, 2018
3888d5a
05_bank_ocr
May 23, 2018
174d704
05_bank_ocr
May 23, 2018
8a26ae0
05bankocr_homework
May 23, 2018
9964bf7
05_word_wrapp
May 30, 2018
a19db22
added Allergies task description
driverdevteam May 31, 2018
655c03b
added 06_allergies homework
Vv-git May 31, 2018
dc1a3e2
modified description of 06_allergies homework
Vv-git May 31, 2018
b8b350d
07_coffee
Jun 6, 2018
69b5a3f
07_coffee
Jun 6, 2018
c0c03e6
Merge branch 'master' of https://github.com/driverdevteam/tdd-course-2
Jun 6, 2018
274381f
07_coffee
Jun 6, 2018
7eaa1fc
07_coffee
Jun 6, 2018
085db6a
ChatClient.mpp
Jun 13, 2018
6a5f34f
add socketwrapper
Jun 18, 2018
6b50d09
update socketwrapper
Jun 20, 2018
4a956a9
clean_room_1\
Jun 20, 2018
09ccbc2
clean_room_1
Jun 20, 2018
18572b2
project created
RSerhii Jun 25, 2018
9ac9102
tests list
RSerhii Jun 25, 2018
f6e6e6d
TEST Number0_99ToString_OutOfBounds RED
RSerhii Jun 25, 2018
abc1bd6
TEST Number0_99ToString_OutOfBounds GREEN
RSerhii Jun 25, 2018
e00fb39
TEST Number0_99ToString_0 RED
RSerhii Jun 25, 2018
a255eec
TEST Number0_99ToString_0 RED (fixed test)
RSerhii Jun 25, 2018
ba2f737
TEST Number0_99ToString_0 GREEN
RSerhii Jun 25, 2018
5d0178b
TEST Number0_99ToString_0 refactoring
RSerhii Jun 25, 2018
690f084
TEST Number0_99ToString_1 RED
RSerhii Jun 25, 2018
4e2b9e5
TEST Number0_99ToString_1 GREEN
RSerhii Jun 25, 2018
51fdd50
TEST Number0_99ToString_1 refactoring
RSerhii Jun 25, 2018
6c48c24
TESTs for 0-19 + refactoring
RSerhii Jun 25, 2018
21bb4e5
TEST Number0_99ToString_20 RED
RSerhii Jun 25, 2018
15ca003
TEST Number0_99ToString_20 GREEN
RSerhii Jun 25, 2018
558c668
TEST Number0_99ToString_30 RED
RSerhii Jun 25, 2018
f2c8262
TEST Number0_99ToString_30 GREEN
RSerhii Jun 25, 2018
85f6426
TEST Number0_99ToString_30 refactoring
RSerhii Jun 25, 2018
1d5c7e3
TESTs for 40-90
RSerhii Jun 25, 2018
d3bae80
TEST Number0_99ToString_21 RED
RSerhii Jun 25, 2018
056e3db
TEST Number0_99ToString_21 GREEN
RSerhii Jun 25, 2018
6ddf3ae
TEST Number0_99ToString_21 refactoring
RSerhii Jun 25, 2018
937867f
TEST NumberToString_OutOfBounds RED
RSerhii Jun 25, 2018
949fedd
TEST NumberToString_OutOfBounds GREEN
RSerhii Jun 25, 2018
e5951a1
TEST NumberToString_42 RED
RSerhii Jun 25, 2018
03c54f7
TEST NumberToString_42 GREEN
RSerhii Jun 25, 2018
999e503
TEST NumberToString_100 RED
RSerhii Jun 25, 2018
8e1f1df
TEST NumberToString_100 GREEN
RSerhii Jun 25, 2018
ed13b33
TEST NumberToString_101 RED
RSerhii Jun 25, 2018
ed29a21
TEST NumberToString_101 GREEN
RSerhii Jun 25, 2018
9c1a42c
TEST NumberToString_1000 RED
RSerhii Jun 25, 2018
8b9cb1d
TEST NumberToString_1000 GREEN
RSerhii Jun 25, 2018
c5fdf05
TEST NumberToString_1000 refactoring
RSerhii Jun 25, 2018
2934156
TEST NumberToString_12345 already green
RSerhii Jun 25, 2018
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added tdd_intro/cleanroom/ChatClient.mpp
Binary file not shown.
6 changes: 5 additions & 1 deletion tdd_intro/cleanroom/chatclient/chatclient.pro
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,13 @@ CONFIG -= app_bundle
CONFIG -= qt

SOURCES += \
test.cpp
test.cpp \
socketwrapper.cpp

LIBS += \
Ws2_32.lib \
Mswsock.lib \
AdvApi32.lib

HEADERS += \
socketwrapper.h
107 changes: 107 additions & 0 deletions tdd_intro/cleanroom/chatclient/socketwrapper.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
#define WIN32_LEAN_AND_MEAN
#define _WINSOCK_DEPRECATED_NO_WARNINGS

#include <windows.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <exception>
#include <vector>
#include <string>
#include <sstream>
#include <memory>

#include "SocketWrapper.h"

namespace
{
std::string GetExceptionString(const std::string& message, int errorCode)
{
std::stringstream stream;
stream << message;
stream << errorCode;
stream << std::endl;
return stream.str();
}
}

SocketWrapper::SocketWrapper()
: m_socket(INVALID_SOCKET)
{
m_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (m_socket == INVALID_SOCKET)
{
throw std::runtime_error(GetExceptionString("Failed to create socket to listen on.", WSAGetLastError()));
}
}

SocketWrapper::SocketWrapper(SOCKET & other)
: m_socket(other)
{
}

SocketWrapper::~SocketWrapper()
{
closesocket(m_socket);
}

void SocketWrapper::Bind(const std::string& addr, int16_t port)
{
sockaddr_in addres;
addres.sin_family = AF_INET;
addres.sin_addr.s_addr = inet_addr(addr.data());
addres.sin_port = htons(port);
if (bind(m_socket, reinterpret_cast<sockaddr*>(&addres), sizeof(addres)) == SOCKET_ERROR)
{
throw std::runtime_error(GetExceptionString("Failed to bind socket to address.", WSAGetLastError()));
}
}

void SocketWrapper::Listen()
{
if (listen(m_socket, SOMAXCONN) == SOCKET_ERROR)
{
throw std::runtime_error(GetExceptionString("Failed to listen on socket.", WSAGetLastError()));
}
}

ISocketWrapperPtr SocketWrapper::Accept()
{
// SOCKET other = accept(m_socket, nullptr, nullptr);
// if (other == INVALID_SOCKET)
// {
// throw std::runtime_error(GetExceptionString("Failed to connect to client.", WSAGetLastError()));
// }
// return SocketWrapper(other);
return nullptr;
}

ISocketWrapperPtr SocketWrapper::Connect(const std::string& addr, int16_t port)
{
// sockaddr_in addres;
// addres.sin_family = AF_INET;
// addres.sin_addr.s_addr = inet_addr(addr.data());
// addres.sin_port = htons(port);
// SOCKET other = connect(m_socket, reinterpret_cast<sockaddr*>(&addres), sizeof(addres));
// if (other == INVALID_SOCKET)
// {
// throw std::runtime_error(GetExceptionString("Failed to connect to server.", WSAGetLastError()));
// }
// return SocketWrapper(other);
return nullptr;
}

void SocketWrapper::Read(std::string& buffer)
{
std::vector<char> bufferTmp;
bufferTmp.resize(buffer.size());
if (SOCKET_ERROR == recv(m_socket, bufferTmp.data(), bufferTmp.size(), 0))
{
throw std::runtime_error(GetExceptionString("Failed to connect to server.", WSAGetLastError()));
}
buffer.assign(bufferTmp.begin(), bufferTmp.end());
}

void SocketWrapper::Write(const std::string& buffer)
{
send(m_socket, buffer.data(), buffer.size(), 0);
}
35 changes: 35 additions & 0 deletions tdd_intro/cleanroom/chatclient/socketwrapper.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
#pragma once
#include <cstdint>
#include <windows.h>
#include <memory>

class ISocketWrapper;
using ISocketWrapperPtr = std::shared_ptr<ISocketWrapper>;

class ISocketWrapper
{
public:
virtual void Bind(const std::string& addr, int16_t port) = 0;
virtual void Listen()= 0;
virtual ISocketWrapperPtr Accept() = 0;
virtual ISocketWrapperPtr Connect(const std::string& addr, int16_t port)= 0;
virtual void Read(std::string& buffer)= 0;
virtual void Write(const std::string& buffer)= 0;
};

class SocketWrapper : public ISocketWrapper
{
public:
SocketWrapper();
explicit SocketWrapper(SOCKET& other);
~SocketWrapper();
void Bind(const std::string& addr, int16_t port);
void Listen();
ISocketWrapperPtr Accept();
ISocketWrapperPtr Connect(const std::string& addr, int16_t port);
void Read(std::string& buffer);
void Write(const std::string& buffer);

private:
SOCKET m_socket;
};
81 changes: 81 additions & 0 deletions tdd_intro/cleanroom/chatclient/test.cpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#include <gtest/gtest.h>
#include <gmock/gmock.h>
#include "socketwrapper.h"

using namespace testing;
/*
Expand Down Expand Up @@ -38,3 +39,83 @@ Implement chat application, that communicates via TCP sockets.
* If user enters '!exit!' message, application must close connection and exit
* If user runs app with 'me' nickname - error with text "Username me is reserved and can not be used" is displayed and application exits
*/

class MockSocketWrapper : public ISocketWrapper
{
public:
MOCK_METHOD2(Bind, void(const std::string& addr, int16_t port));
MOCK_METHOD0(Listen, void());
MOCK_METHOD0(Accept, ISocketWrapperPtr());
MOCK_METHOD2(Connect, ISocketWrapperPtr(const std::string& addr, int16_t port));
MOCK_METHOD1(Read, void(std::string& buffer));
MOCK_METHOD1(Write, void(const std::string& buffer));

};

class Channel
{
public:
explicit Channel(ISocketWrapper& wrapper): m_wrapper(wrapper) {}
void Send(const std::string& message) { m_wrapper.Write(message);}
void Receive(std::string& message) { m_wrapper.Read(message);}

private:
ISocketWrapper& m_wrapper;
};

void ClientHandshake(Channel& channel, const std::string& login)
{
std::string buffer;
channel.Send(login + ":HELLO");
channel.Receive(buffer);

}

void ServerHandshake(Channel& channel, const std::string& login)
{
std::string buffer;
channel.Receive(buffer);
channel.Send(login + ":HELLO!");
}

TEST(SocketWrapperTest, Sending)
{
MockSocketWrapper socket;
Channel channel(socket);

EXPECT_CALL(socket, Write("Hello")).Times(1);
channel.Send("Hello");
}

TEST(SocketWrapperTest, Receiving)
{
MockSocketWrapper socket;
Channel channel(socket);

std::string buffer;
EXPECT_CALL(socket, Read(_)).WillOnce(SetArgReferee<0>("Hello"));
channel.Receive(buffer);

EXPECT_EQ("Hello", buffer);
}

TEST(SocketWrapperTest, ClientHandshake)
{
MockSocketWrapper socket;
Channel channel(socket);
InSequence sequence;
EXPECT_CALL(socket, Write("metizik:HELLO")).Times(1);
EXPECT_CALL(socket, Read(_)).Times(1);
ClientHandshake(channel, "metizik");
}

TEST(SocketWrapperTest, ServerHandshake)
{
MockSocketWrapper socket;
Channel channel(socket);
EXPECT_CALL(socket, Read(_)).Times(1);
EXPECT_CALL(socket, Write("user:HELLO!")).Times(1);
ServerHandshake(channel, "user");
}


Loading