summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Shadura <andrewsh@debian.org>2015-11-12 18:40:21 +0100
committerAndrew Shadura <andrewsh@debian.org>2015-11-12 18:40:21 +0100
commitdc07d8fbc513a49101e53e57a98906d7e07092a7 (patch)
tree5422f1ca143769b255205f881a489033baf126d1
parent1fc77e4078b7ceeacc0bb5f9696169e1a292a0f3 (diff)
Imported Upstream version 0.4.1
-rw-r--r--.travis.yml57
-rw-r--r--CHANGELOG.md8
-rw-r--r--CMakeLists.txt2
-rw-r--r--README.md9
-rw-r--r--analyzers/src/breakdown/latencies.cpp4
-rw-r--r--analyzers/src/breakdown/latencies.h2
-rw-r--r--docs/CMakeLists.txt4
-rw-r--r--docs/design/CMakeLists.txt34
-rw-r--r--docs/design/download_plantuml.cmake10
-rw-r--r--docs/design/libwatch/CMakeLists.txt15
-rw-r--r--docs/design/libwatch/class_diagram.plantuml111
-rw-r--r--docs/logo64.pngbin2114 -> 2078 bytes
-rw-r--r--src/analysis/cifs_parser.cpp14
-rw-r--r--src/analysis/print_analyzer.cpp41
-rw-r--r--src/analysis/rpc_sessions.h11
-rw-r--r--src/api/cifs_pc_to_net.h78
-rw-r--r--src/protocols/cifs2/cifs2.h4
-rw-r--r--src/protocols/cifs2/cifs2_utils.h13
-rw-r--r--tests/unit/analyzers/CMakeLists.txt1
-rw-r--r--tests/unit/analyzers/breakdown/latency.cpp34
-rw-r--r--tests/unit/analyzers/json/CMakeLists.txt19
-rw-r--r--tests/unit/analyzers/json/ip_endpoint.cpp41
-rw-r--r--tests/unit/analyzers/json/tcp_service.cpp165
-rw-r--r--tests/unit/analyzers/json/test_json_analyzer.cpp1799
-rw-r--r--tests/unit/protocols/cifsv2.cpp43
-rw-r--r--traces/references/breakdown/eth-ipv4-tcp-nfsv3-4-41-cifs1-2.pcap.bz2.ref2
26 files changed, 243 insertions, 2278 deletions
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<long double>(val.tv_sec) + val.tv_usec / 1000000.0L;
+ return static_cast<double>(val.tv_sec) + static_cast<double>(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=<dir_with_plantuml_jar>' 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<std::size_t>
-}
-
-class WatchAnalyzer {
- - _userGUI: UserGUI
- - _protocols: std::vector<AbstractProtocol*>
- + {abstract} onCommand(): void
- + {abstract} onUnixSignal(): void
-}
-
-class UserGUI << thread >> {
- - _isRunning: std::atomic<bool>
- - _shouldRefresh: std::atomic<bool>
- - _statisticsMutex: std::mutex
- - _statisticsContainer: std::unordered_map<AbstractProtocol*, CommandsStatistics>
- - _activeProtocol: AbstractProtocol&
- - _mainWindow: MainWindow
- - _headerWindow: HeaderWindow
- - _statisticsWindow: StatisticsWindow
- + UserGUI(protocols: std::vector<AbstractProtocol *>&)
- + incrementCommand(protocol: const AbstractProtocol&, commandId: std::size_t)
- + refresh()
- - run()
- - selectProtocol(protocol: const ActiveProtocol&)
-}
-
-note right of UserGUI
- <b>_statisticsContainer/_statisticsMutex</b>
- are used to thread-safely pass statistics from
- analyzer's thread to GUI's one;
- <b>run()</b> 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;
- <b>selectProtocol()</b> is to be called internally when
- a user changes active protocol;
- <b>incrementCommand()</b> is to be called from analyzer
- to update statistics on command detection;
- <b>refresh()</b> is to be called from analyzer
- to completely redraw GUI (e.g. on SIGCONT) -
- this method just sets <b>_shouldRefresh</b> to <b>true</b>
- but actual refresh is made in <b>run()</b>.
-end note
-
-class MainWindow #Khaki {
- - _handle: WINDOW*
-}
-
-class HeaderWindow #Khaki {
- - _handle: WINDOW*
- - _activeProtocol: const AbstractProtocol&
- + HeaderWindow(protocols: std::vector<AbstractProtocol *>&, activeProtocol: const AbstractProtocol&)
- + selectProtocol(protocol: const AbstractProtocol&)
- + refresh()
-}
-
-class StatisticsWindow #Khaki {
- - _handle: WINDOW*
- - _activeProtocol: const AbstractProtocol&
- - _statisticsContainer: const CommandsStatistics&
- - _scrollOffsets: std::unordered_map<AbstractProtocol*, std::size_t>
- + StatisticsWindow(activeProtocol: const AbstractProtocol&, statisticsContainer: const CommandsStatistics&)
- + selectProtocol(protocol: const AbstractProtocol&)
- + update()
- + scroll(increment: int)
- + refresh()
-}
-
-note top of StatisticsWindow
- <b>selectProtocol()</b> is to be called when a protocol is changed;
- <b>update()</b> is to be called to update statistics data;
- <b>scroll()</b> is to be called to scroll statistics data;
- <b>refresh()</b> 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
--- a/docs/logo64.png
+++ b/docs/logo64.png
Binary files 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 <http://www.gnu.org/licenses/>.
*/
//------------------------------------------------------------------------------
-#include <iostream>
-
#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<uint32_t>(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<uint32_t>(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<typename CommandType>
-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<typename CommandType>
-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<typename CommandType>
-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 <cinttypes>
#include <memory>
#include <string>
#include <vector>
@@ -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<uint32_t, FilteredDataQueue::Ptr> operations;
+ std::unordered_map<std::uint64_t, FilteredDataQueue::Ptr> operations;
};
template <typename Session>
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 <cstdint>
//------------------------------------------------------------------------------
-#ifdef __linux__
+#if defined(__linux__) || defined(__GNU__)
#include <endian.h>
#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<class T>
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<int number, class T>
-constexpr T switch_1_byte(T t)
+template<>
+constexpr std::uint64_t pc_to_net(std::uint64_t t)
{
- return ((t & (static_cast<T>(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<uint32_t>(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<uint32_t>(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<uint32_t>(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<uint32_t>(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<uint32_t>(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<uint32_t>(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 <iosfwd>
-#include <sstream>
+#include <ostream>
#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 <typename T>
-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 <cstdlib>
-#include <iostream>
#include <ctime>
+#include <sstream>
#include <gmock/gmock.h>
#include <gtest/gtest.h>
@@ -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<double>::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 <http://www.gnu.org/licenses/>.
-*/
-//------------------------------------------------------------------------------
-#include <stdexcept>
-
-#include <gmock/gmock.h>
-#include <gtest/gtest.h>
-
-#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 <http://www.gnu.org/licenses/>.
-*/
-//------------------------------------------------------------------------------
-#include <chrono>
-#include <thread>
-
-#include <gmock/gmock.h>
-#include <gtest/gtest.h>
-#include <sys/socket.h>
-
-#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<ssize_t>(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<size_t>(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<size_t>(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<int> 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<ssize_t>(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<size_t>(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 <http://www.gnu.org/licenses/>.
-*/
-//------------------------------------------------------------------------------
-#include <chrono>
-#include <thread>
-
-#include <gmock/gmock.h>
-#include <gtest/gtest.h>
-#include <json.h>
-
-#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<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS3::NULL3args*>(nullptr),
- static_cast<const struct NFS3::NULL3res*>(nullptr));
- }
- for (int i = 0; i < NfsV3GetattrProcsAmount; ++i)
- {
- analyzer->getattr3(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS3::GETATTR3args*>(nullptr),
- static_cast<const struct NFS3::GETATTR3res*>(nullptr));
- }
- for (int i = 0; i < NfsV3SetattrProcsAmount; ++i)
- {
- analyzer->setattr3(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS3::SETATTR3args*>(nullptr),
- static_cast<const struct NFS3::SETATTR3res*>(nullptr));
- }
- for (int i = 0; i < NfsV3LookupProcsAmount; ++i)
- {
- analyzer->lookup3(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS3::LOOKUP3args*>(nullptr),
- static_cast<const struct NFS3::LOOKUP3res*>(nullptr));
- }
- for (int i = 0; i < NfsV3AccessProcsAmount; ++i)
- {
- analyzer->access3(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS3::ACCESS3args*>(nullptr),
- static_cast<const struct NFS3::ACCESS3res*>(nullptr));
- }
- for (int i = 0; i < NfsV3ReadlinkProcsAmount; ++i)
- {
- analyzer->readlink3(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS3::READLINK3args*>(nullptr),
- static_cast<const struct NFS3::READLINK3res*>(nullptr));
- }
- for (int i = 0; i < NfsV3ReadProcsAmount; ++i)
- {
- analyzer->read3(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS3::READ3args*>(nullptr),
- static_cast<const struct NFS3::READ3res*>(nullptr));
- }
- for (int i = 0; i < NfsV3WriteProcsAmount; ++i)
- {
- analyzer->write3(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS3::WRITE3args*>(nullptr),
- static_cast<const struct NFS3::WRITE3res*>(nullptr));
- }
- for (int i = 0; i < NfsV3CreateProcsAmount; ++i)
- {
- analyzer->create3(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS3::CREATE3args*>(nullptr),
- static_cast<const struct NFS3::CREATE3res*>(nullptr));
- }
- for (int i = 0; i < NfsV3MkdirProcsAmount; ++i)
- {
- analyzer->mkdir3(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS3::MKDIR3args*>(nullptr),
- static_cast<const struct NFS3::MKDIR3res*>(nullptr));
- }
- for (int i = 0; i < NfsV3SymlinkProcsAmount; ++i)
- {
- analyzer->symlink3(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS3::SYMLINK3args*>(nullptr),
- static_cast<const struct NFS3::SYMLINK3res*>(nullptr));
- }
- for (int i = 0; i < NfsV3MknodProcsAmount; ++i)
- {
- analyzer->mknod3(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS3::MKNOD3args*>(nullptr),
- static_cast<const struct NFS3::MKNOD3res*>(nullptr));
- }
- for (int i = 0; i < NfsV3RemoveProcsAmount; ++i)
- {
- analyzer->remove3(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS3::REMOVE3args*>(nullptr),
- static_cast<const struct NFS3::REMOVE3res*>(nullptr));
- }
- for (int i = 0; i < NfsV3RmdirProcsAmount; ++i)
- {
- analyzer->rmdir3(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS3::RMDIR3args*>(nullptr),
- static_cast<const struct NFS3::RMDIR3res*>(nullptr));
- }
- for (int i = 0; i < NfsV3RenameProcsAmount; ++i)
- {
- analyzer->rename3(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS3::RENAME3args*>(nullptr),
- static_cast<const struct NFS3::RENAME3res*>(nullptr));
- }
- for (int i = 0; i < NfsV3LinkProcsAmount; ++i)
- {
- analyzer->link3(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS3::LINK3args*>(nullptr),
- static_cast<const struct NFS3::LINK3res*>(nullptr));
- }
- for (int i = 0; i < NfsV3ReaddirProcsAmount; ++i)
- {
- analyzer->readdir3(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS3::READDIR3args*>(nullptr),
- static_cast<const struct NFS3::READDIR3res*>(nullptr));
- }
- for (int i = 0; i < NfsV3ReaddirplusProcsAmount; ++i)
- {
- analyzer->readdirplus3(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS3::READDIRPLUS3args*>(nullptr),
- static_cast<const struct NFS3::READDIRPLUS3res*>(nullptr));
- }
- for (int i = 0; i < NfsV3FsstatProcsAmount; ++i)
- {
- analyzer->fsstat3(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS3::FSSTAT3args*>(nullptr),
- static_cast<const struct NFS3::FSSTAT3res*>(nullptr));
- }
- for (int i = 0; i < NfsV3FsinfoProcsAmount; ++i)
- {
- analyzer->fsinfo3(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS3::FSINFO3args*>(nullptr),
- static_cast<const struct NFS3::FSINFO3res*>(nullptr));
- }
- for (int i = 0; i < NfsV3PathconfProcsAmount; ++i)
- {
- analyzer->pathconf3(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS3::PATHCONF3args*>(nullptr),
- static_cast<const struct NFS3::PATHCONF3res*>(nullptr));
- }
- for (int i = 0; i < NfsV3CommitProcsAmount; ++i)
- {
- analyzer->commit3(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS3::COMMIT3args*>(nullptr),
- static_cast<const struct NFS3::COMMIT3res*>(nullptr));
- }
-
- // Setting up analyzer (NFSv4.0 procedures)
- for (int i = 0; i < NfsV40NullProcsAmount; ++i)
- {
- analyzer->null4(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS4::NULL4args*>(nullptr),
- static_cast<const struct NFS4::NULL4res*>(nullptr));
- }
- for (int i = 0; i < NfsV40CompoundProcsAmount; ++i)
- {
- analyzer->compound4(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS4::COMPOUND4args*>(nullptr),
- static_cast<const struct NFS4::COMPOUND4res*>(nullptr));
- }
-
- // Setting up analyzer (NFSv4.0 operations)
- const struct NFS4::ACCESS4res access40 {};
- for (int i = 0; i < NfsV40accessOpsAmount; ++i)
- {
- analyzer->access40(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS4::ACCESS4args*>(nullptr),
- &access40);
- }
- const struct NFS4::CLOSE4res close40 {};
- for (int i = 0; i < NfsV40closeOpsAmount; ++i)
- {
- analyzer->close40(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS4::CLOSE4args*>(nullptr),
- &close40);
- }
- const struct NFS4::COMMIT4res commit40 {};
- for (int i = 0; i < NfsV40commitOpsAmount; ++i)
- {
- analyzer->commit40(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS4::COMMIT4args*>(nullptr),
- &commit40);
- }
- const struct NFS4::CREATE4res create40 {};
- for (int i = 0; i < NfsV40createOpsAmount; ++i)
- {
- analyzer->create40(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS4::CREATE4args*>(nullptr),
- &create40);
- }
- const struct NFS4::DELEGPURGE4res delegpurge40 {};
- for (int i = 0; i < NfsV40delegpurgeOpsAmount; ++i)
- {
- analyzer->delegpurge40(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS4::DELEGPURGE4args*>(nullptr),
- &delegpurge40);
- }
- const struct NFS4::DELEGRETURN4res delegreturn40 {};
- for (int i = 0; i < NfsV40delegreturnOpsAmount; ++i)
- {
- analyzer->delegreturn40(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS4::DELEGRETURN4args*>(nullptr),
- &delegreturn40);
- }
- const struct NFS4::GETATTR4res getattr40 {};
- for (int i = 0; i < NfsV40getattrOpsAmount; ++i)
- {
- analyzer->getattr40(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS4::GETATTR4args*>(nullptr),
- &getattr40);
- }
- const struct NFS4::GETFH4res getfh40 {};
- for (int i = 0; i < NfsV40getfhOpsAmount; ++i)
- {
- analyzer->getfh40(static_cast<const RPCProcedure*>(nullptr),
- &getfh40);
- }
- const struct NFS4::LINK4res link40 {};
- for (int i = 0; i < NfsV40linkOpsAmount; ++i)
- {
- analyzer->link40(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS4::LINK4args*>(nullptr),
- &link40);
- }
- const struct NFS4::LOCK4res lock40 {};
- for (int i = 0; i < NfsV40lockOpsAmount; ++i)
- {
- analyzer->lock40(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS4::LOCK4args*>(nullptr),
- &lock40);
- }
- const struct NFS4::LOCKT4res lockt40 {};
- for (int i = 0; i < NfsV40locktOpsAmount; ++i)
- {
- analyzer->lockt40(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS4::LOCKT4args*>(nullptr),
- &lockt40);
- }
- const struct NFS4::LOCKU4res locku40 {};
- for (int i = 0; i < NfsV40lockuOpsAmount; ++i)
- {
- analyzer->locku40(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS4::LOCKU4args*>(nullptr),
- &locku40);
- }
- const struct NFS4::LOOKUP4res lookup40 {};
- for (int i = 0; i < NfsV40lookupOpsAmount; ++i)
- {
- analyzer->lookup40(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS4::LOOKUP4args*>(nullptr),
- &lookup40);
- }
- const struct NFS4::LOOKUPP4res lookupp40 {};
- for (int i = 0; i < NfsV40lookuppOpsAmount; ++i)
- {
- analyzer->lookupp40(static_cast<const RPCProcedure*>(nullptr),
- &lookupp40);
- }
- const struct NFS4::NVERIFY4res nverify40 {};
- for (int i = 0; i < NfsV40nverifyOpsAmount; ++i)
- {
- analyzer->nverify40(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS4::NVERIFY4args*>(nullptr),
- &nverify40);
- }
- const struct NFS4::OPEN4res open40 {};
- for (int i = 0; i < NfsV40openOpsAmount; ++i)
- {
- analyzer->open40(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS4::OPEN4args*>(nullptr),
- &open40);
- }
- const struct NFS4::OPENATTR4res openattr40 {};
- for (int i = 0; i < NfsV40openattrOpsAmount; ++i)
- {
- analyzer->openattr40(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS4::OPENATTR4args*>(nullptr),
- &openattr40);
- }
- const struct NFS4::OPEN_CONFIRM4res open_confirm40 {};
- for (int i = 0; i < NfsV40open_confirmOpsAmount; ++i)
- {
- analyzer->open_confirm40(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS4::OPEN_CONFIRM4args*>(nullptr),
- &open_confirm40);
- }
- const struct NFS4::OPEN_DOWNGRADE4res open_downgrade40 {};
- for (int i = 0; i < NfsV40open_downgradeOpsAmount; ++i)
- {
- analyzer->open_downgrade40(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS4::OPEN_DOWNGRADE4args*>(nullptr),
- &open_downgrade40);
- }
- const struct NFS4::PUTFH4res putfh40 {};
- for (int i = 0; i < NfsV40putfhOpsAmount; ++i)
- {
- analyzer->putfh40(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS4::PUTFH4args*>(nullptr),
- &putfh40);
- }
- const struct NFS4::PUTPUBFH4res putpubfh40 {};
- for (int i = 0; i < NfsV40putpubfhOpsAmount; ++i)
- {
- analyzer->putpubfh40(static_cast<const RPCProcedure*>(nullptr),
- &putpubfh40);
- }
- const struct NFS4::PUTROOTFH4res putrootfh40 {};
- for (int i = 0; i < NfsV40putrootfhOpsAmount; ++i)
- {
- analyzer->putrootfh40(static_cast<const RPCProcedure*>(nullptr),
- &putrootfh40);
- }
- const struct NFS4::READ4res read40 {};
- for (int i = 0; i < NfsV40readOpsAmount; ++i)
- {
- analyzer->read40(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS4::READ4args*>(nullptr),
- &read40);
- }
- const struct NFS4::READDIR4res readdir40 {};
- for (int i = 0; i < NfsV40readdirOpsAmount; ++i)
- {
- analyzer->readdir40(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS4::READDIR4args*>(nullptr),
- &readdir40);
- }
- const struct NFS4::READLINK4res readlink40 {};
- for (int i = 0; i < NfsV40readlinkOpsAmount; ++i)
- {
- analyzer->readlink40(static_cast<const RPCProcedure*>(nullptr),
- &readlink40);
- }
- const struct NFS4::REMOVE4res remove40 {};
- for (int i = 0; i < NfsV40removeOpsAmount; ++i)
- {
- analyzer->remove40(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS4::REMOVE4args*>(nullptr),
- &remove40);
- }
- const struct NFS4::RENAME4res rename40 {};
- for (int i = 0; i < NfsV40renameOpsAmount; ++i)
- {
- analyzer->rename40(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS4::RENAME4args*>(nullptr),
- &rename40);
- }
- const struct NFS4::RENEW4res renew40 {};
- for (int i = 0; i < NfsV40renewOpsAmount; ++i)
- {
- analyzer->renew40(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS4::RENEW4args*>(nullptr),
- &renew40);
- }
- const struct NFS4::RESTOREFH4res restorefh40 {};
- for (int i = 0; i < NfsV40restorefhOpsAmount; ++i)
- {
- analyzer->restorefh40(static_cast<const RPCProcedure*>(nullptr),
- &restorefh40);
- }
- const struct NFS4::SAVEFH4res savefh40 {};
- for (int i = 0; i < NfsV40savefhOpsAmount; ++i)
- {
- analyzer->savefh40(static_cast<const RPCProcedure*>(nullptr),
- &savefh40);
- }
- const struct NFS4::SECINFO4res secinfo40 {};
- for (int i = 0; i < NfsV40secinfoOpsAmount; ++i)
- {
- analyzer->secinfo40(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS4::SECINFO4args*>(nullptr),
- &secinfo40);
- }
- const struct NFS4::SETATTR4res setattr40 {};
- for (int i = 0; i < NfsV40setattrOpsAmount; ++i)
- {
- analyzer->setattr40(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS4::SETATTR4args*>(nullptr),
- &setattr40);
- }
- const struct NFS4::SETCLIENTID4res setclientid40 {};
- for (int i = 0; i < NfsV40setclientidOpsAmount; ++i)
- {
- analyzer->setclientid40(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS4::SETCLIENTID4args*>(nullptr),
- &setclientid40);
- }
- const struct NFS4::SETCLIENTID_CONFIRM4res setclientid_confirm40 {};
- for (int i = 0; i < NfsV40setclientid_confirmOpsAmount; ++i)
- {
- analyzer->setclientid_confirm40(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS4::SETCLIENTID_CONFIRM4args*>(nullptr),
- &setclientid_confirm40);
- }
- const struct NFS4::VERIFY4res verify40 {};
- for (int i = 0; i < NfsV40verifyOpsAmount; ++i)
- {
- analyzer->verify40(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS4::VERIFY4args*>(nullptr),
- &verify40);
- }
- const struct NFS4::WRITE4res write40 {};
- for (int i = 0; i < NfsV40writeOpsAmount; ++i)
- {
- analyzer->write40(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS4::WRITE4args*>(nullptr),
- &write40);
- }
- const struct NFS4::RELEASE_LOCKOWNER4res release_lockowner40 {};
- for (int i = 0; i < NfsV40release_lockownerOpsAmount; ++i)
- {
- analyzer->release_lockowner40(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS4::RELEASE_LOCKOWNER4args*>(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<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS4::GET_DIR_DELEGATION4args*>(nullptr),
- &get_dir_delegation40);
- }
- const struct NFS4::ILLEGAL4res illegal40 {};
- for (int i = 0; i < NfsV40illegalOpsAmount; ++i)
- {
- analyzer->illegal40(static_cast<const RPCProcedure*>(nullptr),
- &illegal40);
- }
-
- // Setting up analyzer (NFSv4.1 procedures)
- for (int i = 0; i < NfsV41CompoundProcsAmount; ++i)
- {
- analyzer->compound41(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS41::COMPOUND4args*>(nullptr),
- static_cast<const struct NFS41::COMPOUND4res*>(nullptr));
- }
-
- // Setting up analyzer (NFSv4.1 operations)
- const struct NFS41::ACCESS4res access41 {};
- for (int i = 0; i < NfsV41accessOpsAmount; ++i)
- {
- analyzer->access41(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS41::ACCESS4args*>(nullptr),
- &access41);
- }
- const struct NFS41::CLOSE4res close41 {};
- for (int i = 0; i < NfsV41closeOpsAmount; ++i)
- {
- analyzer->close41(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS41::CLOSE4args*>(nullptr),
- &close41);
- }
- const struct NFS41::COMMIT4res commit41 {};
- for (int i = 0; i < NfsV41commitOpsAmount; ++i)
- {
- analyzer->commit41(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS41::COMMIT4args*>(nullptr),
- &commit41);
- }
- const struct NFS41::CREATE4res create41 {};
- for (int i = 0; i < NfsV41createOpsAmount; ++i)
- {
- analyzer->create41(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS41::CREATE4args*>(nullptr),
- &create41);
- }
- const struct NFS41::DELEGPURGE4res delegpurge41 {};
- for (int i = 0; i < NfsV41delegpurgeOpsAmount; ++i)
- {
- analyzer->delegpurge41(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS41::DELEGPURGE4args*>(nullptr),
- &delegpurge41);
- }
- const struct NFS41::DELEGRETURN4res delegreturn41 {};
- for (int i = 0; i < NfsV41delegreturnOpsAmount; ++i)
- {
- analyzer->delegreturn41(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS41::DELEGRETURN4args*>(nullptr),
- &delegreturn41);
- }
- const struct NFS41::GETATTR4res getattr41 {};
- for (int i = 0; i < NfsV41getattrOpsAmount; ++i)
- {
- analyzer->getattr41(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS41::GETATTR4args*>(nullptr),
- &getattr41);
- }
- const struct NFS41::GETFH4res getfh41 {};
- for (int i = 0; i < NfsV41getfhOpsAmount; ++i)
- {
- analyzer->getfh41(static_cast<const RPCProcedure*>(nullptr),
- &getfh41);
- }
- const struct NFS41::LINK4res link41 {};
- for (int i = 0; i < NfsV41linkOpsAmount; ++i)
- {
- analyzer->link41(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS41::LINK4args*>(nullptr),
- &link41);
- }
- const struct NFS41::LOCK4res lock41 {};
- for (int i = 0; i < NfsV41lockOpsAmount; ++i)
- {
- analyzer->lock41(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS41::LOCK4args*>(nullptr),
- &lock41);
- }
- const struct NFS41::LOCKT4res lockt41 {};
- for (int i = 0; i < NfsV41locktOpsAmount; ++i)
- {
- analyzer->lockt41(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS41::LOCKT4args*>(nullptr),
- &lockt41);
- }
- const struct NFS41::LOCKU4res locku41 {};
- for (int i = 0; i < NfsV41lockuOpsAmount; ++i)
- {
- analyzer->locku41(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS41::LOCKU4args*>(nullptr),
- &locku41);
- }
- const struct NFS41::LOOKUP4res lookup41 {};
- for (int i = 0; i < NfsV41lookupOpsAmount; ++i)
- {
- analyzer->lookup41(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS41::LOOKUP4args*>(nullptr),
- &lookup41);
- }
- const struct NFS41::LOOKUPP4res lookupp41 {};
- for (int i = 0; i < NfsV41lookuppOpsAmount; ++i)
- {
- analyzer->lookupp41(static_cast<const RPCProcedure*>(nullptr),
- &lookupp41);
- }
- const struct NFS41::NVERIFY4res nverify41 {};
- for (int i = 0; i < NfsV41nverifyOpsAmount; ++i)
- {
- analyzer->nverify41(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS41::NVERIFY4args*>(nullptr),
- &nverify41);
- }
- const struct NFS41::OPEN4res open41 {};
- for (int i = 0; i < NfsV41openOpsAmount; ++i)
- {
- analyzer->open41(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS41::OPEN4args*>(nullptr),
- &open41);
- }
- const struct NFS41::OPENATTR4res openattr41 {};
- for (int i = 0; i < NfsV41openattrOpsAmount; ++i)
- {
- analyzer->openattr41(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS41::OPENATTR4args*>(nullptr),
- &openattr41);
- }
- const struct NFS41::OPEN_CONFIRM4res open_confirm41 {};
- for (int i = 0; i < NfsV41open_confirmOpsAmount; ++i)
- {
- analyzer->open_confirm41(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS41::OPEN_CONFIRM4args*>(nullptr),
- &open_confirm41);
- }
- const struct NFS41::OPEN_DOWNGRADE4res open_downgrade41 {};
- for (int i = 0; i < NfsV41open_downgradeOpsAmount; ++i)
- {
- analyzer->open_downgrade41(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS41::OPEN_DOWNGRADE4args*>(nullptr),
- &open_downgrade41);
- }
- const struct NFS41::PUTFH4res putfh41 {};
- for (int i = 0; i < NfsV41putfhOpsAmount; ++i)
- {
- analyzer->putfh41(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS41::PUTFH4args*>(nullptr),
- &putfh41);
- }
- const struct NFS41::PUTPUBFH4res putpubfh41 {};
- for (int i = 0; i < NfsV41putpubfhOpsAmount; ++i)
- {
- analyzer->putpubfh41(static_cast<const RPCProcedure*>(nullptr),
- &putpubfh41);
- }
- const struct NFS41::PUTROOTFH4res putrootfh41 {};
- for (int i = 0; i < NfsV41putrootfhOpsAmount; ++i)
- {
- analyzer->putrootfh41(static_cast<const RPCProcedure*>(nullptr),
- &putrootfh41);
- }
- const struct NFS41::READ4res read41 {};
- for (int i = 0; i < NfsV41readOpsAmount; ++i)
- {
- analyzer->read41(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS41::READ4args*>(nullptr),
- &read41);
- }
- const struct NFS41::READDIR4res readdir41 {};
- for (int i = 0; i < NfsV41readdirOpsAmount; ++i)
- {
- analyzer->readdir41(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS41::READDIR4args*>(nullptr),
- &readdir41);
- }
- const struct NFS41::READLINK4res readlink41 {};
- for (int i = 0; i < NfsV41readlinkOpsAmount; ++i)
- {
- analyzer->readlink41(static_cast<const RPCProcedure*>(nullptr),
- &readlink41);
- }
- const struct NFS41::REMOVE4res remove41 {};
- for (int i = 0; i < NfsV41removeOpsAmount; ++i)
- {
- analyzer->remove41(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS41::REMOVE4args*>(nullptr),
- &remove41);
- }
- const struct NFS41::RENAME4res rename41 {};
- for (int i = 0; i < NfsV41renameOpsAmount; ++i)
- {
- analyzer->rename41(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS41::RENAME4args*>(nullptr),
- &rename41);
- }
- const struct NFS41::RENEW4res renew41 {};
- for (int i = 0; i < NfsV41renewOpsAmount; ++i)
- {
- analyzer->renew41(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS41::RENEW4args*>(nullptr),
- &renew41);
- }
- const struct NFS41::RESTOREFH4res restorefh41 {};
- for (int i = 0; i < NfsV41restorefhOpsAmount; ++i)
- {
- analyzer->restorefh41(static_cast<const RPCProcedure*>(nullptr),
- &restorefh41);
- }
- const struct NFS41::SAVEFH4res savefh41 {};
- for (int i = 0; i < NfsV41savefhOpsAmount; ++i)
- {
- analyzer->savefh41(static_cast<const RPCProcedure*>(nullptr),
- &savefh41);
- }
- const struct NFS41::SECINFO4res secinfo41 {};
- for (int i = 0; i < NfsV41secinfoOpsAmount; ++i)
- {
- analyzer->secinfo41(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS41::SECINFO4args*>(nullptr),
- &secinfo41);
- }
- const struct NFS41::SETATTR4res setattr41 {};
- for (int i = 0; i < NfsV41setattrOpsAmount; ++i)
- {
- analyzer->setattr41(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS41::SETATTR4args*>(nullptr),
- &setattr41);
- }
- const struct NFS41::SETCLIENTID4res setclientid41 {};
- for (int i = 0; i < NfsV41setclientidOpsAmount; ++i)
- {
- analyzer->setclientid41(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS41::SETCLIENTID4args*>(nullptr),
- &setclientid41);
- }
- const struct NFS41::SETCLIENTID_CONFIRM4res setclientid_confirm41 {};
- for (int i = 0; i < NfsV41setclientid_confirmOpsAmount; ++i)
- {
- analyzer->setclientid_confirm41(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS41::SETCLIENTID_CONFIRM4args*>(nullptr),
- &setclientid_confirm41);
- }
- const struct NFS41::VERIFY4res verify41 {};
- for (int i = 0; i < NfsV41verifyOpsAmount; ++i)
- {
- analyzer->verify41(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS41::VERIFY4args*>(nullptr),
- &verify41);
- }
- const struct NFS41::WRITE4res write41 {};
- for (int i = 0; i < NfsV41writeOpsAmount; ++i)
- {
- analyzer->write41(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS41::WRITE4args*>(nullptr),
- &write41);
- }
- const struct NFS41::RELEASE_LOCKOWNER4res release_lockowner41 {};
- for (int i = 0; i < NfsV41release_lockownerOpsAmount; ++i)
- {
- analyzer->release_lockowner41(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS41::RELEASE_LOCKOWNER4args*>(nullptr),
- &release_lockowner41);
- }
- const struct NFS41::BACKCHANNEL_CTL4res backchannel_ctl41 {};
- for (int i = 0; i < NfsV41backchannel_ctlOpsAmount; ++i)
- {
- analyzer->backchannel_ctl41(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS41::BACKCHANNEL_CTL4args*>(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<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS41::BIND_CONN_TO_SESSION4args*>(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<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS41::EXCHANGE_ID4args*>(nullptr),
- &exchange_id41);
- }
- const struct NFS41::CREATE_SESSION4res create_session41 {};
- for (int i = 0; i < NfsV41create_sessionOpsAmount; ++i)
- {
- analyzer->create_session41(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS41::CREATE_SESSION4args*>(nullptr),
- &create_session41);
- }
- const struct NFS41::DESTROY_SESSION4res destroy_session41 {};
- for (int i = 0; i < NfsV41destroy_sessionOpsAmount; ++i)
- {
- analyzer->destroy_session41(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS41::DESTROY_SESSION4args*>(nullptr),
- &destroy_session41);
- }
- const struct NFS41::FREE_STATEID4res free_stateid41 {};
- for (int i = 0; i < NfsV41free_stateidOpsAmount; ++i)
- {
- analyzer->free_stateid41(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS41::FREE_STATEID4args*>(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<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS41::GET_DIR_DELEGATION4args*>(nullptr),
- &get_dir_delegation41);
- }
- const struct NFS41::GETDEVICEINFO4res getdeviceinfo41 {};
- for (int i = 0; i < NfsV41getdeviceinfoOpsAmount; ++i)
- {
- analyzer->getdeviceinfo41(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS41::GETDEVICEINFO4args*>(nullptr),
- &getdeviceinfo41);
- }
- const struct NFS41::GETDEVICELIST4res getdevicelist41 {};
- for (int i = 0; i < NfsV41getdevicelistOpsAmount; ++i)
- {
- analyzer->getdevicelist41(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS41::GETDEVICELIST4args*>(nullptr),
- &getdevicelist41);
- }
- const struct NFS41::LAYOUTCOMMIT4res layoutcommit41 {};
- for (int i = 0; i < NfsV41layoutcommitOpsAmount; ++i)
- {
- analyzer->layoutcommit41(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS41::LAYOUTCOMMIT4args*>(nullptr),
- &layoutcommit41);
- }
- const struct NFS41::LAYOUTGET4res layoutget41 {};
- for (int i = 0; i < NfsV41layoutgetOpsAmount; ++i)
- {
- analyzer->layoutget41(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS41::LAYOUTGET4args*>(nullptr),
- &layoutget41);
- }
- const struct NFS41::LAYOUTRETURN4res layoutreturn41 {};
- for (int i = 0; i < NfsV41layoutreturnOpsAmount; ++i)
- {
- analyzer->layoutreturn41(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS41::LAYOUTRETURN4args*>(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<const RPCProcedure*>(nullptr),
- static_cast<const NFS41::SECINFO_NO_NAME4args*>(nullptr),
- &secinfo_no_name41);
- }
- const struct NFS41::SEQUENCE4res sequence41 {};
- for (int i = 0; i < NfsV41sequenceOpsAmount; ++i)
- {
- analyzer->sequence41(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS41::SEQUENCE4args*>(nullptr),
- &sequence41);
- }
- const struct NFS41::SET_SSV4res set_ssv41 {};
- for (int i = 0; i < NfsV41set_ssvOpsAmount; ++i)
- {
- analyzer->set_ssv41(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS41::SET_SSV4args*>(nullptr),
- &set_ssv41);
- }
- const struct NFS41::TEST_STATEID4res test_stateid41 {};
- for (int i = 0; i < NfsV41test_stateidOpsAmount; ++i)
- {
- analyzer->test_stateid41(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS41::TEST_STATEID4args*>(nullptr),
- &test_stateid41);
- }
- const struct NFS41::WANT_DELEGATION4res want_delegation41 {};
- for (int i = 0; i < NfsV41want_delegationOpsAmount; ++i)
- {
- analyzer->want_delegation41(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS41::WANT_DELEGATION4args*>(nullptr),
- &want_delegation41);
- }
- const struct NFS41::DESTROY_CLIENTID4res destroy_clientid41 {};
- for (int i = 0; i < NfsV41destroy_clientidOpsAmount; ++i)
- {
- analyzer->destroy_clientid41(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS41::DESTROY_CLIENTID4args*>(nullptr),
- &destroy_clientid41);
- }
- const struct NFS41::RECLAIM_COMPLETE4res reclaim_complete41 {};
- for (int i = 0; i < NfsV41reclaim_completeOpsAmount; ++i)
- {
- analyzer->reclaim_complete41(static_cast<const RPCProcedure*>(nullptr),
- static_cast<const struct NFS41::RECLAIM_COMPLETE4args*>(nullptr),
- &reclaim_complete41);
- }
- const struct NFS41::ILLEGAL4res illegal41 {};
- for (int i = 0; i < NfsV41illegalOpsAmount; ++i)
- {
- analyzer->illegal41(static_cast<const RPCProcedure*>(nullptr),
- &illegal41);
- }
-
-
- }
- virtual void TearDown() override final
- {
- analyzer.reset();
- }
-
- std::unique_ptr<JsonAnalyzer> 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<std::uint64_t>(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<std::uint32_t>(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<std::uint16_t>(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