mirror of
https://github.com/outbackdingo/parodus.git
synced 2026-01-27 18:20:04 +00:00
Compare commits
285 Commits
nopoll_par
...
1.0.1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8d7cc47e62 | ||
|
|
326e83c177 | ||
|
|
3df3876553 | ||
|
|
77f16d65db | ||
|
|
6e4f8e92d1 | ||
|
|
7b106585cd | ||
|
|
cb3da5a343 | ||
|
|
6e1a0fccf4 | ||
|
|
b7e5d47f65 | ||
|
|
7e9d3c80c5 | ||
|
|
50d9271e90 | ||
|
|
982cf14f55 | ||
|
|
91a9d4d679 | ||
|
|
6bcae50f0e | ||
|
|
e5ac5c0712 | ||
|
|
3e23aeb451 | ||
|
|
a61de51dfe | ||
|
|
dc099a553c | ||
|
|
0b3b31fc6f | ||
|
|
bebaf9efa0 | ||
|
|
a8ecc96cdb | ||
|
|
8f77883a11 | ||
|
|
602ba21a8d | ||
|
|
32dc7b4b93 | ||
|
|
de0eefbaa6 | ||
|
|
d636cfffe9 | ||
|
|
2af5845e76 | ||
|
|
a2079aabf1 | ||
|
|
880e4a8765 | ||
|
|
3d3c965807 | ||
|
|
2a4fa2ffc4 | ||
|
|
d0535521c7 | ||
|
|
5663981ac0 | ||
|
|
844ee1c240 | ||
|
|
dc81484779 | ||
|
|
e0c69f5e29 | ||
|
|
3768ef17f1 | ||
|
|
fbe267ee82 | ||
|
|
a619b59e23 | ||
|
|
1ceedbf772 | ||
|
|
d22f497e4e | ||
|
|
dd77f874b5 | ||
|
|
280166b4ca | ||
|
|
1012afeebf | ||
|
|
d13daec5b1 | ||
|
|
f57caffb2e | ||
|
|
b15a2cd638 | ||
|
|
d2853fe742 | ||
|
|
3986da3885 | ||
|
|
38f855f1a3 | ||
|
|
bb16704bed | ||
|
|
ac74889b9a | ||
|
|
cbeeb44702 | ||
|
|
d6a6bf8549 | ||
|
|
b5633ba8db | ||
|
|
05d24b6b57 | ||
|
|
375e3ef79a | ||
|
|
3fd1b5ce38 | ||
|
|
a9d9c6a538 | ||
|
|
4ea905e491 | ||
|
|
6a2db59bbe | ||
|
|
89ab46499a | ||
|
|
6b6b943ef0 | ||
|
|
7eec176414 | ||
|
|
7a7e7acb19 | ||
|
|
7328a559f8 | ||
|
|
a279ee71c9 | ||
|
|
facae2e9f4 | ||
|
|
f3e506e943 | ||
|
|
38e5c0b5b5 | ||
|
|
e01ae80307 | ||
|
|
12a034f451 | ||
|
|
a1e63ca251 | ||
|
|
355b7d7bd3 | ||
|
|
bbf5fc263c | ||
|
|
45c1865cb1 | ||
|
|
06f96abe41 | ||
|
|
ee9d7684c6 | ||
|
|
951be13bc0 | ||
|
|
c5819e4cb1 | ||
|
|
38d2596458 | ||
|
|
8c79a7712d | ||
|
|
15d9b14e31 | ||
|
|
c3d66f7a45 | ||
|
|
659bb28ce7 | ||
|
|
0725e9f3ae | ||
|
|
3e264707e7 | ||
|
|
e6c41ee386 | ||
|
|
6b5f24f81b | ||
|
|
4dd693d2b5 | ||
|
|
8eb6ff8fa8 | ||
|
|
c067faa65a | ||
|
|
e0ecd1bbd7 | ||
|
|
a06d507422 | ||
|
|
a1b676e5fe | ||
|
|
4276e2dd24 | ||
|
|
dc8f9f49f0 | ||
|
|
0618690bf4 | ||
|
|
7b1ef043ef | ||
|
|
1da5978eac | ||
|
|
df96235321 | ||
|
|
9421a3d01a | ||
|
|
c277ef4587 | ||
|
|
472b769874 | ||
|
|
4e1f77c1df | ||
|
|
b07ff93fd8 | ||
|
|
9aacf1cbb3 | ||
|
|
5545dbc84f | ||
|
|
755e15fd6c | ||
|
|
492688e6e7 | ||
|
|
9c98105e35 | ||
|
|
0a4ef718f6 | ||
|
|
7eba72b2af | ||
|
|
5af33bec8c | ||
|
|
0f71f45ca6 | ||
|
|
89da01fad0 | ||
|
|
0e927c0f26 | ||
|
|
6bcc88c55a | ||
|
|
9cd80c1237 | ||
|
|
20fc1bb8a0 | ||
|
|
46767bf392 | ||
|
|
deec73c5a5 | ||
|
|
b6f315bbb7 | ||
|
|
202b5deb68 | ||
|
|
a69acfeabb | ||
|
|
36dc370ef8 | ||
|
|
587027ce78 | ||
|
|
a254fc17d7 | ||
|
|
f3abee1a04 | ||
|
|
d85f790407 | ||
|
|
12565db6e9 | ||
|
|
6a396c2197 | ||
|
|
633cfe1636 | ||
|
|
7e74d05196 | ||
|
|
fc72633519 | ||
|
|
62aea40eb4 | ||
|
|
c693a34a15 | ||
|
|
d6fb9073ed | ||
|
|
136da0621e | ||
|
|
2aa134c9d4 | ||
|
|
0a7d2f3a1a | ||
|
|
968727eece | ||
|
|
bac0a6983d | ||
|
|
f877b9c22f | ||
|
|
9b988c6878 | ||
|
|
91d7f4a02b | ||
|
|
b74f73ee73 | ||
|
|
df53862dec | ||
|
|
b85e78fb7b | ||
|
|
38b8cbf4ac | ||
|
|
4671e40b32 | ||
|
|
22278846e1 | ||
|
|
ed3ec23a47 | ||
|
|
b1b6883799 | ||
|
|
79b6861af6 | ||
|
|
e298549510 | ||
|
|
3a181d2ffe | ||
|
|
be71810dea | ||
|
|
2bf902242f | ||
|
|
2b15321a77 | ||
|
|
f21a00616a | ||
|
|
8df4ad3cbc | ||
|
|
7f2aa3f826 | ||
|
|
7946f585ee | ||
|
|
5f10aae6c2 | ||
|
|
e11927f8de | ||
|
|
c478da9f7c | ||
|
|
0bdb8f96b8 | ||
|
|
b1c9cdfa16 | ||
|
|
04cefb9037 | ||
|
|
21fe137755 | ||
|
|
807839f8c5 | ||
|
|
bbf8813303 | ||
|
|
e9ae72c79b | ||
|
|
268b1a2e82 | ||
|
|
ca4132b9e3 | ||
|
|
7d8c0bcff2 | ||
|
|
0ba7f5b95a | ||
|
|
36735f588d | ||
|
|
5f4d640467 | ||
|
|
7bc99bb48c | ||
|
|
cf1e9c51d2 | ||
|
|
14241251d8 | ||
|
|
eb67134b10 | ||
|
|
93f30417de | ||
|
|
d282afca4f | ||
|
|
81dff2cef0 | ||
|
|
a3991b3ed9 | ||
|
|
afbb5c5fa0 | ||
|
|
0003bc4a25 | ||
|
|
b83392f519 | ||
|
|
50a8cd7911 | ||
|
|
5c388d1db7 | ||
|
|
aa596dd3c2 | ||
|
|
7829ec3de6 | ||
|
|
f214d119a3 | ||
|
|
99393a233d | ||
|
|
8b8c3f0950 | ||
|
|
a461a7da10 | ||
|
|
61ee6aca96 | ||
|
|
774ec17e4e | ||
|
|
1fdf4a46ef | ||
|
|
b8a48a400d | ||
|
|
acdb5c9937 | ||
|
|
76505cd414 | ||
|
|
d270f480e9 | ||
|
|
7fb0ed583c | ||
|
|
73a64224cd | ||
|
|
fe70242243 | ||
|
|
d111826d92 | ||
|
|
818b84257c | ||
|
|
b1078b53d6 | ||
|
|
54849bba00 | ||
|
|
f9b6ae840d | ||
|
|
831df10422 | ||
|
|
c63867a936 | ||
|
|
0b90f0fe3b | ||
|
|
429abeb6a5 | ||
|
|
0acefa0c37 | ||
|
|
36fc6a7e51 | ||
|
|
66c6ec779d | ||
|
|
e888235850 | ||
|
|
678d6c5f2d | ||
|
|
80f82521bd | ||
|
|
a73373e055 | ||
|
|
a9f11e85c6 | ||
|
|
72ec4daf74 | ||
|
|
278c1199cd | ||
|
|
75c446b220 | ||
|
|
e78174f314 | ||
|
|
3ee3ec356d | ||
|
|
e09ae35682 | ||
|
|
9fbe242ec7 | ||
|
|
275f5595ce | ||
|
|
a9b4b44504 | ||
|
|
dbc7b99b31 | ||
|
|
b68ba089cd | ||
|
|
6a921bd396 | ||
|
|
b02c30256c | ||
|
|
9a09357fc3 | ||
|
|
19208e2d0f | ||
|
|
aacbcf5360 | ||
|
|
63b9b50534 | ||
|
|
7e5aefd10a | ||
|
|
912638d59b | ||
|
|
883814ba42 | ||
|
|
718beac0bd | ||
|
|
88c4315a68 | ||
|
|
d4bf5dc099 | ||
|
|
3e91b55197 | ||
|
|
48d94661a3 | ||
|
|
0da33e5ec3 | ||
|
|
f67f385584 | ||
|
|
c55a480830 | ||
|
|
976810432e | ||
|
|
451517ca2b | ||
|
|
c96fd044de | ||
|
|
0e2bc12736 | ||
|
|
6dbf2d479b | ||
|
|
f8a0179753 | ||
|
|
05fad15ac5 | ||
|
|
6f96cf6529 | ||
|
|
5ab7f7a697 | ||
|
|
0807c5623f | ||
|
|
5eebbb8f49 | ||
|
|
d19a6f0022 | ||
|
|
6aeb6a42b1 | ||
|
|
7e5ec0d670 | ||
|
|
58c3fe35db | ||
|
|
056659c19e | ||
|
|
ee0d1dd6c0 | ||
|
|
e2296b497c | ||
|
|
3b2b14056c | ||
|
|
5c17a9fc73 | ||
|
|
d8e78ff982 | ||
|
|
1ecc3ad516 | ||
|
|
dd6fc7551a | ||
|
|
40e7963d29 | ||
|
|
866eb6b128 | ||
|
|
f927aba40c | ||
|
|
a55d28d85d | ||
|
|
b222bf7a7b | ||
|
|
699fabc6df | ||
|
|
8007039712 | ||
|
|
e11a52fb57 |
@@ -13,7 +13,7 @@ addons:
|
||||
notification_email: weston_schmidt@alumni.purdue.edu
|
||||
build_command_prepend: "mkdir coverity_build && cd coverity_build && cmake .."
|
||||
build_command: "make"
|
||||
branch_pattern: master
|
||||
branch_pattern: ignore
|
||||
|
||||
before_install:
|
||||
- sudo pip install codecov
|
||||
@@ -21,13 +21,14 @@ before_install:
|
||||
|
||||
install:
|
||||
- sudo apt-get update -qq
|
||||
- sudo apt-get install -y -qq libcunit1 libcunit1-dev uuid-dev valgrind
|
||||
- sudo apt-get install -y -qq check libcunit1 libcunit1-dev uuid-dev valgrind
|
||||
|
||||
script:
|
||||
- mkdir build
|
||||
- cd build
|
||||
- cmake .. -DINTEGRATION_TESTING:BOOL=false -DDISABLE_VALGRIND:BOOL=true
|
||||
- cmake .. -DINTEGRATION_TESTING:BOOL=false -DDISABLE_VALGRIND:BOOL=true -DENABLE_SESHAT:BOOL=true -DFEATURE_DNS_QUERY:BOOL=true
|
||||
- make
|
||||
- export ARGS="-V"
|
||||
- make test
|
||||
|
||||
after_success:
|
||||
|
||||
44
CHANGELOG.md
Normal file
44
CHANGELOG.md
Normal file
@@ -0,0 +1,44 @@
|
||||
# Changelog
|
||||
All notable changes to this project will be documented in this file.
|
||||
|
||||
The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
|
||||
and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
|
||||
|
||||
## [Unreleased]
|
||||
- Refactor of connection code (simplification).
|
||||
- Additional `/cloud-status` and `/cloud-disconnect` fields.
|
||||
|
||||
## [1.0.1] - 2018-07-18
|
||||
### Added
|
||||
- Added command line arguments for secure token read and acquire.
|
||||
- DNS check for <device-id>.<URL> to allow custom device handling logic (like test boxes, refurbishing, etc).
|
||||
- Add check for matching `partner-id` for incoming WRP messages based on command line argument passed.
|
||||
- CRUD operations to local namespace is now supported.
|
||||
- Via CRUD calls, the custom metadata tag values are now supported.
|
||||
|
||||
### Changed
|
||||
- Configurable security flag and port.
|
||||
- Default HTTP port to 80 and HTTPS port to 443.
|
||||
- Updates to how `nopoll` is called have been implemented.
|
||||
|
||||
### Fixed
|
||||
- 64 bit pointer fixes (#144, #145).
|
||||
- Handle `403` error from talaria (#147).
|
||||
- Several additional NULL pointer checks & recovery logic blocks added.
|
||||
- A scenario where ping requests are not responded to was fixed.
|
||||
|
||||
### Security
|
||||
- Added command line arguments for secure token read and acquire. Token presented to cloud for authentication verification.
|
||||
|
||||
## [1.0.0] - 2017-11-17
|
||||
### Added
|
||||
- Added the basic implementation.
|
||||
|
||||
## [0.0.1] - 2016-08-15
|
||||
### Added
|
||||
- Initial creation
|
||||
|
||||
[Unreleased]: https://github.com/Comcast/parodus/compare/1.0.1...HEAD
|
||||
[1.0.1]: https://github.com/Comcast/parodus/compare/1.0.0...1.0.1
|
||||
[1.0.0]: https://github.com/Comcast/parodus/compare/79fa7438de2b14ae64f869d52f5c127497bf9c3f...1.0.0
|
||||
|
||||
102
CMakeLists.txt
102
CMakeLists.txt
@@ -22,6 +22,7 @@ include(CTest)
|
||||
set(INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/_install)
|
||||
set(PREFIX_DIR ${CMAKE_CURRENT_BINARY_DIR}/_prefix)
|
||||
set(INCLUDE_DIR ${INSTALL_DIR}/include)
|
||||
set(INCLUDE_UCRESOLV ${PREFIX_DIR}/ucresolv/src/ucresolv/include)
|
||||
set(LIBRARY_DIR ${INSTALL_DIR}/lib)
|
||||
set(LIBRARY_DIR64 ${INSTALL_DIR}/lib64)
|
||||
set(COMMON_LIBRARY_DIR ${INSTALL_DIR}/lib/${CMAKE_LIBRARY_ARCHITECTURE})
|
||||
@@ -36,8 +37,19 @@ include_directories(${INCLUDE_DIR}
|
||||
${INCLUDE_DIR}/wrp-c
|
||||
${INCLUDE_DIR}/libparodus
|
||||
${INCLUDE_DIR}/cimplog
|
||||
${INCLUDE_DIR}/libseshat
|
||||
)
|
||||
${INCLUDE_DIR}/cjwt
|
||||
)
|
||||
|
||||
# Get git commit hash
|
||||
#-------------------------------------------------------------------------------
|
||||
execute_process(
|
||||
COMMAND git describe --tags --always
|
||||
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
|
||||
OUTPUT_VARIABLE GIT_COMMIT_TAG
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||
)
|
||||
|
||||
add_definitions("-DGIT_COMMIT_TAG=\"${GIT_COMMIT_TAG}\"")
|
||||
|
||||
# Compile options/flags
|
||||
#-------------------------------------------------------------------------------
|
||||
@@ -59,8 +71,8 @@ if (NOT BUILD_YOCTO)
|
||||
ExternalProject_Add(trower-base64
|
||||
PREFIX ${CMAKE_CURRENT_BINARY_DIR}/_prefix/trower-base64
|
||||
GIT_REPOSITORY https://github.com/Comcast/trower-base64.git
|
||||
GIT_TAG "master"
|
||||
CMAKE_ARGS += -DCMAKE_INSTALL_PREFIX=${INSTALL_DIR}
|
||||
GIT_TAG "fbb9440ae2bc1118866baefcea7ff814f16613dd"
|
||||
CMAKE_ARGS += -DCMAKE_INSTALL_PREFIX=${INSTALL_DIR} -DBUILD_TESTING=OFF
|
||||
)
|
||||
add_library(libtrower-base64 STATIC SHARED IMPORTED)
|
||||
add_dependencies(libtrower-base64 trower-base64)
|
||||
@@ -68,20 +80,11 @@ add_dependencies(libtrower-base64 trower-base64)
|
||||
|
||||
# nopoll external dependency
|
||||
#-------------------------------------------------------------------------------
|
||||
set(PATCHES_DIR ${CMAKE_CURRENT_SOURCE_DIR}/patches)
|
||||
set(NOPOLL_LOG_SRC ${PREFIX_DIR}/nopoll/src/nopoll/src/nopoll_log.c)
|
||||
ExternalProject_Add(nopoll
|
||||
PREFIX ${PREFIX_DIR}/nopoll
|
||||
GIT_REPOSITORY https://github.com/ASPLes/nopoll.git
|
||||
GIT_TAG "b18aacc06b4dc9700e0a261efc201a8e125e4328"
|
||||
PATCH_COMMAND patch -p1 < ${PATCHES_DIR}/nopoll.patch
|
||||
COMMAND touch NEWS README AUTHORS ChangeLog
|
||||
COMMAND libtoolize --force
|
||||
COMMAND aclocal
|
||||
COMMAND autoheader --warnings=error
|
||||
COMMAND automake --add-missing -Werror
|
||||
COMMAND autoconf --force --warnings=error
|
||||
CONFIGURE_COMMAND COMMAND <SOURCE_DIR>/configure --prefix=${PREFIX}
|
||||
GIT_REPOSITORY https://github.com/Comcast/nopoll.git
|
||||
GIT_TAG "739b740683b0615e5999bdeea756cbd593b7f1cc"
|
||||
CONFIGURE_COMMAND COMMAND <SOURCE_DIR>/autogen.sh --prefix=${PREFIX}
|
||||
--includedir=${INCLUDE_DIR}
|
||||
--libdir=${LIBRARY_DIR}
|
||||
${CUSTOM_HOST}
|
||||
@@ -96,7 +99,7 @@ add_dependencies(libnopoll nopoll)
|
||||
ExternalProject_Add(nanomsg
|
||||
PREFIX ${CMAKE_CURRENT_BINARY_DIR}/_prefix/nanomsg
|
||||
GIT_REPOSITORY https://github.com/nanomsg/nanomsg.git
|
||||
#GIT_TAG "096998834451219ee7813d8977f6a4027b0ccb43"
|
||||
GIT_TAG "0c1aa2b288f6b167dbafe7e29c20e6fc7e71c000"
|
||||
CMAKE_ARGS += -DCMAKE_INSTALL_PREFIX=${INSTALL_DIR}
|
||||
)
|
||||
add_library(libnanomsg STATIC SHARED IMPORTED)
|
||||
@@ -110,7 +113,7 @@ ExternalProject_Add(cJSON
|
||||
PREFIX ${CMAKE_CURRENT_BINARY_DIR}/_prefix/cJSON
|
||||
GIT_REPOSITORY https://github.com/DaveGamble/cJSON.git
|
||||
GIT_TAG "aafb64a1c549b7b927e339df6d35b1d5059dc235"
|
||||
CMAKE_ARGS += -DCMAKE_INSTALL_PREFIX=${INSTALL_DIR}
|
||||
CMAKE_ARGS += -DCMAKE_INSTALL_PREFIX=${INSTALL_DIR} -DBUILD_TESTING=OFF
|
||||
)
|
||||
add_library(libcJSON STATIC SHARED IMPORTED)
|
||||
add_dependencies(libcJSON cJSON)
|
||||
@@ -121,7 +124,7 @@ add_dependencies(libcJSON cJSON)
|
||||
ExternalProject_Add(msgpack
|
||||
PREFIX ${CMAKE_CURRENT_BINARY_DIR}/_prefix/msgpack
|
||||
GIT_REPOSITORY https://github.com/msgpack/msgpack-c.git
|
||||
GIT_TAG "c6e6dbc608366090c12b142b3832604e6aa12f54"
|
||||
GIT_TAG "7a98138f27f27290e680bf8fbf1f8d1b089bf138"
|
||||
CMAKE_ARGS += -DCMAKE_INSTALL_PREFIX=${INSTALL_DIR}
|
||||
-DMSGPACK_ENABLE_CXX=OFF
|
||||
-DMSGPACK_BUILD_EXAMPLES=OFF
|
||||
@@ -135,8 +138,8 @@ add_dependencies(libmsgpack msgpack)
|
||||
ExternalProject_Add(cimplog
|
||||
PREFIX ${CMAKE_CURRENT_BINARY_DIR}/_prefix/cimplog
|
||||
GIT_REPOSITORY https://github.com/Comcast/cimplog.git
|
||||
GIT_TAG "master"
|
||||
CMAKE_ARGS += -DCMAKE_INSTALL_PREFIX=${INSTALL_DIR}
|
||||
GIT_TAG "8a5fb3c2f182241d17f5342bea5b7688c28cd1fd"
|
||||
CMAKE_ARGS += -DCMAKE_INSTALL_PREFIX=${INSTALL_DIR} -DBUILD_TESTING=OFF
|
||||
)
|
||||
add_library(libcimplog STATIC SHARED IMPORTED)
|
||||
add_dependencies(libcimplog cimplog)
|
||||
@@ -148,7 +151,7 @@ ExternalProject_Add(wrp-c
|
||||
DEPENDS trower-base64 msgpack cimplog
|
||||
PREFIX ${CMAKE_CURRENT_BINARY_DIR}/_prefix/wrp-c
|
||||
GIT_REPOSITORY https://github.com/Comcast/wrp-c.git
|
||||
GIT_TAG "master"
|
||||
GIT_TAG "d42ac3a63b8d6e723995b63e23aa1969e622faa5"
|
||||
CMAKE_ARGS += -DCMAKE_INSTALL_PREFIX=${INSTALL_DIR}
|
||||
-DMSGPACK_ENABLE_CXX=OFF
|
||||
-DMSGPACK_BUILD_EXAMPLES=OFF
|
||||
@@ -166,8 +169,8 @@ ExternalProject_Add(libparodus
|
||||
DEPENDS trower-base64 msgpack nanomsg wrp-c
|
||||
PREFIX ${CMAKE_CURRENT_BINARY_DIR}/_prefix/libparodus
|
||||
GIT_REPOSITORY https://github.com/Comcast/libparodus.git
|
||||
GIT_TAG "master"
|
||||
CMAKE_ARGS += -DCMAKE_INSTALL_PREFIX=${INSTALL_DIR}
|
||||
GIT_TAG "a7615d69bd5859e337f467fb7e33182da970a5de"
|
||||
CMAKE_ARGS += -DCMAKE_INSTALL_PREFIX=${INSTALL_DIR} -DBUILD_TESTING=OFF
|
||||
-DMAIN_PROJ_BUILD=ON
|
||||
-DMAIN_PROJ_LIB_PATH=${LIBRARY_DIR}
|
||||
-DMAIN_PROJ_LIB64_PATH=${LIBRARY_DIR64}
|
||||
@@ -177,13 +180,15 @@ ExternalProject_Add(libparodus
|
||||
add_library(liblibparodus STATIC SHARED IMPORTED)
|
||||
add_dependencies(liblibparodus libparodus)
|
||||
|
||||
if (ENABLE_SESHAT)
|
||||
# libseshat external dependency
|
||||
#-------------------------------------------------------------------------------
|
||||
ExternalProject_Add(libseshat
|
||||
DEPENDS cJSON trower-base64 msgpack wrp-c
|
||||
DEPENDS cJSON trower-base64 msgpack nanomsg wrp-c
|
||||
PREFIX ${CMAKE_CURRENT_BINARY_DIR}/_prefix/libseshat
|
||||
GIT_REPOSITORY https://github.com/comcast/seshat.git
|
||||
CMAKE_ARGS += -DCMAKE_INSTALL_PREFIX=${INSTALL_DIR}
|
||||
GIT_TAG "470f8d5e9457755028aae6da65d3df9b62a53942"
|
||||
CMAKE_ARGS += -DCMAKE_INSTALL_PREFIX=${INSTALL_DIR} -DBUILD_TESTING=OFF
|
||||
-DMAIN_PROJ_BUILD=ON
|
||||
-DMAIN_PROJ_LIB_PATH=${LIBRARY_DIR}
|
||||
-DMAIN_PROJ_LIB64_PATH=${LIBRARY_DIR64}
|
||||
@@ -192,14 +197,45 @@ ExternalProject_Add(libseshat
|
||||
)
|
||||
add_library(liblibseshat STATIC SHARED IMPORTED)
|
||||
add_dependencies(liblibseshat libseshat)
|
||||
include_directories(${INCLUDE_DIR}/libseshat)
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DENABLE_SESHAT ")
|
||||
endif (ENABLE_SESHAT)
|
||||
|
||||
# libcjwt external dependency
|
||||
#-------------------------------------------------------------------------------
|
||||
ExternalProject_Add(cjwt
|
||||
PREFIX ${CMAKE_CURRENT_BINARY_DIR}/_prefix/cjwt
|
||||
GIT_REPOSITORY https://github.com/Comcast/cjwt.git
|
||||
GIT_TAG "ddd077f0f00407f9657934492b252ee5cfcde535"
|
||||
CMAKE_ARGS += -DCMAKE_INSTALL_PREFIX=${INSTALL_DIR} -DBUILD_TESTING=OFF
|
||||
)
|
||||
add_library(libcjwt STATIC SHARED IMPORTED)
|
||||
add_dependencies(libcjwt cjwt)
|
||||
|
||||
if (FEATURE_DNS_QUERY)
|
||||
# libucresolv external dependency
|
||||
#-------------------------------------------------------------------------------
|
||||
ExternalProject_Add(ucresolv
|
||||
PREFIX ${CMAKE_CURRENT_BINARY_DIR}/_prefix/ucresolv
|
||||
GIT_REPOSITORY https://github.com/Comcast/libucresolv.git
|
||||
GIT_TAG "b58d49e165208791f84b44e3c079b1b4ef6d5c9d"
|
||||
CMAKE_ARGS += -DCMAKE_INSTALL_PREFIX=${INSTALL_DIR}
|
||||
)
|
||||
add_library(libucresolv STATIC SHARED IMPORTED)
|
||||
add_dependencies(libucresolv ucresolv)
|
||||
include_directories(${INCLUDE_DIR}
|
||||
${INCLUDE_DIR}/ucresolv
|
||||
)
|
||||
|
||||
endif (FEATURE_DNS_QUERY)
|
||||
|
||||
if (BUILD_TESTING)
|
||||
# cmocka external dependency
|
||||
#-------------------------------------------------------------------------------
|
||||
ExternalProject_Add(cmocka
|
||||
PREFIX ${CMAKE_CURRENT_BINARY_DIR}/_prefix/cmocka
|
||||
GIT_REPOSITORY https://git.cryptomilk.org/projects/cmocka.git
|
||||
GIT_TAG "master"
|
||||
GIT_REPOSITORY https://github.com/elventear/cmocka.git
|
||||
GIT_TAG "b71a3060699bc1a5b00e958be353772f42545ac2"
|
||||
CMAKE_ARGS += -DCMAKE_INSTALL_PREFIX=${INSTALL_DIR}
|
||||
)
|
||||
add_library(libcmocka STATIC SHARED IMPORTED)
|
||||
@@ -207,7 +243,15 @@ add_dependencies(libcmocka cmocka)
|
||||
|
||||
endif (BUILD_TESTING)
|
||||
|
||||
endif ()
|
||||
endif () # NOT BUILD_YOCTO
|
||||
|
||||
if (BUILD_YOCTO)
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DBUILD_YOCTO ")
|
||||
endif (BUILD_YOCTO)
|
||||
|
||||
if (FEATURE_DNS_QUERY)
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DFEATURE_DNS_QUERY ")
|
||||
endif (FEATURE_DNS_QUERY)
|
||||
|
||||
link_directories ( ${LIBRARY_DIR} ${COMMON_LIBRARY_DIR} ${LIBRARY_DIR64} )
|
||||
add_subdirectory(src)
|
||||
|
||||
@@ -1,5 +1,31 @@
|
||||
If you would like to contribute code to this project you can do so
|
||||
through GitHub by forking the repository and sending a pull request.
|
||||
Contribution Guidelines
|
||||
=======================
|
||||
|
||||
Before Comcast accepts your code into the project you must sign the
|
||||
Comcast Contributor License Agreement ('CLA.pdf').
|
||||
We love to see contributions to the project and have tried to make it easy to do so. If you would like to contribute code to this project you can do so through GitHub by forking the repository and sending a pull request.
|
||||
|
||||
Before Comcast merges your code into the project you must sign the [Comcast Contributor License Agreement (CLA)](https://gist.github.com/ComcastOSS/a7b8933dd8e368535378cda25c92d19a).
|
||||
|
||||
If you haven't previously signed a Comcast CLA, you'll automatically be asked to when you open a pull request. Alternatively, we can e-mail you a PDF that you can sign and scan back to us. Please send us an e-mail or create a new GitHub issue to request a PDF version of the CLA.
|
||||
|
||||
For more details about contributing to GitHub projects see
|
||||
http://gun.io/blog/how-to-github-fork-branch-and-pull-request/
|
||||
|
||||
Documentation
|
||||
-------------
|
||||
|
||||
If you contribute anything that changes the behavior of the
|
||||
application, document it in the [README](https://github.com/Comcast/parodus/blob/master/README.md) or [wiki](https://github.com/Comcast/parodus/wiki)! This includes new features, additional variants of behavior and breaking changes.
|
||||
|
||||
Testing
|
||||
-------
|
||||
|
||||
Tests are written using golang's standard testing tools, and are run prior to the PR being accepted.
|
||||
|
||||
Pull Requests
|
||||
-------------
|
||||
|
||||
* should be narrowly focused with no more than 3 or 4 logical commits
|
||||
* when possible, address no more than one issue
|
||||
* should be reviewable in the GitHub code review tool
|
||||
* should be linked to any issues it relates to (i.e. issue number after (#) in commit messages or pull request message)
|
||||
* should conform to idiomatic golang code formatting
|
||||
|
||||
16
NOTICE
Normal file
16
NOTICE
Normal file
@@ -0,0 +1,16 @@
|
||||
parodus
|
||||
Copyright 2017 Comcast Cable Communications Management, LLC
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
This product includes software developed at Comcast (http://www.comcast.com/).
|
||||
85
README.md
85
README.md
@@ -1,11 +1,16 @@
|
||||
# parodus
|
||||
|
||||
C implementation of the WebPA client coordinator
|
||||
|
||||
[](https://travis-ci.org/Comcast/parodus)
|
||||
[](http://codecov.io/github/Comcast/parodus?branch=master)
|
||||
[](https://scan.coverity.com/projects/comcast-parodus)
|
||||
[](https://github.com/Comcast/parodus/blob/master/LICENSE)
|
||||
[](CHANGELOG.md)
|
||||
|
||||
|
||||
C implementation of the XMiDT client coordinator
|
||||
|
||||
XMiDT is a highly scalable, highly available, generic message routing system.
|
||||
|
||||
# Building and Testing Instructions
|
||||
|
||||
```
|
||||
@@ -15,3 +20,79 @@ cmake ..
|
||||
make
|
||||
make test
|
||||
```
|
||||
# Command line Arguments needed to start parodus
|
||||
|
||||
```
|
||||
- /hw-model -The hardware model name.
|
||||
|
||||
- /hw-serial-number -The serial number.
|
||||
|
||||
- /hw-manufacturer -The device manufacturer.
|
||||
|
||||
- /hw-mac -The MAC address used to manage the device.
|
||||
|
||||
- /hw-last-reboot-reason -The last known reboot reason.
|
||||
|
||||
- /fw-name -The firmware name.
|
||||
|
||||
- /boot-time -The boot time in unix time.
|
||||
|
||||
- /webpa-url -The URL that the WRP client should reach out to. (required). Must begin with 'https://' or 'http://'. May end with a port number. If no port specified, then 443 is assumed for https, 80 for http.
|
||||
|
||||
- /webpa-backoff-max -The maximum value of c in the binary backoff algorithm
|
||||
|
||||
- /webpa-ping-timeout -The maximum time to wait between pings before assuming the connection is broken.
|
||||
|
||||
- /webpa-interface-used -The device interface being used to connect to the cloud.
|
||||
|
||||
- /parodus-local-url -Parodus local server url (optional argument)
|
||||
|
||||
- /partner-id - Partner ID of broadband gateway (optional argument)
|
||||
|
||||
- /ssl-cert-path -Provide the certs for establishing secure connection (optional argument)
|
||||
|
||||
- /force-ipv4 -Forcefully connect parodus to ipv4 address (optional argument)
|
||||
|
||||
- /force-ipv6 -Forcefully connect parodus to ipv6 address (optional argument)
|
||||
|
||||
- /token-read-script -Script to get auth token for establishing secure connection (absolute path where that script is present) -optional argument
|
||||
|
||||
- /token-acquisition-script -Script to create new auth token for establishing secure connection (absolute path where that script is present) -optional argument
|
||||
|
||||
- /crud-config-file -Config json file to store objects during create, retrieve, update and delete (CRUD) operations -optional argument
|
||||
|
||||
|
||||
# if ENABLE_SESHAT is enabled
|
||||
- /seshat-url - The seshat server url
|
||||
|
||||
# if FEATURE_DNS_QUERY is enabled then below mentioned arguments are needed
|
||||
|
||||
- /acquire-jwt - this parameter (0 or 1) specifies whether there will be a dns lookup. If not, or if any problem occurs with the dns lookup, then webpa-url will be the target.
|
||||
|
||||
- /dns-txt-url - this parameter is used along with the hw_mac parameter to create the dns txt record id
|
||||
|
||||
- /jwt-algo -Allowed algorithm used for communication
|
||||
|
||||
- /jwt-public-key-file -JWT token validation key
|
||||
|
||||
```
|
||||
|
||||
# Sample parodus start commands:
|
||||
|
||||
```
|
||||
# Seshat & FEATURE_DNS_QUERY Enabled
|
||||
|
||||
./parodus --hw-model=TGXXX --hw-serial-number=E8GBUEXXXXXXXXX --hw-manufacturer=ARRIS --hw-mac=14cfexxxxxxx --hw-last-reboot-reason=unknown --fw-name=TG1682_DEV_master_20170512115046sdy --boot-time=1494590301 --webpa-ping-timeout=180 --webpa-interface-used=eth0 --webpa-url=somebody.net:8080 --webpa-backoff-max=9 --parodus-local-url=tcp://127.0.0.1:6666 --partner-id=comcast --ssl-cert-path=/etc/ssl/certs/ca-certificates.crt --acquire-jwt=1 --dns-txt-url=somebody.net --jwt-public-key-file=webpa-rs256.pem --jwt-algo=RS256 --seshat-url=tcp://127.0.0.1:7777 --token-read-script=/usr/ccsp/parodus/parodus_token1.sh --token-acquisition-script=/usr/ccsp/parodus/parodus_token2.sh --force-ipv4 --crud-config-file=/tmp/parodus_cfg.json
|
||||
|
||||
|
||||
# Seshat is not enabled
|
||||
|
||||
./parodus --hw-model=TGXXX --hw-serial-number=E8GBUEXXXXXXXXX --hw-manufacturer=ARRIS --hw-mac=14cfexxxxxxx --hw-last-reboot-reason=unknown --fw-name=TG1682_DEV_master_20170512115046sdy --boot-time=1494590301 --webpa-ping-timeout=180 --webpa-interface-used=eth0 --webpa-url=somebody.net:8080 --webpa-backoff-max=9 --parodus-local-url=tcp://127.0.0.1:6666 --partner-id=comcast --ssl-cert-path=/etc/ssl/certs/ca-certificates.crt --acquire-jwt=1 --dns-txt-url=somebody.net --jwt-public-key-file=webpa-rs256.pem --jwt-algo=RS256 --token-read-script=/usr/ccsp/parodus/parodus_token1.sh --token-acquisition-script=/usr/ccsp/parodus/parodus_token2.sh --force-ipv4 --crud-config-file=/tmp/parodus_cfg.json
|
||||
|
||||
|
||||
# When both Seshat & FEATURE_DNS_QUERY not Enabled
|
||||
|
||||
./parodus --hw-model=TGXXX --hw-serial-number=E8GBUEXXXXXXXXX --hw-manufacturer=ARRIS --hw-mac=14cfexxxxxxx --hw-last-reboot-reason=unknown --fw-name=TG1682_DEV_master_20170512115046sdy --boot-time=1494590301 --webpa-ping-timeout=180 --webpa-interface-used=eth0 --webpa-url=somebody.net:8080 --webpa-backoff-max=9 --parodus-local-url=tcp://127.0.0.1:6666 --partner-id=comcast --ssl-cert-path=/etc/ssl/certs/ca-certificates.crt --token-read-script=/usr/ccsp/parodus/parodus_token1.sh --token-acquisition-script=/usr/ccsp/parodus/parodus_token2.sh --force-ipv4 --crud-config-file=/tmp/parodus_cfg.json
|
||||
|
||||
```
|
||||
|
||||
|
||||
1495
patches/nopoll.patch
1495
patches/nopoll.patch
File diff suppressed because it is too large
Load Diff
@@ -11,8 +11,18 @@
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
set(SOURCES main.c mutex.c networking.c nopoll_helpers.c nopoll_handlers.c ParodusInternal.c
|
||||
string_helpers.c time.c config.c conn_interface.c connection.c spin_thread.c client_list.c service_alive.c upstream.c downstream.c thread_tasks.c partners_check.c)
|
||||
set(SOURCES main.c mutex.c networking.c nopoll_helpers.c heartBeat.c nopoll_handlers.c
|
||||
ParodusInternal.c string_helpers.c time.c config.c conn_interface.c
|
||||
connection.c spin_thread.c client_list.c service_alive.c
|
||||
upstream.c downstream.c thread_tasks.c partners_check.c token.c
|
||||
crud_interface.c crud_tasks.c crud_internal.c)
|
||||
|
||||
if (ENABLE_SESHAT)
|
||||
set(SOURCES ${SOURCES} seshat_interface.c)
|
||||
else()
|
||||
set(SOURCES ${SOURCES} seshat_interface_stub.c)
|
||||
endif (ENABLE_SESHAT)
|
||||
|
||||
|
||||
add_executable(parodus ${SOURCES})
|
||||
|
||||
@@ -22,7 +32,6 @@ target_link_libraries (parodus
|
||||
-lmsgpackc
|
||||
-ltrower-base64
|
||||
-lnopoll
|
||||
-llibseshat
|
||||
-luuid
|
||||
-lm
|
||||
-lcimplog
|
||||
@@ -30,7 +39,18 @@ target_link_libraries (parodus
|
||||
-lcrypto
|
||||
-lnanomsg
|
||||
-lcjson
|
||||
-lcjwt
|
||||
-lpthread
|
||||
-lrt
|
||||
)
|
||||
|
||||
if (FEATURE_DNS_QUERY)
|
||||
target_link_libraries (parodus -lucresolv -lresolv)
|
||||
endif (FEATURE_DNS_QUERY)
|
||||
|
||||
if (ENABLE_SESHAT)
|
||||
target_link_libraries (parodus -llibseshat)
|
||||
endif (ENABLE_SESHAT)
|
||||
|
||||
|
||||
install (TARGETS parodus DESTINATION bin)
|
||||
|
||||
@@ -1,9 +1,24 @@
|
||||
/**
|
||||
* Copyright 2015 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* @file ParodusInternal.c
|
||||
*
|
||||
* @description This file is used to manage internal functions of parodus
|
||||
*
|
||||
* Copyright (c) 2015 Comcast
|
||||
*/
|
||||
|
||||
#include "ParodusInternal.h"
|
||||
@@ -99,5 +114,24 @@ char* getWebpaConveyHeader()
|
||||
}
|
||||
free(buffer);
|
||||
cJSON_Delete(response);
|
||||
return encodedData;
|
||||
|
||||
if( 0 < strlen(encodedData) ) {
|
||||
return encodedData;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void timespec_diff(struct timespec *start, struct timespec *stop,
|
||||
struct timespec *diff)
|
||||
{
|
||||
if ((stop->tv_nsec - start->tv_nsec) < 0) {
|
||||
diff->tv_sec = stop->tv_sec - start->tv_sec - 1;
|
||||
diff->tv_nsec = stop->tv_nsec - start->tv_nsec + 1000000000UL;
|
||||
} else {
|
||||
diff->tv_sec = stop->tv_sec - start->tv_sec;
|
||||
diff->tv_nsec = stop->tv_nsec - start->tv_nsec;
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1,9 +1,24 @@
|
||||
/**
|
||||
* Copyright 2015 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* @file ParodusInternal.h
|
||||
*
|
||||
* @description This file is used to manage internal functions of parodus
|
||||
*
|
||||
* Copyright (c) 2015 Comcast
|
||||
*/
|
||||
#ifndef _PARODUSINTERNAL_H_
|
||||
#define _PARODUSINTERNAL_H_
|
||||
@@ -56,10 +71,15 @@ typedef struct ParodusMsg__
|
||||
struct ParodusMsg__ *next;
|
||||
} ParodusMsg;
|
||||
|
||||
// Used in token.c to get jwt from dns server
|
||||
typedef struct {
|
||||
const char *rr_ptr;
|
||||
int rr_len;
|
||||
} rr_rec_t;
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* File Scoped Variables */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
extern bool LastReasonStatus;
|
||||
extern ParodusMsg *ParodusMsgQ;
|
||||
int numLoops;
|
||||
/*----------------------------------------------------------------------------*/
|
||||
@@ -76,6 +96,12 @@ void parStrncpy(char *destStr, const char *srcStr, size_t destSize);
|
||||
|
||||
char* getWebpaConveyHeader();
|
||||
|
||||
void *CRUDHandlerTask();
|
||||
void addCRUDmsgToQueue(wrp_msg_t *crudMsg);
|
||||
|
||||
void timespec_diff(struct timespec *start, struct timespec *stop,
|
||||
struct timespec *result);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -1,9 +1,24 @@
|
||||
/**
|
||||
* Copyright 2015 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* @file client_list.h
|
||||
*
|
||||
* @description This file is used to manage registered clients
|
||||
*
|
||||
* Copyright (c) 2015 Comcast
|
||||
*/
|
||||
|
||||
#include "ParodusInternal.h"
|
||||
@@ -69,9 +84,8 @@ int addToList( wrp_msg_t **msg)
|
||||
ParodusPrint("(*msg)->u.reg.service_name is %s\n", (*msg)->u.reg.service_name);
|
||||
ParodusPrint("(*msg)->u.reg.url is %s\n", (*msg)->u.reg.url);
|
||||
|
||||
strncpy(new_node->service_name, (*msg)->u.reg.service_name, strlen((*msg)->u.reg.service_name)+1);
|
||||
strncpy(new_node->url, (*msg)->u.reg.url, strlen((*msg)->u.reg.url)+1);
|
||||
|
||||
parStrncpy(new_node->service_name, (*msg)->u.reg.service_name, sizeof(new_node->service_name));
|
||||
parStrncpy(new_node->url, (*msg)->u.reg.url, sizeof(new_node->url));
|
||||
new_node->next=NULL;
|
||||
|
||||
if (g_head == NULL) //adding first client
|
||||
|
||||
@@ -1,9 +1,24 @@
|
||||
/**
|
||||
* Copyright 2015 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* @file client_list.h
|
||||
*
|
||||
* @description This file is used to manage registered clients
|
||||
*
|
||||
* Copyright (c) 2015 Comcast
|
||||
*/
|
||||
#ifndef _CLIENTLIST_H_
|
||||
#define _CLIENTLIST_H_
|
||||
|
||||
642
src/config.c
642
src/config.c
@@ -1,19 +1,41 @@
|
||||
/**
|
||||
* @file config.h
|
||||
* Copyright 2015 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* @file config.c
|
||||
*
|
||||
* @description This file contains configuration details of parodus
|
||||
*
|
||||
* Copyright (c) 2015 Comcast
|
||||
*/
|
||||
|
||||
|
||||
#include <stdio.h>
|
||||
#include <fcntl.h>
|
||||
#include "config.h"
|
||||
#include "ParodusInternal.h"
|
||||
#include <cjwt/cjwt.h>
|
||||
|
||||
#define MAX_BUF_SIZE 128
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* File Scoped Variables */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
static ParodusCfg parodusCfg;
|
||||
static unsigned int rsa_algorithms =
|
||||
(1<<alg_rs256) | (1<<alg_rs384) | (1<<alg_rs512);
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* External Functions */
|
||||
@@ -26,35 +48,281 @@ ParodusCfg *get_parodus_cfg(void)
|
||||
|
||||
void set_parodus_cfg(ParodusCfg *cfg)
|
||||
{
|
||||
parodusCfg = *cfg;
|
||||
memcpy(&parodusCfg, cfg, sizeof(ParodusCfg));
|
||||
}
|
||||
|
||||
void parseCommandLine(int argc,char **argv,ParodusCfg * cfg)
|
||||
{
|
||||
int c;
|
||||
static void execute_token_script(char *token, char *name, size_t len, char *mac, char *serNum);
|
||||
|
||||
const char *get_tok (const char *src, int delim, char *result, int resultsize)
|
||||
{
|
||||
int i;
|
||||
char c;
|
||||
int endx = resultsize-1;
|
||||
|
||||
memset (result, 0, resultsize);
|
||||
for (i=0; (c=src[i]) != 0; i++) {
|
||||
if (c == delim)
|
||||
break;
|
||||
if (i < endx)
|
||||
result[i] = c;
|
||||
}
|
||||
if (c == 0)
|
||||
return NULL;
|
||||
return src + i + 1;
|
||||
}
|
||||
|
||||
// the algorithm mask indicates which algorithms are allowed
|
||||
unsigned int get_algo_mask (const char *algo_str)
|
||||
{
|
||||
unsigned int mask = 0;
|
||||
unsigned int mask_val;
|
||||
#define BUFLEN 16
|
||||
char tok[BUFLEN];
|
||||
int alg_val;
|
||||
|
||||
while(NULL != algo_str)
|
||||
{
|
||||
algo_str = get_tok (algo_str, ':', tok, BUFLEN);
|
||||
alg_val = cjwt_alg_str_to_enum (tok);
|
||||
if ((alg_val < 0) || (alg_val >= num_algorithms)) {
|
||||
ParodusError("Invalid jwt algorithm %s\n", tok);
|
||||
return (unsigned int) (-1);
|
||||
}
|
||||
if (alg_val == alg_none) {
|
||||
ParodusError("Disallowed jwt algorithm none\n");
|
||||
return (unsigned int) (-1);
|
||||
}
|
||||
mask_val = (1<<alg_val);
|
||||
#if !ALLOW_NON_RSA_ALG
|
||||
if (0 == (mask_val & rsa_algorithms)) {
|
||||
ParodusError("Disallowed non-rsa jwt algorithm %s\n", tok);
|
||||
return (unsigned int) (-1);
|
||||
}
|
||||
#endif
|
||||
mask |= mask_val;
|
||||
|
||||
}
|
||||
return mask;
|
||||
#undef BUFLEN
|
||||
}
|
||||
|
||||
static int open_input_file (const char *fname)
|
||||
{
|
||||
int fd = open(fname, O_RDONLY);
|
||||
if (fd<0)
|
||||
{
|
||||
ParodusError ("File %s open error\n", fname);
|
||||
abort ();
|
||||
}
|
||||
return fd;
|
||||
}
|
||||
|
||||
void read_key_from_file (const char *fname, char *buf, size_t buflen)
|
||||
{
|
||||
ssize_t nbytes;
|
||||
int fd = open_input_file(fname);
|
||||
nbytes = read(fd, buf, buflen);
|
||||
if (nbytes < 0)
|
||||
{
|
||||
ParodusError ("Read file %s error\n", fname);
|
||||
close(fd);
|
||||
abort ();
|
||||
}
|
||||
close(fd);
|
||||
ParodusInfo ("%d bytes read\n", nbytes);
|
||||
}
|
||||
|
||||
static void execute_token_script(char *token, char *name, size_t len, char *mac, char *serNum)
|
||||
{
|
||||
FILE* out = NULL, *file = NULL;
|
||||
char command[MAX_BUF_SIZE] = {'\0'};
|
||||
if(strlen(name)>0)
|
||||
{
|
||||
file = fopen(name, "r");
|
||||
if(file)
|
||||
{
|
||||
snprintf(command,sizeof(command),"%s %s %s",name,serNum,mac);
|
||||
out = popen(command, "r");
|
||||
if(out)
|
||||
{
|
||||
fgets(token, len, out);
|
||||
pclose(out);
|
||||
}
|
||||
fclose(file);
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusError ("File %s open error\n", name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// strips ':' characters
|
||||
// verifies that there exactly 12 characters
|
||||
int parse_mac_address (char *target, const char *arg)
|
||||
{
|
||||
int count = 0;
|
||||
int i;
|
||||
char c;
|
||||
|
||||
for (i=0; (c=arg[i]) != 0; i++) {
|
||||
if (c !=':')
|
||||
count++;
|
||||
}
|
||||
if (count != 12)
|
||||
return -1; // bad mac address
|
||||
for (i=0; (c=arg[i]) != 0; i++) {
|
||||
if (c != ':')
|
||||
*(target++) = c;
|
||||
}
|
||||
*target = 0; // terminating null
|
||||
return 0;
|
||||
}
|
||||
|
||||
int server_is_http (const char *full_url,
|
||||
const char **server_ptr)
|
||||
{
|
||||
int http_match;
|
||||
const char *ptr;
|
||||
|
||||
if (strncmp(full_url, "https://", 8) == 0) {
|
||||
http_match = 0;
|
||||
ptr = full_url + 8;
|
||||
} else if (strncmp(full_url, "http://", 7) == 0) {
|
||||
http_match = 1;
|
||||
ptr = full_url + 7;
|
||||
} else {
|
||||
ParodusError ("Invalid url %s\n", full_url);
|
||||
return -1;
|
||||
}
|
||||
if (NULL != server_ptr)
|
||||
*server_ptr = ptr;
|
||||
return http_match;
|
||||
}
|
||||
|
||||
|
||||
int parse_webpa_url(const char *full_url,
|
||||
char *server_addr, int server_addr_buflen,
|
||||
char *port_buf, int port_buflen)
|
||||
{
|
||||
const char *server_ptr;
|
||||
char *port_val;
|
||||
char *end_port;
|
||||
size_t server_len;
|
||||
int http_match;
|
||||
|
||||
ParodusInfo ("full url: %s\n", full_url);
|
||||
http_match = server_is_http (full_url, &server_ptr);
|
||||
if (http_match < 0)
|
||||
return http_match;
|
||||
|
||||
ParodusInfo ("server address copied from url\n");
|
||||
parStrncpy (server_addr, server_ptr, server_addr_buflen);
|
||||
server_len = strlen(server_addr);
|
||||
// If there's a '/' on end, null it out
|
||||
if ((server_len>0) && (server_addr[server_len-1] == '/'))
|
||||
server_addr[server_len-1] = '\0';
|
||||
// Look for ':'
|
||||
port_val = strchr (server_addr, ':');
|
||||
|
||||
if (NULL == port_val) {
|
||||
if (http_match)
|
||||
parStrncpy (port_buf, "80", port_buflen);
|
||||
else
|
||||
parStrncpy (port_buf, "443", port_buflen);
|
||||
|
||||
end_port = strchr (server_addr, '/');
|
||||
if (NULL != end_port) {
|
||||
*end_port = '\0'; // terminate server address with null
|
||||
}
|
||||
|
||||
} else {
|
||||
*port_val = '\0'; // terminate server address with null
|
||||
port_val++;
|
||||
end_port = strchr (port_val, '/');
|
||||
if (NULL != end_port)
|
||||
*end_port = '\0'; // terminate port with null
|
||||
parStrncpy (port_buf, port_val, port_buflen);
|
||||
}
|
||||
ParodusInfo ("server %s, port %s, http_match %d\n",
|
||||
server_addr, port_buf, http_match);
|
||||
return http_match;
|
||||
|
||||
}
|
||||
|
||||
unsigned int parse_num_arg (const char *arg, const char *arg_name)
|
||||
{
|
||||
unsigned int result = 0;
|
||||
int i;
|
||||
char c;
|
||||
|
||||
if (arg[0] == '\0') {
|
||||
ParodusError ("Empty %s argument\n", arg_name);
|
||||
return (unsigned int) -1;
|
||||
}
|
||||
for (i=0; '\0' != (c=arg[i]); i++)
|
||||
{
|
||||
if ((c<'0') || (c>'9')) {
|
||||
ParodusError ("Non-numeric %s argument\n", arg_name);
|
||||
return (unsigned int) -1;
|
||||
}
|
||||
result = (result*10) + c - '0';
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
int parseCommandLine(int argc,char **argv,ParodusCfg * cfg)
|
||||
{
|
||||
static const struct option long_options[] = {
|
||||
{"hw-model", required_argument, 0, 'm'},
|
||||
{"hw-serial-number", required_argument, 0, 's'},
|
||||
{"hw-manufacturer", required_argument, 0, 'f'},
|
||||
{"hw-mac", required_argument, 0, 'd'},
|
||||
{"hw-last-reboot-reason", required_argument, 0, 'r'},
|
||||
{"fw-name", required_argument, 0, 'n'},
|
||||
{"boot-time", required_argument, 0, 'b'},
|
||||
{"webpa-url", required_argument, 0, 'u'},
|
||||
{"webpa-ping-timeout", required_argument, 0, 't'},
|
||||
{"webpa-backoff-max", required_argument, 0, 'o'},
|
||||
{"webpa-interface-used", required_argument, 0, 'i'},
|
||||
{"parodus-local-url", required_argument, 0, 'l'},
|
||||
{"partner-id", required_argument, 0, 'p'},
|
||||
#ifdef ENABLE_SESHAT
|
||||
{"seshat-url", required_argument, 0, 'e'},
|
||||
#endif
|
||||
{"dns-txt-url", required_argument, 0, 'D'},
|
||||
{"acquire-jwt", required_argument, 0, 'j'},
|
||||
{"jwt-algo", required_argument, 0, 'a'},
|
||||
{"jwt-public-key-file", required_argument, 0, 'k'},
|
||||
{"ssl-cert-path", required_argument, 0, 'c'},
|
||||
{"force-ipv4", no_argument, 0, '4'},
|
||||
{"force-ipv6", no_argument, 0, '6'},
|
||||
{"token-read-script", required_argument, 0, 'T'},
|
||||
{"token-acquisition-script", required_argument, 0, 'J'},
|
||||
{"crud-config-file", required_argument, 0, 'C'},
|
||||
{0, 0, 0, 0}
|
||||
};
|
||||
int c;
|
||||
ParodusInfo("Parsing parodus command line arguments..\n");
|
||||
|
||||
if (NULL == cfg) {
|
||||
ParodusError ("NULL cfg structure\n");
|
||||
return -1;
|
||||
}
|
||||
cfg->flags = 0;
|
||||
parStrncpy (cfg->webpa_url, "", sizeof(cfg->webpa_url));
|
||||
cfg->acquire_jwt = 0;
|
||||
cfg->jwt_algo = 0;
|
||||
parStrncpy (cfg->jwt_key, "", sizeof(cfg->jwt_key));
|
||||
cfg->crud_config_file = NULL;
|
||||
optind = 1; /* We need this if parseCommandLine is called again */
|
||||
while (1)
|
||||
{
|
||||
static struct option long_options[] = {
|
||||
{"hw-model", required_argument, 0, 'm'},
|
||||
{"hw-serial-number", required_argument, 0, 's'},
|
||||
{"hw-manufacturer", required_argument, 0, 'f'},
|
||||
{"hw-mac", required_argument, 0, 'd'},
|
||||
{"hw-last-reboot-reason", required_argument, 0, 'r'},
|
||||
{"fw-name", required_argument, 0, 'n'},
|
||||
{"boot-time", required_argument, 0, 'b'},
|
||||
{"webpa-url", required_argument, 0, 'u'},
|
||||
{"webpa-ping-timeout", required_argument, 0, 't'},
|
||||
{"webpa-backoff-max", required_argument, 0, 'o'},
|
||||
{"webpa-inteface-used", required_argument, 0, 'i'},
|
||||
{"parodus-local-url", required_argument, 0, 'l'},
|
||||
{"partner-id", required_argument, 0, 'p'},
|
||||
{"seshat-url", required_argument, 0, 'e'},
|
||||
{0, 0, 0, 0}
|
||||
};
|
||||
|
||||
/* getopt_long stores the option index here. */
|
||||
int option_index = 0;
|
||||
c = getopt_long (argc, argv, "m:s:f:d:r:n:b:u:t:o:i:l:p:e:",long_options, &option_index);
|
||||
c = getopt_long (argc, argv, "m:s:f:d:r:n:b:u:t:o:i:l:p:e:D:j:a:k:c:T:J:46:C",
|
||||
long_options, &option_index);
|
||||
|
||||
/* Detect the end of the options. */
|
||||
if (c == -1)
|
||||
@@ -78,15 +346,19 @@ void parseCommandLine(int argc,char **argv,ParodusCfg * cfg)
|
||||
break;
|
||||
|
||||
case 'd':
|
||||
parStrncpy(cfg->hw_mac, optarg,sizeof(cfg->hw_mac));
|
||||
ParodusInfo("hw_mac is %s\n",cfg->hw_mac);
|
||||
if (parse_mac_address (cfg->hw_mac, optarg) == 0) {
|
||||
ParodusInfo ("hw_mac is %s\n",cfg->hw_mac);
|
||||
} else {
|
||||
ParodusError ("Bad mac address %s\n", optarg);
|
||||
return -1;
|
||||
}
|
||||
break;
|
||||
|
||||
#ifdef ENABLE_SESHAT
|
||||
case 'e':
|
||||
parStrncpy(cfg->seshat_url, optarg,sizeof(cfg->seshat_url));
|
||||
ParodusInfo("seshat_url is %s\n",cfg->seshat_url);
|
||||
break;
|
||||
|
||||
#endif
|
||||
case 'r':
|
||||
parStrncpy(cfg->hw_last_reboot_reason, optarg,sizeof(cfg->hw_last_reboot_reason));
|
||||
ParodusInfo("hw_last_reboot_reason is %s\n",cfg->hw_last_reboot_reason);
|
||||
@@ -98,50 +370,133 @@ void parseCommandLine(int argc,char **argv,ParodusCfg * cfg)
|
||||
break;
|
||||
|
||||
case 'b':
|
||||
cfg->boot_time = atoi(optarg);
|
||||
cfg->boot_time = parse_num_arg (optarg, "boot-time");
|
||||
if (cfg->boot_time == (unsigned int) -1)
|
||||
return -1;
|
||||
ParodusInfo("boot_time is %d\n",cfg->boot_time);
|
||||
break;
|
||||
|
||||
case 'u':
|
||||
parStrncpy(cfg->webpa_url, optarg,sizeof(cfg->webpa_url));
|
||||
parStrncpy(cfg->webpa_url, optarg,sizeof(cfg->webpa_url));
|
||||
if (server_is_http (cfg->webpa_url, NULL) < 0) {
|
||||
ParodusError ("Bad webpa url %s\n", optarg);
|
||||
return -1;
|
||||
}
|
||||
ParodusInfo("webpa_url is %s\n",cfg->webpa_url);
|
||||
break;
|
||||
|
||||
case 't':
|
||||
cfg->webpa_ping_timeout = atoi(optarg);
|
||||
cfg->webpa_ping_timeout = parse_num_arg (optarg, "webpa-ping-timeout");
|
||||
if (cfg->webpa_ping_timeout == (unsigned int) -1)
|
||||
return -1;
|
||||
ParodusInfo("webpa_ping_timeout is %d\n",cfg->webpa_ping_timeout);
|
||||
break;
|
||||
|
||||
case 'o':
|
||||
cfg->webpa_backoff_max = atoi(optarg);
|
||||
cfg->webpa_backoff_max = parse_num_arg (optarg, "webpa-backoff-max");
|
||||
if (cfg->webpa_backoff_max == (unsigned int) -1)
|
||||
return -1;
|
||||
ParodusInfo("webpa_backoff_max is %d\n",cfg->webpa_backoff_max);
|
||||
break;
|
||||
|
||||
case 'i':
|
||||
parStrncpy(cfg->webpa_interface_used, optarg,sizeof(cfg->webpa_interface_used));
|
||||
ParodusInfo("webpa_inteface_used is %s\n",cfg->webpa_interface_used);
|
||||
ParodusInfo("webpa_interface_used is %s\n",cfg->webpa_interface_used);
|
||||
break;
|
||||
|
||||
case 'l':
|
||||
parStrncpy(cfg->local_url, optarg,sizeof(cfg->local_url));
|
||||
ParodusInfo("parodus local_url is %s\n",cfg->local_url);
|
||||
break;
|
||||
case 'D':
|
||||
// like 'fabric' or 'test'
|
||||
// this parameter is used, along with the hw_mac parameter
|
||||
// to create the dns txt record id
|
||||
parStrncpy(cfg->dns_txt_url, optarg,sizeof(cfg->dns_txt_url));
|
||||
ParodusInfo("parodus dns-txt-url is %s\n",cfg->dns_txt_url);
|
||||
break;
|
||||
|
||||
case 'j':
|
||||
cfg->acquire_jwt = parse_num_arg (optarg, "acquire-jwt");
|
||||
if (cfg->acquire_jwt == (unsigned int) -1)
|
||||
return -1;
|
||||
ParodusInfo("acquire jwt option is %d\n",cfg->acquire_jwt);
|
||||
break;
|
||||
|
||||
case 'a':
|
||||
// the command line argument is a list of allowed algoritms,
|
||||
// separated by colons, like "RS256:RS512:none"
|
||||
cfg->jwt_algo = get_algo_mask (optarg);
|
||||
if (cfg->jwt_algo == (unsigned int) -1) {
|
||||
return -1;
|
||||
}
|
||||
ParodusInfo("jwt_algo is %u\n",cfg->jwt_algo);
|
||||
break;
|
||||
case 'k':
|
||||
read_key_from_file (optarg, cfg->jwt_key, sizeof(cfg->jwt_key));
|
||||
ParodusInfo("jwt_key is %s\n",cfg->jwt_key);
|
||||
break;
|
||||
case 'p':
|
||||
parStrncpy(cfg->partner_id, optarg,sizeof(cfg->partner_id));
|
||||
ParodusInfo("partner_id is %s\n",cfg->partner_id);
|
||||
break;
|
||||
|
||||
case 'c':
|
||||
parStrncpy(cfg->cert_path, optarg,sizeof(cfg->cert_path));
|
||||
ParodusInfo("cert_path is %s\n",cfg->cert_path);
|
||||
break;
|
||||
|
||||
case '4':
|
||||
ParodusInfo("Force IPv4\n");
|
||||
cfg->flags |= FLAGS_IPV4_ONLY;
|
||||
break;
|
||||
|
||||
case '6':
|
||||
ParodusInfo("Force IPv6\n");
|
||||
cfg->flags |= FLAGS_IPV6_ONLY;
|
||||
break;
|
||||
|
||||
case 'J':
|
||||
parStrncpy(cfg->token_acquisition_script, optarg,sizeof(cfg->token_acquisition_script));
|
||||
break;
|
||||
|
||||
case 'T':
|
||||
parStrncpy(cfg->token_read_script, optarg,sizeof(cfg->token_read_script));
|
||||
break;
|
||||
|
||||
case 'C':
|
||||
cfg->crud_config_file = strdup(optarg);
|
||||
ParodusInfo("crud_config_file is %s\n", cfg->crud_config_file);
|
||||
break;
|
||||
|
||||
case '?':
|
||||
/* getopt_long already printed an error message. */
|
||||
break;
|
||||
|
||||
default:
|
||||
ParodusError("Enter Valid commands..\n");
|
||||
abort ();
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
if (0 == strlen (cfg->webpa_url)) {
|
||||
ParodusError ("Missing webpa url argument\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (cfg->acquire_jwt) {
|
||||
if (0 == cfg->jwt_algo) {
|
||||
ParodusError ("Missing jwt algorithm argument\n");
|
||||
return -1;
|
||||
}
|
||||
if ((0 != (cfg->jwt_algo & rsa_algorithms)) &&
|
||||
(0 == strlen (cfg->jwt_key)) ) {
|
||||
ParodusError ("Missing jwt public key file argument\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
ParodusPrint("argc is :%d\n", argc);
|
||||
ParodusPrint("optind is :%d\n", optind);
|
||||
|
||||
@@ -153,6 +508,98 @@ void parseCommandLine(int argc,char **argv,ParodusCfg * cfg)
|
||||
ParodusPrint ("%s ", argv[optind++]);
|
||||
putchar ('\n');
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* call parodus create/acquisition script to create new auth token, if success then calls
|
||||
* execute_token_script func with args as parodus read script.
|
||||
*/
|
||||
|
||||
void createNewAuthToken(char *newToken, size_t len)
|
||||
{
|
||||
//Call create script
|
||||
char output[12] = {'\0'};
|
||||
execute_token_script(output,get_parodus_cfg()->token_acquisition_script,sizeof(output),get_parodus_cfg()->hw_mac,get_parodus_cfg()->hw_serial_number);
|
||||
if (strlen(output)>0 && strcmp(output,"SUCCESS")==0)
|
||||
{
|
||||
//Call read script
|
||||
execute_token_script(newToken,get_parodus_cfg()->token_read_script,len,get_parodus_cfg()->hw_mac,get_parodus_cfg()->hw_serial_number);
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusError("Failed to create new token\n");
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Fetches authorization token from the output of read script. If read script returns "ERROR"
|
||||
* it will call createNewAuthToken to create and read new token
|
||||
*/
|
||||
|
||||
void getAuthToken(ParodusCfg *cfg)
|
||||
{
|
||||
//local var to update cfg->webpa_auth_token only in success case
|
||||
char output[4069] = {'\0'} ;
|
||||
|
||||
if( strlen(cfg->token_read_script) !=0 && strlen(cfg->token_acquisition_script) !=0)
|
||||
{
|
||||
execute_token_script(output,cfg->token_read_script,sizeof(output),cfg->hw_mac,cfg->hw_serial_number);
|
||||
|
||||
if ((strlen(output) == 0))
|
||||
{
|
||||
ParodusError("Unable to get auth token\n");
|
||||
}
|
||||
else if(strcmp(output,"ERROR")==0)
|
||||
{
|
||||
ParodusInfo("Failed to read token from %s. Proceeding to create new token.\n",cfg->token_read_script);
|
||||
//Call create/acquisition script
|
||||
createNewAuthToken(cfg->webpa_auth_token, sizeof(cfg->webpa_auth_token));
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusInfo("update cfg->webpa_auth_token in success case\n");
|
||||
parStrncpy(cfg->webpa_auth_token, output, sizeof(cfg->webpa_auth_token));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusInfo("Both read and write file are NULL \n");
|
||||
}
|
||||
}
|
||||
|
||||
void setDefaultValuesToCfg(ParodusCfg *cfg)
|
||||
{
|
||||
if(cfg == NULL)
|
||||
{
|
||||
ParodusError("cfg is NULL\n");
|
||||
return;
|
||||
}
|
||||
|
||||
ParodusInfo("Setting default values to parodusCfg\n");
|
||||
parStrncpy(cfg->local_url, PARODUS_UPSTREAM, sizeof(cfg->local_url));
|
||||
|
||||
cfg->acquire_jwt = 0;
|
||||
|
||||
parStrncpy(cfg->dns_txt_url, DNS_TXT_URL, sizeof(cfg->dns_txt_url));
|
||||
|
||||
parStrncpy(cfg->jwt_key, "\0", sizeof(cfg->jwt_key));
|
||||
|
||||
cfg->jwt_algo = 0;
|
||||
|
||||
parStrncpy(cfg->cert_path, "\0", sizeof(cfg->cert_path));
|
||||
|
||||
cfg->flags = 0;
|
||||
|
||||
parStrncpy(cfg->webpa_path_url, WEBPA_PATH_URL,sizeof(cfg->webpa_path_url));
|
||||
|
||||
snprintf(cfg->webpa_protocol, sizeof(cfg->webpa_protocol), "%s-%s", PROTOCOL_VALUE, GIT_COMMIT_TAG);
|
||||
ParodusInfo(" cfg->webpa_protocol is %s\n", cfg->webpa_protocol);
|
||||
|
||||
parStrncpy(cfg->webpa_uuid, "1234567-345456546",sizeof(cfg->webpa_uuid));
|
||||
ParodusPrint("cfg->webpa_uuid is :%s\n", cfg->webpa_uuid);
|
||||
cfg->crud_config_file = strdup("parodus_cfg.json");
|
||||
ParodusPrint("Default crud_config_file is %s\n", cfg->crud_config_file);
|
||||
}
|
||||
|
||||
void loadParodusCfg(ParodusCfg * config,ParodusCfg *cfg)
|
||||
@@ -163,109 +610,168 @@ void loadParodusCfg(ParodusCfg * config,ParodusCfg *cfg)
|
||||
return;
|
||||
}
|
||||
|
||||
ParodusCfg *pConfig =config;
|
||||
|
||||
if(strlen (pConfig->hw_model) !=0)
|
||||
if(strlen (config->hw_model) !=0)
|
||||
{
|
||||
strncpy(cfg->hw_model, pConfig->hw_model,strlen(pConfig->hw_model)+1);
|
||||
parStrncpy(cfg->hw_model, config->hw_model, sizeof(cfg->hw_model));
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusPrint("hw_model is NULL. read from tmp file\n");
|
||||
}
|
||||
if( strlen(pConfig->hw_serial_number) !=0)
|
||||
if( strlen(config->hw_serial_number) !=0)
|
||||
{
|
||||
strncpy(cfg->hw_serial_number, pConfig->hw_serial_number,strlen(pConfig->hw_serial_number)+1);
|
||||
parStrncpy(cfg->hw_serial_number, config->hw_serial_number, sizeof(cfg->hw_serial_number));
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusPrint("hw_serial_number is NULL. read from tmp file\n");
|
||||
}
|
||||
if(strlen(pConfig->hw_manufacturer) !=0)
|
||||
if(strlen(config->hw_manufacturer) !=0)
|
||||
{
|
||||
strncpy(cfg->hw_manufacturer, pConfig->hw_manufacturer,strlen(pConfig->hw_manufacturer)+1);
|
||||
parStrncpy(cfg->hw_manufacturer, config->hw_manufacturer,sizeof(cfg->hw_manufacturer));
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusPrint("hw_manufacturer is NULL. read from tmp file\n");
|
||||
}
|
||||
if(strlen(pConfig->hw_mac) !=0)
|
||||
if(strlen(config->hw_mac) !=0)
|
||||
{
|
||||
strncpy(cfg->hw_mac, pConfig->hw_mac,strlen(pConfig->hw_mac)+1);
|
||||
parStrncpy(cfg->hw_mac, config->hw_mac,sizeof(cfg->hw_mac));
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusPrint("hw_mac is NULL. read from tmp file\n");
|
||||
}
|
||||
if(strlen (pConfig->hw_last_reboot_reason) !=0)
|
||||
if(strlen (config->hw_last_reboot_reason) !=0)
|
||||
{
|
||||
strncpy(cfg->hw_last_reboot_reason, pConfig->hw_last_reboot_reason,strlen(pConfig->hw_last_reboot_reason)+1);
|
||||
parStrncpy(cfg->hw_last_reboot_reason, config->hw_last_reboot_reason,sizeof(cfg->hw_last_reboot_reason));
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusPrint("hw_last_reboot_reason is NULL. read from tmp file\n");
|
||||
}
|
||||
if(strlen(pConfig->fw_name) !=0)
|
||||
if(strlen(config->fw_name) !=0)
|
||||
{
|
||||
strncpy(cfg->fw_name, pConfig->fw_name,strlen(pConfig->fw_name)+1);
|
||||
parStrncpy(cfg->fw_name, config->fw_name,sizeof(cfg->fw_name));
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusPrint("fw_name is NULL. read from tmp file\n");
|
||||
}
|
||||
if( strlen(pConfig->webpa_url) !=0)
|
||||
if( strlen(config->webpa_url) !=0)
|
||||
{
|
||||
strncpy(cfg->webpa_url, pConfig->webpa_url,strlen(pConfig->webpa_url)+1);
|
||||
parStrncpy(cfg->webpa_url, config->webpa_url,sizeof(cfg->webpa_url));
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusPrint("webpa_url is NULL. read from tmp file\n");
|
||||
}
|
||||
if(strlen(pConfig->webpa_interface_used )!=0)
|
||||
if(strlen(config->webpa_interface_used )!=0)
|
||||
{
|
||||
strncpy(cfg->webpa_interface_used, pConfig->webpa_interface_used,strlen(pConfig->webpa_interface_used)+1);
|
||||
parStrncpy(cfg->webpa_interface_used, config->webpa_interface_used,sizeof(cfg->webpa_interface_used));
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusPrint("webpa_interface_used is NULL. read from tmp file\n");
|
||||
}
|
||||
if( strlen(pConfig->local_url) !=0)
|
||||
if( strlen(config->local_url) !=0)
|
||||
{
|
||||
strncpy(cfg->local_url, pConfig->local_url,strlen(pConfig->local_url)+1);
|
||||
parStrncpy(cfg->local_url, config->local_url,sizeof(cfg->local_url));
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusInfo("parodus local_url is NULL. adding default url\n");
|
||||
strncpy(cfg->local_url, PARODUS_UPSTREAM, strlen(PARODUS_UPSTREAM)+1);
|
||||
parStrncpy(cfg->local_url, PARODUS_UPSTREAM, sizeof(cfg->local_url));
|
||||
|
||||
}
|
||||
|
||||
if( strlen(pConfig->partner_id) !=0)
|
||||
if( strlen(config->partner_id) !=0)
|
||||
{
|
||||
strncpy(cfg->partner_id, pConfig->partner_id,strlen(pConfig->partner_id)+1);
|
||||
parStrncpy(cfg->partner_id, config->partner_id,sizeof(cfg->partner_id));
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusPrint("partner_id is NULL. read from tmp file\n");
|
||||
}
|
||||
|
||||
if( strlen(pConfig->seshat_url) !=0)
|
||||
#ifdef ENABLE_SESHAT
|
||||
if( strlen(config->seshat_url) !=0)
|
||||
{
|
||||
strncpy(cfg->seshat_url, pConfig->seshat_url,strlen(pConfig->seshat_url)+1);
|
||||
parStrncpy(cfg->seshat_url, config->seshat_url,sizeof(cfg->seshat_url));
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusInfo("seshat_url is NULL. Read from tmp file\n");
|
||||
}
|
||||
#endif
|
||||
cfg->acquire_jwt = config->acquire_jwt;
|
||||
|
||||
if( strlen(config->dns_txt_url) !=0)
|
||||
{
|
||||
parStrncpy(cfg->dns_txt_url, config->dns_txt_url, sizeof(cfg->dns_txt_url));
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusInfo("parodus dns-txt-url is NULL. adding default\n");
|
||||
parStrncpy(cfg->dns_txt_url, DNS_TXT_URL, sizeof(cfg->dns_txt_url));
|
||||
}
|
||||
|
||||
cfg->boot_time = pConfig->boot_time;
|
||||
cfg->secureFlag = 1;
|
||||
cfg->webpa_ping_timeout = pConfig->webpa_ping_timeout;
|
||||
cfg->webpa_backoff_max = pConfig->webpa_backoff_max;
|
||||
strncpy(cfg->webpa_path_url, WEBPA_PATH_URL, strlen(WEBPA_PATH_URL)+1);
|
||||
strncpy(cfg->webpa_protocol, WEBPA_PROTOCOL_VALUE, strlen(WEBPA_PROTOCOL_VALUE)+1);
|
||||
strncpy(cfg->webpa_uuid, "1234567-345456546", strlen("1234567-345456546")+1);
|
||||
if(strlen(config->jwt_key )!=0)
|
||||
{
|
||||
parStrncpy(cfg->jwt_key, config->jwt_key,sizeof(cfg->jwt_key));
|
||||
}
|
||||
else
|
||||
{
|
||||
parStrncpy(cfg->jwt_key, "\0", sizeof(cfg->jwt_key));
|
||||
ParodusPrint("jwt_key is NULL. set to empty\n");
|
||||
}
|
||||
|
||||
cfg->jwt_algo = config->jwt_algo;
|
||||
|
||||
if(strlen(config->cert_path )!=0)
|
||||
{
|
||||
parStrncpy(cfg->cert_path, config->cert_path,sizeof(cfg->cert_path));
|
||||
}
|
||||
else
|
||||
{
|
||||
parStrncpy(cfg->cert_path, "\0", sizeof(cfg->cert_path));
|
||||
ParodusPrint("cert_path is NULL. set to empty\n");
|
||||
}
|
||||
|
||||
if(strlen(config->token_acquisition_script )!=0)
|
||||
{
|
||||
parStrncpy(cfg->token_acquisition_script, config->token_acquisition_script,sizeof(cfg->token_acquisition_script));
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusPrint("token_acquisition_script is NULL. read from tmp file\n");
|
||||
}
|
||||
|
||||
if(strlen(config->token_read_script )!=0)
|
||||
{
|
||||
parStrncpy(cfg->token_read_script, config->token_read_script,sizeof(cfg->token_read_script));
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusPrint("token_read_script is NULL. read from tmp file\n");
|
||||
}
|
||||
|
||||
cfg->boot_time = config->boot_time;
|
||||
cfg->webpa_ping_timeout = config->webpa_ping_timeout;
|
||||
cfg->webpa_backoff_max = config->webpa_backoff_max;
|
||||
parStrncpy(cfg->webpa_path_url, WEBPA_PATH_URL,sizeof(cfg->webpa_path_url));
|
||||
snprintf(cfg->webpa_protocol, sizeof(cfg->webpa_protocol), "%s-%s", PROTOCOL_VALUE, GIT_COMMIT_TAG);
|
||||
ParodusInfo("cfg->webpa_protocol is %s\n", cfg->webpa_protocol);
|
||||
parStrncpy(cfg->webpa_uuid, "1234567-345456546",sizeof(cfg->webpa_uuid));
|
||||
ParodusPrint("cfg->webpa_uuid is :%s\n", cfg->webpa_uuid);
|
||||
|
||||
if(config->crud_config_file != NULL)
|
||||
{
|
||||
cfg->crud_config_file = strdup(config->crud_config_file);
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusPrint("crud_config_file is NULL. set to empty\n");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
109
src/config.h
109
src/config.h
@@ -1,9 +1,24 @@
|
||||
/**
|
||||
* Copyright 2015 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* @file config.h
|
||||
*
|
||||
* @description This file contains configuration details of parodus
|
||||
*
|
||||
* Copyright (c) 2015 Comcast
|
||||
*/
|
||||
|
||||
#ifndef _CONFIG_H_
|
||||
@@ -18,25 +33,31 @@ extern "C" {
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
/* WRP CRUD Model Macros */
|
||||
#define HW_MODELNAME "hw-model"
|
||||
#define HW_SERIALNUMBER "hw-serial-number"
|
||||
#define HW_MANUFACTURER "hw-manufacturer"
|
||||
#define HW_DEVICEMAC "hw-mac"
|
||||
#define HW_LAST_REBOOT_REASON "hw-last-reboot-reason"
|
||||
#define FIRMWARE_NAME "fw-name"
|
||||
#define BOOT_TIME "boot-time"
|
||||
#define LAST_RECONNECT_REASON "webpa-last-reconnect-reason"
|
||||
#define WEBPA_PROTOCOL "webpa-protocol"
|
||||
#define WEBPA_INTERFACE "webpa-inteface-used"
|
||||
#define WEBPA_UUID "webpa-uuid"
|
||||
#define WEBPA_URL "webpa-url"
|
||||
#define WEBPA_PING_TIMEOUT "webpa-ping-timeout"
|
||||
#define WEBPA_BACKOFF_MAX "webpa-backoff-max"
|
||||
#define PARTNER_ID "partner-id"
|
||||
#define HW_MODELNAME "hw-model"
|
||||
#define HW_SERIALNUMBER "hw-serial-number"
|
||||
#define HW_MANUFACTURER "hw-manufacturer"
|
||||
#define HW_DEVICEMAC "hw-mac"
|
||||
#define HW_LAST_REBOOT_REASON "hw-last-reboot-reason"
|
||||
#define FIRMWARE_NAME "fw-name"
|
||||
#define BOOT_TIME "boot-time"
|
||||
#define LAST_RECONNECT_REASON "webpa-last-reconnect-reason"
|
||||
#define WEBPA_PROTOCOL "webpa-protocol"
|
||||
#define WEBPA_INTERFACE "webpa-inteface-used"
|
||||
#define WEBPA_UUID "webpa-uuid"
|
||||
#define WEBPA_URL "webpa-url"
|
||||
#define WEBPA_PING_TIMEOUT "webpa-ping-timeout"
|
||||
#define WEBPA_BACKOFF_MAX "webpa-backoff-max"
|
||||
#define PARTNER_ID "partner-id"
|
||||
#define CERT_PATH "ssl-cert-path"
|
||||
|
||||
#define WEBPA_PROTOCOL_VALUE "WebPA-1.6"
|
||||
#define WEBPA_PATH_URL "/api/v2/device"
|
||||
#define PARODUS_UPSTREAM "tcp://127.0.0.1:6666"
|
||||
#define PROTOCOL_VALUE "PARODUS-2.0"
|
||||
#define WEBPA_PATH_URL "/api/v2/device"
|
||||
#define JWT_ALGORITHM "jwt-algo"
|
||||
#define JWT_KEY "jwt-key"
|
||||
#define DNS_TXT_URL "fabric"
|
||||
#define PARODUS_UPSTREAM "tcp://127.0.0.1:6666"
|
||||
|
||||
#define ALLOW_NON_RSA_ALG false
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Data Structures */
|
||||
@@ -56,25 +77,69 @@ typedef struct
|
||||
char webpa_path_url[124];
|
||||
unsigned int webpa_backoff_max;
|
||||
char webpa_interface_used[16];
|
||||
char webpa_protocol[16];
|
||||
char webpa_protocol[32];
|
||||
char webpa_uuid[64];
|
||||
unsigned int secureFlag;
|
||||
unsigned int flags;
|
||||
char local_url[124];
|
||||
char partner_id[64];
|
||||
#ifdef ENABLE_SESHAT
|
||||
char seshat_url[128];
|
||||
#endif
|
||||
char dns_txt_url[64];
|
||||
unsigned int acquire_jwt;
|
||||
unsigned int jwt_algo; // bit mask set for each allowed algorithm
|
||||
char jwt_key[4096]; // may be read in from a pem file
|
||||
char cert_path[64];
|
||||
char webpa_auth_token[4096];
|
||||
char token_acquisition_script[64];
|
||||
char token_read_script[64];
|
||||
char *crud_config_file;
|
||||
} ParodusCfg;
|
||||
|
||||
#define FLAGS_IPV6_ONLY (1 << 0)
|
||||
#define FLAGS_IPV4_ONLY (1 << 1)
|
||||
#define FLAGS_IPV6_IPV4 (FLAGS_IPV6_ONLY | FLAGS_IPV4_ONLY)
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Function Prototypes */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
void loadParodusCfg(ParodusCfg * config,ParodusCfg *cfg);
|
||||
void createNewAuthToken(char *newToken, size_t len);
|
||||
|
||||
void parseCommandLine(int argc,char **argv,ParodusCfg * cfg);
|
||||
/**
|
||||
* parse command line arguments and create config structure
|
||||
* and return whether args are valid or not
|
||||
*
|
||||
* @param argc number of command line arguments
|
||||
* @param argv command line argument lis
|
||||
* @return 0 if OK
|
||||
* or -1 if error
|
||||
*/
|
||||
int parseCommandLine(int argc,char **argv,ParodusCfg * cfg);
|
||||
|
||||
void setDefaultValuesToCfg(ParodusCfg *cfg);
|
||||
void getAuthToken(ParodusCfg *cfg);
|
||||
// Accessor for the global config structure.
|
||||
ParodusCfg *get_parodus_cfg(void);
|
||||
void set_parodus_cfg(ParodusCfg *);
|
||||
char *get_token_application(void) ;
|
||||
|
||||
/**
|
||||
* parse a webpa url. Extract the server address, the port
|
||||
* and return whether it's secure or not
|
||||
*
|
||||
* @param full_url full url
|
||||
* @param server_addr buffer containing server address found in url
|
||||
* @param server_addr_buflen len of the server addr buffer provided by caller
|
||||
* @param port_buf buffer containing port value found in url
|
||||
* @param port_buflen len of the port buffer provided by caller
|
||||
* @return 1 if insecure connection is allowed, 0 if not,
|
||||
* or -1 if error
|
||||
*/
|
||||
int parse_webpa_url(const char *full_url,
|
||||
char *server_addr, int server_addr_buflen,
|
||||
char *port_buf, int port_buflen);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
@@ -1,9 +1,24 @@
|
||||
/**
|
||||
* Copyright 2015 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* @file conn_interface.c
|
||||
*
|
||||
* @description This decribes interface to create WebSocket client connections.
|
||||
*
|
||||
* Copyright (c) 2015 Comcast
|
||||
*/
|
||||
|
||||
#include "connection.h"
|
||||
@@ -17,42 +32,48 @@
|
||||
#include "mutex.h"
|
||||
#include "spin_thread.h"
|
||||
#include "service_alive.h"
|
||||
#include <libseshat.h>
|
||||
#include "seshat_interface.h"
|
||||
#include "crud_interface.h"
|
||||
#include "heartBeat.h"
|
||||
#ifdef FEATURE_DNS_QUERY
|
||||
#include <ucresolv_log.h>
|
||||
#endif
|
||||
#include <time.h>
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Macros */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
#define HEARTBEAT_RETRY_SEC 30 /* Heartbeat (ping/pong) timeout in seconds */
|
||||
#define SESHAT_SERVICE_NAME "Parodus"
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* File Scoped Variables */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
bool close_retry = false;
|
||||
bool LastReasonStatus = false;
|
||||
volatile unsigned int heartBeatTimer = 0;
|
||||
pthread_mutex_t close_mut=PTHREAD_MUTEX_INITIALIZER;
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Function Prototypes */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
static bool __registerWithSeshat(void);
|
||||
|
||||
void timespec_diff(struct timespec *start, struct timespec *stop,
|
||||
struct timespec *result);
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* External Functions */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
void createSocketConnection(void *config_in, void (* initKeypress)())
|
||||
void createSocketConnection(void (* initKeypress)())
|
||||
{
|
||||
int intTimer=0;
|
||||
ParodusCfg *tmpCfg = (ParodusCfg*)config_in;
|
||||
//ParodusCfg *tmpCfg = (ParodusCfg*)config_in;
|
||||
noPollCtx *ctx;
|
||||
bool seshat_registered = false;
|
||||
unsigned int webpa_ping_timeout_ms = 1000 * get_parodus_cfg()->webpa_ping_timeout;
|
||||
unsigned int heartBeatTimer = 0;
|
||||
|
||||
loadParodusCfg(tmpCfg,get_parodus_cfg());
|
||||
//loadParodusCfg(tmpCfg,get_parodus_cfg());
|
||||
#ifdef FEATURE_DNS_QUERY
|
||||
register_ucresolv_logger (__cimplog);
|
||||
#endif
|
||||
ParodusPrint("Configure nopoll thread handlers in Parodus\n");
|
||||
nopoll_thread_handlers(&createMutex, &destroyMutex, &lockMutex, &unlockMutex);
|
||||
ctx = nopoll_ctx_new();
|
||||
@@ -74,6 +95,7 @@ void createSocketConnection(void *config_in, void (* initKeypress)())
|
||||
ParodusMsgQ = NULL;
|
||||
StartThread(messageHandlerTask);
|
||||
StartThread(serviceAliveTask);
|
||||
StartThread(CRUDHandlerTask);
|
||||
|
||||
if (NULL != initKeypress)
|
||||
{
|
||||
@@ -84,17 +106,27 @@ void createSocketConnection(void *config_in, void (* initKeypress)())
|
||||
|
||||
do
|
||||
{
|
||||
nopoll_loop_wait(ctx, 5000000);
|
||||
intTimer = intTimer + 5;
|
||||
struct timespec start, stop, diff;
|
||||
int time_taken_ms;
|
||||
|
||||
if(heartBeatTimer >= get_parodus_cfg()->webpa_ping_timeout)
|
||||
clock_gettime(CLOCK_REALTIME, &start);
|
||||
nopoll_loop_wait(ctx, 5000000);
|
||||
clock_gettime(CLOCK_REALTIME, &stop);
|
||||
|
||||
timespec_diff(&start, &stop, &diff);
|
||||
time_taken_ms = diff.tv_sec * 1000 + (diff.tv_nsec / 1000000);
|
||||
|
||||
// ParodusInfo("nopoll_loop_wait() time %d msec\n", time_taken_ms);
|
||||
heartBeatTimer = get_heartBeatTimer();
|
||||
if(heartBeatTimer >= webpa_ping_timeout_ms)
|
||||
{
|
||||
ParodusInfo("heartBeatTimer %d webpa_ping_timeout_ms %d\n", heartBeatTimer, webpa_ping_timeout_ms);
|
||||
if(!close_retry)
|
||||
{
|
||||
ParodusError("ping wait time > %d. Terminating the connection with WebPA server and retrying\n", get_parodus_cfg()->webpa_ping_timeout);
|
||||
ParodusError("ping wait time > %d . Terminating the connection with WebPA server and retrying\n", webpa_ping_timeout_ms / 1000);
|
||||
ParodusInfo("Reconnect detected, setting Ping_Miss reason for Reconnect\n");
|
||||
set_global_reconnect_reason("Ping_Miss");
|
||||
LastReasonStatus = true;
|
||||
set_global_reconnect_status(true);
|
||||
pthread_mutex_lock (&close_mut);
|
||||
close_retry = true;
|
||||
pthread_mutex_unlock (&close_mut);
|
||||
@@ -103,13 +135,10 @@ void createSocketConnection(void *config_in, void (* initKeypress)())
|
||||
{
|
||||
ParodusPrint("heartBeatHandler - close_retry set to %d, hence resetting the heartBeatTimer\n",close_retry);
|
||||
}
|
||||
heartBeatTimer = 0;
|
||||
reset_heartBeatTimer();
|
||||
}
|
||||
else if(intTimer >= 30)
|
||||
{
|
||||
ParodusPrint("heartBeatTimer %d\n",heartBeatTimer);
|
||||
heartBeatTimer += HEARTBEAT_RETRY_SEC;
|
||||
intTimer = 0;
|
||||
else {
|
||||
increment_heartBeatTimer(time_taken_ms);
|
||||
}
|
||||
|
||||
if( false == seshat_registered ) {
|
||||
@@ -130,44 +159,3 @@ void createSocketConnection(void *config_in, void (* initKeypress)())
|
||||
nopoll_cleanup_library();
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Internal functions */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/**
|
||||
* @brief Helper function to register with seshat.
|
||||
*
|
||||
* @note return whether successfully registered.
|
||||
*
|
||||
* @return true when registered, false otherwise.
|
||||
*/
|
||||
static bool __registerWithSeshat()
|
||||
{
|
||||
char *seshat_url = get_parodus_cfg()->seshat_url;
|
||||
char *parodus_url = get_parodus_cfg()->local_url;
|
||||
char *discover_url = NULL;
|
||||
bool rv = false;
|
||||
|
||||
if( 0 == init_lib_seshat(seshat_url) ) {
|
||||
ParodusInfo("seshatlib initialized! (url %s)\n", seshat_url);
|
||||
|
||||
if( 0 == seshat_register(SESHAT_SERVICE_NAME, parodus_url) ) {
|
||||
ParodusInfo("seshatlib registered! (url %s)\n", parodus_url);
|
||||
|
||||
discover_url = seshat_discover(SESHAT_SERVICE_NAME);
|
||||
if( (NULL != discover_url) && (0 == strcmp(parodus_url, discover_url)) ) {
|
||||
ParodusInfo("seshatlib discovered url = %s\n", discover_url);
|
||||
rv = true;
|
||||
} else {
|
||||
ParodusError("seshatlib registration error (url %s)!", discover_url);
|
||||
}
|
||||
free(discover_url);
|
||||
} else {
|
||||
ParodusError("seshatlib not registered! (url %s)\n", parodus_url);
|
||||
}
|
||||
} else {
|
||||
ParodusPrint("seshatlib not initialized! (url %s)\n", seshat_url);
|
||||
}
|
||||
|
||||
shutdown_seshat_lib();
|
||||
return rv;
|
||||
}
|
||||
|
||||
@@ -1,11 +1,25 @@
|
||||
/**
|
||||
* Copyright 2015 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* @file conn_interface.h
|
||||
*
|
||||
* @description This header defines interface to create WebSocket client connections.
|
||||
*
|
||||
* Copyright (c) 2015 Comcast
|
||||
*/
|
||||
|
||||
#ifndef _CONN_INTERFACE_H_
|
||||
#define _CONN_INTERFACE_H_
|
||||
|
||||
@@ -30,7 +44,7 @@ extern UpStreamMsg *UpStreamMsgQ;
|
||||
* Loads the WebPA config file, if not provided by the caller,
|
||||
* and creates the intial connection and manages the connection wait, close mechanisms.
|
||||
*/
|
||||
void createSocketConnection(void *config_in, void (* initKeypress)());
|
||||
void createSocketConnection(void (* initKeypress)());
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
427
src/connection.c
427
src/connection.c
@@ -1,24 +1,41 @@
|
||||
/**
|
||||
* Copyright 2015 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* @file connection.c
|
||||
*
|
||||
* @description This decribes functions required to manage WebSocket client connections.
|
||||
*
|
||||
* Copyright (c) 2015 Comcast
|
||||
*/
|
||||
|
||||
#include "connection.h"
|
||||
#include "time.h"
|
||||
#include "token.h"
|
||||
#include "config.h"
|
||||
#include "nopoll_helpers.h"
|
||||
#include "mutex.h"
|
||||
#include "spin_thread.h"
|
||||
#include "heartBeat.h"
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Macros */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
#define HTTP_CUSTOM_HEADER_COUNT 4
|
||||
|
||||
#define HTTP_CUSTOM_HEADER_COUNT 5
|
||||
#define INITIAL_CJWT_RETRY -2
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* File Scoped Variables */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
@@ -26,11 +43,17 @@
|
||||
char deviceMAC[32]={'\0'};
|
||||
static char *reconnect_reason = "webpa_process_starts";
|
||||
static noPollConn *g_conn = NULL;
|
||||
static bool LastReasonStatus = false;
|
||||
static noPollConnOpts * createConnOpts (char * extra_headers, bool secure);
|
||||
static noPollConn * nopoll_tls_common_conn (noPollCtx * ctx,char * serverAddr,char *serverPort,char * extra_headers,unsigned int *fallback);
|
||||
static char* build_extra_headers( const char *auth, const char *device_id,
|
||||
const char *user_agent, const char *convey );
|
||||
static void toggleIPFlag (unsigned int *ptrFallback);
|
||||
static noPollConn * __internal_fallbackConn(noPollCtx * ctx,noPollConnOpts * opts,char * serverAddr,char *serverPort,char * extra_headers,unsigned int *fallback);
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* External Functions */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
noPollConn *get_global_conn(void)
|
||||
{
|
||||
return g_conn;
|
||||
@@ -51,81 +74,79 @@ void set_global_reconnect_reason(char *reason)
|
||||
reconnect_reason = reason;
|
||||
}
|
||||
|
||||
bool get_global_reconnect_status()
|
||||
{
|
||||
return LastReasonStatus;
|
||||
}
|
||||
|
||||
void set_global_reconnect_status(bool status)
|
||||
{
|
||||
LastReasonStatus = status;
|
||||
}
|
||||
|
||||
// If IPv6 conn failed to connect then fallback to IPv4 conn or vice-versa
|
||||
static void toggleIPFlag (unsigned int *ptrFallback)
|
||||
{
|
||||
if(FLAGS_IPV6_ONLY == (FLAGS_IPV6_IPV4 & *ptrFallback))
|
||||
*ptrFallback = FLAGS_IPV4_ONLY;
|
||||
else
|
||||
*ptrFallback = FLAGS_IPV6_ONLY;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief createNopollConnection interface to create WebSocket client connections.
|
||||
*Loads the WebPA config file and creates the intial connection and manages the connection wait, close mechanisms.
|
||||
*/
|
||||
int createNopollConnection(noPollCtx *ctx)
|
||||
{
|
||||
bool initial_retry = false;
|
||||
int backoffRetryTime = 0;
|
||||
bool initial_retry = false;
|
||||
int backoffRetryTime = 0;
|
||||
int max_retry_sleep;
|
||||
char device_id[32]={'\0'};
|
||||
char user_agent[512]={'\0'};
|
||||
const char * headerNames[HTTP_CUSTOM_HEADER_COUNT] = {"X-WebPA-Device-Name","X-WebPA-Device-Protocols","User-Agent", "X-WebPA-Convey"};
|
||||
const char *headerValues[HTTP_CUSTOM_HEADER_COUNT];
|
||||
int headerCount = HTTP_CUSTOM_HEADER_COUNT; /* Invalid X-Webpa-Convey header Bug # WEBPA-787 */
|
||||
char port[8];
|
||||
noPollConnOpts * opts;
|
||||
char server_Address[256];
|
||||
char redirectURL[128]={'\0'};
|
||||
char *temp_ptr, *conveyHeader;
|
||||
char *jwt_server_url= NULL;
|
||||
char *redirectURL = NULL;
|
||||
int status=0;
|
||||
int allow_insecure = -1;
|
||||
int jwt_status = INITIAL_CJWT_RETRY;
|
||||
int connErr=0;
|
||||
struct timespec connErr_start,connErr_end,*connErr_startPtr,*connErr_endPtr;
|
||||
connErr_startPtr = &connErr_start;
|
||||
connErr_endPtr = &connErr_end;
|
||||
//Retry Backoff count shall start at c=2 & calculate 2^c - 1.
|
||||
int c=2;
|
||||
int c=2;
|
||||
char *conveyHeader = NULL;
|
||||
char device_id[36]={'\0'};
|
||||
char user_agent[512]={'\0'};
|
||||
char * extra_headers = NULL;
|
||||
unsigned int fallback = FLAGS_IPV6_ONLY;
|
||||
|
||||
if(ctx == NULL) {
|
||||
return nopoll_false;
|
||||
}
|
||||
|
||||
FILE *fp;
|
||||
fp = fopen("/tmp/parodus_ready", "r");
|
||||
|
||||
if (fp!=NULL)
|
||||
{
|
||||
unlink("/tmp/parodus_ready");
|
||||
ParodusPrint("Closing Parodus_Ready FIle \n");
|
||||
fclose(fp);
|
||||
}
|
||||
|
||||
parStrncpy(deviceMAC, get_parodus_cfg()->hw_mac,sizeof(deviceMAC));
|
||||
snprintf(device_id, sizeof(device_id), "mac:%s", deviceMAC);
|
||||
ParodusInfo("Device_id %s\n",device_id);
|
||||
|
||||
headerValues[0] = device_id;
|
||||
headerValues[1] = "wrp-0.11,getset-0.1";
|
||||
|
||||
ParodusPrint("BootTime In sec: %d\n", get_parodus_cfg()->boot_time);
|
||||
ParodusInfo("Received reboot_reason as:%s\n", get_parodus_cfg()->hw_last_reboot_reason);
|
||||
ParodusInfo("Received reconnect_reason as:%s\n", reconnect_reason);
|
||||
snprintf(user_agent, sizeof(user_agent),
|
||||
"%s (%s; %s/%s;)",
|
||||
((0 != strlen(get_parodus_cfg()->webpa_protocol)) ? get_parodus_cfg()->webpa_protocol : "unknown"),
|
||||
((0 != strlen(get_parodus_cfg()->fw_name)) ? get_parodus_cfg()->fw_name : "unknown"),
|
||||
((0 != strlen(get_parodus_cfg()->hw_model)) ? get_parodus_cfg()->hw_model : "unknown"),
|
||||
((0 != strlen(get_parodus_cfg()->hw_manufacturer)) ? get_parodus_cfg()->hw_manufacturer : "unknown"));
|
||||
|
||||
max_retry_sleep = (int) get_parodus_cfg()->webpa_backoff_max;
|
||||
ParodusPrint("max_retry_sleep is %d\n", max_retry_sleep );
|
||||
|
||||
snprintf(user_agent, sizeof(user_agent),"%s (%s; %s/%s;)",
|
||||
((0 != strlen(get_parodus_cfg()->webpa_protocol)) ? get_parodus_cfg()->webpa_protocol : "unknown"),
|
||||
((0 != strlen(get_parodus_cfg()->fw_name)) ? get_parodus_cfg()->fw_name : "unknown"),
|
||||
((0 != strlen(get_parodus_cfg()->hw_model)) ? get_parodus_cfg()->hw_model : "unknown"),
|
||||
((0 != strlen(get_parodus_cfg()->hw_manufacturer)) ? get_parodus_cfg()->hw_manufacturer : "unknown"));
|
||||
|
||||
ParodusInfo("User-Agent: %s\n",user_agent);
|
||||
headerValues[2] = user_agent;
|
||||
conveyHeader = getWebpaConveyHeader();
|
||||
if(strlen(conveyHeader) > 0)
|
||||
{
|
||||
headerValues[3] = conveyHeader;
|
||||
}
|
||||
else
|
||||
{
|
||||
headerValues[3] = "";
|
||||
headerCount -= 1;
|
||||
}
|
||||
snprintf(port,sizeof(port),"%d",8080);
|
||||
parStrncpy(server_Address, get_parodus_cfg()->webpa_url, sizeof(server_Address));
|
||||
ParodusInfo("server_Address %s\n",server_Address);
|
||||
|
||||
max_retry_sleep = (int) pow(2, get_parodus_cfg()->webpa_backoff_max) -1;
|
||||
ParodusPrint("max_retry_sleep is %d\n", max_retry_sleep );
|
||||
parStrncpy(deviceMAC, get_parodus_cfg()->hw_mac,sizeof(deviceMAC));
|
||||
snprintf(device_id, sizeof(device_id), "mac:%s", deviceMAC);
|
||||
ParodusInfo("Device_id %s\n",device_id);
|
||||
|
||||
extra_headers = build_extra_headers(
|
||||
((0 < strlen(get_parodus_cfg()->webpa_auth_token)) ? get_parodus_cfg()->webpa_auth_token : NULL),
|
||||
device_id, user_agent, conveyHeader );
|
||||
|
||||
do
|
||||
{
|
||||
@@ -135,25 +156,52 @@ int createNopollConnection(noPollCtx *ctx)
|
||||
backoffRetryTime = (int) pow(2, c) -1;
|
||||
}
|
||||
ParodusPrint("New backoffRetryTime value calculated as %d seconds\n", backoffRetryTime);
|
||||
|
||||
noPollConn *connection;
|
||||
if(get_parodus_cfg()->secureFlag)
|
||||
//retry jwt validation on query dns failure
|
||||
if((jwt_status == INITIAL_CJWT_RETRY) || (jwt_status == TOKEN_ERR_QUERY_DNS_FAIL))
|
||||
{
|
||||
allow_insecure = parse_webpa_url (get_parodus_cfg()->webpa_url,
|
||||
server_Address, (int) sizeof(server_Address),
|
||||
port, (int) sizeof(port));
|
||||
if (allow_insecure < 0)
|
||||
return nopoll_false; // must have valid default url
|
||||
#ifdef FEATURE_DNS_QUERY
|
||||
if (get_parodus_cfg()->acquire_jwt) {
|
||||
//query dns and validate JWT
|
||||
jwt_status = allow_insecure_conn(
|
||||
server_Address, (int) sizeof(server_Address),
|
||||
port, (int) sizeof(port));
|
||||
|
||||
//store server_Address as jwt_server_url to use it for JWT retry scenarios
|
||||
jwt_server_url = strdup(server_Address);
|
||||
if (jwt_server_url !=NULL)
|
||||
ParodusInfo("JWT ON: jwt_server_url stored as %s\n", jwt_server_url);
|
||||
|
||||
if (jwt_status >= 0)
|
||||
allow_insecure = jwt_status;
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusInfo("JWT validation is disabled\n");
|
||||
jwt_status = 1;
|
||||
}
|
||||
#else
|
||||
jwt_status = 1;
|
||||
#endif
|
||||
ParodusInfo("server_Address %s\n",server_Address);
|
||||
ParodusInfo("port %s\n", port);
|
||||
}
|
||||
if(allow_insecure <= 0)
|
||||
{
|
||||
ParodusPrint("secure true\n");
|
||||
/* disable verification */
|
||||
opts = nopoll_conn_opts_new ();
|
||||
nopoll_conn_opts_ssl_peer_verify (opts, nopoll_false);
|
||||
nopoll_conn_opts_set_ssl_protocol (opts, NOPOLL_METHOD_TLSV1_2);
|
||||
connection = nopoll_conn_tls_new(ctx, opts, server_Address, port, NULL,
|
||||
get_parodus_cfg()->webpa_path_url, NULL, NULL, get_parodus_cfg()->webpa_interface_used,
|
||||
headerNames, headerValues, headerCount);// WEBPA-787
|
||||
connection = nopoll_tls_common_conn(ctx,server_Address, port, extra_headers,&fallback);
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusPrint("secure false\n");
|
||||
connection = nopoll_conn_new(ctx, server_Address, port, NULL,
|
||||
get_parodus_cfg()->webpa_path_url, NULL, NULL, get_parodus_cfg()->webpa_interface_used,
|
||||
headerNames, headerValues, headerCount);// WEBPA-787
|
||||
noPollConnOpts * opts;
|
||||
opts = createConnOpts(extra_headers, false);
|
||||
connection = nopoll_conn_new_opts (ctx, opts,server_Address,port,NULL,get_parodus_cfg()->webpa_path_url,NULL,NULL);// WEBPA-787
|
||||
}
|
||||
set_global_conn(connection);
|
||||
|
||||
@@ -164,11 +212,32 @@ int createNopollConnection(noPollCtx *ctx)
|
||||
ParodusError("Error connecting to server\n");
|
||||
ParodusError("RDK-10037 - WebPA Connection Lost\n");
|
||||
// Copy the server address from config to avoid retrying to the same failing talaria redirected node
|
||||
parStrncpy(server_Address, get_parodus_cfg()->webpa_url, sizeof(server_Address));
|
||||
if (get_parodus_cfg()->acquire_jwt == 0)
|
||||
{
|
||||
ParodusInfo("acquire_jwt is 0, retrying with config server address\n");
|
||||
allow_insecure = parse_webpa_url (get_parodus_cfg()->webpa_url,
|
||||
server_Address, (int) sizeof(server_Address),
|
||||
port, (int) sizeof(port));
|
||||
}
|
||||
else
|
||||
{
|
||||
if( (jwt_server_url != NULL) && strlen(jwt_server_url) != 0 )
|
||||
{
|
||||
ParodusInfo("acquire_jwt is 1, retrying with jwt_server_url\n");
|
||||
parStrncpy(server_Address, jwt_server_url, sizeof(server_Address));
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusError("acquire_jwt is 1 & unable to get jwt_server_url, retrying with config server address\n");
|
||||
allow_insecure = parse_webpa_url (get_parodus_cfg()->webpa_url, server_Address, (int) sizeof(server_Address), port, (int) sizeof(port));
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
close_and_unref_connection(get_global_conn());
|
||||
set_global_conn(NULL);
|
||||
initial_retry = true;
|
||||
|
||||
toggleIPFlag(&fallback);
|
||||
ParodusInfo("Waiting with backoffRetryTime %d seconds\n", backoffRetryTime);
|
||||
sleep(backoffRetryTime);
|
||||
continue;
|
||||
@@ -182,32 +251,95 @@ int createNopollConnection(noPollCtx *ctx)
|
||||
backoffRetryTime = (int) pow(2, c) -1;
|
||||
}
|
||||
|
||||
if(!nopoll_conn_wait_until_connection_ready(get_global_conn(), 10, redirectURL))
|
||||
if(!nopoll_conn_wait_for_status_until_connection_ready(get_global_conn(), 10, &status, &redirectURL))
|
||||
{
|
||||
|
||||
if (strncmp(redirectURL, "Redirect:", 9) == 0) // only when there is a http redirect
|
||||
if(status == 307 || status == 302 || status == 303) // only when there is a http redirect
|
||||
{
|
||||
ParodusError("Received temporary redirection response message %s\n", redirectURL);
|
||||
// Extract server Address and port from the redirectURL
|
||||
temp_ptr = strtok(redirectURL , ":"); //skip Redirect
|
||||
temp_ptr = strtok(NULL , ":"); // skip https
|
||||
temp_ptr = strtok(NULL , ":");
|
||||
parStrncpy(server_Address, temp_ptr+2, sizeof(server_Address));
|
||||
parStrncpy(port, strtok(NULL , "/"), sizeof(port));
|
||||
ParodusInfo("Trying to Connect to new Redirected server : %s with port : %s\n", server_Address, port);
|
||||
if (strncmp (redirectURL, "Redirect:", 9) == 0)
|
||||
redirectURL += 9;
|
||||
allow_insecure = parse_webpa_url (redirectURL,
|
||||
server_Address, (int) sizeof(server_Address),
|
||||
port, (int) sizeof(port));
|
||||
if (allow_insecure < 0) {
|
||||
ParodusError ("Invalid redirectURL\n");
|
||||
|
||||
if (get_parodus_cfg()->acquire_jwt == 0)
|
||||
{
|
||||
ParodusInfo("acquire_jwt is 0, retrying with config server address\n");
|
||||
allow_insecure = parse_webpa_url (get_parodus_cfg()->webpa_url, server_Address, (int) sizeof(server_Address), port, (int) sizeof(port));
|
||||
}
|
||||
else
|
||||
{
|
||||
if( (jwt_server_url != NULL) && strlen(jwt_server_url) != 0 )
|
||||
{
|
||||
ParodusInfo("acquire_jwt is 1, retrying with jwt_server_url\n");
|
||||
parStrncpy(server_Address, jwt_server_url, sizeof(server_Address));
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusError("acquire_jwt is 1 & unable to get jwt_server_url, retrying with config server address\n");
|
||||
allow_insecure = parse_webpa_url (get_parodus_cfg()->webpa_url, server_Address, (int) sizeof(server_Address), port, (int) sizeof(port));
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
} else
|
||||
ParodusInfo("Trying to Connect to new Redirected server : %s with port : %s\n", server_Address, port);
|
||||
//reset c=2 to start backoffRetryTime as retrying using new redirect server
|
||||
c = 2;
|
||||
}
|
||||
else if(status == 403)
|
||||
{
|
||||
ParodusError("Received Unauthorized response with status: %d\n", status);
|
||||
//Get new token and update auth header
|
||||
|
||||
if (strlen(get_parodus_cfg()->token_acquisition_script) >0) {
|
||||
createNewAuthToken(get_parodus_cfg()->webpa_auth_token,sizeof(get_parodus_cfg()->webpa_auth_token));
|
||||
}
|
||||
|
||||
extra_headers = build_extra_headers( (0 < strlen(get_parodus_cfg()->webpa_auth_token) ? get_parodus_cfg()->webpa_auth_token : NULL),
|
||||
device_id, user_agent, conveyHeader );
|
||||
|
||||
//reset c=2 to start backoffRetryTime as retrying
|
||||
c = 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusError("Client connection timeout\n");
|
||||
ParodusError("RDK-10037 - WebPA Connection Lost\n");
|
||||
// Copy the server address from config to avoid retrying to the same failing talaria redirected node
|
||||
parStrncpy(server_Address, get_parodus_cfg()->webpa_url, sizeof(server_Address));
|
||||
// Copy the server address and port from config to avoid retrying to the same failing talaria redirected node
|
||||
|
||||
if (get_parodus_cfg()->acquire_jwt == 0)
|
||||
{
|
||||
ParodusInfo("acquire_jwt is 0, retrying with config server address\n");
|
||||
allow_insecure = parse_webpa_url (get_parodus_cfg()->webpa_url, server_Address, (int) sizeof(server_Address), port, (int) sizeof(port));
|
||||
}
|
||||
else
|
||||
{
|
||||
if( (jwt_server_url != NULL) && strlen(jwt_server_url) != 0 )
|
||||
{
|
||||
ParodusInfo("acquire_jwt is 1, retrying with jwt_server_url\n");
|
||||
parStrncpy(server_Address, jwt_server_url, sizeof(server_Address));
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusError("acquire_jwt is 1 & unable to get jwt_server_url, retrying with config server address\n");
|
||||
allow_insecure = parse_webpa_url (get_parodus_cfg()->webpa_url, server_Address, (int) sizeof(server_Address), port, (int) sizeof(port));
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
ParodusInfo("Waiting with backoffRetryTime %d seconds\n", backoffRetryTime);
|
||||
sleep(backoffRetryTime);
|
||||
toggleIPFlag(&fallback);
|
||||
c++;
|
||||
}
|
||||
//reset httpStatus before next retry
|
||||
ParodusPrint("reset httpStatus from server before next retry\n");
|
||||
status = 0;
|
||||
close_and_unref_connection(get_global_conn());
|
||||
set_global_conn(NULL);
|
||||
initial_retry = true;
|
||||
@@ -240,24 +372,44 @@ int createNopollConnection(noPollCtx *ctx)
|
||||
if(timeValDiff(connErr_startPtr, connErr_endPtr) >= (15*60*1000))
|
||||
{
|
||||
ParodusError("WebPA unable to connect due to DNS resolving to 10.0.0.1 for over 15 minutes; crashing service.\n");
|
||||
reconnect_reason = "Dns_Res_webpa_reconnect";
|
||||
LastReasonStatus = true;
|
||||
set_global_reconnect_reason("Dns_Res_webpa_reconnect");
|
||||
set_global_reconnect_status(true);
|
||||
|
||||
kill(getpid(),SIGTERM);
|
||||
}
|
||||
}
|
||||
}
|
||||
initial_retry = true;
|
||||
toggleIPFlag(&fallback);
|
||||
ParodusInfo("Waiting with backoffRetryTime %d seconds\n", backoffRetryTime);
|
||||
sleep(backoffRetryTime);
|
||||
c++;
|
||||
// Copy the server address from config to avoid retrying to the same failing talaria redirected node
|
||||
parStrncpy(server_Address, get_parodus_cfg()->webpa_url, sizeof(server_Address));
|
||||
// Copy the server address and port from config to avoid retrying to the same failing talaria redirected node
|
||||
|
||||
if (get_parodus_cfg()->acquire_jwt == 0)
|
||||
{
|
||||
ParodusInfo("acquire_jwt is 0, retrying with config server address\n");
|
||||
allow_insecure = parse_webpa_url (get_parodus_cfg()->webpa_url, server_Address, (int) sizeof(server_Address), port, (int) sizeof(port));
|
||||
}
|
||||
else
|
||||
{
|
||||
if( (jwt_server_url != NULL) && strlen(jwt_server_url) != 0 )
|
||||
{
|
||||
ParodusInfo("acquire_jwt is 1, retrying with jwt_server_url\n");
|
||||
parStrncpy(server_Address, jwt_server_url, sizeof(server_Address));
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusError("acquire_jwt is 1 & unable to get jwt_server_url, retrying with config server address\n");
|
||||
allow_insecure = parse_webpa_url (get_parodus_cfg()->webpa_url, server_Address, (int) sizeof(server_Address), port, (int) sizeof(port));
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}while(initial_retry);
|
||||
|
||||
if(get_parodus_cfg()->secureFlag)
|
||||
if(allow_insecure <= 0)
|
||||
{
|
||||
ParodusInfo("Connected to server over SSL\n");
|
||||
}
|
||||
@@ -266,23 +418,126 @@ int createNopollConnection(noPollCtx *ctx)
|
||||
ParodusInfo("Connected to server\n");
|
||||
}
|
||||
|
||||
|
||||
if (NULL != jwt_server_url)
|
||||
{
|
||||
free (jwt_server_url);
|
||||
}
|
||||
|
||||
if(redirectURL != NULL)
|
||||
{
|
||||
free(redirectURL);
|
||||
redirectURL = NULL;
|
||||
}
|
||||
|
||||
if (NULL != extra_headers)
|
||||
{
|
||||
free (extra_headers);
|
||||
extra_headers = NULL;
|
||||
}
|
||||
|
||||
// Reset close_retry flag and heartbeatTimer once the connection retry is successful
|
||||
ParodusPrint("createNopollConnection(): close_mut lock\n");
|
||||
pthread_mutex_lock (&close_mut);
|
||||
close_retry = false;
|
||||
pthread_mutex_unlock (&close_mut);
|
||||
ParodusPrint("createNopollConnection(): close_mut unlock\n");
|
||||
heartBeatTimer = 0;
|
||||
reset_heartBeatTimer();
|
||||
// Reset connErr flag on successful connection
|
||||
connErr = 0;
|
||||
reconnect_reason = "webpa_process_starts";
|
||||
LastReasonStatus =false;
|
||||
set_global_reconnect_reason("webpa_process_starts");
|
||||
set_global_reconnect_status(false);
|
||||
ParodusPrint("LastReasonStatus reset after successful connection\n");
|
||||
setMessageHandlers();
|
||||
|
||||
return nopoll_true;
|
||||
}
|
||||
|
||||
/* Build the extra headers string with any/all conditional logic in one place. */
|
||||
static char* build_extra_headers( const char *auth, const char *device_id,
|
||||
const char *user_agent, const char *convey )
|
||||
{
|
||||
return nopoll_strdup_printf(
|
||||
"%s%s"
|
||||
"\r\nX-WebPA-Device-Name: %s"
|
||||
"\r\nX-WebPA-Device-Protocols: wrp-0.11,getset-0.1"
|
||||
"\r\nUser-Agent: %s"
|
||||
"%s%s",
|
||||
|
||||
(NULL != auth) ? "\r\nAuthorization: Bearer " : "",
|
||||
(NULL != auth) ? auth: "",
|
||||
device_id,
|
||||
user_agent,
|
||||
(NULL != convey) ? "\r\nX-WebPA-Convey: " : "",
|
||||
(NULL != convey) ? convey : "" );
|
||||
}
|
||||
|
||||
static noPollConn * nopoll_tls_common_conn (noPollCtx * ctx,char * serverAddr,char *serverPort,char * extra_headers,unsigned int *fallback)
|
||||
{
|
||||
unsigned int flags = 0;
|
||||
noPollConnOpts * opts;
|
||||
noPollConn *connection = NULL;
|
||||
opts = createConnOpts(extra_headers, true);
|
||||
|
||||
flags = get_parodus_cfg()->flags;
|
||||
|
||||
if( FLAGS_IPV4_ONLY == (FLAGS_IPV4_ONLY & flags) ) {
|
||||
ParodusInfo("Connecting in Ipv4 mode\n");
|
||||
connection = nopoll_conn_tls_new (ctx, opts,serverAddr,serverPort,NULL,get_parodus_cfg()->webpa_path_url,NULL,NULL);
|
||||
} else if( FLAGS_IPV6_ONLY == (FLAGS_IPV6_ONLY & flags) ) {
|
||||
ParodusInfo("Connecting in Ipv6 mode\n");
|
||||
connection = nopoll_conn_tls_new6 (ctx, opts,serverAddr,serverPort,NULL,get_parodus_cfg()->webpa_path_url,NULL,NULL);
|
||||
} else {
|
||||
|
||||
connection = __internal_fallbackConn(ctx,opts,serverAddr,serverPort,extra_headers,fallback);
|
||||
}
|
||||
return connection;
|
||||
}
|
||||
|
||||
static noPollConn * __internal_fallbackConn(noPollCtx * ctx,noPollConnOpts * opts,char * serverAddr,char *serverPort,char * extra_headers,unsigned int *fallback)
|
||||
{
|
||||
noPollConn *connection = NULL;
|
||||
|
||||
if(FLAGS_IPV6_ONLY == (FLAGS_IPV6_IPV4 & *fallback))
|
||||
{
|
||||
ParodusInfo("Try connecting with Ipv6 mode\n");
|
||||
connection = nopoll_conn_tls_new6 (ctx, opts,serverAddr,serverPort,NULL,get_parodus_cfg()->webpa_path_url,NULL,NULL);
|
||||
}
|
||||
if(FLAGS_IPV4_ONLY == (FLAGS_IPV6_IPV4 & *fallback) || !nopoll_conn_is_ok (connection) )
|
||||
{
|
||||
ParodusInfo("Ipv6 connection failed. Try connecting with Ipv4 mode \n");
|
||||
|
||||
// fallback is to detect the current connection mode either IPv6/IPv4. if the fallback flag is true for IPv6 connection, then change it here to IPv4. or if the fallback flag is already in IPv4 mode, then skip it.
|
||||
if(!nopoll_conn_is_ok (connection) && FLAGS_IPV6_ONLY == (FLAGS_IPV6_IPV4 & *fallback))
|
||||
toggleIPFlag(fallback);
|
||||
|
||||
opts = createConnOpts(extra_headers, true);
|
||||
connection = nopoll_conn_tls_new (ctx, opts,serverAddr,serverPort,NULL,get_parodus_cfg()->webpa_path_url,NULL,NULL);
|
||||
}
|
||||
|
||||
return connection;
|
||||
}
|
||||
|
||||
static noPollConnOpts * createConnOpts (char * extra_headers, bool secure)
|
||||
{
|
||||
noPollConnOpts * opts;
|
||||
|
||||
opts = nopoll_conn_opts_new ();
|
||||
if(secure)
|
||||
{
|
||||
if(strlen(get_parodus_cfg()->cert_path) > 0)
|
||||
{
|
||||
nopoll_conn_opts_set_ssl_certs(opts, NULL, NULL, NULL, get_parodus_cfg()->cert_path);
|
||||
}
|
||||
nopoll_conn_opts_ssl_peer_verify (opts, nopoll_true);
|
||||
nopoll_conn_opts_set_ssl_protocol (opts, NOPOLL_METHOD_TLSV1_2);
|
||||
}
|
||||
nopoll_conn_opts_set_interface (opts,get_parodus_cfg()->webpa_interface_used);
|
||||
nopoll_conn_opts_set_extra_headers (opts,extra_headers);
|
||||
return opts;
|
||||
}
|
||||
|
||||
|
||||
void close_and_unref_connection(noPollConn *conn)
|
||||
{
|
||||
if (conn) {
|
||||
|
||||
@@ -1,9 +1,24 @@
|
||||
/**
|
||||
* Copyright 2015 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* @file connection.h
|
||||
*
|
||||
* @description This header defines functions required to manage WebSocket client connections.
|
||||
*
|
||||
* Copyright (c) 2015 Comcast
|
||||
*/
|
||||
|
||||
#ifndef _CONNECTION_H_
|
||||
@@ -20,7 +35,6 @@ extern "C" {
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
extern bool close_retry;
|
||||
extern volatile unsigned int heartBeatTimer;
|
||||
extern pthread_mutex_t close_mut;
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
@@ -40,6 +54,9 @@ void set_global_conn(noPollConn *);
|
||||
char *get_global_reconnect_reason();
|
||||
void set_global_reconnect_reason(char *reason);
|
||||
|
||||
bool get_global_reconnect_status();
|
||||
void set_global_reconnect_status(bool status);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
173
src/crud_interface.c
Normal file
173
src/crud_interface.c
Normal file
@@ -0,0 +1,173 @@
|
||||
/**
|
||||
* Copyright 2015 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* @file crud_interface.c
|
||||
*
|
||||
* @description This file is used to manage incoming and outgoing CRUD messages.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "ParodusInternal.h"
|
||||
#include "crud_tasks.h"
|
||||
#include "crud_interface.h"
|
||||
#include "upstream.h"
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Macros */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
pthread_mutex_t crud_mut=PTHREAD_MUTEX_INITIALIZER;
|
||||
pthread_cond_t crud_con=PTHREAD_COND_INITIALIZER;
|
||||
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Internal variables */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
CrudMsg *crudMsgQ = NULL;
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* External functions */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
void addCRUDmsgToQueue(wrp_msg_t *crudMsg)
|
||||
{
|
||||
CrudMsg * crudMessage;
|
||||
crudMessage = (CrudMsg *)malloc(sizeof(CrudMsg));
|
||||
if(crudMessage && crudMsg!=NULL)
|
||||
{
|
||||
crudMessage->msg = crudMsg;
|
||||
crudMessage->next = NULL;
|
||||
ParodusPrint("Inside addCRUDmsgToQueue : mutex lock in producer \n");
|
||||
pthread_mutex_lock(&crud_mut);
|
||||
if(crudMsgQ ==NULL)
|
||||
{
|
||||
crudMsgQ = crudMessage;
|
||||
ParodusPrint("Producer added message\n");
|
||||
pthread_cond_signal(&crud_con);
|
||||
pthread_mutex_unlock(&crud_mut);
|
||||
ParodusPrint("Inside addCRUDmsgToQueue : mutex unlock in producer \n");
|
||||
}
|
||||
else
|
||||
{
|
||||
CrudMsg *temp = crudMsgQ;
|
||||
while(temp->next)
|
||||
{
|
||||
temp = temp->next;
|
||||
}
|
||||
temp->next = crudMessage;
|
||||
pthread_mutex_unlock(&crud_mut);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusError("Memory allocation failed for CRUD\n");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void *CRUDHandlerTask()
|
||||
{
|
||||
int ret = 0;
|
||||
ssize_t resp_size = 0;
|
||||
void *resp_bytes;
|
||||
wrp_msg_t *crud_response = NULL;
|
||||
|
||||
while(FOREVER())
|
||||
{
|
||||
pthread_mutex_lock(&crud_mut);
|
||||
ParodusPrint("Mutex lock in CRUD consumer thread\n");
|
||||
|
||||
if(crudMsgQ !=NULL)
|
||||
{
|
||||
CrudMsg *message = crudMsgQ;
|
||||
crudMsgQ = crudMsgQ->next;
|
||||
pthread_mutex_unlock(&crud_mut);
|
||||
ParodusPrint("Mutex unlock in CRUD consumer thread\n");
|
||||
|
||||
ret = processCrudRequest(message->msg, &crud_response);
|
||||
wrp_free_struct(message->msg);
|
||||
free(message);
|
||||
message = NULL;
|
||||
|
||||
if(ret == 0)
|
||||
{
|
||||
ParodusInfo("CRUD processed successfully\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusError("Failure in CRUD request processing !!\n");
|
||||
}
|
||||
ParodusPrint("msgpack encode to send to upstream\n");
|
||||
resp_size = wrp_struct_to( crud_response, WRP_BYTES, &resp_bytes );
|
||||
ParodusPrint("Encoded CRUD resp_size :%lu\n", resp_size);
|
||||
|
||||
ParodusPrint("Adding CRUD response to upstreamQ\n");
|
||||
addCRUDresponseToUpstreamQ(resp_bytes, resp_size);
|
||||
wrp_free_struct(crud_response);
|
||||
}
|
||||
else
|
||||
{
|
||||
pthread_cond_wait(&crud_con, &crud_mut);
|
||||
pthread_mutex_unlock (&crud_mut);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
//CRUD Producer adds the response into common UpStreamQ
|
||||
void addCRUDresponseToUpstreamQ(void *response_bytes, ssize_t response_size)
|
||||
{
|
||||
UpStreamMsg *response;
|
||||
|
||||
response = (UpStreamMsg *)malloc(sizeof(UpStreamMsg));
|
||||
if(response)
|
||||
{
|
||||
response->msg =(void *)response_bytes;
|
||||
response->len =(int)response_size;
|
||||
response->next=NULL;
|
||||
pthread_mutex_lock (get_global_nano_mut());
|
||||
ParodusPrint("Mutex lock in CRUD response producer\n");
|
||||
|
||||
if(get_global_UpStreamMsgQ() == NULL)
|
||||
{
|
||||
set_global_UpStreamMsgQ(response);
|
||||
ParodusPrint("Producer added CRUD response to UpStreamQ\n");
|
||||
pthread_cond_signal(get_global_nano_con());
|
||||
pthread_mutex_unlock (get_global_nano_mut());
|
||||
ParodusPrint("mutex unlock in CRUD response producer\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusPrint("Producer adding CRUD response to UpStreamQ\n");
|
||||
UpStreamMsg *temp = get_global_UpStreamMsgQ();
|
||||
while(temp->next)
|
||||
{
|
||||
temp = temp->next;
|
||||
}
|
||||
temp->next = response;
|
||||
pthread_mutex_unlock (get_global_nano_mut());
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusError("failure in allocation for CRUD response\n");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
55
src/crud_interface.h
Normal file
55
src/crud_interface.h
Normal file
@@ -0,0 +1,55 @@
|
||||
/**
|
||||
* Copyright 2015 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* @file crud_interface.h
|
||||
*
|
||||
* @description This header defines functions required to manage CRUD messages.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _CRUD_INTERFACE_H_
|
||||
#define _CRUD_INTERFACE_H_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Data Structures */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
typedef struct CrudMsg__
|
||||
{
|
||||
wrp_msg_t *msg;
|
||||
struct CrudMsg__ *next;
|
||||
} CrudMsg;
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Function Prototypes */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
//void *CRUDHandlerTask();
|
||||
//void addCRUDmsgToQueue(wrp_msg_t *crudMsg);
|
||||
void addCRUDresponseToUpstreamQ(void *response_bytes, ssize_t response_size);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#endif /* _CRUD_INTERFACE_H_ */
|
||||
|
||||
1452
src/crud_internal.c
Normal file
1452
src/crud_internal.c
Normal file
File diff suppressed because it is too large
Load Diff
27
src/crud_internal.h
Normal file
27
src/crud_internal.h
Normal file
@@ -0,0 +1,27 @@
|
||||
/**
|
||||
* Copyright 2016 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
#include <wrp-c.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
int createObject( wrp_msg_t *reqMsg, wrp_msg_t **response );
|
||||
int retrieveObject( wrp_msg_t *reqMsg, wrp_msg_t **response);
|
||||
int updateObject( wrp_msg_t *reqMsg, wrp_msg_t **response);
|
||||
int deleteObject(wrp_msg_t *reqMsg, wrp_msg_t **response);
|
||||
|
||||
int writeToJSON(char *data);
|
||||
int readFromJSON(char **data);
|
||||
int retrieveFromMemory(char *keyName, cJSON **jsonresponse);
|
||||
109
src/crud_tasks.c
Normal file
109
src/crud_tasks.c
Normal file
@@ -0,0 +1,109 @@
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <cJSON.h>
|
||||
#include <wrp-c.h>
|
||||
#include "crud_tasks.h"
|
||||
#include "crud_internal.h"
|
||||
|
||||
|
||||
int processCrudRequest( wrp_msg_t *reqMsg, wrp_msg_t **responseMsg)
|
||||
{
|
||||
wrp_msg_t *resp_msg = NULL;
|
||||
int ret = -1;
|
||||
|
||||
resp_msg = ( wrp_msg_t *)malloc( sizeof( wrp_msg_t ) );
|
||||
memset(resp_msg, 0, sizeof(wrp_msg_t));
|
||||
|
||||
resp_msg->msg_type = reqMsg->msg_type;
|
||||
resp_msg->u.crud.transaction_uuid = strdup(reqMsg->u.crud.transaction_uuid);
|
||||
resp_msg->u.crud.source = strdup(reqMsg->u.crud.dest);
|
||||
resp_msg->u.crud.dest = strdup(reqMsg->u.crud.source);
|
||||
|
||||
switch( reqMsg->msg_type )
|
||||
{
|
||||
|
||||
case WRP_MSG_TYPE__CREATE:
|
||||
ParodusInfo( "CREATE request\n" );
|
||||
|
||||
ret = createObject( reqMsg, &resp_msg );
|
||||
|
||||
if(ret != 0)
|
||||
{
|
||||
ParodusError("Failed to create object in config JSON\n");
|
||||
|
||||
//WRP payload is NULL for failure cases
|
||||
resp_msg ->u.crud.payload = NULL;
|
||||
resp_msg ->u.crud.payload_size = 0;
|
||||
*responseMsg = resp_msg;
|
||||
return -1;
|
||||
}
|
||||
|
||||
*responseMsg = resp_msg;
|
||||
break;
|
||||
|
||||
case WRP_MSG_TYPE__RETREIVE:
|
||||
ParodusInfo( "RETREIVE request\n" );
|
||||
|
||||
ret = retrieveObject( reqMsg, &resp_msg );
|
||||
if(ret != 0)
|
||||
{
|
||||
ParodusError("Failed to retrieve object \n");
|
||||
|
||||
//WRP payload is NULL for failure cases
|
||||
resp_msg ->u.crud.payload = NULL;
|
||||
resp_msg ->u.crud.payload_size = 0;
|
||||
*responseMsg = resp_msg;
|
||||
return -1;
|
||||
}
|
||||
|
||||
*responseMsg = resp_msg;
|
||||
break;
|
||||
|
||||
case WRP_MSG_TYPE__UPDATE:
|
||||
ParodusInfo( "UPDATE request\n" );
|
||||
|
||||
ret = updateObject( reqMsg, &resp_msg );
|
||||
if(ret ==0)
|
||||
{
|
||||
//WRP payload is NULL for update requests
|
||||
resp_msg ->u.crud.payload = NULL;
|
||||
resp_msg ->u.crud.payload_size = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusError("Failed to update object \n");
|
||||
*responseMsg = resp_msg;
|
||||
return -1;
|
||||
}
|
||||
*responseMsg = resp_msg;
|
||||
break;
|
||||
|
||||
case WRP_MSG_TYPE__DELETE:
|
||||
ParodusInfo( "DELETE request\n" );
|
||||
|
||||
ret = deleteObject(reqMsg, &resp_msg );
|
||||
if(ret == 0)
|
||||
{
|
||||
//WRP payload is NULL for delete requests
|
||||
resp_msg ->u.crud.payload = NULL;
|
||||
resp_msg ->u.crud.payload_size = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusError("Failed to delete object \n");
|
||||
*responseMsg = resp_msg;
|
||||
return -1;
|
||||
}
|
||||
*responseMsg = resp_msg;
|
||||
break;
|
||||
|
||||
default:
|
||||
ParodusInfo( "Unknown msgType for CRUD request\n" );
|
||||
*responseMsg = resp_msg;
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
31
src/crud_tasks.h
Normal file
31
src/crud_tasks.h
Normal file
@@ -0,0 +1,31 @@
|
||||
/**
|
||||
* Copyright 2016 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#include <wrp-c.h>
|
||||
#include "ParodusInternal.h"
|
||||
|
||||
/**
|
||||
* @brief processCrudRequest function to process CRUD operations.
|
||||
*
|
||||
* @note processCrudRequest function allocates memory for response,
|
||||
* caller needs to free the response (resMsg) in both success and failure case.
|
||||
* @param[in] decoded request in wrp_msg_t structure format
|
||||
* @param[out] resulting wrp_msg_t structure as a response
|
||||
* @return 0 in success case and -1 in error case
|
||||
*/
|
||||
int processCrudRequest(wrp_msg_t * reqMsg, wrp_msg_t **resMsg);
|
||||
242
src/downstream.c
242
src/downstream.c
@@ -1,9 +1,24 @@
|
||||
/**
|
||||
* Copyright 2015 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* @file downstream.c
|
||||
*
|
||||
* @description This describes functions required to manage downstream messages.
|
||||
*
|
||||
* Copyright (c) 2015 Comcast
|
||||
*/
|
||||
|
||||
#include "downstream.h"
|
||||
@@ -11,6 +26,7 @@
|
||||
#include "connection.h"
|
||||
#include "partners_check.h"
|
||||
#include "ParodusInternal.h"
|
||||
#include "crud_interface.h"
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* External Functions */
|
||||
@@ -42,7 +58,7 @@ void listenerOnMessage(void * msg, size_t msgSize)
|
||||
|
||||
recivedMsg = (const char *) msg;
|
||||
|
||||
ParodusInfo("Received msg from server:%s\n", recivedMsg);
|
||||
ParodusInfo("Received msg from server\n");
|
||||
if(recivedMsg!=NULL)
|
||||
{
|
||||
/*** Decoding downstream recivedMsg to check destination ***/
|
||||
@@ -54,97 +70,177 @@ void listenerOnMessage(void * msg, size_t msgSize)
|
||||
msgType = message->msg_type;
|
||||
ParodusInfo("msgType received:%d\n", msgType);
|
||||
|
||||
if(message->msg_type == WRP_MSG_TYPE__AUTH)
|
||||
switch( message->msg_type )
|
||||
{
|
||||
ParodusInfo("Authorization Status received with Status code :%d\n", message->u.auth.status);
|
||||
}
|
||||
|
||||
if(message->msg_type == WRP_MSG_TYPE__REQ)
|
||||
{
|
||||
ParodusPrint("numOfClients registered is %d\n", get_numOfClients());
|
||||
int ret = validate_partner_id(message, NULL);
|
||||
if(ret < 0)
|
||||
case WRP_MSG_TYPE__AUTH:
|
||||
{
|
||||
response = cJSON_CreateObject();
|
||||
cJSON_AddNumberToObject(response, "statusCode", 430);
|
||||
cJSON_AddStringToObject(response, "message", "Invalid partner_id");
|
||||
ParodusInfo("Authorization Status received with Status code :%d\n", message->u.auth.status);
|
||||
break;
|
||||
}
|
||||
|
||||
if((message->u.req.dest !=NULL) && (ret >= 0))
|
||||
case WRP_MSG_TYPE__EVENT:
|
||||
case WRP_MSG_TYPE__REQ:
|
||||
case WRP_MSG_TYPE__CREATE:
|
||||
case WRP_MSG_TYPE__UPDATE:
|
||||
case WRP_MSG_TYPE__RETREIVE:
|
||||
case WRP_MSG_TYPE__DELETE:
|
||||
{
|
||||
destVal = message->u.req.dest;
|
||||
strtok(destVal , "/");
|
||||
parStrncpy(dest,strtok(NULL , "/"), sizeof(dest));
|
||||
ParodusInfo("Received downstream dest as :%s\n", dest);
|
||||
temp = get_global_node();
|
||||
//Checking for individual clients & Sending to each client
|
||||
|
||||
while (NULL != temp)
|
||||
ParodusPrint("numOfClients registered is %d\n", get_numOfClients());
|
||||
int ret = validate_partner_id(message, NULL);
|
||||
if(ret < 0)
|
||||
{
|
||||
ParodusPrint("node is pointing to temp->service_name %s \n",temp->service_name);
|
||||
// Sending message to registered clients
|
||||
if( strcmp(dest, temp->service_name) == 0)
|
||||
{
|
||||
ParodusPrint("sending to nanomsg client %s\n", dest);
|
||||
bytes = nn_send(temp->sock, recivedMsg, msgSize, 0);
|
||||
ParodusInfo("sent downstream message '%s' to reg_client '%s'\n",recivedMsg,temp->url);
|
||||
ParodusPrint("downstream bytes sent:%d\n", bytes);
|
||||
destFlag =1;
|
||||
break;
|
||||
}
|
||||
ParodusPrint("checking the next item in the list\n");
|
||||
temp= temp->next;
|
||||
}
|
||||
|
||||
//if any unknown dest received sending error response to server
|
||||
if(destFlag ==0)
|
||||
{
|
||||
ParodusError("Unknown dest:%s\n", dest);
|
||||
response = cJSON_CreateObject();
|
||||
cJSON_AddNumberToObject(response, "statusCode", 531);
|
||||
cJSON_AddStringToObject(response, "message", "Service Unavailable");
|
||||
}
|
||||
}
|
||||
cJSON_AddNumberToObject(response, "statusCode", 430);
|
||||
cJSON_AddStringToObject(response, "message", "Invalid partner_id");
|
||||
}
|
||||
|
||||
if(destFlag == 0 || ret < 0)
|
||||
{
|
||||
resp_msg = (wrp_msg_t *)malloc(sizeof(wrp_msg_t));
|
||||
memset(resp_msg, 0, sizeof(wrp_msg_t));
|
||||
|
||||
destVal = strdup(((WRP_MSG_TYPE__EVENT == msgType) ? message->u.event.dest :
|
||||
((WRP_MSG_TYPE__REQ == msgType) ? message->u.req.dest : message->u.crud.dest)));
|
||||
|
||||
resp_msg ->msg_type = msgType;
|
||||
resp_msg ->u.req.source = message->u.req.dest;
|
||||
resp_msg ->u.req.dest = message->u.req.source;
|
||||
resp_msg ->u.req.transaction_uuid=message->u.req.transaction_uuid;
|
||||
|
||||
if(response != NULL)
|
||||
if( (destVal != NULL) && (ret >= 0) )
|
||||
{
|
||||
str = cJSON_PrintUnformatted(response);
|
||||
ParodusInfo("Payload Response: %s\n", str);
|
||||
char *newDest = NULL;
|
||||
char *tempDest = strtok(destVal , "/");
|
||||
if(tempDest != NULL)
|
||||
{
|
||||
newDest = strtok(NULL , "/");
|
||||
}
|
||||
if(newDest != NULL)
|
||||
{
|
||||
parStrncpy(dest,newDest, sizeof(dest));
|
||||
}
|
||||
else
|
||||
{
|
||||
parStrncpy(dest,destVal, sizeof(dest));
|
||||
}
|
||||
ParodusInfo("Received downstream dest as :%s and transaction_uuid :%s\n", dest,
|
||||
((WRP_MSG_TYPE__REQ == msgType) ? message->u.req.transaction_uuid :
|
||||
((WRP_MSG_TYPE__EVENT == msgType) ? "NA" : message->u.crud.transaction_uuid)));
|
||||
|
||||
free(destVal);
|
||||
temp = get_global_node();
|
||||
//Checking for individual clients & Sending to each client
|
||||
|
||||
resp_msg ->u.req.payload = (void *)str;
|
||||
resp_msg ->u.req.payload_size = strlen(str);
|
||||
|
||||
ParodusPrint("msgpack encode\n");
|
||||
resp_size = wrp_struct_to( resp_msg, WRP_BYTES, &resp_bytes );
|
||||
if(resp_size > 0)
|
||||
while (NULL != temp)
|
||||
{
|
||||
size = (size_t) resp_size;
|
||||
sendUpstreamMsgToServer(&resp_bytes, size);
|
||||
ParodusPrint("node is pointing to temp->service_name %s \n",temp->service_name);
|
||||
// Sending message to registered clients
|
||||
if( strcmp(dest, temp->service_name) == 0)
|
||||
{
|
||||
ParodusPrint("sending to nanomsg client %s\n", dest);
|
||||
bytes = nn_send(temp->sock, recivedMsg, msgSize, 0);
|
||||
ParodusInfo("sent downstream message to reg_client '%s'\n",temp->url);
|
||||
ParodusPrint("downstream bytes sent:%d\n", bytes);
|
||||
destFlag =1;
|
||||
break;
|
||||
}
|
||||
ParodusPrint("checking the next item in the list\n");
|
||||
temp= temp->next;
|
||||
}
|
||||
|
||||
/* check Downstream dest for CRUD requests */
|
||||
if(destFlag ==0 && strcmp("parodus", dest)==0)
|
||||
{
|
||||
ParodusPrint("Received CRUD request : dest : %s\n", dest);
|
||||
if ((message->u.crud.source == NULL) || (message->u.crud.transaction_uuid == NULL))
|
||||
{
|
||||
ParodusError("Invalid request\n");
|
||||
response = cJSON_CreateObject();
|
||||
cJSON_AddNumberToObject(response, "statusCode", 400);
|
||||
cJSON_AddStringToObject(response, "message", "Invalid Request");
|
||||
ret = -1;
|
||||
}
|
||||
else
|
||||
{
|
||||
addCRUDmsgToQueue(message);
|
||||
}
|
||||
destFlag =1;
|
||||
}
|
||||
//if any unknown dest received sending error response to server
|
||||
if(destFlag ==0)
|
||||
{
|
||||
ParodusError("Unknown dest:%s\n", dest);
|
||||
response = cJSON_CreateObject();
|
||||
cJSON_AddNumberToObject(response, "statusCode", 531);
|
||||
cJSON_AddStringToObject(response, "message", "Service Unavailable");
|
||||
}
|
||||
free(str);
|
||||
cJSON_Delete(response);
|
||||
free(resp_bytes);
|
||||
resp_bytes = NULL;
|
||||
}
|
||||
free(resp_msg);
|
||||
|
||||
if( (WRP_MSG_TYPE__EVENT != msgType) &&
|
||||
((destFlag == 0) || (ret < 0)) )
|
||||
{
|
||||
resp_msg = (wrp_msg_t *)malloc(sizeof(wrp_msg_t));
|
||||
memset(resp_msg, 0, sizeof(wrp_msg_t));
|
||||
|
||||
resp_msg ->msg_type = msgType;
|
||||
if( WRP_MSG_TYPE__REQ == msgType )
|
||||
{
|
||||
resp_msg ->u.req.source = message->u.req.dest;
|
||||
resp_msg ->u.req.dest = message->u.req.source;
|
||||
resp_msg ->u.req.transaction_uuid=message->u.req.transaction_uuid;
|
||||
}
|
||||
else
|
||||
{
|
||||
resp_msg ->u.crud.source = message->u.crud.dest;
|
||||
if(message->u.crud.source !=NULL)
|
||||
{
|
||||
resp_msg ->u.crud.dest = message->u.crud.source;
|
||||
}
|
||||
else
|
||||
{
|
||||
resp_msg ->u.crud.dest = "unknown";
|
||||
}
|
||||
resp_msg ->u.crud.transaction_uuid = message->u.crud.transaction_uuid;
|
||||
resp_msg ->u.crud.path = message->u.crud.path;
|
||||
}
|
||||
|
||||
if(response != NULL)
|
||||
{
|
||||
str = cJSON_PrintUnformatted(response);
|
||||
ParodusInfo("Payload Response: %s\n", str);
|
||||
|
||||
if( WRP_MSG_TYPE__REQ == msgType )
|
||||
{
|
||||
resp_msg ->u.req.payload = (void *)str;
|
||||
resp_msg ->u.req.payload_size = strlen(str);
|
||||
}
|
||||
else
|
||||
{
|
||||
resp_msg ->u.crud.payload = (void *)str;
|
||||
resp_msg ->u.crud.payload_size = strlen(str);
|
||||
}
|
||||
|
||||
ParodusPrint("msgpack encode\n");
|
||||
resp_size = wrp_struct_to( resp_msg, WRP_BYTES, &resp_bytes );
|
||||
if(resp_size > 0)
|
||||
{
|
||||
size = (size_t) resp_size;
|
||||
sendUpstreamMsgToServer(&resp_bytes, size);
|
||||
}
|
||||
free(str);
|
||||
cJSON_Delete(response);
|
||||
free(resp_bytes);
|
||||
resp_bytes = NULL;
|
||||
}
|
||||
free(resp_msg);
|
||||
ParodusPrint("free for downstream decoded msg\n");
|
||||
wrp_free_struct(message);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case WRP_MSG_TYPE__SVC_REGISTRATION:
|
||||
case WRP_MSG_TYPE__SVC_ALIVE:
|
||||
case WRP_MSG_TYPE__UNKNOWN:
|
||||
default:
|
||||
wrp_free_struct(message);
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusError( "Failure in msgpack decoding for receivdMsg: rv is %d\n", rv );
|
||||
}
|
||||
ParodusPrint("free for downstream decoded msg\n");
|
||||
wrp_free_struct(message);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,9 +1,24 @@
|
||||
/**
|
||||
* Copyright 2015 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* @file downstream.h
|
||||
*
|
||||
* @description This header defines functions required to manage downstream messages.
|
||||
*
|
||||
* Copyright (c) 2015 Comcast
|
||||
*/
|
||||
|
||||
#ifndef _DOWNSTREAM_H_
|
||||
|
||||
56
src/heartBeat.c
Normal file
56
src/heartBeat.c
Normal file
@@ -0,0 +1,56 @@
|
||||
/**
|
||||
* Copyright 2018 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* @file heartBeat.c
|
||||
*
|
||||
* @description This decribes functions required to manage heartBeatTimer.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "heartBeat.h"
|
||||
|
||||
volatile unsigned int heartBeatTimer = 0;
|
||||
|
||||
pthread_mutex_t heartBeat_mut=PTHREAD_MUTEX_INITIALIZER;
|
||||
|
||||
// Get value of heartBeatTimer
|
||||
unsigned int get_heartBeatTimer()
|
||||
{
|
||||
unsigned int tmp = 0;
|
||||
pthread_mutex_lock (&heartBeat_mut);
|
||||
tmp = heartBeatTimer;
|
||||
pthread_mutex_unlock (&heartBeat_mut);
|
||||
return tmp;
|
||||
}
|
||||
|
||||
// Reset value of heartBeatTimer to 0
|
||||
void reset_heartBeatTimer()
|
||||
{
|
||||
pthread_mutex_lock (&heartBeat_mut);
|
||||
heartBeatTimer = 0;
|
||||
pthread_mutex_unlock (&heartBeat_mut);
|
||||
}
|
||||
|
||||
// Increment value of heartBeatTimer to desired value
|
||||
void increment_heartBeatTimer(unsigned int inc_time_ms)
|
||||
{
|
||||
pthread_mutex_lock (&heartBeat_mut);
|
||||
heartBeatTimer += inc_time_ms;
|
||||
pthread_mutex_unlock (&heartBeat_mut);
|
||||
}
|
||||
|
||||
|
||||
46
src/heartBeat.h
Normal file
46
src/heartBeat.h
Normal file
@@ -0,0 +1,46 @@
|
||||
/**
|
||||
* Copyright 2018 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* @file heartBeat.h
|
||||
*
|
||||
* @description This decribes functions required to manage heartBeatTimer.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _HEARBEAT_H_
|
||||
#define _HEARBEAT_H_
|
||||
|
||||
#include <pthread.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
// Get value of heartBeatTimer
|
||||
unsigned int get_heartBeatTimer();
|
||||
|
||||
// Reset value of heartBeatTimer to 0
|
||||
void reset_heartBeatTimer();
|
||||
|
||||
// Increment value of heartBeatTimer to desired value
|
||||
void increment_heartBeatTimer(unsigned int inc_time_ms);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
28
src/main.c
28
src/main.c
@@ -20,7 +20,11 @@
|
||||
#include "config.h"
|
||||
#include "conn_interface.h"
|
||||
#include "parodus_log.h"
|
||||
#ifdef INCLUDE_BREAKPAD
|
||||
#include "breakpad_wrapper.h"
|
||||
#else
|
||||
#include "signal.h"
|
||||
#endif
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Macros */
|
||||
@@ -40,13 +44,18 @@
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Function Prototypes */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
#ifndef INCLUDE_BREAKPAD
|
||||
static void sig_handler(int sig);
|
||||
#endif
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* External Functions */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
int main( int argc, char **argv)
|
||||
{
|
||||
#ifdef INCLUDE_BREAKPAD
|
||||
breakpad_ExceptionHandler();
|
||||
#else
|
||||
signal(SIGTERM, sig_handler);
|
||||
signal(SIGINT, sig_handler);
|
||||
signal(SIGUSR1, sig_handler);
|
||||
@@ -59,14 +68,21 @@ int main( int argc, char **argv)
|
||||
signal(SIGQUIT, sig_handler);
|
||||
signal(SIGHUP, sig_handler);
|
||||
signal(SIGALRM, sig_handler);
|
||||
|
||||
ParodusCfg parodusCfg;
|
||||
memset(&parodusCfg,0,sizeof(parodusCfg));
|
||||
#endif
|
||||
ParodusCfg *cfg;
|
||||
|
||||
/* TODO not ideal, but it fixes a more major problem for now. */
|
||||
cfg = get_parodus_cfg();
|
||||
memset(cfg,0,sizeof(ParodusCfg));
|
||||
|
||||
ParodusInfo("********** Starting component: Parodus **********\n ");
|
||||
parseCommandLine(argc,argv,&parodusCfg);
|
||||
setDefaultValuesToCfg(cfg);
|
||||
if (0 != parseCommandLine(argc,argv,cfg)) {
|
||||
abort();
|
||||
}
|
||||
getAuthToken(cfg);
|
||||
|
||||
createSocketConnection(&parodusCfg,NULL);
|
||||
createSocketConnection( NULL);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -79,6 +95,7 @@ const char *rdk_logger_module_fetch(void)
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Internal functions */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
#ifndef INCLUDE_BREAKPAD
|
||||
static void sig_handler(int sig)
|
||||
{
|
||||
|
||||
@@ -119,3 +136,4 @@ static void sig_handler(int sig)
|
||||
}
|
||||
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -1,14 +1,30 @@
|
||||
/**
|
||||
* Copyright 2015 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* @file nopoll_handlers.c
|
||||
*
|
||||
* @description This describes nopoll handler functions.
|
||||
*
|
||||
* Copyright (c) 2015 Comcast
|
||||
*/
|
||||
|
||||
#include "ParodusInternal.h"
|
||||
#include "nopoll_handlers.h"
|
||||
#include "connection.h"
|
||||
#include "heartBeat.h"
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Macros */
|
||||
@@ -21,6 +37,7 @@
|
||||
pthread_mutex_t g_mutex=PTHREAD_MUTEX_INITIALIZER;
|
||||
pthread_cond_t g_cond=PTHREAD_COND_INITIALIZER;
|
||||
ParodusMsg *ParodusMsgQ = NULL;
|
||||
noPollMsg * previous_msg = NULL;
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* External Functions */
|
||||
@@ -39,18 +56,43 @@ void listenerOnMessage_queue(noPollCtx * ctx, noPollConn * conn, noPollMsg * msg
|
||||
UNUSED(ctx);
|
||||
UNUSED(conn);
|
||||
UNUSED(user_data);
|
||||
noPollMsg * aux;
|
||||
|
||||
if (nopoll_msg_is_fragment (msg))
|
||||
{
|
||||
ParodusInfo("Found fragment, FIN = %d \n", nopoll_msg_is_final (msg));
|
||||
aux = previous_msg;
|
||||
previous_msg = nopoll_msg_join (previous_msg, msg);
|
||||
nopoll_msg_unref (aux);
|
||||
|
||||
if (! nopoll_msg_is_final (msg)) {
|
||||
ParodusInfo ("Found fragment that is not final..\n");
|
||||
return;
|
||||
}
|
||||
ParodusInfo("Found final fragment *** \n");
|
||||
}
|
||||
|
||||
ParodusMsg *message;
|
||||
message = (ParodusMsg *)malloc(sizeof(ParodusMsg));
|
||||
|
||||
if(message)
|
||||
{
|
||||
message->msg = msg;
|
||||
message->payload = (void *)nopoll_msg_get_payload (msg);
|
||||
message->len = nopoll_msg_get_payload_size (msg);
|
||||
message->next = NULL;
|
||||
if(previous_msg)
|
||||
{
|
||||
message->msg = previous_msg;
|
||||
message->payload = (void *)nopoll_msg_get_payload (previous_msg);
|
||||
message->len = nopoll_msg_get_payload_size (previous_msg);
|
||||
message->next = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
message->msg = msg;
|
||||
message->payload = (void *)nopoll_msg_get_payload (msg);
|
||||
message->len = nopoll_msg_get_payload_size (msg);
|
||||
message->next = NULL;
|
||||
|
||||
nopoll_msg_ref(msg);
|
||||
}
|
||||
|
||||
pthread_mutex_lock (&g_mutex);
|
||||
ParodusPrint("mutex lock in producer thread\n");
|
||||
@@ -79,6 +121,7 @@ void listenerOnMessage_queue(noPollCtx * ctx, noPollConn * conn, noPollMsg * msg
|
||||
//Memory allocation failed
|
||||
ParodusError("Memory allocation is failed\n");
|
||||
}
|
||||
previous_msg = NULL;
|
||||
ParodusPrint("*****Returned from listenerOnMessage_queue*****\n");
|
||||
}
|
||||
|
||||
@@ -94,6 +137,7 @@ void listenerOnPingMessage (noPollCtx * ctx, noPollConn * conn, noPollMsg * msg,
|
||||
{
|
||||
UNUSED(ctx);
|
||||
UNUSED(user_data);
|
||||
UNUSED(conn);
|
||||
|
||||
noPollPtr payload = NULL;
|
||||
payload = (noPollPtr ) nopoll_msg_get_payload(msg);
|
||||
@@ -103,9 +147,7 @@ void listenerOnPingMessage (noPollCtx * ctx, noPollConn * conn, noPollMsg * msg,
|
||||
ParodusInfo("Ping received with payload %s, opcode %d\n",(char *)payload, nopoll_msg_opcode(msg));
|
||||
if (nopoll_msg_opcode(msg) == NOPOLL_PING_FRAME)
|
||||
{
|
||||
nopoll_conn_send_frame (conn, nopoll_true, nopoll_true, NOPOLL_PONG_FRAME, strlen(payload), payload, 0);
|
||||
heartBeatTimer = 0;
|
||||
ParodusPrint("Sent Pong frame and reset HeartBeat Timer\n");
|
||||
reset_heartBeatTimer();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -114,16 +156,20 @@ void listenerOnCloseMessage (noPollCtx * ctx, noPollConn * conn, noPollPtr user_
|
||||
{
|
||||
UNUSED(ctx);
|
||||
UNUSED(conn);
|
||||
UNUSED(user_data);
|
||||
int closeStatus;
|
||||
char * defaultReason = "SSL_Socket_Close";
|
||||
|
||||
ParodusPrint("listenerOnCloseMessage(): mutex lock in producer thread\n");
|
||||
|
||||
if((user_data != NULL) && (strstr(user_data, "SSL_Socket_Close") != NULL) && !LastReasonStatus)
|
||||
closeStatus = nopoll_conn_get_close_status (conn);
|
||||
if( closeStatus == 1006 && !get_global_reconnect_status())
|
||||
{
|
||||
ParodusInfo("Reconnect detected, setting Reconnect reason as Server close\n");
|
||||
set_global_reconnect_reason("Server_closed_connection");
|
||||
LastReasonStatus = true;
|
||||
ParodusInfo("Reconnect detected, setting default Reconnect reason %s\n",defaultReason);
|
||||
set_global_reconnect_reason(defaultReason);
|
||||
set_global_reconnect_status(true);
|
||||
}
|
||||
else if ((user_data == NULL) && !LastReasonStatus)
|
||||
else if(!get_global_reconnect_status())
|
||||
{
|
||||
ParodusInfo("Reconnect detected, setting Reconnect reason as Unknown\n");
|
||||
set_global_reconnect_reason("Unknown");
|
||||
|
||||
@@ -1,9 +1,24 @@
|
||||
/**
|
||||
* Copyright 2015 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* @file nopoll_handlers.h
|
||||
*
|
||||
* @description This header defines nopoll handler functions.
|
||||
*
|
||||
* Copyright (c) 2015 Comcast
|
||||
*/
|
||||
|
||||
#ifndef _NOPOLL_HANDLERS_H_
|
||||
@@ -22,7 +37,6 @@ extern "C" {
|
||||
extern pthread_mutex_t g_mutex;
|
||||
extern pthread_cond_t g_cond;
|
||||
extern pthread_mutex_t close_mut;
|
||||
extern volatile unsigned int heartBeatTimer;
|
||||
extern bool close_retry;
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
@@ -1,15 +1,31 @@
|
||||
/**
|
||||
* Copyright 2015 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* @file nopoll_helpers.c
|
||||
*
|
||||
* @description This file is used to manage incomming and outgoing messages.
|
||||
*
|
||||
* Copyright (c) 2015 Comcast
|
||||
*/
|
||||
|
||||
#include "ParodusInternal.h"
|
||||
#include "connection.h"
|
||||
#include "nopoll_helpers.h"
|
||||
#include "nopoll_handlers.h"
|
||||
#include "time.h"
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Macros */
|
||||
@@ -18,6 +34,10 @@
|
||||
#define MAX_SEND_SIZE (60 * 1024)
|
||||
#define FLUSH_WAIT_TIME (2000000LL)
|
||||
|
||||
struct timespec connStuck_start,connStuck_end;
|
||||
struct timespec *connStuck_startPtr = &connStuck_start;
|
||||
struct timespec *connStuck_endPtr = &connStuck_end;
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* External functions */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
@@ -34,8 +54,11 @@ void setMessageHandlers()
|
||||
void sendMessage(noPollConn *conn, void *msg, size_t len)
|
||||
{
|
||||
int bytesWritten = 0;
|
||||
static int connErr=0;
|
||||
long timeDiff = 0;
|
||||
|
||||
ParodusInfo("sendMessage length %zu\n", len);
|
||||
|
||||
if(nopoll_conn_is_ok(conn) && nopoll_conn_is_ready(conn))
|
||||
{
|
||||
//bytesWritten = nopoll_conn_send_binary(conn, msg, len);
|
||||
@@ -45,10 +68,30 @@ void sendMessage(noPollConn *conn, void *msg, size_t len)
|
||||
{
|
||||
ParodusError("Failed to send bytes %zu, bytes written were=%d (errno=%d, %s)..\n", len, bytesWritten, errno, strerror(errno));
|
||||
}
|
||||
connErr = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusError("Failed to send msg upstream as connection is not OK\n");
|
||||
ParodusError("Failed to send msg upstream as connection is not OK\n");
|
||||
if (connErr == 0)
|
||||
{
|
||||
getCurrentTime(connStuck_startPtr);
|
||||
ParodusInfo("Conn got stuck, initialized the first timer\n");
|
||||
connErr = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
getCurrentTime(connStuck_endPtr);
|
||||
timeDiff = timeValDiff(connStuck_startPtr, connStuck_endPtr);
|
||||
ParodusPrint("checking timeout difference:%ld\n", timeDiff);
|
||||
|
||||
if( timeDiff >= (10*60*1000))
|
||||
{
|
||||
ParodusError("conn got stuck for over 10 minutes; crashing service.\n");
|
||||
kill(getpid(),SIGTERM);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,9 +1,24 @@
|
||||
/**
|
||||
* Copyright 2015 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* @file nopoll_handlers.h
|
||||
*
|
||||
* @description This header defines functions to manage incomming and outgoing messages.
|
||||
*
|
||||
* Copyright (c) 2015 Comcast
|
||||
*/
|
||||
|
||||
#ifndef _NOPOLL_HELPERS_H_
|
||||
|
||||
@@ -1,9 +1,24 @@
|
||||
/**
|
||||
* Copyright 2015 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* @file parodus_log.h
|
||||
*
|
||||
* @description This header defines parodus log levels
|
||||
*
|
||||
* Copyright (c) 2015 Comcast
|
||||
*/
|
||||
|
||||
#include <stdarg.h>
|
||||
|
||||
@@ -1,9 +1,24 @@
|
||||
/**
|
||||
* Copyright 2015 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* @file partners_check.c
|
||||
*
|
||||
* @description This describes functions to validate partner_id.
|
||||
*
|
||||
* Copyright (c) 2015 Comcast
|
||||
*/
|
||||
|
||||
#include "ParodusInternal.h"
|
||||
@@ -53,7 +68,7 @@ int validate_partner_id(wrp_msg_t *msg, partners_t **partnerIds)
|
||||
|
||||
if(matchFlag != 1)
|
||||
{
|
||||
(*partnerIds) = (partners_t *) malloc(sizeof(partners_t));
|
||||
(*partnerIds) = (partners_t *) malloc(sizeof(partners_t) + (sizeof(char *) * (count+1)));
|
||||
(*partnerIds)->count = count+1;
|
||||
for(i = 0; i < count; i++)
|
||||
{
|
||||
@@ -61,17 +76,17 @@ int validate_partner_id(wrp_msg_t *msg, partners_t **partnerIds)
|
||||
ParodusPrint("(*partnerIds)->partner_ids[%d] : %s\n",i,(*partnerIds)->partner_ids[i]);
|
||||
}
|
||||
(*partnerIds)->partner_ids[count] = (char *) malloc(sizeof(char) * 64);
|
||||
strcpy((*partnerIds)->partner_ids[count], partnerId);
|
||||
parStrncpy((*partnerIds)->partner_ids[count], partnerId, 64);
|
||||
ParodusPrint("(*partnerIds)->partner_ids[%d] : %s\n",count,(*partnerIds)->partner_ids[count]);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusPrint("partner_ids list is NULL\n");
|
||||
(*partnerIds) = (partners_t *) malloc(sizeof(partners_t));
|
||||
(*partnerIds) = (partners_t *) malloc(sizeof(partners_t) + (sizeof(char *) * 1));
|
||||
(*partnerIds)->count = 1;
|
||||
(*partnerIds)->partner_ids[0] = (char *) malloc(sizeof(char) * 64);
|
||||
strcpy((*partnerIds)->partner_ids[0], partnerId);
|
||||
parStrncpy((*partnerIds)->partner_ids[0], partnerId, 64);
|
||||
ParodusPrint("(*partnerIds)->partner_ids[0] : %s\n",(*partnerIds)->partner_ids[0]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,9 +1,24 @@
|
||||
/**
|
||||
* Copyright 2015 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* @file partners_check.h
|
||||
*
|
||||
* @description This describes functions to validate partner_id.
|
||||
*
|
||||
* Copyright (c) 2015 Comcast
|
||||
*/
|
||||
|
||||
#ifndef _PARTNERS_CHECK_H_
|
||||
|
||||
@@ -1,9 +1,24 @@
|
||||
/**
|
||||
* Copyright 2015 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* @file service_alive.c
|
||||
*
|
||||
* @description This file is used to manage keep alive section
|
||||
*
|
||||
* Copyright (c) 2015 Comcast
|
||||
*/
|
||||
|
||||
#include "ParodusInternal.h"
|
||||
|
||||
@@ -1,9 +1,24 @@
|
||||
/**
|
||||
* Copyright 2015 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* @file service_alive.h
|
||||
*
|
||||
* @description This file is used to manage keep alive section
|
||||
*
|
||||
* Copyright (c) 2015 Comcast
|
||||
*/
|
||||
|
||||
#ifndef _SERVICE_ALIVE_H_
|
||||
|
||||
81
src/seshat_interface.c
Normal file
81
src/seshat_interface.c
Normal file
@@ -0,0 +1,81 @@
|
||||
/**
|
||||
* Copyright 2015 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* @file seshat_interface.c
|
||||
*
|
||||
* @description This decribes interface to register seshat service.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "seshat_interface.h"
|
||||
#include "ParodusInternal.h"
|
||||
#include "config.h"
|
||||
#include <libseshat.h>
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Macros */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
#define SESHAT_SERVICE_NAME "Parodus"
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* File Scoped Variables */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Function Prototypes */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Internal Functions */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* External functions */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
bool __registerWithSeshat()
|
||||
{
|
||||
char *seshat_url = get_parodus_cfg()->seshat_url;
|
||||
char *parodus_url = get_parodus_cfg()->local_url;
|
||||
char *discover_url = NULL;
|
||||
bool rv = false;
|
||||
|
||||
if( 0 == init_lib_seshat(seshat_url) ) {
|
||||
ParodusInfo("seshatlib initialized! (url %s)\n", seshat_url);
|
||||
|
||||
if( 0 == seshat_register(SESHAT_SERVICE_NAME, parodus_url) ) {
|
||||
ParodusInfo("seshatlib registered! (url %s)\n", parodus_url);
|
||||
|
||||
discover_url = seshat_discover(SESHAT_SERVICE_NAME);
|
||||
if( (NULL != discover_url) && (0 == strcmp(parodus_url, discover_url)) ) {
|
||||
ParodusInfo("seshatlib discovered url = %s\n", discover_url);
|
||||
rv = true;
|
||||
} else {
|
||||
ParodusError("seshatlib registration error (url %s)!", discover_url);
|
||||
}
|
||||
free(discover_url);
|
||||
} else {
|
||||
ParodusError("seshatlib not registered! (url %s)\n", parodus_url);
|
||||
}
|
||||
} else {
|
||||
ParodusPrint("seshatlib not initialized! (url %s)\n", seshat_url);
|
||||
}
|
||||
|
||||
shutdown_seshat_lib();
|
||||
return rv;
|
||||
}
|
||||
54
src/seshat_interface.h
Normal file
54
src/seshat_interface.h
Normal file
@@ -0,0 +1,54 @@
|
||||
/**
|
||||
* Copyright 2015 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* @file seshat_interface.h
|
||||
*
|
||||
* @description This header defines interface to register seshat service.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _SESHAT_INTERFACE_H_
|
||||
#define _SESHAT_INTERFACE_H_
|
||||
|
||||
#include <stdbool.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* File Scoped Variables */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Function Prototypes */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
/**
|
||||
* @brief Helper function to register with seshat.
|
||||
*
|
||||
* @note return whether successfully registered.
|
||||
*
|
||||
* @return true when registered, false otherwise.
|
||||
*/
|
||||
bool __registerWithSeshat();
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
53
src/seshat_interface_stub.c
Normal file
53
src/seshat_interface_stub.c
Normal file
@@ -0,0 +1,53 @@
|
||||
/**
|
||||
* Copyright 2015 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* @file seshat_interface_stub.c
|
||||
*
|
||||
* @description This decribes interface to register seshat service
|
||||
*
|
||||
*/
|
||||
|
||||
#include "seshat_interface.h"
|
||||
#include "ParodusInternal.h"
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Macros */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* File Scoped Variables */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Function Prototypes */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Internal Functions */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* External functions */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
bool __registerWithSeshat()
|
||||
{
|
||||
ParodusInfo("libseshat disabled, Hence proceeding without registration\n");
|
||||
return true;
|
||||
}
|
||||
@@ -1,9 +1,24 @@
|
||||
/**
|
||||
* Copyright 2015 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* @file spin_thread.c
|
||||
*
|
||||
* @description This file is used to define thread function
|
||||
*
|
||||
* Copyright (c) 2015 Comcast
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
@@ -29,7 +44,7 @@ void StartThread(void *(*start_routine) (void *))
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusPrint("Thread created Successfully %d\n", (int ) threadId);
|
||||
ParodusPrint("Thread created Successfully %lu\n", (unsigned long) threadId);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,9 +1,24 @@
|
||||
/**
|
||||
* Copyright 2015 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* @file spin_thread.h
|
||||
*
|
||||
* @description This file is used to define thread function
|
||||
*
|
||||
* Copyright (c) 2015 Comcast
|
||||
*/
|
||||
|
||||
#ifndef _SPIN_THREAD_H_
|
||||
|
||||
@@ -1,9 +1,24 @@
|
||||
/**
|
||||
* Copyright 2015 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* @file thread_tasks.h
|
||||
*
|
||||
* @description This header defines thread functions.
|
||||
*
|
||||
* Copyright (c) 2015 Comcast
|
||||
*/
|
||||
|
||||
#ifndef _THREAD_TASKS_H_
|
||||
|
||||
548
src/token.c
Normal file
548
src/token.c
Normal file
@@ -0,0 +1,548 @@
|
||||
/**
|
||||
* Copyright 2015 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* @file token.c
|
||||
*
|
||||
* @description This file contains operations for using jwt token.
|
||||
*
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdbool.h>
|
||||
#include <unistd.h>
|
||||
#include <netinet/in.h>
|
||||
#ifdef FEATURE_DNS_QUERY
|
||||
#include <ucresolv.h>
|
||||
#endif
|
||||
//#include <res_update.h>
|
||||
#include <netdb.h>
|
||||
#include <strings.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <assert.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/param.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <arpa/nameser.h>
|
||||
#include <ctype.h>
|
||||
#include <errno.h>
|
||||
#include <time.h>
|
||||
|
||||
#include <cjwt/cjwt.h>
|
||||
#include "token.h"
|
||||
#include "config.h"
|
||||
#include "parodus_log.h"
|
||||
#include "ParodusInternal.h"
|
||||
|
||||
#define JWT_MAXBUF 8192
|
||||
|
||||
#ifdef NS_MAXMSG
|
||||
#if NS_MAXMSG > JWT_MAXBUF
|
||||
#define NS_MAXBUF JWT_MAXBUF
|
||||
#else
|
||||
#define NS_MAXBUF NS_MAXMSG
|
||||
#endif
|
||||
#else
|
||||
#define NS_MAXBUF JWT_MAXBUF
|
||||
#endif
|
||||
|
||||
#define TXT_REC_ID_MAXSIZE 128
|
||||
|
||||
#define MAX_RR_RECS 10
|
||||
#define SEQ_TABLE_SIZE (MAX_RR_RECS + 1)
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Macros */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
#define ENDPOINT_NAME "endpoint"
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* File Scoped Variables */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* none */
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Function Prototypes */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* none */
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* External Functions */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
#ifdef FEATURE_DNS_QUERY
|
||||
|
||||
extern int __res_ninit(res_state statp);
|
||||
extern void __res_nclose(res_state statp);
|
||||
extern int __res_nquery(res_state statp,
|
||||
const char *name, /* domain name */
|
||||
int class, int type, /* class and type of query */
|
||||
u_char *answer, /* buffer to put answer */
|
||||
int anslen); /* size of answer buffer */
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Internal functions */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
|
||||
static void show_times (time_t exp_time, time_t cur_time)
|
||||
{
|
||||
char exp_buf[30];
|
||||
char cur_buf[30];
|
||||
ctime_r (&exp_time, exp_buf);
|
||||
exp_buf[strlen(exp_buf)-1] = 0;
|
||||
ctime_r (&cur_time, cur_buf);
|
||||
cur_buf[strlen(cur_buf)-1] = 0;
|
||||
ParodusInfo ("Exp: %d %s, Current: %d %s\n",
|
||||
(int)exp_time, exp_buf+4, (int)cur_time, cur_buf+4);
|
||||
}
|
||||
|
||||
// returns 1 if insecure, 0 if secure, < 0 if error
|
||||
int analyze_jwt (const cjwt_t *jwt, char *url_buf, int url_buflen,
|
||||
char *port_buf, int port_buflen)
|
||||
{
|
||||
cJSON *claims = jwt->private_claims;
|
||||
cJSON *endpoint = NULL;
|
||||
time_t exp_time, cur_time;
|
||||
int http_match;
|
||||
|
||||
if (!claims) {
|
||||
ParodusError ("Private claims not found in jwt\n");
|
||||
return TOKEN_ERR_INVALID_JWT_CONTENT;
|
||||
}
|
||||
|
||||
endpoint = cJSON_GetObjectItem(claims, ENDPOINT_NAME);
|
||||
if (!endpoint) {
|
||||
ParodusError ("Endpoint claim not found in jwt\n");
|
||||
return TOKEN_ERR_INVALID_JWT_CONTENT;
|
||||
}
|
||||
|
||||
ParodusInfo ("JWT endpoint: %s\n", endpoint->valuestring);
|
||||
exp_time = jwt->exp.tv_sec;
|
||||
if (0 == exp_time) {
|
||||
ParodusError ("exp not found in JWT payload\n");
|
||||
return TOKEN_ERR_NO_EXPIRATION;
|
||||
} else {
|
||||
cur_time = time(NULL);
|
||||
show_times (exp_time, cur_time);
|
||||
if (exp_time < cur_time) {
|
||||
ParodusError ("JWT has expired\n");
|
||||
return TOKEN_ERR_JWT_EXPIRED;
|
||||
}
|
||||
}
|
||||
http_match = parse_webpa_url (endpoint->valuestring,
|
||||
url_buf, url_buflen, port_buf, port_buflen);
|
||||
if (http_match < 0) {
|
||||
ParodusError ("Invalid endpoint claim in JWT\n");
|
||||
return TOKEN_ERR_BAD_ENDPOINT;
|
||||
}
|
||||
ParodusInfo ("JWT is_http strncmp: %d\n", http_match);
|
||||
|
||||
return http_match;
|
||||
}
|
||||
|
||||
bool validate_algo(const cjwt_t *jwt)
|
||||
{
|
||||
// return true if jwt->header.alg is included in the set
|
||||
// of allowed algorithms specified by cfg->jwt_algo
|
||||
ParodusCfg *cfg = get_parodus_cfg();
|
||||
int alg = jwt->header.alg;
|
||||
int alg_mask;
|
||||
|
||||
if ((alg < 0) || (alg >= num_algorithms))
|
||||
return false;
|
||||
alg_mask = 1<<alg;
|
||||
if ((alg_mask & cfg->jwt_algo) == 0) {
|
||||
ParodusError ("Algorithm %d not allowed (mask %d)\n", alg, alg_mask);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
int nquery(const char* dns_txt_record_id, u_char *nsbuf)
|
||||
{
|
||||
|
||||
int len;
|
||||
struct __res_state statp;
|
||||
|
||||
/* Initialize resolver */
|
||||
memset (&statp, 0, sizeof(__res_state));
|
||||
if (NULL == nsbuf) {
|
||||
ParodusError ("nquery: nsbuf is NULL\n");
|
||||
return (-1);
|
||||
}
|
||||
statp.options = RES_DEBUG;
|
||||
if (__res_ninit(&statp) < 0) {
|
||||
ParodusError ("res_ninit error: can't initialize statp.\n");
|
||||
return (-1);
|
||||
}
|
||||
|
||||
ParodusInfo ("nquery: domain : %s\n", dns_txt_record_id);
|
||||
memset (nsbuf, 0, NS_MAXBUF);
|
||||
len = __res_nquery(&statp, dns_txt_record_id, ns_c_in, ns_t_txt, nsbuf, NS_MAXBUF);
|
||||
if (len < 0) {
|
||||
if (0 != statp.res_h_errno) {
|
||||
const char *msg = hstrerror (statp.res_h_errno);
|
||||
ParodusError ("Error in res_nquery: %s\n", msg);
|
||||
}
|
||||
return len;
|
||||
}
|
||||
__res_nclose (&statp);
|
||||
ParodusInfo ("nquery: nsbuf (1) 0x%lx\n", (unsigned long) nsbuf);
|
||||
if (len >= NS_MAXBUF) {
|
||||
ParodusError ("res_nquery error: ns buffer too small.\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
return len;
|
||||
|
||||
}
|
||||
|
||||
bool valid_b64_char (char c)
|
||||
{
|
||||
if ((c>='A') && (c<='Z'))
|
||||
return true;
|
||||
if ((c>='a') && (c<='z'))
|
||||
return true;
|
||||
if ((c>='0') && (c<='9'))
|
||||
return true;
|
||||
if ((c=='/') || (c=='+') || (c=='-') || (c=='_'))
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool is_digit (char c)
|
||||
{
|
||||
return (bool) ((c>='0') && (c<='9'));
|
||||
}
|
||||
|
||||
// strip quotes and newlines from rr rec
|
||||
const char *strip_rr_data (const char *rr_ptr, int *rrlen)
|
||||
{
|
||||
int len = *rrlen;
|
||||
const char *optr = rr_ptr;
|
||||
char c;
|
||||
|
||||
if (len > 0) {
|
||||
c = optr[0];
|
||||
if (!is_digit(c)) {
|
||||
optr++;
|
||||
len--;
|
||||
}
|
||||
}
|
||||
if (len > 0) {
|
||||
if (!valid_b64_char (optr[len-1]))
|
||||
len--;
|
||||
}
|
||||
if (len > 0) {
|
||||
if (!valid_b64_char (optr[len-1]))
|
||||
len--;
|
||||
}
|
||||
*rrlen = len;
|
||||
return optr;
|
||||
}
|
||||
|
||||
// return offset to seq number in record
|
||||
// return -1 if not found, -2 if invalid fmt
|
||||
int find_seq_num (const char *rr_ptr, int rrlen)
|
||||
{
|
||||
char c;
|
||||
int i;
|
||||
int digit_ct = 0;
|
||||
|
||||
for (i=0; i<rrlen; i++)
|
||||
{
|
||||
c = rr_ptr[i];
|
||||
if (c == ':') {
|
||||
if (digit_ct >= 2)
|
||||
return i - 2;
|
||||
else
|
||||
return -2;
|
||||
}
|
||||
if (is_digit (c))
|
||||
digit_ct++;
|
||||
else
|
||||
digit_ct = 0;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
// get seq num in rr rec
|
||||
// return -1 if not formatted correctly
|
||||
int get_rr_seq_num (const char *rr_ptr, int rrlen)
|
||||
{
|
||||
char c;
|
||||
int lo, hi;
|
||||
if (rrlen < 3)
|
||||
return -1;
|
||||
if (rr_ptr[2] != ':')
|
||||
return -1;
|
||||
c = rr_ptr[0];
|
||||
if (is_digit (c))
|
||||
hi = c - '0';
|
||||
else
|
||||
return -1;
|
||||
c = rr_ptr[1];
|
||||
if (is_digit (c))
|
||||
lo = c - '0';
|
||||
else
|
||||
return -1;
|
||||
return (10*hi) + lo;
|
||||
}
|
||||
|
||||
// scan rr recs and build seq table using seq numbers in the recs
|
||||
// return num_txt_recs
|
||||
int get_rr_seq_table (ns_msg *msg_handle, int num_rr_recs, rr_rec_t *seq_table)
|
||||
{
|
||||
ns_rr rr;
|
||||
const char *rr_ptr;
|
||||
int seq_pos;
|
||||
int rrlen;
|
||||
int i, ret, seq_num;
|
||||
int num_txt_recs = 0;
|
||||
|
||||
if (num_rr_recs > MAX_RR_RECS) {
|
||||
ParodusError ("num rr recs (%d) to big, > %d\n", num_rr_recs, MAX_RR_RECS);
|
||||
return -1;
|
||||
}
|
||||
// clear seq table
|
||||
for (i=0; i<SEQ_TABLE_SIZE; i++)
|
||||
{
|
||||
seq_table[i].rr_ptr = NULL;
|
||||
seq_table[i].rr_len = 0;
|
||||
}
|
||||
|
||||
// extract and concatenate all the records in rr
|
||||
for (i=0; i<num_rr_recs; i++) {
|
||||
ret = ns_parserr(msg_handle, ns_s_an, i, &rr);
|
||||
if (ret != 0) {
|
||||
ParodusError ("query_dns: ns_parserr failed: %s\n", strerror (errno));
|
||||
return ret;
|
||||
}
|
||||
if (ns_rr_type(rr) != ns_t_txt)
|
||||
continue;
|
||||
++num_txt_recs;
|
||||
rr_ptr = (const char *)ns_rr_rdata(rr);
|
||||
rrlen = ns_rr_rdlen(rr);
|
||||
ParodusPrint ("Found rr rec type %d: %s\n", ns_t_txt, rr_ptr);
|
||||
rr_ptr = strip_rr_data (rr_ptr, &rrlen);
|
||||
seq_pos = find_seq_num (rr_ptr, rrlen);
|
||||
if (seq_pos == -2) {
|
||||
ParodusError ("Invalid seq number in rr record %d\n", i);
|
||||
return -1;
|
||||
}
|
||||
if (seq_pos < 0) {
|
||||
seq_num = 0;
|
||||
} else {
|
||||
rr_ptr += seq_pos;
|
||||
rrlen -= seq_pos;
|
||||
seq_num = get_rr_seq_num (rr_ptr, rrlen);
|
||||
}
|
||||
ParodusPrint ("Found seq num %d in rr rec %d\n", seq_num, i);
|
||||
|
||||
if (seq_num < 0) {
|
||||
ParodusError ("Seq number not found in rr record %d\n", i);
|
||||
return -1;
|
||||
}
|
||||
if (seq_num > num_rr_recs) {
|
||||
ParodusError ("Invalid seq number (too big) in rr record %d\n", i);
|
||||
return -1;
|
||||
}
|
||||
if (NULL != seq_table[seq_num].rr_ptr) {
|
||||
ParodusError ("Duplicate rr record number %d\n", seq_num);
|
||||
return -1;
|
||||
}
|
||||
if (seq_num != 0) {
|
||||
rr_ptr += 3; // skip the seq number
|
||||
rrlen -= 3;
|
||||
}
|
||||
seq_table[seq_num].rr_ptr = rr_ptr;
|
||||
seq_table[seq_num].rr_len = rrlen;
|
||||
}
|
||||
|
||||
if (NULL != seq_table[0].rr_ptr) {
|
||||
// sequence-less record should not be used when there
|
||||
// are multiple records
|
||||
if (num_txt_recs > 1) {
|
||||
ParodusError ("Seq number not found in rr record\n");
|
||||
return -1;
|
||||
}
|
||||
// when there is only one record, use the sequence-less record
|
||||
seq_table[1].rr_ptr = seq_table[0].rr_ptr;
|
||||
seq_table[1].rr_len = seq_table[0].rr_len;
|
||||
}
|
||||
|
||||
// check if we got them all
|
||||
for (i=1; i<num_txt_recs; i++) {
|
||||
if (NULL == seq_table[i].rr_ptr) {
|
||||
ParodusError ("Missing rr record number %d\n", i+1);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
return num_txt_recs;
|
||||
}
|
||||
|
||||
int assemble_jwt_from_dns (ns_msg *msg_handle, int num_rr_recs, char *jwt_ans)
|
||||
{
|
||||
// slot 0 in the seq table is for the sequence-less record that
|
||||
// you get when there is only one record.
|
||||
rr_rec_t seq_table[SEQ_TABLE_SIZE];
|
||||
int i;
|
||||
int num_txt_recs = get_rr_seq_table (msg_handle, num_rr_recs, seq_table);
|
||||
|
||||
if (num_txt_recs < 0)
|
||||
return num_txt_recs;
|
||||
ParodusPrint ("Found %d TXT records\n", num_txt_recs);
|
||||
jwt_ans[0] = 0;
|
||||
for (i=1; i<=num_txt_recs; i++)
|
||||
strncat (jwt_ans, seq_table[i].rr_ptr, seq_table[i].rr_len);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int query_dns(const char* dns_txt_record_id,char *jwt_ans)
|
||||
{
|
||||
u_char *nsbuf;
|
||||
ns_msg msg_handle;
|
||||
int ret;
|
||||
int l = -1;
|
||||
|
||||
if( !dns_txt_record_id || !jwt_ans )
|
||||
return l;
|
||||
|
||||
nsbuf = (u_char *) malloc (NS_MAXBUF);
|
||||
ParodusInfo ("nsbuf (1) 0x%lx\n", (unsigned long) nsbuf);
|
||||
if (NULL == nsbuf) {
|
||||
ParodusError ("Unable to allocate nsbuf in query_dns\n");
|
||||
return TOKEN_ERR_MEMORY_FAIL;
|
||||
}
|
||||
|
||||
l = nquery(dns_txt_record_id,nsbuf);
|
||||
if (l < 0) {
|
||||
ParodusError("nquery returns error: l value is %d\n", l);
|
||||
free (nsbuf);
|
||||
return l;
|
||||
}
|
||||
ParodusInfo ("nsbuf (2) 0x%lx\n", (unsigned long) nsbuf);
|
||||
|
||||
/*--
|
||||
memset((void *) &msg_handle, 0x5e, sizeof (ns_msg));
|
||||
ParodusInfo ("nsbuf (3) 0x%lx\n", (unsigned long) nsbuf);
|
||||
msg_handle._msg = nsbuf;
|
||||
*/
|
||||
ParodusInfo ("ns_initparse, msglen %d, nsbuf 0x%lx\n",
|
||||
l, (unsigned long) nsbuf);
|
||||
ret = ns_initparse((const u_char *) nsbuf, l, &msg_handle);
|
||||
if (ret != 0) {
|
||||
ParodusError ("ns_initparse failed\n");
|
||||
free (nsbuf);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ParodusInfo ("ns_msg_count\n");
|
||||
l = ns_msg_count(msg_handle, ns_s_an);
|
||||
ParodusInfo ("query_dns: ns_msg_count : %d\n",l);
|
||||
jwt_ans[0] = 0;
|
||||
|
||||
ret = assemble_jwt_from_dns (&msg_handle, l, jwt_ans);
|
||||
free (nsbuf);
|
||||
if (ret == 0)
|
||||
ParodusInfo ("query_dns JWT: %s\n", jwt_ans);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void get_dns_txt_record_id (char *buf)
|
||||
{
|
||||
ParodusCfg *cfg = get_parodus_cfg();
|
||||
buf[0] = 0;
|
||||
|
||||
sprintf (buf, "%s.%s", cfg->hw_mac, cfg->dns_txt_url);
|
||||
ParodusInfo("dns_txt_record_id %s\n", buf);
|
||||
}
|
||||
#endif
|
||||
|
||||
int allow_insecure_conn(char *url_buf, int url_buflen,
|
||||
char *port_buf, int port_buflen)
|
||||
{
|
||||
#ifdef FEATURE_DNS_QUERY
|
||||
int insecure=0, ret = -1;
|
||||
char *jwt_token, *key;
|
||||
cjwt_t *jwt = NULL;
|
||||
char dns_txt_record_id[TXT_REC_ID_MAXSIZE];
|
||||
|
||||
jwt_token = malloc (NS_MAXBUF);
|
||||
if (NULL == jwt_token) {
|
||||
ParodusError ("Unable to allocate jwt_token in allow_insecure_conn\n");
|
||||
insecure = TOKEN_ERR_MEMORY_FAIL;
|
||||
goto end;
|
||||
}
|
||||
|
||||
get_dns_txt_record_id (dns_txt_record_id);
|
||||
|
||||
ret = query_dns(dns_txt_record_id, jwt_token);
|
||||
ParodusPrint("query_dns returns %d\n", ret);
|
||||
|
||||
if(ret){
|
||||
ParodusError("Failed in DNS query\n");
|
||||
if (ret == TOKEN_ERR_MEMORY_FAIL){
|
||||
insecure = ret;
|
||||
}
|
||||
else{
|
||||
insecure = TOKEN_ERR_QUERY_DNS_FAIL;
|
||||
}
|
||||
goto end;
|
||||
}
|
||||
//Decoding the jwt token
|
||||
key = get_parodus_cfg()->jwt_key;
|
||||
ret = cjwt_decode( jwt_token, 0, &jwt, ( const uint8_t * )key,strlen(key) );
|
||||
|
||||
if(ret) {
|
||||
if (ret == ENOMEM) {
|
||||
ParodusError ("Memory allocation failed in JWT decode\n");
|
||||
} else {
|
||||
ParodusError ("CJWT decode error\n");
|
||||
}
|
||||
insecure = TOKEN_ERR_JWT_DECODE_FAIL;
|
||||
goto end;
|
||||
}
|
||||
|
||||
ParodusPrint("Decoded CJWT successfully\n");
|
||||
|
||||
//validate algo from --jwt_algo
|
||||
if( validate_algo(jwt) ) {
|
||||
insecure = analyze_jwt (jwt, url_buf, url_buflen, port_buf, port_buflen);
|
||||
} else {
|
||||
insecure = TOKEN_ERR_ALGO_NOT_ALLOWED;
|
||||
}
|
||||
|
||||
if (insecure >= 0) {
|
||||
ParodusInfo ("JWT claims: %s\n", cJSON_Print (jwt->private_claims));
|
||||
}
|
||||
cjwt_destroy(&jwt);
|
||||
|
||||
end:
|
||||
if (NULL != jwt_token)
|
||||
free (jwt_token);
|
||||
#else
|
||||
(void) url_buf;
|
||||
(void) url_buflen;
|
||||
(void) port_buf;
|
||||
(void) port_buflen;
|
||||
int insecure = TOKEN_NO_DNS_QUERY;
|
||||
#endif
|
||||
ParodusPrint ("Allow Insecure %d\n", insecure);
|
||||
return insecure;
|
||||
}
|
||||
92
src/token.h
Normal file
92
src/token.h
Normal file
@@ -0,0 +1,92 @@
|
||||
/**
|
||||
* Copyright 2015 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* @file token.h
|
||||
*
|
||||
* @description This file contains apis and error codes for using jwt token.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _TOKEN_H_
|
||||
#define _TOKEN_H_
|
||||
|
||||
/**
|
||||
* @brief token error rtn codes
|
||||
*
|
||||
*/
|
||||
typedef enum {
|
||||
TOKEN_ERR_MEMORY_FAIL = -999,
|
||||
TOKEN_ERR_QUERY_DNS_FAIL = -101,
|
||||
TOKEN_ERR_JWT_DECODE_FAIL = -102,
|
||||
TOKEN_ERR_ALGO_NOT_ALLOWED = -103,
|
||||
TOKEN_ERR_INVALID_JWT_CONTENT = -104,
|
||||
TOKEN_ERR_NO_EXPIRATION = -105,
|
||||
TOKEN_ERR_JWT_EXPIRED = -106,
|
||||
TOKEN_ERR_BAD_ENDPOINT = -107,
|
||||
TOKEN_NO_DNS_QUERY = -1
|
||||
} token_error_t;
|
||||
|
||||
|
||||
/**
|
||||
|
||||
Connection Logic:
|
||||
|
||||
----- Criteria -----
|
||||
|
||||
Feature FeatureDnsQuery enabled
|
||||
QueryGood Dns query succeeds, jwt decodes and is valid and unexpired
|
||||
Endpt starts Endpoint specified in the jwt starts with http:// or https://
|
||||
Config Secflag secureFlag in config is set. Currently always set.
|
||||
|
||||
|
||||
----- Actions -----
|
||||
|
||||
Default Securely connect to the default URL, specified
|
||||
in the config
|
||||
Secure Securely connect to the endpoint given in the jwt
|
||||
Insecure Insecurely connect to the endpoint given in the jwt
|
||||
|
||||
|
||||
----- Logic Table -----
|
||||
|
||||
Feature Query Endpt Config Action
|
||||
Good Claim SecFlag
|
||||
|
||||
No Default
|
||||
Yes No Default
|
||||
Yes Yes https Secure
|
||||
Yes Yes http False Insecure
|
||||
Yes Yes http True Default
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* query the dns server, obtain a jwt, determine if insecure
|
||||
* connections can be allowed.
|
||||
*
|
||||
* @param url_buf buffer containing endpoint value found in JWT
|
||||
* @param url_buflen len of the url buffer provided by caller
|
||||
* @param port_buf buffer containing port value found in JWT
|
||||
* @param port_buflen len of the port buffer provided by caller
|
||||
* @return 1 if insecure connection is allowed, 0 if not,
|
||||
* or one of the error codes given above.
|
||||
*/
|
||||
int allow_insecure_conn(char *url_buf, int url_buflen,
|
||||
char *port_buf, int port_buflen);
|
||||
|
||||
|
||||
#endif
|
||||
52
src/token_stub.c
Normal file
52
src/token_stub.c
Normal file
@@ -0,0 +1,52 @@
|
||||
/**
|
||||
* Copyright 2015 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* @file token_stub.c
|
||||
*
|
||||
* @description This file contains operations for using jwt token.
|
||||
*
|
||||
*/
|
||||
#include "token.h"
|
||||
#include "parodus_log.h"
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Macros */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* File Scoped Variables */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* none */
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Function Prototypes */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* none */
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* External Functions */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Internal functions */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
int allow_insecure_conn(void)
|
||||
{
|
||||
ParodusInfo("CJWT is disabled, Hence proceeding without validation\n");
|
||||
return 1;
|
||||
}
|
||||
@@ -1,9 +1,24 @@
|
||||
/**
|
||||
* Copyright 2015 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* @file upstream.c
|
||||
*
|
||||
* @description This describes functions required to manage upstream messages.
|
||||
*
|
||||
* Copyright (c) 2015 Comcast
|
||||
*/
|
||||
|
||||
#include "ParodusInternal.h"
|
||||
@@ -33,6 +48,26 @@ pthread_mutex_t nano_mut=PTHREAD_MUTEX_INITIALIZER;
|
||||
|
||||
pthread_cond_t nano_con=PTHREAD_COND_INITIALIZER;
|
||||
|
||||
UpStreamMsg * get_global_UpStreamMsgQ(void)
|
||||
{
|
||||
return UpStreamMsgQ;
|
||||
}
|
||||
|
||||
void set_global_UpStreamMsgQ(UpStreamMsg * UpStreamQ)
|
||||
{
|
||||
UpStreamMsgQ = UpStreamQ;
|
||||
}
|
||||
|
||||
pthread_cond_t *get_global_nano_con(void)
|
||||
{
|
||||
return &nano_con;
|
||||
}
|
||||
|
||||
pthread_mutex_t *get_global_nano_mut(void)
|
||||
{
|
||||
return &nano_mut;
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Internal Functions */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
@@ -106,7 +141,7 @@ void *handle_upstream()
|
||||
buf = NULL;
|
||||
ParodusInfo("nanomsg server gone into the listening mode...\n");
|
||||
bytes = nn_recv (sock, &buf, NN_MSG, 0);
|
||||
ParodusInfo ("Upstream message received from nanomsg client: \"%s\"\n", (char*)buf);
|
||||
ParodusInfo ("Upstream message received from nanomsg client\n");
|
||||
message = (UpStreamMsg *)malloc(sizeof(UpStreamMsg));
|
||||
|
||||
if(message)
|
||||
@@ -157,8 +192,7 @@ void *processUpstreamMessage()
|
||||
int rv=-1, rc = -1;
|
||||
int msgType;
|
||||
wrp_msg_t *msg;
|
||||
void *appendData, *bytes;
|
||||
size_t encodedSize;
|
||||
void *bytes;
|
||||
reg_list_item_t *temp = NULL;
|
||||
int matchFlag = 0;
|
||||
int status = -1;
|
||||
@@ -196,7 +230,7 @@ void *processUpstreamMessage()
|
||||
if(strcmp(temp->service_name, msg->u.reg.service_name)==0)
|
||||
{
|
||||
ParodusInfo("match found, client is already registered\n");
|
||||
strncpy(temp->url,msg->u.reg.url, strlen(msg->u.reg.url)+1);
|
||||
parStrncpy(temp->url,msg->u.reg.url, sizeof(temp->url));
|
||||
if(nn_shutdown(temp->sock, 0) < 0)
|
||||
{
|
||||
ParodusError ("Failed to shutdown\n");
|
||||
@@ -252,7 +286,7 @@ void *processUpstreamMessage()
|
||||
}
|
||||
else if(msgType == WRP_MSG_TYPE__EVENT)
|
||||
{
|
||||
ParodusInfo(" Received upstream event data\n");
|
||||
ParodusInfo(" Received upstream event data: dest '%s'\n", msg->u.event.dest);
|
||||
partners_t *partnersList = NULL;
|
||||
|
||||
int ret = validate_partner_id(msg, &partnersList);
|
||||
@@ -286,40 +320,40 @@ void *processUpstreamMessage()
|
||||
else
|
||||
{
|
||||
//Sending to server for msgTypes 3, 5, 6, 7, 8.
|
||||
ParodusInfo(" Received upstream data with MsgType: %d\n", msgType);
|
||||
//Appending metadata with packed msg received from client
|
||||
if(metaPackSize > 0)
|
||||
{
|
||||
ParodusPrint("Appending received msg with metadata\n");
|
||||
encodedSize = appendEncodedData( &appendData, message->msg, message->len, metadataPack, metaPackSize );
|
||||
ParodusPrint("encodedSize after appending :%zu\n", encodedSize);
|
||||
ParodusPrint("metadata appended upstream msg %s\n", (char *)appendData);
|
||||
ParodusInfo("Sending metadata appended upstream msg to server\n");
|
||||
sendMessage(get_global_conn(),appendData, encodedSize);
|
||||
|
||||
free( appendData);
|
||||
appendData =NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusError("Failed to send upstream as metadata packing is not successful\n");
|
||||
if( WRP_MSG_TYPE__REQ == msgType ) {
|
||||
ParodusInfo(" Received upstream data with MsgType: %d dest: '%s' transaction_uuid: %s\n",
|
||||
msgType, msg->u.req.dest, msg->u.req.transaction_uuid );
|
||||
} else {
|
||||
ParodusInfo(" Received upstream data with MsgType: %d dest: '%s' transaction_uuid: %s status: %d\n",
|
||||
msgType, msg->u.crud.dest, msg->u.crud.transaction_uuid, msg->u.crud.status );
|
||||
}
|
||||
sendUpstreamMsgToServer(&message->msg, message->len);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusError("Error in msgpack decoding for upstream\n");
|
||||
}
|
||||
ParodusPrint("Free for upstream decoded msg\n");
|
||||
wrp_free_struct(msg);
|
||||
msg = NULL;
|
||||
|
||||
if(nn_freemsg (message->msg) < 0)
|
||||
{
|
||||
ParodusError ("Failed to free msg\n");
|
||||
//nn_freemsg should not be done for parodus/tags/ CRUD requests as it is not received through nanomsg.
|
||||
if ((msg && (msg->u.crud.source !=NULL) && strstr(msg->u.crud.source, "parodus") != NULL))
|
||||
{
|
||||
free(message->msg);
|
||||
}
|
||||
else
|
||||
{
|
||||
if(nn_freemsg (message->msg) < 0)
|
||||
{
|
||||
ParodusError ("Failed to free msg\n");
|
||||
}
|
||||
}
|
||||
ParodusPrint("Free for upstream decoded msg\n");
|
||||
if (msg) {
|
||||
wrp_free_struct(msg);
|
||||
}
|
||||
free(message);
|
||||
message = NULL;
|
||||
msg = NULL;
|
||||
free(message);
|
||||
message = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -336,7 +370,6 @@ void sendUpstreamMsgToServer(void **resp_bytes, size_t resp_size)
|
||||
{
|
||||
void *appendData;
|
||||
size_t encodedSize;
|
||||
|
||||
//appending response with metadata
|
||||
if(metaPackSize > 0)
|
||||
{
|
||||
|
||||
@@ -1,18 +1,35 @@
|
||||
/**
|
||||
* Copyright 2015 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
/**
|
||||
* @file upstream.h
|
||||
*
|
||||
* @description This header defines functions required to manage upstream messages.
|
||||
*
|
||||
* Copyright (c) 2015 Comcast
|
||||
*/
|
||||
|
||||
#ifndef _UPSTREAM_H_
|
||||
#define _UPSTREAM_H_
|
||||
|
||||
#include <pthread.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Data Structures */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
@@ -32,6 +49,10 @@ void *handle_upstream();
|
||||
void *processUpstreamMessage();
|
||||
|
||||
void sendUpstreamMsgToServer(void **resp_bytes, size_t resp_size);
|
||||
void set_global_UpStreamMsgQ(UpStreamMsg * UpStreamQ);
|
||||
UpStreamMsg * get_global_UpStreamMsgQ(void);
|
||||
pthread_cond_t *get_global_nano_con(void);
|
||||
pthread_mutex_t *get_global_nano_mut(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Copyright 2016 Comcast Cable Communications Management, LLC
|
||||
# Copyright 2016 Comcast Cable Communications Management, LLCD
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
@@ -16,8 +16,19 @@ set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -W -g -fprofile-arcs -ftest-coverage
|
||||
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DTEST ")
|
||||
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -W -g -fprofile-arcs -ftest-coverage -O0")
|
||||
set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fprofile-arcs -ftest-coverage -O0")
|
||||
set (PARODUS_COMMON_SRC ../src/string_helpers.c ../src/mutex.c ../src/time.c ../src/config.c ../src/spin_thread.c)
|
||||
set (PARODUS_COMMON_LIBS gcov -lcunit -lcimplog -llibseshat -lwrp-c -luuid -lpthread -lm -lmsgpackc -lcjson -ltrower-base64 -lnopoll -lnanomsg -Wl,--no-as-needed -lrt)
|
||||
set (PARODUS_COMMON_SRC ../src/string_helpers.c ../src/mutex.c ../src/time.c ../src/config.c ../src/spin_thread.c ../src/token.c)
|
||||
set (PARODUS_COMMON_LIBS gcov -lcunit -lcimplog -lwrp-c
|
||||
-luuid -lpthread -lmsgpackc -lnopoll -lnanomsg
|
||||
-Wl,--no-as-needed -lcjson -lcjwt -ltrower-base64
|
||||
-lssl -lcrypto -lrt -lm)
|
||||
|
||||
if (ENABLE_SESHAT)
|
||||
set (PARODUS_COMMON_LIBS -llibseshat ${PARODUS_COMMON_LIBS})
|
||||
endif (ENABLE_SESHAT)
|
||||
|
||||
if (FEATURE_DNS_QUERY)
|
||||
set (PARODUS_COMMON_LIBS ${PARODUS_COMMON_LIBS} -lucresolv -lresolv)
|
||||
endif (FEATURE_DNS_QUERY)
|
||||
|
||||
if(NOT DISABLE_VALGRIND)
|
||||
set (MEMORY_CHECK valgrind --leak-check=full --show-reachable=yes -v)
|
||||
@@ -49,13 +60,12 @@ target_link_libraries (test_nopoll_helpers -Wl,--no-as-needed -lrt -lcmocka -lci
|
||||
#-------------------------------------------------------------------------------
|
||||
# libpd_test
|
||||
#-------------------------------------------------------------------------------
|
||||
add_executable (libpd_test libpd_test.c)
|
||||
add_executable (libpd_test libpd_test.c ../src/string_helpers.c)
|
||||
|
||||
target_link_libraries (libpd_test
|
||||
cunit
|
||||
-llibparodus
|
||||
-lwrp-c
|
||||
-llibseshat
|
||||
-luuid
|
||||
-lmsgpackc
|
||||
-ltrower-base64
|
||||
@@ -64,7 +74,9 @@ target_link_libraries (libpd_test
|
||||
-lm
|
||||
-lpthread
|
||||
-lrt)
|
||||
|
||||
if (ENABLE_SESHAT)
|
||||
target_link_libraries (libpd_test -llibseshat)
|
||||
endif (ENABLE_SESHAT)
|
||||
#-------------------------------------------------------------------------------
|
||||
# test_time
|
||||
#-------------------------------------------------------------------------------
|
||||
@@ -97,35 +109,75 @@ target_link_libraries (test_string_helpers ${PARODUS_COMMON_LIBS} )
|
||||
# test_nopoll_handlers
|
||||
#-------------------------------------------------------------------------------
|
||||
add_test(NAME test_nopoll_handlers COMMAND ${MEMORY_CHECK} ./test_nopoll_handlers)
|
||||
add_executable(test_nopoll_handlers test_nopoll_handlers.c ../src/nopoll_handlers.c)
|
||||
add_executable(test_nopoll_handlers test_nopoll_handlers.c ../src/nopoll_handlers.c ../src/heartBeat.c)
|
||||
target_link_libraries (test_nopoll_handlers -lnopoll -lcunit -lcimplog -Wl,--no-as-needed -lrt -lpthread -lm)
|
||||
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
# test_nopoll_handlers_fragment
|
||||
#-------------------------------------------------------------------------------
|
||||
add_test(NAME test_nopoll_handlers_fragment COMMAND ${MEMORY_CHECK} ./test_nopoll_handlers_fragment)
|
||||
add_executable(test_nopoll_handlers_fragment test_nopoll_handlers_fragment.c ../src/nopoll_handlers.c ../src/heartBeat.c)
|
||||
target_link_libraries (test_nopoll_handlers_fragment -lnopoll -lcunit -lcimplog -Wl,--no-as-needed -lrt -lpthread -lm -lcmocka)
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
# test_connection
|
||||
#-------------------------------------------------------------------------------
|
||||
add_test(NAME test_connection COMMAND ${MEMORY_CHECK} ./test_connection)
|
||||
add_executable(test_connection test_connection.c ../src/connection.c ${PARODUS_COMMON_SRC})
|
||||
#add_executable(test_connection test_connection.c ../src/connection.c ${PARODUS_COMMON_SRC})
|
||||
#target_link_libraries (test_connection ${PARODUS_COMMON_LIBS} -lcmocka)
|
||||
set(CONN_SRC test_connection.c ../src/connection.c ../src/heartBeat.c ${PARODUS_COMMON_SRC})
|
||||
add_executable(test_connection ${CONN_SRC})
|
||||
#target_link_libraries (test_connection ${PARODUS_CONN_LIBS} ${PARODUS_COMMON_LIBS} -lcmocka)
|
||||
target_link_libraries (test_connection ${PARODUS_COMMON_LIBS} -lcmocka)
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
# test_connection - function createNopollConnection
|
||||
#-------------------------------------------------------------------------------
|
||||
add_test(NAME test_createConnection COMMAND ${MEMORY_CHECK} ./test_createConnection)
|
||||
add_executable(test_createConnection test_createConnection.c ../src/connection.c ../src/string_helpers.c ../src/config.c)
|
||||
target_link_libraries (test_createConnection ${PARODUS_COMMON_LIBS} -lcmocka)
|
||||
#add_executable(test_createConnection test_createConnection.c ../src/connection.c ../src/string_helpers.c ../src/config.c)
|
||||
#target_link_libraries (test_createConnection ${PARODUS_COMMON_LIBS} -lcmocka)
|
||||
add_executable(test_createConnection test_createConnection.c ../src/connection.c ../src/string_helpers.c ../src/config.c ../src/heartBeat.c)
|
||||
#target_link_libraries (test_createConnection ${PARODUS_CONN_LIBS} ${PARODUS_COMMON_LIBS} -lcmocka )
|
||||
target_link_libraries (test_createConnection ${PARODUS_COMMON_LIBS} -lcmocka )
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
# test_client_list
|
||||
#-------------------------------------------------------------------------------
|
||||
add_test(NAME test_client_list COMMAND ${MEMORY_CHECK} ./test_client_list)
|
||||
add_executable(test_client_list test_client_list.c ../src/client_list.c ../src/service_alive.c ../src/upstream.c ../src/networking.c ../src/nopoll_helpers.c ../src/downstream.c ../src/connection.c ../src/nopoll_handlers.c ../src/ParodusInternal.c ../src/thread_tasks.c ../src/conn_interface.c ../src/partners_check.c ${PARODUS_COMMON_SRC})
|
||||
#add_executable(test_client_list test_client_list.c ../src/client_list.c ../src/service_alive.c ../src/upstream.c ../src/networking.c ../src/nopoll_helpers.c ../src/downstream.c ../src/connection.c ../src/nopoll_handlers.c ../src/ParodusInternal.c ../src/thread_tasks.c ../src/conn_interface.c ../src/partners_check.c ${PARODUS_COMMON_SRC})
|
||||
#target_link_libraries (test_client_list ${PARODUS_COMMON_LIBS})
|
||||
set(CLIST_SRC test_client_list.c ../src/client_list.c
|
||||
../src/service_alive.c ../src/upstream.c ../src/networking.c ../src/nopoll_helpers.c
|
||||
../src/downstream.c ../src/connection.c ../src/nopoll_handlers.c ../src/heartBeat.c
|
||||
../src/ParodusInternal.c ../src/thread_tasks.c ../src/conn_interface.c
|
||||
../src/partners_check.c ../src/crud_interface.c ../src/crud_tasks.c ../src/crud_internal.c ${PARODUS_COMMON_SRC})
|
||||
|
||||
if (ENABLE_SESHAT)
|
||||
set(CLIST_SRC ${CLIST_SRC} ../src/seshat_interface.c)
|
||||
else()
|
||||
set(CLIST_SRC ${CLIST_SRC} ../src/seshat_interface_stub.c)
|
||||
endif (ENABLE_SESHAT)
|
||||
|
||||
add_executable(test_client_list ${CLIST_SRC})
|
||||
#target_link_libraries (test_client_list ${PARODUS_CONN_LIBS} ${PARODUS_COMMON_LIBS})
|
||||
target_link_libraries (test_client_list ${PARODUS_COMMON_LIBS})
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
# test_service_alive
|
||||
#-------------------------------------------------------------------------------
|
||||
add_test(NAME test_service_alive COMMAND ${MEMORY_CHECK} ./test_service_alive)
|
||||
add_executable(test_service_alive test_service_alive.c ../src/client_list.c ../src/service_alive.c ../src/upstream.c ../src/networking.c ../src/nopoll_helpers.c ../src/nopoll_handlers.c ../src/config.c ../src/connection.c ../src/ParodusInternal.c ../src/downstream.c ../src/thread_tasks.c ../src/conn_interface.c ../src/partners_check.c ${PARODUS_COMMON_SRC})
|
||||
#add_executable(test_service_alive test_service_alive.c ../src/client_list.c ../src/service_alive.c ../src/upstream.c ../src/networking.c ../src/nopoll_helpers.c ../src/nopoll_handlers.c ../src/config.c ../src/connection.c ../src/ParodusInternal.c ../src/downstream.c ../src/thread_tasks.c ../src/conn_interface.c ../src/partners_check.c ${PARODUS_COMMON_SRC})
|
||||
#target_link_libraries (test_service_alive ${PARODUS_COMMON_LIBS})
|
||||
set(SVA_SRC test_service_alive.c ../src/client_list.c ../src/service_alive.c ../src/upstream.c ../src/networking.c ../src/nopoll_helpers.c ../src/nopoll_handlers.c ../src/config.c ../src/connection.c ../src/ParodusInternal.c ../src/downstream.c ../src/thread_tasks.c ../src/conn_interface.c ../src/partners_check.c ../src/heartBeat.c ${PARODUS_COMMON_SRC})
|
||||
if (ENABLE_SESHAT)
|
||||
set(SVA_SRC ${SVA_SRC} ../src/seshat_interface.c)
|
||||
else()
|
||||
set(SVA_SRC ${SVA_SRC} ../src/seshat_interface_stub.c)
|
||||
endif (ENABLE_SESHAT)
|
||||
|
||||
add_executable(test_service_alive ${SVA_SRC})
|
||||
#target_link_libraries (test_service_alive ${PARODUS_CONN_LIBS} ${PARODUS_COMMON_LIBS})
|
||||
target_link_libraries (test_service_alive ${PARODUS_COMMON_LIBS})
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
@@ -133,13 +185,37 @@ target_link_libraries (test_service_alive ${PARODUS_COMMON_LIBS})
|
||||
#-------------------------------------------------------------------------------
|
||||
add_test(NAME test_config COMMAND ${MEMORY_CHECK} ./test_config)
|
||||
add_executable(test_config test_config.c ../src/config.c ../src/string_helpers.c)
|
||||
target_link_libraries (test_config -lcmocka -lm -Wl,--no-as-needed -lrt -lcimplog)
|
||||
target_link_libraries (test_config -lcmocka
|
||||
-Wl,--no-as-needed -lcimplog
|
||||
-lcjson -lcjwt -ltrower-base64 -lssl -lcrypto -lrt -lm
|
||||
)
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
# test_crud_interface
|
||||
#-------------------------------------------------------------------------------
|
||||
add_test(NAME test_crud_interface COMMAND ${MEMORY_CHECK} ./test_crud_interface)
|
||||
add_executable(test_crud_interface test_crud_interface.c ../src/crud_interface.c ../src/ParodusInternal.c)
|
||||
target_link_libraries (test_crud_interface -lcmocka ${PARODUS_COMMON_LIBS} )
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
# test_crud_tasks
|
||||
#-------------------------------------------------------------------------------
|
||||
add_test(NAME test_crud_tasks COMMAND ${MEMORY_CHECK} ./test_crud_tasks)
|
||||
add_executable(test_crud_tasks test_crud_tasks.c ../src/crud_tasks.c )
|
||||
target_link_libraries (test_crud_tasks -lcmocka ${PARODUS_COMMON_LIBS} )
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
# test_crud_internal
|
||||
#-------------------------------------------------------------------------------
|
||||
add_test(NAME test_crud_internal COMMAND ${MEMORY_CHECK} ./test_crud_internal)
|
||||
add_executable(test_crud_internal test_crud_internal.c ../src/config.c ../src/string_helpers.c ../src/crud_internal.c )
|
||||
target_link_libraries (test_crud_internal -lcmocka ${PARODUS_COMMON_LIBS} )
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
# test_upstream
|
||||
#-------------------------------------------------------------------------------
|
||||
add_test(NAME test_upstream COMMAND ${MEMORY_CHECK} ./test_upstream)
|
||||
add_executable(test_upstream test_upstream.c ../src/upstream.c)
|
||||
add_executable(test_upstream test_upstream.c ../src/upstream.c ../src/string_helpers.c)
|
||||
target_link_libraries (test_upstream -lcmocka ${PARODUS_COMMON_LIBS} )
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
@@ -149,6 +225,13 @@ add_test(NAME test_downstream COMMAND ${MEMORY_CHECK} ./test_downstream)
|
||||
add_executable(test_downstream test_downstream.c ../src/downstream.c ../src/string_helpers.c)
|
||||
target_link_libraries (test_downstream -lcmocka ${PARODUS_COMMON_LIBS} )
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
# test_downstream_more
|
||||
#-------------------------------------------------------------------------------
|
||||
add_test(NAME test_downstream_more COMMAND ${MEMORY_CHECK} ./test_downstream_more)
|
||||
add_executable(test_downstream_more test_downstream_more.c ../src/downstream.c ../src/string_helpers.c)
|
||||
target_link_libraries (test_downstream_more -lcmocka ${PARODUS_COMMON_LIBS} )
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
# test_thread_tasks
|
||||
#-------------------------------------------------------------------------------
|
||||
@@ -160,7 +243,21 @@ target_link_libraries (test_thread_tasks -lcmocka ${PARODUS_COMMON_LIBS} )
|
||||
# test_conn_interface
|
||||
#-------------------------------------------------------------------------------
|
||||
add_test(NAME test_conn_interface COMMAND ${MEMORY_CHECK} ./test_conn_interface)
|
||||
add_executable(test_conn_interface test_conn_interface.c ../src/conn_interface.c ../src/config.c ../src/string_helpers.c ../src/mutex.c)
|
||||
set(CONIFC_SRC test_conn_interface.c
|
||||
../src/crud_interface.c ../src/crud_tasks.c ../src/crud_internal.c
|
||||
../src/conn_interface.c
|
||||
../src/config.c
|
||||
../src/token.c
|
||||
../src/string_helpers.c
|
||||
../src/mutex.c
|
||||
../src/heartBeat.c
|
||||
)
|
||||
if (ENABLE_SESHAT)
|
||||
set(CONIFC_SRC ${CONIFC_SRC} ../src/seshat_interface.c)
|
||||
else()
|
||||
set(CONIFC_SRC ${CONIFC_SRC} ../src/seshat_interface_stub.c)
|
||||
endif (ENABLE_SESHAT)
|
||||
add_executable(test_conn_interface ${CONIFC_SRC})
|
||||
target_link_libraries (test_conn_interface -lcmocka ${PARODUS_COMMON_LIBS} )
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
@@ -174,27 +271,80 @@ target_link_libraries (test_ParodusInternal -lcmocka ${PARODUS_COMMON_LIBS} )
|
||||
# test_partners_check
|
||||
#-------------------------------------------------------------------------------
|
||||
add_test(NAME test_partners_check COMMAND ${MEMORY_CHECK} ./test_partners_check)
|
||||
add_executable(test_partners_check test_partners_check.c ../src/partners_check.c)
|
||||
target_link_libraries (test_partners_check -lcmocka -lwrp-c -llibseshat ${PARODUS_COMMON_LIBS})
|
||||
add_executable(test_partners_check test_partners_check.c ../src/partners_check.c ../src/string_helpers.c)
|
||||
target_link_libraries (test_partners_check -lcmocka ${PARODUS_COMMON_LIBS} -lwrp-c)
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
# test_token - token.c tests
|
||||
#-------------------------------------------------------------------------------
|
||||
add_test(NAME test_token COMMAND ${MEMORY_CHECK} ./test_token)
|
||||
set(TOKEN_SRC ../src/conn_interface.c ../src/config.c
|
||||
../src/connection.c ../src/spin_thread.c
|
||||
../src/service_alive.c ../src/client_list.c
|
||||
../src/nopoll_handlers.c ../src/nopoll_helpers.c
|
||||
../src/partners_check.c ../src/ParodusInternal.c
|
||||
../src/upstream.c ../src/downstream.c
|
||||
../src/networking.c
|
||||
../src/thread_tasks.c ../src/time.c
|
||||
../src/string_helpers.c ../src/mutex.c
|
||||
../src/token.c ../src/heartBeat.c
|
||||
)
|
||||
|
||||
if (ENABLE_SESHAT)
|
||||
set(TOKEN_SRC ${TOKEN_SRC} ../src/seshat_interface.c)
|
||||
else()
|
||||
set(TOKEN_SRC ${TOKEN_SRC} ../src/seshat_interface_stub.c)
|
||||
endif (ENABLE_SESHAT)
|
||||
|
||||
if (FEATURE_DNS_QUERY)
|
||||
set(TOKEN_SRC test_token.c ${TOKEN_SRC})
|
||||
else()
|
||||
set(TOKEN_SRC test_token_stub.c ${TOKEN_SRC})
|
||||
endif (FEATURE_DNS_QUERY)
|
||||
|
||||
add_executable(test_token ${TOKEN_SRC} )
|
||||
#target_link_libraries (test_token ${PARODUS_COMMON_LIBS} ${PARODUS_JWT_LIBS} -lcmocka )
|
||||
target_link_libraries (test_token ${PARODUS_COMMON_LIBS} -lcmocka )
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
# test_seshat_interface - registerWithSeshat
|
||||
#-------------------------------------------------------------------------------
|
||||
add_test(NAME test_seshat_interface COMMAND ${MEMORY_CHECK} ./test_seshat_interface)
|
||||
if (ENABLE_SESHAT)
|
||||
set(SESHIFC_SRC test_seshat_interface.c ../src/seshat_interface.c ../src/string_helpers.c)
|
||||
else()
|
||||
set(SESHIFC_SRC test_seshat_interface_stub.c ../src/seshat_interface_stub.c)
|
||||
endif (ENABLE_SESHAT)
|
||||
add_executable(test_seshat_interface ${SESHIFC_SRC})
|
||||
target_link_libraries (test_seshat_interface -lcmocka ${PARODUS_COMMON_LIBS} -lwrp-c)
|
||||
|
||||
if (INTEGRATION_TESTING)
|
||||
#-------------------------------------------------------------------------------
|
||||
# simple_connection test
|
||||
#-------------------------------------------------------------------------------
|
||||
add_test(NAME simple_connection COMMAND ${MEMORY_CHECK} ./simple_connection)
|
||||
add_executable(simple_connection simple_connection.c ${PARODUS_COMMON_SRC}
|
||||
../src/upstream.c
|
||||
../src/conn_interface.c
|
||||
../src/thread_tasks.c
|
||||
../src/downstream.c
|
||||
../src/networking.c
|
||||
../src/nopoll_helpers.c
|
||||
../src/nopoll_handlers.c
|
||||
../src/connection.c
|
||||
../src/ParodusInternal.c
|
||||
../src/client_list.c
|
||||
../src/partners_check.c
|
||||
../src/service_alive.c)
|
||||
target_link_libraries (simple_connection ${PARODUS_COMMON_LIBS})
|
||||
set(SIMCON_SRC simple_connection.c ${PARODUS_COMMON_SRC} ../src/upstream.c ../src/conn_interface.c
|
||||
../src/thread_tasks.c ../src/downstream.c ../src/networking.c ../src/nopoll_helpers.c ../src/nopoll_handlers.c ../src/connection.c ../src/ParodusInternal.c ../src/client_list.c ../src/partners_check.c ../src/service_alive.c)
|
||||
if (ENABLE_SESHAT)
|
||||
set(SIMCON_SRC ${SIMCON_SRC} ../src/seshat_interface.c)
|
||||
else()
|
||||
set(SIMCON_SRC ${SIMCON_SRC} ../src/seshat_interface_stub.c)
|
||||
endif (ENABLE_SESHAT)
|
||||
add_executable(simple_connection ${SIMCON_SRC})
|
||||
target_link_libraries (simple_connection ${PARODUS_CONN_LIBS} ${PARODUS_COMMON_LIBS} )
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
# simple test
|
||||
#-------------------------------------------------------------------------------
|
||||
add_test(NAME simple COMMAND ${MEMORY_CHECK} ./simple)
|
||||
set(SIMPLE_SRC simple.c ../src/upstream.c ../src/conn_interface.c ../src/downstream.c ../src/thread_tasks.c ../src/networking.c ../src/nopoll_helpers.c ../src/nopoll_handlers.c ../src/string_helpers.c ../src/mutex.c ../src/time.c
|
||||
../src/config.c ../src/connection.c ../src/ParodusInternal.c ../src/spin_thread.c ../src/client_list.c ../src/partners_check.c ../src/service_alive.c)
|
||||
if (ENABLE_SESHAT)
|
||||
set(SIMPLE_SRC ${SIMPLE_SRC} ../src/seshat_interface.c)
|
||||
else()
|
||||
set(SIMPLE_SRC ${SIMPLE_SRC} ../src/seshat_interface_stub.c)
|
||||
endif (ENABLE_SESHAT)
|
||||
add_executable(simple ${SIMPLE_SRC})
|
||||
|
||||
target_link_libraries (simple ${PARODUS_CONN_LIBS} ${PARODUS_COMMON_LIBS} gcov -lnopoll -lnanomsg )
|
||||
endif (INTEGRATION_TESTING)
|
||||
|
||||
28
tests/key4.pem
Normal file
28
tests/key4.pem
Normal file
@@ -0,0 +1,28 @@
|
||||
-----BEGIN PRIVATE KEY-----
|
||||
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDsLxH6GZFxU64v
|
||||
GL9CNz3hLSoCb7TckabgbVp6PIRy9cKEwfqnQ/2ohqrdolMA6Peru2+DgBs1iJ3u
|
||||
JNSc+8XFphUj0Jm2gVumVfclSZTEkM4xI4D3ABXn0Pj6/Ps5Skx9pXk3KI988ksB
|
||||
secD+FNqBPgmKWG0Gp+JSrPEwAtA4ZBP/4vtCGxEFzRCSOSBkTh27n1f08M4PjsY
|
||||
+vMvyTVF67y4Zb3nWJHpa1yOBlHid0xI138KPEBl+9Vai1AwRWbhlq52I9+IVjCo
|
||||
N7Ui9KbRgfd21SJFLh3hDw6xSrNqtcU+mvv5GuLAxHF5tCcGpAgKvKhvjQU4v+fh
|
||||
lGW77zkVAgMBAAECggEBAI8DoZsTyGIbDaovDgEGek3Tj1CSW64D9EyJavQBmSIT
|
||||
don0+9Y08XAOu4AhPqmaZ/5xLQEvnUo5Q4hkfOnh+svH2Z0qPymoAtshytmlSJQO
|
||||
KwzONtVaE+mfPGSes3DpcI/UlyWzRc+e15RbKUvaHohgIfLZs/Pe+yOjPF+y+h16
|
||||
Tpvklvk9GuS5/njOm0N8iRZw0+mKMLjwKCf0Q9WpF5OXW7hYccG9aTpmiUDnpixP
|
||||
nMyEdZMhmfFDLl+t6Txj3KhNX8jixDmfkuiPuoADWZuYk3GjS499nb3Y5Tmm8TLq
|
||||
jf0St48y1bObNnkceSqODnUK2hUZzzWcgTLwIC1E0DECgYEA+QoVuCA5i3eAiyE7
|
||||
PUsKpT0qVH/rWVWl0HYykUI7MSv0KJH7uPS+m2GzScxpCZoA4wtu6iK5IePNf645
|
||||
yJAleglx+1vuBGCWQrr206gOPWrkthfVHd+pDCr/fnIG+RdNr9SgwUx1youpovQ4
|
||||
x64RQuEyBXENt+xx2+fFI28GxEcCgYEA8skAisNqPgREewZ+hM2OkhIyU7GaKWgt
|
||||
HfjPYHHYWVO/sSfOdcyzcCUZJkseBhIVEmIeiXM4NCO0spmieHa6bo8oLr1nPMtm
|
||||
J4UkyVRPtO99V5mIBYOS3cWAEwEt7lWZ+4JiIyEBO/tMVjIrB8YkOE4LqV40Vvpu
|
||||
XGJbtw3JEcMCgYEA15xnmXYs3Bamb85hn3tsyArgry/g7wM7//OVbDXPUY8gYE+j
|
||||
hEpBC/3WX7pd5jYzNl8btBJD/pdfv39z/7Ts/W9YA6tfsuJ8tWFxeWYyjfIR+aVA
|
||||
mhCeJy7C7RKD/vyyAd0xIKm2AZpRUAfpcNe/kguuZw+uNOK84QsUnsztKtkCgYAE
|
||||
KBDMT2AoQ6ZwfMH5wBMqyQj3idjb0J7FHpdeTVSo4tgrTkUomyKPTvNJRovzCqg1
|
||||
slxXehOCQQI89Ihli5LRhb3oXvG/hrPvBUaF892ReXAp6cT8Yy5GgbUZnjGNHQYP
|
||||
2kGX3F7LChhaeW1nKqtAE4X7llNLEeqFxmFPlvrURQKBgA0c5s3WPeX5OfSRsLaF
|
||||
iXaQNQ88QORNJ4hp/L7/o3ZNy7elH/R3GM1fs8Yf711CDxy4qI7icRYyrkl0P/Py
|
||||
WyRbNnvw0JMa5xkzRgKlnvspfEfve7gzcZhE9yEw173MIyyoxIn43G9aGNSN3QIR
|
||||
51ZlCYyuIAgR7p+9lKvM74HR
|
||||
-----END PRIVATE KEY-----
|
||||
@@ -28,6 +28,7 @@
|
||||
|
||||
#include <libparodus.h>
|
||||
#include <pthread.h>
|
||||
#include "../src/ParodusInternal.h"
|
||||
|
||||
#define SEND_EVENT_MSGS 1
|
||||
|
||||
@@ -127,7 +128,7 @@ char *new_str (const char *str)
|
||||
char *buf = malloc (strlen(str) + 1);
|
||||
if (NULL == buf)
|
||||
return NULL;
|
||||
strcpy (buf, str);
|
||||
parStrncpy(buf, str, (strlen(str)+1));
|
||||
return buf;
|
||||
}
|
||||
|
||||
@@ -243,13 +244,19 @@ void delay_ms(unsigned int secs, unsigned int msecs)
|
||||
|
||||
void dbg_log_err (const char *fmt, ...)
|
||||
{
|
||||
char errbuf[100];
|
||||
char errbuf[100];
|
||||
|
||||
va_list arg_ptr;
|
||||
|
||||
va_start(arg_ptr, fmt);
|
||||
vprintf(fmt, arg_ptr);
|
||||
va_end(arg_ptr);
|
||||
printf ("LIBPD_TEST: %s\n", strerror_r (errno, errbuf, 100));
|
||||
|
||||
if( 0 == strerror_r (errno, errbuf, 100) ) {
|
||||
printf("LIBPD_TEST: %s\n", errbuf);
|
||||
} else {
|
||||
printf("LIBPD_TEST: strerror_r returned failure!\n");
|
||||
}
|
||||
}
|
||||
|
||||
void wait_auth_received (void)
|
||||
|
||||
3
tests/parodus_cmd.sh
Executable file
3
tests/parodus_cmd.sh
Executable file
@@ -0,0 +1,3 @@
|
||||
sudo ./parodus --hw-model=TG1682 --hw-serial-number=Fer23u948590 --hw-manufacturer=ARRISGroup,Inc. --hw-mac=aabb33ddeeff --hw-last-reboot-reason=unknown --fw-name=TG1682_DEV_master_2016000000sdy --boot-time=123589 --webpa-ping-timeout=180 --webpa-backoff-max=0 --webpa-interface-used=p7p1 --webpa-url=https://example.net:8080 --acquire-jwt=1 --jwt-algo=RS256 --jwt-public-key-file=../../tests/webpa-rs256.pem --dns-txt-url=example.net
|
||||
|
||||
|
||||
9
tests/pubkey4.pem
Normal file
9
tests/pubkey4.pem
Normal file
@@ -0,0 +1,9 @@
|
||||
-----BEGIN PUBLIC KEY-----
|
||||
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA7C8R+hmRcVOuLxi/Qjc9
|
||||
4S0qAm+03JGm4G1aejyEcvXChMH6p0P9qIaq3aJTAOj3q7tvg4AbNYid7iTUnPvF
|
||||
xaYVI9CZtoFbplX3JUmUxJDOMSOA9wAV59D4+vz7OUpMfaV5NyiPfPJLAbHnA/hT
|
||||
agT4JilhtBqfiUqzxMALQOGQT/+L7QhsRBc0QkjkgZE4du59X9PDOD47GPrzL8k1
|
||||
Reu8uGW951iR6WtcjgZR4ndMSNd/CjxAZfvVWotQMEVm4ZaudiPfiFYwqDe1IvSm
|
||||
0YH3dtUiRS4d4Q8OsUqzarXFPpr7+RriwMRxebQnBqQICryob40FOL/n4ZRlu+85
|
||||
FQIDAQAB
|
||||
-----END PUBLIC KEY-----
|
||||
@@ -66,17 +66,17 @@ void test_set_parodus_cfg()
|
||||
{
|
||||
ParodusCfg cfg;
|
||||
|
||||
strcpy(cfg.hw_model, "TG1682");
|
||||
strcpy(cfg.hw_serial_number, "Fer23u948590");
|
||||
strcpy(cfg.hw_manufacturer , "ARRISGroup,Inc.");
|
||||
strcpy(cfg.hw_mac , "123567892366");
|
||||
strcpy(cfg.hw_last_reboot_reason , "unknown");
|
||||
strcpy(cfg.fw_name , "2.364s2");
|
||||
strcpy(cfg.webpa_path_url , "/api/v2/device");
|
||||
strcpy(cfg.webpa_url , "fabric-cd.webpa.comcast.net");
|
||||
strcpy(cfg.webpa_interface_used , "eth0");
|
||||
strcpy(cfg.webpa_protocol , "WebPA-1.6");
|
||||
strcpy(cfg.webpa_uuid , "1234567-345456546");
|
||||
parStrncpy(cfg.hw_model, "TG1682", sizeof(cfg.hw_model));
|
||||
parStrncpy(cfg.hw_serial_number, "Fer23u948590", sizeof(cfg.hw_serial_number));
|
||||
parStrncpy(cfg.hw_manufacturer , "ARRISGroup,Inc.", sizeof(cfg.hw_manufacturer));
|
||||
parStrncpy(cfg.hw_mac , "123567892366", sizeof(cfg.hw_mac));
|
||||
parStrncpy(cfg.hw_last_reboot_reason , "unknown", sizeof(cfg.hw_last_reboot_reason));
|
||||
parStrncpy(cfg.fw_name , "2.364s2", sizeof(cfg.fw_name));
|
||||
parStrncpy(cfg.webpa_path_url , "/api/v2/device", sizeof(cfg.webpa_path_url));
|
||||
parStrncpy(cfg.webpa_url , "fabric-cd.webpa.comcast.net", sizeof(cfg.webpa_url));
|
||||
parStrncpy(cfg.webpa_interface_used , "eth0", sizeof(cfg.webpa_interface_used));
|
||||
parStrncpy(cfg.webpa_protocol , "WebPA-1.6", sizeof(cfg.webpa_protocol));
|
||||
parStrncpy(cfg.webpa_uuid , "1234567-345456546", sizeof(cfg.webpa_uuid));
|
||||
cfg.secureFlag = 1;
|
||||
cfg.boot_time = 423457;
|
||||
cfg.webpa_ping_timeout = 30;
|
||||
|
||||
@@ -39,7 +39,7 @@ bool LastReasonStatus;
|
||||
nopoll_bool nopoll_base64_encode(const char *content,int length,char *output, int *output_size)
|
||||
{
|
||||
UNUSED(content); UNUSED(length); UNUSED(output_size);
|
||||
strcpy(output, "AWYFUJHUDUDKJDDRDKUIIKORE\nSFJLIRRSHLOUTDESTDJJITTESLOIUHJGDRS\nGIUY&%WSJ");
|
||||
parStrncpy(output, "AWYFUJHUDUDKJDDRDKUIIKORE\nSFJLIRRSHLOUTDESTDJJITTESLOIUHJGDRS\nGIUY&%WSJ", (size_t) *output_size);
|
||||
function_called();
|
||||
return (nopoll_bool)(intptr_t)mock();
|
||||
}
|
||||
@@ -56,19 +56,19 @@ char *get_global_reconnect_reason()
|
||||
void test_getWebpaConveyHeader()
|
||||
{
|
||||
ParodusCfg cfg;
|
||||
|
||||
strcpy(cfg.hw_model, "TG1682");
|
||||
strcpy(cfg.hw_serial_number, "Fer23u948590");
|
||||
strcpy(cfg.hw_manufacturer , "ARRISGroup,Inc.");
|
||||
strcpy(cfg.hw_mac , "123567892366");
|
||||
strcpy(cfg.hw_last_reboot_reason , "unknown");
|
||||
strcpy(cfg.fw_name , "2.364s2");
|
||||
strcpy(cfg.webpa_path_url , "/api/v2/device");
|
||||
strcpy(cfg.webpa_url , "localhost");
|
||||
strcpy(cfg.webpa_interface_used , "eth0");
|
||||
strcpy(cfg.webpa_protocol , "WebPA-1.6");
|
||||
strcpy(cfg.webpa_uuid , "1234567-345456546");
|
||||
cfg.secureFlag = 1;
|
||||
memset(&cfg, 0, sizeof(ParodusCfg));
|
||||
parStrncpy(cfg.hw_model, "TG1682", sizeof(cfg.hw_model));
|
||||
parStrncpy(cfg.hw_serial_number, "Fer23u948590", sizeof(cfg.hw_serial_number));
|
||||
parStrncpy(cfg.hw_manufacturer , "ARRISGroup,Inc.", sizeof(cfg.hw_manufacturer));
|
||||
parStrncpy(cfg.hw_mac , "123567892366", sizeof(cfg.hw_mac));
|
||||
parStrncpy(cfg.hw_last_reboot_reason , "unknown", sizeof(cfg.hw_last_reboot_reason));
|
||||
parStrncpy(cfg.fw_name , "2.364s2", sizeof(cfg.fw_name));
|
||||
parStrncpy(cfg.webpa_path_url , "/api/v2/device", sizeof(cfg.webpa_path_url));
|
||||
parStrncpy(cfg.webpa_url , "localhost", sizeof(cfg.webpa_url));
|
||||
parStrncpy(cfg.webpa_interface_used , "eth0", sizeof(cfg.webpa_interface_used));
|
||||
parStrncpy(cfg.webpa_protocol , "WebPA-1.6", sizeof(cfg.webpa_protocol));
|
||||
parStrncpy(cfg.webpa_uuid , "1234567-345456546", sizeof(cfg.webpa_uuid));
|
||||
cfg.flags = 0;
|
||||
cfg.boot_time = 423457;
|
||||
cfg.webpa_ping_timeout = 30;
|
||||
cfg.webpa_backoff_max = 255;
|
||||
@@ -95,6 +95,38 @@ void err_getWebpaConveyHeader()
|
||||
getWebpaConveyHeader();
|
||||
}
|
||||
|
||||
/*
|
||||
* Test function to verify timespec_diff function
|
||||
* Verifys when the time diff is positive ie stop time > start time
|
||||
*/
|
||||
void test_timespec_diff()
|
||||
{
|
||||
struct timespec start, stop, diff;
|
||||
int time_taken_ms;
|
||||
clock_gettime(CLOCK_REALTIME, &start);
|
||||
sleep(1);
|
||||
clock_gettime(CLOCK_REALTIME, &stop);
|
||||
timespec_diff(&start, &stop, &diff);
|
||||
time_taken_ms = diff.tv_sec * 1000 + (diff.tv_nsec / 1000000);
|
||||
assert_int_equal(time_taken_ms, 1000);
|
||||
}
|
||||
|
||||
/*
|
||||
* Test function to verify timespec_diff function
|
||||
* Verifys when the time diff is negative ie stop time < start time
|
||||
*/
|
||||
void test_timespec_diff1()
|
||||
{
|
||||
struct timespec start, stop, diff;
|
||||
int time_taken_ms;
|
||||
clock_gettime(CLOCK_REALTIME, &start);
|
||||
sleep(1);
|
||||
clock_gettime(CLOCK_REALTIME, &stop);
|
||||
timespec_diff(&stop, &start, &diff);
|
||||
time_taken_ms = diff.tv_sec * 1000 + (diff.tv_nsec / 1000000);
|
||||
assert_int_equal(time_taken_ms, -1001);
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* External Functions */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
@@ -103,6 +135,8 @@ int main(void)
|
||||
const struct CMUnitTest tests[] = {
|
||||
cmocka_unit_test(test_getWebpaConveyHeader),
|
||||
cmocka_unit_test(err_getWebpaConveyHeader),
|
||||
cmocka_unit_test(test_timespec_diff),
|
||||
cmocka_unit_test(test_timespec_diff1),
|
||||
};
|
||||
|
||||
return cmocka_run_group_tests(tests, NULL, NULL);
|
||||
|
||||
@@ -87,13 +87,23 @@ static void *client_rcv_task()
|
||||
int byte =0;
|
||||
int rv1=0;
|
||||
int t=25000;
|
||||
int rc = -1;
|
||||
int bind;
|
||||
wrp_msg_t *msg1;
|
||||
|
||||
int sock1 = nn_socket (AF_SP, NN_PULL);
|
||||
nn_bind(sock1, TEST_CLIENT1_URL);
|
||||
bind = nn_bind(sock1, TEST_CLIENT1_URL);
|
||||
if(bind < 0)
|
||||
{
|
||||
ParodusError("Unable to bind socket (errno=%d, %s)\n",errno, strerror(errno));
|
||||
}
|
||||
|
||||
void *buf = NULL;
|
||||
nn_setsockopt(sock1, NN_SOL_SOCKET, NN_RCVTIMEO, &t, sizeof(t));
|
||||
rc = nn_setsockopt(sock1, NN_SOL_SOCKET, NN_RCVTIMEO, &t, sizeof(t));
|
||||
if(rc < 0)
|
||||
{
|
||||
ParodusError ("Unable to set socket timeout (errno=%d, %s)\n",errno, strerror(errno));
|
||||
}
|
||||
|
||||
ParodusPrint("Client 1 waiting for acknowledgement \n");
|
||||
byte = nn_recv(sock1, &buf, NN_MSG, 0);
|
||||
@@ -119,13 +129,23 @@ static void *client2_rcv_task()
|
||||
int byte =0;
|
||||
int rv1=0;
|
||||
int t=25000;
|
||||
int rc = -1;
|
||||
int bind;
|
||||
wrp_msg_t *msg1;
|
||||
|
||||
int sock1 = nn_socket (AF_SP, NN_PULL);
|
||||
nn_bind(sock1, TEST_CLIENT2_URL);
|
||||
bind = nn_bind(sock1, TEST_CLIENT2_URL);
|
||||
if(bind < 0)
|
||||
{
|
||||
ParodusError("Unable to bind socket (errno=%d, %s)\n",errno, strerror(errno));
|
||||
}
|
||||
|
||||
void *buf = NULL;
|
||||
nn_setsockopt(sock1, NN_SOL_SOCKET, NN_RCVTIMEO, &t, sizeof(t));
|
||||
rc = nn_setsockopt(sock1, NN_SOL_SOCKET, NN_RCVTIMEO, &t, sizeof(t));
|
||||
if(rc < 0)
|
||||
{
|
||||
ParodusError ("Unable to set socket timeout (errno=%d, %s)\n",errno, strerror(errno));
|
||||
}
|
||||
|
||||
ParodusPrint("Client 2 waiting for acknowledgement \n");
|
||||
byte = nn_recv(sock1, &buf, NN_MSG, 0);
|
||||
|
||||
@@ -25,42 +25,67 @@
|
||||
#include <CUnit/Basic.h>
|
||||
|
||||
#include "../src/config.h"
|
||||
#include "../src/ParodusInternal.h"
|
||||
|
||||
#define K_argc 15
|
||||
extern int parse_mac_address (char *target, const char *arg);
|
||||
extern int server_is_http (const char *full_url,
|
||||
const char **server_ptr);
|
||||
extern int parse_webpa_url(const char *full_url,
|
||||
char *server_addr, int server_addr_buflen,
|
||||
char *port_buf, int port_buflen);
|
||||
extern unsigned int get_algo_mask (const char *algo_str);
|
||||
extern unsigned int parse_num_arg (const char *arg, const char *arg_name);
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Mocks */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
void create_token_script(char *fname)
|
||||
{
|
||||
char command[128] = {'\0'};
|
||||
FILE *fp = fopen(fname, "w");
|
||||
assert_non_null(fp);
|
||||
fprintf(fp, "%s", "printf secure-token-$1-$2");
|
||||
fclose(fp);
|
||||
sprintf(command, "chmod +x %s",fname);
|
||||
system(command);
|
||||
}
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Tests */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
void test_setParodusConfig()
|
||||
{
|
||||
ParodusCfg cfg;
|
||||
memset(&cfg,0,sizeof(cfg));
|
||||
|
||||
strcpy(cfg.hw_model, "TG1682");
|
||||
strcpy(cfg.hw_serial_number, "Fer23u948590");
|
||||
strcpy(cfg.hw_manufacturer , "ARRISGroup,Inc.");
|
||||
strcpy(cfg.hw_mac , "123567892366");
|
||||
strcpy(cfg.hw_last_reboot_reason , "unknown");
|
||||
strcpy(cfg.fw_name , "2.364s2");
|
||||
strcpy(cfg.webpa_path_url , "/v1");
|
||||
strcpy(cfg.webpa_url , "localhost");
|
||||
strcpy(cfg.webpa_interface_used , "eth0");
|
||||
strcpy(cfg.webpa_protocol , "WebPA-1.6");
|
||||
strcpy(cfg.webpa_uuid , "1234567-345456546");
|
||||
strcpy(cfg.partner_id , "comcast");
|
||||
strcpy(cfg.seshat_url, "ipc://tmp/seshat_service.url");
|
||||
cfg.secureFlag = 1;
|
||||
parStrncpy(cfg.hw_model, "TG1682", sizeof(cfg.hw_model));
|
||||
parStrncpy(cfg.hw_serial_number, "Fer23u948590", sizeof(cfg.hw_serial_number));
|
||||
parStrncpy(cfg.hw_manufacturer , "ARRISGroup,Inc.", sizeof(cfg.hw_manufacturer));
|
||||
parStrncpy(cfg.hw_mac , "123567892366", sizeof(cfg.hw_mac));
|
||||
parStrncpy(cfg.hw_last_reboot_reason , "unknown", sizeof(cfg.hw_last_reboot_reason));
|
||||
parStrncpy(cfg.fw_name , "2.364s2", sizeof(cfg.fw_name));
|
||||
parStrncpy(cfg.webpa_path_url , "/v1", sizeof(cfg.webpa_path_url));
|
||||
parStrncpy(cfg.webpa_url , "http://127.0.0.1", sizeof(cfg.webpa_url));
|
||||
parStrncpy(cfg.webpa_interface_used , "eth0", sizeof(cfg.webpa_interface_used));
|
||||
parStrncpy(cfg.webpa_protocol , "WebPA-1.6", sizeof(cfg.webpa_protocol));
|
||||
parStrncpy(cfg.webpa_uuid , "1234567-345456546", sizeof(cfg.webpa_uuid));
|
||||
parStrncpy(cfg.partner_id , "mycom", sizeof(cfg.partner_id));
|
||||
#ifdef ENABLE_SESHAT
|
||||
parStrncpy(cfg.seshat_url, "ipc://tmp/seshat_service.url", sizeof(cfg.seshat_url));
|
||||
#endif
|
||||
cfg.flags = 0;
|
||||
cfg.boot_time = 423457;
|
||||
cfg.webpa_ping_timeout = 30;
|
||||
cfg.webpa_backoff_max = 255;
|
||||
|
||||
set_parodus_cfg(&cfg);
|
||||
|
||||
ParodusCfg *temp = get_parodus_cfg();
|
||||
#ifdef FEATURE_DNS_QUERY
|
||||
cfg.acquire_jwt = 1;
|
||||
parStrncpy(cfg.dns_txt_url, "test",sizeof(cfg.dns_txt_url));
|
||||
cfg.jwt_algo = 1025;
|
||||
parStrncpy(cfg.jwt_key, "key.txt",sizeof(cfg.jwt_key));
|
||||
#endif
|
||||
cfg.crud_config_file = strdup("parodus_cfg.json");
|
||||
set_parodus_cfg(&cfg);
|
||||
ParodusCfg *temp = get_parodus_cfg();
|
||||
|
||||
assert_string_equal(cfg.hw_model, temp->hw_model);
|
||||
assert_string_equal(cfg.hw_serial_number, temp->hw_serial_number);
|
||||
@@ -73,13 +98,20 @@ void test_setParodusConfig()
|
||||
assert_string_equal(cfg.webpa_protocol, temp->webpa_protocol);
|
||||
assert_string_equal(cfg.webpa_uuid, temp->webpa_uuid);
|
||||
assert_string_equal(cfg.partner_id, temp->partner_id);
|
||||
#ifdef ENABLE_SESHAT
|
||||
assert_string_equal(cfg.seshat_url, temp->seshat_url);
|
||||
|
||||
|
||||
assert_int_equal((int) cfg.secureFlag, (int) temp->secureFlag);
|
||||
#endif
|
||||
assert_int_equal((int) cfg.flags, (int) temp->flags);
|
||||
assert_int_equal((int) cfg.boot_time, (int) temp->boot_time);
|
||||
assert_int_equal((int) cfg.webpa_ping_timeout, (int) temp->webpa_ping_timeout);
|
||||
assert_int_equal((int) cfg.webpa_backoff_max, (int) temp->webpa_backoff_max);
|
||||
#ifdef FEATURE_DNS_QUERY
|
||||
assert_int_equal( (int) cfg.acquire_jwt, (int) temp->acquire_jwt);
|
||||
assert_string_equal(cfg.dns_txt_url, temp->dns_txt_url);
|
||||
assert_int_equal( (int) cfg.jwt_algo, (int) temp->jwt_algo);
|
||||
assert_string_equal(cfg.jwt_key, temp->jwt_key);
|
||||
#endif
|
||||
assert_string_equal(cfg.crud_config_file, temp->crud_config_file);
|
||||
}
|
||||
|
||||
void test_getParodusConfig()
|
||||
@@ -87,7 +119,7 @@ void test_getParodusConfig()
|
||||
ParodusCfg cfg;
|
||||
memset(&cfg,0,sizeof(cfg));
|
||||
|
||||
strcpy(cfg.hw_model, "TG1682133");
|
||||
parStrncpy(cfg.hw_model, "TG1682133",sizeof(cfg.hw_model));
|
||||
set_parodus_cfg(&cfg);
|
||||
|
||||
ParodusCfg *temp = get_parodus_cfg();
|
||||
@@ -95,33 +127,81 @@ void test_getParodusConfig()
|
||||
assert_string_equal(cfg.hw_model, temp->hw_model);
|
||||
}
|
||||
|
||||
static int open_output_file (const char *fname)
|
||||
{
|
||||
int fd = open(fname, O_WRONLY | O_CREAT, 0666);
|
||||
if (fd<0)
|
||||
{
|
||||
ParodusError ("File %s open error\n", fname);
|
||||
abort ();
|
||||
}
|
||||
return fd;
|
||||
}
|
||||
|
||||
void write_key_to_file (const char *fname, const char *buf)
|
||||
{
|
||||
ssize_t nbytes;
|
||||
ssize_t buflen = strlen (buf);
|
||||
int fd = open_output_file(fname);
|
||||
nbytes = write(fd, buf, buflen);
|
||||
if (nbytes < 0)
|
||||
{
|
||||
ParodusError ("Write file %s error\n", fname);
|
||||
close(fd);
|
||||
abort ();
|
||||
}
|
||||
close(fd);
|
||||
ParodusInfo ("%d bytes written\n", nbytes);
|
||||
}
|
||||
|
||||
void test_parseCommandLine()
|
||||
{
|
||||
int argc =K_argc;
|
||||
char * command[argc+1];
|
||||
int i = 0;
|
||||
char expectedToken[1280] = {'\0'};
|
||||
#ifdef FEATURE_DNS_QUERY
|
||||
const char *jwt_key = "AGdyuwyhwl2ow2ydsoioiygkshwdthuwd";
|
||||
#endif
|
||||
|
||||
command[i++] = "parodus";
|
||||
command[i++] = "--hw-model=TG1682";
|
||||
command[i++] = "--hw-serial-number=Fer23u948590";
|
||||
command[i++] = "--hw-manufacturer=ARRISGroup,Inc.";
|
||||
command[i++] = "--hw-mac=123567892366";
|
||||
command[i++] = "--hw-last-reboot-reason=unknown";
|
||||
command[i++] = "--fw-name=TG1682_DEV_master_2016000000sdy";
|
||||
command[i++] = "--webpa-ping-time=180";
|
||||
command[i++] = "--webpa-inteface-used=br0";
|
||||
command[i++] = "--webpa-url=localhost";
|
||||
command[i++] = "--webpa-backoff-max=0";
|
||||
command[i++] = "--boot-time=1234";
|
||||
command[i++] = "--parodus-local-url=tcp://127.0.0.1:6666";
|
||||
command[i++] = "--partner-id=cox";
|
||||
command[i++] = "--seshat-url=ipc://127.0.0.1:7777";
|
||||
command[i] = '\0';
|
||||
char *command[] = {"parodus",
|
||||
"--hw-model=TG1682",
|
||||
"--hw-serial-number=Fer23u948590",
|
||||
"--hw-manufacturer=ARRISGroup,Inc.",
|
||||
"--hw-mac=123567892366",
|
||||
"--hw-last-reboot-reason=unknown",
|
||||
"--fw-name=TG1682_DEV_master_2016000000sdy",
|
||||
"--webpa-ping-timeout=180",
|
||||
"--webpa-interface-used=br0",
|
||||
"--webpa-url=http://127.0.0.1",
|
||||
"--webpa-backoff-max=0",
|
||||
"--boot-time=1234",
|
||||
"--parodus-local-url=tcp://127.0.0.1:6666",
|
||||
"--partner-id=cox",
|
||||
#ifdef ENABLE_SESHAT
|
||||
"--seshat-url=ipc://127.0.0.1:7777",
|
||||
#endif
|
||||
"--force-ipv4",
|
||||
"--force-ipv6",
|
||||
"--token-read-script=/tmp/token.sh",
|
||||
"--token-acquisition-script=/tmp/token.sh",
|
||||
"--ssl-cert-path=/etc/ssl/certs/ca-certificates.crt",
|
||||
#ifdef FEATURE_DNS_QUERY
|
||||
"--acquire-jwt=1",
|
||||
"--dns-txt-url=mydns.mycom.net",
|
||||
"--jwt-public-key-file=../../tests/jwt_key.tst",
|
||||
"--jwt-algo=RS256",
|
||||
#endif
|
||||
"--crud-config-file=parodus_cfg.json",
|
||||
NULL
|
||||
};
|
||||
int argc = (sizeof (command) / sizeof (char *)) - 1;
|
||||
|
||||
ParodusCfg parodusCfg;
|
||||
memset(&parodusCfg,0,sizeof(parodusCfg));
|
||||
|
||||
parseCommandLine(argc,command,&parodusCfg);
|
||||
#ifdef FEATURE_DNS_QUERY
|
||||
write_key_to_file ("../../tests/jwt_key.tst", jwt_key);
|
||||
#endif
|
||||
create_token_script("/tmp/token.sh");
|
||||
assert_int_equal (parseCommandLine(argc,command,&parodusCfg), 0);
|
||||
|
||||
assert_string_equal( parodusCfg.hw_model, "TG1682");
|
||||
assert_string_equal( parodusCfg.hw_serial_number, "Fer23u948590");
|
||||
@@ -131,56 +211,115 @@ void test_parseCommandLine()
|
||||
assert_string_equal( parodusCfg.fw_name, "TG1682_DEV_master_2016000000sdy");
|
||||
assert_int_equal( (int) parodusCfg.webpa_ping_timeout,180);
|
||||
assert_string_equal( parodusCfg.webpa_interface_used, "br0");
|
||||
assert_string_equal( parodusCfg.webpa_url, "localhost");
|
||||
assert_string_equal( parodusCfg.webpa_url, "http://127.0.0.1");
|
||||
assert_int_equal( (int) parodusCfg.webpa_backoff_max,0);
|
||||
assert_int_equal( (int) parodusCfg.boot_time,1234);
|
||||
assert_string_equal( parodusCfg.local_url,"tcp://127.0.0.1:6666");
|
||||
assert_string_equal( parodusCfg.partner_id,"cox");
|
||||
#ifdef ENABLE_SESHAT
|
||||
assert_string_equal( parodusCfg.seshat_url, "ipc://127.0.0.1:7777");
|
||||
|
||||
#endif
|
||||
assert_int_equal( (int) parodusCfg.flags, FLAGS_IPV6_ONLY|FLAGS_IPV4_ONLY);
|
||||
sprintf(expectedToken,"secure-token-%s-%s",parodusCfg.hw_serial_number,parodusCfg.hw_mac);
|
||||
getAuthToken(&parodusCfg);
|
||||
set_parodus_cfg(&parodusCfg);
|
||||
|
||||
assert_string_equal( get_parodus_cfg()->webpa_auth_token,expectedToken);
|
||||
assert_string_equal( parodusCfg.cert_path,"/etc/ssl/certs/ca-certificates.crt");
|
||||
#ifdef FEATURE_DNS_QUERY
|
||||
assert_int_equal( (int) parodusCfg.acquire_jwt, 1);
|
||||
assert_string_equal(parodusCfg.dns_txt_url, "mydns.mycom.net");
|
||||
assert_int_equal( (int) parodusCfg.jwt_algo, 1024);
|
||||
assert_string_equal ( get_parodus_cfg()->jwt_key, jwt_key);
|
||||
#endif
|
||||
assert_string_equal(parodusCfg.crud_config_file, "parodus_cfg.json");
|
||||
}
|
||||
|
||||
void test_parseCommandLineNull()
|
||||
{
|
||||
parseCommandLine(0,NULL,NULL);
|
||||
assert_int_equal (parseCommandLine(0,NULL,NULL), -1);
|
||||
}
|
||||
|
||||
void err_parseCommandLine()
|
||||
{
|
||||
int argc =K_argc;
|
||||
char * command[20]={'\0'};
|
||||
|
||||
command[0] = "parodus";
|
||||
command[1] = "--hw-model=TG1682";
|
||||
command[12] = "webpa";
|
||||
|
||||
int argc;
|
||||
char *command[] = {"parodus",
|
||||
"--hw-model=TG1682",
|
||||
"--hw-serial-number=Fer23u948590",
|
||||
"-Z",
|
||||
"--nosuch",
|
||||
"--hw-mac=123567892366",
|
||||
"webpa",
|
||||
NULL
|
||||
};
|
||||
ParodusCfg parodusCfg;
|
||||
|
||||
memset(&parodusCfg,0,sizeof(parodusCfg));
|
||||
|
||||
parseCommandLine(argc,command,&parodusCfg);
|
||||
assert_string_equal( parodusCfg.hw_model, "");
|
||||
assert_string_equal( parodusCfg.hw_serial_number, "");
|
||||
argc = (sizeof (command) / sizeof (char *)) - 1;
|
||||
// Missing webpa_url
|
||||
assert_int_equal (parseCommandLine(argc,command,&parodusCfg), -1);
|
||||
// Bad webpa_url
|
||||
command[5] = "--webpa-url=127.0.0.1";
|
||||
assert_int_equal (parseCommandLine(argc,command,&parodusCfg), -1);
|
||||
// Bad mac address
|
||||
command[5] = "--hw-mac=1235678923";
|
||||
assert_int_equal (parseCommandLine(argc,command,&parodusCfg), -1);
|
||||
command[5] = "--webpa-ping-timeout=123x";
|
||||
assert_int_equal (parseCommandLine(argc,command,&parodusCfg), -1);
|
||||
command[5] = "--webpa-backoff-max=";
|
||||
assert_int_equal (parseCommandLine(argc,command,&parodusCfg), -1);
|
||||
command[5] = "--boot-time=12x";
|
||||
assert_int_equal (parseCommandLine(argc,command,&parodusCfg), -1);
|
||||
#ifdef FEATURE_DNS_QUERY
|
||||
command[5] = "--webpa-url=https://127.0.0.1";
|
||||
command[3] = "--acquire-jwt=1";
|
||||
command[4] = "--dns-txt-url=mydns.mycom.net";
|
||||
// missing algo
|
||||
assert_int_equal (parseCommandLine(argc,command,&parodusCfg), -1);
|
||||
command[4] = "--jwt-algo=none:RS256";
|
||||
// disallowed alogrithm none
|
||||
assert_int_equal (parseCommandLine(argc,command,&parodusCfg), -1);
|
||||
command[4] = "--jwt-algo=RS256";
|
||||
// missing jwt public key file
|
||||
assert_int_equal (parseCommandLine(argc,command,&parodusCfg), -1);
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
void test_loadParodusCfg()
|
||||
{
|
||||
ParodusCfg tmpcfg;
|
||||
ParodusCfg *Cfg;
|
||||
ParodusCfg *Cfg = NULL;
|
||||
Cfg = (ParodusCfg*)malloc(sizeof(ParodusCfg));
|
||||
char protocol[32] = {'\0'};
|
||||
|
||||
strcpy(Cfg->hw_model, "TG1682");
|
||||
strcpy(Cfg->hw_serial_number, "Fer23u948590");
|
||||
strcpy(Cfg->hw_manufacturer , "ARRISGroup,Inc.");
|
||||
strcpy(Cfg->hw_mac , "123567892366");
|
||||
strcpy(Cfg->hw_last_reboot_reason , "unknown");
|
||||
strcpy(Cfg->fw_name , "2.364s2");
|
||||
strcpy(Cfg->webpa_path_url , "/v1");
|
||||
strcpy(Cfg->webpa_url , "localhost");
|
||||
strcpy(Cfg->webpa_interface_used , "eth0");
|
||||
strcpy(Cfg->webpa_protocol , "WebPA-1.6");
|
||||
strcpy(Cfg->local_url , "tcp://10.0.0.1:6000");
|
||||
strcpy(Cfg->partner_id , "shaw");
|
||||
|
||||
parStrncpy(Cfg->hw_model, "TG1682", sizeof(Cfg->hw_model));
|
||||
parStrncpy(Cfg->hw_serial_number, "Fer23u948590", sizeof(Cfg->hw_serial_number));
|
||||
parStrncpy(Cfg->hw_manufacturer , "ARRISGroup,Inc.", sizeof(Cfg->hw_manufacturer));
|
||||
parStrncpy(Cfg->hw_mac , "123567892366", sizeof(Cfg->hw_mac));
|
||||
parStrncpy(Cfg->hw_last_reboot_reason , "unknown", sizeof(Cfg->hw_last_reboot_reason));
|
||||
parStrncpy(Cfg->fw_name , "2.364s2", sizeof(Cfg->fw_name));
|
||||
parStrncpy(Cfg->webpa_path_url , "/v1", sizeof(Cfg->webpa_path_url));
|
||||
parStrncpy(Cfg->webpa_url , "http://127.0.0.1", sizeof(Cfg->webpa_url));
|
||||
parStrncpy(Cfg->webpa_interface_used , "eth0", sizeof(Cfg->webpa_interface_used));
|
||||
snprintf(protocol, sizeof(protocol), "%s-%s", PROTOCOL_VALUE, GIT_COMMIT_TAG);
|
||||
parStrncpy(Cfg->webpa_protocol , protocol, sizeof(Cfg->webpa_protocol));
|
||||
parStrncpy(Cfg->local_url , "tcp://10.0.0.1:6000", sizeof(Cfg->local_url));
|
||||
parStrncpy(Cfg->partner_id , "shaw", sizeof(Cfg->partner_id));
|
||||
#ifdef FEATURE_DNS_QUERY
|
||||
Cfg->acquire_jwt = 1;
|
||||
parStrncpy(Cfg->dns_txt_url, "mydns",sizeof(Cfg->dns_txt_url));
|
||||
Cfg->jwt_algo = 1025;
|
||||
parStrncpy(Cfg->jwt_key, "AGdyuwyhwl2ow2ydsoioiygkshwdthuwd",sizeof(Cfg->jwt_key));
|
||||
#endif
|
||||
parStrncpy(Cfg->token_acquisition_script , "/tmp/token.sh", sizeof(Cfg->token_acquisition_script));
|
||||
parStrncpy(Cfg->token_read_script , "/tmp/token.sh", sizeof(Cfg->token_read_script));
|
||||
parStrncpy(Cfg->cert_path, "/etc/ssl.crt",sizeof(Cfg->cert_path));
|
||||
#ifdef ENABLE_SESHAT
|
||||
parStrncpy(Cfg->seshat_url, "ipc://tmp/seshat_service.url", sizeof(Cfg->seshat_url));
|
||||
#endif
|
||||
Cfg->crud_config_file = strdup("parodus_cfg.json");
|
||||
memset(&tmpcfg,0,sizeof(ParodusCfg));
|
||||
loadParodusCfg(Cfg,&tmpcfg);
|
||||
|
||||
@@ -190,6 +329,20 @@ void test_loadParodusCfg()
|
||||
assert_string_equal( tmpcfg.hw_mac, "123567892366");
|
||||
assert_string_equal( tmpcfg.local_url, "tcp://10.0.0.1:6000");
|
||||
assert_string_equal( tmpcfg.partner_id, "shaw");
|
||||
assert_string_equal( tmpcfg.webpa_protocol, protocol);
|
||||
#ifdef FEATURE_DNS_QUERY
|
||||
assert_int_equal( (int) tmpcfg.acquire_jwt, 1);
|
||||
assert_string_equal(tmpcfg.dns_txt_url, "mydns");
|
||||
assert_int_equal( (int) tmpcfg.jwt_algo, 1025);
|
||||
assert_string_equal(tmpcfg.jwt_key, "AGdyuwyhwl2ow2ydsoioiygkshwdthuwd");
|
||||
#endif
|
||||
assert_string_equal( tmpcfg.token_acquisition_script,"/tmp/token.sh");
|
||||
assert_string_equal( tmpcfg.token_read_script,"/tmp/token.sh");
|
||||
assert_string_equal(tmpcfg.cert_path, "/etc/ssl.crt");
|
||||
#ifdef ENABLE_SESHAT
|
||||
assert_string_equal(tmpcfg.seshat_url, "ipc://tmp/seshat_service.url");
|
||||
#endif
|
||||
assert_string_equal(tmpcfg.crud_config_file, "parodus_cfg.json");
|
||||
free(Cfg);
|
||||
}
|
||||
|
||||
@@ -206,12 +359,11 @@ void test_loadParodusCfgNull()
|
||||
assert_string_equal(temp.hw_model, "");
|
||||
assert_string_equal(temp.hw_serial_number, "");
|
||||
assert_string_equal(temp.hw_manufacturer, "");
|
||||
assert_int_equal( (int) temp.secureFlag,1);
|
||||
assert_int_equal( (int) temp.flags,0);
|
||||
assert_string_equal( temp.webpa_path_url, WEBPA_PATH_URL);
|
||||
assert_string_equal( temp.webpa_protocol, WEBPA_PROTOCOL_VALUE);
|
||||
assert_string_equal( temp.webpa_uuid,"1234567-345456546");
|
||||
assert_string_equal( temp.local_url, PARODUS_UPSTREAM);
|
||||
|
||||
assert_null(temp.crud_config_file);
|
||||
free(cfg);
|
||||
}
|
||||
|
||||
@@ -221,6 +373,128 @@ void err_loadParodusCfg()
|
||||
loadParodusCfg(NULL,&cfg);
|
||||
}
|
||||
|
||||
void test_parodusGitVersion()
|
||||
{
|
||||
FILE *fp;
|
||||
char version[32] = {'\0'};
|
||||
char *command = "git describe --tags --always";
|
||||
int n;
|
||||
size_t len;
|
||||
fp = popen(command,"r");
|
||||
while(fgets(version, 32, fp) !=NULL)
|
||||
{
|
||||
len = strlen(version);
|
||||
if (len > 0 && version[len-1] == '\n')
|
||||
{
|
||||
version[--len] = '\0';
|
||||
}
|
||||
}
|
||||
pclose(fp);
|
||||
|
||||
printf ("version: %s\n", version);
|
||||
printf ("GIT_COMMIT_TAG: %s\n", GIT_COMMIT_TAG);
|
||||
n = strcmp( version, GIT_COMMIT_TAG);
|
||||
assert_int_equal(n, 0);
|
||||
}
|
||||
|
||||
void test_setDefaultValuesToCfg()
|
||||
{
|
||||
ParodusCfg *cfg = (ParodusCfg *) malloc(sizeof(ParodusCfg));
|
||||
memset(cfg,0,sizeof(ParodusCfg));
|
||||
setDefaultValuesToCfg(cfg);
|
||||
assert_string_equal( cfg->local_url, PARODUS_UPSTREAM);
|
||||
#ifdef FEATURE_DNS_QUERY
|
||||
assert_int_equal(cfg->acquire_jwt, 0);
|
||||
assert_string_equal(cfg->dns_txt_url, DNS_TXT_URL);
|
||||
assert_string_equal(cfg->jwt_key, "\0");
|
||||
assert_int_equal( (int)cfg->jwt_algo, 0);
|
||||
#endif
|
||||
assert_string_equal(cfg->cert_path, "\0");
|
||||
assert_int_equal((int)cfg->flags, 0);
|
||||
assert_string_equal(cfg->webpa_path_url, WEBPA_PATH_URL);
|
||||
assert_string_equal(cfg->webpa_uuid, "1234567-345456546");
|
||||
}
|
||||
|
||||
void err_setDefaultValuesToCfg()
|
||||
{
|
||||
setDefaultValuesToCfg(NULL);
|
||||
}
|
||||
|
||||
void test_parse_num_arg ()
|
||||
{
|
||||
assert_int_equal (parse_num_arg ("1234", "1234"), 1234);
|
||||
assert_int_equal (parse_num_arg ("1", "1"), 1);
|
||||
assert_int_equal (parse_num_arg ("0", "0"), 0);
|
||||
assert_true (parse_num_arg ("", "empty arg") == (unsigned int) -1);
|
||||
assert_true (parse_num_arg ("0x", "non-num arg") == (unsigned int) -1);
|
||||
|
||||
}
|
||||
|
||||
void test_parse_mac_address ()
|
||||
{
|
||||
char result[14];
|
||||
assert_int_equal (parse_mac_address (result, "aabbccddeeff"), 0);
|
||||
assert_string_equal (result, "aabbccddeeff");
|
||||
assert_int_equal (parse_mac_address (result, "aa:bb:cc:dd:ee:ff"), 0);
|
||||
assert_string_equal (result, "aabbccddeeff");
|
||||
assert_int_equal (parse_mac_address (result, "aabbccddeeff0"), -1);
|
||||
assert_int_equal (parse_mac_address (result, "aa:bb:c:dd:ee:ff:00"), -1);
|
||||
assert_int_equal (parse_mac_address (result, ""), -1);
|
||||
}
|
||||
|
||||
void test_server_is_http ()
|
||||
{
|
||||
const char *server_ptr;
|
||||
assert_int_equal (server_is_http ("https://127.0.0.1", &server_ptr), 0);
|
||||
assert_string_equal (server_ptr, "127.0.0.1");
|
||||
assert_int_equal (server_is_http ("http://127.0.0.1", &server_ptr), 1);
|
||||
assert_string_equal (server_ptr, "127.0.0.1");
|
||||
assert_int_equal (server_is_http ("127.0.0.1", &server_ptr), -1);
|
||||
|
||||
}
|
||||
|
||||
void test_parse_webpa_url ()
|
||||
{
|
||||
char addr_buf[80];
|
||||
char port_buf[8];
|
||||
assert_int_equal (parse_webpa_url ("mydns.mycom.net:8080",
|
||||
addr_buf, 80, port_buf, 8), -1);
|
||||
assert_int_equal (parse_webpa_url ("https://mydns.mycom.net:8080",
|
||||
addr_buf, 80, port_buf, 8), 0);
|
||||
assert_string_equal (addr_buf, "mydns.mycom.net");
|
||||
assert_string_equal (port_buf, "8080");
|
||||
assert_int_equal (parse_webpa_url ("https://mydns.mycom.net/",
|
||||
addr_buf, 80, port_buf, 8), 0);
|
||||
assert_string_equal (addr_buf, "mydns.mycom.net");
|
||||
assert_string_equal (port_buf, "443");
|
||||
assert_int_equal (parse_webpa_url ("https://mydns.mycom.net/api/v2/",
|
||||
addr_buf, 80, port_buf, 8), 0);
|
||||
assert_string_equal (addr_buf, "mydns.mycom.net");
|
||||
assert_string_equal (port_buf, "443");
|
||||
assert_int_equal (parse_webpa_url ("http://mydns.mycom.net:8080",
|
||||
addr_buf, 80, port_buf, 8), 1);
|
||||
assert_string_equal (addr_buf, "mydns.mycom.net");
|
||||
assert_string_equal (port_buf, "8080");
|
||||
assert_int_equal (parse_webpa_url ("http://mydns.mycom.net",
|
||||
addr_buf, 80, port_buf, 8), 1);
|
||||
assert_string_equal (addr_buf, "mydns.mycom.net");
|
||||
assert_string_equal (port_buf, "80");
|
||||
|
||||
}
|
||||
|
||||
void test_get_algo_mask ()
|
||||
{
|
||||
assert_true (get_algo_mask ("RS256:RS512") == 5120);
|
||||
assert_true (get_algo_mask ("none:RS256") == (unsigned int) -1);
|
||||
assert_true (get_algo_mask ("nosuch") == (unsigned int) -1);
|
||||
#if ALLOW_NON_RSA_ALG
|
||||
assert_true (get_algo_mask ("ES256:RS256") == 1026);
|
||||
#else
|
||||
assert_true (get_algo_mask ("ES256:RS256") == (unsigned int) -1);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* External Functions */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
@@ -233,9 +507,17 @@ int main(void)
|
||||
cmocka_unit_test(test_loadParodusCfg),
|
||||
cmocka_unit_test(test_loadParodusCfgNull),
|
||||
cmocka_unit_test(err_loadParodusCfg),
|
||||
cmocka_unit_test(test_parse_num_arg),
|
||||
cmocka_unit_test(test_parse_mac_address),
|
||||
cmocka_unit_test(test_get_algo_mask),
|
||||
cmocka_unit_test(test_server_is_http),
|
||||
cmocka_unit_test(test_parse_webpa_url),
|
||||
cmocka_unit_test(test_parseCommandLine),
|
||||
cmocka_unit_test(test_parseCommandLineNull),
|
||||
cmocka_unit_test(err_parseCommandLine),
|
||||
cmocka_unit_test(test_parodusGitVersion),
|
||||
cmocka_unit_test(test_setDefaultValuesToCfg),
|
||||
cmocka_unit_test(err_setDefaultValuesToCfg),
|
||||
};
|
||||
|
||||
return cmocka_run_group_tests(tests, NULL, NULL);
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
#include "../src/conn_interface.h"
|
||||
#include "../src/connection.h"
|
||||
#include "../src/config.h"
|
||||
#include "../src/heartBeat.h"
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* File Scoped Variables */
|
||||
@@ -34,7 +35,11 @@
|
||||
UpStreamMsg *UpStreamMsgQ;
|
||||
ParodusMsg *ParodusMsgQ;
|
||||
extern bool close_retry;
|
||||
extern volatile unsigned int heartBeatTimer;
|
||||
extern pthread_mutex_t close_mut;
|
||||
pthread_mutex_t nano_mut;
|
||||
pthread_cond_t nano_con;
|
||||
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Mocks */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
@@ -106,6 +111,12 @@ void set_global_reconnect_reason(char *reason)
|
||||
function_called();
|
||||
}
|
||||
|
||||
void set_global_reconnect_status(bool status)
|
||||
{
|
||||
(void)status;
|
||||
function_called();
|
||||
}
|
||||
|
||||
void close_and_unref_connection(noPollConn *conn)
|
||||
{
|
||||
UNUSED(conn);
|
||||
@@ -150,6 +161,40 @@ void initKeypress()
|
||||
{
|
||||
function_called();
|
||||
}
|
||||
|
||||
UpStreamMsg * get_global_UpStreamMsgQ(void)
|
||||
{
|
||||
return UpStreamMsgQ;
|
||||
}
|
||||
|
||||
void set_global_UpStreamMsgQ(UpStreamMsg * UpStreamQ)
|
||||
{
|
||||
UpStreamMsgQ = UpStreamQ;
|
||||
}
|
||||
|
||||
pthread_cond_t *get_global_nano_con(void)
|
||||
{
|
||||
return &nano_con;
|
||||
}
|
||||
|
||||
pthread_mutex_t *get_global_nano_mut(void)
|
||||
{
|
||||
return &nano_mut;
|
||||
}
|
||||
|
||||
/*
|
||||
* Mock func to calculate time diff between start and stop time
|
||||
* This timespec_diff retuns 1 sec as diff time
|
||||
*/
|
||||
void timespec_diff(struct timespec *start, struct timespec *stop,
|
||||
struct timespec *diff)
|
||||
{
|
||||
UNUSED(start);
|
||||
UNUSED(stop);
|
||||
diff->tv_sec = 1;
|
||||
diff->tv_nsec = 1000;
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Tests */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
@@ -160,7 +205,9 @@ void test_createSocketConnection()
|
||||
ParodusCfg cfg;
|
||||
memset(&cfg,0,sizeof(ParodusCfg));
|
||||
|
||||
pthread_mutex_lock (&close_mut);
|
||||
close_retry = false;
|
||||
pthread_mutex_unlock (&close_mut);
|
||||
expect_function_call(nopoll_thread_handlers);
|
||||
|
||||
will_return(nopoll_ctx_new, (intptr_t)&ctx);
|
||||
@@ -170,13 +217,14 @@ void test_createSocketConnection()
|
||||
expect_function_call(createNopollConnection);
|
||||
expect_function_call(packMetaData);
|
||||
|
||||
expect_function_calls(StartThread, 4);
|
||||
expect_function_calls(StartThread, 5);
|
||||
expect_function_call(initKeypress);
|
||||
will_return(nopoll_loop_wait, 1);
|
||||
expect_function_call(nopoll_loop_wait);
|
||||
|
||||
expect_function_call(set_global_reconnect_reason);
|
||||
will_return(get_global_conn, (intptr_t)NULL);
|
||||
expect_function_call(set_global_reconnect_status);
|
||||
expect_function_call(get_global_conn);
|
||||
expect_function_call(close_and_unref_connection);
|
||||
expect_function_call(set_global_conn);
|
||||
@@ -187,7 +235,7 @@ void test_createSocketConnection()
|
||||
expect_function_call(close_and_unref_connection);
|
||||
expect_function_call(nopoll_ctx_unref);
|
||||
expect_function_call(nopoll_cleanup_library);
|
||||
createSocketConnection(&cfg,initKeypress);
|
||||
createSocketConnection(initKeypress);
|
||||
}
|
||||
|
||||
void test_createSocketConnection1()
|
||||
@@ -195,7 +243,9 @@ void test_createSocketConnection1()
|
||||
noPollCtx *ctx;
|
||||
ParodusCfg cfg;
|
||||
memset(&cfg,0, sizeof(ParodusCfg));
|
||||
pthread_mutex_lock (&close_mut);
|
||||
close_retry = true;
|
||||
pthread_mutex_unlock (&close_mut);
|
||||
expect_function_call(nopoll_thread_handlers);
|
||||
|
||||
will_return(nopoll_ctx_new, (intptr_t)&ctx);
|
||||
@@ -205,7 +255,7 @@ void test_createSocketConnection1()
|
||||
expect_function_call(createNopollConnection);
|
||||
expect_function_call(packMetaData);
|
||||
|
||||
expect_function_calls(StartThread, 4);
|
||||
expect_function_calls(StartThread, 5);
|
||||
will_return(nopoll_loop_wait, 1);
|
||||
expect_function_call(nopoll_loop_wait);
|
||||
|
||||
@@ -220,29 +270,33 @@ void test_createSocketConnection1()
|
||||
expect_function_call(close_and_unref_connection);
|
||||
expect_function_call(nopoll_ctx_unref);
|
||||
expect_function_call(nopoll_cleanup_library);
|
||||
createSocketConnection(&cfg,NULL);
|
||||
createSocketConnection(NULL);
|
||||
|
||||
}
|
||||
|
||||
void test_createSocketConnection2()
|
||||
void test_PingMissIntervalTime()
|
||||
{
|
||||
noPollCtx *ctx;
|
||||
ParodusCfg cfg;
|
||||
memset(&cfg,0,sizeof(ParodusCfg));
|
||||
strcpy(cfg.hw_model, "TG1682");
|
||||
strcpy(cfg.hw_serial_number, "Fer23u948590");
|
||||
strcpy(cfg.hw_manufacturer , "ARRISGroup,Inc.");
|
||||
strcpy(cfg.hw_mac , "123567892366");
|
||||
strcpy(cfg.hw_last_reboot_reason , "unknown");
|
||||
strcpy(cfg.fw_name , "2.364s2");
|
||||
strcpy(cfg.webpa_path_url , "/v1");
|
||||
strcpy(cfg.webpa_url , "localhost");
|
||||
strcpy(cfg.webpa_interface_used , "eth0");
|
||||
strcpy(cfg.webpa_protocol , "WebPA-1.6");
|
||||
strcpy(cfg.webpa_uuid , "1234567-345456546");
|
||||
cfg.webpa_ping_timeout = 1;
|
||||
parStrncpy(cfg.hw_model, "TG1682", sizeof(cfg.hw_model));
|
||||
parStrncpy(cfg.hw_serial_number, "Fer23u948590", sizeof(cfg.hw_serial_number));
|
||||
parStrncpy(cfg.hw_manufacturer , "ARRISGroup,Inc.", sizeof(cfg.hw_manufacturer));
|
||||
parStrncpy(cfg.hw_mac , "123567892366", sizeof(cfg.hw_mac));
|
||||
parStrncpy(cfg.hw_last_reboot_reason , "unknown", sizeof(cfg.hw_last_reboot_reason));
|
||||
parStrncpy(cfg.fw_name , "2.364s2", sizeof(cfg.fw_name));
|
||||
parStrncpy(cfg.webpa_path_url , "/v1", sizeof(cfg.webpa_path_url));
|
||||
parStrncpy(cfg.webpa_url , "localhost", sizeof(cfg.webpa_url));
|
||||
parStrncpy(cfg.webpa_interface_used , "eth0", sizeof(cfg.webpa_interface_used));
|
||||
parStrncpy(cfg.webpa_protocol , "WebPA-1.6", sizeof(cfg.webpa_protocol));
|
||||
parStrncpy(cfg.webpa_uuid , "1234567-345456546", sizeof(cfg.webpa_uuid));
|
||||
//Max ping timeout is 6 sec
|
||||
cfg.webpa_ping_timeout = 6;
|
||||
set_parodus_cfg(&cfg);
|
||||
|
||||
pthread_mutex_lock (&close_mut);
|
||||
close_retry = false;
|
||||
pthread_mutex_unlock (&close_mut);
|
||||
expect_function_call(nopoll_thread_handlers);
|
||||
|
||||
will_return(nopoll_ctx_new, (intptr_t)&ctx);
|
||||
@@ -252,7 +306,8 @@ void test_createSocketConnection2()
|
||||
expect_function_call(createNopollConnection);
|
||||
expect_function_call(packMetaData);
|
||||
|
||||
expect_function_calls(StartThread, 4);
|
||||
expect_function_calls(StartThread, 5);
|
||||
//Increment ping interval time to 1 sec for each nopoll_loop_wait call
|
||||
will_return(nopoll_loop_wait, 1);
|
||||
will_return(nopoll_loop_wait, 1);
|
||||
will_return(nopoll_loop_wait, 1);
|
||||
@@ -261,9 +316,10 @@ void test_createSocketConnection2()
|
||||
will_return(nopoll_loop_wait, 1);
|
||||
will_return(nopoll_loop_wait, 1);
|
||||
expect_function_calls(nopoll_loop_wait, 7);
|
||||
|
||||
//Expecting Ping miss after 6 sec
|
||||
expect_function_call(set_global_reconnect_reason);
|
||||
will_return(get_global_conn, (intptr_t)NULL);
|
||||
expect_function_call(set_global_reconnect_status);
|
||||
expect_function_call(get_global_conn);
|
||||
expect_function_call(close_and_unref_connection);
|
||||
expect_function_call(set_global_conn);
|
||||
@@ -274,13 +330,16 @@ void test_createSocketConnection2()
|
||||
expect_function_call(close_and_unref_connection);
|
||||
expect_function_call(nopoll_ctx_unref);
|
||||
expect_function_call(nopoll_cleanup_library);
|
||||
createSocketConnection(&cfg,NULL);
|
||||
createSocketConnection(NULL);
|
||||
|
||||
}
|
||||
|
||||
void err_createSocketConnection()
|
||||
{
|
||||
pthread_mutex_lock (&close_mut);
|
||||
close_retry = true;
|
||||
heartBeatTimer = 0;
|
||||
pthread_mutex_unlock (&close_mut);
|
||||
reset_heartBeatTimer();
|
||||
expect_function_call(nopoll_thread_handlers);
|
||||
|
||||
will_return(nopoll_ctx_new, (intptr_t)NULL);
|
||||
@@ -290,7 +349,7 @@ void err_createSocketConnection()
|
||||
expect_function_call(createNopollConnection);
|
||||
expect_function_call(packMetaData);
|
||||
|
||||
expect_function_calls(StartThread, 4);
|
||||
expect_function_calls(StartThread, 5);
|
||||
will_return(nopoll_loop_wait, 1);
|
||||
expect_function_call(nopoll_loop_wait);
|
||||
|
||||
@@ -305,7 +364,7 @@ void err_createSocketConnection()
|
||||
expect_function_call(close_and_unref_connection);
|
||||
expect_function_call(nopoll_ctx_unref);
|
||||
expect_function_call(nopoll_cleanup_library);
|
||||
createSocketConnection(NULL,NULL);
|
||||
createSocketConnection(NULL);
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
@@ -317,7 +376,7 @@ int main(void)
|
||||
const struct CMUnitTest tests[] = {
|
||||
cmocka_unit_test(test_createSocketConnection),
|
||||
cmocka_unit_test(test_createSocketConnection1),
|
||||
cmocka_unit_test(test_createSocketConnection2),
|
||||
cmocka_unit_test(test_PingMissIntervalTime),
|
||||
cmocka_unit_test(err_createSocketConnection),
|
||||
};
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
395
tests/test_crud_interface.c
Normal file
395
tests/test_crud_interface.c
Normal file
@@ -0,0 +1,395 @@
|
||||
/**
|
||||
* Copyright 2010-2016 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
#include <assert.h>
|
||||
#include <errno.h>
|
||||
#include <pthread.h>
|
||||
#include <malloc.h>
|
||||
#include <stdarg.h>
|
||||
#include <stddef.h>
|
||||
#include <setjmp.h>
|
||||
#include <cmocka.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <wrp-c.h>
|
||||
#include "../src/crud_interface.h"
|
||||
#include "../src/config.h"
|
||||
#include "../src/client_list.h"
|
||||
#include "../src/ParodusInternal.h"
|
||||
#include "../src/partners_check.h"
|
||||
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* File Scoped Variables */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
extern CrudMsg *crudMsgQ;
|
||||
int numLoops = 1;
|
||||
wrp_msg_t *temp = NULL;
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Mocks */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
char * get_global_UpStreamMsgQ(void)
|
||||
{
|
||||
function_called();
|
||||
return (char *)mock();
|
||||
}
|
||||
|
||||
int set_global_UpStreamMsgQ(void)
|
||||
{
|
||||
function_called();
|
||||
return (int)mock();
|
||||
}
|
||||
|
||||
int get_global_nano_con(void)
|
||||
{
|
||||
function_called();
|
||||
return (int)mock();
|
||||
}
|
||||
|
||||
int get_global_nano_mut(void)
|
||||
{
|
||||
function_called();
|
||||
return (int)mock();
|
||||
}
|
||||
|
||||
char *get_global_reconnect_reason()
|
||||
{
|
||||
function_called();
|
||||
return (char *)(intptr_t)mock();
|
||||
}
|
||||
|
||||
ParodusCfg *get_parodus_cfg(void)
|
||||
{
|
||||
function_called();
|
||||
return (ParodusCfg*) (intptr_t)mock();
|
||||
}
|
||||
|
||||
int pthread_mutex_lock(pthread_mutex_t *restrict mutex)
|
||||
{
|
||||
UNUSED(mutex);
|
||||
function_called();
|
||||
return (int)mock();
|
||||
}
|
||||
|
||||
int pthread_mutex_unlock(pthread_mutex_t *restrict mutex)
|
||||
{
|
||||
UNUSED(mutex);
|
||||
function_called();
|
||||
return (int)mock();
|
||||
}
|
||||
|
||||
int pthread_cond_signal(pthread_cond_t *restrict cond)
|
||||
{
|
||||
UNUSED(cond);
|
||||
function_called();
|
||||
return (int)mock();
|
||||
}
|
||||
|
||||
int pthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex)
|
||||
{
|
||||
UNUSED(cond); UNUSED(mutex);
|
||||
function_called();
|
||||
return (int)mock();
|
||||
}
|
||||
|
||||
|
||||
int processCrudRequest(wrp_msg_t *reqMsg, wrp_msg_t **responseMsg )
|
||||
{
|
||||
UNUSED(reqMsg);
|
||||
wrp_msg_t *resp_msg = NULL;
|
||||
resp_msg = ( wrp_msg_t *)malloc( sizeof( wrp_msg_t ) );
|
||||
memset(resp_msg, 0, sizeof(wrp_msg_t));
|
||||
|
||||
resp_msg->msg_type = 5;
|
||||
resp_msg->u.crud.transaction_uuid = strdup("1234");
|
||||
resp_msg->u.crud.source = strdup("tag-update");
|
||||
resp_msg->u.crud.dest = strdup("mac:14xxx/parodus/tags");
|
||||
*responseMsg = resp_msg;
|
||||
function_called();
|
||||
return (int)mock();
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Tests */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
void test_addCRUDmsgToQueue()
|
||||
{
|
||||
|
||||
wrp_msg_t *crud_msg = NULL;
|
||||
crud_msg = ( wrp_msg_t *)malloc( sizeof( wrp_msg_t ) );
|
||||
memset(crud_msg, 0, sizeof(wrp_msg_t));
|
||||
|
||||
crud_msg->msg_type = 5;
|
||||
crud_msg->u.crud.transaction_uuid = strdup("bd4ad2d1-5c9c-486f-8e25-52c242b38f71");
|
||||
crud_msg->u.crud.source = strdup("tag-update");
|
||||
crud_msg->u.crud.dest = strdup("mac:14xxx/parodus/tags");
|
||||
|
||||
will_return(pthread_mutex_lock, 0);
|
||||
expect_function_call(pthread_mutex_lock);
|
||||
|
||||
will_return(pthread_mutex_unlock, 0);
|
||||
expect_function_call(pthread_mutex_unlock);
|
||||
|
||||
crudMsgQ = (CrudMsg *)malloc(sizeof(CrudMsg));
|
||||
crudMsgQ->msg = crud_msg;
|
||||
|
||||
crudMsgQ->next = (CrudMsg *) malloc(sizeof(CrudMsg));
|
||||
crudMsgQ->next->msg = crud_msg;
|
||||
crudMsgQ->next->next = NULL;
|
||||
|
||||
addCRUDmsgToQueue(crud_msg);
|
||||
|
||||
free(crudMsgQ->next);
|
||||
free(crudMsgQ);
|
||||
crudMsgQ = NULL;
|
||||
|
||||
wrp_free_struct(crud_msg);
|
||||
|
||||
}
|
||||
|
||||
|
||||
void test_addCRUDmsgToQueueNULL()
|
||||
{
|
||||
wrp_msg_t *crud_msg = NULL;
|
||||
crud_msg = ( wrp_msg_t *)malloc( sizeof( wrp_msg_t ) );
|
||||
memset(crud_msg, 0, sizeof(wrp_msg_t));
|
||||
|
||||
crud_msg->msg_type = 5;
|
||||
crud_msg->u.crud.transaction_uuid = strdup("bd4ad2d1-5c9c-486f-8e25-52c242b38f71");
|
||||
crud_msg->u.crud.source = strdup("tag-update");
|
||||
crud_msg->u.crud.dest = strdup("mac:14xxx/parodus/tags");
|
||||
|
||||
will_return(pthread_mutex_lock, 0);
|
||||
expect_function_call(pthread_mutex_lock);
|
||||
|
||||
will_return(pthread_cond_signal, 0);
|
||||
expect_function_call(pthread_cond_signal);
|
||||
|
||||
will_return(pthread_mutex_unlock, 0);
|
||||
expect_function_call(pthread_mutex_unlock);
|
||||
|
||||
addCRUDmsgToQueue(crud_msg);
|
||||
|
||||
free(crudMsgQ->next);
|
||||
free(crudMsgQ);
|
||||
crudMsgQ = NULL;
|
||||
wrp_free_struct(crud_msg);
|
||||
|
||||
}
|
||||
|
||||
void err_CRUDHandlerTask()
|
||||
{
|
||||
numLoops = 1;
|
||||
crudMsgQ = NULL;
|
||||
|
||||
will_return(pthread_mutex_lock, 0);
|
||||
expect_function_call(pthread_mutex_lock);
|
||||
|
||||
will_return(pthread_cond_wait, 0);
|
||||
expect_function_call(pthread_cond_wait);
|
||||
|
||||
will_return(pthread_mutex_unlock, 0);
|
||||
expect_function_call(pthread_mutex_unlock);
|
||||
|
||||
CRUDHandlerTask();
|
||||
}
|
||||
|
||||
|
||||
void test_CRUDHandlerTask()
|
||||
{
|
||||
numLoops = 1;
|
||||
wrp_msg_t *crud_msg = NULL;
|
||||
crud_msg = ( wrp_msg_t *)malloc( sizeof( wrp_msg_t ) );
|
||||
memset(crud_msg, 0, sizeof(wrp_msg_t));
|
||||
|
||||
crud_msg->msg_type = 5;
|
||||
crud_msg->u.crud.transaction_uuid = strdup("bd4ad2d1-5c9c-486f-8e25-52c242b38f71");
|
||||
crud_msg->u.crud.source = strdup("tag-update");
|
||||
crud_msg->u.crud.dest = strdup("mac:14xxx/parodus/tags");
|
||||
|
||||
crudMsgQ = (CrudMsg *)malloc(sizeof(CrudMsg));
|
||||
crudMsgQ->msg = crud_msg;
|
||||
crudMsgQ->next = NULL;
|
||||
|
||||
will_return(pthread_mutex_lock, 0);
|
||||
expect_function_call(pthread_mutex_lock);
|
||||
|
||||
will_return(pthread_mutex_unlock, 0);
|
||||
expect_function_call(pthread_mutex_unlock);
|
||||
|
||||
will_return(processCrudRequest, 0);
|
||||
expect_function_call(processCrudRequest);
|
||||
|
||||
will_return(get_global_nano_mut, 0);
|
||||
expect_function_call(get_global_nano_mut);
|
||||
|
||||
will_return(pthread_mutex_lock, 0);
|
||||
expect_function_call(pthread_mutex_lock);
|
||||
|
||||
will_return(get_global_UpStreamMsgQ, NULL);
|
||||
expect_function_call(get_global_UpStreamMsgQ);
|
||||
|
||||
will_return(set_global_UpStreamMsgQ, 0);
|
||||
expect_function_call(set_global_UpStreamMsgQ);
|
||||
|
||||
will_return(get_global_nano_con, 0);
|
||||
expect_function_call(get_global_nano_con);
|
||||
|
||||
will_return(pthread_cond_signal, 0);
|
||||
expect_function_call(pthread_cond_signal);
|
||||
|
||||
will_return(get_global_nano_mut, 0);
|
||||
expect_function_call(get_global_nano_mut);
|
||||
|
||||
will_return(pthread_mutex_unlock, 0);
|
||||
expect_function_call(pthread_mutex_unlock);
|
||||
|
||||
CRUDHandlerTask();
|
||||
|
||||
free(crudMsgQ);
|
||||
|
||||
}
|
||||
|
||||
void test_CRUDHandlerTaskFailure()
|
||||
{
|
||||
numLoops = 1;
|
||||
wrp_msg_t *crud_msg = NULL;
|
||||
|
||||
crud_msg = ( wrp_msg_t *)malloc( sizeof( wrp_msg_t ) );
|
||||
memset(crud_msg, 0, sizeof(wrp_msg_t));
|
||||
|
||||
crud_msg->msg_type = 5;
|
||||
crud_msg->u.crud.transaction_uuid = strdup("bd4ad2d1-5c9c-486f-8e25-52c242b38f71");
|
||||
crud_msg->u.crud.source = strdup("tag-update");
|
||||
crud_msg->u.crud.dest = strdup("mac:14xxx/parodus/tags");
|
||||
|
||||
crudMsgQ = (CrudMsg *)malloc(sizeof(CrudMsg));
|
||||
crudMsgQ->msg = crud_msg;
|
||||
crudMsgQ->next = NULL;
|
||||
|
||||
will_return(pthread_mutex_lock, 0);
|
||||
expect_function_call(pthread_mutex_lock);
|
||||
|
||||
will_return(pthread_mutex_unlock, 0);
|
||||
expect_function_call(pthread_mutex_unlock);
|
||||
|
||||
will_return(processCrudRequest, -1);
|
||||
expect_function_call(processCrudRequest);
|
||||
|
||||
|
||||
will_return(get_global_nano_mut, 0);
|
||||
expect_function_call(get_global_nano_mut);
|
||||
|
||||
will_return(pthread_mutex_lock, 0);
|
||||
expect_function_call(pthread_mutex_lock);
|
||||
|
||||
will_return(get_global_UpStreamMsgQ, 0);
|
||||
expect_function_call(get_global_UpStreamMsgQ);
|
||||
|
||||
will_return(set_global_UpStreamMsgQ, 0);
|
||||
expect_function_call(set_global_UpStreamMsgQ);
|
||||
|
||||
will_return(get_global_nano_con, 0);
|
||||
expect_function_call(get_global_nano_con);
|
||||
|
||||
will_return(pthread_cond_signal, 0);
|
||||
expect_function_call(pthread_cond_signal);
|
||||
|
||||
will_return(get_global_nano_mut, 0);
|
||||
expect_function_call(get_global_nano_mut);
|
||||
|
||||
will_return(pthread_mutex_unlock, 0);
|
||||
expect_function_call(pthread_mutex_unlock);
|
||||
|
||||
|
||||
CRUDHandlerTask();
|
||||
|
||||
free(crudMsgQ);
|
||||
|
||||
}
|
||||
|
||||
void test_addCRUDresponseToUpstreamQ()
|
||||
{
|
||||
numLoops = 1;
|
||||
ssize_t resp_size = 0;
|
||||
void *resp_bytes;
|
||||
|
||||
wrp_msg_t *resp_msg = NULL;
|
||||
resp_msg = ( wrp_msg_t *)malloc( sizeof( wrp_msg_t ) );
|
||||
memset(resp_msg, 0, sizeof(wrp_msg_t));
|
||||
|
||||
resp_msg->msg_type = 5;
|
||||
resp_msg->u.crud.transaction_uuid = strdup("1234");
|
||||
resp_msg->u.crud.source = strdup("tag-update");
|
||||
resp_msg->u.crud.dest = strdup("mac:14xxx/parodus/tags");
|
||||
|
||||
resp_size = wrp_struct_to( resp_msg, WRP_BYTES, &resp_bytes );
|
||||
|
||||
will_return(get_global_nano_mut, 0);
|
||||
expect_function_call(get_global_nano_mut);
|
||||
|
||||
will_return(pthread_mutex_lock, 0);
|
||||
expect_function_call(pthread_mutex_lock);
|
||||
|
||||
will_return(get_global_UpStreamMsgQ, 0);
|
||||
expect_function_call(get_global_UpStreamMsgQ);
|
||||
|
||||
will_return(set_global_UpStreamMsgQ, 0);
|
||||
expect_function_call(set_global_UpStreamMsgQ);
|
||||
|
||||
will_return(get_global_nano_con, 0);
|
||||
expect_function_call(get_global_nano_con);
|
||||
|
||||
will_return(pthread_cond_signal, 0);
|
||||
expect_function_call(pthread_cond_signal);
|
||||
|
||||
will_return(get_global_nano_mut, 0);
|
||||
expect_function_call(get_global_nano_mut);
|
||||
|
||||
will_return(pthread_mutex_unlock, 0);
|
||||
expect_function_call(pthread_mutex_unlock);
|
||||
|
||||
addCRUDresponseToUpstreamQ(resp_bytes, resp_size);
|
||||
|
||||
wrp_free_struct(resp_msg);
|
||||
|
||||
}
|
||||
|
||||
|
||||
void test_addCRUDmsgToQueueAllocation()
|
||||
{
|
||||
addCRUDmsgToQueue(NULL);
|
||||
}
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* External Functions */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
int main(void)
|
||||
{
|
||||
const struct CMUnitTest tests[] = {
|
||||
cmocka_unit_test(test_addCRUDmsgToQueueNULL),
|
||||
cmocka_unit_test(test_addCRUDmsgToQueue),
|
||||
cmocka_unit_test(test_addCRUDmsgToQueueAllocation),
|
||||
cmocka_unit_test(err_CRUDHandlerTask),
|
||||
cmocka_unit_test(test_CRUDHandlerTask),
|
||||
cmocka_unit_test(test_CRUDHandlerTaskFailure),
|
||||
cmocka_unit_test(test_addCRUDresponseToUpstreamQ)
|
||||
};
|
||||
|
||||
return cmocka_run_group_tests(tests, NULL, NULL);
|
||||
}
|
||||
2691
tests/test_crud_internal.c
Normal file
2691
tests/test_crud_internal.c
Normal file
File diff suppressed because it is too large
Load Diff
283
tests/test_crud_tasks.c
Normal file
283
tests/test_crud_tasks.c
Normal file
@@ -0,0 +1,283 @@
|
||||
/**
|
||||
* Copyright 2010-2016 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
#include <assert.h>
|
||||
#include <errno.h>
|
||||
#include <pthread.h>
|
||||
#include <malloc.h>
|
||||
#include <stdarg.h>
|
||||
#include <stddef.h>
|
||||
#include <setjmp.h>
|
||||
#include <cmocka.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <wrp-c.h>
|
||||
#include "../src/crud_tasks.h"
|
||||
#include "../src/config.h"
|
||||
#include "../src/client_list.h"
|
||||
#include "../src/ParodusInternal.h"
|
||||
#include "../src/partners_check.h"
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* File Scoped Variables */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
wrp_msg_t *response = NULL;
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Mocks */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
cJSON * cJSON_Parse(const char *payload)
|
||||
{
|
||||
UNUSED(payload);
|
||||
function_called();
|
||||
return (cJSON *) mock();
|
||||
}
|
||||
|
||||
int createObject(wrp_msg_t *reqMsg , wrp_msg_t **response)
|
||||
{
|
||||
UNUSED(reqMsg); UNUSED(response);
|
||||
function_called();
|
||||
return (int) mock();
|
||||
}
|
||||
|
||||
int retrieveObject(wrp_msg_t *reqMsg , wrp_msg_t **response)
|
||||
{
|
||||
UNUSED(reqMsg); UNUSED(response);
|
||||
function_called();
|
||||
return (int) mock();
|
||||
}
|
||||
|
||||
int updateObject(wrp_msg_t *reqMsg , wrp_msg_t **response)
|
||||
{
|
||||
UNUSED(reqMsg); UNUSED(response);
|
||||
function_called();
|
||||
return (int) mock();
|
||||
}
|
||||
|
||||
int deleteObject(wrp_msg_t *reqMsg , wrp_msg_t **response)
|
||||
{
|
||||
UNUSED(reqMsg); UNUSED(response);
|
||||
function_called();
|
||||
return (int) mock();
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Tests */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
void test_processCrudRequestCreate()
|
||||
{
|
||||
int ret = -1;
|
||||
wrp_msg_t *reqMsg = NULL;
|
||||
reqMsg = ( wrp_msg_t *)malloc( sizeof( wrp_msg_t ) );
|
||||
memset(reqMsg, 0, sizeof(wrp_msg_t));
|
||||
|
||||
reqMsg->msg_type = 5;
|
||||
reqMsg->u.crud.transaction_uuid = strdup("1234");
|
||||
reqMsg->u.crud.source = strdup("tag-update");
|
||||
reqMsg->u.crud.dest = strdup("mac:14xxx/parodus/tags");
|
||||
will_return(createObject, 0);
|
||||
expect_function_call(createObject);
|
||||
|
||||
ret = processCrudRequest(reqMsg, &response);
|
||||
assert_int_equal(ret, 0);
|
||||
|
||||
wrp_free_struct(reqMsg);
|
||||
|
||||
}
|
||||
|
||||
void test_processCrudRequestCreateFailure()
|
||||
{
|
||||
int ret = -2;
|
||||
wrp_msg_t *reqMsg = NULL;
|
||||
reqMsg = ( wrp_msg_t *)malloc( sizeof( wrp_msg_t ) );
|
||||
memset(reqMsg, 0, sizeof(wrp_msg_t));
|
||||
|
||||
reqMsg->msg_type = 5;
|
||||
reqMsg->u.crud.transaction_uuid = strdup("1234");
|
||||
reqMsg->u.crud.source = strdup("tag-update");
|
||||
reqMsg->u.crud.dest = strdup("mac:14xxx/parodus/tags");
|
||||
will_return(createObject, -1);
|
||||
expect_function_call(createObject);
|
||||
ret = processCrudRequest(reqMsg, &response);
|
||||
assert_int_equal(ret, -1);
|
||||
|
||||
wrp_free_struct(reqMsg);
|
||||
|
||||
}
|
||||
|
||||
void test_processCrudRequestRetrieve()
|
||||
{
|
||||
int ret = -2;
|
||||
wrp_msg_t *reqMsg = NULL;
|
||||
reqMsg = ( wrp_msg_t *)malloc( sizeof( wrp_msg_t ) );
|
||||
memset(reqMsg, 0, sizeof(wrp_msg_t));
|
||||
|
||||
reqMsg->msg_type = 6;
|
||||
reqMsg->u.crud.transaction_uuid = strdup("1234");
|
||||
reqMsg->u.crud.source = strdup("tag-update");
|
||||
reqMsg->u.crud.dest = strdup("mac:14xxx/parodus/tags");
|
||||
will_return(retrieveObject, 0);
|
||||
expect_function_call(retrieveObject);
|
||||
ret = processCrudRequest(reqMsg, &response);
|
||||
assert_int_equal(ret, 0);
|
||||
|
||||
wrp_free_struct(reqMsg);
|
||||
|
||||
}
|
||||
|
||||
void test_processCrudRequestRetrieveFailure()
|
||||
{
|
||||
int ret = -2;
|
||||
wrp_msg_t *reqMsg = NULL;
|
||||
reqMsg = ( wrp_msg_t *)malloc( sizeof( wrp_msg_t ) );
|
||||
memset(reqMsg, 0, sizeof(wrp_msg_t));
|
||||
|
||||
reqMsg->msg_type = 6;
|
||||
reqMsg->u.crud.transaction_uuid = strdup("1234");
|
||||
reqMsg->u.crud.source = strdup("tag-update");
|
||||
reqMsg->u.crud.dest = strdup("mac:14xxx/parodus/tags");
|
||||
will_return(retrieveObject, -1);
|
||||
expect_function_call(retrieveObject);
|
||||
|
||||
ret = processCrudRequest(reqMsg, &response);
|
||||
assert_int_equal(ret, -1);
|
||||
|
||||
wrp_free_struct(reqMsg);
|
||||
|
||||
}
|
||||
|
||||
void test_processCrudRequestUpdate()
|
||||
{
|
||||
int ret = -2;
|
||||
wrp_msg_t *reqMsg = NULL;
|
||||
reqMsg = ( wrp_msg_t *)malloc( sizeof( wrp_msg_t ) );
|
||||
memset(reqMsg, 0, sizeof(wrp_msg_t));
|
||||
|
||||
reqMsg->msg_type = 7;
|
||||
reqMsg->u.crud.transaction_uuid = strdup("1234");
|
||||
reqMsg->u.crud.source = strdup("tag-update");
|
||||
reqMsg->u.crud.dest = strdup("mac:14xxx/parodus/tags");
|
||||
will_return(updateObject, 0);
|
||||
expect_function_call(updateObject);
|
||||
ret = processCrudRequest(reqMsg, &response);
|
||||
assert_int_equal(ret, 0);
|
||||
|
||||
wrp_free_struct(reqMsg);
|
||||
|
||||
}
|
||||
|
||||
void test_processCrudRequestUpdateFailure()
|
||||
{
|
||||
int ret = -2;
|
||||
wrp_msg_t *reqMsg = NULL;
|
||||
reqMsg = ( wrp_msg_t *)malloc( sizeof( wrp_msg_t ) );
|
||||
memset(reqMsg, 0, sizeof(wrp_msg_t));
|
||||
|
||||
reqMsg->msg_type = 7;
|
||||
reqMsg->u.crud.transaction_uuid = strdup("1234");
|
||||
reqMsg->u.crud.source = strdup("tag-update");
|
||||
reqMsg->u.crud.dest = strdup("mac:14xxx/parodus/tags");
|
||||
will_return(updateObject, -1);
|
||||
expect_function_call(updateObject);
|
||||
|
||||
ret = processCrudRequest(reqMsg, &response);
|
||||
assert_int_equal(ret, -1);
|
||||
|
||||
wrp_free_struct(reqMsg);
|
||||
|
||||
}
|
||||
|
||||
void test_processCrudRequestDelete()
|
||||
{
|
||||
int ret = -2;
|
||||
wrp_msg_t *reqMsg = NULL;
|
||||
reqMsg = ( wrp_msg_t *)malloc( sizeof( wrp_msg_t ) );
|
||||
memset(reqMsg, 0, sizeof(wrp_msg_t));
|
||||
|
||||
reqMsg->msg_type = 8;
|
||||
reqMsg->u.crud.transaction_uuid = strdup("1234");
|
||||
reqMsg->u.crud.source = strdup("tag-update");
|
||||
reqMsg->u.crud.dest = strdup("mac:14xxx/parodus/tags");
|
||||
will_return(deleteObject, 0);
|
||||
expect_function_call(deleteObject);
|
||||
ret = processCrudRequest(reqMsg, &response);
|
||||
assert_int_equal(ret, 0);
|
||||
|
||||
wrp_free_struct(reqMsg);
|
||||
|
||||
}
|
||||
|
||||
void test_processCrudRequestDeleteFailure()
|
||||
{
|
||||
int ret = -2;
|
||||
wrp_msg_t *reqMsg = NULL;
|
||||
reqMsg = ( wrp_msg_t *)malloc( sizeof( wrp_msg_t ) );
|
||||
memset(reqMsg, 0, sizeof(wrp_msg_t));
|
||||
|
||||
reqMsg->msg_type = 8;
|
||||
reqMsg->u.crud.transaction_uuid = strdup("1234");
|
||||
reqMsg->u.crud.source = strdup("tag-update");
|
||||
reqMsg->u.crud.dest = strdup("mac:14xxx/parodus/tags");
|
||||
will_return(deleteObject, -1);
|
||||
expect_function_call(deleteObject);
|
||||
|
||||
ret = processCrudRequest(reqMsg, &response);
|
||||
assert_int_equal(ret, -1);
|
||||
|
||||
wrp_free_struct(reqMsg);
|
||||
|
||||
}
|
||||
|
||||
void test_processCrudRequestFailure()
|
||||
{
|
||||
int ret = -2;
|
||||
wrp_msg_t *reqMsg = NULL;
|
||||
reqMsg = ( wrp_msg_t *)malloc( sizeof( wrp_msg_t ) );
|
||||
memset(reqMsg, 0, sizeof(wrp_msg_t));
|
||||
|
||||
reqMsg->msg_type = 3;
|
||||
reqMsg->u.crud.transaction_uuid = strdup("1234");
|
||||
reqMsg->u.crud.source = strdup("tag-update");
|
||||
reqMsg->u.crud.dest = strdup("mac:14xxx/parodus/tags");
|
||||
|
||||
ret = processCrudRequest(reqMsg, &response);
|
||||
assert_int_equal(ret, 0);
|
||||
|
||||
wrp_free_struct(reqMsg);
|
||||
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* External Functions */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
int main(void)
|
||||
{
|
||||
const struct CMUnitTest tests[] = {
|
||||
cmocka_unit_test(test_processCrudRequestCreate),
|
||||
cmocka_unit_test(test_processCrudRequestCreateFailure),
|
||||
cmocka_unit_test(test_processCrudRequestRetrieve),
|
||||
cmocka_unit_test(test_processCrudRequestRetrieveFailure),
|
||||
cmocka_unit_test(test_processCrudRequestUpdate),
|
||||
cmocka_unit_test(test_processCrudRequestUpdateFailure),
|
||||
cmocka_unit_test(test_processCrudRequestDelete),
|
||||
cmocka_unit_test(test_processCrudRequestDeleteFailure),
|
||||
cmocka_unit_test(test_processCrudRequestFailure),
|
||||
};
|
||||
|
||||
return cmocka_run_group_tests(tests, NULL, NULL);
|
||||
}
|
||||
@@ -21,6 +21,7 @@
|
||||
#include <stddef.h>
|
||||
#include <setjmp.h>
|
||||
#include <cmocka.h>
|
||||
#include <wrp-c.h>
|
||||
|
||||
#include "../src/downstream.h"
|
||||
#include "../src/ParodusInternal.h"
|
||||
@@ -32,9 +33,16 @@
|
||||
ParodusMsg *ParodusMsgQ;
|
||||
pthread_mutex_t g_mutex;
|
||||
pthread_cond_t g_cond;
|
||||
int crud_test = 0;
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Mocks */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
void addCRUDmsgToQueue(wrp_msg_t *crudMsg)
|
||||
{
|
||||
UNUSED(crudMsg) ;
|
||||
function_called();
|
||||
}
|
||||
|
||||
void sendUpstreamMsgToServer(void **resp_bytes, size_t resp_size)
|
||||
{
|
||||
UNUSED(resp_bytes); UNUSED(resp_size);
|
||||
@@ -60,13 +68,20 @@ ssize_t wrp_to_struct( const void *bytes, const size_t length,
|
||||
function_called();
|
||||
*msg = (wrp_msg_t*) malloc(sizeof(wrp_msg_t));
|
||||
memset(*msg, 0, sizeof(wrp_msg_t));
|
||||
(*msg)->msg_type = WRP_MSG_TYPE__REQ;
|
||||
(*msg)->u.req.dest = (char *) malloc(sizeof(char) *100);
|
||||
(*msg)->u.req.partner_ids = (partners_t *) malloc(sizeof(partners_t));
|
||||
(*msg)->u.req.partner_ids->count = 1;
|
||||
(*msg)->u.req.partner_ids->partner_ids[0] = (char *) malloc(sizeof(char) *64);
|
||||
strcpy((*msg)->u.req.dest,"mac:1122334455/iot");
|
||||
strcpy((*msg)->u.req.partner_ids->partner_ids[0],"comcast");
|
||||
(*msg)->msg_type = WRP_MSG_TYPE__REQ;
|
||||
(*msg)->u.req.dest = (char *) malloc(sizeof(char) *100);
|
||||
(*msg)->u.req.partner_ids = (partners_t *) malloc(sizeof(partners_t));
|
||||
(*msg)->u.req.partner_ids->count = 1;
|
||||
(*msg)->u.req.partner_ids->partner_ids[0] = (char *) malloc(sizeof(char) *64);
|
||||
parStrncpy((*msg)->u.req.dest,"mac:1122334455/iot", 100);
|
||||
parStrncpy((*msg)->u.req.partner_ids->partner_ids[0],"comcast", 64);
|
||||
if(crud_test)
|
||||
{
|
||||
(*msg)->msg_type = WRP_MSG_TYPE__CREATE;
|
||||
parStrncpy((*msg)->u.crud.dest,"mac:1122334455/parodus", 100);
|
||||
(*msg)->u.crud.source = "tag-update";
|
||||
(*msg)->u.crud.transaction_uuid = "1234";
|
||||
}
|
||||
return (ssize_t) mock();
|
||||
}
|
||||
|
||||
@@ -93,8 +108,8 @@ void test_listenerOnMessage()
|
||||
expect_function_calls(wrp_to_struct, 1);
|
||||
reg_list_item_t *head = (reg_list_item_t *) malloc(sizeof(reg_list_item_t));
|
||||
memset(head, 0, sizeof(reg_list_item_t));
|
||||
strcpy(head->service_name, "iot");
|
||||
strcpy(head->url, "tcp://10.0.0.1:6600");
|
||||
parStrncpy(head->service_name, "iot", sizeof(head->service_name));
|
||||
parStrncpy(head->url, "tcp://10.0.0.1:6600", sizeof(head->url));
|
||||
|
||||
will_return(get_numOfClients, 1);
|
||||
expect_function_call(get_numOfClients);
|
||||
@@ -116,19 +131,19 @@ void test_listenerOnMessageMultipleClients()
|
||||
|
||||
reg_list_item_t *head2 = (reg_list_item_t *) malloc(sizeof(reg_list_item_t));
|
||||
memset(head2, 0, sizeof(reg_list_item_t));
|
||||
strcpy(head2->service_name, "iot");
|
||||
strcpy(head2->url, "tcp://10.0.0.1:6622");
|
||||
parStrncpy(head2->service_name, "iot", sizeof(head2->service_name));
|
||||
parStrncpy(head2->url, "tcp://10.0.0.1:6622", sizeof(head2->url));
|
||||
|
||||
reg_list_item_t *head1 = (reg_list_item_t *) malloc(sizeof(reg_list_item_t));
|
||||
memset(head1, 0, sizeof(reg_list_item_t));
|
||||
strcpy(head1->service_name, "lmlite");
|
||||
strcpy(head1->url, "tcp://10.0.0.1:6611");
|
||||
parStrncpy(head1->service_name, "lmlite", sizeof(head1->service_name));
|
||||
parStrncpy(head1->url, "tcp://10.0.0.1:6611", sizeof(head1->url));
|
||||
head1->next = head2;
|
||||
|
||||
reg_list_item_t *head = (reg_list_item_t *) malloc(sizeof(reg_list_item_t));
|
||||
memset(head, 0, sizeof(reg_list_item_t));
|
||||
strcpy(head->service_name, "config");
|
||||
strcpy(head->url, "tcp://10.0.0.1:6600");
|
||||
parStrncpy(head->service_name, "config", sizeof(head->service_name));
|
||||
parStrncpy(head->url, "tcp://10.0.0.1:6600", sizeof(head->url));
|
||||
head->next = head1;
|
||||
|
||||
will_return(get_numOfClients, 3);
|
||||
@@ -189,6 +204,23 @@ void err_listenerOnMessageAllNull()
|
||||
listenerOnMessage(NULL, 0);
|
||||
}
|
||||
|
||||
|
||||
void test_listenerOnMessageCRUD()
|
||||
{
|
||||
crud_test = 1;
|
||||
will_return(wrp_to_struct, 2);
|
||||
expect_function_calls(wrp_to_struct, 1);
|
||||
|
||||
will_return(get_numOfClients, 0);
|
||||
expect_function_call(get_numOfClients);
|
||||
will_return(validate_partner_id, 0);
|
||||
expect_function_call(validate_partner_id);
|
||||
will_return(get_global_node, (intptr_t)NULL);
|
||||
expect_function_call(get_global_node);
|
||||
expect_function_call(addCRUDmsgToQueue);
|
||||
listenerOnMessage("Hello", 6);
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* External Functions */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
@@ -202,6 +234,7 @@ int main(void)
|
||||
cmocka_unit_test(err_listenerOnMessageServiceUnavailable),
|
||||
cmocka_unit_test(err_listenerOnMessageInvalidPartnerId),
|
||||
cmocka_unit_test(err_listenerOnMessageAllNull),
|
||||
cmocka_unit_test(test_listenerOnMessageCRUD),
|
||||
};
|
||||
|
||||
return cmocka_run_group_tests(tests, NULL, NULL);
|
||||
|
||||
321
tests/test_downstream_more.c
Normal file
321
tests/test_downstream_more.c
Normal file
@@ -0,0 +1,321 @@
|
||||
/**
|
||||
* Copyright 2017 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
#include <assert.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdbool.h>
|
||||
#include <wrp-c.h>
|
||||
|
||||
#include <CUnit/Basic.h>
|
||||
|
||||
#include "../src/downstream.h"
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Macros */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* none */
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Data Structures */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
typedef struct {
|
||||
wrp_msg_t s;
|
||||
wrp_msg_t r;
|
||||
} test_t;
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* File Scoped Variables */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
static test_t tests[] = {
|
||||
{
|
||||
.s.msg_type = WRP_MSG_TYPE__CREATE,
|
||||
.s.u.crud.transaction_uuid = "c2bb1f16-09c8-11e7-93ae-92361f002671",
|
||||
.s.u.crud.source = "fake-server1",
|
||||
.s.u.crud.dest = "fake-client1/iot",
|
||||
.s.u.crud.partner_ids = NULL,
|
||||
.s.u.crud.headers = NULL,
|
||||
.s.u.crud.metadata = NULL,
|
||||
.s.u.crud.include_spans = false,
|
||||
.s.u.crud.spans.spans = NULL,
|
||||
.s.u.crud.spans.count = 0,
|
||||
.s.u.crud.path = "Some path",
|
||||
.s.u.crud.payload = "Some binary",
|
||||
.s.u.crud.payload_size = 11,
|
||||
|
||||
.r.msg_type = WRP_MSG_TYPE__CREATE,
|
||||
.r.u.crud.transaction_uuid = "c2bb1f16-09c8-11e7-93ae-92361f002671",
|
||||
.r.u.crud.source = "fake-client1/iot",
|
||||
.r.u.crud.dest = "fake-server1",
|
||||
.r.u.crud.partner_ids = NULL,
|
||||
.r.u.crud.headers = NULL,
|
||||
.r.u.crud.metadata = NULL,
|
||||
.r.u.crud.include_spans = false,
|
||||
.r.u.crud.spans.spans = NULL,
|
||||
.r.u.crud.spans.count = 0,
|
||||
.r.u.crud.path = "Some path",
|
||||
.r.u.crud.payload = "{\"statusCode\":531,\"message\":\"Service Unavailable\"}",
|
||||
.r.u.crud.payload_size = 50,
|
||||
},
|
||||
|
||||
{
|
||||
.s.msg_type = WRP_MSG_TYPE__RETREIVE,
|
||||
.s.u.crud.transaction_uuid = "c2bb1f16-09c8-11e7-93ae-92361f002671",
|
||||
.s.u.crud.source = "fake-server2",
|
||||
.s.u.crud.dest = "fake-client2/iot",
|
||||
.s.u.crud.partner_ids = NULL,
|
||||
.s.u.crud.headers = NULL,
|
||||
.s.u.crud.metadata = NULL,
|
||||
.s.u.crud.include_spans = false,
|
||||
.s.u.crud.spans.spans = NULL,
|
||||
.s.u.crud.spans.count = 0,
|
||||
.s.u.crud.path = "Some path",
|
||||
.s.u.crud.payload = NULL,
|
||||
.s.u.crud.payload_size = 0,
|
||||
|
||||
.r.msg_type = WRP_MSG_TYPE__RETREIVE,
|
||||
.r.u.crud.transaction_uuid = "c2bb1f16-09c8-11e7-93ae-92361f002671",
|
||||
.r.u.crud.source = "fake-client2/iot",
|
||||
.r.u.crud.dest = "fake-server2",
|
||||
.r.u.crud.partner_ids = NULL,
|
||||
.r.u.crud.headers = NULL,
|
||||
.r.u.crud.metadata = NULL,
|
||||
.r.u.crud.include_spans = false,
|
||||
.r.u.crud.spans.spans = NULL,
|
||||
.r.u.crud.spans.count = 0,
|
||||
.r.u.crud.path = "Some path",
|
||||
.r.u.crud.payload = "{\"statusCode\":531,\"message\":\"Service Unavailable\"}",
|
||||
.r.u.crud.payload_size = 50,
|
||||
},
|
||||
|
||||
{
|
||||
.s.msg_type = WRP_MSG_TYPE__UPDATE,
|
||||
.s.u.crud.transaction_uuid = "c2bb1f16-09c8-11e7-93ae-92361f002671",
|
||||
.s.u.crud.source = "fake-server3",
|
||||
.s.u.crud.dest = "fake-client3/iot",
|
||||
.s.u.crud.partner_ids = NULL,
|
||||
.s.u.crud.headers = NULL,
|
||||
.s.u.crud.metadata = NULL,
|
||||
.s.u.crud.include_spans = false,
|
||||
.s.u.crud.spans.spans = NULL,
|
||||
.s.u.crud.spans.count = 0,
|
||||
.s.u.crud.path = "Some path",
|
||||
.s.u.crud.payload = NULL,
|
||||
.s.u.crud.payload_size = 0,
|
||||
|
||||
.r.msg_type = WRP_MSG_TYPE__UPDATE,
|
||||
.r.u.crud.transaction_uuid = "c2bb1f16-09c8-11e7-93ae-92361f002671",
|
||||
.r.u.crud.source = "fake-client3/iot",
|
||||
.r.u.crud.dest = "fake-server3",
|
||||
.r.u.crud.partner_ids = NULL,
|
||||
.r.u.crud.headers = NULL,
|
||||
.r.u.crud.metadata = NULL,
|
||||
.r.u.crud.include_spans = false,
|
||||
.r.u.crud.spans.spans = NULL,
|
||||
.r.u.crud.spans.count = 0,
|
||||
.r.u.crud.path = "Some path",
|
||||
.r.u.crud.payload = "{\"statusCode\":531,\"message\":\"Service Unavailable\"}",
|
||||
.r.u.crud.payload_size = 50,
|
||||
},
|
||||
|
||||
{
|
||||
.s.msg_type = WRP_MSG_TYPE__DELETE,
|
||||
.s.u.crud.transaction_uuid = "c2bb1f16-09c8-11e7-93ae-92361f002671",
|
||||
.s.u.crud.source = "fake-server4",
|
||||
.s.u.crud.dest = "fake-client4/iot",
|
||||
.s.u.crud.partner_ids = NULL,
|
||||
.s.u.crud.headers = NULL,
|
||||
.s.u.crud.metadata = NULL,
|
||||
.s.u.crud.include_spans = false,
|
||||
.s.u.crud.spans.spans = NULL,
|
||||
.s.u.crud.spans.count = 0,
|
||||
.s.u.crud.path = "Some path",
|
||||
.s.u.crud.payload = NULL,
|
||||
.s.u.crud.payload_size = 0,
|
||||
|
||||
.r.msg_type = WRP_MSG_TYPE__DELETE,
|
||||
.r.u.crud.transaction_uuid = "c2bb1f16-09c8-11e7-93ae-92361f002671",
|
||||
.r.u.crud.source = "fake-client4/iot",
|
||||
.r.u.crud.dest = "fake-server4",
|
||||
.r.u.crud.partner_ids = NULL,
|
||||
.r.u.crud.headers = NULL,
|
||||
.r.u.crud.metadata = NULL,
|
||||
.r.u.crud.include_spans = false,
|
||||
.r.u.crud.spans.spans = NULL,
|
||||
.r.u.crud.spans.count = 0,
|
||||
.r.u.crud.path = "Some path",
|
||||
.r.u.crud.payload = "{\"statusCode\":531,\"message\":\"Service Unavailable\"}",
|
||||
.r.u.crud.payload_size = 50,
|
||||
},
|
||||
|
||||
{
|
||||
.s.msg_type = WRP_MSG_TYPE__EVENT,
|
||||
.s.u.event.source = "fake-server5",
|
||||
.s.u.event.dest = "fake-client5/iot",
|
||||
.s.u.event.partner_ids = NULL,
|
||||
.s.u.event.headers = NULL,
|
||||
.s.u.event.metadata = NULL,
|
||||
.s.u.event.payload = NULL,
|
||||
.s.u.event.payload_size = 0,
|
||||
|
||||
.r = {0},
|
||||
},
|
||||
};
|
||||
|
||||
static uint8_t i;
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Mocks */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
void addCRUDmsgToQueue(wrp_msg_t *crudMsg)
|
||||
{
|
||||
(void)crudMsg;
|
||||
return;
|
||||
}
|
||||
|
||||
int validate_partner_id(wrp_msg_t *msg, partners_t **partnerIds)
|
||||
{
|
||||
(void) msg; (void) partnerIds;
|
||||
return 1;
|
||||
}
|
||||
|
||||
ssize_t wrp_to_struct( const void *bytes, const size_t length, const enum wrp_format fmt,
|
||||
wrp_msg_t **msg )
|
||||
{
|
||||
(void) bytes; (void) length; (void) fmt;
|
||||
*msg = (wrp_msg_t*) malloc(sizeof(wrp_msg_t));
|
||||
(*msg)->msg_type = tests[i].s.msg_type;
|
||||
if( WRP_MSG_TYPE__EVENT == tests[i].s.msg_type ) {
|
||||
(*msg)->u.event.source = strdup(tests[i].s.u.event.source);
|
||||
(*msg)->u.event.dest = strdup(tests[i].s.u.event.dest);
|
||||
}
|
||||
else
|
||||
{
|
||||
(*msg)->u.crud.source = strdup(tests[i].s.u.crud.source);
|
||||
(*msg)->u.crud.dest = strdup(tests[i].s.u.crud.dest);
|
||||
(*msg)->u.crud.transaction_uuid = strdup(tests[i].s.u.crud.transaction_uuid);
|
||||
(*msg)->u.crud.path = strdup(tests[i].s.u.crud.path);
|
||||
}
|
||||
return (ssize_t) sizeof(tests[i].s);
|
||||
}
|
||||
|
||||
ssize_t wrp_struct_to( const wrp_msg_t *msg, const enum wrp_format fmt, void **bytes )
|
||||
{
|
||||
(void) fmt;
|
||||
*bytes = malloc(1);
|
||||
CU_ASSERT(WRP_MSG_TYPE__EVENT != msg->msg_type);
|
||||
CU_ASSERT(tests[i].r.msg_type == msg->msg_type);
|
||||
CU_ASSERT_STRING_EQUAL(tests[i].r.u.crud.transaction_uuid, msg->u.crud.transaction_uuid);
|
||||
printf("tests[%d].r.u.crud.source = %s, msg->u.crud.source = %s\n", i, tests[i].r.u.crud.source, msg->u.crud.source);
|
||||
CU_ASSERT_STRING_EQUAL(tests[i].r.u.crud.source, msg->u.crud.source);
|
||||
CU_ASSERT_STRING_EQUAL(tests[i].r.u.crud.dest, msg->u.crud.dest);
|
||||
CU_ASSERT_STRING_EQUAL(tests[i].r.u.crud.path, msg->u.crud.path);
|
||||
CU_ASSERT(tests[i].r.u.crud.payload_size == msg->u.crud.payload_size);
|
||||
CU_ASSERT(0 == memcmp(tests[i].r.u.crud.payload, msg->u.crud.payload, msg->u.crud.payload_size));
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
void sendUpstreamMsgToServer(void **resp_bytes, size_t resp_size)
|
||||
{
|
||||
(void) resp_bytes; (void) resp_size;
|
||||
}
|
||||
|
||||
int get_numOfClients()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
reg_list_item_t *get_global_node(void)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void wrp_free_struct( wrp_msg_t *msg )
|
||||
{
|
||||
if( WRP_MSG_TYPE__EVENT == tests[i].s.msg_type ) {
|
||||
if( NULL != msg->u.event.source) {
|
||||
free(msg->u.event.source);
|
||||
}
|
||||
if( NULL != msg->u.event.dest) {
|
||||
free(msg->u.event.dest);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if( NULL != msg->u.crud.source) {
|
||||
free(msg->u.crud.source);
|
||||
}
|
||||
if( NULL != msg->u.crud.dest) {
|
||||
free(msg->u.crud.dest);
|
||||
}
|
||||
if( NULL != msg->u.crud.transaction_uuid) {
|
||||
free(msg->u.crud.transaction_uuid);
|
||||
}
|
||||
if( NULL != msg->u.crud.path) {
|
||||
free(msg->u.crud.path);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Tests */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
void test_listenerOnMessage()
|
||||
{
|
||||
size_t t_size = sizeof(tests)/sizeof(test_t);
|
||||
void *msg = malloc(1);
|
||||
|
||||
for( i = 0; i < t_size; i++ ) {
|
||||
listenerOnMessage(msg, 0);
|
||||
}
|
||||
free(msg);
|
||||
}
|
||||
|
||||
void add_suites( CU_pSuite *suite )
|
||||
{
|
||||
printf("--------Start of Test Cases Execution ---------\n");
|
||||
*suite = CU_add_suite( "tests", NULL, NULL );
|
||||
CU_add_test( *suite, "Test 1", test_listenerOnMessage );
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* External Functions */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
int main( void )
|
||||
{
|
||||
unsigned rv = 1;
|
||||
CU_pSuite suite = NULL;
|
||||
|
||||
if( CUE_SUCCESS == CU_initialize_registry() ) {
|
||||
add_suites( &suite );
|
||||
|
||||
if( NULL != suite ) {
|
||||
CU_basic_set_mode( CU_BRM_VERBOSE );
|
||||
CU_basic_run_tests();
|
||||
printf( "\n" );
|
||||
CU_basic_show_failures( CU_get_failure_list() );
|
||||
printf( "\n\n" );
|
||||
rv = CU_get_number_of_tests_failed();
|
||||
}
|
||||
|
||||
CU_cleanup_registry();
|
||||
|
||||
}
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
@@ -54,9 +54,7 @@ void* a(void *in)
|
||||
|
||||
lockMutex(data->mutex);
|
||||
data->number++;
|
||||
sleep(1);
|
||||
data->number++;
|
||||
sleep(1);
|
||||
data->number++;
|
||||
unlockMutex(data->mutex);
|
||||
|
||||
@@ -69,9 +67,7 @@ void* b(void *in)
|
||||
|
||||
lockMutex(data->mutex);
|
||||
data->number+=10;
|
||||
sleep(1);
|
||||
data->number+=10;
|
||||
sleep(1);
|
||||
data->number+=10;
|
||||
unlockMutex(data->mutex);
|
||||
|
||||
@@ -108,6 +104,8 @@ void err_mutex()
|
||||
|
||||
will_return(pthread_mutex_init, -1);
|
||||
mutex = createMutex();
|
||||
destroyMutex(mutex);
|
||||
|
||||
}
|
||||
|
||||
void err_mutexNull()
|
||||
|
||||
@@ -44,7 +44,7 @@
|
||||
/*----------------------------------------------------------------------------*/
|
||||
void test_checkHostIp()
|
||||
{
|
||||
CU_ASSERT_EQUAL(0, checkHostIp("fabric.webpa.comcast.net"))
|
||||
CU_ASSERT_EQUAL(0, checkHostIp("www.python.org"))
|
||||
}
|
||||
|
||||
void add_suites( CU_pSuite *suite )
|
||||
|
||||
@@ -29,6 +29,7 @@
|
||||
/*----------------------------------------------------------------------------*/
|
||||
volatile unsigned int heartBeatTimer;
|
||||
bool LastReasonStatus;
|
||||
int closeReason = 0;
|
||||
pthread_mutex_t close_mut;
|
||||
bool close_retry;
|
||||
/*----------------------------------------------------------------------------*/
|
||||
@@ -40,6 +41,16 @@ void set_global_reconnect_reason(char *reason)
|
||||
(void) reason;
|
||||
}
|
||||
|
||||
bool get_global_reconnect_status()
|
||||
{
|
||||
return LastReasonStatus;
|
||||
}
|
||||
|
||||
void set_global_reconnect_status(bool status)
|
||||
{
|
||||
(void) status ;
|
||||
}
|
||||
|
||||
const unsigned char *nopoll_msg_get_payload(noPollMsg *msg)
|
||||
{
|
||||
if( NULL != msg ) {
|
||||
@@ -59,12 +70,27 @@ noPollOpCode nopoll_msg_opcode (noPollMsg * msg)
|
||||
return NOPOLL_UNKNOWN_OP_CODE;
|
||||
}
|
||||
|
||||
nopoll_bool nopoll_msg_is_fragment(noPollMsg *msg)
|
||||
{
|
||||
(void) msg;
|
||||
return nopoll_false;
|
||||
}
|
||||
|
||||
int nopoll_msg_get_payload_size(noPollMsg *msg)
|
||||
{
|
||||
(void) msg;
|
||||
return 1;
|
||||
}
|
||||
|
||||
int nopoll_conn_get_close_status (noPollConn * conn)
|
||||
{
|
||||
(void) conn;
|
||||
if(closeReason)
|
||||
return 1006;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
int nopoll_conn_send_frame (noPollConn * conn, nopoll_bool fin, nopoll_bool masked,
|
||||
noPollOpCode op_code, long length, noPollPtr content, long sleep_in_header)
|
||||
|
||||
@@ -116,16 +142,16 @@ void *a1(void *in)
|
||||
char str[] = "SSL_Socket_Close";
|
||||
(void) in;
|
||||
|
||||
LastReasonStatus = false;
|
||||
set_global_reconnect_status(false);
|
||||
listenerOnCloseMessage(NULL, NULL, NULL);
|
||||
|
||||
LastReasonStatus = false;
|
||||
set_global_reconnect_status(false);
|
||||
listenerOnCloseMessage(NULL, NULL, (noPollPtr) str);
|
||||
|
||||
LastReasonStatus = true;
|
||||
set_global_reconnect_status(true);
|
||||
listenerOnCloseMessage(NULL, NULL, NULL);
|
||||
|
||||
LastReasonStatus = true;
|
||||
closeReason = 1;
|
||||
set_global_reconnect_status(true);
|
||||
listenerOnCloseMessage(NULL, NULL, (noPollPtr) str);
|
||||
|
||||
pthread_exit(0);
|
||||
|
||||
138
tests/test_nopoll_handlers_fragment.c
Normal file
138
tests/test_nopoll_handlers_fragment.c
Normal file
@@ -0,0 +1,138 @@
|
||||
/**
|
||||
* Copyright 2010-2016 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
#include <assert.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdbool.h>
|
||||
#include <CUnit/Basic.h>
|
||||
#include <stddef.h>
|
||||
#include <setjmp.h>
|
||||
#include <cmocka.h>
|
||||
#include <nopoll.h>
|
||||
#include <nopoll_private.h>
|
||||
#include <pthread.h>
|
||||
|
||||
#include "../src/nopoll_handlers.h"
|
||||
#include "../src/parodus_log.h"
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* File Scoped Variables */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
volatile unsigned int heartBeatTimer;
|
||||
bool LastReasonStatus;
|
||||
pthread_mutex_t close_mut;
|
||||
bool close_retry;
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Mocks */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
void set_global_reconnect_reason(char *reason)
|
||||
{
|
||||
(void) reason;
|
||||
}
|
||||
|
||||
bool get_global_reconnect_status()
|
||||
{
|
||||
return LastReasonStatus;
|
||||
}
|
||||
|
||||
void set_global_reconnect_status(bool status)
|
||||
{
|
||||
(void) status ;
|
||||
}
|
||||
|
||||
nopoll_bool nopoll_msg_is_fragment(noPollMsg *msg)
|
||||
{
|
||||
(void)msg;
|
||||
function_called();
|
||||
return (nopoll_bool) mock();
|
||||
}
|
||||
|
||||
nopoll_bool nopoll_msg_is_final(noPollMsg *msg)
|
||||
{
|
||||
(void)msg;
|
||||
function_called();
|
||||
return (nopoll_bool) mock();
|
||||
}
|
||||
|
||||
const unsigned char *nopoll_msg_get_payload(noPollMsg *msg)
|
||||
{
|
||||
(void)msg;
|
||||
function_called();
|
||||
|
||||
|
||||
return (const unsigned char *) mock();
|
||||
}
|
||||
|
||||
int nopoll_msg_get_payload_size(noPollMsg *msg)
|
||||
{
|
||||
(void) msg;
|
||||
function_called ();
|
||||
return (int) mock();
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Tests */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
void test_listenerOnMessage_queue_fragment()
|
||||
{
|
||||
noPollMsg *msg, *msg1;
|
||||
msg = nopoll_msg_new ();
|
||||
//1st Fragment
|
||||
msg->payload_size = strlen("hello");
|
||||
msg->payload = nopoll_new (char, msg->payload_size + 1);
|
||||
|
||||
will_return(nopoll_msg_is_fragment, nopoll_true);
|
||||
expect_function_call(nopoll_msg_is_fragment);
|
||||
will_return(nopoll_msg_is_final, nopoll_false);
|
||||
will_return(nopoll_msg_is_final, nopoll_false);
|
||||
expect_function_calls(nopoll_msg_is_final, 2);
|
||||
|
||||
listenerOnMessage_queue(NULL, NULL, msg, NULL);
|
||||
|
||||
//2nd fragment/final message
|
||||
msg1 = nopoll_msg_new ();
|
||||
msg1->payload_size = strlen("world");
|
||||
msg1->payload = nopoll_new (char, msg->payload_size + 1);
|
||||
|
||||
will_return(nopoll_msg_is_fragment, nopoll_true);
|
||||
expect_function_call(nopoll_msg_is_fragment);
|
||||
will_return(nopoll_msg_is_final, nopoll_true);
|
||||
will_return(nopoll_msg_is_final, nopoll_true);
|
||||
expect_function_calls(nopoll_msg_is_final, 2);
|
||||
will_return(nopoll_msg_get_payload, (intptr_t)"helloworld");
|
||||
expect_function_call(nopoll_msg_get_payload);
|
||||
will_return(nopoll_msg_get_payload_size, 10);
|
||||
|
||||
expect_function_call(nopoll_msg_get_payload_size);
|
||||
listenerOnMessage_queue(NULL, NULL, msg1, NULL);
|
||||
//release the message
|
||||
nopoll_msg_unref(msg);
|
||||
nopoll_msg_unref(msg1);
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* External Functions */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
int main( void )
|
||||
{
|
||||
const struct CMUnitTest tests[] = {
|
||||
cmocka_unit_test(test_listenerOnMessage_queue_fragment),
|
||||
};
|
||||
return cmocka_run_group_tests(tests, NULL, NULL);
|
||||
}
|
||||
@@ -96,6 +96,26 @@ void listenerOnCloseMessage (noPollCtx * ctx, noPollConn * conn, noPollPtr user_
|
||||
UNUSED(ctx); UNUSED(conn); UNUSED(user_data);
|
||||
}
|
||||
|
||||
void getCurrentTime(struct timespec *timer)
|
||||
{
|
||||
(void) timer;
|
||||
function_called();
|
||||
}
|
||||
|
||||
long timeValDiff(struct timespec *starttime, struct timespec *finishtime)
|
||||
{
|
||||
(void) starttime; (void) finishtime;
|
||||
function_called();
|
||||
return (long) mock();
|
||||
}
|
||||
|
||||
int kill(pid_t pid, int sig)
|
||||
{
|
||||
UNUSED(pid); UNUSED(sig);
|
||||
function_called();
|
||||
return (int) mock();
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Tests */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
@@ -202,6 +222,69 @@ void test_sendMessage()
|
||||
sendMessage(conn, "Hello Parodus!", len);
|
||||
}
|
||||
|
||||
void connStuck_sendMessage()
|
||||
{
|
||||
int len = strlen("Hello Parodus!");
|
||||
|
||||
/* Initialize the timer when connection gets stuck */
|
||||
expect_value(nopoll_conn_is_ok, (intptr_t)conn, (intptr_t)NULL);
|
||||
will_return(nopoll_conn_is_ok, nopoll_false);
|
||||
expect_function_call(nopoll_conn_is_ok);
|
||||
|
||||
expect_function_call(getCurrentTime);
|
||||
sendMessage(NULL, "Hello Parodus!", len);
|
||||
|
||||
/* When connection recovers within 10 mins, it should be able to re-connect */
|
||||
expect_value(nopoll_conn_is_ok, (intptr_t)conn, (intptr_t)NULL);
|
||||
will_return(nopoll_conn_is_ok, nopoll_false);
|
||||
expect_function_call(nopoll_conn_is_ok);
|
||||
|
||||
expect_function_call(getCurrentTime);
|
||||
|
||||
will_return(timeValDiff, 5*60*1000);
|
||||
expect_function_call(timeValDiff);
|
||||
|
||||
expect_value(nopoll_conn_is_ok, (intptr_t)conn, (intptr_t)conn);
|
||||
will_return(nopoll_conn_is_ok, nopoll_true);
|
||||
expect_function_call(nopoll_conn_is_ok);
|
||||
|
||||
expect_value(nopoll_conn_is_ready, (intptr_t)conn, (intptr_t)conn);
|
||||
will_return(nopoll_conn_is_ready, nopoll_true);
|
||||
expect_function_call(nopoll_conn_is_ready);
|
||||
|
||||
expect_value(__nopoll_conn_send_common, (intptr_t)conn, (intptr_t)conn);
|
||||
expect_value(__nopoll_conn_send_common, length, len);
|
||||
will_return(__nopoll_conn_send_common, len);
|
||||
expect_function_calls(__nopoll_conn_send_common, 1);
|
||||
|
||||
sendMessage(conn, "Hello Parodus!", len);
|
||||
|
||||
/* When timer exceeds more than 10 mins kill the process */
|
||||
expect_value(nopoll_conn_is_ok, (intptr_t)conn, (intptr_t)NULL);
|
||||
will_return(nopoll_conn_is_ok, nopoll_false);
|
||||
expect_function_call(nopoll_conn_is_ok);
|
||||
|
||||
sendMessage(NULL, "Hello Parodus!", len);
|
||||
|
||||
expect_function_call(getCurrentTime);
|
||||
|
||||
sendMessage(NULL, "Hello Parodus!", len);
|
||||
|
||||
expect_value(nopoll_conn_is_ok, (intptr_t)conn, (intptr_t)NULL);
|
||||
will_return(nopoll_conn_is_ok, nopoll_false);
|
||||
expect_function_call(nopoll_conn_is_ok);
|
||||
|
||||
expect_function_call(getCurrentTime);
|
||||
|
||||
will_return(timeValDiff, 10*60*1000);
|
||||
expect_function_call(timeValDiff);
|
||||
|
||||
will_return(kill, 1);
|
||||
expect_function_call(kill);
|
||||
|
||||
sendMessage(NULL, "Hello Parodus!", len);
|
||||
}
|
||||
|
||||
void err_sendMessage()
|
||||
{
|
||||
int len = strlen("Hello Parodus!");
|
||||
@@ -234,7 +317,9 @@ void err_sendMessageConnNull()
|
||||
expect_value(nopoll_conn_is_ok, (intptr_t)conn, (intptr_t)NULL);
|
||||
will_return(nopoll_conn_is_ok, nopoll_false);
|
||||
expect_function_call(nopoll_conn_is_ok);
|
||||
|
||||
|
||||
expect_function_call(getCurrentTime);
|
||||
|
||||
sendMessage(NULL, "Hello Parodus!", len);
|
||||
}
|
||||
|
||||
@@ -258,6 +343,7 @@ int main(void)
|
||||
cmocka_unit_test(err_sendResponseFlushWrites),
|
||||
cmocka_unit_test(err_sendResponseConnNull),
|
||||
cmocka_unit_test(test_sendMessage),
|
||||
cmocka_unit_test(connStuck_sendMessage),
|
||||
cmocka_unit_test(err_sendMessage),
|
||||
cmocka_unit_test(err_sendMessageConnNull),
|
||||
cmocka_unit_test(test_reportLog),
|
||||
|
||||
@@ -51,7 +51,7 @@ void test_validate_partner_id_for_req()
|
||||
|
||||
ParodusCfg cfg;
|
||||
memset(&cfg, 0, sizeof(ParodusCfg));
|
||||
strcpy(cfg.partner_id, "comcast");
|
||||
parStrncpy(cfg.partner_id, "comcast", sizeof(cfg.partner_id));
|
||||
|
||||
will_return(get_parodus_cfg, (intptr_t)&cfg);
|
||||
expect_function_call(get_parodus_cfg);
|
||||
@@ -68,7 +68,7 @@ void test_validate_partner_id_for_req_listNULL()
|
||||
|
||||
ParodusCfg cfg;
|
||||
memset(&cfg, 0, sizeof(ParodusCfg));
|
||||
strcpy(cfg.partner_id, "comcast");
|
||||
parStrncpy(cfg.partner_id, "comcast", sizeof(cfg.partner_id));
|
||||
|
||||
will_return(get_parodus_cfg, (intptr_t)&cfg);
|
||||
expect_function_call(get_parodus_cfg);
|
||||
@@ -103,7 +103,7 @@ void err_validate_partner_id_for_req()
|
||||
|
||||
ParodusCfg cfg;
|
||||
memset(&cfg, 0, sizeof(ParodusCfg));
|
||||
strcpy(cfg.partner_id, "comcast");
|
||||
parStrncpy(cfg.partner_id, "comcast", sizeof(cfg.partner_id));
|
||||
|
||||
will_return(get_parodus_cfg, (intptr_t)&cfg);
|
||||
expect_function_call(get_parodus_cfg);
|
||||
@@ -122,14 +122,15 @@ void test_validate_partner_id_for_event()
|
||||
|
||||
ParodusCfg cfg;
|
||||
memset(&cfg, 0, sizeof(ParodusCfg));
|
||||
strcpy(cfg.partner_id, "comcast");
|
||||
parStrncpy(cfg.partner_id, "comcast", sizeof(cfg.partner_id));
|
||||
|
||||
will_return(get_parodus_cfg, (intptr_t)&cfg);
|
||||
expect_function_call(get_parodus_cfg);
|
||||
|
||||
partners_t *list = NULL;
|
||||
int ret = validate_partner_id(msg, &list);
|
||||
assert_int_equal(ret, 1);
|
||||
assert_int_equal(ret, 1);
|
||||
free(list);
|
||||
free(msg);
|
||||
}
|
||||
|
||||
@@ -141,7 +142,7 @@ void test_validate_partner_id_for_event_listNULL()
|
||||
|
||||
ParodusCfg cfg;
|
||||
memset(&cfg, 0, sizeof(ParodusCfg));
|
||||
strcpy(cfg.partner_id, "comcast");
|
||||
parStrncpy(cfg.partner_id, "comcast", sizeof(cfg.partner_id));
|
||||
|
||||
will_return(get_parodus_cfg, (intptr_t)&cfg);
|
||||
expect_function_call(get_parodus_cfg);
|
||||
@@ -180,7 +181,7 @@ void test_validate_partner_id_for_event_withoutId()
|
||||
partners_t *partner_ids = (partners_t *) malloc(sizeof(partners_t));
|
||||
partner_ids->count = 1;
|
||||
partner_ids->partner_ids[0] = (char *) malloc(sizeof(char)*64);
|
||||
strcpy(partner_ids->partner_ids[0], "shaw");
|
||||
parStrncpy(partner_ids->partner_ids[0], "shaw", 64);
|
||||
|
||||
wrp_msg_t *msg = (wrp_msg_t*) malloc(sizeof(wrp_msg_t));
|
||||
memset(msg, 0, sizeof(wrp_msg_t));
|
||||
@@ -189,7 +190,7 @@ void test_validate_partner_id_for_event_withoutId()
|
||||
|
||||
ParodusCfg cfg;
|
||||
memset(&cfg, 0, sizeof(ParodusCfg));
|
||||
strcpy(cfg.partner_id, "comcast");
|
||||
parStrncpy(cfg.partner_id, "comcast", sizeof(cfg.partner_id));
|
||||
|
||||
will_return(get_parodus_cfg, (intptr_t)&cfg);
|
||||
expect_function_call(get_parodus_cfg);
|
||||
|
||||
@@ -38,7 +38,16 @@ pthread_t threadId;
|
||||
/* Tests */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
void addCRUDmsgToQueue(wrp_msg_t *crudMsg)
|
||||
{
|
||||
(void)crudMsg;
|
||||
return;
|
||||
}
|
||||
|
||||
void *CRUDHandlerTask()
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
static void add_client()
|
||||
{
|
||||
const wrp_msg_t reg = { .msg_type = WRP_MSG_TYPE__SVC_REGISTRATION,
|
||||
@@ -77,13 +86,23 @@ static void *client_rcv_task()
|
||||
int byte =0;
|
||||
int rv1=0;
|
||||
int t=25000;
|
||||
int rc = -1;
|
||||
int bind;
|
||||
wrp_msg_t *msg1;
|
||||
|
||||
sock1 = nn_socket (AF_SP, NN_PULL);
|
||||
nn_bind(sock1, TEST_SERVICE_URL);
|
||||
bind = nn_bind(sock1, TEST_SERVICE_URL);
|
||||
if(bind < 0)
|
||||
{
|
||||
ParodusError("Unable to bind socket (errno=%d, %s)\n",errno, strerror(errno));
|
||||
}
|
||||
|
||||
void *buf = NULL;
|
||||
nn_setsockopt(sock1, NN_SOL_SOCKET, NN_RCVTIMEO, &t, sizeof(t));
|
||||
rc = nn_setsockopt(sock1, NN_SOL_SOCKET, NN_RCVTIMEO, &t, sizeof(t));
|
||||
if(rc < 0)
|
||||
{
|
||||
ParodusError ("Unable to set socket timeout (errno=%d, %s)\n",errno, strerror(errno));
|
||||
}
|
||||
|
||||
ParodusPrint("Client 1 waiting for acknowledgement \n");
|
||||
byte = nn_recv(sock1, &buf, NN_MSG, 0);
|
||||
@@ -104,6 +123,11 @@ static void *client_rcv_task()
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void handler(int signum)
|
||||
{
|
||||
UNUSED(signum);
|
||||
pthread_exit(NULL);
|
||||
}
|
||||
|
||||
static void *keep_alive_thread()
|
||||
{
|
||||
@@ -134,9 +158,10 @@ void test_keep_alive()
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusPrint("Thread created Successfully %d\n", (int ) threadId);
|
||||
ParodusPrint("Thread created Successfully %p\n", threadId);
|
||||
}
|
||||
sleep(3);
|
||||
signal(SIGUSR1, handler);
|
||||
|
||||
while( 1 )
|
||||
{
|
||||
@@ -146,9 +171,9 @@ void test_keep_alive()
|
||||
if(byte >0)
|
||||
{
|
||||
ParodusInfo("Received keep alive msg!!! : %s \n", (char * )buf);
|
||||
kill(threadId, SIGKILL);
|
||||
pthread_kill(threadId, SIGUSR1);
|
||||
|
||||
ParodusInfo("keep_alive_thread with tid %d is stopped\n", threadId);
|
||||
ParodusInfo("keep_alive_thread with tid %p is stopped\n", threadId);
|
||||
break;
|
||||
}
|
||||
else
|
||||
@@ -177,7 +202,6 @@ void add_suites( CU_pSuite *suite )
|
||||
ParodusInfo("--------Start of Test Cases Execution ---------\n");
|
||||
*suite = CU_add_suite( "tests", NULL, NULL );
|
||||
CU_add_test( *suite, "Test 1", test_keep_alive );
|
||||
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
187
tests/test_seshat_interface.c
Normal file
187
tests/test_seshat_interface.c
Normal file
@@ -0,0 +1,187 @@
|
||||
/**
|
||||
* Copyright 2010-2016 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
#include <stdarg.h>
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdarg.h>
|
||||
#include <stddef.h>
|
||||
#include <setjmp.h>
|
||||
#include <cmocka.h>
|
||||
#include <assert.h>
|
||||
#include <nopoll.h>
|
||||
|
||||
#include "../src/ParodusInternal.h"
|
||||
#include "../src/seshat_interface.h"
|
||||
#include "../src/config.h"
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Macros */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
#define URL "url"
|
||||
#define LRU "lru"
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Function Prototypes */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* File Scoped Variables */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
ParodusCfg g_config;
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Mocks */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
ParodusCfg *get_parodus_cfg(void)
|
||||
{
|
||||
return &g_config;
|
||||
}
|
||||
|
||||
int init_lib_seshat (const char *url)
|
||||
{
|
||||
UNUSED(url);
|
||||
function_called();
|
||||
return (int) mock();
|
||||
}
|
||||
|
||||
int shutdown_seshat_lib (void)
|
||||
{
|
||||
function_called();
|
||||
return (int) mock();
|
||||
}
|
||||
|
||||
int seshat_register(const char *service, const char *url)
|
||||
{
|
||||
UNUSED(service); UNUSED(url);
|
||||
function_called();
|
||||
return (int) mock();
|
||||
}
|
||||
|
||||
char* seshat_discover(const char *service)
|
||||
{
|
||||
UNUSED(service);
|
||||
function_called();
|
||||
return (char *) mock();
|
||||
}
|
||||
|
||||
int allow_insecure_conn(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Tests */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
void test_all_pass()
|
||||
{
|
||||
parStrncpy(g_config.local_url, URL, sizeof(g_config.local_url));
|
||||
|
||||
will_return(init_lib_seshat, 0);
|
||||
expect_function_call(init_lib_seshat);
|
||||
|
||||
will_return(seshat_register, 0);
|
||||
expect_function_call(seshat_register);
|
||||
|
||||
char *d_url = malloc(sizeof(g_config.local_url));
|
||||
parStrncpy(d_url, g_config.local_url, sizeof(g_config.local_url));
|
||||
will_return(seshat_discover, d_url);
|
||||
expect_function_call(seshat_discover);
|
||||
|
||||
will_return(shutdown_seshat_lib, 0);
|
||||
expect_function_call(shutdown_seshat_lib);
|
||||
|
||||
assert_true(__registerWithSeshat());
|
||||
memset(&g_config, '\0', sizeof(g_config));
|
||||
}
|
||||
|
||||
void test_init_fail()
|
||||
{
|
||||
will_return(init_lib_seshat, -1);
|
||||
expect_function_call(init_lib_seshat);
|
||||
|
||||
will_return(shutdown_seshat_lib, 0);
|
||||
expect_function_call(shutdown_seshat_lib);
|
||||
|
||||
assert_false(__registerWithSeshat());
|
||||
}
|
||||
|
||||
void test_register_fail()
|
||||
{
|
||||
will_return(init_lib_seshat, 0);
|
||||
expect_function_call(init_lib_seshat);
|
||||
|
||||
will_return(seshat_register, -1);
|
||||
expect_function_call(seshat_register);
|
||||
|
||||
will_return(shutdown_seshat_lib, 0);
|
||||
expect_function_call(shutdown_seshat_lib);
|
||||
|
||||
assert_false(__registerWithSeshat());
|
||||
}
|
||||
|
||||
void test_discover_fail()
|
||||
{
|
||||
will_return(init_lib_seshat, 0);
|
||||
expect_function_call(init_lib_seshat);
|
||||
|
||||
will_return(seshat_register, 0);
|
||||
expect_function_call(seshat_register);
|
||||
|
||||
will_return(seshat_discover, 0);
|
||||
expect_function_call(seshat_discover);
|
||||
|
||||
will_return(shutdown_seshat_lib, 0);
|
||||
expect_function_call(shutdown_seshat_lib);
|
||||
|
||||
assert_false(__registerWithSeshat());
|
||||
}
|
||||
|
||||
void test_discover_pass_but_lru_expected_fail()
|
||||
{
|
||||
parStrncpy(g_config.local_url, URL, sizeof(g_config.local_url));
|
||||
|
||||
will_return(init_lib_seshat, 0);
|
||||
expect_function_call(init_lib_seshat);
|
||||
|
||||
will_return(seshat_register, 0);
|
||||
expect_function_call(seshat_register);
|
||||
|
||||
char *d_url = malloc(sizeof(g_config.local_url));
|
||||
parStrncpy(d_url, LRU, sizeof(g_config.local_url));
|
||||
will_return(seshat_discover, d_url);
|
||||
expect_function_call(seshat_discover);
|
||||
|
||||
will_return(shutdown_seshat_lib, 0);
|
||||
expect_function_call(shutdown_seshat_lib);
|
||||
|
||||
assert_false(__registerWithSeshat());
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* External Functions */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
int main(void)
|
||||
{
|
||||
const struct CMUnitTest tests[] = {
|
||||
cmocka_unit_test(test_all_pass),
|
||||
cmocka_unit_test(test_init_fail),
|
||||
cmocka_unit_test(test_register_fail),
|
||||
cmocka_unit_test(test_discover_fail),
|
||||
cmocka_unit_test(test_discover_pass_but_lru_expected_fail),
|
||||
};
|
||||
|
||||
return cmocka_run_group_tests(tests, NULL, NULL);
|
||||
}
|
||||
61
tests/test_seshat_interface_stub.c
Normal file
61
tests/test_seshat_interface_stub.c
Normal file
@@ -0,0 +1,61 @@
|
||||
/**
|
||||
* Copyright 2010-2016 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
#include <stdarg.h>
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdarg.h>
|
||||
#include <stddef.h>
|
||||
#include <setjmp.h>
|
||||
#include <cmocka.h>
|
||||
#include <assert.h>
|
||||
|
||||
#include "../src/seshat_interface.h"
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Macros */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Function Prototypes */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* File Scoped Variables */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Mocks */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Tests */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
void test_registration()
|
||||
{
|
||||
assert_true(__registerWithSeshat());
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* External Functions */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
int main(void)
|
||||
{
|
||||
const struct CMUnitTest tests[] = {
|
||||
cmocka_unit_test(test_registration),
|
||||
};
|
||||
|
||||
return cmocka_run_group_tests(tests, NULL, NULL);
|
||||
}
|
||||
731
tests/test_token.c
Normal file
731
tests/test_token.c
Normal file
@@ -0,0 +1,731 @@
|
||||
/**
|
||||
* Copyright 2010-2016 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
#include <stdarg.h>
|
||||
|
||||
#include <CUnit/Basic.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdarg.h>
|
||||
#include <stddef.h>
|
||||
#include <setjmp.h>
|
||||
#include <resolv.h>
|
||||
#include <cmocka.h>
|
||||
#include <assert.h>
|
||||
#include <cjwt/cjwt.h>
|
||||
#include <wrp-c.h>
|
||||
|
||||
#include "../src/token.h"
|
||||
#include "../src/ParodusInternal.h"
|
||||
#include "../src/connection.h"
|
||||
#include "../src/config.h"
|
||||
|
||||
const char *header = "{ \"alg\": \"RS256\", \"typ\": \"JWT\"}";
|
||||
|
||||
time_t exp_time_good = 2147483647; // 1/18/2038
|
||||
time_t exp_time_bad = 1463955372; // 5/22/2016
|
||||
|
||||
|
||||
const char *payload_good = "{" \
|
||||
"\"iss\": \"SHA256:jdcRysFunWUAT852huQoIM9GN6k2s5c7iTMTMgujPAk\"," \
|
||||
"\"endpoint\": \"https://mydns.mycom.net:8080/\"}";
|
||||
|
||||
const char *payload_insec = "{" \
|
||||
"\"iss\": \"SHA256:jdcRysFunWUAT852huQoIM9GN6k2s5c7iTMTMgujPAk\"," \
|
||||
"\"endpoint\": \"http://mydns.mycom.net:8080/\"}";
|
||||
|
||||
// missing endpoint
|
||||
const char *payload_no_end = "{" \
|
||||
"\"iss\": \"SHA256:jdcRysFunWUAT852huQoIM9GN6k2s5c7iTMTMgujPAk\"}";
|
||||
|
||||
const char *txt_record_id = "aabbccddeeff.test.webpa.comcast.net";
|
||||
|
||||
#define MAX_RR_RECS 10
|
||||
|
||||
/*
|
||||
expiration = 2147483647 #1/18/2038
|
||||
endpoint = "https://mydns.mycom.net:8080/"
|
||||
|
||||
dns_rec_claims = {
|
||||
'iss': u'SHA256:jdcRysFunWUAT852huQoIM9GN6k2s5c7iTMTMgujPAk',
|
||||
'endpoint': endpoint,
|
||||
'exp': expiration
|
||||
}
|
||||
*/
|
||||
const char *dns_recs_test =
|
||||
"\"03:iJmBr4pGROCCbRlbL3GpGDcSFJcaqBQFOriTRk0xKQ\"\n"
|
||||
"\"01:eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJTSEEyNTY6amRjUnlzRnVuV1VBVDg1Mmh1UW9JTTlHTjZrMnM1YzdpVE1UTWd1alBBayIsImVuZHBvaW50IjoiaHR0cHM6Ly9teWRucy5teWNvbS5uZXQ6ODA4MC8iLCJleHAiOjIxNDc0ODM2NDd9.VjG2PzPws2J707PiEaUGOTXD9NWnrGyfAUvvfyXFw-Px3gx5wg1\"\n"
|
||||
"\"02:EXGyJQXrxMYuepAiFPT0sWxvydHvZKxcx7S5MCmlOhRpWZRrzgFceNWMwFcRPAPxovOoc4aYvx2DqGMdckmAD1q3y3Gjjw1qyxd4503jmrXKfjrdW3eFZD_Q454iRVf4c0CMWA5tl0ElOlX9u_HC3G_dPiKGUBU5PpWONgHpg2-ewrQcUe4-J4hBQmqZmRSB9n-6zB1XD80cDQO7aHeJ9aysJS1vgmwaSuT9y6PhPsp05NUC0TDzZVJUX\"\n"
|
||||
;
|
||||
|
||||
const char *dns_recs_extra =
|
||||
"\"03:iJmBr4pGROCCbRlbL3GpGDcSFJcaqBQFOriTRk0xKQ\"\n"
|
||||
"\"01:eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJTSEEyNTY6amRjUnlzRnVuV1VBVDg1Mmh1UW9JTTlHTjZrMnM1YzdpVE1UTWd1alBBayIsImVuZHBvaW50IjoiaHR0cHM6Ly9teWRucy5teWNvbS5uZXQ6ODA4MC8iLCJleHAiOjIxNDc0ODM2NDd9.VjG2PzPws2J707PiEaUGOTXD9NWnrGyfAUvvfyXFw-Px3gx5wg1\"\n"
|
||||
"\n" // non-txt record type
|
||||
"\"02:EXGyJQXrxMYuepAiFPT0sWxvydHvZKxcx7S5MCmlOhRpWZRrzgFceNWMwFcRPAPxovOoc4aYvx2DqGMdckmAD1q3y3Gjjw1qyxd4503jmrXKfjrdW3eFZD_Q454iRVf4c0CMWA5tl0ElOlX9u_HC3G_dPiKGUBU5PpWONgHpg2-ewrQcUe4-J4hBQmqZmRSB9n-6zB1XD80cDQO7aHeJ9aysJS1vgmwaSuT9y6PhPsp05NUC0TDzZVJUX\"\n"
|
||||
;
|
||||
|
||||
char *rr_recs_test[] = {
|
||||
"eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJTSEEyNTY6amRjUnlzRnVuV1VBVDg1Mmh1UW9JTTlHTjZrMnM1YzdpVE1UTWd1alBBayIsImVuZHBvaW50IjoiaHR0cHM6Ly9teWRucy5teWNvbS5uZXQ6ODA4MC8iLCJleHAiOjIxNDc0ODM2NDd9.VjG2PzPws2J707PiEaUGOTXD9NWnrGyfAUvvfyXFw-Px3gx5wg1",
|
||||
"EXGyJQXrxMYuepAiFPT0sWxvydHvZKxcx7S5MCmlOhRpWZRrzgFceNWMwFcRPAPxovOoc4aYvx2DqGMdckmAD1q3y3Gjjw1qyxd4503jmrXKfjrdW3eFZD_Q454iRVf4c0CMWA5tl0ElOlX9u_HC3G_dPiKGUBU5PpWONgHpg2-ewrQcUe4-J4hBQmqZmRSB9n-6zB1XD80cDQO7aHeJ9aysJS1vgmwaSuT9y6PhPsp05NUC0TDzZVJUX",
|
||||
"iJmBr4pGROCCbRlbL3GpGDcSFJcaqBQFOriTRk0xKQ"
|
||||
};
|
||||
|
||||
char *dns_jwt_test =
|
||||
"eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJTSEEyNTY6amRjUnlzRnVuV1VBVDg1Mmh1UW9JTTlHTjZrMnM1YzdpVE1UTWd1alBBayIsImVuZHBvaW50IjoiaHR0cHM6Ly9teWRucy5teWNvbS5uZXQ6ODA4MC8iLCJleHAiOjIxNDc0ODM2NDd9.VjG2PzPws2J707PiEaUGOTXD9NWnrGyfAUvvfyXFw-Px3gx5wg1"
|
||||
"EXGyJQXrxMYuepAiFPT0sWxvydHvZKxcx7S5MCmlOhRpWZRrzgFceNWMwFcRPAPxovOoc4aYvx2DqGMdckmAD1q3y3Gjjw1qyxd4503jmrXKfjrdW3eFZD_Q454iRVf4c0CMWA5tl0ElOlX9u_HC3G_dPiKGUBU5PpWONgHpg2-ewrQcUe4-J4hBQmqZmRSB9n-6zB1XD80cDQO7aHeJ9aysJS1vgmwaSuT9y6PhPsp05NUC0TDzZVJUX"
|
||||
"iJmBr4pGROCCbRlbL3GpGDcSFJcaqBQFOriTRk0xKQ"
|
||||
;
|
||||
|
||||
|
||||
/*
|
||||
expiration = 2147483647 #1/18/2038
|
||||
endpoint = "https://mydns.mycom.net:8080/"
|
||||
|
||||
dns_rec2_claims = {
|
||||
'endpoint': endpoint
|
||||
}
|
||||
*/
|
||||
// no exp in it
|
||||
const char *dns_recs2_test =
|
||||
"\"eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbmRwb2ludCI6Imh0dHBzOi8vbXlkbnMubXljb20ubmV0OjgwODAvIn0.YkudDhp7Ifr6wTsCfrYUUeRf1CMKannC6Bx994OrcBVwqNQ1G5uBXEgsslUnbqV_7FTGPp1Vs058qncmIXtEYxVlHt-mn1UEm6hyC_QGi9FfMHYBS7QHwcCIs467XUFMZayQ3upzZNXObhzJNF0-RR72S61cjSGqf1z5KgyBtoANtW6xCdWB5VV6CqCxlmJNj6d4N8vKiUvN346-UgB_H4AuaXCNdXJ2NP2DxRec-oNTCjhNzRn-6MaB-UwW_gD9CYfQ0vrw2Nv8dO1Sk5Ku94cdIfvUEft-kyqPGKmK8soIggjvmvW0JEPYwrWYY9Ry5SQf80-dLOPXCQSQ3Rzy7Q\""
|
||||
;
|
||||
|
||||
// no exp in it
|
||||
char *rr_recs2_test[] = {
|
||||
"eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbmRwb2ludCI6Imh0dHBzOi8vbXlkbnMubXljb20ubmV0OjgwODAvIn0.YkudDhp7Ifr6wTsCfrYUUeRf1CMKannC6Bx994OrcBVwqNQ1G5uBXEgsslUnbqV_7FTGPp1Vs058qncmIXtEYxVlHt-mn1UEm6hyC_QGi9FfMHYBS7QHwcCIs467XUFMZayQ3upzZNXObhzJNF0-RR72S61cjSGqf1z5KgyBtoANtW6xCdWB5VV6CqCxlmJNj6d4N8vKiUvN346-UgB_H4AuaXCNdXJ2NP2DxRec-oNTCjhNzRn-6MaB-UwW_gD9CYfQ0vrw2Nv8dO1Sk5Ku94cdIfvUEft-kyqPGKmK8soIggjvmvW0JEPYwrWYY9Ry5SQf80-dLOPXCQSQ3Rzy7Q"
|
||||
};
|
||||
|
||||
const char *dns_recs_err1 = // missing seq
|
||||
"\"03:iJmBr4pGROCCbRlbL3GpGDcSFJcaqBQFOriTRk0xKQ\"\n"
|
||||
"\"eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJTSEEyNTY6amRjUnlzRnVuV1VBVDg1Mmh1UW9JTTlHTjZrMnM1YzdpVE1UTWd1alBBayIsImVuZHBvaW50IjoiaHR0cHM6Ly9teWRucy5teWNvbS5uZXQ6ODA4MC8iLCJleHAiOjIxNDc0ODM2NDd9.VjG2PzPws2J707PiEaUGOTXD9NWnrGyfAUvvfyXFw-Px3gx5wg1\"\n"
|
||||
"\"02:EXGyJQXrxMYuepAiFPT0sWxvydHvZKxcx7S5MCmlOhRpWZRrzgFceNWMwFcRPAPxovOoc4aYvx2DqGMdckmAD1q3y3Gjjw1qyxd4503jmrXKfjrdW3eFZD_Q454iRVf4c0CMWA5tl0ElOlX9u_HC3G_dPiKGUBU5PpWONgHpg2-ewrQcUe4-J4hBQmqZmRSB9n-6zB1XD80cDQO7aHeJ9aysJS1vgmwaSuT9y6PhPsp05NUC0TDzZVJUX\"\n"
|
||||
;
|
||||
|
||||
const char *dns_recs_err2 = // invalid seq
|
||||
"\"03:iJmBr4pGROCCbRlbL3GpGDcSFJcaqBQFOriTRk0xKQ\"\n"
|
||||
"\"0:eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJTSEEyNTY6amRjUnlzRnVuV1VBVDg1Mmh1UW9JTTlHTjZrMnM1YzdpVE1UTWd1alBBayIsImVuZHBvaW50IjoiaHR0cHM6Ly9teWRucy5teWNvbS5uZXQ6ODA4MC8iLCJleHAiOjIxNDc0ODM2NDd9.VjG2PzPws2J707PiEaUGOTXD9NWnrGyfAUvvfyXFw-Px3gx5wg1\"\n"
|
||||
"\"02:EXGyJQXrxMYuepAiFPT0sWxvydHvZKxcx7S5MCmlOhRpWZRrzgFceNWMwFcRPAPxovOoc4aYvx2DqGMdckmAD1q3y3Gjjw1qyxd4503jmrXKfjrdW3eFZD_Q454iRVf4c0CMWA5tl0ElOlX9u_HC3G_dPiKGUBU5PpWONgHpg2-ewrQcUe4-J4hBQmqZmRSB9n-6zB1XD80cDQO7aHeJ9aysJS1vgmwaSuT9y6PhPsp05NUC0TDzZVJUX\"\n"
|
||||
;
|
||||
|
||||
const char *dns_recs_err3 = // invalid seq too high
|
||||
"\"03:iJmBr4pGROCCbRlbL3GpGDcSFJcaqBQFOriTRk0xKQ\"\n"
|
||||
"\"99:eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJTSEEyNTY6amRjUnlzRnVuV1VBVDg1Mmh1UW9JTTlHTjZrMnM1YzdpVE1UTWd1alBBayIsImVuZHBvaW50IjoiaHR0cHM6Ly9teWRucy5teWNvbS5uZXQ6ODA4MC8iLCJleHAiOjIxNDc0ODM2NDd9.VjG2PzPws2J707PiEaUGOTXD9NWnrGyfAUvvfyXFw-Px3gx5wg1\"\n"
|
||||
"\"02:EXGyJQXrxMYuepAiFPT0sWxvydHvZKxcx7S5MCmlOhRpWZRrzgFceNWMwFcRPAPxovOoc4aYvx2DqGMdckmAD1q3y3Gjjw1qyxd4503jmrXKfjrdW3eFZD_Q454iRVf4c0CMWA5tl0ElOlX9u_HC3G_dPiKGUBU5PpWONgHpg2-ewrQcUe4-J4hBQmqZmRSB9n-6zB1XD80cDQO7aHeJ9aysJS1vgmwaSuT9y6PhPsp05NUC0TDzZVJUX\"\n"
|
||||
;
|
||||
|
||||
const char *dns_recs_err4 = // duplicate seq number
|
||||
"\"03:iJmBr4pGROCCbRlbL3GpGDcSFJcaqBQFOriTRk0xKQ\"\n"
|
||||
"\"03:iJmBr4pGROCCbRlbL3GpGDcSFJcaqBQFOriTRk0xKQ\"\n"
|
||||
"\"01:eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJTSEEyNTY6amRjUnlzRnVuV1VBVDg1Mmh1UW9JTTlHTjZrMnM1YzdpVE1UTWd1alBBayIsImVuZHBvaW50IjoiaHR0cHM6Ly9teWRucy5teWNvbS5uZXQ6ODA4MC8iLCJleHAiOjIxNDc0ODM2NDd9.VjG2PzPws2J707PiEaUGOTXD9NWnrGyfAUvvfyXFw-Px3gx5wg1\"\n"
|
||||
"\"02:EXGyJQXrxMYuepAiFPT0sWxvydHvZKxcx7S5MCmlOhRpWZRrzgFceNWMwFcRPAPxovOoc4aYvx2DqGMdckmAD1q3y3Gjjw1qyxd4503jmrXKfjrdW3eFZD_Q454iRVf4c0CMWA5tl0ElOlX9u_HC3G_dPiKGUBU5PpWONgHpg2-ewrQcUe4-J4hBQmqZmRSB9n-6zB1XD80cDQO7aHeJ9aysJS1vgmwaSuT9y6PhPsp05NUC0TDzZVJUX\"\n"
|
||||
;
|
||||
|
||||
const char *dns_recs_err5 = // missing rec 1
|
||||
"\"03:iJmBr4pGROCCbRlbL3GpGDcSFJcaqBQFOriTRk0xKQ\"\n"
|
||||
"\n" // non-txt record type
|
||||
"\"02:EXGyJQXrxMYuepAiFPT0sWxvydHvZKxcx7S5MCmlOhRpWZRrzgFceNWMwFcRPAPxovOoc4aYvx2DqGMdckmAD1q3y3Gjjw1qyxd4503jmrXKfjrdW3eFZD_Q454iRVf4c0CMWA5tl0ElOlX9u_HC3G_dPiKGUBU5PpWONgHpg2-ewrQcUe4-J4hBQmqZmRSB9n-6zB1XD80cDQO7aHeJ9aysJS1vgmwaSuT9y6PhPsp05NUC0TDzZVJUX\"\n"
|
||||
;
|
||||
|
||||
cjwt_t jwt1; // secure, payload good
|
||||
cjwt_t jwt2; // secure, payload good, but expired
|
||||
cjwt_t jwt3; // insecure
|
||||
cjwt_t jwt4; // missing endpoint
|
||||
|
||||
// internal functions in token.c to be tested
|
||||
extern int analyze_jwt (const cjwt_t *jwt, char *url_buf, int url_buflen,
|
||||
char *port_buf, int port_buflen);
|
||||
extern bool validate_algo(const cjwt_t *jwt);
|
||||
extern int nquery(const char* dns_txt_record_id,u_char *nsbuf);
|
||||
extern bool valid_b64_char (char c);
|
||||
extern const char *strip_rr_data (const char *rr_ptr, int *rrlen);
|
||||
extern int find_seq_num (const char *rr_ptr, int rrlen);
|
||||
extern int get_rr_seq_num (const char *rr_ptr, int rrlen);
|
||||
extern int get_rr_seq_table (ns_msg *msg_handle, int num_rr_recs, rr_rec_t *seq_table);
|
||||
extern int assemble_jwt_from_dns (ns_msg *msg_handle, int num_rr_recs, char *jwt_ans);
|
||||
extern int query_dns(const char* dns_txt_record_id,char *jwt_ans);
|
||||
extern void read_key_from_file (const char *fname, char *buf, size_t buflen);
|
||||
extern const char *get_tok (const char *src, int delim, char *result, int resultsize);
|
||||
extern unsigned int get_algo_mask (const char *algo_str);
|
||||
|
||||
void addCRUDmsgToQueue(wrp_msg_t *crudMsg)
|
||||
{
|
||||
(void)crudMsg;
|
||||
return;
|
||||
}
|
||||
|
||||
void *CRUDHandlerTask()
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int setup_test_jwts (void)
|
||||
{
|
||||
memset (&jwt1, 0, sizeof(cjwt_t));
|
||||
jwt1.exp.tv_sec = exp_time_good;
|
||||
jwt1.private_claims = cJSON_Parse ((char *) payload_good);
|
||||
if (NULL == jwt1.private_claims) {
|
||||
printf ("Invalid json struct payload_good\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
memset (&jwt2, 0, sizeof(cjwt_t));
|
||||
jwt2.exp.tv_sec = exp_time_bad;
|
||||
jwt2.private_claims = cJSON_Parse ((char *) payload_good);
|
||||
if (NULL == jwt2.private_claims) {
|
||||
printf ("Invalid json struct payload_good\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
memset (&jwt3, 0, sizeof(cjwt_t));
|
||||
jwt3.exp.tv_sec = exp_time_good;
|
||||
jwt3.private_claims = cJSON_Parse ((char *) payload_insec);
|
||||
if (NULL == jwt3.private_claims) {
|
||||
printf ("Invalid json struct payload_insec\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
memset (&jwt4, 0, sizeof(cjwt_t));
|
||||
jwt4.exp.tv_sec = exp_time_good;
|
||||
jwt4.private_claims = cJSON_Parse ((char *) payload_no_end);
|
||||
if (NULL == jwt4.private_claims) {
|
||||
printf ("Invalid json struct payload_good\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_dns_text (const char *dns_rec_id, u_char *nsbuf, int bufsize)
|
||||
{
|
||||
const char *rec = NULL;
|
||||
|
||||
if (strstr (dns_rec_id, ".test.") != NULL)
|
||||
rec = dns_recs_test;
|
||||
else if (strstr (dns_rec_id, ".extra.") != NULL)
|
||||
rec = dns_recs_extra;
|
||||
else if (strstr (dns_rec_id, ".test2.") != NULL)
|
||||
rec = dns_recs2_test;
|
||||
else if (strstr (dns_rec_id, ".err1.") != NULL)
|
||||
rec = dns_recs_err1;
|
||||
else if (strstr (dns_rec_id, ".err2.") != NULL)
|
||||
rec = dns_recs_err2;
|
||||
else if (strstr (dns_rec_id, ".err3.") != NULL)
|
||||
rec = dns_recs_err3;
|
||||
else if (strstr (dns_rec_id, ".err4.") != NULL)
|
||||
rec = dns_recs_err4;
|
||||
else if (strstr (dns_rec_id, ".err5.") != NULL)
|
||||
rec = dns_recs_err5;
|
||||
else
|
||||
return -1;
|
||||
strncpy ((char *) nsbuf, rec, bufsize);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Mocks */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
// These mocks assume that the pieces of a dns txt record end with '\n';
|
||||
|
||||
|
||||
int ns_initparse(const u_char *nsbuf, int l, ns_msg *msg_handle)
|
||||
{
|
||||
UNUSED(l);
|
||||
char *buf = (char*) nsbuf;
|
||||
char *next;
|
||||
int i, count = 0;
|
||||
|
||||
msg_handle->_msg_ptr = nsbuf;
|
||||
while (true)
|
||||
{
|
||||
if (buf[0] == 0)
|
||||
break;
|
||||
count++;
|
||||
next = strchr (buf, '\n');
|
||||
if (NULL == next)
|
||||
break;
|
||||
*next = 0;
|
||||
buf = ++next;
|
||||
}
|
||||
for (i=0; i<ns_s_max; i++) {
|
||||
if (i == ns_s_an)
|
||||
msg_handle->_counts[i] = count;
|
||||
else
|
||||
msg_handle->_counts[i] = 0;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int ns_parserr(ns_msg *msg_handle, ns_sect sect, int rec, ns_rr *rr)
|
||||
{
|
||||
UNUSED(sect);
|
||||
int i, l;
|
||||
char *ptr = (char *) msg_handle->_msg_ptr;
|
||||
|
||||
if (rec >= msg_handle->_counts[ns_s_an]) {
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
|
||||
for (i=0; i < rec; i++) {
|
||||
l = strlen (ptr);
|
||||
ptr += (l+1);
|
||||
}
|
||||
|
||||
l = strlen(ptr);
|
||||
if (l == 0) {
|
||||
rr->type = ns_t_key;
|
||||
} else {
|
||||
rr->type = ns_t_txt;
|
||||
}
|
||||
rr->rdata = (u_char *) ptr;
|
||||
rr->rdlength = l;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int __res_ninit (res_state statp)
|
||||
{
|
||||
UNUSED(statp);
|
||||
function_called ();
|
||||
return (int) mock();
|
||||
}
|
||||
|
||||
int __res_nquery (res_state statp, const char * txt_record,
|
||||
int class, int type_, u_char * buf, int bufsize)
|
||||
{
|
||||
UNUSED(statp); UNUSED(class); UNUSED(type_);
|
||||
int ret = get_dns_text (txt_record, buf, bufsize);
|
||||
if (ret == 0)
|
||||
return strlen ( (char*) buf);
|
||||
else
|
||||
return -1;
|
||||
}
|
||||
|
||||
void __res_nclose (res_state statp)
|
||||
{
|
||||
UNUSED (statp);
|
||||
function_called ();
|
||||
}
|
||||
|
||||
// Analyzes a jwt structure
|
||||
void test_analyze_jwt ()
|
||||
{
|
||||
char port[8];
|
||||
char server_Address[256];
|
||||
int ret = setup_test_jwts ();
|
||||
assert_int_equal (ret, 0);
|
||||
ret = analyze_jwt (&jwt1, server_Address, (int) sizeof(server_Address),
|
||||
port, (int) sizeof(port));
|
||||
assert_int_equal (ret, 0);
|
||||
assert_string_equal (server_Address, "mydns.mycom.net");
|
||||
assert_string_equal (port, "8080");
|
||||
ret = analyze_jwt (&jwt2, server_Address, (int) sizeof(server_Address),
|
||||
port, (int) sizeof(port));
|
||||
assert_int_equal (ret, TOKEN_ERR_JWT_EXPIRED);
|
||||
ret = analyze_jwt (&jwt3, server_Address, (int) sizeof(server_Address),
|
||||
port, (int) sizeof(port));
|
||||
assert_int_equal (ret, 1);
|
||||
ret = analyze_jwt (&jwt4, server_Address, (int) sizeof(server_Address),
|
||||
port, (int) sizeof(port));
|
||||
assert_int_equal (ret, TOKEN_ERR_INVALID_JWT_CONTENT);
|
||||
}
|
||||
|
||||
void test_validate_algo ()
|
||||
{
|
||||
bool ret;
|
||||
ParodusCfg cfg;
|
||||
cfg.jwt_algo = 1025;
|
||||
set_parodus_cfg (&cfg);
|
||||
jwt1.header.alg = alg_rs256;
|
||||
ret = validate_algo (&jwt1);
|
||||
assert_int_equal (ret, 1);
|
||||
jwt1.header.alg = alg_rs512;
|
||||
ret = validate_algo (&jwt1);
|
||||
assert_int_equal (ret, 0);
|
||||
}
|
||||
|
||||
void test_nquery ()
|
||||
{
|
||||
int len;
|
||||
u_char nsbuf[8192];
|
||||
|
||||
will_return (__res_ninit, 0);
|
||||
expect_function_call (__res_ninit);
|
||||
|
||||
expect_function_call (__res_nclose);
|
||||
|
||||
len = nquery (txt_record_id, nsbuf);
|
||||
assert_int_equal (len, strlen(dns_recs_test));
|
||||
|
||||
will_return (__res_ninit, -1);
|
||||
expect_function_call (__res_ninit);
|
||||
|
||||
len = nquery (txt_record_id, nsbuf);
|
||||
assert_int_equal (len, -1);
|
||||
|
||||
will_return (__res_ninit, 0);
|
||||
expect_function_call (__res_ninit);
|
||||
|
||||
len = nquery (".nosuch.", nsbuf);
|
||||
assert_int_equal (len, -1);
|
||||
|
||||
}
|
||||
|
||||
void test_valid_b64_char()
|
||||
{
|
||||
assert_int_equal (valid_b64_char ('A'), 1);
|
||||
assert_int_equal (valid_b64_char ('@'), 0);
|
||||
}
|
||||
|
||||
void test_strip_rrdata ()
|
||||
{
|
||||
const char *s1 = "\"01:this-is-the-test-string-\"\n";
|
||||
const char *s2 = "\"01:this-is-the-test-string-\n";
|
||||
const char *ss1 = "01:this-is-the-test-string-";
|
||||
int s1len = strlen (ss1);
|
||||
const char *result;
|
||||
int rlen;
|
||||
|
||||
rlen = strlen (s1);
|
||||
result = strip_rr_data (s1, &rlen);
|
||||
assert_int_equal (rlen, s1len);
|
||||
if (rlen == s1len) {
|
||||
assert_int_equal (strncmp (result, ss1, rlen), 0);
|
||||
}
|
||||
|
||||
rlen = strlen (s2);
|
||||
result = strip_rr_data (s2, &rlen);
|
||||
assert_int_equal (rlen, s1len);
|
||||
if (rlen == s1len) {
|
||||
assert_int_equal (strncmp (result, ss1, rlen), 0);
|
||||
}
|
||||
}
|
||||
|
||||
void test_find_seq_num ()
|
||||
{
|
||||
int pos;
|
||||
const char *s1 = "01:this-is-it";
|
||||
const char *s2 = "1:this-is-it";
|
||||
const char *s3 = ":this-is-it";
|
||||
const char *s4 = ".01:this-is-it";
|
||||
const char *s5 = "..01:this-is-it";
|
||||
const char *s6 = "99999";
|
||||
const char *s7 = "xxxxx";
|
||||
|
||||
pos = find_seq_num (s1, strlen(s1));
|
||||
assert_int_equal (pos, 0);
|
||||
|
||||
pos = find_seq_num (s2, strlen(s2));
|
||||
assert_int_equal (pos, -2);
|
||||
|
||||
pos = find_seq_num (s3, strlen(s3));
|
||||
assert_int_equal (pos, -2);
|
||||
|
||||
pos = find_seq_num (s4, strlen(s4));
|
||||
assert_int_equal (pos, 1);
|
||||
|
||||
pos = find_seq_num (s5, strlen(s5));
|
||||
assert_int_equal (pos, 2);
|
||||
|
||||
pos = find_seq_num (s6, strlen(s6));
|
||||
assert_int_equal (pos, -1);
|
||||
|
||||
pos = find_seq_num (s7, strlen(s7));
|
||||
assert_int_equal (pos, -1);
|
||||
}
|
||||
|
||||
void test_get_rr_seq_num ()
|
||||
{
|
||||
int result;
|
||||
const char *s1 = "01:this-is-it";
|
||||
const char *s2 = "1:this-is-it";
|
||||
const char *s3 = ":this-is-it";
|
||||
const char *s4 = "11:this-is-it";
|
||||
|
||||
result = get_rr_seq_num (s1, strlen(s1));
|
||||
assert_int_equal (result, 1);
|
||||
|
||||
result = get_rr_seq_num (s2, strlen(s2));
|
||||
assert_int_equal (result, -1);
|
||||
|
||||
result = get_rr_seq_num (s3, strlen(s3));
|
||||
assert_int_equal (result, -1);
|
||||
|
||||
result = get_rr_seq_num (s4, strlen(s4));
|
||||
assert_int_equal (result, 11);
|
||||
}
|
||||
|
||||
void test_get_rr_seq_table()
|
||||
{
|
||||
#define SEQ_TABLE_SIZE (MAX_RR_RECS + 1)
|
||||
u_char nsbuf[4096];
|
||||
ns_msg msg_handle;
|
||||
int i, num_txt_recs, ret;
|
||||
rr_rec_t seq_table[SEQ_TABLE_SIZE];
|
||||
|
||||
memset (&msg_handle, 0, sizeof(ns_msg));
|
||||
|
||||
ret = get_dns_text (".test.", nsbuf, 4096);
|
||||
assert_int_equal (ret, 0);
|
||||
ns_initparse (nsbuf, 4096, &msg_handle);
|
||||
assert_int_equal (msg_handle._counts[ns_s_an], 3);
|
||||
num_txt_recs = get_rr_seq_table (&msg_handle, 3, seq_table);
|
||||
assert_int_equal (num_txt_recs, 3);
|
||||
assert_ptr_equal (seq_table[0].rr_ptr, NULL);
|
||||
for (i=0; i<3; i++) {
|
||||
int len = strlen (rr_recs_test[i]);
|
||||
assert_int_equal (len, seq_table[i+1].rr_len);
|
||||
ret = strncmp (seq_table[i+1].rr_ptr, rr_recs_test[i], len);
|
||||
assert_int_equal (ret, 0);
|
||||
}
|
||||
|
||||
ret = get_dns_text (".test2.", nsbuf, 4096);
|
||||
assert_int_equal (ret, 0);
|
||||
ns_initparse (nsbuf, 4096, &msg_handle);
|
||||
assert_int_equal (msg_handle._counts[ns_s_an], 1);
|
||||
num_txt_recs = get_rr_seq_table (&msg_handle, 1, seq_table);
|
||||
assert_int_equal (num_txt_recs, 1);
|
||||
assert_ptr_not_equal (seq_table[0].rr_ptr, NULL);
|
||||
if (NULL != seq_table[0].rr_ptr) {
|
||||
int len = strlen (rr_recs2_test[0]);
|
||||
assert_int_equal (len, seq_table[0].rr_len);
|
||||
ret = strncmp (seq_table[0].rr_ptr, rr_recs2_test[0], len);
|
||||
assert_int_equal (ret, 0);
|
||||
}
|
||||
|
||||
ret = get_dns_text (".extra.", nsbuf, 4096);
|
||||
assert_int_equal (ret, 0);
|
||||
ns_initparse (nsbuf, 4096, &msg_handle);
|
||||
assert_int_equal (msg_handle._counts[ns_s_an], 4);
|
||||
num_txt_recs = get_rr_seq_table (&msg_handle, 4, seq_table);
|
||||
assert_int_equal (num_txt_recs, 3);
|
||||
assert_ptr_equal (seq_table[0].rr_ptr, NULL);
|
||||
for (i=0; i<3; i++) {
|
||||
int len = strlen (rr_recs_test[i]);
|
||||
assert_int_equal (len, seq_table[i+1].rr_len);
|
||||
ret = strncmp (seq_table[i+1].rr_ptr, rr_recs_test[i], len);
|
||||
assert_int_equal (ret, 0);
|
||||
}
|
||||
|
||||
ret = get_dns_text (".err1.", nsbuf, 4096);
|
||||
assert_int_equal (ret, 0);
|
||||
ns_initparse (nsbuf, 4096, &msg_handle);
|
||||
assert_int_equal (msg_handle._counts[ns_s_an], 3);
|
||||
num_txt_recs = get_rr_seq_table (&msg_handle, 3, seq_table);
|
||||
assert_int_equal (num_txt_recs, -1);
|
||||
|
||||
ret = get_dns_text (".err2.", nsbuf, 4096);
|
||||
assert_int_equal (ret, 0);
|
||||
ns_initparse (nsbuf, 4096, &msg_handle);
|
||||
assert_int_equal (msg_handle._counts[ns_s_an], 3);
|
||||
num_txt_recs = get_rr_seq_table (&msg_handle, 3, seq_table);
|
||||
assert_int_equal (num_txt_recs, -1);
|
||||
|
||||
ret = get_dns_text (".err3.", nsbuf, 4096);
|
||||
assert_int_equal (ret, 0);
|
||||
ns_initparse (nsbuf, 4096, &msg_handle);
|
||||
assert_int_equal (msg_handle._counts[ns_s_an], 3);
|
||||
num_txt_recs = get_rr_seq_table (&msg_handle, 3, seq_table);
|
||||
assert_int_equal (num_txt_recs, -1);
|
||||
|
||||
ret = get_dns_text (".err4.", nsbuf, 4096);
|
||||
assert_int_equal (ret, 0);
|
||||
ns_initparse (nsbuf, 4096, &msg_handle);
|
||||
assert_int_equal (msg_handle._counts[ns_s_an], 4);
|
||||
num_txt_recs = get_rr_seq_table (&msg_handle, 4, seq_table);
|
||||
assert_int_equal (num_txt_recs, -1);
|
||||
|
||||
ret = get_dns_text (".err5.", nsbuf, 4096);
|
||||
assert_int_equal (ret, 0);
|
||||
ns_initparse (nsbuf, 4096, &msg_handle);
|
||||
assert_int_equal (msg_handle._counts[ns_s_an], 3);
|
||||
num_txt_recs = get_rr_seq_table (&msg_handle, 3, seq_table);
|
||||
assert_int_equal (num_txt_recs, -1);
|
||||
}
|
||||
|
||||
void test_assemble_jwt_from_dns ()
|
||||
{
|
||||
ns_msg msg_handle;
|
||||
u_char nsbuf[4096];
|
||||
char jwt_token[8192];
|
||||
int ret;
|
||||
|
||||
memset (&msg_handle, 0, sizeof(ns_msg));
|
||||
|
||||
ret = get_dns_text (".test.", nsbuf, 4096);
|
||||
assert_int_equal (ret, 0);
|
||||
ns_initparse (nsbuf, 4096, &msg_handle);
|
||||
assert_int_equal (msg_handle._counts[ns_s_an], 3);
|
||||
ret = assemble_jwt_from_dns (&msg_handle, 3, jwt_token);
|
||||
assert_int_equal (ret, 0);
|
||||
|
||||
ret = strcmp (dns_jwt_test, jwt_token);
|
||||
assert_int_equal (ret, 0);
|
||||
|
||||
ret = get_dns_text (".err5.", nsbuf, 4096);
|
||||
assert_int_equal (ret, 0);
|
||||
ns_initparse (nsbuf, 4096, &msg_handle);
|
||||
assert_int_equal (msg_handle._counts[ns_s_an], 3);
|
||||
ret = assemble_jwt_from_dns (&msg_handle, 3, jwt_token);
|
||||
assert_int_equal (ret, -1);
|
||||
|
||||
}
|
||||
|
||||
void test_query_dns ()
|
||||
{
|
||||
int ret;
|
||||
char jwt_buf[8192];
|
||||
|
||||
will_return (__res_ninit, 0);
|
||||
expect_function_call (__res_ninit);
|
||||
expect_function_call (__res_nclose);
|
||||
|
||||
ret = query_dns (txt_record_id, jwt_buf);
|
||||
assert_int_equal (ret, 0);
|
||||
|
||||
will_return (__res_ninit, 0);
|
||||
expect_function_call (__res_ninit);
|
||||
//expect_function_call (__res_nclose);
|
||||
|
||||
ret = query_dns (".nosuch.", jwt_buf);
|
||||
assert_int_equal (ret, -1);
|
||||
|
||||
will_return (__res_ninit, 0);
|
||||
expect_function_call (__res_ninit);
|
||||
expect_function_call (__res_nclose);
|
||||
|
||||
ret = query_dns (".err5.", jwt_buf);
|
||||
assert_int_equal (ret, -1);
|
||||
}
|
||||
|
||||
void test_allow_insecure_conn ()
|
||||
{
|
||||
int insecure;
|
||||
char port_buf[6] = "8080";
|
||||
ParodusCfg *cfg = get_parodus_cfg();
|
||||
|
||||
parStrncpy (cfg->hw_mac, "aabbccddeeff", sizeof(cfg->hw_mac));
|
||||
parStrncpy (cfg->dns_txt_url, "test.mydns.mycom.net", sizeof(cfg->dns_txt_url));
|
||||
cfg->jwt_algo = 1025;
|
||||
|
||||
read_key_from_file ("../../tests/pubkey4.pem", cfg->jwt_key, 4096);
|
||||
|
||||
will_return (__res_ninit, 0);
|
||||
expect_function_call (__res_ninit);
|
||||
expect_function_call (__res_nclose);
|
||||
|
||||
insecure = allow_insecure_conn (cfg->dns_txt_url, sizeof(cfg->dns_txt_url),
|
||||
port_buf, sizeof(port_buf));
|
||||
assert_int_equal (insecure, 0);
|
||||
|
||||
parStrncpy (cfg->hw_mac, "aabbccddeeff", sizeof(cfg->hw_mac));
|
||||
parStrncpy (cfg->dns_txt_url, "err5.mydns.mycom.net", sizeof(cfg->dns_txt_url));
|
||||
|
||||
will_return (__res_ninit, 0);
|
||||
expect_function_call (__res_ninit);
|
||||
expect_function_call (__res_nclose);
|
||||
|
||||
insecure = allow_insecure_conn (cfg->dns_txt_url, sizeof(cfg->dns_txt_url),
|
||||
port_buf, sizeof(port_buf));
|
||||
assert_int_equal (insecure, TOKEN_ERR_QUERY_DNS_FAIL);
|
||||
|
||||
parStrncpy (cfg->hw_mac, "aabbccddeeff", sizeof(cfg->hw_mac));
|
||||
parStrncpy (cfg->dns_txt_url, "test.mydns.mycom.net", sizeof(cfg->dns_txt_url));
|
||||
cfg->jwt_algo = 1024;
|
||||
parStrncpy (cfg->jwt_key, "xxxxxxxxxx", sizeof(cfg->jwt_key));
|
||||
|
||||
will_return (__res_ninit, 0);
|
||||
expect_function_call (__res_ninit);
|
||||
expect_function_call (__res_nclose);
|
||||
|
||||
insecure = allow_insecure_conn (cfg->dns_txt_url, sizeof(cfg->dns_txt_url),
|
||||
port_buf, sizeof(port_buf));
|
||||
assert_int_equal (insecure, TOKEN_ERR_JWT_DECODE_FAIL);
|
||||
|
||||
parStrncpy (cfg->hw_mac, "aabbccddeeff", sizeof(cfg->hw_mac));
|
||||
parStrncpy (cfg->dns_txt_url, "test.mydns.mycom.net", sizeof(cfg->dns_txt_url));
|
||||
cfg->jwt_algo = 4097;
|
||||
read_key_from_file ("../../tests/pubkey4.pem", cfg->jwt_key, 4096);
|
||||
|
||||
will_return (__res_ninit, 0);
|
||||
expect_function_call (__res_ninit);
|
||||
expect_function_call (__res_nclose);
|
||||
|
||||
insecure = allow_insecure_conn (cfg->dns_txt_url, sizeof(cfg->dns_txt_url),
|
||||
port_buf, sizeof(port_buf));
|
||||
assert_int_equal (insecure, TOKEN_ERR_ALGO_NOT_ALLOWED);
|
||||
|
||||
}
|
||||
|
||||
void test_get_tok()
|
||||
{
|
||||
const char *str0 = "";
|
||||
const char *str1 = "none";
|
||||
const char *str2 = "none:rs256";
|
||||
char result[20];
|
||||
const char *next;
|
||||
|
||||
next = get_tok (str0, ':', result, 20);
|
||||
assert_ptr_equal (next, NULL);
|
||||
assert_int_equal ((int) result[0], 0);
|
||||
|
||||
next = get_tok (str1, ':', result, 20);
|
||||
assert_string_equal (result, "none");
|
||||
assert_ptr_equal (next, NULL);
|
||||
|
||||
next = get_tok (str2, ':', result, 20);
|
||||
assert_string_equal (result, "none");
|
||||
next = get_tok (next, ':', result, 20);
|
||||
assert_string_equal (result, "rs256");
|
||||
assert_ptr_equal (next, NULL);
|
||||
}
|
||||
|
||||
void test_get_algo_mask ()
|
||||
{
|
||||
unsigned mask;
|
||||
|
||||
mask = get_algo_mask ("rs256");
|
||||
assert_int_equal ((int) mask, 1024);
|
||||
|
||||
mask = get_algo_mask ("rs512:rs256");
|
||||
assert_int_equal ((int) mask, 5120);
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* External Functions */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
int main(void)
|
||||
{
|
||||
const struct CMUnitTest tests[] = {
|
||||
cmocka_unit_test(test_analyze_jwt),
|
||||
cmocka_unit_test(test_validate_algo),
|
||||
cmocka_unit_test(test_nquery),
|
||||
cmocka_unit_test(test_valid_b64_char),
|
||||
cmocka_unit_test(test_strip_rrdata),
|
||||
cmocka_unit_test(test_find_seq_num),
|
||||
cmocka_unit_test(test_get_rr_seq_num),
|
||||
cmocka_unit_test(test_get_rr_seq_table),
|
||||
cmocka_unit_test(test_assemble_jwt_from_dns),
|
||||
cmocka_unit_test(test_query_dns),
|
||||
cmocka_unit_test(test_allow_insecure_conn),
|
||||
cmocka_unit_test(test_get_tok),
|
||||
cmocka_unit_test(test_get_algo_mask),
|
||||
};
|
||||
|
||||
return cmocka_run_group_tests(tests, NULL, NULL);
|
||||
}
|
||||
|
||||
67
tests/test_token_stub.c
Normal file
67
tests/test_token_stub.c
Normal file
@@ -0,0 +1,67 @@
|
||||
/**
|
||||
* Copyright 2010-2016 Comcast Cable Communications Management, LLC
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
#include <stdarg.h>
|
||||
|
||||
#include <CUnit/Basic.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdarg.h>
|
||||
#include <stddef.h>
|
||||
#include <setjmp.h>
|
||||
#include <cmocka.h>
|
||||
#include <assert.h>
|
||||
#include <wrp-c.h>
|
||||
|
||||
#include "../src/token.h"
|
||||
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Mocks */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
void addCRUDmsgToQueue(wrp_msg_t *crudMsg)
|
||||
{
|
||||
(void)crudMsg;
|
||||
return;
|
||||
}
|
||||
|
||||
void *CRUDHandlerTask()
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void test_allow_insecure_conn ()
|
||||
{
|
||||
int insecure;
|
||||
char *server_Address = NULL;
|
||||
char *port = NULL;
|
||||
insecure = allow_insecure_conn (server_Address,(int) sizeof(server_Address),
|
||||
port, (int) sizeof(port));
|
||||
assert_int_equal (insecure, -1);
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* External Functions */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
int main(void)
|
||||
{
|
||||
const struct CMUnitTest tests[] = {
|
||||
cmocka_unit_test(test_allow_insecure_conn),
|
||||
};
|
||||
|
||||
return cmocka_run_group_tests(tests, NULL, NULL);
|
||||
}
|
||||
|
||||
@@ -42,6 +42,9 @@ extern size_t metaPackSize;
|
||||
extern UpStreamMsg *UpStreamMsgQ;
|
||||
int numLoops = 1;
|
||||
wrp_msg_t *temp = NULL;
|
||||
extern pthread_mutex_t nano_mut;
|
||||
extern pthread_cond_t nano_con;
|
||||
static int crud_test = 0;
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Mocks */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
@@ -91,7 +94,7 @@ size_t appendEncodedData( void **appendData, void *encodedBuffer, size_t encoded
|
||||
(void) encodedBuffer; (void) encodedSize; (void) metadataPack; (void) metadataSize;
|
||||
function_called();
|
||||
char *data = (char *) malloc (sizeof(char) * 100);
|
||||
strcpy(data, "AAAAAAAAYYYYIGkYTUYFJH");
|
||||
parStrncpy(data, "AAAAAAAAYYYYIGkYTUYFJH", 100);
|
||||
*appendData = data;
|
||||
return (size_t)mock();
|
||||
}
|
||||
@@ -141,7 +144,19 @@ ssize_t wrp_to_struct( const void *bytes, const size_t length, const enum wrp_fo
|
||||
{
|
||||
UNUSED(bytes); UNUSED(length); UNUSED(fmt);
|
||||
function_called();
|
||||
*msg = temp;
|
||||
if(crud_test)
|
||||
{
|
||||
wrp_msg_t *resp_msg = NULL;
|
||||
resp_msg = ( wrp_msg_t *)malloc( sizeof( wrp_msg_t ) );
|
||||
memset(resp_msg, 0, sizeof(wrp_msg_t));
|
||||
resp_msg->msg_type = 5;
|
||||
resp_msg->u.crud.source = strdup("mac:14xxx/tags");
|
||||
*msg = resp_msg;
|
||||
}
|
||||
else
|
||||
{
|
||||
*msg = temp;
|
||||
}
|
||||
return (ssize_t)mock();
|
||||
}
|
||||
|
||||
@@ -280,10 +295,9 @@ void test_processUpstreamMessage()
|
||||
expect_function_call(appendEncodedData);
|
||||
|
||||
expect_function_call(sendMessage);
|
||||
|
||||
expect_function_call(wrp_free_struct);
|
||||
will_return(nn_freemsg,1);
|
||||
will_return(nn_freemsg, 0);
|
||||
expect_function_call(nn_freemsg);
|
||||
expect_function_call(wrp_free_struct);
|
||||
|
||||
processUpstreamMessage();
|
||||
free(temp);
|
||||
@@ -317,10 +331,9 @@ void test_processUpstreamMessageInvalidPartner()
|
||||
expect_function_call(appendEncodedData);
|
||||
|
||||
expect_function_call(sendMessage);
|
||||
|
||||
expect_function_call(wrp_free_struct);
|
||||
will_return(nn_freemsg,1);
|
||||
will_return(nn_freemsg, 0);
|
||||
expect_function_call(nn_freemsg);
|
||||
expect_function_call(wrp_free_struct);
|
||||
processUpstreamMessage();
|
||||
free(temp);
|
||||
free(UpStreamMsgQ->next);
|
||||
@@ -340,8 +353,8 @@ void test_processUpstreamMessageRegMsg()
|
||||
|
||||
reg_list_item_t *head = (reg_list_item_t *) malloc(sizeof(reg_list_item_t));
|
||||
memset(head, 0, sizeof(reg_list_item_t));
|
||||
strcpy(head->service_name, "iot");
|
||||
strcpy(head->url, "tcp://10.0.0.1:6600");
|
||||
parStrncpy(head->service_name, "iot", sizeof(head->service_name));
|
||||
parStrncpy(head->url, "tcp://10.0.0.1:6600", sizeof(head->url));
|
||||
|
||||
temp = (wrp_msg_t *) malloc(sizeof(wrp_msg_t));
|
||||
memset(temp,0,sizeof(wrp_msg_t));
|
||||
@@ -375,10 +388,9 @@ void test_processUpstreamMessageRegMsg()
|
||||
|
||||
will_return(get_numOfClients, 1);
|
||||
expect_function_call(get_numOfClients);
|
||||
|
||||
expect_function_call(wrp_free_struct);
|
||||
will_return(nn_freemsg,1);
|
||||
will_return(nn_freemsg, 0);
|
||||
expect_function_call(nn_freemsg);
|
||||
expect_function_call(wrp_free_struct);
|
||||
|
||||
processUpstreamMessage();
|
||||
free(temp);
|
||||
@@ -400,8 +412,8 @@ void test_processUpstreamMessageRegMsgNoClients()
|
||||
|
||||
reg_list_item_t *head = (reg_list_item_t *) malloc(sizeof(reg_list_item_t));
|
||||
memset(head, 0, sizeof(reg_list_item_t));
|
||||
strcpy(head->service_name, "iot");
|
||||
strcpy(head->url, "tcp://10.0.0.1:6600");
|
||||
parStrncpy(head->service_name, "iot", sizeof(head->service_name));
|
||||
parStrncpy(head->url, "tcp://10.0.0.1:6600", sizeof(head->url));
|
||||
|
||||
temp = (wrp_msg_t *) malloc(sizeof(wrp_msg_t));
|
||||
memset(temp,0,sizeof(wrp_msg_t));
|
||||
@@ -417,10 +429,9 @@ void test_processUpstreamMessageRegMsgNoClients()
|
||||
|
||||
will_return(addToList, 0);
|
||||
expect_function_call(addToList);
|
||||
|
||||
expect_function_call(wrp_free_struct);
|
||||
will_return(nn_freemsg,1);
|
||||
will_return(nn_freemsg, 0);
|
||||
expect_function_call(nn_freemsg);
|
||||
expect_function_call(wrp_free_struct);
|
||||
|
||||
processUpstreamMessage();
|
||||
free(temp);
|
||||
@@ -449,12 +460,11 @@ void err_processUpstreamMessageDecodeErr()
|
||||
temp = (wrp_msg_t *) malloc(sizeof(wrp_msg_t));
|
||||
memset(temp,0,sizeof(wrp_msg_t));
|
||||
temp->msg_type = 3;
|
||||
|
||||
will_return(wrp_to_struct, -1);
|
||||
expect_function_call(wrp_to_struct);
|
||||
expect_function_call(wrp_free_struct);
|
||||
will_return(nn_freemsg,1);
|
||||
will_return(nn_freemsg, 0);
|
||||
expect_function_call(nn_freemsg);
|
||||
expect_function_call(wrp_free_struct);
|
||||
processUpstreamMessage();
|
||||
free(temp);
|
||||
free(UpStreamMsgQ);
|
||||
@@ -475,10 +485,9 @@ void err_processUpstreamMessageMetapackFailure()
|
||||
|
||||
will_return(wrp_to_struct, 15);
|
||||
expect_function_call(wrp_to_struct);
|
||||
|
||||
will_return(nn_freemsg, 0);
|
||||
expect_function_call(nn_freemsg);
|
||||
expect_function_call(wrp_free_struct);
|
||||
will_return(nn_freemsg,1);
|
||||
expect_function_call(nn_freemsg);
|
||||
processUpstreamMessage();
|
||||
free(temp);
|
||||
free(UpStreamMsgQ);
|
||||
@@ -496,11 +505,11 @@ void err_processUpstreamMessageRegMsg()
|
||||
UpStreamMsgQ->next->next = NULL;
|
||||
|
||||
reg_list_item_t *head = (reg_list_item_t *) malloc(sizeof(reg_list_item_t));
|
||||
strcpy(head->service_name, "iot");
|
||||
strcpy(head->url, "tcp://10.0.0.1:6600");
|
||||
parStrncpy(head->service_name, "iot", sizeof(head->service_name));
|
||||
parStrncpy(head->url, "tcp://10.0.0.1:6600", sizeof(head->url));
|
||||
head->next = (reg_list_item_t *) malloc(sizeof(reg_list_item_t));
|
||||
strcpy(head->next->service_name, "iot");
|
||||
strcpy(head->next->url, "tcp://10.0.0.1:6600");
|
||||
parStrncpy(head->next->service_name, "iot", sizeof(head->service_name));
|
||||
parStrncpy(head->next->url, "tcp://10.0.0.1:6600", sizeof(head->url));
|
||||
head->next->next = NULL;
|
||||
|
||||
temp = (wrp_msg_t *) malloc(sizeof(wrp_msg_t));
|
||||
@@ -538,10 +547,9 @@ void err_processUpstreamMessageRegMsg()
|
||||
|
||||
will_return(addToList, -1);
|
||||
expect_function_call(addToList);
|
||||
|
||||
will_return(nn_freemsg, 0);
|
||||
expect_function_call(nn_freemsg);
|
||||
expect_function_call(wrp_free_struct);
|
||||
will_return(nn_freemsg,1);
|
||||
expect_function_call(nn_freemsg);
|
||||
|
||||
processUpstreamMessage();
|
||||
free(temp);
|
||||
@@ -574,6 +582,56 @@ void err_sendUpstreamMsgToServer()
|
||||
sendUpstreamMsgToServer(NULL, 110);
|
||||
}
|
||||
|
||||
void test_get_global_UpStreamMsgQ()
|
||||
{
|
||||
assert_ptr_equal(UpStreamMsgQ, get_global_UpStreamMsgQ());
|
||||
}
|
||||
|
||||
void test_set_global_UpStreamMsgQ()
|
||||
{
|
||||
static UpStreamMsg *UpStreamQ;
|
||||
UpStreamQ = (UpStreamMsg *) malloc(sizeof(UpStreamMsg));
|
||||
UpStreamQ->msg = "First Message";
|
||||
UpStreamQ->len = 13;
|
||||
UpStreamQ->next = NULL;
|
||||
set_global_UpStreamMsgQ(UpStreamQ);
|
||||
assert_string_equal(UpStreamQ->msg, (char *)get_global_UpStreamMsgQ()->msg);
|
||||
assert_int_equal(UpStreamQ->len, get_global_UpStreamMsgQ()->len);
|
||||
free(UpStreamQ->next);
|
||||
free(UpStreamQ);
|
||||
}
|
||||
|
||||
void test_get_global_nano_con()
|
||||
{
|
||||
assert_ptr_equal(&nano_con, get_global_nano_con());
|
||||
}
|
||||
|
||||
void test_get_global_nano_mut()
|
||||
{
|
||||
assert_ptr_equal(&nano_mut, get_global_nano_mut());
|
||||
}
|
||||
|
||||
void test_processUpstreamMsgCrud_nnfree()
|
||||
{
|
||||
numLoops = 1;
|
||||
crud_test = 1;
|
||||
metaPackSize = 0;
|
||||
UpStreamMsgQ = (UpStreamMsg *) malloc(sizeof(UpStreamMsg));
|
||||
UpStreamMsgQ->msg = "First Message";
|
||||
UpStreamMsgQ->len = 13;
|
||||
UpStreamMsgQ->next = NULL;
|
||||
|
||||
will_return(wrp_to_struct, 12);
|
||||
expect_function_call(wrp_to_struct);
|
||||
will_return(nn_freemsg, 0);
|
||||
expect_function_call(nn_freemsg);
|
||||
expect_function_call(wrp_free_struct);
|
||||
processUpstreamMessage();
|
||||
free(UpStreamMsgQ);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* External Functions */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
@@ -597,6 +655,11 @@ int main(void)
|
||||
cmocka_unit_test(err_processUpstreamMessageRegMsg),
|
||||
cmocka_unit_test(test_sendUpstreamMsgToServer),
|
||||
cmocka_unit_test(err_sendUpstreamMsgToServer),
|
||||
cmocka_unit_test(test_get_global_UpStreamMsgQ),
|
||||
cmocka_unit_test(test_set_global_UpStreamMsgQ),
|
||||
cmocka_unit_test(test_get_global_nano_con),
|
||||
cmocka_unit_test(test_get_global_nano_mut),
|
||||
cmocka_unit_test(test_processUpstreamMsgCrud_nnfree),
|
||||
};
|
||||
|
||||
return cmocka_run_group_tests(tests, NULL, NULL);
|
||||
|
||||
9
tests/webpa-rs256.pem
Normal file
9
tests/webpa-rs256.pem
Normal file
@@ -0,0 +1,9 @@
|
||||
-----BEGIN PUBLIC KEY-----
|
||||
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAkZeQUMqDkMu/dQgTcycJ
|
||||
/rrgqfKQkoYFTMO7GnK87/OWiftHmtDJYPgktlcHheOPfkGln5ay1WJSitmtWNaH
|
||||
+RvBFK/ZsXpIuGm7R6wdSc7e6g9fTaSAfNX/+a8VxHUo58AinXxcq4LnHbuaGjEz
|
||||
jw77TLuZGyUuHiany8O8tc+DbnYKvRquScsccI6z/QwZKFtXUjJZ91hJ97zC8o7N
|
||||
Ae7n/Jg+Bs0uz9c1/bf/Jqbu6OidFbCr2FN42UupuAZ8DiPp2fWD5Q9qmp1ADk+V
|
||||
+TeZPxTCq/WB4dzSCd5v/FvFmO8tH6Ptkltij4pke7Dsi80TVRlcMDXAWxSFXOQV
|
||||
qwIDAQAB
|
||||
-----END PUBLIC KEY-----
|
||||
Reference in New Issue
Block a user