From dc07d8fbc513a49101e53e57a98906d7e07092a7 Mon Sep 17 00:00:00 2001 From: Andrew Shadura Date: Thu, 12 Nov 2015 18:40:21 +0100 Subject: Imported Upstream version 0.4.1 --- .travis.yml | 57 + CHANGELOG.md | 8 + CMakeLists.txt | 2 +- README.md | 9 + analyzers/src/breakdown/latencies.cpp | 4 +- analyzers/src/breakdown/latencies.h | 2 +- docs/CMakeLists.txt | 4 +- docs/design/CMakeLists.txt | 34 - docs/design/download_plantuml.cmake | 10 - docs/design/libwatch/CMakeLists.txt | 15 - docs/design/libwatch/class_diagram.plantuml | 111 -- docs/logo64.png | Bin 2114 -> 2078 bytes src/analysis/cifs_parser.cpp | 14 +- src/analysis/print_analyzer.cpp | 41 +- src/analysis/rpc_sessions.h | 11 +- src/api/cifs_pc_to_net.h | 78 +- src/protocols/cifs2/cifs2.h | 4 +- src/protocols/cifs2/cifs2_utils.h | 13 +- tests/unit/analyzers/CMakeLists.txt | 1 - tests/unit/analyzers/breakdown/latency.cpp | 34 +- tests/unit/analyzers/json/CMakeLists.txt | 19 - tests/unit/analyzers/json/ip_endpoint.cpp | 41 - tests/unit/analyzers/json/tcp_service.cpp | 165 -- tests/unit/analyzers/json/test_json_analyzer.cpp | 1799 -------------------- tests/unit/protocols/cifsv2.cpp | 43 + .../eth-ipv4-tcp-nfsv3-4-41-cifs1-2.pcap.bz2.ref | 2 +- 26 files changed, 243 insertions(+), 2278 deletions(-) create mode 100644 .travis.yml delete mode 100644 docs/design/CMakeLists.txt delete mode 100644 docs/design/download_plantuml.cmake delete mode 100644 docs/design/libwatch/CMakeLists.txt delete mode 100644 docs/design/libwatch/class_diagram.plantuml delete mode 100644 tests/unit/analyzers/json/CMakeLists.txt delete mode 100644 tests/unit/analyzers/json/ip_endpoint.cpp delete mode 100644 tests/unit/analyzers/json/tcp_service.cpp delete mode 100644 tests/unit/analyzers/json/test_json_analyzer.cpp diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..4ae5fcb --- /dev/null +++ b/.travis.yml @@ -0,0 +1,57 @@ +language: cpp + +compiler: + - gcc + #- clang + +before_install: + - uname -a + - pwd + - export + - sudo pip install codecov + - sudo pip install --user cpp-coveralls + - sudo apt-add-repository -y ppa:ubuntu-toolchain-r/test + - sudo apt-get install software-properties-common + #- sudo add-apt-repository -y ppa:george-edison55/cmake-3.x + - sudo apt-add-repository -y ppa:ondrej/php5-5.6 # libjson0-dev 0.11 + - sudo apt-get update -qq +install: + - sudo apt-get -y --force-yes install -qq build-essential g++-4.9 gcc-4.9 libpcap-dev valgrind libjson0-dev + - sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.9 20 + - sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.9 20 + - sudo update-alternatives --install /usr/bin/gcov gcov /usr/bin/gcov-4.9 20 + - sudo update-alternatives --config gcc + - sudo update-alternatives --config g++ + - sudo update-alternatives --config gcov + - sudo apt-get install cmake + - wget -O - --no-check-certificate https://cmake.org/files/v3.3/cmake-3.3.2-Linux-x86_64.tar.gz | tar xz && sudo cp -fR cmake-3.3.2-Linux-x86_64/* /usr + - wget -q https://googlemock.googlecode.com/files/gmock-1.7.0.zip && unzip gmock-1.7.0.zip -d /tmp + # install latest LCOV + - wget http://ftp.de.debian.org/debian/pool/main/l/lcov/lcov_1.11.orig.tar.gz + - tar xf lcov_1.11.orig.tar.gz + - sudo make -C lcov-1.11/ install + - gem install coveralls-lcov +before_script: + - cmake --version + - gcov --version + - if [ $CXX == 'g++' ]; + then + export CXX="g++-4.9"; + export CC="gcc-4.9"; + export CXX_FLAGS="-g -O0 -fprofile-arcs -ftest-coverage -fPIC"; + export C_FLAGS="-g -O0 -fprofile-arcs -ftest-coverage"; + fi + - lcov --directory . --zerocounters +script: + - mkdir debug && cd debug + - cmake -DCMAKE_BUILD_TYPE=DEBUG -DGMOCK_SOURCE_DIR=/tmp/gmock-1.7.0 -D"CMAKE_CXX_FLAGS=$CXX_FLAGS" -D"CMAKE_C_FLAGS=$C_FLAGS" -DINCLUDE_COVERAGE_INFO="true" ../ + - sudo make install + - make test + #- cpack -G DEB + +after_success: + - lcov --compat-libtool --directory . --capture --output-file coverage.info # capture coverage info + - lcov --remove coverage.info 'tests/*' '/usr/*' '*gmock*' --output-file coverage.info # filter out system and test code + #- lcov --list coverage.info # debug before upload + - coveralls-lcov coverage.info + diff --git a/CHANGELOG.md b/CHANGELOG.md index ade333d..6d7899d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,11 @@ +0.4.0 +===== +- new libwatch plugin that outputs statistics to terminal via ncurses; +- add support of NFSv4.1 (w/o callbacks); +- add experimantal support of CIFS v2 and partial CIFS v1; +- add new interfaces and functions in Plugin API; +- update manual. + 0.3.2 ===== - new libjson plugin that outputs gathered statistics as json (via TCP); diff --git a/CMakeLists.txt b/CMakeLists.txt index 794fc34..c22e389 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -114,5 +114,5 @@ if (ASTYLE_PATH) WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}) endif () -# Runtime analysis reports +# valgrind reports ============================================================= include ("cmake/valgrind.cmake") diff --git a/README.md b/README.md index 49fa005..38fe471 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,9 @@ +[![License](https://img.shields.io/github/license/epam/nfstrace.svg)](http://opensource.org/licenses/GPL-2.0) +[![Language](https://img.shields.io/badge/language-C++11-blue.svg)](https://isocpp.org) +[![Release](https://img.shields.io/github/release/epam/nfstrace.svg)](https://github.com/epam/nfstrace/releases/latest) +[![Issues](https://img.shields.io/github/issues/epam/nfstrace.svg)](https://github.com/epam/nfstrace/issues?q=is%3Aopen+is%3Aissue) +[![Build Status](https://img.shields.io/travis/epam/nfstrace/master.svg)](https://travis-ci.org/epam/nfstrace) +[![Coverage Status](http://img.shields.io/coveralls/epam/nfstrace/master.svg)](https://coveralls.io/r/epam/nfstrace?branch=master) NFSTRACE ![NFSTRACE Logo](docs/logo64.png "Logo") ======== @@ -18,6 +24,7 @@ following protocols: `nfstrace` has been tested on the following GNU/Linux and FreeBSD systems: +- Debian Sid [packages](https://packages.debian.org/unstable/main/nfstrace) [build-logs](https://buildd.debian.org/status/logs.php?pkg=nfstrace) - Fedora 20 - OpenSUSE 13.2 - Ubuntu 14.04/14.10 @@ -114,6 +121,8 @@ Alexey Costroma ([alexey_costroma@epam.com](mailto:alexey_costroma@epam.com) Dzianis Huznou ([dzianis_huznou@epam.com](mailto:dzianis_huznou@epam.com)) +Artsem Iliasau ([artsem_iliasau@epam.com](mailto:artsem_iliasau@epam.com)) + Pavel Karneliuk ([pavel_karneliuk@epam.com](mailto:pavel_karneliuk@epam.com)) Andrey Kuznetsov ([andrey_kuznetsov@epam.com](mailto:andrey_kuznetsov@epam.com)) diff --git a/analyzers/src/breakdown/latencies.cpp b/analyzers/src/breakdown/latencies.cpp index e162250..bc342e5 100644 --- a/analyzers/src/breakdown/latencies.cpp +++ b/analyzers/src/breakdown/latencies.cpp @@ -87,8 +87,8 @@ void Latencies::set_range(const timeval& t) } } -long double NST::breakdown::to_sec(const timeval& val) +double NST::breakdown::to_sec(const timeval& val) { - return static_cast(val.tv_sec) + val.tv_usec / 1000000.0L; + return static_cast(val.tv_sec) + static_cast(val.tv_usec) / 1000000.0; } //------------------------------------------------------------------------------ diff --git a/analyzers/src/breakdown/latencies.h b/analyzers/src/breakdown/latencies.h index 7b36ec0..b206e52 100644 --- a/analyzers/src/breakdown/latencies.h +++ b/analyzers/src/breakdown/latencies.h @@ -92,7 +92,7 @@ private: * \param val - time struct * \return converted value */ -long double to_sec(const timeval& val); +double to_sec(const timeval& val); } // namespace breakdown } // namespace NST diff --git a/docs/CMakeLists.txt b/docs/CMakeLists.txt index a41ec8f..5b119bd 100644 --- a/docs/CMakeLists.txt +++ b/docs/CMakeLists.txt @@ -8,6 +8,4 @@ if (DOXYGEN_PATH) add_dependencies (documentation documentation-doxygen) else () message (WARNING "Doxygen is not found - source-code documentation is not available") -endif () - -add_subdirectory (design) +endif () \ No newline at end of file diff --git a/docs/design/CMakeLists.txt b/docs/design/CMakeLists.txt deleted file mode 100644 index 5196121..0000000 --- a/docs/design/CMakeLists.txt +++ /dev/null @@ -1,34 +0,0 @@ -find_program (JAVA_PATH java) -if (JAVA_PATH) - add_custom_target (documentation-design) - add_dependencies (documentation documentation-design) - - # Processing PlantUML JAR - set (PLANTUML_JAR "plantuml.jar") - set (PLANTUML_FOUND "FALSE") - if (NOT "${PLANTUML_JAR_DIR}" STREQUAL "") - # PlantUML directory has been manually set - find_file (PLANTUML_JAR_PATH ${PLANTUML_JAR} PATHS ${PLANTUML_JAR_DIR}) - if ("${PLANTUML_JAR_PATH}" STREQUAL "PLANTUML_JAR_PATH-NOTFOUND") - message (FATAL_ERROR "Plantuml JAR file '${PLANTUML_JAR}' not found in '${PLANTUML_JAR_DIR}' directory") - else () - message (STATUS "Plantuml JAR file successfully found: '${PLANTUML_JAR_PATH}'") - set (PLANTUML_FOUND "TRUE") - endif () - endif () - set (DOWNLOAD_PLANTUML_JAR_PROXY_TARGET download-plantuml-jar-proxy) - add_custom_target (${DOWNLOAD_PLANTUML_JAR_PROXY_TARGET}) # Special target with optional 'Download PlantUML JAR' dependency - if (NOT ${PLANTUML_FOUND}) - set (DOWNLOAD_PLANTUML_JAR_TARGET download-plantuml-jar) - set (PLANTUML_JAR_PATH "${CMAKE_CURRENT_SOURCE_DIR}/${PLANTUML_JAR}") - add_custom_command (OUTPUT ${PLANTUML_JAR_PATH} - COMMAND ${CMAKE_COMMAND} -DPLANTUML_JAR_PATH=${PLANTUML_JAR_PATH} -P ${CMAKE_CURRENT_SOURCE_DIR}/download_plantuml.cmake) - set_source_files_properties (${PLANTUML_JAR_PATH} PROPERTIES GENERATED 1) - add_custom_target (${DOWNLOAD_PLANTUML_JAR_TARGET} SOURCES ${PLANTUML_JAR_PATH}) - add_dependencies (${DOWNLOAD_PLANTUML_JAR_PROXY_TARGET} ${DOWNLOAD_PLANTUML_JAR_TARGET}) - endif () - - add_subdirectory (libwatch) -else () - message (WARNING "Java is not found - design documentation is not available") -endif () diff --git a/docs/design/download_plantuml.cmake b/docs/design/download_plantuml.cmake deleted file mode 100644 index 0251fa5..0000000 --- a/docs/design/download_plantuml.cmake +++ /dev/null @@ -1,10 +0,0 @@ -message ("Downloading PlantUML JAR. Use '-DPLANTUML_JAR_DIR=' param for CMake to use local PlantUML JAR.") -file (DOWNLOAD "http://downloads.sourceforge.net/project/plantuml/plantuml.jar" - ${PLANTUML_JAR_PATH} SHOW_PROGRESS STATUS DOWNLOAD_STATUS_LIST) -list (GET DOWNLOAD_STATUS_LIST 0 DOWNLOAD_STATUS) -if (${DOWNLOAD_STATUS} EQUAL 0) - message ("Successfully downloaded PlantUML JAR") -else () - list (GET DOWNLOAD_STATUS_LIST 1 DOWNLOAD_ERROR) - message (FATAL_ERROR "PlantUML JAR download error: ${DOWNLOAD_ERROR}") -endif () diff --git a/docs/design/libwatch/CMakeLists.txt b/docs/design/libwatch/CMakeLists.txt deleted file mode 100644 index d6b5713..0000000 --- a/docs/design/libwatch/CMakeLists.txt +++ /dev/null @@ -1,15 +0,0 @@ -file (GLOB DIAGRAM_SOURCE_FILES "*.plantuml") -foreach (DIAGRAM_SOURCE_FILE ${DIAGRAM_SOURCE_FILES}) - get_filename_component (DIAGRAM_SOURCE_FILENAME ${DIAGRAM_SOURCE_FILE} NAME) - get_filename_component (DIAGRAM_SOURCE_FILENAME_WE ${DIAGRAM_SOURCE_FILE} NAME_WE) - set (DIAGRAM_TARGET_FILE "${CMAKE_CURRENT_SOURCE_DIR}/${DIAGRAM_SOURCE_FILENAME_WE}.png") - set (DIAGRAM_TARGET documentation-design-libwatch-${DIAGRAM_SOURCE_FILENAME}) - add_custom_command(OUTPUT ${DIAGRAM_TARGET_FILE} - COMMAND ${JAVA_PATH} -jar ${PLANTUML_JAR_PATH} -verbose ${DIAGRAM_SOURCE_FILENAME} - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} - DEPENDS ${DIAGRAM_SOURCE_FILE}) - set_source_files_properties (${DIAGRAM_TARGET_FILE} PROPERTIES GENERATED 1) - add_custom_target (${DIAGRAM_TARGET} SOURCES ${DIAGRAM_TARGET_FILE}) - add_dependencies (documentation-design ${DIAGRAM_TARGET}) - add_dependencies (${DIAGRAM_TARGET} ${DOWNLOAD_PLANTUML_JAR_PROXY_TARGET}) -endforeach () diff --git a/docs/design/libwatch/class_diagram.plantuml b/docs/design/libwatch/class_diagram.plantuml deleted file mode 100644 index 600bcfa..0000000 --- a/docs/design/libwatch/class_diagram.plantuml +++ /dev/null @@ -1,111 +0,0 @@ -@startuml -skinparam titleFontSize 24 -skinparam defaultFontSize 16 -title NFSTrace: libwatch class diagram - -abstract class AbstractProtocol #Aquamarine { - + commandsAmount: const std::size_t - + name: const std::string - + AbstractProtocol(name: const std::string&, commandsAmount: std::size_t) - + {abstract} commandName(std::size_t commandId): const char * = 0 -} - -class NFSv3Protocol #Aquamarine { - + NFSv3Protocol() - + {abstract} commandName(std::size_t commandId): const char * -} - -class NFSv4Protocol #Aquamarine { - + NFSv4Protocol() - + {abstract} commandName(std::size_t commandId): const char * -} - -AbstractProtocol <|-- NFSv3Protocol -AbstractProtocol <|-- NFSv4Protocol - -class CommandsStatistics { - + commands: std::vector -} - -class WatchAnalyzer { - - _userGUI: UserGUI - - _protocols: std::vector - + {abstract} onCommand(): void - + {abstract} onUnixSignal(): void -} - -class UserGUI << thread >> { - - _isRunning: std::atomic - - _shouldRefresh: std::atomic - - _statisticsMutex: std::mutex - - _statisticsContainer: std::unordered_map - - _activeProtocol: AbstractProtocol& - - _mainWindow: MainWindow - - _headerWindow: HeaderWindow - - _statisticsWindow: StatisticsWindow - + UserGUI(protocols: std::vector&) - + incrementCommand(protocol: const AbstractProtocol&, commandId: std::size_t) - + refresh() - - run() - - selectProtocol(protocol: const ActiveProtocol&) -} - -note right of UserGUI - _statisticsContainer/_statisticsMutex - are used to thread-safely pass statistics from - analyzer's thread to GUI's one; - run() is a thread-function where GUI is to - be created/[re-]drawn/destroyed, keyboard events are to - be handled and incoming statistics delta is to be applied; - selectProtocol() is to be called internally when - a user changes active protocol; - incrementCommand() is to be called from analyzer - to update statistics on command detection; - refresh() is to be called from analyzer - to completely redraw GUI (e.g. on SIGCONT) - - this method just sets _shouldRefresh to true - but actual refresh is made in run(). -end note - -class MainWindow #Khaki { - - _handle: WINDOW* -} - -class HeaderWindow #Khaki { - - _handle: WINDOW* - - _activeProtocol: const AbstractProtocol& - + HeaderWindow(protocols: std::vector&, activeProtocol: const AbstractProtocol&) - + selectProtocol(protocol: const AbstractProtocol&) - + refresh() -} - -class StatisticsWindow #Khaki { - - _handle: WINDOW* - - _activeProtocol: const AbstractProtocol& - - _statisticsContainer: const CommandsStatistics& - - _scrollOffsets: std::unordered_map - + StatisticsWindow(activeProtocol: const AbstractProtocol&, statisticsContainer: const CommandsStatistics&) - + selectProtocol(protocol: const AbstractProtocol&) - + update() - + scroll(increment: int) - + refresh() -} - -note top of StatisticsWindow - selectProtocol() is to be called when a protocol is changed; - update() is to be called to update statistics data; - scroll() is to be called to scroll statistics data; - refresh() is to be called to completely redraw window. -end note - -WatchAnalyzer "1" *-- "1" UserGUI -WatchAnalyzer "1" *-- "*" AbstractProtocol -UserGUI "1" *-- "*" AbstractProtocol -UserGUI "1" *-- "1" MainWindow -UserGUI "1" *-- "1" HeaderWindow -UserGUI "1" *-- "1" StatisticsWindow -UserGUI "1" *-- "*" CommandsStatistics -HeaderWindow "1" o-- "1" AbstractProtocol -StatisticsWindow "1" o-- "1" CommandsStatistics -StatisticsWindow "1" o-- "1" AbstractProtocol -@enduml diff --git a/docs/logo64.png b/docs/logo64.png index 87ef62e..d2431ba 100644 Binary files a/docs/logo64.png and b/docs/logo64.png differ diff --git a/src/analysis/cifs_parser.cpp b/src/analysis/cifs_parser.cpp index 44a5697..033615f 100644 --- a/src/analysis/cifs_parser.cpp +++ b/src/analysis/cifs_parser.cpp @@ -19,8 +19,6 @@ along with Nfstrace. If not, see . */ //------------------------------------------------------------------------------ -#include - #include "analysis/cifs_parser.h" #include "api/cifs_types.h" #include "utils/log.h" @@ -28,8 +26,8 @@ using namespace NST::protocols; using namespace NST::analysis; -CIFSParser::CIFSParser(Analyzers& a) : - analyzers(a) +CIFSParser::CIFSParser(Analyzers& a) +: analyzers(a) { } @@ -95,9 +93,7 @@ void CIFSParser::parse_packet(const CIFSv2::MessageHeader* header, utils::Filter // It is response if (Session* session = sessions.get_session(ptr->session, ptr->direction, MsgType::REPLY)) { - //Loosing precision: conversion from int64_t to uint32_t - const uint32_t messageId = static_cast(header->messageId); - FilteredDataQueue::Ptr&& requestData = session->get_call_data(messageId); + FilteredDataQueue::Ptr&& requestData = session->get_call_data(header->messageId); if (requestData) { if (const MessageHeader* request = get_header(requestData->data)) @@ -119,9 +115,7 @@ void CIFSParser::parse_packet(const CIFSv2::MessageHeader* header, utils::Filter { return analyse_operation(session, header, nullptr, std::move(ptr), std::move(nullptr)); } - //Loosing precision: conversion from int64_t to uint32_t - const uint32_t messageId = static_cast(header->messageId); - return session->save_call_data(messageId, std::move(ptr)); + return session->save_call_data(header->messageId, std::move(ptr)); } LOG("Can't get right CIFS session"); } diff --git a/src/analysis/print_analyzer.cpp b/src/analysis/print_analyzer.cpp index 7d8315b..1d68420 100644 --- a/src/analysis/print_analyzer.cpp +++ b/src/analysis/print_analyzer.cpp @@ -266,28 +266,19 @@ std::ostream& print_session(std::ostream& out, CommandType* cmd) } template -std::ostream& print_smbv2_common_info(std::ostream& out, SMBv2Commands cmdEnum, CommandType* cmd, const std::string& cmdComment) -{ - out << print_cifs2_procedures(cmdEnum) - << " " - << cmdComment << " ("; - print_hex16(out, to_integral(cmdEnum)); - out << ")\n" - << " Structure size = "; - print_hex16(out, cmd->structureSize); - return out; -} - -template -std::ostream& print_smbv2_common_info_req(std::ostream& out, SMBv2Commands cmdEnum, CommandType* cmd) +std::ostream& print_smbv2_common_info_req(std::ostream& out, SMBv2Commands, CommandType* cmd) { - return print_smbv2_common_info(out, cmdEnum, cmd->parg, "request"); + out << " Structure size = "; + print_hex16(out, cmd->parg->structureSize); + return out; } template -std::ostream& print_smbv2_common_info_resp(std::ostream& out, SMBv2Commands cmdEnum, CommandType* cmd) +std::ostream& print_smbv2_common_info_resp(std::ostream& out, SMBv2Commands, CommandType* cmd) { - return print_smbv2_common_info(out, cmdEnum, cmd->pres, "response"); + out << " Structure size = "; + print_hex16(out, cmd->pres->structureSize); + return out; } std::ostream& print_smbv2_header(std::ostream& out, const RawMessageHeader* header) @@ -511,10 +502,12 @@ void PrintAnalyzer::treeConnectSMBv2(const SMBv2::TreeConnectCommand* cmd, print_session(out, cmd) << "\n"; print_smbv2_header(out, cmd->req_header) << "\n"; print_smbv2_common_info_req(out, cmdEnum, cmd) << "\n"; - if(cmd->parg->PathLength > 0) + + const auto plen = NST::API::SMBv2::pc_to_net(cmd->parg->PathLength); + if(plen > 0) { out << " Tree ="; - print_buffer(out,cmd->parg->Buffer, cmd->parg->PathLength) << "\n"; + print_buffer(out,cmd->parg->Buffer, plen) << "\n"; } print_smbv2_header(out, cmd->res_header) << "\n"; print_smbv2_common_info_resp(out, cmdEnum, cmd) << "\n"; @@ -556,11 +549,12 @@ void PrintAnalyzer::createSMBv2(const SMBv2::CreateCommand* cmd, print_enum(out, "Disposition", cmd->parg->createDisposition) << "\n"; print_enum(out, "Create Options", cmd->parg->createOptions) << "\n"; - if(cmd->parg->NameLength > 0) + const auto len = NST::API::SMBv2::pc_to_net(cmd->parg->NameLength); + if(len > 0) { out << " File name = "; - print_buffer(out, cmd->parg->Buffer, cmd->parg->NameLength) << "\n"; - out << " File length = " << cmd->parg->NameLength << "\n"; + print_buffer(out, cmd->parg->Buffer, len) << "\n"; + out << " File length = " << len << "\n"; } print_smbv2_header(out, cmd->res_header) << "\n"; @@ -736,7 +730,8 @@ void PrintAnalyzer::queryDirSMBv2(const SMBv2::QueryDirCommand* cmd, out << " File index = " << cmd->parg->FileIndex << "\n" << " Output buffer length = " << cmd->parg->OutputBufferLength << "\n" << " Search pattern ="; - print_buffer(out, cmd->parg->Buffer, cmd->parg->FileNameLength) << "\n"; + const auto len = NST::API::SMBv2::pc_to_net(cmd->parg->FileNameLength); + print_buffer(out, cmd->parg->Buffer, len) << "\n"; print_smbv2_header(out, cmd->res_header) << "\n"; print_smbv2_common_info_resp(out, cmdEnum, cmd); } diff --git a/src/analysis/rpc_sessions.h b/src/analysis/rpc_sessions.h index 91f0ff1..bd2c23a 100644 --- a/src/analysis/rpc_sessions.h +++ b/src/analysis/rpc_sessions.h @@ -22,6 +22,7 @@ #ifndef RPC_SESSIONS_H #define RPC_SESSIONS_H //------------------------------------------------------------------------------ +#include #include #include #include @@ -54,17 +55,17 @@ public: Session(const Session&) = delete; Session& operator=(const Session&) = delete; - void save_call_data(const uint32_t xid, FilteredDataQueue::Ptr&& data) + void save_call_data(const std::uint64_t xid, FilteredDataQueue::Ptr&& data) { FilteredDataQueue::Ptr& e = operations[xid]; if(e) // xid call already exists { - LOG("replace RPC Call XID:%u for %s", xid, str().c_str()); + LOG("replace RPC Call XID:%" PRIu64 " for %s", xid, str().c_str()); } e = std::move(data); // replace existing or set new } - inline FilteredDataQueue::Ptr get_call_data(const uint32_t xid) + inline FilteredDataQueue::Ptr get_call_data(const std::uint64_t xid) { auto i = operations.find(xid); if(i != operations.end()) @@ -75,7 +76,7 @@ public: } else { - LOG("RPC Call XID:%u is not found for %s", xid, str().c_str()); + LOG("RPC Call XID:%" PRIu64 " is not found for %s", xid, str().c_str()); } return FilteredDataQueue::Ptr{}; @@ -86,7 +87,7 @@ private: // TODO: add custom allocator based on BlockAllocator // to decrease cost of expensive insert/erase operations - std::unordered_map operations; + std::unordered_map operations; }; template diff --git a/src/api/cifs_pc_to_net.h b/src/api/cifs_pc_to_net.h index bf03af4..2587bd2 100644 --- a/src/api/cifs_pc_to_net.h +++ b/src/api/cifs_pc_to_net.h @@ -24,7 +24,7 @@ //------------------------------------------------------------------------------ #include //------------------------------------------------------------------------------ -#ifdef __linux__ +#if defined(__linux__) || defined(__GNU__) #include #define NFSTRACE_BYTE_ORDER __BYTE_ORDER #define NFSTRACE_BIG_ENDIAN __BIG_ENDIAN @@ -46,50 +46,72 @@ namespace SMBv2 # if NFSTRACE_BYTE_ORDER == NFSTRACE_BIG_ENDIAN -/*! - * Converter. Not very fast, - * try to not use - */ +// TODO: rename this function template to LEconstant2host + template constexpr T pc_to_net(T t) { - static_assert(t == 0, "try to not use pc_to_net w/o specialization"); + static_assert(t == T{}, "try to not use pc_to_net w/o specialization"); return t; } -/*! - * gets only 1 byte - * Internal function - * \param number - number of byte - * \param t - source number - * \return 1 byte in right place of whole number - */ -template -constexpr T switch_1_byte(T t) +template<> +constexpr std::uint64_t pc_to_net(std::uint64_t t) { - return ((t & (static_cast(0xff) << number*8)) << ((sizeof(T) - 1 - number)*8)); + return ((t & 0xFF00000000000000) >> 56) + | ((t & 0x00FF000000000000) >> 40) + | ((t & 0x0000FF0000000000) >> 24) + | ((t & 0x000000FF00000000) >> 8) + | ((t & 0x00000000FF000000) << 8) + | ((t & 0x0000000000FF0000) << 24) + | ((t & 0x000000000000FF00) << 40) + | ((t & 0x00000000000000FF) << 56); } -/*! - * Compile-time converter BE to LE for 32 bit numbers - * \param t - source number - * \return converted number - */ template<> constexpr uint32_t pc_to_net(uint32_t t) { - return switch_1_byte<0>(t) | switch_1_byte<1>(t) | switch_1_byte<2>(t) | switch_1_byte<3>(t); + return ((t & 0xFF000000) >> 24) + | ((t & 0x00FF0000) >> 8) + | ((t & 0x0000FF00) << 8) + | ((t & 0x000000FF) << 24); } -/*! - * Compile-time converter BE to LE for 16 bit numbers - * \param t - source number - * \return converted number - */ template<> constexpr uint16_t pc_to_net(uint16_t t) { - return switch_1_byte<0>(t) | switch_1_byte<1>(t); + return ((t & 0xFF00) >> 8) + | ((t & 0x00FF) << 8); +} + +template<> +constexpr std::uint8_t pc_to_net(std::uint8_t v) +{ + return v; +} + +template<> +constexpr std::int64_t pc_to_net(std::int64_t v) +{ + return pc_to_net((std::uint64_t)v); +} + +template<> +constexpr std::int32_t pc_to_net(std::int32_t v) +{ + return pc_to_net((std::uint32_t)v); +} + +template<> +constexpr std::int16_t pc_to_net(std::int16_t v) +{ + return pc_to_net((std::uint16_t)v); +} + +template<> +constexpr std::int8_t pc_to_net(std::int8_t v) +{ + return pc_to_net((std::uint8_t)v); } # else diff --git a/src/protocols/cifs2/cifs2.h b/src/protocols/cifs2/cifs2.h index f25020c..a3caa06 100644 --- a/src/protocols/cifs2/cifs2.h +++ b/src/protocols/cifs2/cifs2.h @@ -53,8 +53,8 @@ enum class Flags : uint32_t RELATED_OPERATIONS = API::SMBv2::pc_to_net(0x00000004), //!< When set in an SMB2 request, indicates that this request is a related operation in a compounded request chain. The use of this flag in an SMB2 request is as specified in 3.2.4.1.4. //!< When set in an SMB2 compound response, indicates that the request corresponding to this response was part of a related operation in a compounded request chain. The use of this flag in an SMB2 response is as specified in 3.3.5.2.7.2. SIGNED = API::SMBv2::pc_to_net(0x00000008), //!< When set, indicates that this packet has been signed. The use of this flag is as specified in 3.1.5.1. - DFS_OPERATIONS = API::SMBv2::pc_to_net(0x01000000), //!< When set, indicates that this command is a DFS operation. The use of this flag is as specified in 3.3.5.9. - REPLAY_OPERATION = API::SMBv2::pc_to_net(0x02000000) //!< This flag is only valid for the SMB 3.x dialect family. When set, it indicates that this command is a replay operation. The client MUST ignore this bit on receipt. + DFS_OPERATIONS = API::SMBv2::pc_to_net(0x10000000), //!< When set, indicates that this command is a DFS operation. The use of this flag is as specified in 3.3.5.9. + REPLAY_OPERATION = API::SMBv2::pc_to_net(0x20000000) //!< This flag is only valid for the SMB 3.x dialect family. When set, it indicates that this command is a replay operation. The client MUST ignore this bit on receipt. }; /*! \class Raw CIFS v2 message header diff --git a/src/protocols/cifs2/cifs2_utils.h b/src/protocols/cifs2/cifs2_utils.h index 9666630..800fa1f 100644 --- a/src/protocols/cifs2/cifs2_utils.h +++ b/src/protocols/cifs2/cifs2_utils.h @@ -22,12 +22,12 @@ #ifndef CIFS2_UTILS_H #define CIFS2_UTILS_H //------------------------------------------------------------------------------ -#include -#include +#include #include "api/cifs2_commands.h" +#include "api/cifs_pc_to_net.h" +#include "protocols/cifs2/cifs2.h" #include "protocols/nfs/nfs_utils.h" -#include "cifs2.h" //------------------------------------------------------------------------------ namespace NST { @@ -75,13 +75,14 @@ std::ostream& operator<<(std::ostream& out, const SMBv2::SecurityMode value); std::ostream& operator<<(std::ostream& out, Flags value); template -std::ostream& print_enum(std::ostream& out, const std::string name, T value ) +std::ostream& print_enum(std::ostream& out, const std::string name, T value) { using namespace NST::protocols::NFS; out << " " << name << " = "; - auto int_value = to_integral(value); + // Duty hack for fix issues in PrintAnalyzer on BE platforms + auto int_value = NST::API::SMBv2::pc_to_net(to_integral(value)); print_hex(out, int_value); - out << " " << value; + out << " " << (T)int_value; return out; } diff --git a/tests/unit/analyzers/CMakeLists.txt b/tests/unit/analyzers/CMakeLists.txt index 59dd1fa..b810e90 100644 --- a/tests/unit/analyzers/CMakeLists.txt +++ b/tests/unit/analyzers/CMakeLists.txt @@ -1,4 +1,3 @@ -add_subdirectory (json) add_subdirectory (breakdown) project (unit_test_parse) diff --git a/tests/unit/analyzers/breakdown/latency.cpp b/tests/unit/analyzers/breakdown/latency.cpp index 675281f..f8af2cc 100644 --- a/tests/unit/analyzers/breakdown/latency.cpp +++ b/tests/unit/analyzers/breakdown/latency.cpp @@ -20,8 +20,8 @@ */ //------------------------------------------------------------------------------ #include -#include #include +#include #include #include @@ -97,4 +97,36 @@ TEST_F(LatencyTest, avg) EXPECT_NEAR(6.0, latency.get_avg(), 0.0001); } + +TEST_F(LatencyTest, convert_timeval_to_sec) +{ + /* This test checks to_sec() function and rounding its result to smaller + * precision via std::ios_base::precision() + * + * Background: + * The sizeof(long double) may be different on some platforms. F.e.: + * on Linux x86_64 the sizeof(long double) == 16 and == 10 on x86 or mips + * So, binary representation of the same value are different. Result of + * rounding a value to lower precision may be different. + * + * We use conversion to double (its sizeof is 8) in to_sec() for more + * predictable conversions and rounding on various platforms. + */ + + struct timeval input; + input.tv_sec = 0; + input.tv_usec = 500; + + const auto sec = to_sec(input); + + EXPECT_NEAR(0.0005, sec, std::numeric_limits::epsilon()); + + std::stringstream ss; + + ss.precision(6); ss << std::fixed << sec << ' '; + ss.precision(4); ss << std::fixed << sec << ' '; + ss.precision(3); ss << std::fixed << sec; + + EXPECT_EQ("0.000500 0.0005 0.001", ss.str()); +} //------------------------------------------------------------------------------ diff --git a/tests/unit/analyzers/json/CMakeLists.txt b/tests/unit/analyzers/json/CMakeLists.txt deleted file mode 100644 index 24d24bf..0000000 --- a/tests/unit/analyzers/json/CMakeLists.txt +++ /dev/null @@ -1,19 +0,0 @@ -set (CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake") -find_package (JSON) - -if (JSON_FOUND) - project (unit_test_json_analyzer) - aux_source_directory ("." SRC_LIST) - add_executable (${PROJECT_NAME} ${SRC_LIST} - ${CMAKE_SOURCE_DIR}/analyzers/src/json/json_analyzer.cpp - ${CMAKE_SOURCE_DIR}/analyzers/src/json/json_tcp_service.cpp - ${CMAKE_SOURCE_DIR}/analyzers/src/json/abstract_tcp_service.cpp - ${CMAKE_SOURCE_DIR}/analyzers/src/json/ip_endpoint.cpp - ${CMAKE_SOURCE_DIR}/src/utils/log.cpp - ${CMAKE_SOURCE_DIR}/src/utils/out.cpp) - include_directories (${JSON_INCLUDE_DIRS} ${CMAKE_SOURCE_DIR}/analyzers/src/json) - target_link_libraries (${PROJECT_NAME} ${JSON_LIBRARIES} ${GMOCK_LIBRARIES}) - add_test (${PROJECT_NAME} ${PROJECT_NAME}) -else () - message (WARNING "JSON library not found - JSON-service unit-tests are not available!") -endif () diff --git a/tests/unit/analyzers/json/ip_endpoint.cpp b/tests/unit/analyzers/json/ip_endpoint.cpp deleted file mode 100644 index a62097f..0000000 --- a/tests/unit/analyzers/json/ip_endpoint.cpp +++ /dev/null @@ -1,41 +0,0 @@ -//------------------------------------------------------------------------------ -// Author: Ilya Storozhilov -// Description: TCP-endpoint tests -// Copyright (c) 2013-2014 EPAM Systems -//------------------------------------------------------------------------------ -/* - This file is part of Nfstrace. - - Nfstrace is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, version 2 of the License. - - Nfstrace is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Nfstrace. If not, see . -*/ -//------------------------------------------------------------------------------ -#include - -#include -#include - -#include "ip_endpoint.h" -//------------------------------------------------------------------------------ - -static constexpr const char* ValidHost = IpEndpoint::LoopbackAddress; -static constexpr int ValidPort = 8888; -static constexpr const char* InvalidHost = "invalid_host_name"; -static constexpr int InvalidPort = -1; - -TEST(TestTcpEndpoint, constructDestruct) -{ - EXPECT_NO_THROW(IpEndpoint endpoint(ValidHost, ValidPort)); - EXPECT_THROW(IpEndpoint endpoint(ValidHost, InvalidPort), std::runtime_error); - EXPECT_THROW(IpEndpoint endpoint(InvalidHost, ValidPort), std::runtime_error); - EXPECT_THROW(IpEndpoint endpoint(InvalidHost, InvalidPort), std::runtime_error); -} diff --git a/tests/unit/analyzers/json/tcp_service.cpp b/tests/unit/analyzers/json/tcp_service.cpp deleted file mode 100644 index 192b710..0000000 --- a/tests/unit/analyzers/json/tcp_service.cpp +++ /dev/null @@ -1,165 +0,0 @@ -//------------------------------------------------------------------------------ -// Author: Ilya Storozhilov -// Description: TCP-service tests -// Copyright (c) 2013-2014 EPAM Systems -//------------------------------------------------------------------------------ -/* - This file is part of Nfstrace. - - Nfstrace is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, version 2 of the License. - - Nfstrace is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Nfstrace. If not, see . -*/ -//------------------------------------------------------------------------------ -#include -#include - -#include -#include -#include - -#include "abstract_tcp_service.h" -//------------------------------------------------------------------------------ - -static constexpr std::size_t AwaitForServiceStartupMs = 250U; -static constexpr std::size_t StartStopCyclesAmount = 5U; -static constexpr std::size_t TransmissionTimeoutMs = 10000U; -static constexpr const char* ListenHost = IpEndpoint::LoopbackAddress; -static constexpr int ListenPort = 8888; -static constexpr std::size_t WorkersAmount = 100U; -static constexpr std::size_t ReceiveBufferSize = 4096U; -static constexpr const char* TestRequest = "GET"; -static constexpr const char* TestResponse = "{copy:32,remove:46,getattr:154}"; - -static std::atomic_int taskExecuteCallsCount; - -class TestTcpService : public AbstractTcpService -{ -public: - TestTcpService() : - AbstractTcpService{WorkersAmount, ListenPort, ListenHost} - {} -private: - class Task : public AbstractTask - { - public: - Task(TestTcpService& service, int socket) : - AbstractTask{socket}, - _service(service) - {} - Task() = delete; - - void execute() override final - { - ++taskExecuteCallsCount; - // Receiving request - struct timespec readTimeout; - readTimeout.tv_sec = TransmissionTimeoutMs / 1000; - readTimeout.tv_nsec = TransmissionTimeoutMs % 1000 * 1000000; - fd_set readDescriptiorsSet; - FD_ZERO(&readDescriptiorsSet); - FD_SET(socket(), &readDescriptiorsSet); - int readDescriptorsCount = pselect(socket() + 1, &readDescriptiorsSet, NULL, NULL, &readTimeout, NULL); - ASSERT_GT(readDescriptorsCount, 0); - ASSERT_TRUE(FD_ISSET(socket(), &readDescriptiorsSet)); - char receiveBuffer[ReceiveBufferSize]; - ssize_t bytesReceived = recv(socket(), receiveBuffer, sizeof(receiveBuffer), 0); - EXPECT_EQ(TestRequest, std::string(receiveBuffer, bytesReceived)); - // Sending response - struct timespec writeTimeout; - writeTimeout.tv_sec = TransmissionTimeoutMs / 1000; - writeTimeout.tv_nsec = TransmissionTimeoutMs % 1000 * 1000000; - fd_set writeDescriptiorsSet; - FD_ZERO(&writeDescriptiorsSet); - FD_SET(socket(), &writeDescriptiorsSet); - int writeDescriptorsCount = pselect(socket() + 1, NULL, &writeDescriptiorsSet, NULL, &writeTimeout, NULL); - ASSERT_GT(writeDescriptorsCount, 0); - ASSERT_TRUE(FD_ISSET(socket(), &writeDescriptiorsSet)); - ssize_t bytesSent = send(socket(), TestResponse, strlen(TestResponse), MSG_NOSIGNAL); - EXPECT_EQ(static_cast(strlen(TestResponse)), bytesSent); - } - private: - TestTcpService& _service; - }; - - AbstractTask* createTask(int socket) override final - { - return new Task{*this, socket}; - } -}; - -TEST(TestTcpService, constructDestruct) -{ - EXPECT_NO_THROW(TestTcpService service); -} - -TEST(TestTcpService, requestResponse) -{ - taskExecuteCallsCount = 0; - TestTcpService service; - for (size_t i = 0; i < StartStopCyclesAmount; ++i) { - EXPECT_NO_THROW(service.start()); - std::this_thread::sleep_for(std::chrono::milliseconds{AwaitForServiceStartupMs}); - int s = socket(PF_INET, SOCK_STREAM, 0); - ASSERT_GE(s, 0); - IpEndpoint endpoint{ListenHost, ListenPort}; - ASSERT_EQ(0, connect(s, endpoint.addrinfo()->ai_addr, endpoint.addrinfo()->ai_addrlen)); - ssize_t bytesSent = send(s, TestRequest, strlen(TestRequest), MSG_NOSIGNAL); - EXPECT_EQ(strlen(TestRequest), static_cast(bytesSent)); - char receiveBuffer[ReceiveBufferSize]; - ssize_t bytesReceived = recv(s, receiveBuffer, sizeof(receiveBuffer), 0); - EXPECT_EQ(TestResponse, std::string(receiveBuffer, bytesReceived)); - EXPECT_EQ(0, close(s)); - EXPECT_NO_THROW(service.stop()); - } - EXPECT_EQ(StartStopCyclesAmount, static_cast(taskExecuteCallsCount.load())); -} - -TEST(TestTcpService, multipleRequestResponse) -{ - taskExecuteCallsCount = 0; - TestTcpService service; - EXPECT_NO_THROW(service.start()); - std::this_thread::sleep_for(std::chrono::milliseconds{AwaitForServiceStartupMs}); - std::vector sockets(WorkersAmount); - for (auto & s : sockets) - { - s = socket(PF_INET, SOCK_STREAM, 0); - ASSERT_GE(s, 0); - } - IpEndpoint endpoint{ListenHost, ListenPort}; - for (auto & s : sockets) - { - ASSERT_EQ(0, connect(s, endpoint.addrinfo()->ai_addr, endpoint.addrinfo()->ai_addrlen)); - } - for (auto & s : sockets) - { - ssize_t bytesSent = send(s, TestRequest, strlen(TestRequest), MSG_NOSIGNAL); - EXPECT_EQ(static_cast(strlen(TestRequest)), bytesSent); - } - char receiveBuffer[ReceiveBufferSize]; - for (auto & s : sockets) - { - ssize_t bytesReceived = recv(s, receiveBuffer, sizeof(receiveBuffer), 0); - EXPECT_EQ(TestResponse, std::string(receiveBuffer, bytesReceived)); - } - for (auto & s : sockets) - { - EXPECT_EQ(0, close(s)); - } - EXPECT_EQ(sockets.size(), static_cast(taskExecuteCallsCount.load())); - EXPECT_NO_THROW(service.stop()); -} - -// TODO -/*TEST(TestTcpService, overload) -{ -}*/ diff --git a/tests/unit/analyzers/json/test_json_analyzer.cpp b/tests/unit/analyzers/json/test_json_analyzer.cpp deleted file mode 100644 index d058ae1..0000000 --- a/tests/unit/analyzers/json/test_json_analyzer.cpp +++ /dev/null @@ -1,1799 +0,0 @@ -//------------------------------------------------------------------------------ -// Author: Ilya Storozhilov -// Description: JSON analyzer tests executable -// Copyright (c) 2013-2014 EPAM Systems -//------------------------------------------------------------------------------ -/* - This file is part of Nfstrace. - - Nfstrace is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, version 2 of the License. - - Nfstrace is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Nfstrace. If not, see . -*/ -//------------------------------------------------------------------------------ -#include -#include - -#include -#include -#include - -#include "json_analyzer.h" -//------------------------------------------------------------------------------ - -static constexpr std::size_t AwaitForServiceStartupMs = 250U; -static constexpr std::size_t WorkersAmount = 100U; -static constexpr int ListenPort = 8888; -static constexpr const char* ListenHost = IpEndpoint::LoopbackAddress; -static constexpr std::size_t MaxServingDurationMs = 500U; -static constexpr int ListenBacklog = 15; -static constexpr std::size_t ReceiveBufferSize = 4096U; -static constexpr std::size_t SlowClientTimeoutMs = 1000U; - -// NFS3 procedures: -static constexpr int NfsV3NullProcsAmount = 25; -static constexpr int NfsV3GetattrProcsAmount = 35; -static constexpr int NfsV3SetattrProcsAmount = 80; -static constexpr int NfsV3LookupProcsAmount = 76; -static constexpr int NfsV3AccessProcsAmount = 42; -static constexpr int NfsV3ReadlinkProcsAmount = 24; -static constexpr int NfsV3ReadProcsAmount = 56; -static constexpr int NfsV3WriteProcsAmount = 152; -static constexpr int NfsV3CreateProcsAmount = 31; -static constexpr int NfsV3MkdirProcsAmount = 97; -static constexpr int NfsV3SymlinkProcsAmount = 69; -static constexpr int NfsV3MknodProcsAmount = 73; -static constexpr int NfsV3RemoveProcsAmount = 36; -static constexpr int NfsV3RmdirProcsAmount = 27; -static constexpr int NfsV3RenameProcsAmount = 59; -static constexpr int NfsV3LinkProcsAmount = 28; -static constexpr int NfsV3ReaddirProcsAmount = 83; -static constexpr int NfsV3ReaddirplusProcsAmount = 74; -static constexpr int NfsV3FsstatProcsAmount = 95; -static constexpr int NfsV3FsinfoProcsAmount = 57; -static constexpr int NfsV3PathconfProcsAmount = 26; -static constexpr int NfsV3CommitProcsAmount = 79; - -// NFS4.0 procedures: -static constexpr int NfsV40NullProcsAmount = 81; -static constexpr int NfsV40CompoundProcsAmount = 18; - -// NFS4.0 operations: -static constexpr int NfsV40accessOpsAmount = 32; -static constexpr int NfsV40closeOpsAmount = 42; -static constexpr int NfsV40commitOpsAmount = 35; -static constexpr int NfsV40createOpsAmount = 65; -static constexpr int NfsV40delegpurgeOpsAmount = 98; -static constexpr int NfsV40delegreturnOpsAmount = 76; -static constexpr int NfsV40getattrOpsAmount = 34; -static constexpr int NfsV40getfhOpsAmount = 76; -static constexpr int NfsV40linkOpsAmount = 90; -static constexpr int NfsV40lockOpsAmount = 78; -static constexpr int NfsV40locktOpsAmount = 35; -static constexpr int NfsV40lockuOpsAmount = 67; -static constexpr int NfsV40lookupOpsAmount = 23; -static constexpr int NfsV40lookuppOpsAmount = 77; -static constexpr int NfsV40nverifyOpsAmount = 59; -static constexpr int NfsV40openOpsAmount = 34; -static constexpr int NfsV40openattrOpsAmount = 54; -static constexpr int NfsV40open_confirmOpsAmount = 54; -static constexpr int NfsV40open_downgradeOpsAmount = 36; -static constexpr int NfsV40putfhOpsAmount = 78; -static constexpr int NfsV40putpubfhOpsAmount = 96; -static constexpr int NfsV40putrootfhOpsAmount = 56; -static constexpr int NfsV40readOpsAmount = 36; -static constexpr int NfsV40readdirOpsAmount = 59; -static constexpr int NfsV40readlinkOpsAmount = 53; -static constexpr int NfsV40removeOpsAmount = 88; -static constexpr int NfsV40renameOpsAmount = 34; -static constexpr int NfsV40renewOpsAmount = 68; -static constexpr int NfsV40restorefhOpsAmount = 37; -static constexpr int NfsV40savefhOpsAmount = 84; -static constexpr int NfsV40secinfoOpsAmount = 69; -static constexpr int NfsV40setattrOpsAmount = 33; -static constexpr int NfsV40setclientidOpsAmount = 25; -static constexpr int NfsV40setclientid_confirmOpsAmount = 36; -static constexpr int NfsV40verifyOpsAmount = 76; -static constexpr int NfsV40writeOpsAmount = 55; -static constexpr int NfsV40release_lockownerOpsAmount = 18; -static constexpr int NfsV40get_dir_delegationOpsAmount = 54; -static constexpr int NfsV40illegalOpsAmount = 38; - -// NFS4.1 procedures: -static constexpr int NfsV41CompoundProcsAmount = 18; - -// NFS4.1 operations: -static constexpr int NfsV41accessOpsAmount = 37; -static constexpr int NfsV41closeOpsAmount = 23; -static constexpr int NfsV41commitOpsAmount = 19; -static constexpr int NfsV41createOpsAmount = 37; -static constexpr int NfsV41delegpurgeOpsAmount = 22; -static constexpr int NfsV41delegreturnOpsAmount = 64; -static constexpr int NfsV41getattrOpsAmount = 95; -static constexpr int NfsV41getfhOpsAmount = 34; -static constexpr int NfsV41linkOpsAmount = 95; -static constexpr int NfsV41lockOpsAmount = 37; -static constexpr int NfsV41locktOpsAmount = 96; -static constexpr int NfsV41lockuOpsAmount = 45; -static constexpr int NfsV41lookupOpsAmount = 52; -static constexpr int NfsV41lookuppOpsAmount = 25; -static constexpr int NfsV41nverifyOpsAmount = 44; -static constexpr int NfsV41openOpsAmount = 93; -static constexpr int NfsV41openattrOpsAmount = 77; -static constexpr int NfsV41open_confirmOpsAmount = 56; -static constexpr int NfsV41open_downgradeOpsAmount = 98; -static constexpr int NfsV41putfhOpsAmount = 34; -static constexpr int NfsV41putpubfhOpsAmount = 80; -static constexpr int NfsV41putrootfhOpsAmount = 66; -static constexpr int NfsV41readOpsAmount = 89; -static constexpr int NfsV41readdirOpsAmount = 87; -static constexpr int NfsV41readlinkOpsAmount = 65; -static constexpr int NfsV41removeOpsAmount = 23; -static constexpr int NfsV41renameOpsAmount = 34; -static constexpr int NfsV41renewOpsAmount = 68; -static constexpr int NfsV41restorefhOpsAmount = 44; -static constexpr int NfsV41savefhOpsAmount = 67; -static constexpr int NfsV41secinfoOpsAmount = 98; -static constexpr int NfsV41setattrOpsAmount = 87; -static constexpr int NfsV41setclientidOpsAmount = 65; -static constexpr int NfsV41setclientid_confirmOpsAmount = 98; -static constexpr int NfsV41verifyOpsAmount = 45; -static constexpr int NfsV41writeOpsAmount = 23; -static constexpr int NfsV41release_lockownerOpsAmount = 56; -static constexpr int NfsV41backchannel_ctlOpsAmount = 98; -static constexpr int NfsV41bind_conn_to_sessionOpsAmount = 67; -static constexpr int NfsV41exchange_idOpsAmount = 34; -static constexpr int NfsV41create_sessionOpsAmount = 15; -static constexpr int NfsV41destroy_sessionOpsAmount = 99; -static constexpr int NfsV41free_stateidOpsAmount = 26; -static constexpr int NfsV41get_dir_delegationOpsAmount = 54; -static constexpr int NfsV41getdeviceinfoOpsAmount = 59; -static constexpr int NfsV41getdevicelistOpsAmount = 13; -static constexpr int NfsV41layoutcommitOpsAmount = 64; -static constexpr int NfsV41layoutgetOpsAmount = 34; -static constexpr int NfsV41layoutreturnOpsAmount = 75; -static constexpr int NfsV41secinfo_no_nameOpsAmount = 79; -static constexpr int NfsV41sequenceOpsAmount = 88; -static constexpr int NfsV41set_ssvOpsAmount = 45; -static constexpr int NfsV41test_stateidOpsAmount = 74; -static constexpr int NfsV41want_delegationOpsAmount = 56; -static constexpr int NfsV41destroy_clientidOpsAmount = 72; -static constexpr int NfsV41reclaim_completeOpsAmount = 45; -static constexpr int NfsV41illegalOpsAmount = 43; - -class JsonAnalyzerCase : public ::testing::Test -{ -protected: - virtual void SetUp() override final - { - // Starting service - analyzer.reset(new JsonAnalyzer{WorkersAmount, ListenPort, ListenHost, MaxServingDurationMs, ListenBacklog}); - std::this_thread::sleep_for(std::chrono::milliseconds{AwaitForServiceStartupMs}); - // Setting up analyzer (NFSv3) - for (int i = 0; i < NfsV3NullProcsAmount; ++i) - { - analyzer->null(static_cast(nullptr), - static_cast(nullptr), - static_cast(nullptr)); - } - for (int i = 0; i < NfsV3GetattrProcsAmount; ++i) - { - analyzer->getattr3(static_cast(nullptr), - static_cast(nullptr), - static_cast(nullptr)); - } - for (int i = 0; i < NfsV3SetattrProcsAmount; ++i) - { - analyzer->setattr3(static_cast(nullptr), - static_cast(nullptr), - static_cast(nullptr)); - } - for (int i = 0; i < NfsV3LookupProcsAmount; ++i) - { - analyzer->lookup3(static_cast(nullptr), - static_cast(nullptr), - static_cast(nullptr)); - } - for (int i = 0; i < NfsV3AccessProcsAmount; ++i) - { - analyzer->access3(static_cast(nullptr), - static_cast(nullptr), - static_cast(nullptr)); - } - for (int i = 0; i < NfsV3ReadlinkProcsAmount; ++i) - { - analyzer->readlink3(static_cast(nullptr), - static_cast(nullptr), - static_cast(nullptr)); - } - for (int i = 0; i < NfsV3ReadProcsAmount; ++i) - { - analyzer->read3(static_cast(nullptr), - static_cast(nullptr), - static_cast(nullptr)); - } - for (int i = 0; i < NfsV3WriteProcsAmount; ++i) - { - analyzer->write3(static_cast(nullptr), - static_cast(nullptr), - static_cast(nullptr)); - } - for (int i = 0; i < NfsV3CreateProcsAmount; ++i) - { - analyzer->create3(static_cast(nullptr), - static_cast(nullptr), - static_cast(nullptr)); - } - for (int i = 0; i < NfsV3MkdirProcsAmount; ++i) - { - analyzer->mkdir3(static_cast(nullptr), - static_cast(nullptr), - static_cast(nullptr)); - } - for (int i = 0; i < NfsV3SymlinkProcsAmount; ++i) - { - analyzer->symlink3(static_cast(nullptr), - static_cast(nullptr), - static_cast(nullptr)); - } - for (int i = 0; i < NfsV3MknodProcsAmount; ++i) - { - analyzer->mknod3(static_cast(nullptr), - static_cast(nullptr), - static_cast(nullptr)); - } - for (int i = 0; i < NfsV3RemoveProcsAmount; ++i) - { - analyzer->remove3(static_cast(nullptr), - static_cast(nullptr), - static_cast(nullptr)); - } - for (int i = 0; i < NfsV3RmdirProcsAmount; ++i) - { - analyzer->rmdir3(static_cast(nullptr), - static_cast(nullptr), - static_cast(nullptr)); - } - for (int i = 0; i < NfsV3RenameProcsAmount; ++i) - { - analyzer->rename3(static_cast(nullptr), - static_cast(nullptr), - static_cast(nullptr)); - } - for (int i = 0; i < NfsV3LinkProcsAmount; ++i) - { - analyzer->link3(static_cast(nullptr), - static_cast(nullptr), - static_cast(nullptr)); - } - for (int i = 0; i < NfsV3ReaddirProcsAmount; ++i) - { - analyzer->readdir3(static_cast(nullptr), - static_cast(nullptr), - static_cast(nullptr)); - } - for (int i = 0; i < NfsV3ReaddirplusProcsAmount; ++i) - { - analyzer->readdirplus3(static_cast(nullptr), - static_cast(nullptr), - static_cast(nullptr)); - } - for (int i = 0; i < NfsV3FsstatProcsAmount; ++i) - { - analyzer->fsstat3(static_cast(nullptr), - static_cast(nullptr), - static_cast(nullptr)); - } - for (int i = 0; i < NfsV3FsinfoProcsAmount; ++i) - { - analyzer->fsinfo3(static_cast(nullptr), - static_cast(nullptr), - static_cast(nullptr)); - } - for (int i = 0; i < NfsV3PathconfProcsAmount; ++i) - { - analyzer->pathconf3(static_cast(nullptr), - static_cast(nullptr), - static_cast(nullptr)); - } - for (int i = 0; i < NfsV3CommitProcsAmount; ++i) - { - analyzer->commit3(static_cast(nullptr), - static_cast(nullptr), - static_cast(nullptr)); - } - - // Setting up analyzer (NFSv4.0 procedures) - for (int i = 0; i < NfsV40NullProcsAmount; ++i) - { - analyzer->null4(static_cast(nullptr), - static_cast(nullptr), - static_cast(nullptr)); - } - for (int i = 0; i < NfsV40CompoundProcsAmount; ++i) - { - analyzer->compound4(static_cast(nullptr), - static_cast(nullptr), - static_cast(nullptr)); - } - - // Setting up analyzer (NFSv4.0 operations) - const struct NFS4::ACCESS4res access40 {}; - for (int i = 0; i < NfsV40accessOpsAmount; ++i) - { - analyzer->access40(static_cast(nullptr), - static_cast(nullptr), - &access40); - } - const struct NFS4::CLOSE4res close40 {}; - for (int i = 0; i < NfsV40closeOpsAmount; ++i) - { - analyzer->close40(static_cast(nullptr), - static_cast(nullptr), - &close40); - } - const struct NFS4::COMMIT4res commit40 {}; - for (int i = 0; i < NfsV40commitOpsAmount; ++i) - { - analyzer->commit40(static_cast(nullptr), - static_cast(nullptr), - &commit40); - } - const struct NFS4::CREATE4res create40 {}; - for (int i = 0; i < NfsV40createOpsAmount; ++i) - { - analyzer->create40(static_cast(nullptr), - static_cast(nullptr), - &create40); - } - const struct NFS4::DELEGPURGE4res delegpurge40 {}; - for (int i = 0; i < NfsV40delegpurgeOpsAmount; ++i) - { - analyzer->delegpurge40(static_cast(nullptr), - static_cast(nullptr), - &delegpurge40); - } - const struct NFS4::DELEGRETURN4res delegreturn40 {}; - for (int i = 0; i < NfsV40delegreturnOpsAmount; ++i) - { - analyzer->delegreturn40(static_cast(nullptr), - static_cast(nullptr), - &delegreturn40); - } - const struct NFS4::GETATTR4res getattr40 {}; - for (int i = 0; i < NfsV40getattrOpsAmount; ++i) - { - analyzer->getattr40(static_cast(nullptr), - static_cast(nullptr), - &getattr40); - } - const struct NFS4::GETFH4res getfh40 {}; - for (int i = 0; i < NfsV40getfhOpsAmount; ++i) - { - analyzer->getfh40(static_cast(nullptr), - &getfh40); - } - const struct NFS4::LINK4res link40 {}; - for (int i = 0; i < NfsV40linkOpsAmount; ++i) - { - analyzer->link40(static_cast(nullptr), - static_cast(nullptr), - &link40); - } - const struct NFS4::LOCK4res lock40 {}; - for (int i = 0; i < NfsV40lockOpsAmount; ++i) - { - analyzer->lock40(static_cast(nullptr), - static_cast(nullptr), - &lock40); - } - const struct NFS4::LOCKT4res lockt40 {}; - for (int i = 0; i < NfsV40locktOpsAmount; ++i) - { - analyzer->lockt40(static_cast(nullptr), - static_cast(nullptr), - &lockt40); - } - const struct NFS4::LOCKU4res locku40 {}; - for (int i = 0; i < NfsV40lockuOpsAmount; ++i) - { - analyzer->locku40(static_cast(nullptr), - static_cast(nullptr), - &locku40); - } - const struct NFS4::LOOKUP4res lookup40 {}; - for (int i = 0; i < NfsV40lookupOpsAmount; ++i) - { - analyzer->lookup40(static_cast(nullptr), - static_cast(nullptr), - &lookup40); - } - const struct NFS4::LOOKUPP4res lookupp40 {}; - for (int i = 0; i < NfsV40lookuppOpsAmount; ++i) - { - analyzer->lookupp40(static_cast(nullptr), - &lookupp40); - } - const struct NFS4::NVERIFY4res nverify40 {}; - for (int i = 0; i < NfsV40nverifyOpsAmount; ++i) - { - analyzer->nverify40(static_cast(nullptr), - static_cast(nullptr), - &nverify40); - } - const struct NFS4::OPEN4res open40 {}; - for (int i = 0; i < NfsV40openOpsAmount; ++i) - { - analyzer->open40(static_cast(nullptr), - static_cast(nullptr), - &open40); - } - const struct NFS4::OPENATTR4res openattr40 {}; - for (int i = 0; i < NfsV40openattrOpsAmount; ++i) - { - analyzer->openattr40(static_cast(nullptr), - static_cast(nullptr), - &openattr40); - } - const struct NFS4::OPEN_CONFIRM4res open_confirm40 {}; - for (int i = 0; i < NfsV40open_confirmOpsAmount; ++i) - { - analyzer->open_confirm40(static_cast(nullptr), - static_cast(nullptr), - &open_confirm40); - } - const struct NFS4::OPEN_DOWNGRADE4res open_downgrade40 {}; - for (int i = 0; i < NfsV40open_downgradeOpsAmount; ++i) - { - analyzer->open_downgrade40(static_cast(nullptr), - static_cast(nullptr), - &open_downgrade40); - } - const struct NFS4::PUTFH4res putfh40 {}; - for (int i = 0; i < NfsV40putfhOpsAmount; ++i) - { - analyzer->putfh40(static_cast(nullptr), - static_cast(nullptr), - &putfh40); - } - const struct NFS4::PUTPUBFH4res putpubfh40 {}; - for (int i = 0; i < NfsV40putpubfhOpsAmount; ++i) - { - analyzer->putpubfh40(static_cast(nullptr), - &putpubfh40); - } - const struct NFS4::PUTROOTFH4res putrootfh40 {}; - for (int i = 0; i < NfsV40putrootfhOpsAmount; ++i) - { - analyzer->putrootfh40(static_cast(nullptr), - &putrootfh40); - } - const struct NFS4::READ4res read40 {}; - for (int i = 0; i < NfsV40readOpsAmount; ++i) - { - analyzer->read40(static_cast(nullptr), - static_cast(nullptr), - &read40); - } - const struct NFS4::READDIR4res readdir40 {}; - for (int i = 0; i < NfsV40readdirOpsAmount; ++i) - { - analyzer->readdir40(static_cast(nullptr), - static_cast(nullptr), - &readdir40); - } - const struct NFS4::READLINK4res readlink40 {}; - for (int i = 0; i < NfsV40readlinkOpsAmount; ++i) - { - analyzer->readlink40(static_cast(nullptr), - &readlink40); - } - const struct NFS4::REMOVE4res remove40 {}; - for (int i = 0; i < NfsV40removeOpsAmount; ++i) - { - analyzer->remove40(static_cast(nullptr), - static_cast(nullptr), - &remove40); - } - const struct NFS4::RENAME4res rename40 {}; - for (int i = 0; i < NfsV40renameOpsAmount; ++i) - { - analyzer->rename40(static_cast(nullptr), - static_cast(nullptr), - &rename40); - } - const struct NFS4::RENEW4res renew40 {}; - for (int i = 0; i < NfsV40renewOpsAmount; ++i) - { - analyzer->renew40(static_cast(nullptr), - static_cast(nullptr), - &renew40); - } - const struct NFS4::RESTOREFH4res restorefh40 {}; - for (int i = 0; i < NfsV40restorefhOpsAmount; ++i) - { - analyzer->restorefh40(static_cast(nullptr), - &restorefh40); - } - const struct NFS4::SAVEFH4res savefh40 {}; - for (int i = 0; i < NfsV40savefhOpsAmount; ++i) - { - analyzer->savefh40(static_cast(nullptr), - &savefh40); - } - const struct NFS4::SECINFO4res secinfo40 {}; - for (int i = 0; i < NfsV40secinfoOpsAmount; ++i) - { - analyzer->secinfo40(static_cast(nullptr), - static_cast(nullptr), - &secinfo40); - } - const struct NFS4::SETATTR4res setattr40 {}; - for (int i = 0; i < NfsV40setattrOpsAmount; ++i) - { - analyzer->setattr40(static_cast(nullptr), - static_cast(nullptr), - &setattr40); - } - const struct NFS4::SETCLIENTID4res setclientid40 {}; - for (int i = 0; i < NfsV40setclientidOpsAmount; ++i) - { - analyzer->setclientid40(static_cast(nullptr), - static_cast(nullptr), - &setclientid40); - } - const struct NFS4::SETCLIENTID_CONFIRM4res setclientid_confirm40 {}; - for (int i = 0; i < NfsV40setclientid_confirmOpsAmount; ++i) - { - analyzer->setclientid_confirm40(static_cast(nullptr), - static_cast(nullptr), - &setclientid_confirm40); - } - const struct NFS4::VERIFY4res verify40 {}; - for (int i = 0; i < NfsV40verifyOpsAmount; ++i) - { - analyzer->verify40(static_cast(nullptr), - static_cast(nullptr), - &verify40); - } - const struct NFS4::WRITE4res write40 {}; - for (int i = 0; i < NfsV40writeOpsAmount; ++i) - { - analyzer->write40(static_cast(nullptr), - static_cast(nullptr), - &write40); - } - const struct NFS4::RELEASE_LOCKOWNER4res release_lockowner40 {}; - for (int i = 0; i < NfsV40release_lockownerOpsAmount; ++i) - { - analyzer->release_lockowner40(static_cast(nullptr), - static_cast(nullptr), - &release_lockowner40); - } - const struct NFS4::GET_DIR_DELEGATION4res get_dir_delegation40 {}; - for (int i = 0; i < NfsV40get_dir_delegationOpsAmount; ++i) - { - analyzer->get_dir_delegation40(static_cast(nullptr), - static_cast(nullptr), - &get_dir_delegation40); - } - const struct NFS4::ILLEGAL4res illegal40 {}; - for (int i = 0; i < NfsV40illegalOpsAmount; ++i) - { - analyzer->illegal40(static_cast(nullptr), - &illegal40); - } - - // Setting up analyzer (NFSv4.1 procedures) - for (int i = 0; i < NfsV41CompoundProcsAmount; ++i) - { - analyzer->compound41(static_cast(nullptr), - static_cast(nullptr), - static_cast(nullptr)); - } - - // Setting up analyzer (NFSv4.1 operations) - const struct NFS41::ACCESS4res access41 {}; - for (int i = 0; i < NfsV41accessOpsAmount; ++i) - { - analyzer->access41(static_cast(nullptr), - static_cast(nullptr), - &access41); - } - const struct NFS41::CLOSE4res close41 {}; - for (int i = 0; i < NfsV41closeOpsAmount; ++i) - { - analyzer->close41(static_cast(nullptr), - static_cast(nullptr), - &close41); - } - const struct NFS41::COMMIT4res commit41 {}; - for (int i = 0; i < NfsV41commitOpsAmount; ++i) - { - analyzer->commit41(static_cast(nullptr), - static_cast(nullptr), - &commit41); - } - const struct NFS41::CREATE4res create41 {}; - for (int i = 0; i < NfsV41createOpsAmount; ++i) - { - analyzer->create41(static_cast(nullptr), - static_cast(nullptr), - &create41); - } - const struct NFS41::DELEGPURGE4res delegpurge41 {}; - for (int i = 0; i < NfsV41delegpurgeOpsAmount; ++i) - { - analyzer->delegpurge41(static_cast(nullptr), - static_cast(nullptr), - &delegpurge41); - } - const struct NFS41::DELEGRETURN4res delegreturn41 {}; - for (int i = 0; i < NfsV41delegreturnOpsAmount; ++i) - { - analyzer->delegreturn41(static_cast(nullptr), - static_cast(nullptr), - &delegreturn41); - } - const struct NFS41::GETATTR4res getattr41 {}; - for (int i = 0; i < NfsV41getattrOpsAmount; ++i) - { - analyzer->getattr41(static_cast(nullptr), - static_cast(nullptr), - &getattr41); - } - const struct NFS41::GETFH4res getfh41 {}; - for (int i = 0; i < NfsV41getfhOpsAmount; ++i) - { - analyzer->getfh41(static_cast(nullptr), - &getfh41); - } - const struct NFS41::LINK4res link41 {}; - for (int i = 0; i < NfsV41linkOpsAmount; ++i) - { - analyzer->link41(static_cast(nullptr), - static_cast(nullptr), - &link41); - } - const struct NFS41::LOCK4res lock41 {}; - for (int i = 0; i < NfsV41lockOpsAmount; ++i) - { - analyzer->lock41(static_cast(nullptr), - static_cast(nullptr), - &lock41); - } - const struct NFS41::LOCKT4res lockt41 {}; - for (int i = 0; i < NfsV41locktOpsAmount; ++i) - { - analyzer->lockt41(static_cast(nullptr), - static_cast(nullptr), - &lockt41); - } - const struct NFS41::LOCKU4res locku41 {}; - for (int i = 0; i < NfsV41lockuOpsAmount; ++i) - { - analyzer->locku41(static_cast(nullptr), - static_cast(nullptr), - &locku41); - } - const struct NFS41::LOOKUP4res lookup41 {}; - for (int i = 0; i < NfsV41lookupOpsAmount; ++i) - { - analyzer->lookup41(static_cast(nullptr), - static_cast(nullptr), - &lookup41); - } - const struct NFS41::LOOKUPP4res lookupp41 {}; - for (int i = 0; i < NfsV41lookuppOpsAmount; ++i) - { - analyzer->lookupp41(static_cast(nullptr), - &lookupp41); - } - const struct NFS41::NVERIFY4res nverify41 {}; - for (int i = 0; i < NfsV41nverifyOpsAmount; ++i) - { - analyzer->nverify41(static_cast(nullptr), - static_cast(nullptr), - &nverify41); - } - const struct NFS41::OPEN4res open41 {}; - for (int i = 0; i < NfsV41openOpsAmount; ++i) - { - analyzer->open41(static_cast(nullptr), - static_cast(nullptr), - &open41); - } - const struct NFS41::OPENATTR4res openattr41 {}; - for (int i = 0; i < NfsV41openattrOpsAmount; ++i) - { - analyzer->openattr41(static_cast(nullptr), - static_cast(nullptr), - &openattr41); - } - const struct NFS41::OPEN_CONFIRM4res open_confirm41 {}; - for (int i = 0; i < NfsV41open_confirmOpsAmount; ++i) - { - analyzer->open_confirm41(static_cast(nullptr), - static_cast(nullptr), - &open_confirm41); - } - const struct NFS41::OPEN_DOWNGRADE4res open_downgrade41 {}; - for (int i = 0; i < NfsV41open_downgradeOpsAmount; ++i) - { - analyzer->open_downgrade41(static_cast(nullptr), - static_cast(nullptr), - &open_downgrade41); - } - const struct NFS41::PUTFH4res putfh41 {}; - for (int i = 0; i < NfsV41putfhOpsAmount; ++i) - { - analyzer->putfh41(static_cast(nullptr), - static_cast(nullptr), - &putfh41); - } - const struct NFS41::PUTPUBFH4res putpubfh41 {}; - for (int i = 0; i < NfsV41putpubfhOpsAmount; ++i) - { - analyzer->putpubfh41(static_cast(nullptr), - &putpubfh41); - } - const struct NFS41::PUTROOTFH4res putrootfh41 {}; - for (int i = 0; i < NfsV41putrootfhOpsAmount; ++i) - { - analyzer->putrootfh41(static_cast(nullptr), - &putrootfh41); - } - const struct NFS41::READ4res read41 {}; - for (int i = 0; i < NfsV41readOpsAmount; ++i) - { - analyzer->read41(static_cast(nullptr), - static_cast(nullptr), - &read41); - } - const struct NFS41::READDIR4res readdir41 {}; - for (int i = 0; i < NfsV41readdirOpsAmount; ++i) - { - analyzer->readdir41(static_cast(nullptr), - static_cast(nullptr), - &readdir41); - } - const struct NFS41::READLINK4res readlink41 {}; - for (int i = 0; i < NfsV41readlinkOpsAmount; ++i) - { - analyzer->readlink41(static_cast(nullptr), - &readlink41); - } - const struct NFS41::REMOVE4res remove41 {}; - for (int i = 0; i < NfsV41removeOpsAmount; ++i) - { - analyzer->remove41(static_cast(nullptr), - static_cast(nullptr), - &remove41); - } - const struct NFS41::RENAME4res rename41 {}; - for (int i = 0; i < NfsV41renameOpsAmount; ++i) - { - analyzer->rename41(static_cast(nullptr), - static_cast(nullptr), - &rename41); - } - const struct NFS41::RENEW4res renew41 {}; - for (int i = 0; i < NfsV41renewOpsAmount; ++i) - { - analyzer->renew41(static_cast(nullptr), - static_cast(nullptr), - &renew41); - } - const struct NFS41::RESTOREFH4res restorefh41 {}; - for (int i = 0; i < NfsV41restorefhOpsAmount; ++i) - { - analyzer->restorefh41(static_cast(nullptr), - &restorefh41); - } - const struct NFS41::SAVEFH4res savefh41 {}; - for (int i = 0; i < NfsV41savefhOpsAmount; ++i) - { - analyzer->savefh41(static_cast(nullptr), - &savefh41); - } - const struct NFS41::SECINFO4res secinfo41 {}; - for (int i = 0; i < NfsV41secinfoOpsAmount; ++i) - { - analyzer->secinfo41(static_cast(nullptr), - static_cast(nullptr), - &secinfo41); - } - const struct NFS41::SETATTR4res setattr41 {}; - for (int i = 0; i < NfsV41setattrOpsAmount; ++i) - { - analyzer->setattr41(static_cast(nullptr), - static_cast(nullptr), - &setattr41); - } - const struct NFS41::SETCLIENTID4res setclientid41 {}; - for (int i = 0; i < NfsV41setclientidOpsAmount; ++i) - { - analyzer->setclientid41(static_cast(nullptr), - static_cast(nullptr), - &setclientid41); - } - const struct NFS41::SETCLIENTID_CONFIRM4res setclientid_confirm41 {}; - for (int i = 0; i < NfsV41setclientid_confirmOpsAmount; ++i) - { - analyzer->setclientid_confirm41(static_cast(nullptr), - static_cast(nullptr), - &setclientid_confirm41); - } - const struct NFS41::VERIFY4res verify41 {}; - for (int i = 0; i < NfsV41verifyOpsAmount; ++i) - { - analyzer->verify41(static_cast(nullptr), - static_cast(nullptr), - &verify41); - } - const struct NFS41::WRITE4res write41 {}; - for (int i = 0; i < NfsV41writeOpsAmount; ++i) - { - analyzer->write41(static_cast(nullptr), - static_cast(nullptr), - &write41); - } - const struct NFS41::RELEASE_LOCKOWNER4res release_lockowner41 {}; - for (int i = 0; i < NfsV41release_lockownerOpsAmount; ++i) - { - analyzer->release_lockowner41(static_cast(nullptr), - static_cast(nullptr), - &release_lockowner41); - } - const struct NFS41::BACKCHANNEL_CTL4res backchannel_ctl41 {}; - for (int i = 0; i < NfsV41backchannel_ctlOpsAmount; ++i) - { - analyzer->backchannel_ctl41(static_cast(nullptr), - static_cast(nullptr), - &backchannel_ctl41); - } - const struct NFS41::BIND_CONN_TO_SESSION4res bind_conn_to_session41 {}; - for (int i = 0; i < NfsV41bind_conn_to_sessionOpsAmount; ++i) - { - analyzer->bind_conn_to_session41(static_cast(nullptr), - static_cast(nullptr), - &bind_conn_to_session41); - } - const struct NFS41::EXCHANGE_ID4res exchange_id41 {}; - for (int i = 0; i < NfsV41exchange_idOpsAmount; ++i) - { - analyzer->exchange_id41(static_cast(nullptr), - static_cast(nullptr), - &exchange_id41); - } - const struct NFS41::CREATE_SESSION4res create_session41 {}; - for (int i = 0; i < NfsV41create_sessionOpsAmount; ++i) - { - analyzer->create_session41(static_cast(nullptr), - static_cast(nullptr), - &create_session41); - } - const struct NFS41::DESTROY_SESSION4res destroy_session41 {}; - for (int i = 0; i < NfsV41destroy_sessionOpsAmount; ++i) - { - analyzer->destroy_session41(static_cast(nullptr), - static_cast(nullptr), - &destroy_session41); - } - const struct NFS41::FREE_STATEID4res free_stateid41 {}; - for (int i = 0; i < NfsV41free_stateidOpsAmount; ++i) - { - analyzer->free_stateid41(static_cast(nullptr), - static_cast(nullptr), - &free_stateid41); - } - const struct NFS41::GET_DIR_DELEGATION4res get_dir_delegation41 {}; - for (int i = 0; i < NfsV41get_dir_delegationOpsAmount; ++i) - { - analyzer->get_dir_delegation41(static_cast(nullptr), - static_cast(nullptr), - &get_dir_delegation41); - } - const struct NFS41::GETDEVICEINFO4res getdeviceinfo41 {}; - for (int i = 0; i < NfsV41getdeviceinfoOpsAmount; ++i) - { - analyzer->getdeviceinfo41(static_cast(nullptr), - static_cast(nullptr), - &getdeviceinfo41); - } - const struct NFS41::GETDEVICELIST4res getdevicelist41 {}; - for (int i = 0; i < NfsV41getdevicelistOpsAmount; ++i) - { - analyzer->getdevicelist41(static_cast(nullptr), - static_cast(nullptr), - &getdevicelist41); - } - const struct NFS41::LAYOUTCOMMIT4res layoutcommit41 {}; - for (int i = 0; i < NfsV41layoutcommitOpsAmount; ++i) - { - analyzer->layoutcommit41(static_cast(nullptr), - static_cast(nullptr), - &layoutcommit41); - } - const struct NFS41::LAYOUTGET4res layoutget41 {}; - for (int i = 0; i < NfsV41layoutgetOpsAmount; ++i) - { - analyzer->layoutget41(static_cast(nullptr), - static_cast(nullptr), - &layoutget41); - } - const struct NFS41::LAYOUTRETURN4res layoutreturn41 {}; - for (int i = 0; i < NfsV41layoutreturnOpsAmount; ++i) - { - analyzer->layoutreturn41(static_cast(nullptr), - static_cast(nullptr), - &layoutreturn41); - } - const NFS41::SECINFO_NO_NAME4res secinfo_no_name41 {}; - for (int i = 0; i < NfsV41secinfo_no_nameOpsAmount; ++i) - { - analyzer->secinfo_no_name41(static_cast(nullptr), - static_cast(nullptr), - &secinfo_no_name41); - } - const struct NFS41::SEQUENCE4res sequence41 {}; - for (int i = 0; i < NfsV41sequenceOpsAmount; ++i) - { - analyzer->sequence41(static_cast(nullptr), - static_cast(nullptr), - &sequence41); - } - const struct NFS41::SET_SSV4res set_ssv41 {}; - for (int i = 0; i < NfsV41set_ssvOpsAmount; ++i) - { - analyzer->set_ssv41(static_cast(nullptr), - static_cast(nullptr), - &set_ssv41); - } - const struct NFS41::TEST_STATEID4res test_stateid41 {}; - for (int i = 0; i < NfsV41test_stateidOpsAmount; ++i) - { - analyzer->test_stateid41(static_cast(nullptr), - static_cast(nullptr), - &test_stateid41); - } - const struct NFS41::WANT_DELEGATION4res want_delegation41 {}; - for (int i = 0; i < NfsV41want_delegationOpsAmount; ++i) - { - analyzer->want_delegation41(static_cast(nullptr), - static_cast(nullptr), - &want_delegation41); - } - const struct NFS41::DESTROY_CLIENTID4res destroy_clientid41 {}; - for (int i = 0; i < NfsV41destroy_clientidOpsAmount; ++i) - { - analyzer->destroy_clientid41(static_cast(nullptr), - static_cast(nullptr), - &destroy_clientid41); - } - const struct NFS41::RECLAIM_COMPLETE4res reclaim_complete41 {}; - for (int i = 0; i < NfsV41reclaim_completeOpsAmount; ++i) - { - analyzer->reclaim_complete41(static_cast(nullptr), - static_cast(nullptr), - &reclaim_complete41); - } - const struct NFS41::ILLEGAL4res illegal41 {}; - for (int i = 0; i < NfsV41illegalOpsAmount; ++i) - { - analyzer->illegal41(static_cast(nullptr), - &illegal41); - } - - - } - virtual void TearDown() override final - { - analyzer.reset(); - } - - std::unique_ptr analyzer; -}; - -TEST_F(JsonAnalyzerCase, collectStatistics) -{ - // NFS3 procedures - EXPECT_EQ(NfsV3NullProcsAmount, analyzer->getNfsV3Stat().nullProcsAmount.load()); - EXPECT_EQ(NfsV3GetattrProcsAmount, analyzer->getNfsV3Stat().getattrProcsAmount.load()); - EXPECT_EQ(NfsV3SetattrProcsAmount, analyzer->getNfsV3Stat().setattrProcsAmount.load()); - EXPECT_EQ(NfsV3AccessProcsAmount, analyzer->getNfsV3Stat().accessProcsAmount.load()); - EXPECT_EQ(NfsV3ReadlinkProcsAmount, analyzer->getNfsV3Stat().readlinkProcsAmount.load()); - EXPECT_EQ(NfsV3ReadProcsAmount, analyzer->getNfsV3Stat().readProcsAmount.load()); - EXPECT_EQ(NfsV3WriteProcsAmount, analyzer->getNfsV3Stat().writeProcsAmount.load()); - EXPECT_EQ(NfsV3CreateProcsAmount, analyzer->getNfsV3Stat().createProcsAmount.load()); - EXPECT_EQ(NfsV3MkdirProcsAmount, analyzer->getNfsV3Stat().mkdirProcsAmount.load()); - EXPECT_EQ(NfsV3SymlinkProcsAmount, analyzer->getNfsV3Stat().symlinkProcsAmount.load()); - EXPECT_EQ(NfsV3MknodProcsAmount, analyzer->getNfsV3Stat().mknodProcsAmount.load()); - EXPECT_EQ(NfsV3RemoveProcsAmount, analyzer->getNfsV3Stat().removeProcsAmount.load()); - EXPECT_EQ(NfsV3RmdirProcsAmount, analyzer->getNfsV3Stat().rmdirProcsAmount.load()); - EXPECT_EQ(NfsV3RenameProcsAmount, analyzer->getNfsV3Stat().renameProcsAmount.load()); - EXPECT_EQ(NfsV3LinkProcsAmount, analyzer->getNfsV3Stat().linkProcsAmount.load()); - EXPECT_EQ(NfsV3ReaddirProcsAmount, analyzer->getNfsV3Stat().readdirProcsAmount.load()); - EXPECT_EQ(NfsV3ReaddirplusProcsAmount, analyzer->getNfsV3Stat().readdirplusProcsAmount.load()); - EXPECT_EQ(NfsV3FsstatProcsAmount, analyzer->getNfsV3Stat().fsstatProcsAmount.load()); - EXPECT_EQ(NfsV3FsinfoProcsAmount, analyzer->getNfsV3Stat().fsinfoProcsAmount.load()); - EXPECT_EQ(NfsV3PathconfProcsAmount, analyzer->getNfsV3Stat().pathconfProcsAmount.load()); - EXPECT_EQ(NfsV3CommitProcsAmount, analyzer->getNfsV3Stat().commitProcsAmount.load()); - - // NFS 4.0 procedures - EXPECT_EQ(NfsV40NullProcsAmount, analyzer->getNfsV40Stat().nullProcsAmount.load()); - EXPECT_EQ(NfsV40CompoundProcsAmount, analyzer->getNfsV40Stat().compoundProcsAmount.load()); - - // NFS 4.0 operations - EXPECT_EQ(NfsV40accessOpsAmount, analyzer->getNfsV40Stat().accessOpsAmount.load()); - EXPECT_EQ(NfsV40closeOpsAmount, analyzer->getNfsV40Stat().closeOpsAmount.load()); - EXPECT_EQ(NfsV40commitOpsAmount, analyzer->getNfsV40Stat().commitOpsAmount.load()); - EXPECT_EQ(NfsV40createOpsAmount, analyzer->getNfsV40Stat().createOpsAmount.load()); - EXPECT_EQ(NfsV40delegpurgeOpsAmount, analyzer->getNfsV40Stat().delegpurgeOpsAmount.load()); - EXPECT_EQ(NfsV40delegreturnOpsAmount, analyzer->getNfsV40Stat().delegreturnOpsAmount.load()); - EXPECT_EQ(NfsV40getattrOpsAmount, analyzer->getNfsV40Stat().getattrOpsAmount.load()); - EXPECT_EQ(NfsV40getfhOpsAmount, analyzer->getNfsV40Stat().getfhOpsAmount.load()); - EXPECT_EQ(NfsV40linkOpsAmount, analyzer->getNfsV40Stat().linkOpsAmount.load()); - EXPECT_EQ(NfsV40lockOpsAmount, analyzer->getNfsV40Stat().lockOpsAmount.load()); - EXPECT_EQ(NfsV40locktOpsAmount, analyzer->getNfsV40Stat().locktOpsAmount.load()); - EXPECT_EQ(NfsV40lockuOpsAmount, analyzer->getNfsV40Stat().lockuOpsAmount.load()); - EXPECT_EQ(NfsV40lookupOpsAmount, analyzer->getNfsV40Stat().lookupOpsAmount.load()); - EXPECT_EQ(NfsV40lookuppOpsAmount, analyzer->getNfsV40Stat().lookuppOpsAmount.load()); - EXPECT_EQ(NfsV40nverifyOpsAmount, analyzer->getNfsV40Stat().nverifyOpsAmount.load()); - EXPECT_EQ(NfsV40openOpsAmount, analyzer->getNfsV40Stat().openOpsAmount.load()); - EXPECT_EQ(NfsV40openattrOpsAmount, analyzer->getNfsV40Stat().openattrOpsAmount.load()); - EXPECT_EQ(NfsV40open_confirmOpsAmount, analyzer->getNfsV40Stat().open_confirmOpsAmount.load()); - EXPECT_EQ(NfsV40open_downgradeOpsAmount, analyzer->getNfsV40Stat().open_downgradeOpsAmount.load()); - EXPECT_EQ(NfsV40putfhOpsAmount, analyzer->getNfsV40Stat().putfhOpsAmount.load()); - EXPECT_EQ(NfsV40putpubfhOpsAmount, analyzer->getNfsV40Stat().putpubfhOpsAmount.load()); - EXPECT_EQ(NfsV40putrootfhOpsAmount, analyzer->getNfsV40Stat().putrootfhOpsAmount.load()); - EXPECT_EQ(NfsV40readOpsAmount, analyzer->getNfsV40Stat().readOpsAmount.load()); - EXPECT_EQ(NfsV40readdirOpsAmount, analyzer->getNfsV40Stat().readdirOpsAmount.load()); - EXPECT_EQ(NfsV40readlinkOpsAmount, analyzer->getNfsV40Stat().readlinkOpsAmount.load()); - EXPECT_EQ(NfsV40removeOpsAmount, analyzer->getNfsV40Stat().removeOpsAmount.load()); - EXPECT_EQ(NfsV40renameOpsAmount, analyzer->getNfsV40Stat().renameOpsAmount.load()); - EXPECT_EQ(NfsV40renewOpsAmount, analyzer->getNfsV40Stat().renewOpsAmount.load()); - EXPECT_EQ(NfsV40restorefhOpsAmount, analyzer->getNfsV40Stat().restorefhOpsAmount.load()); - EXPECT_EQ(NfsV40savefhOpsAmount, analyzer->getNfsV40Stat().savefhOpsAmount.load()); - EXPECT_EQ(NfsV40secinfoOpsAmount, analyzer->getNfsV40Stat().secinfoOpsAmount.load()); - EXPECT_EQ(NfsV40setattrOpsAmount, analyzer->getNfsV40Stat().setattrOpsAmount.load()); - EXPECT_EQ(NfsV40setclientidOpsAmount, analyzer->getNfsV40Stat().setclientidOpsAmount.load()); - EXPECT_EQ(NfsV40setclientid_confirmOpsAmount, analyzer->getNfsV40Stat().setclientid_confirmOpsAmount.load()); - EXPECT_EQ(NfsV40verifyOpsAmount, analyzer->getNfsV40Stat().verifyOpsAmount.load()); - EXPECT_EQ(NfsV40writeOpsAmount, analyzer->getNfsV40Stat().writeOpsAmount.load()); - EXPECT_EQ(NfsV40release_lockownerOpsAmount, analyzer->getNfsV40Stat().release_lockownerOpsAmount.load()); - EXPECT_EQ(NfsV40get_dir_delegationOpsAmount, analyzer->getNfsV40Stat().get_dir_delegationOpsAmount.load()); - EXPECT_EQ(NfsV40illegalOpsAmount, analyzer->getNfsV40Stat().illegalOpsAmount.load()); - - // NFS 4.1 procedures - EXPECT_EQ(NfsV41CompoundProcsAmount, analyzer->getNfsV41Stat().compoundProcsAmount.load()); - - // NFS 4.1 operations - EXPECT_EQ(NfsV41accessOpsAmount, analyzer->getNfsV41Stat().accessOpsAmount.load()); - EXPECT_EQ(NfsV41closeOpsAmount, analyzer->getNfsV41Stat().closeOpsAmount.load()); - EXPECT_EQ(NfsV41commitOpsAmount, analyzer->getNfsV41Stat().commitOpsAmount.load()); - EXPECT_EQ(NfsV41createOpsAmount, analyzer->getNfsV41Stat().createOpsAmount.load()); - EXPECT_EQ(NfsV41delegpurgeOpsAmount, analyzer->getNfsV41Stat().delegpurgeOpsAmount.load()); - EXPECT_EQ(NfsV41delegreturnOpsAmount, analyzer->getNfsV41Stat().delegreturnOpsAmount.load()); - EXPECT_EQ(NfsV41getattrOpsAmount, analyzer->getNfsV41Stat().getattrOpsAmount.load()); - EXPECT_EQ(NfsV41getfhOpsAmount, analyzer->getNfsV41Stat().getfhOpsAmount.load()); - EXPECT_EQ(NfsV41linkOpsAmount, analyzer->getNfsV41Stat().linkOpsAmount.load()); - EXPECT_EQ(NfsV41lockOpsAmount, analyzer->getNfsV41Stat().lockOpsAmount.load()); - EXPECT_EQ(NfsV41locktOpsAmount, analyzer->getNfsV41Stat().locktOpsAmount.load()); - EXPECT_EQ(NfsV41lockuOpsAmount, analyzer->getNfsV41Stat().lockuOpsAmount.load()); - EXPECT_EQ(NfsV41lookupOpsAmount, analyzer->getNfsV41Stat().lookupOpsAmount.load()); - EXPECT_EQ(NfsV41lookuppOpsAmount, analyzer->getNfsV41Stat().lookuppOpsAmount.load()); - EXPECT_EQ(NfsV41nverifyOpsAmount, analyzer->getNfsV41Stat().nverifyOpsAmount.load()); - EXPECT_EQ(NfsV41openOpsAmount, analyzer->getNfsV41Stat().openOpsAmount.load()); - EXPECT_EQ(NfsV41openattrOpsAmount, analyzer->getNfsV41Stat().openattrOpsAmount.load()); - EXPECT_EQ(NfsV41open_confirmOpsAmount, analyzer->getNfsV41Stat().open_confirmOpsAmount.load()); - EXPECT_EQ(NfsV41open_downgradeOpsAmount, analyzer->getNfsV41Stat().open_downgradeOpsAmount.load()); - EXPECT_EQ(NfsV41putfhOpsAmount, analyzer->getNfsV41Stat().putfhOpsAmount.load()); - EXPECT_EQ(NfsV41putpubfhOpsAmount, analyzer->getNfsV41Stat().putpubfhOpsAmount.load()); - EXPECT_EQ(NfsV41putrootfhOpsAmount, analyzer->getNfsV41Stat().putrootfhOpsAmount.load()); - EXPECT_EQ(NfsV41readOpsAmount, analyzer->getNfsV41Stat().readOpsAmount.load()); - EXPECT_EQ(NfsV41readdirOpsAmount, analyzer->getNfsV41Stat().readdirOpsAmount.load()); - EXPECT_EQ(NfsV41readlinkOpsAmount, analyzer->getNfsV41Stat().readlinkOpsAmount.load()); - EXPECT_EQ(NfsV41removeOpsAmount, analyzer->getNfsV41Stat().removeOpsAmount.load()); - EXPECT_EQ(NfsV41renameOpsAmount, analyzer->getNfsV41Stat().renameOpsAmount.load()); - EXPECT_EQ(NfsV41renewOpsAmount, analyzer->getNfsV41Stat().renewOpsAmount.load()); - EXPECT_EQ(NfsV41restorefhOpsAmount, analyzer->getNfsV41Stat().restorefhOpsAmount.load()); - EXPECT_EQ(NfsV41savefhOpsAmount, analyzer->getNfsV41Stat().savefhOpsAmount.load()); - EXPECT_EQ(NfsV41secinfoOpsAmount, analyzer->getNfsV41Stat().secinfoOpsAmount.load()); - EXPECT_EQ(NfsV41setattrOpsAmount, analyzer->getNfsV41Stat().setattrOpsAmount.load()); - EXPECT_EQ(NfsV41setclientidOpsAmount, analyzer->getNfsV41Stat().setclientidOpsAmount.load()); - EXPECT_EQ(NfsV41setclientid_confirmOpsAmount, analyzer->getNfsV41Stat().setclientid_confirmOpsAmount.load()); - EXPECT_EQ(NfsV41verifyOpsAmount, analyzer->getNfsV41Stat().verifyOpsAmount.load()); - EXPECT_EQ(NfsV41writeOpsAmount, analyzer->getNfsV41Stat().writeOpsAmount.load()); - EXPECT_EQ(NfsV41release_lockownerOpsAmount, analyzer->getNfsV41Stat().release_lockownerOpsAmount.load()); - EXPECT_EQ(NfsV41backchannel_ctlOpsAmount, analyzer->getNfsV41Stat().backchannel_ctlOpsAmount.load()); - EXPECT_EQ(NfsV41bind_conn_to_sessionOpsAmount, analyzer->getNfsV41Stat().bind_conn_to_sessionOpsAmount.load()); - EXPECT_EQ(NfsV41exchange_idOpsAmount, analyzer->getNfsV41Stat().exchange_idOpsAmount.load()); - EXPECT_EQ(NfsV41create_sessionOpsAmount, analyzer->getNfsV41Stat().create_sessionOpsAmount.load()); - EXPECT_EQ(NfsV41destroy_sessionOpsAmount, analyzer->getNfsV41Stat().destroy_sessionOpsAmount.load()); - EXPECT_EQ(NfsV41free_stateidOpsAmount, analyzer->getNfsV41Stat().free_stateidOpsAmount.load()); - EXPECT_EQ(NfsV41get_dir_delegationOpsAmount, analyzer->getNfsV41Stat().get_dir_delegationOpsAmount.load()); - EXPECT_EQ(NfsV41getdeviceinfoOpsAmount, analyzer->getNfsV41Stat().getdeviceinfoOpsAmount.load()); - EXPECT_EQ(NfsV41getdevicelistOpsAmount, analyzer->getNfsV41Stat().getdevicelistOpsAmount.load()); - EXPECT_EQ(NfsV41layoutcommitOpsAmount, analyzer->getNfsV41Stat().layoutcommitOpsAmount.load()); - EXPECT_EQ(NfsV41layoutgetOpsAmount, analyzer->getNfsV41Stat().layoutgetOpsAmount.load()); - EXPECT_EQ(NfsV41layoutreturnOpsAmount, analyzer->getNfsV41Stat().layoutreturnOpsAmount.load()); - EXPECT_EQ(NfsV41secinfo_no_nameOpsAmount, analyzer->getNfsV41Stat().secinfo_no_nameOpsAmount.load()); - EXPECT_EQ(NfsV41sequenceOpsAmount, analyzer->getNfsV41Stat().sequenceOpsAmount.load()); - EXPECT_EQ(NfsV41set_ssvOpsAmount, analyzer->getNfsV41Stat().set_ssvOpsAmount.load()); - EXPECT_EQ(NfsV41test_stateidOpsAmount, analyzer->getNfsV41Stat().test_stateidOpsAmount.load()); - EXPECT_EQ(NfsV41want_delegationOpsAmount, analyzer->getNfsV41Stat().want_delegationOpsAmount.load()); - EXPECT_EQ(NfsV41destroy_clientidOpsAmount, analyzer->getNfsV41Stat().destroy_clientidOpsAmount.load()); - EXPECT_EQ(NfsV41reclaim_completeOpsAmount, analyzer->getNfsV41Stat().reclaim_completeOpsAmount.load()); - EXPECT_EQ(NfsV41illegalOpsAmount, analyzer->getNfsV41Stat().illegalOpsAmount.load()); -} - -TEST_F(JsonAnalyzerCase, requestResponse) -{ - // Connecting to service - int s = socket(PF_INET, SOCK_STREAM, 0); - ASSERT_GE(s, 0); - IpEndpoint endpoint{ListenHost, ListenPort}; - ASSERT_EQ(0, connect(s, endpoint.addrinfo()->ai_addr, endpoint.addrinfo()->ai_addrlen)); - char receiveBuffer[ReceiveBufferSize]; - ssize_t bytesReceived = recv(s, receiveBuffer, sizeof(receiveBuffer), 0); - EXPECT_GT(bytesReceived, 0); - // Decoding and checking response - json_object* root = json_tokener_parse(std::string(receiveBuffer, bytesReceived).c_str()); - EXPECT_NE(nullptr, root); - EXPECT_EQ(json_type_object, json_object_get_type(root)); - - // Checking NFSv3 statistics - struct json_object* nfsV3Stat; - EXPECT_TRUE(json_object_object_get_ex(root, "nfs_v3", &nfsV3Stat)); - EXPECT_NE(nullptr, nfsV3Stat); - EXPECT_EQ(json_type_object, json_object_get_type(nfsV3Stat)); - - struct json_object* val; - EXPECT_TRUE(json_object_object_get_ex(nfsV3Stat, "null", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV3NullProcsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV3Stat, "getattr", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV3GetattrProcsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV3Stat, "setattr", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV3SetattrProcsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV3Stat, "lookup", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV3LookupProcsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV3Stat, "access", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV3AccessProcsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV3Stat, "readlink", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV3ReadlinkProcsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV3Stat, "read", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV3ReadProcsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV3Stat, "write", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV3WriteProcsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV3Stat, "create", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV3CreateProcsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV3Stat, "mkdir", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV3MkdirProcsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV3Stat, "symlink", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV3SymlinkProcsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV3Stat, "mkdnod", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV3MknodProcsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV3Stat, "remove", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV3RemoveProcsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV3Stat, "rmdir", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV3RmdirProcsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV3Stat, "rename", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV3RenameProcsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV3Stat, "link", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV3LinkProcsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV3Stat, "readdir", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV3ReaddirProcsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV3Stat, "readdirplus", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV3ReaddirplusProcsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV3Stat, "fsstat", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV3FsstatProcsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV3Stat, "fsinfo", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV3FsinfoProcsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV3Stat, "pathconf", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV3PathconfProcsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV3Stat, "commit", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV3CommitProcsAmount, json_object_get_int64(val)); - - // Checking NFSv4.0 statistics - struct json_object* nfsV40Stat; - EXPECT_TRUE(json_object_object_get_ex(root, "nfs_v40", &nfsV40Stat)); - EXPECT_NE(nullptr, nfsV40Stat); - - EXPECT_TRUE(json_object_object_get_ex(nfsV40Stat, "null", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV40NullProcsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV40Stat, "compound", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV40CompoundProcsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV40Stat, "access", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV40accessOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV40Stat, "close", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV40closeOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV40Stat, "commit", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV40commitOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV40Stat, "create", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV40createOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV40Stat, "delegpurge", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV40delegpurgeOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV40Stat, "delegreturn", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV40delegreturnOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV40Stat, "getattr", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV40getattrOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV40Stat, "getfh", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV40getfhOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV40Stat, "link", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV40linkOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV40Stat, "lock", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV40lockOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV40Stat, "lockt", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV40locktOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV40Stat, "locku", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV40lockuOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV40Stat, "lookup", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV40lookupOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV40Stat, "lookupp", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV40lookuppOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV40Stat, "nverify", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV40nverifyOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV40Stat, "open", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV40openOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV40Stat, "openattr", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV40openattrOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV40Stat, "open_confirm", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV40open_confirmOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV40Stat, "open_downgrade", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV40open_downgradeOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV40Stat, "putfh", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV40putfhOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV40Stat, "putpubfh", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV40putpubfhOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV40Stat, "putrootfh", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV40putrootfhOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV40Stat, "read", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV40readOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV40Stat, "readdir", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV40readdirOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV40Stat, "readlink", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV40readlinkOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV40Stat, "remove", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV40removeOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV40Stat, "rename", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV40renameOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV40Stat, "renew", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV40renewOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV40Stat, "restorefh", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV40restorefhOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV40Stat, "savefh", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV40savefhOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV40Stat, "secinfo", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV40secinfoOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV40Stat, "setattr", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV40setattrOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV40Stat, "setclientid", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV40setclientidOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV40Stat, "setclientid_confirm", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV40setclientid_confirmOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV40Stat, "verify", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV40verifyOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV40Stat, "write", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV40writeOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV40Stat, "release_lockowner", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV40release_lockownerOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV40Stat, "get_dir_delegation", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV40get_dir_delegationOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV40Stat, "illegal", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV40illegalOpsAmount, json_object_get_int64(val)); - - // Checking NFSv4.1 statistics - struct json_object* nfsV41Stat; - EXPECT_TRUE(json_object_object_get_ex(root, "nfs_v41", &nfsV41Stat)); - EXPECT_NE(nullptr, nfsV41Stat); - - EXPECT_TRUE(json_object_object_get_ex(nfsV41Stat, "compound", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV41CompoundProcsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV41Stat, "access", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV41accessOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV41Stat, "close", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV41closeOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV41Stat, "commit", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV41commitOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV41Stat, "create", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV41createOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV41Stat, "delegpurge", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV41delegpurgeOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV41Stat, "delegreturn", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV41delegreturnOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV41Stat, "getattr", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV41getattrOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV41Stat, "getfh", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV41getfhOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV41Stat, "link", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV41linkOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV41Stat, "lock", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV41lockOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV41Stat, "lockt", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV41locktOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV41Stat, "locku", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV41lockuOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV41Stat, "lookup", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV41lookupOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV41Stat, "lookupp", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV41lookuppOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV41Stat, "nverify", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV41nverifyOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV41Stat, "open", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV41openOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV41Stat, "openattr", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV41openattrOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV41Stat, "open_confirm", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV41open_confirmOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV41Stat, "open_downgrade", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV41open_downgradeOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV41Stat, "putfh", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV41putfhOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV41Stat, "putpubfh", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV41putpubfhOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV41Stat, "putrootfh", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV41putrootfhOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV41Stat, "read", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV41readOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV41Stat, "readdir", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV41readdirOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV41Stat, "readlink", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV41readlinkOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV41Stat, "remove", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV41removeOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV41Stat, "rename", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV41renameOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV41Stat, "renew", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV41renewOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV41Stat, "restorefh", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV41restorefhOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV41Stat, "savefh", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV41savefhOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV41Stat, "secinfo", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV41secinfoOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV41Stat, "setattr", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV41setattrOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV41Stat, "setclientid", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV41setclientidOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV41Stat, "setclientid_confirm", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV41setclientid_confirmOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV41Stat, "verify", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV41verifyOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV41Stat, "write", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV41writeOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV41Stat, "release_lockowner", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV41release_lockownerOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV41Stat, "backchannel_ctl", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV41backchannel_ctlOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV41Stat, "bind_conn_to_session", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV41bind_conn_to_sessionOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV41Stat, "exchange_id", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV41exchange_idOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV41Stat, "create_session", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV41create_sessionOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV41Stat, "destroy_session", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV41destroy_sessionOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV41Stat, "free_stateid", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV41free_stateidOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV41Stat, "get_dir_delegation", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV41get_dir_delegationOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV41Stat, "getdeviceinfo", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV41getdeviceinfoOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV41Stat, "getdevicelist", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV41getdevicelistOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV41Stat, "layoutcommit", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV41layoutcommitOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV41Stat, "layoutget", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV41layoutgetOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV41Stat, "layoutreturn", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV41layoutreturnOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV41Stat, "secinfo_no_name", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV41secinfo_no_nameOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV41Stat, "sequence", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV41sequenceOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV41Stat, "set_ssv", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV41set_ssvOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV41Stat, "test_stateid", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV41test_stateidOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV41Stat, "want_delegation", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV41want_delegationOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV41Stat, "destroy_clientid", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV41destroy_clientidOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV41Stat, "reclaim_complete", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV41reclaim_completeOpsAmount, json_object_get_int64(val)); - - EXPECT_TRUE(json_object_object_get_ex(nfsV41Stat, "illegal", &val)); - EXPECT_NE(nullptr, val); - EXPECT_EQ(json_type_int, json_object_get_type(val)); - EXPECT_EQ(NfsV41illegalOpsAmount, json_object_get_int64(val)); - - // Collecting garbage - json_object_put(root); - EXPECT_EQ(0, close(s)); -} - -TEST_F(JsonAnalyzerCase, slowClient) -{ - int s = socket(PF_INET, SOCK_STREAM, 0); - ASSERT_GE(s, 0); - IpEndpoint endpoint{ListenHost, ListenPort}; - ASSERT_EQ(0, connect(s, endpoint.addrinfo()->ai_addr, endpoint.addrinfo()->ai_addrlen)); - std::this_thread::sleep_for(std::chrono::milliseconds{SlowClientTimeoutMs}); - char receiveBuffer[ReceiveBufferSize]; - ssize_t bytesReceived = recv(s, receiveBuffer, sizeof(receiveBuffer), 0); - EXPECT_GE(bytesReceived, 0); - EXPECT_EQ(0, close(s)); -} - -int main(int argc, char** argv) -{ - setenv("LANG", "C", 1); - ::testing::InitGoogleTest(&argc, argv); - return RUN_ALL_TESTS(); -} diff --git a/tests/unit/protocols/cifsv2.cpp b/tests/unit/protocols/cifsv2.cpp index fe51209..2d5508f 100644 --- a/tests/unit/protocols/cifsv2.cpp +++ b/tests/unit/protocols/cifsv2.cpp @@ -30,6 +30,49 @@ using namespace NST::API::SMBv2; using namespace NST::protocols::CIFSv2; //------------------------------------------------------------------------------ +TEST(CIFSv2, check_CIFS_constants_helpers) +{ + // pc_to_net<> should transform constant to LE byte order. + // This test checks conversion of constants to host representation of ui32 + // ui16 words written in LE byte order format. + // UseCase: CIFSv1/CIFSv2 uses LE byteorder for encoding fields of messages + // in network traffic. These messages may be read on BE platform and should + // be compared with constants with corresponded BE byte order. + union TestData + { + std::uint64_t ui64; + std::uint32_t ui32; + std::uint16_t ui16; + std::uint8_t bytes[8]; + } data; + + constexpr auto cui64 = pc_to_net(0x0011223344556677); + + data.ui64 = cui64; + EXPECT_EQ(data.bytes[0], 0x77); + EXPECT_EQ(data.bytes[1], 0x66); + EXPECT_EQ(data.bytes[2], 0x55); + EXPECT_EQ(data.bytes[3], 0x44); + EXPECT_EQ(data.bytes[4], 0x33); + EXPECT_EQ(data.bytes[5], 0x22); + EXPECT_EQ(data.bytes[6], 0x11); + EXPECT_EQ(data.bytes[7], 0x00); + + constexpr auto cui32 = pc_to_net(0xAABBCCDD); + + data.ui32 = cui32; + EXPECT_EQ(data.bytes[0], 0xDD); + EXPECT_EQ(data.bytes[1], 0xCC); + EXPECT_EQ(data.bytes[2], 0xBB); + EXPECT_EQ(data.bytes[3], 0xAA); + + constexpr auto cui16 = pc_to_net(0xEEFF); + + data.ui16 = cui16; + EXPECT_EQ(data.bytes[0], 0xFF); + EXPECT_EQ(data.bytes[1], 0xEE); +} + TEST(CIFSv2, bodies) { diff --git a/traces/references/breakdown/eth-ipv4-tcp-nfsv3-4-41-cifs1-2.pcap.bz2.ref b/traces/references/breakdown/eth-ipv4-tcp-nfsv3-4-41-cifs1-2.pcap.bz2.ref index 9ba8756..8fdd919 100644 --- a/traces/references/breakdown/eth-ipv4-tcp-nfsv3-4-41-cifs1-2.pcap.bz2.ref +++ b/traces/references/breakdown/eth-ipv4-tcp-nfsv3-4-41-cifs1-2.pcap.bz2.ref @@ -124,7 +124,7 @@ READ_ANDX Count: 0 ( 0.00%) Min: 0.000 Max: 0.000 Avg: 0.000 St WRITE_ANDX Count: 149 ( 67.73%) Min: 0.000 Max: 0.563 Avg: 0.013 StDev: 0.05730764 NEW_FILE_SIZE Count: 0 ( 0.00%) Min: 0.000 Max: 0.000 Avg: 0.000 StDev: 0.00000000 CLOSE_AND_TREE_DISC Count: 0 ( 0.00%) Min: 0.000 Max: 0.000 Avg: 0.000 StDev: 0.00000000 -TRANSACTION2 Count: 51 ( 23.18%) Min: 0.000 Max: 0.029 Avg: 0.004 StDev: 0.00614999 +TRANSACTION2 Count: 51 ( 23.18%) Min: 0.001 Max: 0.029 Avg: 0.004 StDev: 0.00614999 TRANSACTION2_SECONDARY Count: 0 ( 0.00%) Min: 0.000 Max: 0.000 Avg: 0.000 StDev: 0.00000000 FIND_CLOSE2 Count: 0 ( 0.00%) Min: 0.000 Max: 0.000 Avg: 0.000 StDev: 0.00000000 FIND_NOTIFY_CLOSE Count: 0 ( 0.00%) Min: 0.000 Max: 0.000 Avg: 0.000 StDev: 0.00000000 -- cgit v1.2.3