Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Client #3

Open
wants to merge 36 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 13 commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
9ef9705
added classes and methods prototypes
kaverhovsky Nov 12, 2020
87ddd0e
added tests and reworked code
kaverhovsky Nov 12, 2020
37715c5
fixed blank.yml
kaverhovsky Nov 12, 2020
7fc3ae4
fixed blank.yml 2
kaverhovsky Nov 12, 2020
db999d7
fixed blank.yml 3
kaverhovsky Nov 12, 2020
82bde25
fixed blank.yml 4
kaverhovsky Nov 12, 2020
6531e16
fixed blank.yml 5
kaverhovsky Nov 12, 2020
ebfa8db
fixed blank.yml 6
kaverhovsky Nov 12, 2020
24227bb
fixed blank.yml 7
kaverhovsky Nov 12, 2020
076bc9e
removed old Cmakelist
kaverhovsky Nov 12, 2020
b8fd891
fixed blank.yml 8
kaverhovsky Nov 12, 2020
225299d
some changes
kaverhovsky Nov 12, 2020
6de03f0
some changes2
kaverhovsky Nov 12, 2020
985dd79
tried to implement code
kaverhovsky Dec 10, 2020
3339e88
changed blank.yml
kaverhovsky Dec 10, 2020
8dc195d
deleted request manager
kaverhovsky Dec 10, 2020
f00d935
implemented json-like serializator
kaverhovsky Dec 23, 2020
82043c9
added boost parser and moved send and recieve to presenter
kaverhovsky Dec 24, 2020
f14559e
changed consoleView
kaverhovsky Dec 24, 2020
c099009
login handler
kaverhovsky Dec 24, 2020
255bc0d
add link handler
kaverhovsky Dec 24, 2020
837acb2
changed connect
kaverhovsky Dec 24, 2020
5043f2d
-comms
kaverhovsky Dec 24, 2020
8a30a02
--
kaverhovsky Dec 24, 2020
d90ec82
----
kaverhovsky Dec 24, 2020
20ed769
------
kaverhovsky Dec 24, 2020
fe5ff7a
improved creating and removing rooms
kaverhovsky Dec 26, 2020
db3d341
improved adding users and links
kaverhovsky Dec 27, 2020
c9caa36
recieving files
kaverhovsky Dec 27, 2020
d03341a
rec
kaverhovsky Dec 27, 2020
a4f47cf
fixed serialization
kaverhovsky Dec 27, 2020
2fb9365
debug try
kaverhovsky Dec 27, 2020
7f9d74c
getting room from server
kaverhovsky Dec 28, 2020
64cf698
new commit
kaverhovsky Dec 28, 2020
f80127f
new
kaverhovsky Dec 28, 2020
ea87c45
new2
kaverhovsky Dec 28, 2020
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
70 changes: 70 additions & 0 deletions .github/workflows/blank.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
name: CI_client

on:
push:
branches: [ client ]
pull_request:

jobs:
build:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v2
- name: install cppcheck
run: sudo apt-get install -y cppcheck

- name: install valgrind
run: sudo apt install valgrind

- name: install gcovr and lcov
run: |
sudo apt install gcovr
sudo apt install lcov

- name: run cppcheck
run: cd client/src && cppcheck *.cpp

- name: build
run: |
cd client
mkdir build
cd build
cmake ..
make

- name: test socket
run: |
cd client/build
valgrind --leak-check=full ./test/socket_tests

- name: test response
run: |
cd client/build
valgrind --leak-check=full ./test/response_tests

- name: test request
run: |
cd client/build
valgrind --leak-check=full ./test/request_tests

- name: test client
run: |
cd client/build
valgrind --leak-check=full ./test/client_tests

- name: test application
run: |
cd client/build
valgrind --leak-check=full ./test/application_tests

- name: coverage
run: |
cd client/build
make gcov
make lcov
- name: archive code coverage results
uses: actions/upload-artifact@v2
with:
name: code-coverage-report_linear
path: client/build/test/lcoverage
14 changes: 14 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,17 @@
CMakeLists.txt.user
CMakeCache.txt
CMakeFiles
CMakeScripts
Testing
Makefile
cmake_install.cmake
install_manifest.txt
compile_commands.json
CTestTestfile.cmake
_deps
build/
.vscode/

# Prerequisites
*.d

Expand Down
8 changes: 8 additions & 0 deletions client/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
cmake_minimum_required(VERSION 3.16.3)

project(link_share)

add_subdirectory(src)

enable_testing()
add_subdirectory(test)
62 changes: 62 additions & 0 deletions client/include/application.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
#pragma once

#include "client.hpp"
#include <memory>
#include <list>


class UserInfo{
public:
UserInfo();
UserInfo(std::string& nm, std::string& psw);
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

посмотрите доклад Джосаттиса про строчки

~UserInfo();

private:
std::string name;
std::string password;
};


class Link {
public:
Link(std::string& name, std::string& url, std::string& tag);
~Link();
std::string addSnapshot();

private:
std::string linkname;
std::string url;
std::vector<std::string> tags;
std::vector<std::string> snapshotPaths;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

использовать вектор в интерфейсе - плохая идея, т.к. при необходимости изменения придётся менять весь вызывающий код
инкапсулируйте и используйте PIMPL

};


Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

почему всё в одном файле?

class Room{
public:
Room(std::string& roomName, std::string& roomId);
void addLink(std::string& newLink);
void removeLink(std::string& linkName);
void addParticipant(std::string& newPart);
void removeParticipant(std::string& partName);
std::string archiveLink(std::string& linkName);
private:
std::string roomName;
std::string roomId;
std::string roomHost;
std::vector<std::string> participants;
std::vector<Link> links;
};




class Application {
public:
Application();
~Application();

private:
Client client;
UserInfo info;
std::vector<Room> rooms;
};
22 changes: 22 additions & 0 deletions client/include/client.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
#pragma once

#include "socket.hpp"

#include <netinet/in.h>
#include <string>
#include <vector>


class Client {
public:
Client();
~Client();
void connect(const std::string& host, int port);
void writeToServer(std::string& req);
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Request - это куда более сложная структура, чем string
да и у Ваших коллег уже есть определённые структуры - согласуйте их с ними
если это GUI клиент, то непонятно, почему называется writeToServer...
интерфейс обычно работает с логикой экранов/кнопок и пр. Если у некоторых согласно поведению есть необходимость сходить за данными - они обращаются в презентер. Если у него нет состояния - он уже идёт в модель. Там может быть несколько слоёв. Например, кэш, локальная БД и если нигде уже нет - идёт на сервер. При переходе с уровня на уровень всегда можно оставить (и обычно так и делается) коллбэк, который сетит на все промежуточные слои пришедшие данные и возвращают их клиенту через публичный интерфейс

std::string readFromServer();
void closeCon();

private:
Socket sock;
};

97 changes: 97 additions & 0 deletions client/include/request.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
#pragma once

#include <string>
#include <memory>
#include <iostream>
#include <vector>


typedef enum ReqExitStatus {
REQ_SUCCESS,
REQ_FAILURE
}ReqExitStatus;


class Request {
public:
virtual ReqExitStatus buildRequestFromInput(std::istream& s) = 0;
virtual std::string RequestToString() = 0;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

виртуальный деструктор?

};

class LogInReq : public Request {
public:
ReqExitStatus buildRequestFromInput(std::istream& s) override;
std::string RequestToString() override;
private:
std::string name;
std::string password;
};

class LogOutReq : public Request {
public:
ReqExitStatus buildRequestFromInput(std::istream& s) override;
std::string RequestToString() override;
private:
};

class CreateRoomReq : public Request {
public:
ReqExitStatus buildRequestFromInput(std::istream& s) override;
std::string RequestToString() override;
private:
std::string roomName;
std::string roomHost;
std::vector<std::string> participants;
};

class RemoveRoomReq : public Request {
public:
ReqExitStatus buildRequestFromInput(std::istream& s) override;
std::string RequestToString() override;
private:
std::string name;
};

class AddLinkReq : public Request {
public:
ReqExitStatus buildRequestFromInput(std::istream& s) override;
std::string RequestToString() override;
private:
std::string linkName;
std::string url;
std::string tag;
};

class RemoveLinkReq : public Request {
public:
ReqExitStatus buildRequestFromInput(std::istream&s) override;
std::string RequestToString() override;
private:
std::string linkName;
};

class ArchiveLinkReq : public Request {
public:
ReqExitStatus buildRequestFromInput(std::istream& s) override;
std::string RequestToString() override;
private:
std::string linkName;
};


using requestPtr = std::shared_ptr<Request>;

class RequestHandler {
public:
RequestHandler();
requestPtr HandleInput(std::string& which);
private:
requestPtr _LogInReq;
requestPtr _LogOutReq;
requestPtr _CreateRoomReq;
requestPtr _RemoveRoomReq;
requestPtr _AddLinkReq;
requestPtr _RemoveLinkReq;
requestPtr _LinkReq;
requestPtr _ArchiveLinkReq;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

переделайте через цепочку ответственностей - рассматривался паттерн на семинаре по тестированию

};
80 changes: 80 additions & 0 deletions client/include/response.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
#pragma once

#include <string>
#include <iostream>
#include <memory>
#include <vector>
#include <application.hpp>
#include <request.hpp>

typedef enum RespExitStatus {
RESP_SUCCESS,
RESP_FAILURE
}RespExitStatus;


class Response {
public:
virtual RespExitStatus buildResponse(std::string& responseBody) = 0;
virtual RespExitStatus doLogic(const Request& req, Application& app) = 0;
};

class LogInResp : public Response{
public:
RespExitStatus buildResponse(std::string& responseBody) override;
RespExitStatus doLogic(const Request& req, Application& app) override;
};

class LogOutResp : public Response{
public:
RespExitStatus buildResponse(std::string& responseBody) override;
RespExitStatus doLogic(const Request& req, Application& app) override;
};

class CreateRoomResp : public Response{
public:
RespExitStatus buildResponse(std::string& responseBody) override;
RespExitStatus doLogic(const Request& req, Application& app) override;
};

class RemoveRoomResp : public Response{
public:
RespExitStatus buildResponse(std::string& responseBody) override;
RespExitStatus doLogic(const Request& req, Application& app) override;
};

class AddLinkResp : public Response{
public:
RespExitStatus buildResponse(std::string& responseBody) override;
RespExitStatus doLogic(const Request& req, Application& app) override;
};

class RemoveLinkResp : public Response{
public:
RespExitStatus buildResponse(std::string& responseBody) override;
RespExitStatus doLogic(const Request& req, Application& app) override;
};

class ArchiveLinkResp : public Response{
public:
RespExitStatus buildResponse(std::string& responseBody) override;
RespExitStatus doLogic(const Request& req, Application& app) override;
private:
std::string body;
};


using responsePtr = std::shared_ptr<Response>;

class ResponseHandler {
public:
ResponseHandler();
responsePtr HandleInput(std::string& resposeBody);
private:
responsePtr _LogInResp;
responsePtr _LogOutResp;
responsePtr _CreateRoomResp;
responsePtr _RemoveRoomResp;
responsePtr _AddLinkResp;
responsePtr _RemoveLinkResp;
};
21 changes: 21 additions & 0 deletions client/include/socket.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
#pragma once

#include <unistd.h> // close()
#include <memory>
#include <string>


class Socket
{
public:
Socket();
Socket(int _sd);
~Socket();

void connect(const std::string& host, int port);
void send(const std::string& str);
std::string recv();
void close();
private:
int sd;
};
4 changes: 4 additions & 0 deletions client/src/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
add_library(client STATIC application.cpp client.cpp request.cpp response.cpp socket.cpp)
target_include_directories(client PUBLIC "${PROJECT_SOURCE_DIR}/include")

add_definitions(-Wall -Werror -Wpedantic)
Loading