summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Shadura <andrewsh@debian.org>2015-11-12 18:40:22 +0100
committerAndrew Shadura <andrewsh@debian.org>2015-11-12 18:46:42 +0100
commitb525b1d2eda5183cea3a05abf81529fd0f25af30 (patch)
treece889463b410e8e5aea87b963e496b9b5520011a
parente7360e0ff3d50b95a44b9244e99d40180316ae29 (diff)
parentdc07d8fbc513a49101e53e57a98906d7e07092a7 (diff)
Merge tag 'upstream/0.4.1'
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--debian/changelog8
-rw-r--r--debian/patches/01-fix-build-on-debian-gnu-hurd-0457db31.patch22
-rw-r--r--debian/patches/02-remove-unstable-integration-test-from-unit-tests-230d472c.patch2074
-rw-r--r--debian/patches/03-fix-constants-of-smbv2-messageheader-58e067e1.patch25
-rw-r--r--debian/patches/04-fix-cifs-constants-on-be-arch-1d2c6224.patch115
-rw-r--r--debian/patches/05-fix-mismatch-of-cifsv2-requests-responses-c11ec8be.patch112
-rw-r--r--debian/patches/06-add-std-uint64_t-specialization-of-pc_to_net-3f44be7d.patch64
-rw-r--r--debian/patches/07-add-byteswap-to-cifs-on-be-ade6d79e.patch187
-rw-r--r--debian/patches/series7
-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--tests/unit/analyzers/breakdown/latency.cpp34
-rw-r--r--traces/references/breakdown/eth-ipv4-tcp-nfsv3-4-41-cifs1-2.pcap.bz2.ref2
23 files changed, 121 insertions, 2785 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/debian/changelog b/debian/changelog
index ee76cf9..8982f15 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,11 @@
+nfstrace (0.4.1-1) UNRELEASED; urgency=medium
+
+ * New upstream release.
+ * Update watch file to mangle the tarball filename.
+ * Drop patches applied upstream.
+
+ -- Andrew Shadura <andrewsh@debian.org> Thu, 12 Nov 2015 18:43:15 +0100
+
nfstrace (0.4.0-3) unstable; urgency=medium
* Apply more patches from upstream fixing FTBFS (Closes: #786801).
diff --git a/debian/patches/01-fix-build-on-debian-gnu-hurd-0457db31.patch b/debian/patches/01-fix-build-on-debian-gnu-hurd-0457db31.patch
deleted file mode 100644
index 248348c..0000000
--- a/debian/patches/01-fix-build-on-debian-gnu-hurd-0457db31.patch
+++ /dev/null
@@ -1,22 +0,0 @@
-From 0457db3181fca45e7bd66eb6d2662781122c86fe Mon Sep 17 00:00:00 2001
-From: Pavel Karneliuk <pavel.karneliuk@gmail.com>
-Date: Fri, 29 May 2015 14:06:37 -0400
-Subject: [PATCH] Fix build on Debian GNU/Hurd
-
----
- src/api/cifs_pc_to_net.h | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/src/api/cifs_pc_to_net.h b/src/api/cifs_pc_to_net.h
-index bf03af4..07bb784 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
diff --git a/debian/patches/02-remove-unstable-integration-test-from-unit-tests-230d472c.patch b/debian/patches/02-remove-unstable-integration-test-from-unit-tests-230d472c.patch
deleted file mode 100644
index 6dda611..0000000
--- a/debian/patches/02-remove-unstable-integration-test-from-unit-tests-230d472c.patch
+++ /dev/null
@@ -1,2074 +0,0 @@
-From 230d472c29adb54bef395e4e318bc069b5f218b5 Mon Sep 17 00:00:00 2001
-From: Pavel Karneliuk <pavel.karneliuk@gmail.com>
-Date: Sat, 30 May 2015 12:50:32 +0300
-Subject: [PATCH] remove unstable integration test from unit tests
-
----
- tests/unit/analyzers/CMakeLists.txt | 1 -
- tests/unit/analyzers/json/CMakeLists.txt | 19 -
- tests/unit/analyzers/json/ip_endpoint.cpp | 41 -
- tests/unit/analyzers/json/tcp_service.cpp | 165 --
- tests/unit/analyzers/json/test_json_analyzer.cpp | 1799 ----------------------
- 5 files changed, 2025 deletions(-)
- delete mode 100644 tests/unit/analyzers/json/CMakeLists.txt
- delete mode 100644 tests/unit/analyzers/json/ip_endpoint.cpp
- delete mode 100644 tests/unit/analyzers/json/tcp_service.cpp
- delete mode 100644 tests/unit/analyzers/json/test_json_analyzer.cpp
-
-diff --git a/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/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/debian/patches/03-fix-constants-of-smbv2-messageheader-58e067e1.patch b/debian/patches/03-fix-constants-of-smbv2-messageheader-58e067e1.patch
deleted file mode 100644
index 877d311..0000000
--- a/debian/patches/03-fix-constants-of-smbv2-messageheader-58e067e1.patch
+++ /dev/null
@@ -1,25 +0,0 @@
-From 58e067e11007d57d2185b8a2f5bbccee31379a17 Mon Sep 17 00:00:00 2001
-From: Pavel Karneliuk <pavel.karneliuk@gmail.com>
-Date: Sat, 30 May 2015 12:59:29 +0300
-Subject: [PATCH] Fix constants of SMBv2 MessageHeader flags due to
- specification: https://msdn.microsoft.com/en-us/library/cc246529.aspx
-
----
- src/protocols/cifs2/cifs2.h | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-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/debian/patches/04-fix-cifs-constants-on-be-arch-1d2c6224.patch b/debian/patches/04-fix-cifs-constants-on-be-arch-1d2c6224.patch
deleted file mode 100644
index 7cd908f..0000000
--- a/debian/patches/04-fix-cifs-constants-on-be-arch-1d2c6224.patch
+++ /dev/null
@@ -1,115 +0,0 @@
-From 1d2c62248803091c371095b9cfc5cb048ef43935 Mon Sep 17 00:00:00 2001
-From: Pavel Karneliuk <pavel.karneliuk@gmail.com>
-Date: Fri, 12 Jun 2015 19:20:32 +0000
-Subject: [PATCH] Fix CIFS constants on BE arch. Add unit test for
- pc_to_net<>()
-
----
- src/api/cifs_pc_to_net.h | 37 ++++++++-----------------------------
- tests/unit/protocols/cifsv2.cpp | 30 ++++++++++++++++++++++++++++++
- 2 files changed, 38 insertions(+), 29 deletions(-)
-
-diff --git a/src/api/cifs_pc_to_net.h b/src/api/cifs_pc_to_net.h
-index 07bb784..5b9ef6b 100644
---- a/src/api/cifs_pc_to_net.h
-+++ b/src/api/cifs_pc_to_net.h
-@@ -46,10 +46,8 @@ 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)
- {
-@@ -57,39 +55,20 @@ constexpr T pc_to_net(T t)
- 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)
--{
-- return ((t & (static_cast<T>(0xff) << number*8)) << ((sizeof(T) - 1 - number)*8));
--}
--
--/*!
-- * 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);
- }
-
- # else
-diff --git a/tests/unit/protocols/cifsv2.cpp b/tests/unit/protocols/cifsv2.cpp
-index fe51209..59e854d 100644
---- a/tests/unit/protocols/cifsv2.cpp
-+++ b/tests/unit/protocols/cifsv2.cpp
-@@ -30,6 +30,36 @@
- 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::uint32_t ui32;
-+ std::uint16_t ui16;
-+ std::uint8_t bytes[4];
-+ } data;
-+
-+ 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/debian/patches/05-fix-mismatch-of-cifsv2-requests-responses-c11ec8be.patch b/debian/patches/05-fix-mismatch-of-cifsv2-requests-responses-c11ec8be.patch
deleted file mode 100644
index dd69787..0000000
--- a/debian/patches/05-fix-mismatch-of-cifsv2-requests-responses-c11ec8be.patch
+++ /dev/null
@@ -1,112 +0,0 @@
-From c11ec8be1c2a6d7ea5ffab71406cedafbe67ec4b Mon Sep 17 00:00:00 2001
-From: Pavel Karneliuk <pavel.karneliuk@gmail.com>
-Date: Sat, 13 Jun 2015 20:13:48 +0000
-Subject: [PATCH] Fix mismatch of CIFSv2 requests/responses. Following tests
- work correctly on MIPS: 1 -
- functional_stat:eth-ipv4-tcp-smb2-zero-file-rw.pcap.bz2 2 -
- functional_drain:eth-ipv4-tcp-smb2-zero-file-rw.pcap.bz2 16 -
- functional_stat:eth-ipv4-tcp-smb2-putty.pcap.bz2 17 -
- functional_drain:eth-ipv4-tcp-smb2-putty.pcap.bz2
-
----
- src/analysis/cifs_parser.cpp | 14 ++++----------
- src/analysis/rpc_sessions.h | 11 ++++++-----
- 2 files changed, 10 insertions(+), 15 deletions(-)
-
-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/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 @@ class Session : public utils::ApplicationSession
- 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 @@ class Session : public utils::ApplicationSession
- }
- 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 @@ class Session : public utils::ApplicationSession
-
- // 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/debian/patches/06-add-std-uint64_t-specialization-of-pc_to_net-3f44be7d.patch b/debian/patches/06-add-std-uint64_t-specialization-of-pc_to_net-3f44be7d.patch
deleted file mode 100644
index cccd88a..0000000
--- a/debian/patches/06-add-std-uint64_t-specialization-of-pc_to_net-3f44be7d.patch
+++ /dev/null
@@ -1,64 +0,0 @@
-From 3f44be7d03a1f972177322e744ea2a1bc1855b56 Mon Sep 17 00:00:00 2001
-From: Pavel Karneliuk <pavel.karneliuk@gmail.com>
-Date: Sat, 13 Jun 2015 22:28:27 +0000
-Subject: [PATCH] add std::uint64_t specialization of pc_to_net
-
----
- src/api/cifs_pc_to_net.h | 13 +++++++++++++
- tests/unit/protocols/cifsv2.cpp | 15 ++++++++++++++-
- 2 files changed, 27 insertions(+), 1 deletion(-)
-
-diff --git a/src/api/cifs_pc_to_net.h b/src/api/cifs_pc_to_net.h
-index 5b9ef6b..f5c9aa4 100644
---- a/src/api/cifs_pc_to_net.h
-+++ b/src/api/cifs_pc_to_net.h
-@@ -56,6 +56,19 @@ constexpr T pc_to_net(T t)
- }
-
- template<>
-+constexpr std::uint64_t pc_to_net(std::uint64_t t)
-+{
-+ 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);
-+}
-+
-+template<>
- constexpr uint32_t pc_to_net(uint32_t t)
- {
- return ((t & 0xFF000000) >> 24)
-diff --git a/tests/unit/protocols/cifsv2.cpp b/tests/unit/protocols/cifsv2.cpp
-index 59e854d..2d5508f 100644
---- a/tests/unit/protocols/cifsv2.cpp
-+++ b/tests/unit/protocols/cifsv2.cpp
-@@ -40,11 +40,24 @@ TEST(CIFSv2, check_CIFS_constants_helpers)
- // 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[4];
-+ 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;
diff --git a/debian/patches/07-add-byteswap-to-cifs-on-be-ade6d79e.patch b/debian/patches/07-add-byteswap-to-cifs-on-be-ade6d79e.patch
deleted file mode 100644
index 9e48676..0000000
--- a/debian/patches/07-add-byteswap-to-cifs-on-be-ade6d79e.patch
+++ /dev/null
@@ -1,187 +0,0 @@
-From ade6d79ee0c2b9a08bdba0c4f849f61931e24d5e Mon Sep 17 00:00:00 2001
-From: Pavel Karneliuk <pavel.karneliuk@gmail.com>
-Date: Wed, 17 Jun 2015 18:41:21 +0000
-Subject: [PATCH] HOTFIX: add byteswap to some members in CIFSv2 structs on BE
- arch
-
-Following tests work correctly on MIPS:
- 3 - functional_out:eth-ipv4-tcp-smb2-zero-file-rw.pcap.bz2
- 18 - functional_out:eth-ipv4-tcp-smb2-putty.pcap.bz2
- 24 - functional_out:eth-ipv4-tcp-nfsv3-4-41-cifs1-2.pcap.bz2
- 36 - functional_out:eth-ipv4-tcp-cifs2.pcap.bz2
----
- src/analysis/print_analyzer.cpp | 41 +++++++++++++++++----------------------
- src/api/cifs_pc_to_net.h | 32 +++++++++++++++++++++++++++++-
- src/protocols/cifs2/cifs2_utils.h | 13 +++++++------
- 3 files changed, 56 insertions(+), 30 deletions(-)
-
-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/api/cifs_pc_to_net.h b/src/api/cifs_pc_to_net.h
-index f5c9aa4..2587bd2 100644
---- a/src/api/cifs_pc_to_net.h
-+++ b/src/api/cifs_pc_to_net.h
-@@ -51,7 +51,7 @@ namespace SMBv2
- 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;
- }
-
-@@ -84,6 +84,36 @@ constexpr uint16_t pc_to_net(uint16_t t)
- | ((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
- # if NFSTRACE_BYTE_ORDER == NFSTRACE_LITTLE_ENDIAN
-
-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/debian/patches/series b/debian/patches/series
deleted file mode 100644
index 4ad9af3..0000000
--- a/debian/patches/series
+++ /dev/null
@@ -1,7 +0,0 @@
-01-fix-build-on-debian-gnu-hurd-0457db31.patch
-02-remove-unstable-integration-test-from-unit-tests-230d472c.patch
-03-fix-constants-of-smbv2-messageheader-58e067e1.patch
-04-fix-cifs-constants-on-be-arch-1d2c6224.patch
-05-fix-mismatch-of-cifsv2-requests-responses-c11ec8be.patch
-06-add-std-uint64_t-specialization-of-pc_to_net-3f44be7d.patch
-07-add-byteswap-to-cifs-on-be-ade6d79e.patch
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/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/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