mirror of
https://github.com/outbackdingo/parodus.git
synced 2026-01-27 18:20:04 +00:00
Compare commits
641 Commits
1.0.0
...
6.0_p11xle
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
27ba50a2f6 | ||
|
|
c04ed33b20 | ||
|
|
47b0e335ae | ||
|
|
f872fdcc44 | ||
|
|
0da6e73c90 | ||
|
|
7c56dbb3f6 | ||
|
|
6952647ce3 | ||
|
|
c1fc8d877b | ||
|
|
581d7fc966 | ||
|
|
0673d2624e | ||
|
|
0f82e7c2d9 | ||
|
|
4acf7f63ba | ||
|
|
df67b95244 | ||
|
|
e6e37053d3 | ||
|
|
d5a9ff36f6 | ||
|
|
f4536b778e | ||
|
|
b65b3ab3b0 | ||
|
|
954080bbd1 | ||
|
|
c8a2c95ae4 | ||
|
|
59bba50bee | ||
|
|
3090e50b02 | ||
|
|
af4eeb9199 | ||
|
|
2dd392dac6 | ||
|
|
7eae3da3f2 | ||
|
|
6e5ecc87f9 | ||
|
|
893c1c7547 | ||
|
|
3e30328738 | ||
|
|
f7412f9710 | ||
|
|
2e11d7e3ba | ||
|
|
5ddac7dc47 | ||
|
|
79d8a84c2e | ||
|
|
6f7332d054 | ||
|
|
26d409d884 | ||
|
|
d3e758ccb4 | ||
|
|
4af1aaf418 | ||
|
|
8e00ec8e5e | ||
|
|
43f55f9a99 | ||
|
|
bf3ee65360 | ||
|
|
9ebe011cb0 | ||
|
|
2bfc0a3c32 | ||
|
|
37bb19eeaa | ||
|
|
2c4980cf9e | ||
|
|
2248f31658 | ||
|
|
b97643ec42 | ||
|
|
66b16aa58f | ||
|
|
d3a56df184 | ||
|
|
8b5346e69b | ||
|
|
2a28e5d3e8 | ||
|
|
33af3f3eec | ||
|
|
c9b34d3c3f | ||
|
|
4add1c07ca | ||
|
|
75c833e3a8 | ||
|
|
5359fc79cf | ||
|
|
623192e301 | ||
|
|
b6490ba5b3 | ||
|
|
20ccd81086 | ||
|
|
f9ac95642c | ||
|
|
ae5d027612 | ||
|
|
e139a2d6b6 | ||
|
|
f655d6382b | ||
|
|
267e0eb796 | ||
|
|
00251153a4 | ||
|
|
d328a56e1a | ||
|
|
1a169561e4 | ||
|
|
8019489b86 | ||
|
|
ee3e006908 | ||
|
|
797c9de17f | ||
|
|
0bf4d754e5 | ||
|
|
3d98b4a80b | ||
|
|
80a50dead6 | ||
|
|
dd69d5ec5d | ||
|
|
1b23de5a12 | ||
|
|
8ea342b537 | ||
|
|
124fc11232 | ||
|
|
9abb37a005 | ||
|
|
c0edaaf31c | ||
|
|
32138613bb | ||
|
|
4cb167e8dd | ||
|
|
454ec26065 | ||
|
|
47af275929 | ||
|
|
34802d329d | ||
|
|
0297d994b5 | ||
|
|
ee7033c36c | ||
|
|
e35221efd2 | ||
|
|
c898fe6d0e | ||
|
|
0017e48f7d | ||
|
|
285a461f42 | ||
|
|
bb0f49a8b3 | ||
|
|
ee20e1fcb8 | ||
|
|
becacd8990 | ||
|
|
b05bfbe1fa | ||
|
|
9fb3f118b7 | ||
|
|
a124aafc5f | ||
|
|
0c4a2f407a | ||
|
|
523c9cc0d2 | ||
|
|
58492950d6 | ||
|
|
29906511b8 | ||
|
|
c6fa4b2ce8 | ||
|
|
0640f3516f | ||
|
|
60c37daa18 | ||
|
|
f51b4ef9c2 | ||
|
|
254c9f6763 | ||
|
|
8876fa9239 | ||
|
|
42fc9eb26e | ||
|
|
e8e652b076 | ||
|
|
dc935f9a09 | ||
|
|
d1462de56a | ||
|
|
13309a737e | ||
|
|
223e7db81c | ||
|
|
cd763823fc | ||
|
|
8537f27ece | ||
|
|
6381d9c55f | ||
|
|
980b7a88db | ||
|
|
e3c37b6764 | ||
|
|
67d58441ef | ||
|
|
f6ffda05ad | ||
|
|
6aee851944 | ||
|
|
aaa93e137d | ||
|
|
21e8c74f23 | ||
|
|
0248e7b241 | ||
|
|
da019382c6 | ||
|
|
aecbd885d5 | ||
|
|
0443c45924 | ||
|
|
314c840755 | ||
|
|
69f7e3eba0 | ||
|
|
e643f9e2fc | ||
|
|
7d2e9733d0 | ||
|
|
23c18da03e | ||
|
|
2218637f2c | ||
|
|
54f9983eff | ||
|
|
a577854172 | ||
|
|
e054ef580f | ||
|
|
79eb7ba6ef | ||
|
|
a291b047b6 | ||
|
|
656b1b0b58 | ||
|
|
22ecf0ef76 | ||
|
|
c97a3a3a20 | ||
|
|
46273d9766 | ||
|
|
7efed14c20 | ||
|
|
6d39163d47 | ||
|
|
5b0d3e19f3 | ||
|
|
0d8bb960f6 | ||
|
|
5d537fb139 | ||
|
|
47fcd6bdae | ||
|
|
24e1790ccb | ||
|
|
89fdd97d44 | ||
|
|
5ae2325fb6 | ||
|
|
9bad1142ab | ||
|
|
339b93cfd3 | ||
|
|
a34db44c90 | ||
|
|
bdec80dd07 | ||
|
|
1833c30e83 | ||
|
|
5b26fe38f5 | ||
|
|
f3a4daeb74 | ||
|
|
aaeb1f6612 | ||
|
|
0fb6288255 | ||
|
|
0fd3b76f27 | ||
|
|
48722ffa7c | ||
|
|
bf5d555d96 | ||
|
|
c02b141f7c | ||
|
|
9f40b7efe5 | ||
|
|
2a184e24c9 | ||
|
|
233a167cb4 | ||
|
|
5562d7ec48 | ||
|
|
49513df8f8 | ||
|
|
d0e6c5bd75 | ||
|
|
66f1f4d4fb | ||
|
|
19b4f56913 | ||
|
|
c30d5a3362 | ||
|
|
c98e2e2fb8 | ||
|
|
c78625f35a | ||
|
|
aeea6fbb03 | ||
|
|
d2d1590329 | ||
|
|
e693c09ca3 | ||
|
|
0b9f739323 | ||
|
|
d901efd10c | ||
|
|
824bcb81cf | ||
|
|
671fc5be59 | ||
|
|
4bf8683192 | ||
|
|
9300d76a8e | ||
|
|
dee98922a6 | ||
|
|
b9fa918c15 | ||
|
|
a278a7017d | ||
|
|
69cf210a34 | ||
|
|
77b587aa9d | ||
|
|
441ecf702f | ||
|
|
bdc2733d8e | ||
|
|
1f24671c0f | ||
|
|
3de4ec59c1 | ||
|
|
a01ad8f15c | ||
|
|
1d2e51e31e | ||
|
|
9e808acf7d | ||
|
|
19f2fe1419 | ||
|
|
b99c06a67b | ||
|
|
f57ebc1cd7 | ||
|
|
1df770a91b | ||
|
|
a582bb3252 | ||
|
|
42dd20263b | ||
|
|
ac100c0f4e | ||
|
|
290289f2f1 | ||
|
|
8e9b98b697 | ||
|
|
b148d40c53 | ||
|
|
dc6486f200 | ||
|
|
ad2d43b4f6 | ||
|
|
54cfdd9c52 | ||
|
|
19056ddfec | ||
|
|
1d85742497 | ||
|
|
e29dd26d2b | ||
|
|
5aae91763a | ||
|
|
9afa49140a | ||
|
|
4305dc8eef | ||
|
|
f44fc2c8d9 | ||
|
|
16543800d2 | ||
|
|
bcb4840a41 | ||
|
|
b173828777 | ||
|
|
2df8cdfeb5 | ||
|
|
eba1309169 | ||
|
|
70c1c64550 | ||
|
|
e825c19ef3 | ||
|
|
95170d95c7 | ||
|
|
33142a6ce7 | ||
|
|
7b3ee1dd5a | ||
|
|
f2308e2966 | ||
|
|
9c55157da7 | ||
|
|
1c254e28fe | ||
|
|
8955787640 | ||
|
|
b633938bc7 | ||
|
|
b0aeaf1fb2 | ||
|
|
ea726e0c10 | ||
|
|
cbdf5d2be9 | ||
|
|
3d369cafb2 | ||
|
|
c0dbdb5028 | ||
|
|
12a7765f98 | ||
|
|
88c87917a4 | ||
|
|
0905387d49 | ||
|
|
a8167fa417 | ||
|
|
6ab601e758 | ||
|
|
45536eb4e1 | ||
|
|
8208d3bfd0 | ||
|
|
4fc60b6b3c | ||
|
|
990d9df7e2 | ||
|
|
fe52d9a55e | ||
|
|
9cfc734c51 | ||
|
|
153add9bec | ||
|
|
8b553f8a29 | ||
|
|
7679fdaf4a | ||
|
|
1c09a80493 | ||
|
|
bfad8ed44b | ||
|
|
17c7faff50 | ||
|
|
01120da9ac | ||
|
|
c7c6fb4926 | ||
|
|
f4b2c252ae | ||
|
|
8794ce2092 | ||
|
|
a61e97633b | ||
|
|
4d3d6ec99d | ||
|
|
e6ac264e47 | ||
|
|
70c9975ae9 | ||
|
|
11a2b6f123 | ||
|
|
81d8f59bbd | ||
|
|
846b0588c2 | ||
|
|
ad44ff0221 | ||
|
|
513647ceef | ||
|
|
2ec3443b1d | ||
|
|
55e10aa051 | ||
|
|
879a585b66 | ||
|
|
ea3534678b | ||
|
|
6ebb62ead4 | ||
|
|
5ec16a7370 | ||
|
|
7b81cb4efd | ||
|
|
4c6a6a99e6 | ||
|
|
106e1bfeb3 | ||
|
|
4f01170670 | ||
|
|
f37d1911d6 | ||
|
|
3a436999fc | ||
|
|
016c80960c | ||
|
|
b286857a22 | ||
|
|
f998106aed | ||
|
|
2d209b2a0d | ||
|
|
3f471100db | ||
|
|
ddc04f9da0 | ||
|
|
a23615f3a5 | ||
|
|
b1caff4a1a | ||
|
|
11c9052d77 | ||
|
|
5ceb57a8c3 | ||
|
|
c4ebe239ac | ||
|
|
1622c44c89 | ||
|
|
fb542586e7 | ||
|
|
0afb87c29b | ||
|
|
f168e4d148 | ||
|
|
97570a24d5 | ||
|
|
95b6f75284 | ||
|
|
f87e69c07b | ||
|
|
647905639c | ||
|
|
ceadc4b51f | ||
|
|
38dee179e7 | ||
|
|
9feafedff8 | ||
|
|
2807f8e43a | ||
|
|
5132675700 | ||
|
|
e166b9fdf5 | ||
|
|
60789f0ec8 | ||
|
|
3fb0708b15 | ||
|
|
65098e36cb | ||
|
|
c585300f76 | ||
|
|
e4e78118cf | ||
|
|
8b4541b570 | ||
|
|
acc542647b | ||
|
|
da6614b19d | ||
|
|
096271279d | ||
|
|
50176fb120 | ||
|
|
2ad896abc6 | ||
|
|
f58f85bc32 | ||
|
|
4fef26c082 | ||
|
|
1995a664ad | ||
|
|
f1b2add244 | ||
|
|
13739786a0 | ||
|
|
4fc082cb43 | ||
|
|
08feef216e | ||
|
|
2bde60e885 | ||
|
|
5d05150249 | ||
|
|
40bf7eeb0e | ||
|
|
fcec26a25f | ||
|
|
1b71082e77 | ||
|
|
4085c56ed6 | ||
|
|
0b700e57ff | ||
|
|
1b903521d2 | ||
|
|
3814f873bc | ||
|
|
8a3e4507ef | ||
|
|
c7c93254ff | ||
|
|
0875751c3f | ||
|
|
c2edbbc074 | ||
|
|
7b03fad90f | ||
|
|
a5081a5cfa | ||
|
|
25a6a99c69 | ||
|
|
5a60847e28 | ||
|
|
29f00e5850 | ||
|
|
4bd9e87125 | ||
|
|
56ab5f13fe | ||
|
|
57ca4084ce | ||
|
|
b001964b71 | ||
|
|
c33bb6c1c3 | ||
|
|
379e63be00 | ||
|
|
062fdc2ce0 | ||
|
|
200522c997 | ||
|
|
62540e8db8 | ||
|
|
f155dd601c | ||
|
|
b9a5770bf9 | ||
|
|
a717b0a909 | ||
|
|
a7b1a145a5 | ||
|
|
7bc498b376 | ||
|
|
fe00e55fff | ||
|
|
66104dcabc | ||
|
|
aedd9c972a | ||
|
|
99b09179f2 | ||
|
|
92020ec6ec | ||
|
|
9057322fd7 | ||
|
|
55c70f3c6f | ||
|
|
7c07a5dd63 | ||
|
|
cdd0a9e355 | ||
|
|
392085b01b | ||
|
|
bd67050c80 | ||
|
|
cea408a33c | ||
|
|
d1522346b4 | ||
|
|
22feddeadc | ||
|
|
df2729084d | ||
|
|
8a61e66456 | ||
|
|
8a737d6c18 | ||
|
|
905cb3bade | ||
|
|
a2d7dfeb95 | ||
|
|
342a8ed250 | ||
|
|
97da13ffcc | ||
|
|
590a43a053 | ||
|
|
0e6e833301 | ||
|
|
4525e39de9 | ||
|
|
8d9e9c014a | ||
|
|
9f6ddb2b78 | ||
|
|
b48680c358 | ||
|
|
2304951186 | ||
|
|
85004c165c | ||
|
|
94b64af4a0 | ||
|
|
d190b8b10c | ||
|
|
4e24197d24 | ||
|
|
f4d544fc40 | ||
|
|
0972ff76fd | ||
|
|
ae8a9beb8e | ||
|
|
08ed64c822 | ||
|
|
c2f6a64569 | ||
|
|
2f0244af11 | ||
|
|
f0f2903106 | ||
|
|
8c83c4ce01 | ||
|
|
385a38f10a | ||
|
|
4abad4dc13 | ||
|
|
cbe184e00e | ||
|
|
25a6a6cc72 | ||
|
|
aabe6be96a | ||
|
|
9aa18cea1c | ||
|
|
2f762fe9a1 | ||
|
|
93363b35db | ||
|
|
7e8edcaca4 | ||
|
|
81290ffd84 | ||
|
|
8a69bc3955 | ||
|
|
3634aa0a70 | ||
|
|
08a09106cf | ||
|
|
f730a41cdb | ||
|
|
f79eeb066a | ||
|
|
b4a8d8b2da | ||
|
|
b42051bf96 | ||
|
|
cd1d1ba52b | ||
|
|
44554b0dfa | ||
|
|
3bb48b48c0 | ||
|
|
1addffdeb0 | ||
|
|
ce0c43d894 | ||
|
|
4f1952ddcc | ||
|
|
eda3823ef0 | ||
|
|
774f308680 | ||
|
|
130d8f2933 | ||
|
|
5f1650b009 | ||
|
|
5cf95ac1ab | ||
|
|
c1e1a8ebdc | ||
|
|
d82c9ea187 | ||
|
|
4562592536 | ||
|
|
cdd333cc3a | ||
|
|
7ae1d2a1c4 | ||
|
|
ed1ff2b105 | ||
|
|
166b7ec7c2 | ||
|
|
97ac941a81 | ||
|
|
844a1d925a | ||
|
|
ba690db3a1 | ||
|
|
a8d077dbf5 | ||
|
|
2c3b8fc994 | ||
|
|
35509cd5b2 | ||
|
|
4f74bc037d | ||
|
|
9e3b32af69 | ||
|
|
8a20d3a7c4 | ||
|
|
19a0bc26af | ||
|
|
558f007bdf | ||
|
|
2ba26b37dc | ||
|
|
da924e89a5 | ||
|
|
6a1d908407 | ||
|
|
7b496769fc | ||
|
|
1e05869ded | ||
|
|
e7bf8cf468 | ||
|
|
e40af91fa7 | ||
|
|
f88a3f11cc | ||
|
|
db07521d64 | ||
|
|
eb0281128d | ||
|
|
7432b6f9fb | ||
|
|
db70ecf934 | ||
|
|
c49a14cb00 | ||
|
|
b7e486994f | ||
|
|
9831cefd52 | ||
|
|
ff7472be5d | ||
|
|
6f36fb7861 | ||
|
|
d8b009b5d0 | ||
|
|
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 |
24
.github/scripts/get_sonarcloud.sh
vendored
Executable file
24
.github/scripts/get_sonarcloud.sh
vendored
Executable file
@@ -0,0 +1,24 @@
|
||||
#!/bin/bash
|
||||
# SPDX-FileCopyrightText: 2021 Comcast Cable Communications Management, LLC
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
curl -s -L -O https://sonarcloud.io/static/cpp/build-wrapper-linux-x86.zip
|
||||
unzip -q -o build-wrapper-linux-x86.zip
|
||||
|
||||
|
||||
SONAR_VERSION=`curl -s https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/ |grep -o "sonar-scanner-cli-[0-9.]*-linux.zip"|sort -r|uniq|head -n 1`
|
||||
curl -s -L -O https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/$SONAR_VERSION
|
||||
curl -s -L -O https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/$SONAR_VERSION.sha256
|
||||
echo " $SONAR_VERSION" >> $SONAR_VERSION.sha256
|
||||
sha256sum -c $SONAR_VERSION.sha256
|
||||
if [[ $? -ne 0 ]]
|
||||
then
|
||||
exit 1
|
||||
fi
|
||||
unzip -q $SONAR_VERSION
|
||||
|
||||
output=`ls | grep -o "sonar-scanner-[0-9.]*-linux"`
|
||||
|
||||
echo "Using $output"
|
||||
|
||||
mv $output sonar-scanner
|
||||
50
.github/workflows/codeql-analysis.yml
vendored
Normal file
50
.github/workflows/codeql-analysis.yml
vendored
Normal file
@@ -0,0 +1,50 @@
|
||||
# SPDX-FileCopyrightText: 2021 Comcast Cable Communications Management, LLC
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
name: LGTM Analysis
|
||||
|
||||
on:
|
||||
create:
|
||||
pull_request:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
schedule:
|
||||
- cron: '12 9 * * 3'
|
||||
|
||||
jobs:
|
||||
codeql:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v2
|
||||
# Install the dependent packages
|
||||
- name: Install packages
|
||||
run: |
|
||||
sudo apt update
|
||||
sudo apt-get -y install valgrind libcunit1 libcunit1-doc libcunit1-dev libmsgpack-dev gcovr libtool
|
||||
|
||||
- name: Initialize CodeQL
|
||||
uses: github/codeql-action/init@v1
|
||||
with:
|
||||
languages: cpp
|
||||
queries: security-extended
|
||||
|
||||
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
|
||||
# If this step fails, then you should remove it and run the build manually (see below)
|
||||
- name: Autobuild
|
||||
uses: github/codeql-action/autobuild@v1
|
||||
|
||||
# ℹ️ Command-line programs to run using the OS shell.
|
||||
# 📚 https://git.io/JvXDl
|
||||
|
||||
# ✏️ If the Autobuild fails above, remove it and uncomment the following three lines
|
||||
# and modify them (or add more) to build your code if your project
|
||||
# uses a compiled language
|
||||
|
||||
#- run: |
|
||||
# make bootstrap
|
||||
# make release
|
||||
|
||||
- name: Perform CodeQL Analysis
|
||||
uses: github/codeql-action/analyze@v1
|
||||
72
.github/workflows/push.yml
vendored
Normal file
72
.github/workflows/push.yml
vendored
Normal file
@@ -0,0 +1,72 @@
|
||||
# SPDX-FileCopyrightText: 2021 Comcast Cable Communications Management, LLC
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
name: CI
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
push:
|
||||
paths-ignore:
|
||||
- 'AUTHORS'
|
||||
- 'LICENSE'
|
||||
- 'NOTICE'
|
||||
- '**.md'
|
||||
- '.gitignore'
|
||||
tags-ignore:
|
||||
- 'v[0-9]+.[0-9]+.[0-9]+'
|
||||
branches:
|
||||
- main
|
||||
- master
|
||||
|
||||
jobs:
|
||||
test:
|
||||
name: Unit Tests
|
||||
runs-on: [ ubuntu-latest ]
|
||||
steps:
|
||||
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
# Install the dependent packages
|
||||
- name: Install packages
|
||||
run: |
|
||||
sudo apt update
|
||||
sudo apt-get -y install valgrind libcunit1 libcunit1-doc libcunit1-dev libmsgpack-dev gcovr libtool
|
||||
pip install codecov
|
||||
|
||||
- name: Make Build Directory
|
||||
run: mkdir build
|
||||
|
||||
- name: Get Sonarcloud Binaries
|
||||
uses: xmidt-org/sonarcloud-installer-action@v1
|
||||
with:
|
||||
working-directory: build
|
||||
|
||||
- name: CMake
|
||||
working-directory: build
|
||||
run: |
|
||||
cmake .. -DINTEGRATION_TESTING:BOOL=false -DDISABLE_VALGRIND:BOOL=${DISABLE_VALGRIND} -DENABLE_SESHAT:BOOL=true -DFEATURE_DNS_QUERY:BOOL=true
|
||||
|
||||
|
||||
- name: Build
|
||||
working-directory: build
|
||||
run: |
|
||||
build-wrapper-linux-x86/build-wrapper-linux-x86-64 --out-dir bw-output make all test
|
||||
|
||||
- name: Merge GCOV Reports for Sonarcloud
|
||||
working-directory: build
|
||||
run: |
|
||||
gcovr --sonarqube coverage.xml -r ..
|
||||
|
||||
- name: Upload SonarCloud
|
||||
run: |
|
||||
build/sonar-scanner/bin/sonar-scanner -Dsonar.host.url=https://sonarcloud.io -Dproject.settings=.sonar-project.properties -Dsonar.login=${{ secrets.SONAR_TOKEN }}
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Upload Codecov.io
|
||||
uses: codecov/codecov-action@v1
|
||||
with:
|
||||
directory: .
|
||||
fail_ci_if_error: true
|
||||
49
.github/workflows/release.yml
vendored
Normal file
49
.github/workflows/release.yml
vendored
Normal file
@@ -0,0 +1,49 @@
|
||||
# SPDX-FileCopyrightText: 2021 Comcast Cable Communications Management, LLC
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
name: release
|
||||
|
||||
on:
|
||||
push:
|
||||
tags:
|
||||
# Push events to matching v#.#.#*, ex: v1.2.3, v.2.4.6-beta
|
||||
- 'v[0-9]+.[0-9]+.[0-9]+*'
|
||||
|
||||
jobs:
|
||||
release:
|
||||
runs-on: [ ubuntu-latest ]
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- name: Determine repo name
|
||||
run: |
|
||||
echo "repo_name=$(echo '${{ github.repository }}' | awk -F '/' '{print $2}')" >> $GITHUB_ENV
|
||||
echo "version=${GITHUB_REF#refs/tags/}" >> $GITHUB_ENV
|
||||
echo "release_slug=$(echo '${{ github.repository }}' | awk -F '/' '{print $2}')-${GITHUB_REF#refs/tags/v}" >> $GITHUB_ENV
|
||||
shell: bash
|
||||
- name: Create tarball and sha256
|
||||
run: |
|
||||
git archive --format=tar.gz -o ${release_slug}.tar.gz --prefix=${release_slug}/ ${version}
|
||||
git archive --format=zip -o ${release_slug}.zip --prefix=${release_slug}/ ${version}
|
||||
sha256sum ${release_slug}.tar.gz ${release_slug}.zip > ${release_slug}-sha256sums.txt
|
||||
mkdir artifacts
|
||||
cp ${release_slug}* artifacts/.
|
||||
- name: Prepare Release Body
|
||||
id: prep
|
||||
run: |
|
||||
export version=${GITHUB_REF#refs/tags/}
|
||||
export NOTES=$(cat CHANGELOG.md | perl -0777 -ne 'print "$1\n" if /.*## \[${version}\]\s(.*?)\s+## \[(v\d+.\d+.\d+)\].*/s')
|
||||
export TODAY=`date +'%m/%d/%Y'`
|
||||
echo ::set-output name=rname::$(echo ${version} ${TODAY})
|
||||
echo ::set-output name=body::${NOTES}
|
||||
- name: create release
|
||||
id: create_release
|
||||
uses: ncipollo/release-action@v1
|
||||
with:
|
||||
name: ${{ steps.prep.outputs.rname }}
|
||||
draft: false
|
||||
prerelease: false
|
||||
bodyFile: ${{ steps.prep.outputs.body }}
|
||||
artifacts: "artifacts/*"
|
||||
token: ${{ secrets.GITHUB_TOKEN }} # This token is provided by Actions, you do not need to create your own token
|
||||
33
.github/workflows/tag.yml
vendored
Normal file
33
.github/workflows/tag.yml
vendored
Normal file
@@ -0,0 +1,33 @@
|
||||
# SPDX-FileCopyrightText: 2021 Comcast Cable Communications Management, LLC
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
name: tag
|
||||
|
||||
on:
|
||||
push:
|
||||
paths:
|
||||
- "CHANGELOG.md" # only try to tag if the CHANGELOG has been updated.
|
||||
branches:
|
||||
- main
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: [ ubuntu-latest ]
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
token: '${{ secrets.PERSONAL_ACCESS_TOKEN }}'
|
||||
fetch-depth: 0
|
||||
- name: set up bot
|
||||
run: |
|
||||
git config --global user.name "xmidt-bot"
|
||||
git config --global user.email "$BOT_EMAIL"
|
||||
- name: export variables and tag commit
|
||||
run: |
|
||||
export OLD_VERSION=$(git describe --tags `git rev-list --tags --max-count=1` | tail -1)
|
||||
export TAG=$(cat CHANGELOG.md | perl -0777 -ne 'print "$1" if /.*## \[Unreleased\]\s+## \[(v\d+.\d+.\d+)\].*/s')
|
||||
export BINVER=$(cat CMakeLists.txt | perl -0777 -ne 'print "v$1" if /.*project\s*\(.*\s*VERSION\s*(\d+.\d+.\d+).*\s*\)/s')
|
||||
export TODAY=`date +'%m/%d/%Y'`
|
||||
export NOTES=$(cat CHANGELOG.md | perl -0777 -ne 'print "$ENV{TODAY}\n\n$1\n" if /.*## \[$ENV{TAG}\]\s(.*?)\s+## \[(v\d+.\d+.\d+)\].*/s')
|
||||
if [[ "$TAG" != "" && "$TAG" != "$BINVER" ]]; then echo "CHANGELOG.md($TAG) and CMakeLists.txt VERSION($BINVER) do not match"; fi
|
||||
if [[ "$TAG" != "" && "$TAG" != "$OLD_VERSION" && "$TAG" == "$BINVER" ]]; then git tag -a "$TAG" -m "$NOTES"; git push origin --tags; echo $?; fi
|
||||
2
.gitignore
vendored
2
.gitignore
vendored
@@ -34,3 +34,5 @@
|
||||
tags
|
||||
|
||||
build/
|
||||
|
||||
tests/jwt_key.tst
|
||||
|
||||
34
.sonar-project.properties
Normal file
34
.sonar-project.properties
Normal file
@@ -0,0 +1,34 @@
|
||||
# SPDX-FileCopyrightText: 2021 Comcast Cable Communications Management, LLC
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
# Reference:
|
||||
# https://github.com/SonarSource/sonarcloud_example_go-sqscanner-travis/blob/master/sonar-project.properties
|
||||
|
||||
|
||||
# =====================================================
|
||||
# Standard properties
|
||||
# =====================================================
|
||||
|
||||
sonar.organization=xmidt-org
|
||||
sonar.projectKey=xmidt-org_parodus
|
||||
sonar.projectName=parodus
|
||||
|
||||
sonar.sources=src
|
||||
|
||||
# =====================================================
|
||||
# Meta-data for the project
|
||||
# =====================================================
|
||||
|
||||
sonar.links.homepage=https://github.com/xmidt-org/parodus
|
||||
sonar.links.ci=https://github.com/xmidt-org/parodus/actions
|
||||
sonar.links.scm=https://github.com/xmidt-org/parodus
|
||||
sonar.links.issue=https://github.com/xmidt-org/parodus/issues
|
||||
|
||||
# =====================================================
|
||||
# Properties specific to C
|
||||
# =====================================================
|
||||
sonar.cfamily.build-wrapper-output=build/bw-output
|
||||
sonar.cfamily.threads=2
|
||||
sonar.cfamily.cache.enabled=false
|
||||
sonar.coverageReportPaths=build/coverage.xml
|
||||
|
||||
42
.travis.yml
42
.travis.yml
@@ -1,42 +0,0 @@
|
||||
dist: trusty
|
||||
sudo: required
|
||||
|
||||
language: c
|
||||
compiler:
|
||||
- gcc
|
||||
|
||||
addons:
|
||||
coverity_scan:
|
||||
project:
|
||||
name: "Comcast/parodus"
|
||||
description: "C implementation of the WebPA client coordinator"
|
||||
notification_email: weston_schmidt@alumni.purdue.edu
|
||||
build_command_prepend: "mkdir coverity_build && cd coverity_build && cmake .."
|
||||
build_command: "make"
|
||||
branch_pattern: master
|
||||
|
||||
before_install:
|
||||
- sudo pip install codecov
|
||||
- echo -n | openssl s_client -connect scan.coverity.com:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' | sudo tee -a /etc/ssl/certs/ca-
|
||||
|
||||
install:
|
||||
- sudo apt-get update -qq
|
||||
- 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 -DENABLE_SESHAT:BOOL=true -DENABLE_CJWT:BOOL=true
|
||||
- make
|
||||
- make test
|
||||
|
||||
after_success:
|
||||
- codecov
|
||||
|
||||
env:
|
||||
global:
|
||||
- secure: EwQu1WDUgIF5qM5tnKj/+NCPz9t15y289bbqFo0wDhyfTlJGS9buQeJNeVLtNJBEOngpo+AkaPGvh/d9NZ0vLdxu+K/e+HhA6kOTxUrCHD8+4oX9XpVs/XvQmD1COlJYeeqd8bJMKtlFtonGdMJogxpEFQzv4fQjmoARvL2ciV4OB0MBcD5Lsb72L3a0aJT69F6WFuDpgGj2eIQyCDSTPNIi2X7EA8R33lxnntFDn8Vj6qSBbVOI2S5R5S+JUCMp1Q1ZbEqmh6j+wKtszWj8wGqfz8Ol5+GYl511bExb+hwvV5zen0Ol0+2LQmSpYhbQZ7prfI8AclLLwhDUrP+WDOv34vwd4EWQ1OoLqG23HbBygCxPSBIB6ZxPtVkzjVlOK8qqIB5QXqCyq8sPKlrXfntOQ+Ha938cIA+A0ag+26MLbhDGj8k3Os7BdY/oqNTKADZQdxfGKhCiA9qO2clpMyRXoE0q6hv9dYoG/2c4sxH8DKsT8XY/QbGmiBsk0DWHcpxkObCsHUxVKi+gIBGSL/tSjz2IJfQVZkdl2hhcyStGuPKbiwAlW3HydMk0VgRhVmHBIc41Cv7vPdMEVf/XiFhr2utRX468M/LR8vkhhokKl1xkVIiquwCPYPzZVAFARHTlaBMhz9kQVtTAHf2JkHuM9XcLWKW996FiSeswKyI=
|
||||
- secure: LQK36EsQdIJw7eSW1yz+yh3+yJdp8cznynBjE3whOEVI2KHZimr+vtK5hxE6TH0QjYyrb/BFgRql6CtLprpaABSEC9gpqpahu50jiAkjKC8DtfSloAbH5jj+ZllaPjURocerllNLVZxiRM/WCuJAy0nzBpAyx62YmVlEYi+zYD67d3wG6gLwso6l2DWuPPze6t5NmbUmH9hNk52++TZalwMtZFdibQoYm64vCTT5gycujw6ZDa8GD0m+Yryvc20kLlWPOVS9lN1iEGo98/gj8Ops8w0iw6k7SfEkvvFsKEUDr77wAN5Tk4tGq7odVrD/y3W9AsHkkSb1B6RqVWkcW3SjCAQc03jhdaBxXwcoJZcYahY21CB12EP7p0HSjEbvIzNpk0D9MulsGaMPlOudnKdG0/kmD7oIAiXjfC7PiPBBFIc/cVF5VAKNTUInEVfcKvlLpqDatwjB+qgb7pld24dUPuJw+yOgglk7J7xckJYHFTHhk0PWI5oN66dndj3yyJp4dz1v64ViFFTG4PO4YPJydZxRxolg1eGMuG0UIYJK6RWcSQ+ZPBm4p78J8xfHtgUkvWvrHJoXC1qAzqx1XRzbHEeTJgbKgLrWY+B6nbNotw1RDX4lNDirp5EI6GqezoFJToZkqe3MRs8DrqhaFjUbbEzAxznRWmxnWNN3Ujc=
|
||||
# The next declaration is the encrypted COVERITY_SCAN_TOKEN, created
|
||||
# via the "travis encrypt" command using the project repo's public key
|
||||
- secure: "V/W4Z9/3uXpS83CvlZ1XfDAbHPIA2ID5G5s9GPcsUqoOASQdc6Y/DPejUlot+DgtiHOEdTr9n5iWDOuxqjcVnjVd6ag9i2m0PMqDhPj3fnUJM6dAeXIBda/qSuTsJTX4cIwb371R77cLcIUm35IEOSIAQOBCjh7RCf3ivGPUp+wobTonkNzDw6xqO90hx7NLnxwGSCcaNBFKOcLL0e7DXspp18lTWCSSaHELzXOyLlhZnWhC5tiFUIZk1ixm/cO1YEQH9AzgPJ5OYs+On0j8VT8XWMsxHu0zfkZkdZMAEOQbO6u4HBDePIfp+PoF1LwtX/UXfaEkUHZ0kNVXHfsN/KP7NHgTbASe9EXp+R4pcKEy4ZEbx+xpp7FlMQSJYiYiQbJ2FBrjwRPreXiHyCqn8htd0YNOTH4UykvO3NYxlTaMf9aE041lnLjUY18TuXrILz6SzMsGV+nYqfIci/NPuj/57k7nw127a93S4Mr/phXts9ZL8I7kagd8wKv3m5+7rmIfuSfS2kg2pTa0hk5uMqFWLG8AilUQ5t1ChylzPcl/Gdgi9OP0pG2WyUmkqOiSqhwwdg2ZCwptodwuonfbdKMSBuHOS8lLU1bGyCRdWsMoscSv/xn4t3ikzBsSDiKgI8xq2+aqQyHDeVneqAk1BbxiNIwoJeyVXq2EKU6MlgI="
|
||||
12
.whitesource
Normal file
12
.whitesource
Normal file
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"scanSettings": {
|
||||
"baseBranches": []
|
||||
},
|
||||
"checkRunSettings": {
|
||||
"vulnerableCheckRunConclusionLevel": "failure",
|
||||
"displayMode": "diff"
|
||||
},
|
||||
"issueSettings": {
|
||||
"minSeverityLevel": "LOW"
|
||||
}
|
||||
}
|
||||
118
CHANGELOG.md
Normal file
118
CHANGELOG.md
Normal file
@@ -0,0 +1,118 @@
|
||||
# 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]
|
||||
- Add additional HTTP headers for call to Themis from Convey
|
||||
- Add callback handler for initial cloud connection status change event
|
||||
- Fix Parodus connection stuck on interface up down received together
|
||||
- Update to use nopoll version 1.0.3
|
||||
|
||||
## [1.1.4]
|
||||
- on connect retry, requery jwt only if it failed before
|
||||
- put two timestamps in connection health file; start conn and current
|
||||
- change health file update interval to 240sec
|
||||
- use jitter in backoff delay
|
||||
- sendMessage to check cloud status == ONLINE before sending
|
||||
- when killed with SIGTERM, close will use msg in close reason file.
|
||||
|
||||
## [1.1.3]
|
||||
- Add callback handler for ping status change event
|
||||
- Fixed nopoll_conn_unref crash
|
||||
- Update retry timestamp in connection-health-file
|
||||
- fix so that parodus can be killed, even if in a connection fail loop
|
||||
- provide signal handlers so we shut down properly when INCLUDE_BREAKPAD active
|
||||
- send status code and reason in websocket close message
|
||||
- dont try to install handler for signal 9
|
||||
|
||||
## [1.1.2]
|
||||
- Add pause/resume heartBeatTimer
|
||||
- parodus event handler to listen to interface_down and interface_up event
|
||||
- Pause connection retry during interface_down event
|
||||
|
||||
## [1.1.1]
|
||||
- Update to use nanomsg v. 1.1.4
|
||||
- requestNewAuthToken will clear the token if it fails.
|
||||
- request auth token on every retry, not just after 403
|
||||
- update to use nopoll v 1.0.2
|
||||
|
||||
## [1.0.4]
|
||||
- Fix re-registration fails that lose a socket
|
||||
- Fix mutex error in service alive
|
||||
- Security: Mutual Authentication (mTLS or two way TLS)
|
||||
- Rename command line options for MTLS cert and Key
|
||||
|
||||
## [1.0.3]
|
||||
- Security: Added support to use auth token during initial connect to cloud
|
||||
|
||||
## [1.0.2] - 2019-02-08
|
||||
- Refactored connection.c and updated corresponding unit tests
|
||||
- Additional `/cloud-status` and `/cloud-disconnect` fields.
|
||||
- Switched from nanomsg (Release 1.1.2) to NNG (Release v1.0.1)
|
||||
- Memory leak fixes
|
||||
- Changed connection logic (connection.c) for retries, and added unit test
|
||||
- Partner-id comparison made case insensitive
|
||||
- Reverted from NNG to nanomag (v1.1.2)
|
||||
- reverted temporary CMake reference to https://github.com/bill1600/seshat
|
||||
- Added log for time difference of parodus connect time and boot time
|
||||
- added NULL check for device mac id in upstream retrieve message handling
|
||||
- backoff retry to include find_servers in loop (connection.c)
|
||||
- backoff max is max count not max delay
|
||||
- used mutex protection to make client list and nn_sends thread safe
|
||||
- put mutex lock into get_global_node
|
||||
- change svc alive from a thread to a function called every 30 sec from main
|
||||
- shut down tasks properly
|
||||
- fix memory leaks
|
||||
- Fixed memory leak in upstream event message flow
|
||||
- Fixed crash in CRUD request processing
|
||||
- Fixed issue on RETRIEVE respone processing
|
||||
- Enabled valgrind
|
||||
- Fixed main loop to keep calling svc_alive_task during a cloud disconnect and retry
|
||||
- change svc alive back to a separate thread. Shut it down with pthread_cond_timedwait
|
||||
- Refactored Upsteam RETRIEVE flow
|
||||
- Fix re-registration to call nn_shutdown and nn_close, so we don't lose a socket.
|
||||
|
||||
## [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.
|
||||
- Added support for override functions to support drop root capabilities for parodus process
|
||||
|
||||
## [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.1.4...HEAD
|
||||
[1.1.4]: https://github.com/Comcast/parodus/compare/1.1.3...1.1.4
|
||||
[1.1.3]: https://github.com/Comcast/parodus/compare/1.1.2...1.1.3
|
||||
[1.1.2]: https://github.com/Comcast/parodus/compare/1.1.1...1.1.2
|
||||
[1.1.1]: https://github.com/Comcast/parodus/compare/1.0.4...1.1.1
|
||||
[1.0.4]: https://github.com/Comcast/parodus/compare/1.0.3...1.0.4
|
||||
[1.0.3]: https://github.com/Comcast/parodus/compare/1.0.2...1.0.3
|
||||
[1.0.2]: https://github.com/Comcast/parodus/compare/1.0.1...1.0.2
|
||||
[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
|
||||
|
||||
115
CMakeLists.txt
115
CMakeLists.txt
@@ -14,6 +14,7 @@
|
||||
|
||||
cmake_minimum_required(VERSION 2.8.7)
|
||||
|
||||
#project(parodus VERSION 1.1.15)
|
||||
project(parodus)
|
||||
|
||||
include(ExternalProject)
|
||||
@@ -22,6 +23,8 @@ 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(PATCHES_DIR ${CMAKE_CURRENT_SOURCE_DIR}/patches)
|
||||
set(LIBRARY_DIR ${INSTALL_DIR}/lib)
|
||||
set(LIBRARY_DIR64 ${INSTALL_DIR}/lib64)
|
||||
set(COMMON_LIBRARY_DIR ${INSTALL_DIR}/lib/${CMAKE_LIBRARY_ARCHITECTURE})
|
||||
@@ -32,6 +35,7 @@ include_directories(${INCLUDE_DIR}
|
||||
${INCLUDE_DIR}/cjson
|
||||
${INCLUDE_DIR}/nopoll
|
||||
${INCLUDE_DIR}/msgpack
|
||||
${INCLUDE_DIR}/curl
|
||||
${INCLUDE_DIR}/trower-base64
|
||||
${INCLUDE_DIR}/wrp-c
|
||||
${INCLUDE_DIR}/libparodus
|
||||
@@ -39,6 +43,10 @@ include_directories(${INCLUDE_DIR}
|
||||
${INCLUDE_DIR}/cjwt
|
||||
)
|
||||
|
||||
if (ENABLE_WEBCFGBIN)
|
||||
include_directories(${INCLUDE_DIR}/rbus)
|
||||
endif (ENABLE_WEBCFGBIN)
|
||||
|
||||
# Get git commit hash
|
||||
#-------------------------------------------------------------------------------
|
||||
execute_process(
|
||||
@@ -70,7 +78,7 @@ 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"
|
||||
GIT_TAG "v1.1.1"
|
||||
CMAKE_ARGS += -DCMAKE_INSTALL_PREFIX=${INSTALL_DIR} -DBUILD_TESTING=OFF
|
||||
)
|
||||
add_library(libtrower-base64 STATIC SHARED IMPORTED)
|
||||
@@ -82,7 +90,7 @@ add_dependencies(libtrower-base64 trower-base64)
|
||||
ExternalProject_Add(nopoll
|
||||
PREFIX ${PREFIX_DIR}/nopoll
|
||||
GIT_REPOSITORY https://github.com/Comcast/nopoll.git
|
||||
GIT_TAG "nopoll_yocto"
|
||||
GIT_TAG "1.0.3"
|
||||
CONFIGURE_COMMAND COMMAND <SOURCE_DIR>/autogen.sh --prefix=${PREFIX}
|
||||
--includedir=${INCLUDE_DIR}
|
||||
--libdir=${LIBRARY_DIR}
|
||||
@@ -98,7 +106,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 "1.1.4"
|
||||
CMAKE_ARGS += -DCMAKE_INSTALL_PREFIX=${INSTALL_DIR}
|
||||
)
|
||||
add_library(libnanomsg STATIC SHARED IMPORTED)
|
||||
@@ -111,7 +119,7 @@ ExternalProject_Add(cJSON
|
||||
#PREFIX ${PREFIX_DIR}/cJSON
|
||||
PREFIX ${CMAKE_CURRENT_BINARY_DIR}/_prefix/cJSON
|
||||
GIT_REPOSITORY https://github.com/DaveGamble/cJSON.git
|
||||
GIT_TAG "aafb64a1c549b7b927e339df6d35b1d5059dc235"
|
||||
GIT_TAG "v1.7.8"
|
||||
CMAKE_ARGS += -DCMAKE_INSTALL_PREFIX=${INSTALL_DIR} -DBUILD_TESTING=OFF
|
||||
)
|
||||
add_library(libcJSON STATIC SHARED IMPORTED)
|
||||
@@ -123,7 +131,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 "cpp-3.1.1"
|
||||
CMAKE_ARGS += -DCMAKE_INSTALL_PREFIX=${INSTALL_DIR}
|
||||
-DMSGPACK_ENABLE_CXX=OFF
|
||||
-DMSGPACK_BUILD_EXAMPLES=OFF
|
||||
@@ -132,13 +140,25 @@ add_library(libmsgpack STATIC SHARED IMPORTED)
|
||||
add_dependencies(libmsgpack msgpack)
|
||||
|
||||
|
||||
# curl external dependency
|
||||
#-------------------------------------------------------------------------------
|
||||
ExternalProject_Add(curl
|
||||
PREFIX ${CMAKE_CURRENT_BINARY_DIR}/_prefix/curl
|
||||
GIT_REPOSITORY https://github.com/curl/curl.git
|
||||
GIT_TAG "curl-7_63_0"
|
||||
CMAKE_ARGS += -DCMAKE_INSTALL_PREFIX=${INSTALL_DIR} -DBUILD_TESTING=OFF
|
||||
)
|
||||
add_library(libcurl STATIC SHARED IMPORTED)
|
||||
add_dependencies(libcurl curl)
|
||||
|
||||
|
||||
# cimplog external dependency
|
||||
#-------------------------------------------------------------------------------
|
||||
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 "1.0.2"
|
||||
CMAKE_ARGS += -DCMAKE_INSTALL_PREFIX=${INSTALL_DIR} -DBUILD_TESTING=OFF
|
||||
)
|
||||
add_library(libcimplog STATIC SHARED IMPORTED)
|
||||
add_dependencies(libcimplog cimplog)
|
||||
@@ -149,8 +169,8 @@ add_dependencies(libcimplog cimplog)
|
||||
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_REPOSITORY https://github.com/xmidt-org/wrp-c.git
|
||||
GIT_TAG "b5ef4d10cb39905908788bc89ab3e4dab201db8a"
|
||||
CMAKE_ARGS += -DCMAKE_INSTALL_PREFIX=${INSTALL_DIR}
|
||||
-DMSGPACK_ENABLE_CXX=OFF
|
||||
-DMSGPACK_BUILD_EXAMPLES=OFF
|
||||
@@ -162,31 +182,16 @@ ExternalProject_Add(wrp-c
|
||||
add_library(libwrp-c STATIC SHARED IMPORTED)
|
||||
add_dependencies(libwrp-c wrp-c)
|
||||
|
||||
# libparodus external dependency
|
||||
#-------------------------------------------------------------------------------
|
||||
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}
|
||||
-DMAIN_PROJ_BUILD=ON
|
||||
-DMAIN_PROJ_LIB_PATH=${LIBRARY_DIR}
|
||||
-DMAIN_PROJ_LIB64_PATH=${LIBRARY_DIR64}
|
||||
-DMAIN_PROJ_COMMON_PATH=${COMMON_LIBRARY_DIR}
|
||||
-DMAIN_PROJ_INCLUDE_PATH=${INCLUDE_DIR}
|
||||
)
|
||||
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_REPOSITORY https://github.com/Comcast/seshat.git
|
||||
GIT_TAG "1.0.1"
|
||||
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}
|
||||
@@ -199,25 +204,25 @@ include_directories(${INCLUDE_DIR}/libseshat)
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DENABLE_SESHAT ")
|
||||
endif (ENABLE_SESHAT)
|
||||
|
||||
if (ENABLE_CJWT)
|
||||
# libcjwt external dependency
|
||||
#-------------------------------------------------------------------------------
|
||||
ExternalProject_Add(cjwt
|
||||
PREFIX ${CMAKE_CURRENT_BINARY_DIR}/_prefix/cjwt
|
||||
GIT_REPOSITORY https://github.com/Comcast/cjwt.git
|
||||
GIT_TAG "master"
|
||||
GIT_TAG "1b023c41bb2d6dbbf493c202ed81f06c84d5b51b"
|
||||
#GIT_TAG "1.0.1"
|
||||
CMAKE_ARGS += -DCMAKE_INSTALL_PREFIX=${INSTALL_DIR} -DBUILD_TESTING=OFF
|
||||
)
|
||||
add_library(libcjwt STATIC SHARED IMPORTED)
|
||||
add_dependencies(libcjwt cjwt)
|
||||
|
||||
if (UCLIBC)
|
||||
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 "master"
|
||||
GIT_TAG "1.0.0"
|
||||
CMAKE_ARGS += -DCMAKE_INSTALL_PREFIX=${INSTALL_DIR}
|
||||
)
|
||||
add_library(libucresolv STATIC SHARED IMPORTED)
|
||||
@@ -226,17 +231,35 @@ include_directories(${INCLUDE_DIR}
|
||||
${INCLUDE_DIR}/ucresolv
|
||||
)
|
||||
|
||||
endif (UCLIBC)
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DENABLE_CJWT ")
|
||||
endif (ENABLE_CJWT)
|
||||
endif (FEATURE_DNS_QUERY)
|
||||
|
||||
if (ENABLE_WEBCFGBIN)
|
||||
# rbus external dependency
|
||||
#-------------------------------------------------------------------------------
|
||||
ExternalProject_Add(rbus
|
||||
PREFIX ${CMAKE_CURRENT_BINARY_DIR}/_prefix/rbus
|
||||
GIT_REPOSITORY https://github.com/rdkcentral/rbus.git
|
||||
GIT_TAG main
|
||||
CMAKE_ARGS += -DBUILD_FOR_DESKTOP=ON -DCMAKE_INSTALL_PREFIX=${INSTALL_DIR} -DBUILD_TESTING=OFF
|
||||
)
|
||||
|
||||
add_library(librbuscore STATIC SHARED IMPORTED)
|
||||
add_dependencies(librbuscore rbuscore)
|
||||
|
||||
add_library(librtMessage STATIC SHARED IMPORTED)
|
||||
add_dependencies(librtMessage rtMessage)
|
||||
|
||||
add_library(librbus STATIC SHARED IMPORTED)
|
||||
add_dependencies(librbus rbus)
|
||||
endif (ENABLE_WEBCFGBIN)
|
||||
|
||||
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)
|
||||
@@ -244,7 +267,23 @@ 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)
|
||||
|
||||
if (ENABLE_WEBCFGBIN)
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DENABLE_WEBCFGBIN ")
|
||||
endif (ENABLE_WEBCFGBIN)
|
||||
|
||||
if (WAN_FAILOVER_SUPPORTED)
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWAN_FAILOVER_SUPPORTED ")
|
||||
endif (WAN_FAILOVER_SUPPORTED)
|
||||
|
||||
link_directories ( ${LIBRARY_DIR} ${COMMON_LIBRARY_DIR} ${LIBRARY_DIR64} )
|
||||
add_subdirectory(src)
|
||||
|
||||
103
README.md
103
README.md
@@ -1,11 +1,22 @@
|
||||
<!--
|
||||
SPDX-FileCopyrightText: 2016-2021 Comcast Cable Communications Management, LLC
|
||||
SPDX-License-Identifier: Apache-2.0
|
||||
-->
|
||||
# parodus
|
||||
|
||||
C implementation of the WebPA client coordinator
|
||||
|
||||
[](https://travis-ci.org/Comcast/parodus)
|
||||
[](http://codecov.io/github/Comcast/parodus?branch=master)
|
||||
[](https://github.com/xmidt-org/parodus/actions)
|
||||
[](http://codecov.io/github/xmidt-org/parodus?branch=master)
|
||||
[](https://scan.coverity.com/projects/comcast-parodus)
|
||||
[](https://github.com/Comcast/parodus/blob/master/LICENSE)
|
||||
[](https://sonarcloud.io/dashboard?id=xmidt-org_parodus)
|
||||
[](https://lgtm.com/projects/g/xmidt-org/parodus/context:cpp)
|
||||
[](https://github.com/xmidt-org/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 +26,85 @@ 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)
|
||||
|
||||
- /client-cert-path -MTLS client cert location to request auth token for establishing secure connection [absolute path where client cert is present] (optional argument)
|
||||
|
||||
- /token-server-url -complete server url with API path to request new auth token for establishing secure connection (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
|
||||
|
||||
# if ENABLE_MUTUAL_AUTH is enabled
|
||||
|
||||
- /mtls-client-cert-path - Provide the client cert for establishing a mutual auth secure websocket connection
|
||||
|
||||
- /mtls-client-key-path - Provide the client cert key for establishing a mutual auth secure websocket connection
|
||||
|
||||
```
|
||||
|
||||
# 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=https://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 --client-cert-path=/tmp/clientcert.mch --token-server-url=https://somebody.net:8080/token --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=https://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 --client-cert-path=/tmp/clientcert.mch --token-server-url=https://somebody.net:8080/token --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=https://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 --client-cert-path=/tmp/clientcert.mch --token-server-url=https://somebody.net:8080/token --force-ipv4 --crud-config-file=/tmp/parodus_cfg.json
|
||||
|
||||
```
|
||||
|
||||
|
||||
@@ -11,10 +11,11 @@
|
||||
# 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
|
||||
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)
|
||||
upstream.c downstream.c thread_tasks.c partners_check.c token.c event_handler.c
|
||||
crud_interface.c crud_tasks.c crud_internal.c close_retry.c auth_token.c privilege.c)
|
||||
|
||||
if (ENABLE_SESHAT)
|
||||
set(SOURCES ${SOURCES} seshat_interface.c)
|
||||
@@ -22,11 +23,15 @@ else()
|
||||
set(SOURCES ${SOURCES} seshat_interface_stub.c)
|
||||
endif (ENABLE_SESHAT)
|
||||
|
||||
if (ENABLE_CJWT)
|
||||
set(SOURCES ${SOURCES} token.c)
|
||||
if (ENABLE_WEBCFGBIN)
|
||||
set(SOURCES ${SOURCES} upstream_rbus.c xmidtsend_rbus.c)
|
||||
endif (ENABLE_WEBCFGBIN)
|
||||
|
||||
if (WAN_FAILOVER_SUPPORTED)
|
||||
message(STATUS "WAN_FAILOVER_SUPPORTED is supported")
|
||||
else()
|
||||
set(SOURCES ${SOURCES} token_stub.c)
|
||||
endif (ENABLE_CJWT)
|
||||
message(STATUS "WAN_FAILOVER_SUPPORTED is not supported")
|
||||
endif (WAN_FAILOVER_SUPPORTED)
|
||||
|
||||
add_executable(parodus ${SOURCES})
|
||||
|
||||
@@ -34,6 +39,7 @@ target_link_libraries (parodus
|
||||
${CMAKE_THREAD_LIBS_INIT}
|
||||
-lwrp-c
|
||||
-lmsgpackc
|
||||
-lcurl
|
||||
-ltrower-base64
|
||||
-lnopoll
|
||||
-luuid
|
||||
@@ -43,16 +49,20 @@ 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)
|
||||
|
||||
if (ENABLE_CJWT)
|
||||
target_link_libraries (parodus -lresolv -lcjwt)
|
||||
endif (ENABLE_CJWT)
|
||||
|
||||
if (ENABLE_WEBCFGBIN)
|
||||
target_link_libraries (parodus -lrbus)
|
||||
endif (ENABLE_WEBCFGBIN)
|
||||
install (TARGETS parodus DESTINATION bin)
|
||||
|
||||
@@ -25,6 +25,11 @@
|
||||
#include "config.h"
|
||||
#include "connection.h"
|
||||
|
||||
bool interface_down_event = false;
|
||||
|
||||
pthread_mutex_t interface_down_mut=PTHREAD_MUTEX_INITIALIZER;
|
||||
pthread_cond_t interface_down_con=PTHREAD_COND_INITIALIZER;
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* External Functions */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
@@ -64,9 +69,9 @@ char* getWebpaConveyHeader()
|
||||
cJSON_AddStringToObject(response, WEBPA_PROTOCOL, get_parodus_cfg()->webpa_protocol);
|
||||
}
|
||||
|
||||
if(strlen(get_parodus_cfg()->webpa_interface_used)!=0)
|
||||
if(strlen(getWebpaInterface())!=0)
|
||||
{
|
||||
cJSON_AddStringToObject(response, WEBPA_INTERFACE, get_parodus_cfg()->webpa_interface_used);
|
||||
cJSON_AddStringToObject(response, WEBPA_INTERFACE, getWebpaInterface());
|
||||
}
|
||||
|
||||
if(strlen(get_parodus_cfg()->hw_last_reboot_reason)!=0)
|
||||
@@ -87,6 +92,10 @@ char* getWebpaConveyHeader()
|
||||
ParodusError("Failed to GET Reconnect reason value\n");
|
||||
}
|
||||
|
||||
if(get_parodus_cfg()->boot_retry_wait > 0)
|
||||
{
|
||||
cJSON_AddNumberToObject(response, BOOT_RETRY_WAIT, get_parodus_cfg()->boot_retry_wait);
|
||||
}
|
||||
buffer = cJSON_PrintUnformatted(response);
|
||||
ParodusInfo("X-WebPA-Convey Header: [%zd]%s\n", strlen(buffer), buffer);
|
||||
|
||||
@@ -114,5 +123,89 @@ char* getWebpaConveyHeader()
|
||||
}
|
||||
free(buffer);
|
||||
cJSON_Delete(response);
|
||||
return encodedData;
|
||||
|
||||
if( 0 < strlen(encodedData) ) {
|
||||
return encodedData;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int readFromFile(const char *file_name, char **data)
|
||||
{
|
||||
FILE *fp;
|
||||
int ch_count = 0;
|
||||
fp = fopen(file_name, "r+");
|
||||
if (fp == NULL)
|
||||
{
|
||||
ParodusError("Failed to open file %s (errno %d)\n", file_name, errno);
|
||||
return 0;
|
||||
}
|
||||
fseek(fp, 0, SEEK_END);
|
||||
ch_count = ftell(fp);
|
||||
fseek(fp, 0, SEEK_SET);
|
||||
*data = (char *) malloc(sizeof(char) * (ch_count + 1));
|
||||
fread(*data, 1, ch_count,fp);
|
||||
(*data)[ch_count] ='\0';
|
||||
fclose(fp);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
/*------------------------------------------------------------------------------*/
|
||||
/* For interface_down_event Flag */
|
||||
/*------------------------------------------------------------------------------*/
|
||||
|
||||
// Get value of interface_down_event
|
||||
bool get_interface_down_event()
|
||||
{
|
||||
bool tmp = false;
|
||||
pthread_mutex_lock (&interface_down_mut);
|
||||
tmp = interface_down_event;
|
||||
pthread_mutex_unlock (&interface_down_mut);
|
||||
return tmp;
|
||||
}
|
||||
|
||||
// Reset value of interface_down_event to false
|
||||
void reset_interface_down_event()
|
||||
{
|
||||
pthread_mutex_lock (&interface_down_mut);
|
||||
interface_down_event = false;
|
||||
pthread_cond_signal(&interface_down_con);
|
||||
pthread_mutex_unlock (&interface_down_mut);
|
||||
}
|
||||
|
||||
// set value of interface_down_event to true
|
||||
void set_interface_down_event()
|
||||
{
|
||||
pthread_mutex_lock (&interface_down_mut);
|
||||
interface_down_event = true;
|
||||
pthread_mutex_unlock (&interface_down_mut);
|
||||
}
|
||||
|
||||
pthread_cond_t *get_interface_down_con(void)
|
||||
{
|
||||
return &interface_down_con;
|
||||
}
|
||||
|
||||
pthread_mutex_t *get_interface_down_mut(void)
|
||||
{
|
||||
return &interface_down_mut;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -49,8 +49,10 @@
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Macros */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
#define UNUSED(x) (void )(x)
|
||||
#define NANOMSG_SOCKET_TIMEOUT_MSEC 2000
|
||||
#define NANO_SOCKET_SEND_TIMEOUT_MS 2000
|
||||
#define NANO_SOCKET_RCV_TIMEOUT_MS 500
|
||||
|
||||
#ifndef TEST
|
||||
#define FOREVER() 1
|
||||
@@ -59,6 +61,12 @@ extern int numLoops;
|
||||
#define FOREVER() numLoops--
|
||||
#endif
|
||||
|
||||
// Return values for find_servers() in connection.c
|
||||
#define FIND_SUCCESS 0
|
||||
#define FIND_INVALID_DEFAULT -2
|
||||
#define FIND_JWT_FAIL -1
|
||||
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Data Structures */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
@@ -77,12 +85,60 @@ typedef struct {
|
||||
int rr_len;
|
||||
} rr_rec_t;
|
||||
|
||||
//------------ Used in comnection.c -----------------
|
||||
typedef struct {
|
||||
int allow_insecure;
|
||||
char *server_addr; // must be freed
|
||||
unsigned int port;
|
||||
} server_t;
|
||||
|
||||
typedef struct {
|
||||
server_t defaults; // from command line
|
||||
server_t jwt; // from jwt endpoint claim
|
||||
server_t redirect; // from redirect response to
|
||||
// nopoll_conn_wait_until_connection_ready
|
||||
} server_list_t;
|
||||
|
||||
//---- Used in connection.c for expire timer
|
||||
typedef struct {
|
||||
int running;
|
||||
struct timespec start_time;
|
||||
struct timespec end_time;
|
||||
} expire_timer_t;
|
||||
|
||||
//--- Used in connection.c for backoff delay timer
|
||||
typedef struct {
|
||||
unsigned long start_time;
|
||||
struct timespec ts;
|
||||
int count;
|
||||
int max_count;
|
||||
int delay;
|
||||
} backoff_timer_t;
|
||||
|
||||
//--- Used in connection.c for init_header_info
|
||||
typedef struct {
|
||||
char *conveyHeader; // Do not free
|
||||
char *device_id; // Need to free
|
||||
char *user_agent; // Need to free
|
||||
} header_info_t;
|
||||
|
||||
// connection context which is defined in createNopollConnection
|
||||
// and passed into functions keep_retrying_connect, connect_and_wait,
|
||||
// wait_connection_ready, and nopoll_connect
|
||||
typedef struct {
|
||||
noPollCtx *nopoll_ctx;
|
||||
server_list_t *server_list;
|
||||
server_t *current_server;
|
||||
header_info_t header_info;
|
||||
char *extra_headers; // need to be freed
|
||||
expire_timer_t connect_timer;
|
||||
} create_connection_ctx_t;
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* File Scoped Variables */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
extern bool LastReasonStatus;
|
||||
extern bool g_shutdown;
|
||||
extern ParodusMsg *ParodusMsgQ;
|
||||
int numLoops;
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Function Prototypes */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
@@ -97,6 +153,44 @@ void parStrncpy(char *destStr, const char *srcStr, size_t destSize);
|
||||
|
||||
char* getWebpaConveyHeader();
|
||||
|
||||
void *CRUDHandlerTask();
|
||||
void addCRUDmsgToQueue(wrp_msg_t *crudMsg);
|
||||
|
||||
int readFromFile(const char *file_name, char **data);
|
||||
|
||||
void timespec_diff(struct timespec *start, struct timespec *stop,
|
||||
struct timespec *result);
|
||||
|
||||
#ifdef ENABLE_WEBCFGBIN
|
||||
void subscribeRBUSevent();
|
||||
int regXmidtSendDataMethod();
|
||||
#endif
|
||||
#ifdef WAN_FAILOVER_SUPPORTED
|
||||
void setWebpaInterface(char *value);
|
||||
#endif
|
||||
/*------------------------------------------------------------------------------*/
|
||||
/* For interface_down_event Flag */
|
||||
/*------------------------------------------------------------------------------*/
|
||||
|
||||
// Get value of interface_down_event
|
||||
bool get_interface_down_event();
|
||||
|
||||
// Reset value of interface_down_event to false
|
||||
void reset_interface_down_event();
|
||||
|
||||
// Set value of interface_down_event to true
|
||||
void set_interface_down_event();
|
||||
|
||||
pthread_cond_t *get_interface_down_con();
|
||||
|
||||
pthread_mutex_t *get_interface_down_mut();
|
||||
|
||||
pthread_cond_t *get_global_cloud_status_cond(void);
|
||||
|
||||
pthread_mutex_t *get_global_cloud_status_mut(void);
|
||||
|
||||
int cloud_status_is_online (void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
322
src/auth_token.c
Normal file
322
src/auth_token.c
Normal file
@@ -0,0 +1,322 @@
|
||||
/**
|
||||
* 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 auth_token.c
|
||||
*
|
||||
* @description This file is to fetch authorization token during parodus cloud connection.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <fcntl.h>
|
||||
#include "config.h"
|
||||
#include "connection.h"
|
||||
#include "auth_token.h"
|
||||
#include "ParodusInternal.h"
|
||||
#include <cjwt/cjwt.h>
|
||||
#include <stdlib.h>
|
||||
#include <curl/curl.h>
|
||||
#include <uuid/uuid.h>
|
||||
|
||||
#define MAX_BUF_SIZE 256
|
||||
#define CURL_TIMEOUT_SEC 25L
|
||||
#define MAX_CURL_RETRY_COUNT 3
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* File Scoped Variables */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
void createCurlheader(struct curl_slist *list, struct curl_slist **header_list);
|
||||
long g_response_code;
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* External Functions */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
int getGlobalResponseCode()
|
||||
{
|
||||
return g_response_code;
|
||||
}
|
||||
/*
|
||||
* @brief Initialize curl object with required options. create newToken using libcurl.
|
||||
* @param[out] newToken auth token string obtained from JWT curl response
|
||||
* @param[in] len total token size
|
||||
* @param[in] r_count Number of curl retries on ipv4 and ipv6 mode during failure
|
||||
* @return returns 0 if success, otherwise failed to fetch auth token and will be retried.
|
||||
*/
|
||||
|
||||
int requestNewAuthToken(char *newToken, size_t len, int r_count)
|
||||
{
|
||||
CURL *curl;
|
||||
CURLcode res;
|
||||
CURLcode time_res;
|
||||
struct curl_slist *list = NULL;
|
||||
struct curl_slist *headers_list = NULL;
|
||||
|
||||
char webpa_interface[64]={'\0'};
|
||||
double total;
|
||||
|
||||
struct token_data data;
|
||||
data.size = 0;
|
||||
data.data = newToken;
|
||||
|
||||
curl = curl_easy_init();
|
||||
if(curl)
|
||||
{
|
||||
data.data[0] = '\0';
|
||||
|
||||
createCurlheader(list, &headers_list);
|
||||
|
||||
curl_easy_setopt(curl, CURLOPT_URL, get_parodus_cfg()->token_server_url);
|
||||
curl_easy_setopt(curl, CURLOPT_TIMEOUT, CURL_TIMEOUT_SEC);
|
||||
|
||||
parStrncpy(webpa_interface, getWebpaInterface(), sizeof(webpa_interface));
|
||||
if(webpa_interface !=NULL && strlen(webpa_interface) >0)
|
||||
{
|
||||
curl_easy_setopt(curl, CURLOPT_INTERFACE, webpa_interface);
|
||||
}
|
||||
/* set callback for writing received data */
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback_fn);
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &data);
|
||||
|
||||
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers_list);
|
||||
|
||||
/* setting curl resolve option as default mode.
|
||||
If any failure, retry with v4 first and then v6 mode. */
|
||||
|
||||
if(r_count == 1)
|
||||
{
|
||||
ParodusInfo("curl Ip resolve option set as V4 mode\n");
|
||||
curl_easy_setopt(curl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
|
||||
}
|
||||
else if(r_count == 2)
|
||||
{
|
||||
ParodusInfo("curl Ip resolve option set as V6 mode\n");
|
||||
curl_easy_setopt(curl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V6);
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusInfo("curl Ip resolve option set as default mode\n");
|
||||
curl_easy_setopt(curl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_WHATEVER);
|
||||
}
|
||||
|
||||
/* set the cert for client authentication */
|
||||
curl_easy_setopt(curl, CURLOPT_SSLCERT, get_parodus_cfg()->client_cert_path);
|
||||
|
||||
curl_easy_setopt(curl, CURLOPT_CAINFO, get_parodus_cfg()->cert_path);
|
||||
|
||||
/* disconnect if it is failed to validate server's cert */
|
||||
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 1L);
|
||||
|
||||
/* Perform the request, res will get the return code */
|
||||
res = curl_easy_perform(curl);
|
||||
|
||||
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &g_response_code);
|
||||
ParodusInfo("themis curl response %d http_code %d\n", res, g_response_code);
|
||||
|
||||
time_res = curl_easy_getinfo(curl, CURLINFO_TOTAL_TIME, &total);
|
||||
if(time_res == 0)
|
||||
{
|
||||
ParodusInfo("curl response Time: %.1f seconds\n", total);
|
||||
}
|
||||
curl_slist_free_all(headers_list);
|
||||
if(res != 0)
|
||||
{
|
||||
ParodusError("curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
|
||||
curl_easy_cleanup(curl);
|
||||
data.size = 0;
|
||||
memset (data.data, 0, len);
|
||||
return -1;
|
||||
}
|
||||
else
|
||||
{
|
||||
if(getGlobalResponseCode() == 200)
|
||||
{
|
||||
ParodusInfo("cURL success\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusError("Failed response from auth token server %s\n", data.data);
|
||||
curl_easy_cleanup(curl);
|
||||
data.size = 0;
|
||||
memset (data.data, 0, len);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
curl_easy_cleanup(curl);
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusError("curl init failure\n");
|
||||
data.size = 0;
|
||||
memset (data.data, 0, len);
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* @brief Fetches authorization token and update to parodus config.
|
||||
This will do curl retry in case of any failure till it reaches max curl retry count.
|
||||
* @param[in] cfg Global parodus config structure to update webpa_auth_token
|
||||
*/
|
||||
|
||||
void getAuthToken(ParodusCfg *cfg)
|
||||
{
|
||||
int status = -1;
|
||||
int retry_count = 0;
|
||||
|
||||
memset (cfg->webpa_auth_token, 0, sizeof(cfg->webpa_auth_token));
|
||||
if( cfg->hw_mac != NULL && strlen(cfg->hw_mac) !=0 )
|
||||
{
|
||||
if( cfg->client_cert_path !=NULL && strlen(cfg->client_cert_path) !=0 )
|
||||
{
|
||||
while(1)
|
||||
{
|
||||
//Fetch new auth token using libcurl
|
||||
status = requestNewAuthToken(cfg->webpa_auth_token, sizeof(cfg->webpa_auth_token), retry_count);
|
||||
if(status == 0)
|
||||
{
|
||||
ParodusInfo("cfg->webpa_auth_token created successfully\n");
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusError("Failed to create new token\n");
|
||||
retry_count++;
|
||||
ParodusError("Curl execution is failed, retry attempt: %d\n", retry_count);
|
||||
}
|
||||
|
||||
if(retry_count == MAX_CURL_RETRY_COUNT)
|
||||
{
|
||||
ParodusError("Curl retry is reached to max %d attempts, proceeding without token\n", retry_count);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusError("client_cert_path is NULL, failed to fetch auth token\n");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusError("hw_mac is NULL, failed to fetch auth token\n");
|
||||
}
|
||||
}
|
||||
|
||||
/* @brief callback function for writing libcurl received data
|
||||
* @param[in] buffer curl delivered data which need to be saved.
|
||||
* @param[in] size size is always 1
|
||||
* @param[in] nmemb size of delivered data
|
||||
* @param[out] data curl response data saved.
|
||||
*/
|
||||
size_t write_callback_fn(void *buffer, size_t size, size_t nmemb, struct token_data *data)
|
||||
{
|
||||
ParodusCfg *cfg;
|
||||
size_t max_data_size = sizeof (cfg->webpa_auth_token);
|
||||
size_t index = data->size;
|
||||
size_t n = (size * nmemb);
|
||||
|
||||
data->size += n;
|
||||
|
||||
if (data->size >= max_data_size) {
|
||||
ParodusError("Auth token data overruns buffer\n");
|
||||
data->size = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
memcpy((data->data + index), buffer, n);
|
||||
data->data[data->size] = '\0';
|
||||
|
||||
return n;
|
||||
}
|
||||
|
||||
/* @brief function to generate random uuid.
|
||||
*/
|
||||
char* generate_trans_uuid()
|
||||
{
|
||||
char *transID = NULL;
|
||||
uuid_t transaction_Id;
|
||||
char *trans_id = NULL;
|
||||
trans_id = (char *)malloc(37);
|
||||
uuid_generate_random(transaction_Id);
|
||||
uuid_unparse(transaction_Id, trans_id);
|
||||
|
||||
if(trans_id !=NULL)
|
||||
{
|
||||
transID = trans_id;
|
||||
}
|
||||
return transID;
|
||||
}
|
||||
|
||||
/* @brief function to create curl header contains mac, serial number and uuid.
|
||||
* @param[in] h the auth headers to populate
|
||||
* @param[in] list temp curl header list
|
||||
* @param[out] header_list output curl header list
|
||||
*/
|
||||
void createCurlheader(struct curl_slist *list, struct curl_slist **header_list)
|
||||
{
|
||||
char buf[MAX_BUF_SIZE];
|
||||
char *uuid = NULL;
|
||||
|
||||
snprintf(buf, MAX_BUF_SIZE, "X-Midt-Mac-Address: %s", get_parodus_cfg()->hw_mac);
|
||||
ParodusPrint("mac_header formed %s\n", buf);
|
||||
list = curl_slist_append(list, buf);
|
||||
|
||||
snprintf(buf, MAX_BUF_SIZE, "X-Midt-Serial-Number: %s", get_parodus_cfg()->hw_serial_number);
|
||||
ParodusPrint("serial_header formed %s\n", buf);
|
||||
list = curl_slist_append(list, buf);
|
||||
|
||||
uuid = generate_trans_uuid();
|
||||
if(uuid !=NULL) {
|
||||
snprintf(buf, MAX_BUF_SIZE, "X-Midt-Uuid: %s", uuid);
|
||||
ParodusInfo("uuid_header formed %s\n", buf);
|
||||
list = curl_slist_append(list, buf);
|
||||
free(uuid);
|
||||
} else {
|
||||
ParodusError("Failed to generate transaction_uuid\n");
|
||||
}
|
||||
|
||||
snprintf(buf, MAX_BUF_SIZE, "X-Midt-Partner-Id: %s", get_parodus_cfg()->partner_id);
|
||||
ParodusInfo("partnerid_header formed %s\n", buf);
|
||||
list = curl_slist_append(list, buf);
|
||||
|
||||
snprintf(buf, MAX_BUF_SIZE, "X-Midt-Hardware-Model: %s", get_parodus_cfg()->hw_model);
|
||||
list = curl_slist_append(list, buf);
|
||||
|
||||
snprintf(buf, MAX_BUF_SIZE, "X-Midt-Hardware-Manufacturer: %s", get_parodus_cfg()->hw_manufacturer);
|
||||
list = curl_slist_append(list, buf);
|
||||
|
||||
snprintf(buf, MAX_BUF_SIZE, "X-Midt-Firmware-Name: %s", get_parodus_cfg()->fw_name);
|
||||
list = curl_slist_append(list, buf);
|
||||
|
||||
snprintf(buf, MAX_BUF_SIZE, "X-Midt-Protocol: %s", get_parodus_cfg()->webpa_protocol);
|
||||
list = curl_slist_append(list, buf);
|
||||
|
||||
snprintf(buf, MAX_BUF_SIZE, "X-Midt-Interface-Used: %s", getWebpaInterface());
|
||||
list = curl_slist_append(list, buf);
|
||||
|
||||
snprintf(buf, MAX_BUF_SIZE, "X-Midt-Last-Reboot-Reason: %s", get_parodus_cfg()->hw_last_reboot_reason);
|
||||
list = curl_slist_append(list, buf);
|
||||
|
||||
snprintf(buf, MAX_BUF_SIZE, "X-Midt-Last-Reconnect-Reason: %s", get_global_reconnect_reason());
|
||||
list = curl_slist_append(list, buf);
|
||||
|
||||
snprintf(buf, MAX_BUF_SIZE, "X-Midt-Boot-Retry-Wait: %d", get_parodus_cfg()->boot_retry_wait);
|
||||
list = curl_slist_append(list, buf);
|
||||
|
||||
*header_list = list;
|
||||
}
|
||||
57
src/auth_token.h
Normal file
57
src/auth_token.h
Normal file
@@ -0,0 +1,57 @@
|
||||
/**
|
||||
* 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 auth_token.h
|
||||
*
|
||||
* @description This file is to fetch authorization token during parodus cloud connection.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _AUTH_TOKEN_H_
|
||||
#define _AUTH_TOKEN_H_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Macros */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Data Structures */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
struct token_data {
|
||||
size_t size;
|
||||
char* data;
|
||||
};
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Function Prototypes */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
int requestNewAuthToken(char *newToken, size_t len, int r_count);
|
||||
void getAuthToken(ParodusCfg *cfg);
|
||||
size_t write_callback_fn(void *buffer, size_t size, size_t nmemb, struct token_data *data);
|
||||
char* generate_trans_uuid();
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -30,6 +30,7 @@
|
||||
/*----------------------------------------------------------------------------*/
|
||||
static int numOfClients = 0;
|
||||
static reg_list_item_t * g_head = NULL;
|
||||
pthread_mutex_t client_mut=PTHREAD_MUTEX_INITIALIZER;
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* External functions */
|
||||
@@ -37,9 +38,16 @@ static reg_list_item_t * g_head = NULL;
|
||||
|
||||
reg_list_item_t * get_global_node(void)
|
||||
{
|
||||
pthread_mutex_lock (&client_mut);
|
||||
return g_head;
|
||||
}
|
||||
|
||||
void release_global_node (void)
|
||||
{
|
||||
pthread_mutex_unlock (&client_mut);
|
||||
}
|
||||
|
||||
|
||||
int get_numOfClients()
|
||||
{
|
||||
return numOfClients;
|
||||
@@ -52,11 +60,12 @@ int addToList( wrp_msg_t **msg)
|
||||
int rc = -1;
|
||||
int sock;
|
||||
int retStatus = -1;
|
||||
|
||||
sock = nn_socket( AF_SP, NN_PUSH );
|
||||
ParodusPrint("sock created for adding entries to list: %d\n", sock);
|
||||
if(sock >= 0)
|
||||
{
|
||||
int t = NANOMSG_SOCKET_TIMEOUT_MSEC;
|
||||
int t = NANO_SOCKET_SEND_TIMEOUT_MS;
|
||||
rc = nn_setsockopt(sock, NN_SOL_SOCKET, NN_SNDTIMEO, &t, sizeof(t));
|
||||
if(rc < 0)
|
||||
{
|
||||
@@ -67,7 +76,11 @@ int addToList( wrp_msg_t **msg)
|
||||
if(rc < 0)
|
||||
{
|
||||
ParodusError ("Unable to connect socket (errno=%d, %s)\n",errno, strerror(errno));
|
||||
nn_close (sock);
|
||||
if (nn_close (sock) < 0)
|
||||
{
|
||||
ParodusError ("nn_close socket=%d (err=%d, %s)\n",
|
||||
sock, errno, strerror(errno));
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
@@ -78,6 +91,7 @@ int addToList( wrp_msg_t **msg)
|
||||
{
|
||||
memset( new_node, 0, sizeof( reg_list_item_t ) );
|
||||
new_node->sock = sock;
|
||||
new_node->endpoint = rc;
|
||||
ParodusPrint("new_node->sock is %d\n", new_node->sock);
|
||||
|
||||
|
||||
@@ -210,11 +224,21 @@ int deleteFromList(char* service_name)
|
||||
}
|
||||
|
||||
ParodusPrint("Deleting the node\n");
|
||||
if(nn_shutdown(curr_node->sock, curr_node->endpoint) < 0)
|
||||
{
|
||||
ParodusError ("nn_shutdown socket=%d endpt=%d, err=%d\n",
|
||||
curr_node->sock, curr_node->endpoint, errno);
|
||||
}
|
||||
if (nn_close (curr_node->sock) < 0)
|
||||
{
|
||||
ParodusError ("nn_close socket=%d err=%d\n",
|
||||
curr_node->sock, errno);
|
||||
}
|
||||
free( curr_node );
|
||||
curr_node = NULL;
|
||||
ParodusInfo("Deleted successfully and returning..\n");
|
||||
numOfClients =numOfClients - 1;
|
||||
ParodusPrint("numOfClients after delte is %d\n", numOfClients);
|
||||
ParodusPrint("numOfClients after delete is %d\n", numOfClients);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -224,3 +248,70 @@ int deleteFromList(char* service_name)
|
||||
ParodusError("Could not find the entry to delete from list\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
void deleteAllClients (void)
|
||||
{
|
||||
reg_list_item_t *next_node = NULL;
|
||||
|
||||
while (NULL != g_head)
|
||||
{
|
||||
next_node = g_head->next;
|
||||
free (g_head);
|
||||
g_head = next_node;
|
||||
}
|
||||
if (numOfClients > 0) {
|
||||
ParodusInfo ("Deleted %d clients\n", numOfClients);
|
||||
numOfClients = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
*@dest : Client destination to send message
|
||||
*@Msg: Msg to send it to client (No free done here), user responsibilites to free the msg
|
||||
*@msgSize : Total size of the msg to send to client
|
||||
*/
|
||||
int sendMsgtoRegisteredClients(char *dest,const char **Msg,size_t msgSize)
|
||||
{
|
||||
int bytes =0;
|
||||
reg_list_item_t *temp = NULL;
|
||||
temp = get_global_node();
|
||||
//Checking for individual clients & Sending msg to registered client
|
||||
while (NULL != temp)
|
||||
{
|
||||
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)
|
||||
{
|
||||
bytes = nn_send(temp->sock, *Msg, msgSize, 0);
|
||||
release_global_node ();
|
||||
ParodusInfo("sent downstream message to reg_client '%s'\n", temp->url);
|
||||
ParodusPrint("downstream bytes sent:%d\n", bytes);
|
||||
return 1;
|
||||
}
|
||||
ParodusPrint("checking the next item in the list\n");
|
||||
temp= temp->next;
|
||||
}
|
||||
release_global_node ();
|
||||
return 0;
|
||||
}
|
||||
|
||||
//To check client registration status with parodus.
|
||||
int checkClientStatus(char *serviceName)
|
||||
{
|
||||
reg_list_item_t *temp = NULL;
|
||||
temp = get_global_node();
|
||||
while (NULL != temp)
|
||||
{
|
||||
ParodusPrint("node is pointing to temp->service_name %s \n",temp->service_name);
|
||||
// Sending message to registered clients
|
||||
if( strcmp(serviceName, temp->service_name) == 0)
|
||||
{
|
||||
release_global_node ();
|
||||
return 1;
|
||||
}
|
||||
ParodusPrint("checking the next item in the list\n");
|
||||
temp= temp->next;
|
||||
}
|
||||
release_global_node ();
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -30,6 +30,7 @@
|
||||
typedef struct reg_list_item
|
||||
{
|
||||
int sock;
|
||||
int endpoint;
|
||||
char service_name[32];
|
||||
char url[100];
|
||||
struct reg_list_item *next;
|
||||
@@ -50,9 +51,12 @@ int sendAuthStatus(reg_list_item_t *new_node);
|
||||
|
||||
int deleteFromList(char* service_name);
|
||||
int get_numOfClients();
|
||||
void deleteAllClients (void);
|
||||
int sendMsgtoRegisteredClients(char *dest,const char **Msg,size_t msgSize);
|
||||
|
||||
reg_list_item_t * get_global_node(void);
|
||||
|
||||
void release_global_node (void);
|
||||
int checkClientStatus();
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
56
src/close_retry.c
Normal file
56
src/close_retry.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 close_retry.c
|
||||
*
|
||||
* @description Functions required to manage connection close retry.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "close_retry.h"
|
||||
|
||||
bool close_retry = false;
|
||||
|
||||
pthread_mutex_t close_mut=PTHREAD_MUTEX_INITIALIZER;
|
||||
|
||||
// Get value of close_retry
|
||||
bool get_close_retry()
|
||||
{
|
||||
bool tmp = false;
|
||||
pthread_mutex_lock (&close_mut);
|
||||
tmp = close_retry;
|
||||
pthread_mutex_unlock (&close_mut);
|
||||
return tmp;
|
||||
}
|
||||
|
||||
// Reset value of close_retry to false
|
||||
void reset_close_retry()
|
||||
{
|
||||
pthread_mutex_lock (&close_mut);
|
||||
close_retry = false;
|
||||
pthread_mutex_unlock (&close_mut);
|
||||
}
|
||||
|
||||
// set value of close_retry to true
|
||||
void set_close_retry()
|
||||
{
|
||||
pthread_mutex_lock (&close_mut);
|
||||
close_retry = true;
|
||||
pthread_mutex_unlock (&close_mut);
|
||||
}
|
||||
|
||||
|
||||
47
src/close_retry.h
Normal file
47
src/close_retry.h
Normal file
@@ -0,0 +1,47 @@
|
||||
/**
|
||||
* 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 close_retry.h
|
||||
*
|
||||
* @description Functions required to manage connection close retry.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _CLOSERETRY_H_
|
||||
#define _CLOSERETRY_H_
|
||||
|
||||
#include <pthread.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
// Get value of close_retry
|
||||
bool get_close_retry();
|
||||
|
||||
// Reset value of close_retry to false
|
||||
void reset_close_retry();
|
||||
|
||||
// Set value of close_retry to true
|
||||
void set_close_retry();
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
741
src/config.c
741
src/config.c
File diff suppressed because it is too large
Load Diff
89
src/config.h
89
src/config.h
@@ -24,6 +24,7 @@
|
||||
#ifndef _CONFIG_H_
|
||||
#define _CONFIG_H_
|
||||
|
||||
#include <pthread.h>
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
@@ -42,20 +43,28 @@ extern "C" {
|
||||
#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_INTERFACE "webpa-interface-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 CLOUD_STATUS "cloud-status"
|
||||
#define CLOUD_DISCONNECT "cloud-disconnect"
|
||||
#define CLOUD_STATUS_ONLINE "online"
|
||||
#define CLOUD_STATUS_OFFLINE "offline"
|
||||
#define CLOUD_DISCONNECT_REASON "disconnection-reason"
|
||||
#define BOOT_RETRY_WAIT "boot-time-retry-wait"
|
||||
|
||||
#define PROTOCOL_VALUE "PARODUS-2.0"
|
||||
#define WEBPA_PATH_URL "/api/v2/device"
|
||||
#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"
|
||||
|
||||
#ifdef ENABLE_CJWT
|
||||
# define DNS_ID "fabric"
|
||||
#endif
|
||||
#define PARODUS_UPSTREAM "tcp://127.0.0.1:6666"
|
||||
#define ALLOW_NON_RSA_ALG false
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Data Structures */
|
||||
@@ -67,7 +76,7 @@ typedef struct
|
||||
char hw_serial_number[64];
|
||||
char hw_manufacturer[64];
|
||||
char hw_mac[64];
|
||||
char hw_last_reboot_reason[64];
|
||||
char hw_last_reboot_reason[128];
|
||||
char fw_name[64];
|
||||
unsigned int boot_time;
|
||||
unsigned int webpa_ping_timeout;
|
||||
@@ -79,22 +88,36 @@ typedef struct
|
||||
char webpa_uuid[64];
|
||||
unsigned int flags;
|
||||
char local_url[124];
|
||||
#ifdef ENABLE_WEBCFGBIN
|
||||
unsigned int max_queue_size;
|
||||
#endif
|
||||
char partner_id[64];
|
||||
#ifdef ENABLE_SESHAT
|
||||
char seshat_url[128];
|
||||
#endif
|
||||
#ifdef ENABLE_CJWT
|
||||
char dns_id[64];
|
||||
char jwt_algo[32]; // bit mask set for each allowed algorithm
|
||||
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
|
||||
#endif
|
||||
char cert_path[64];
|
||||
char webpa_token[4096];
|
||||
char webpa_auth_token[4096];
|
||||
char token_acquisition_script[64];
|
||||
char token_read_script[64];
|
||||
char *client_cert_path;
|
||||
char *token_server_url;
|
||||
char *connection_health_file;
|
||||
char *close_reason_file;
|
||||
char *mtls_client_key_path;
|
||||
char *mtls_client_cert_path;
|
||||
char *crud_config_file;
|
||||
char *cloud_status;
|
||||
char *cloud_disconnect;
|
||||
unsigned int boot_retry_wait;
|
||||
} ParodusCfg;
|
||||
|
||||
#define FLAGS_SECURE (1 << 0)
|
||||
#define FLAGS_IPV6_ONLY (1 << 1)
|
||||
#define FLAGS_IPV4_ONLY (1 << 2)
|
||||
#define FLAGS_IPV6_ONLY (1 << 0)
|
||||
#define FLAGS_IPV4_ONLY (1 << 1)
|
||||
#define FLAGS_IPV6_IPV4 (FLAGS_IPV6_ONLY | FLAGS_IPV4_ONLY)
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Function Prototypes */
|
||||
@@ -102,12 +125,42 @@ typedef struct
|
||||
|
||||
void loadParodusCfg(ParodusCfg * config,ParodusCfg *cfg);
|
||||
|
||||
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);
|
||||
// Accessor for the global config structure.
|
||||
ParodusCfg *get_parodus_cfg(void);
|
||||
void set_parodus_cfg(ParodusCfg *);
|
||||
|
||||
char *get_token_application(void) ;
|
||||
void set_cloud_disconnect_reason(ParodusCfg *cfg, char *disconn_reason);
|
||||
void reset_cloud_disconnect_reason(ParodusCfg *cfg);
|
||||
char *getWebpaInterface(void);
|
||||
void set_cloud_status(char *status);
|
||||
char *get_cloud_status(void);
|
||||
int get_parodus_init();
|
||||
/**
|
||||
* 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 ptr to a server address ptr
|
||||
* will be NULL if invalid,
|
||||
* otherwise will need to be freed
|
||||
* @param port ptr to port variable
|
||||
* @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, unsigned int *port);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -33,38 +33,59 @@
|
||||
#include "spin_thread.h"
|
||||
#include "service_alive.h"
|
||||
#include "seshat_interface.h"
|
||||
#include "event_handler.h"
|
||||
#include "crud_interface.h"
|
||||
#include "heartBeat.h"
|
||||
#include "close_retry.h"
|
||||
#include <curl/curl.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 CLOUD_RECONNECT_TIME 5 /* Cloud disconnect max time in minutes */
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* File Scoped Variables */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
bool close_retry = false;
|
||||
bool LastReasonStatus = false;
|
||||
volatile unsigned int heartBeatTimer = 0;
|
||||
pthread_mutex_t close_mut=PTHREAD_MUTEX_INITIALIZER;
|
||||
bool g_shutdown = false;
|
||||
pthread_t upstream_tid;
|
||||
pthread_t upstream_msg_tid;
|
||||
pthread_t downstream_tid;
|
||||
pthread_t svc_alive_tid;
|
||||
pthread_t crud_tid;
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Function Prototypes */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
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;
|
||||
server_list_t server_list;
|
||||
bool seshat_registered = false;
|
||||
int create_conn_rtn = 0;
|
||||
int nopoll_returnvalue = 0;
|
||||
unsigned int webpa_ping_timeout_ms = 1000 * get_parodus_cfg()->webpa_ping_timeout;
|
||||
unsigned int heartBeatTimer = 0;
|
||||
struct timespec start_svc_alive_timer;
|
||||
|
||||
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();
|
||||
@@ -77,15 +98,27 @@ void createSocketConnection(void *config_in, void (* initKeypress)())
|
||||
nopoll_log_set_handler (ctx, __report_log, NULL);
|
||||
#endif
|
||||
|
||||
createNopollConnection(ctx);
|
||||
EventHandler();
|
||||
#ifdef WAN_FAILOVER_SUPPORTED
|
||||
subscribeCurrentActiveInterfaceEvent();
|
||||
#endif
|
||||
set_server_list_null (&server_list);
|
||||
create_conn_rtn = createNopollConnection(ctx, &server_list);
|
||||
if(!create_conn_rtn)
|
||||
{
|
||||
ParodusError("Unrecovered error, terminating the process\n");
|
||||
OnboardLog("Unrecovered error, terminating the process\n");
|
||||
abort();
|
||||
}
|
||||
packMetaData();
|
||||
|
||||
UpStreamMsgQ = NULL;
|
||||
StartThread(handle_upstream);
|
||||
StartThread(processUpstreamMessage);
|
||||
StartThread(handle_upstream, &upstream_tid);
|
||||
StartThread(processUpstreamMessage, &upstream_msg_tid);
|
||||
ParodusMsgQ = NULL;
|
||||
StartThread(messageHandlerTask);
|
||||
StartThread(serviceAliveTask);
|
||||
StartThread(messageHandlerTask, &downstream_tid);
|
||||
StartThread(serviceAliveTask, &svc_alive_tid);
|
||||
StartThread(CRUDHandlerTask, &crud_tid);
|
||||
|
||||
if (NULL != initKeypress)
|
||||
{
|
||||
@@ -94,51 +127,116 @@ void createSocketConnection(void *config_in, void (* initKeypress)())
|
||||
|
||||
seshat_registered = __registerWithSeshat();
|
||||
|
||||
clock_gettime(CLOCK_REALTIME, &start_svc_alive_timer);
|
||||
|
||||
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_MONOTONIC, &start);
|
||||
nopoll_returnvalue = nopoll_loop_wait(ctx, 5000000);
|
||||
clock_gettime(CLOCK_MONOTONIC, &stop);
|
||||
|
||||
timespec_diff(&start, &stop, &diff);
|
||||
time_taken_ms = diff.tv_sec * 1000 + (diff.tv_nsec / 1000000);
|
||||
if(time_taken_ms/1000 != 5)
|
||||
{
|
||||
ParodusInfo("nopoll_loop_wait value %d,nopoll_loop_wait() time %d msec\n",nopoll_returnvalue, time_taken_ms);
|
||||
}
|
||||
ParodusPrint("webpa_ping_timeout_ms %d msec\n", webpa_ping_timeout_ms);
|
||||
heartBeatTimer = get_heartBeatTimer();
|
||||
if(heartBeatTimer >= webpa_ping_timeout_ms)
|
||||
{
|
||||
if(!close_retry)
|
||||
ParodusInfo("heartBeatTimer %d webpa_ping_timeout_ms %d\n", heartBeatTimer, webpa_ping_timeout_ms);
|
||||
|
||||
if(!get_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");
|
||||
OnboardLog("Reconnect detected, setting Ping_Miss reason for Reconnect\n");
|
||||
set_global_reconnect_reason("Ping_Miss");
|
||||
LastReasonStatus = true;
|
||||
pthread_mutex_lock (&close_mut);
|
||||
close_retry = true;
|
||||
pthread_mutex_unlock (&close_mut);
|
||||
set_global_reconnect_status(true);
|
||||
// Invoke the ping status change event callback as "missed" ping
|
||||
if(NULL != on_ping_status_change)
|
||||
{
|
||||
on_ping_status_change("missed");
|
||||
}
|
||||
set_close_retry();
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusPrint("heartBeatHandler - close_retry set to %d, hence resetting the heartBeatTimer\n",close_retry);
|
||||
{
|
||||
ParodusPrint("heartBeatHandler - close_retry set to %d, hence resetting the heartBeatTimer\n",get_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 ) {
|
||||
seshat_registered = __registerWithSeshat();
|
||||
}
|
||||
|
||||
if (get_interface_down_event ())
|
||||
if (0 != wait_while_interface_down ())
|
||||
break;
|
||||
|
||||
if(close_retry)
|
||||
if(get_close_retry())
|
||||
{
|
||||
ParodusInfo("close_retry is %d, hence closing the connection and retrying\n", close_retry);
|
||||
close_and_unref_connection(get_global_conn());
|
||||
ParodusInfo("close_retry is %d, hence closing the connection and retrying\n", get_close_retry());
|
||||
close_and_unref_connection(get_global_conn(), false);
|
||||
set_global_conn(NULL);
|
||||
createNopollConnection(ctx);
|
||||
}
|
||||
} while(!close_retry);
|
||||
|
||||
close_and_unref_connection(get_global_conn());
|
||||
if(get_parodus_cfg()->cloud_disconnect !=NULL)
|
||||
{
|
||||
ParodusPrint("get_parodus_cfg()->cloud_disconnect is %s\n", get_parodus_cfg()->cloud_disconnect);
|
||||
set_cloud_disconnect_time(CLOUD_RECONNECT_TIME);
|
||||
ParodusInfo("Waiting for %d minutes for reconnecting .. \n", get_cloud_disconnect_time());
|
||||
|
||||
sleep (get_cloud_disconnect_time() * 60);
|
||||
ParodusInfo("cloud-disconnect reason reset after %d minutes\n", get_cloud_disconnect_time());
|
||||
free(get_parodus_cfg()->cloud_disconnect);
|
||||
reset_cloud_disconnect_reason(get_parodus_cfg());
|
||||
}
|
||||
createNopollConnection(ctx, &server_list);
|
||||
}
|
||||
//process exit only when g_shutdown is true.
|
||||
} while(FOREVER() && !g_shutdown);
|
||||
|
||||
pthread_mutex_lock (get_global_svc_mut());
|
||||
pthread_cond_signal (get_global_svc_con());
|
||||
pthread_mutex_unlock (get_global_svc_mut());
|
||||
pthread_mutex_lock (get_global_crud_mut());
|
||||
pthread_cond_signal (get_global_crud_con());
|
||||
pthread_mutex_unlock (get_global_crud_mut());
|
||||
pthread_mutex_lock (&g_mutex);
|
||||
pthread_cond_signal (&g_cond);
|
||||
pthread_mutex_unlock (&g_mutex);
|
||||
pthread_mutex_lock (get_global_nano_mut ());
|
||||
pthread_cond_signal (get_global_nano_con());
|
||||
pthread_mutex_unlock (get_global_nano_mut());
|
||||
|
||||
ParodusInfo ("joining threads\n");
|
||||
JoinThread (svc_alive_tid);
|
||||
JoinThread (upstream_tid);
|
||||
JoinThread (downstream_tid);
|
||||
JoinThread (upstream_msg_tid);
|
||||
JoinThread (crud_tid);
|
||||
|
||||
deleteAllClients ();
|
||||
|
||||
ParodusInfo ("reconnect reason at close %s\n", get_global_reconnect_reason());
|
||||
close_and_unref_connection(get_global_conn(), true);
|
||||
nopoll_ctx_unref(ctx);
|
||||
nopoll_cleanup_library();
|
||||
curl_global_cleanup();
|
||||
}
|
||||
|
||||
void shutdownSocketConnection(char *reason) {
|
||||
set_global_shutdown_reason (reason);
|
||||
g_shutdown = true;
|
||||
reset_interface_down_event ();
|
||||
terminate_backoff_delay ();
|
||||
}
|
||||
|
||||
|
||||
@@ -44,7 +44,8 @@ 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)());
|
||||
void shutdownSocketConnection(char *reason);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
1076
src/connection.c
1076
src/connection.c
File diff suppressed because it is too large
Load Diff
@@ -33,28 +33,72 @@ extern "C" {
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* File Scoped Variables */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
#define SHUTDOWN_REASON_PARODUS_STOP "parodus_stopping"
|
||||
#define SHUTDOWN_REASON_SYSTEM_RESTART "system_restarting"
|
||||
#define SHUTDOWN_REASON_SIGTERM "SIGTERM"
|
||||
|
||||
extern bool close_retry;
|
||||
extern volatile unsigned int heartBeatTimer;
|
||||
extern pthread_mutex_t close_mut;
|
||||
/**
|
||||
* parodusOnConnStatusChangeHandler - Function pointer
|
||||
* Used to define callback function to do additional processing
|
||||
* when websocket cloud connection status change event
|
||||
* i.e. "cloud-conn-status" as "fail" or "success"
|
||||
*/
|
||||
typedef void (*parodusOnConnStatusChangeHandler) (char * status);
|
||||
extern parodusOnConnStatusChangeHandler on_conn_status_change;
|
||||
|
||||
/**
|
||||
* parodusOnPingStatusChangeHandler - Function pointer
|
||||
* Used to define callback function to do additional processing
|
||||
* when websocket Ping status change event
|
||||
* i.e. ping_miss or ping receive after miss
|
||||
*/
|
||||
typedef void (*parodusOnPingStatusChangeHandler) (char * status);
|
||||
extern parodusOnPingStatusChangeHandler on_ping_status_change;
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Function Prototypes */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
int createNopollConnection(noPollCtx *);
|
||||
void set_server_list_null (server_list_t *server_list);
|
||||
int createNopollConnection(noPollCtx *, server_list_t *);
|
||||
|
||||
/**
|
||||
* @brief Interface to terminate WebSocket client connections and clean up resources.
|
||||
*/
|
||||
void close_and_unref_connection(noPollConn *);
|
||||
void close_and_unref_connection(noPollConn *conn, bool is_shutting_down);
|
||||
|
||||
noPollConn *get_global_conn(void);
|
||||
void set_global_conn(noPollConn *);
|
||||
|
||||
char *get_global_shutdown_reason();
|
||||
void set_global_shutdown_reason(char *reason);
|
||||
|
||||
char *get_global_reconnect_reason();
|
||||
void set_global_reconnect_reason(char *reason);
|
||||
|
||||
bool get_global_reconnect_status();
|
||||
void set_global_reconnect_status(bool status);
|
||||
|
||||
int get_cloud_disconnect_time();
|
||||
void set_cloud_disconnect_time(int disconnTime);
|
||||
|
||||
/**
|
||||
* @brief Interface to self heal connection in progress getting stuck
|
||||
*/
|
||||
void start_conn_in_progress (unsigned long start_time);
|
||||
void stop_conn_in_progress (void);
|
||||
|
||||
// To Register parodusOnConnStatusChangeHandler Callback function
|
||||
void registerParodusOnConnStatusChangeHandler(parodusOnConnStatusChangeHandler on_conn_status_change);
|
||||
|
||||
// To Register parodusOnPingStatusChangeHandler Callback function
|
||||
void registerParodusOnPingStatusChangeHandler(parodusOnPingStatusChangeHandler on_ping_status_change);
|
||||
|
||||
// To stop connection and wait duing interface down state
|
||||
int wait_while_interface_down (void);
|
||||
|
||||
void terminate_backoff_delay (void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
187
src/crud_interface.c
Normal file
187
src/crud_interface.c
Normal file
@@ -0,0 +1,187 @@
|
||||
/**
|
||||
* 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 */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
pthread_cond_t *get_global_crud_con(void)
|
||||
{
|
||||
return &crud_con;
|
||||
}
|
||||
|
||||
pthread_mutex_t *get_global_crud_mut(void)
|
||||
{
|
||||
return &crud_mut;
|
||||
}
|
||||
|
||||
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
|
||||
{
|
||||
if (g_shutdown) {
|
||||
pthread_mutex_unlock (&crud_mut);
|
||||
break;
|
||||
}
|
||||
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");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
57
src/crud_interface.h
Normal file
57
src/crud_interface.h
Normal file
@@ -0,0 +1,57 @@
|
||||
/**
|
||||
* 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_
|
||||
|
||||
#include <pthread.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Data Structures */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
typedef struct CrudMsg__
|
||||
{
|
||||
wrp_msg_t *msg;
|
||||
struct CrudMsg__ *next;
|
||||
} CrudMsg;
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Function Prototypes */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
void addCRUDresponseToUpstreamQ(void *response_bytes, ssize_t response_size);
|
||||
pthread_cond_t *get_global_crud_con(void);
|
||||
pthread_mutex_t *get_global_crud_mut(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#endif /* _CRUD_INTERFACE_H_ */
|
||||
|
||||
1650
src/crud_internal.c
Normal file
1650
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);
|
||||
241
src/downstream.c
241
src/downstream.c
@@ -26,7 +26,14 @@
|
||||
#include "connection.h"
|
||||
#include "partners_check.h"
|
||||
#include "ParodusInternal.h"
|
||||
|
||||
#include "crud_interface.h"
|
||||
#ifdef ENABLE_WEBCFGBIN
|
||||
#include "xmidtsend_rbus.h"
|
||||
#endif
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Function Prototypes */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
static void createNewMsgForCRUD(wrp_msg_t *message, wrp_msg_t **crudMessage );
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* External Functions */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
@@ -41,6 +48,7 @@ void listenerOnMessage(void * msg, size_t msgSize)
|
||||
{
|
||||
int rv =0;
|
||||
wrp_msg_t *message;
|
||||
wrp_msg_t *crudMessage= NULL;
|
||||
char* destVal = NULL;
|
||||
char dest[32] = {'\0'};
|
||||
int msgType;
|
||||
@@ -86,22 +94,42 @@ void listenerOnMessage(void * msg, size_t msgSize)
|
||||
{
|
||||
ParodusPrint("numOfClients registered is %d\n", get_numOfClients());
|
||||
int ret = validate_partner_id(message, NULL);
|
||||
ParodusPrint("validate_partner_id returns %d\n", ret);
|
||||
if(ret < 0)
|
||||
{
|
||||
response = cJSON_CreateObject();
|
||||
cJSON_AddNumberToObject(response, "statusCode", 430);
|
||||
cJSON_AddNumberToObject(response, "statusCode", 403);
|
||||
cJSON_AddStringToObject(response, "message", "Invalid partner_id");
|
||||
}
|
||||
|
||||
destVal = ((WRP_MSG_TYPE__EVENT == msgType) ? message->u.event.dest :
|
||||
((WRP_MSG_TYPE__REQ == msgType) ? message->u.req.dest : message->u.crud.dest));
|
||||
destVal = strdup(((WRP_MSG_TYPE__EVENT == msgType) ? message->u.event.dest :
|
||||
((WRP_MSG_TYPE__REQ == msgType) ? message->u.req.dest : message->u.crud.dest)));
|
||||
|
||||
if( (destVal != NULL) && (ret >= 0) )
|
||||
{
|
||||
strtok(destVal , "/");
|
||||
parStrncpy(dest,strtok(NULL , "/"), sizeof(dest));
|
||||
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)));
|
||||
((WRP_MSG_TYPE__EVENT == msgType) ? message->u.event.transaction_uuid : message->u.crud.transaction_uuid)));
|
||||
OnboardLog("%s\n",
|
||||
((WRP_MSG_TYPE__REQ == msgType) ? message->u.req.transaction_uuid :
|
||||
((WRP_MSG_TYPE__EVENT == msgType) ? message->u.event.transaction_uuid : message->u.crud.transaction_uuid)));
|
||||
|
||||
free(destVal);
|
||||
|
||||
temp = get_global_node();
|
||||
//Checking for individual clients & Sending to each client
|
||||
|
||||
@@ -121,15 +149,38 @@ void listenerOnMessage(void * msg, size_t msgSize)
|
||||
ParodusPrint("checking the next item in the list\n");
|
||||
temp= temp->next;
|
||||
}
|
||||
release_global_node ();
|
||||
|
||||
//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");
|
||||
}
|
||||
/* 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
|
||||
{
|
||||
createNewMsgForCRUD(message, &crudMessage);
|
||||
addCRUDmsgToQueue(crudMessage);
|
||||
}
|
||||
destFlag =1;
|
||||
}
|
||||
//if any unknown dest received sending error response to server
|
||||
if (WRP_MSG_TYPE__EVENT != msgType)
|
||||
{
|
||||
if(destFlag ==0)
|
||||
{
|
||||
ParodusError("Unknown dest:%s\n", dest);
|
||||
response = cJSON_CreateObject();
|
||||
cJSON_AddNumberToObject(response, "statusCode", 531);
|
||||
cJSON_AddStringToObject(response, "message", "Service Unavailable");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if( (WRP_MSG_TYPE__EVENT != msgType) &&
|
||||
@@ -147,8 +198,15 @@ void listenerOnMessage(void * msg, size_t msgSize)
|
||||
}
|
||||
else
|
||||
{
|
||||
resp_msg ->u.crud.source = message->u.crud.dest;
|
||||
resp_msg ->u.crud.dest = message->u.crud.source;
|
||||
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;
|
||||
}
|
||||
@@ -182,9 +240,38 @@ void listenerOnMessage(void * msg, size_t msgSize)
|
||||
resp_bytes = NULL;
|
||||
}
|
||||
free(resp_msg);
|
||||
ParodusPrint("free for downstream decoded msg\n");
|
||||
wrp_free_struct(message);
|
||||
}
|
||||
#ifdef ENABLE_WEBCFGBIN
|
||||
//To handle cloud ack events received from server for the xmidt sent messages.
|
||||
if((WRP_MSG_TYPE__EVENT == msgType) && (ret >= 0))
|
||||
{
|
||||
if(get_parodus_cfg()->max_queue_size > 0)
|
||||
{
|
||||
//Process cloud ack only when qos > 24
|
||||
if(highQosValueCheck(message->u.event.qos))
|
||||
{
|
||||
if(message->u.event.transaction_uuid !=NULL)
|
||||
{
|
||||
ParodusInfo("Received cloud ack from server: transaction_uuid %s qos %d, rdr %d source %s\n", message->u.event.transaction_uuid, message->u.event.qos, message->u.event.rdr, message->u.event.source);
|
||||
addToCloudAckQ(message->u.event.transaction_uuid, message->u.event.qos, message->u.event.rdr, message->u.event.source);
|
||||
ParodusPrint("Added to cloud ack Q\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusError("cloud ack transaction id is NULL\n");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusInfo("cloud ack received with low qos %d, ignoring it\n", message->u.event.qos);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusInfo("cloud ack is ignored as max queue size is %d\n", get_parodus_cfg()->max_queue_size );
|
||||
}
|
||||
}
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -194,6 +281,9 @@ void listenerOnMessage(void * msg, size_t msgSize)
|
||||
default:
|
||||
break;
|
||||
}
|
||||
ParodusPrint("free for downstream decoded msg\n");
|
||||
wrp_free_struct(message);
|
||||
message = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -201,3 +291,116 @@ void listenerOnMessage(void * msg, size_t msgSize)
|
||||
}
|
||||
}
|
||||
}
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Internal Functions */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/**
|
||||
* @brief createNewMsgForCRUD function to create new message for processing CRUD requests
|
||||
*
|
||||
* @param[in] message The message received from server
|
||||
* @param[out] crudMessage New message for processing CRUD requests
|
||||
*/
|
||||
static void createNewMsgForCRUD(wrp_msg_t *message, wrp_msg_t **crudMessage )
|
||||
{
|
||||
wrp_msg_t *msg;
|
||||
msg = ( wrp_msg_t * ) malloc( sizeof( wrp_msg_t ) );
|
||||
size_t i;
|
||||
if(msg != NULL)
|
||||
{
|
||||
memset( msg, 0, sizeof( wrp_msg_t ) );
|
||||
msg->msg_type = message->msg_type;
|
||||
if(message->u.crud.source != NULL)
|
||||
{
|
||||
ParodusPrint("message->u.crud.source = %s\n",message->u.crud.source);
|
||||
msg->u.crud.source = strdup(message->u.crud.source);
|
||||
}
|
||||
|
||||
if(message->u.crud.dest!= NULL)
|
||||
{
|
||||
ParodusPrint("message->u.crud.dest = %s\n",message->u.crud.dest);
|
||||
msg->u.crud.dest = strdup(message->u.crud.dest);
|
||||
}
|
||||
|
||||
if(message->u.crud.transaction_uuid != NULL)
|
||||
{
|
||||
ParodusPrint("message->u.crud.transaction_uuid = %s\n",message->u.crud.transaction_uuid);
|
||||
msg->u.crud.transaction_uuid = strdup(message->u.crud.transaction_uuid);
|
||||
}
|
||||
|
||||
if(message->u.crud.partner_ids!= NULL && message->u.crud.partner_ids->count >0)
|
||||
{
|
||||
msg->u.crud.partner_ids = ( partners_t * ) malloc( sizeof( partners_t ) +
|
||||
sizeof( char * ) * message->u.crud.partner_ids->count );
|
||||
if(msg->u.crud.partner_ids != NULL)
|
||||
{
|
||||
msg->u.crud.partner_ids->count = message->u.crud.partner_ids->count;
|
||||
for(i = 0; i<message->u.crud.partner_ids->count; i++)
|
||||
{
|
||||
ParodusPrint("message->u.crud.partner_ids->partner_ids[%d] = %s\n",i,message->u.crud.partner_ids->partner_ids[i]);
|
||||
msg->u.crud.partner_ids->partner_ids[i] = strdup(message->u.crud.partner_ids->partner_ids[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(message->u.crud.headers!= NULL && message->u.crud.headers->count >0)
|
||||
{
|
||||
msg->u.crud.headers = ( headers_t * ) malloc( sizeof( headers_t ) +
|
||||
sizeof( char * ) * message->u.crud.headers->count );
|
||||
if(msg->u.crud.headers != NULL)
|
||||
{
|
||||
msg->u.crud.headers->count = message->u.crud.headers->count;
|
||||
for(i = 0; i<message->u.crud.headers->count; i++)
|
||||
{
|
||||
ParodusPrint("message->u.crud.headers->headers[%d] = %s\n",i,message->u.crud.headers->headers[i]);
|
||||
msg->u.crud.headers->headers[i] = strdup(message->u.crud.headers->headers[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(message->u.crud.metadata != NULL && message->u.crud.metadata->count > 0)
|
||||
{
|
||||
msg->u.crud.metadata = (data_t *) malloc( sizeof( data_t ) );
|
||||
if(msg->u.crud.metadata != NULL)
|
||||
{
|
||||
memset( msg->u.crud.metadata, 0, sizeof( data_t ) );
|
||||
msg->u.crud.metadata->count = message->u.crud.metadata->count;
|
||||
msg->u.crud.metadata->data_items = ( struct data* )malloc( sizeof( struct data ) * ( message->u.crud.metadata->count ) );
|
||||
for(i=0; i<message->u.crud.metadata->count; i++)
|
||||
{
|
||||
if(message->u.crud.metadata->data_items[i].name != NULL)
|
||||
{
|
||||
ParodusPrint("message->u.crud.metadata->data_items[%d].name : %s\n",i,message->u.crud.metadata->data_items[i].name);
|
||||
msg->u.crud.metadata->data_items[i].name = strdup(message->u.crud.metadata->data_items[i].name);
|
||||
}
|
||||
if(message->u.crud.metadata->data_items[i].value != NULL)
|
||||
{
|
||||
ParodusPrint("message->u.crud.metadata->data_items[%d].value : %s\n",i,message->u.crud.metadata->data_items[i].value);
|
||||
msg->u.crud.metadata->data_items[i].value = strdup(message->u.crud.metadata->data_items[i].value);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
msg->u.crud.include_spans = message->u.crud.include_spans;
|
||||
if(message->u.crud.content_type != NULL)
|
||||
{
|
||||
ParodusPrint("message->u.crud.content_type : %s\n",message->u.crud.content_type);
|
||||
msg->u.crud.content_type = strdup(message->u.crud.content_type);
|
||||
}
|
||||
msg->u.crud.spans.spans = NULL; /* not supported */
|
||||
msg->u.crud.spans.count = 0; /* not supported */
|
||||
msg->u.crud.status = message->u.crud.status;
|
||||
msg->u.crud.rdr = message->u.crud.rdr;
|
||||
if(message->u.crud.payload != NULL)
|
||||
{
|
||||
ParodusPrint("message->u.crud.payload = %s\n", (char *)message->u.crud.payload);
|
||||
msg->u.crud.payload = strdup((char *)message->u.crud.payload);
|
||||
}
|
||||
msg->u.crud.payload_size = message->u.crud.payload_size;
|
||||
if(message->u.crud.path != NULL)
|
||||
{
|
||||
ParodusPrint("message->u.crud.path = %s\n", message->u.crud.path);
|
||||
msg->u.crud.path = strdup(message->u.crud.path);
|
||||
}
|
||||
*crudMessage = msg;
|
||||
}
|
||||
}
|
||||
|
||||
26
src/event_handler.c
Normal file
26
src/event_handler.c
Normal file
@@ -0,0 +1,26 @@
|
||||
/*
|
||||
* If not stated otherwise in this file or this component's Licenses.txt file the
|
||||
* following copyright and licenses apply:
|
||||
*
|
||||
* Copyright 2016 RDK Management
|
||||
* Copyright [2014] [Cisco Systems, Inc.]
|
||||
* 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 is a stub file that will be overridden in a patch */
|
||||
|
||||
#include "event_handler.h"
|
||||
|
||||
void EventHandler()
|
||||
{
|
||||
}
|
||||
21
src/event_handler.h
Normal file
21
src/event_handler.h
Normal file
@@ -0,0 +1,21 @@
|
||||
/*
|
||||
* If not stated otherwise in this file or this component's Licenses.txt file the
|
||||
* following copyright and licenses apply:
|
||||
*
|
||||
* Copyright 2016 RDK Management
|
||||
* Copyright [2014] [Cisco Systems, Inc.]
|
||||
* 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.
|
||||
*/
|
||||
|
||||
void EventHandler();
|
||||
#define LOGGING_INTERVAL_SECS ( 60 * 60 )
|
||||
97
src/heartBeat.c
Normal file
97
src/heartBeat.c
Normal file
@@ -0,0 +1,97 @@
|
||||
/**
|
||||
* 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"
|
||||
#include "time.h"
|
||||
#include <stdbool.h>
|
||||
|
||||
volatile unsigned int heartBeatTimer = 0;
|
||||
volatile bool paused = false;
|
||||
volatile long long pingTimeStamp = 0;
|
||||
|
||||
pthread_mutex_t heartBeat_mut=PTHREAD_MUTEX_INITIALIZER;
|
||||
pthread_mutex_t ping_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);
|
||||
if (!paused)
|
||||
heartBeatTimer += inc_time_ms;
|
||||
pthread_mutex_unlock (&heartBeat_mut);
|
||||
}
|
||||
|
||||
// Pause heartBeatTimer, i.e. stop incrementing
|
||||
void pause_heartBeatTimer()
|
||||
{
|
||||
pthread_mutex_lock (&heartBeat_mut);
|
||||
heartBeatTimer = 0;
|
||||
paused = true;
|
||||
pthread_mutex_unlock (&heartBeat_mut);
|
||||
}
|
||||
|
||||
// Resume heartBeatTimer, i.e. resume incrementing
|
||||
void resume_heartBeatTimer()
|
||||
{
|
||||
pthread_mutex_lock (&heartBeat_mut);
|
||||
paused = false;
|
||||
pthread_mutex_unlock (&heartBeat_mut);
|
||||
}
|
||||
|
||||
// Set ping received timeStamp
|
||||
void set_pingTimeStamp()
|
||||
{
|
||||
struct timespec ts;
|
||||
getCurrentTime(&ts);
|
||||
pthread_mutex_lock (&ping_mut);
|
||||
pingTimeStamp = (long long)ts.tv_sec;
|
||||
pthread_mutex_unlock (&ping_mut);
|
||||
}
|
||||
|
||||
// Get ping received timeStamp
|
||||
long long get_pingTimeStamp()
|
||||
{
|
||||
long long tmp = 0;
|
||||
pthread_mutex_lock (&ping_mut);
|
||||
tmp = pingTimeStamp;
|
||||
pthread_mutex_unlock (&ping_mut);
|
||||
return tmp;
|
||||
}
|
||||
56
src/heartBeat.h
Normal file
56
src/heartBeat.h
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.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);
|
||||
|
||||
// Pause heartBeatTimer, i.e. stop incrementing
|
||||
void pause_heartBeatTimer();
|
||||
|
||||
// Resume heartBeatTimer, i.e. resume incrementing
|
||||
void resume_heartBeatTimer();
|
||||
|
||||
void set_pingTimeStamp();
|
||||
|
||||
long long get_pingTimeStamp();
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
82
src/main.c
82
src/main.c
@@ -18,13 +18,16 @@
|
||||
#include <string.h>
|
||||
#include "stdlib.h"
|
||||
#include "config.h"
|
||||
#include "auth_token.h"
|
||||
#include "connection.h"
|
||||
#include "conn_interface.h"
|
||||
#include "parodus_log.h"
|
||||
#include <curl/curl.h>
|
||||
#ifdef INCLUDE_BREAKPAD
|
||||
#include "breakpad_wrapper.h"
|
||||
#else
|
||||
#include "signal.h"
|
||||
#endif
|
||||
#include "signal.h"
|
||||
#include "privilege.h"
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Macros */
|
||||
@@ -34,51 +37,86 @@
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Data Structures */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* none */
|
||||
typedef void Sigfunc(int);
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* File Scoped Variables */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* none */
|
||||
int numLoops;
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Function Prototypes */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
#ifndef INCLUDE_BREAKPAD
|
||||
static void sig_handler(int sig);
|
||||
|
||||
Sigfunc *
|
||||
signal (int signo, Sigfunc *func)
|
||||
{
|
||||
struct sigaction act, oact;
|
||||
|
||||
act.sa_handler = func;
|
||||
sigemptyset (&act.sa_mask);
|
||||
act.sa_flags = 0;
|
||||
if (signo == SIGALRM) {
|
||||
#ifdef SA_INTERRUPT
|
||||
act.sa_flags |= SA_INTERRUPT; /* SunOS 4.x */
|
||||
#endif
|
||||
} else {
|
||||
#ifdef SA_RESTART
|
||||
act.sa_flags |= SA_RESTART; /* SVR4, 4.4BSD */
|
||||
#endif
|
||||
}
|
||||
if (sigaction (signo, &act, &oact) < 0) {
|
||||
ParodusError ("Signal Handler for signal %d not installed!\n", signo);
|
||||
return (SIG_ERR);
|
||||
}
|
||||
return (oact.sa_handler);
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* External Functions */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
int main( int argc, char **argv)
|
||||
{
|
||||
#ifdef INCLUDE_BREAKPAD
|
||||
breakpad_ExceptionHandler();
|
||||
#else
|
||||
set_global_shutdown_reason (SHUTDOWN_REASON_PARODUS_STOP);
|
||||
signal(SIGTERM, sig_handler);
|
||||
signal(SIGINT, sig_handler);
|
||||
signal(SIGINT, sig_handler);
|
||||
signal(SIGUSR1, sig_handler);
|
||||
signal(SIGUSR2, sig_handler);
|
||||
signal(SIGQUIT, sig_handler);
|
||||
signal(SIGHUP, sig_handler);
|
||||
signal(SIGALRM, sig_handler);
|
||||
#ifdef INCLUDE_BREAKPAD
|
||||
/* breakpad handles the signals SIGSEGV, SIGBUS, SIGFPE, and SIGILL */
|
||||
breakpad_ExceptionHandler();
|
||||
#else
|
||||
signal(SIGSEGV, sig_handler);
|
||||
signal(SIGBUS, sig_handler);
|
||||
signal(SIGKILL, sig_handler);
|
||||
signal(SIGFPE, sig_handler);
|
||||
signal(SIGILL, sig_handler);
|
||||
signal(SIGQUIT, sig_handler);
|
||||
signal(SIGHUP, sig_handler);
|
||||
signal(SIGALRM, sig_handler);
|
||||
#endif
|
||||
ParodusCfg *cfg;
|
||||
|
||||
ParodusInfo ("RAND_MAX is %ld (0x%lx)\n", RAND_MAX, RAND_MAX);
|
||||
srandom (getpid());
|
||||
|
||||
/* 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,cfg);
|
||||
drop_root_privilege();
|
||||
#ifdef ENABLE_WEBCFGBIN
|
||||
subscribeRBUSevent();
|
||||
regXmidtSendDataMethod();
|
||||
#endif
|
||||
setDefaultValuesToCfg(cfg);
|
||||
if (0 != parseCommandLine(argc,argv,cfg)) {
|
||||
abort();
|
||||
}
|
||||
curl_global_init(CURL_GLOBAL_DEFAULT);
|
||||
|
||||
createSocketConnection(cfg,NULL);
|
||||
createSocketConnection( NULL);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -91,7 +129,6 @@ const char *rdk_logger_module_fetch(void)
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Internal functions */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
#ifndef INCLUDE_BREAKPAD
|
||||
static void sig_handler(int sig)
|
||||
{
|
||||
|
||||
@@ -99,17 +136,25 @@ static void sig_handler(int sig)
|
||||
{
|
||||
signal(SIGINT, sig_handler); /* reset it to this function */
|
||||
ParodusInfo("SIGINT received!\n");
|
||||
exit(0);
|
||||
shutdownSocketConnection(SHUTDOWN_REASON_PARODUS_STOP);
|
||||
}
|
||||
else if ( sig == SIGUSR1 )
|
||||
{
|
||||
signal(SIGUSR1, sig_handler); /* reset it to this function */
|
||||
ParodusInfo("SIGUSR1 received!\n");
|
||||
shutdownSocketConnection(SHUTDOWN_REASON_SYSTEM_RESTART);
|
||||
}
|
||||
else if ( sig == SIGUSR2 )
|
||||
{
|
||||
signal(SIGUSR2, sig_handler); /* reset it to this function */
|
||||
ParodusInfo("SIGUSR2 received!\n");
|
||||
}
|
||||
else if ( sig == SIGTERM )
|
||||
{
|
||||
signal(SIGTERM, sig_handler); /* reset it to this function */
|
||||
ParodusInfo("SIGTERM received!\n");
|
||||
shutdownSocketConnection(SHUTDOWN_REASON_SIGTERM);
|
||||
}
|
||||
else if ( sig == SIGCHLD )
|
||||
{
|
||||
signal(SIGCHLD, sig_handler); /* reset it to this function */
|
||||
@@ -128,8 +173,7 @@ static void sig_handler(int sig)
|
||||
else
|
||||
{
|
||||
ParodusInfo("Signal %d received!\n", sig);
|
||||
exit(0);
|
||||
shutdownSocketConnection(SHUTDOWN_REASON_PARODUS_STOP);
|
||||
}
|
||||
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -70,6 +70,7 @@ int checkHostIp(char * serverIP)
|
||||
if (retVal != 0)
|
||||
{
|
||||
ParodusError("getaddrinfo: %s\n", gai_strerror(retVal));
|
||||
OnboardLog("getaddrinfo: %s\n", gai_strerror(retVal));
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -24,6 +24,8 @@
|
||||
#include "ParodusInternal.h"
|
||||
#include "nopoll_handlers.h"
|
||||
#include "connection.h"
|
||||
#include "heartBeat.h"
|
||||
#include "close_retry.h"
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Macros */
|
||||
@@ -36,6 +38,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 */
|
||||
@@ -54,18 +57,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");
|
||||
@@ -94,6 +122,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");
|
||||
}
|
||||
|
||||
@@ -109,6 +138,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);
|
||||
@@ -118,9 +148,8 @@ 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();
|
||||
set_pingTimeStamp();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -129,24 +158,35 @@ 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);
|
||||
OnboardLog("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");
|
||||
OnboardLog("Reconnect detected, setting Reconnect reason as Unknown\n");
|
||||
set_global_reconnect_reason("Unknown");
|
||||
}
|
||||
|
||||
if(!get_interface_down_event())
|
||||
{
|
||||
ParodusInfo("Setting the close and retry connection\n");
|
||||
set_close_retry();
|
||||
}
|
||||
else
|
||||
ParodusInfo("Not Setting the close and retry connection as interface is down\n");
|
||||
|
||||
pthread_mutex_lock (&close_mut);
|
||||
close_retry = true;
|
||||
pthread_mutex_unlock (&close_mut);
|
||||
ParodusPrint("listenerOnCloseMessage(): mutex unlock in producer thread\n");
|
||||
}
|
||||
|
||||
|
||||
@@ -36,9 +36,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;
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Function Prototypes */
|
||||
|
||||
@@ -25,6 +25,8 @@
|
||||
#include "connection.h"
|
||||
#include "nopoll_helpers.h"
|
||||
#include "nopoll_handlers.h"
|
||||
#include "time.h"
|
||||
#include "config.h"
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Macros */
|
||||
@@ -33,6 +35,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 */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
@@ -44,27 +50,36 @@ void setMessageHandlers()
|
||||
nopoll_conn_set_on_close(get_global_conn(), (noPollOnCloseHandler)listenerOnCloseMessage, NULL);
|
||||
}
|
||||
|
||||
int cloud_status_is_online (void)
|
||||
{
|
||||
const char *status = get_cloud_status();
|
||||
if (NULL == status)
|
||||
return false;
|
||||
return (strcmp (status, CLOUD_STATUS_ONLINE) == 0);
|
||||
}
|
||||
|
||||
/** To send upstream msgs to server ***/
|
||||
|
||||
void sendMessage(noPollConn *conn, void *msg, size_t len)
|
||||
int sendMessage(noPollConn *conn, void *msg, size_t len)
|
||||
{
|
||||
int bytesWritten = 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);
|
||||
bytesWritten = sendResponse(conn, msg, len);
|
||||
ParodusPrint("Number of bytes written: %d\n", bytesWritten);
|
||||
if (bytesWritten != (int) len)
|
||||
{
|
||||
ParodusError("Failed to send bytes %zu, bytes written were=%d (errno=%d, %s)..\n", len, bytesWritten, errno, strerror(errno));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!cloud_status_is_online ()) {
|
||||
ParodusError("Failed to send msg upstream as connection is not OK\n");
|
||||
OnboardLog("Failed to send msg upstream as connection is not OK\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
ParodusInfo("sendMessage length %zu\n", len);
|
||||
|
||||
bytesWritten = sendResponse(conn, msg, len);
|
||||
ParodusPrint("Number of bytes written: %d\n", bytesWritten);
|
||||
if (bytesWritten != (int) len)
|
||||
{
|
||||
ParodusError("Failed to send bytes %zu, bytes written were=%d (errno=%d, %s)..\n", len, bytesWritten, errno, strerror(errno));
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int sendResponse(noPollConn * conn, void * buffer, size_t length)
|
||||
@@ -121,6 +136,7 @@ void __report_log (noPollCtx * ctx, noPollDebugLevel level, const char * log_msg
|
||||
if (level == NOPOLL_LEVEL_CRITICAL)
|
||||
{
|
||||
ParodusError("%s\n", log_msg );
|
||||
OnboardLog("%s\n", log_msg );
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -41,7 +41,7 @@ extern "C" {
|
||||
*/
|
||||
int sendResponse(noPollConn * conn,void *str, size_t bufferSize);
|
||||
void setMessageHandlers();
|
||||
void sendMessage(noPollConn *conn, void *msg, size_t len);
|
||||
int sendMessage(noPollConn *conn, void *msg, size_t len);
|
||||
|
||||
/**
|
||||
* @brief __report_log Nopoll log handler
|
||||
|
||||
@@ -33,3 +33,9 @@
|
||||
#define ParodusError(...) cimplog_error(LOGGING_MODULE, __VA_ARGS__)
|
||||
#define ParodusInfo(...) cimplog_info(LOGGING_MODULE, __VA_ARGS__)
|
||||
#define ParodusPrint(...) cimplog_debug(LOGGING_MODULE, __VA_ARGS__)
|
||||
#ifdef FEATURE_SUPPORT_ONBOARD_LOGGING
|
||||
#define OnboardLog(...) onboarding_log(LOGGING_MODULE, __VA_ARGS__)
|
||||
#else
|
||||
#define OnboardLog(...)
|
||||
#endif
|
||||
|
||||
|
||||
@@ -39,85 +39,201 @@
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* External functions */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
static void parse_partner_id(char *partnerId, partners_t **partnersList)
|
||||
{
|
||||
char *token;
|
||||
int i = 0, j = 0, count = 0;
|
||||
ParodusPrint("********* %s ********\n",__FUNCTION__);
|
||||
while(partnerId[i] != '\0')
|
||||
{
|
||||
if(partnerId[i] == ',')
|
||||
{
|
||||
count++;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
ParodusPrint("count = %d\n", count+1);
|
||||
*partnersList = (partners_t *)malloc(sizeof(partners_t)+ sizeof( char * ) * (count+1));
|
||||
memset(*partnersList, 0, sizeof(partners_t));
|
||||
(*partnersList)->count = count+1;
|
||||
while ((token = strsep(&partnerId, ",")) != NULL)
|
||||
{
|
||||
ParodusPrint("token=%s\n", token);
|
||||
(*partnersList)->partner_ids[j] = strdup(token);
|
||||
ParodusPrint("(*partnersList)->partner_ids[%d] = %s\n",j,(*partnersList)->partner_ids[j]);
|
||||
j++;
|
||||
}
|
||||
}
|
||||
|
||||
int validate_partner_id(wrp_msg_t *msg, partners_t **partnerIds)
|
||||
{
|
||||
int matchFlag = 0, i = 0, count = 0;
|
||||
size_t j = 0;
|
||||
partners_t *partnersList = NULL;
|
||||
char *partnerId = NULL;
|
||||
ParodusPrint("********* %s ********\n",__FUNCTION__);
|
||||
char *partnerId = get_parodus_cfg()->partner_id;
|
||||
if(strlen(partnerId) <= 0)
|
||||
char *temp = get_parodus_cfg()->partner_id;
|
||||
ParodusPrint("temp = %s\n",temp);
|
||||
if(temp[0] != '\0' && strlen(temp) > 0)
|
||||
{
|
||||
partnerId = strdup(temp);
|
||||
}
|
||||
ParodusPrint("partnerId = %s\n",partnerId);
|
||||
if(partnerId != NULL)
|
||||
{
|
||||
parse_partner_id(partnerId, &partnersList);
|
||||
ParodusPrint("partnersList->count = %lu\n", partnersList->count);
|
||||
if(msg->msg_type == WRP_MSG_TYPE__EVENT)
|
||||
{
|
||||
if(msg->u.event.partner_ids != NULL)
|
||||
{
|
||||
count = (int) msg->u.event.partner_ids->count;
|
||||
ParodusPrint("partner_ids count is %d\n",count);
|
||||
for(i = 0; i < count; i++)
|
||||
{
|
||||
for(j = 0; j<partnersList->count; j++)
|
||||
{
|
||||
if(NULL != partnersList->partner_ids[j]) {
|
||||
ParodusPrint("partnersList->partner_ids[%lu] = %s\n",j, partnersList->partner_ids[j]);
|
||||
ParodusPrint("msg->u.event.partner_ids->partner_ids[%lu] = %s\n",i, msg->u.event.partner_ids->partner_ids[i]);
|
||||
if(strcasecmp(partnersList->partner_ids[j], msg->u.event.partner_ids->partner_ids[i]) == 0)
|
||||
{
|
||||
ParodusInfo("partner_id match found\n");
|
||||
matchFlag = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
ParodusError("partner Id in partnersList is NULL but count is not 0");
|
||||
}
|
||||
/* Commandline input partner_ids matched with partner_ids from request */
|
||||
if(matchFlag == 1)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* Commandline input partner_ids not matching with partner_ids from request, appending to request partner_ids*/
|
||||
if(matchFlag != 1 && partnerIds !=NULL)
|
||||
{
|
||||
(*partnerIds) = (partners_t *) malloc(sizeof(partners_t) + (sizeof(char *) * (count+partnersList->count)));
|
||||
(*partnerIds)->count = count+partnersList->count;
|
||||
for(i = 0; i < count; i++)
|
||||
{
|
||||
(*partnerIds)->partner_ids[i] = msg->u.event.partner_ids->partner_ids[i];
|
||||
ParodusPrint("(*partnerIds)->partner_ids[%d] : %s\n",i,(*partnerIds)->partner_ids[i]);
|
||||
}
|
||||
i = 0;
|
||||
for(j = count; j<(count+partnersList->count); j++)
|
||||
{
|
||||
(*partnerIds)->partner_ids[j] = (char *) malloc(sizeof(char) * 64);
|
||||
parStrncpy((*partnerIds)->partner_ids[j], partnersList->partner_ids[i], 64);
|
||||
ParodusPrint("(*partnerIds)->partner_ids[%lu] : %s\n",j,(*partnerIds)->partner_ids[j]);
|
||||
i++;
|
||||
}
|
||||
}
|
||||
else if (matchFlag != 1 && partnerIds == NULL)
|
||||
{
|
||||
ParodusError("partner_id match not found: command line input %s , msg partner_id %s\n", temp, msg->u.event.partner_ids->partner_ids[0]);
|
||||
if(partnersList != NULL)
|
||||
{
|
||||
for(j=0; j<partnersList->count; j++)
|
||||
{
|
||||
if(NULL != partnersList->partner_ids[j])
|
||||
{
|
||||
free(partnersList->partner_ids[j]);
|
||||
}
|
||||
}
|
||||
free(partnersList);
|
||||
}
|
||||
free(partnerId);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusPrint("partner_ids list is NULL\n");
|
||||
(*partnerIds) = (partners_t *) malloc(sizeof(partners_t) + (sizeof(char *) * partnersList->count));
|
||||
(*partnerIds)->count = partnersList->count;
|
||||
i=0;
|
||||
for(j = 0; j<partnersList->count; j++)
|
||||
{
|
||||
(*partnerIds)->partner_ids[j] = (char *) malloc(sizeof(char) * 64);
|
||||
parStrncpy((*partnerIds)->partner_ids[j], partnersList->partner_ids[i], 64);
|
||||
ParodusPrint("(*partnerIds)->partner_ids[%lu] : %s\n",j,(*partnerIds)->partner_ids[j]);
|
||||
i++;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if(msg->msg_type == WRP_MSG_TYPE__REQ)
|
||||
{
|
||||
if(msg->u.req.partner_ids != NULL)
|
||||
{
|
||||
count = (int) msg->u.req.partner_ids->count;
|
||||
ParodusPrint("partner_ids count is %d\n",count);
|
||||
for(i = 0; i < count; i++)
|
||||
{
|
||||
for(j = 0; j<partnersList->count; j++)
|
||||
{
|
||||
if(NULL != partnersList->partner_ids[j])
|
||||
{
|
||||
ParodusPrint("partnersList->partner_ids[%lu] = %s\n",j, partnersList->partner_ids[j]);
|
||||
ParodusPrint("msg->u.req.partner_ids->partner_ids[%lu] = %s\n",i, msg->u.req.partner_ids->partner_ids[i]);
|
||||
if(strcasecmp(partnersList->partner_ids[j], msg->u.req.partner_ids->partner_ids[i]) == 0)
|
||||
{
|
||||
ParodusInfo("partner_id match found\n");
|
||||
matchFlag = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
ParodusError("partner Id in partnersList is NULL but count is not 0");
|
||||
}
|
||||
}
|
||||
|
||||
/* Commandline input partner_ids not matching with partner_ids from request, ignoring request*/
|
||||
if(matchFlag != 1)
|
||||
{
|
||||
ParodusError("Invalid partner_id %s\n",temp);
|
||||
OnboardLog("Invalid partner_id %s\n",temp);
|
||||
if(partnersList != NULL)
|
||||
{
|
||||
for(j=0; j<partnersList->count; j++)
|
||||
{
|
||||
if(NULL != partnersList->partner_ids[j])
|
||||
{
|
||||
free(partnersList->partner_ids[j]);
|
||||
}
|
||||
}
|
||||
free(partnersList);
|
||||
}
|
||||
free(partnerId);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusPrint("partner_ids list is NULL\n");
|
||||
}
|
||||
}
|
||||
if(partnersList != NULL)
|
||||
{
|
||||
for(j=0; j<partnersList->count; j++)
|
||||
{
|
||||
if(NULL != partnersList->partner_ids[j])
|
||||
{
|
||||
free(partnersList->partner_ids[j]);
|
||||
}
|
||||
}
|
||||
free(partnersList);
|
||||
}
|
||||
free(partnerId);
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusPrint("partner_id is not available to validate\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if(msg->msg_type == WRP_MSG_TYPE__EVENT)
|
||||
{
|
||||
if(msg->u.event.partner_ids != NULL)
|
||||
{
|
||||
count = (int) msg->u.event.partner_ids->count;
|
||||
ParodusPrint("partner_ids count is %d\n",count);
|
||||
for(i = 0; i < count; i++)
|
||||
{
|
||||
if(strcmp(partnerId, msg->u.event.partner_ids->partner_ids[i]) == 0)
|
||||
{
|
||||
ParodusInfo("partner_id match found\n");
|
||||
matchFlag = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if(matchFlag != 1)
|
||||
{
|
||||
(*partnerIds) = (partners_t *) malloc(sizeof(partners_t));
|
||||
(*partnerIds)->count = count+1;
|
||||
for(i = 0; i < count; i++)
|
||||
{
|
||||
(*partnerIds)->partner_ids[i] = msg->u.event.partner_ids->partner_ids[i];
|
||||
ParodusPrint("(*partnerIds)->partner_ids[%d] : %s\n",i,(*partnerIds)->partner_ids[i]);
|
||||
}
|
||||
(*partnerIds)->partner_ids[count] = (char *) malloc(sizeof(char) * 64);
|
||||
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)->count = 1;
|
||||
(*partnerIds)->partner_ids[0] = (char *) malloc(sizeof(char) * 64);
|
||||
parStrncpy((*partnerIds)->partner_ids[0], partnerId, 64);
|
||||
ParodusPrint("(*partnerIds)->partner_ids[0] : %s\n",(*partnerIds)->partner_ids[0]);
|
||||
}
|
||||
}
|
||||
else if(msg->msg_type == WRP_MSG_TYPE__REQ)
|
||||
{
|
||||
if(msg->u.req.partner_ids != NULL)
|
||||
{
|
||||
count = (int) msg->u.req.partner_ids->count;
|
||||
ParodusPrint("partner_ids count is %d\n",count);
|
||||
for(i = 0; i < count; i++)
|
||||
{
|
||||
if(strcmp(partnerId, msg->u.req.partner_ids->partner_ids[i]) == 0)
|
||||
{
|
||||
ParodusInfo("partner_id match found\n");
|
||||
matchFlag = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if(matchFlag != 1)
|
||||
{
|
||||
ParodusError("Invalid partner_id %s\n",partnerId);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusPrint("partner_ids list is NULL\n");
|
||||
}
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
6
src/privilege.c
Normal file
6
src/privilege.c
Normal file
@@ -0,0 +1,6 @@
|
||||
#include "privilege.h"
|
||||
|
||||
void drop_root_privilege()
|
||||
{
|
||||
|
||||
}
|
||||
2
src/privilege.h
Normal file
2
src/privilege.h
Normal file
@@ -0,0 +1,2 @@
|
||||
/* This is a stub function that will be overridden in a patch */
|
||||
void drop_root_privilege();
|
||||
@@ -31,9 +31,41 @@
|
||||
/*----------------------------------------------------------------------------*/
|
||||
#define KEEPALIVE_INTERVAL_SEC 30
|
||||
|
||||
pthread_mutex_t svc_mut=PTHREAD_MUTEX_INITIALIZER;
|
||||
pthread_cond_t svc_con=PTHREAD_COND_INITIALIZER;
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Utiliy Functions */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
static int wait__ (unsigned int secs)
|
||||
{
|
||||
int shutdown_flag;
|
||||
struct timespec svc_alive_timer;
|
||||
|
||||
clock_gettime(CLOCK_REALTIME, &svc_alive_timer);
|
||||
svc_alive_timer.tv_sec += secs;
|
||||
pthread_mutex_lock(&svc_mut);
|
||||
pthread_cond_timedwait (&svc_con, &svc_mut, &svc_alive_timer);
|
||||
shutdown_flag = g_shutdown;
|
||||
pthread_mutex_unlock (&svc_mut);
|
||||
return shutdown_flag;
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* External Functions */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
pthread_cond_t *get_global_svc_con(void)
|
||||
{
|
||||
return &svc_con;
|
||||
}
|
||||
|
||||
pthread_mutex_t *get_global_svc_mut(void)
|
||||
{
|
||||
return &svc_mut;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @brief To handle registered services to indicate that the service is still alive.
|
||||
*/
|
||||
@@ -58,10 +90,10 @@ void *serviceAliveTask()
|
||||
while(1)
|
||||
{
|
||||
ParodusPrint("serviceAliveTask: numOfClients registered is %d\n", get_numOfClients());
|
||||
temp = get_global_node();
|
||||
if(get_numOfClients() > 0)
|
||||
{
|
||||
//sending svc msg to all the clients every 30s
|
||||
temp = get_global_node();
|
||||
size = (size_t) nbytes;
|
||||
while(NULL != temp)
|
||||
{
|
||||
@@ -82,8 +114,9 @@ void *serviceAliveTask()
|
||||
byte = 0;
|
||||
if(ret == 0)
|
||||
{
|
||||
ParodusPrint("Deletion from list is success, doing resync with head\n");
|
||||
release_global_node ();
|
||||
temp= get_global_node();
|
||||
ParodusInfo("Deletion from list is success, doing resync with head\n");
|
||||
ret = -1;
|
||||
}
|
||||
else
|
||||
@@ -91,15 +124,20 @@ void *serviceAliveTask()
|
||||
temp= temp->next;
|
||||
}
|
||||
}
|
||||
release_global_node ();
|
||||
ParodusPrint("Waiting for 30s to send keep alive msg \n");
|
||||
sleep(KEEPALIVE_INTERVAL_SEC);
|
||||
if (wait__ (KEEPALIVE_INTERVAL_SEC))
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
release_global_node ();
|
||||
ParodusInfo("No clients are registered, waiting ..\n");
|
||||
sleep(50);
|
||||
if (wait__ (50))
|
||||
break;
|
||||
}
|
||||
}
|
||||
free (svc_bytes);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -24,6 +24,8 @@
|
||||
#ifndef _SERVICE_ALIVE_H_
|
||||
#define _SERVICE_ALIVE_H_
|
||||
|
||||
#include <pthread.h>
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Function Prototypes */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
@@ -33,7 +35,8 @@ extern "C" {
|
||||
#endif
|
||||
|
||||
void *serviceAliveTask();
|
||||
|
||||
pthread_cond_t *get_global_svc_con(void);
|
||||
pthread_mutex_t *get_global_svc_mut(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <pthread.h>
|
||||
|
||||
#include "spin_thread.h"
|
||||
#include "parodus_log.h"
|
||||
@@ -31,12 +30,12 @@
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* External Functions */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
void StartThread(void *(*start_routine) (void *))
|
||||
void StartThread(void *(*start_routine) (void *), pthread_t *threadId)
|
||||
{
|
||||
int err = 0;
|
||||
pthread_t threadId;
|
||||
pthread_t __threadId;
|
||||
|
||||
err = pthread_create(&threadId, NULL, start_routine, NULL);
|
||||
err = pthread_create(&__threadId, NULL, start_routine, NULL);
|
||||
if (err != 0)
|
||||
{
|
||||
ParodusError("Error creating thread :[%s]\n", strerror(err));
|
||||
@@ -44,8 +43,13 @@ void StartThread(void *(*start_routine) (void *))
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusPrint("Thread created Successfully %d\n", (int ) threadId);
|
||||
*threadId = __threadId;
|
||||
ParodusPrint("Thread created Successfully %lu\n", (unsigned long) __threadId);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void JoinThread (pthread_t threadId)
|
||||
{
|
||||
pthread_join (threadId, NULL);
|
||||
}
|
||||
|
||||
@@ -24,6 +24,8 @@
|
||||
#ifndef _SPIN_THREAD_H_
|
||||
#define _SPIN_THREAD_H_
|
||||
|
||||
#include <pthread.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
@@ -32,8 +34,8 @@ extern "C" {
|
||||
/* Function Prototypes */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
void StartThread(void *(*start_routine) (void *));
|
||||
|
||||
void StartThread(void *(*start_routine) (void *), pthread_t *threadId);
|
||||
void JoinThread (pthread_t threadId);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
@@ -43,6 +43,10 @@ void *messageHandlerTask()
|
||||
}
|
||||
else
|
||||
{
|
||||
if (g_shutdown) {
|
||||
pthread_mutex_unlock (&g_mutex);
|
||||
break;
|
||||
}
|
||||
ParodusPrint("Before pthread cond wait in consumer thread\n");
|
||||
pthread_cond_wait(&g_cond, &g_mutex);
|
||||
pthread_mutex_unlock (&g_mutex);
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
|
||||
#include "time.h"
|
||||
#include "parodus_log.h"
|
||||
#include <errno.h>
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* External Functions */
|
||||
@@ -24,7 +25,10 @@
|
||||
|
||||
void getCurrentTime(struct timespec *timer)
|
||||
{
|
||||
clock_gettime(CLOCK_REALTIME, timer);
|
||||
if( clock_gettime(CLOCK_REALTIME, timer) == -1 )
|
||||
{
|
||||
ParodusError("clock gettime returns errno %d\n", errno );
|
||||
}
|
||||
}
|
||||
|
||||
uint64_t getCurrentTimeInMicroSeconds(struct timespec *timer)
|
||||
@@ -34,7 +38,7 @@ uint64_t getCurrentTimeInMicroSeconds(struct timespec *timer)
|
||||
ParodusPrint("timer->tv_sec : %lu\n",timer->tv_sec);
|
||||
ParodusPrint("timer->tv_nsec : %lu\n",timer->tv_nsec);
|
||||
systime = (uint64_t)timer->tv_sec * 1000000L + timer->tv_nsec/ 1000;
|
||||
return systime;
|
||||
return systime;
|
||||
}
|
||||
|
||||
long timeValDiff(struct timespec *starttime, struct timespec *finishtime)
|
||||
|
||||
144
src/token.c
144
src/token.c
@@ -24,11 +24,10 @@
|
||||
#include <stdlib.h>
|
||||
#include <stdbool.h>
|
||||
#include <unistd.h>
|
||||
#ifdef __UCLIBC__
|
||||
#include <ucresolv/ucresolv.h>
|
||||
#endif
|
||||
#include <netinet/in.h>
|
||||
#include <resolv.h>
|
||||
#ifdef FEATURE_DNS_QUERY
|
||||
#include <ucresolv.h>
|
||||
#endif
|
||||
//#include <res_update.h>
|
||||
#include <netdb.h>
|
||||
#include <strings.h>
|
||||
@@ -84,6 +83,15 @@
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* 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 */
|
||||
@@ -103,7 +111,7 @@ static void show_times (time_t exp_time, time_t cur_time)
|
||||
}
|
||||
|
||||
// returns 1 if insecure, 0 if secure, < 0 if error
|
||||
int analyze_jwt (const cjwt_t *jwt)
|
||||
int analyze_jwt (const cjwt_t *jwt, char **url_buf, unsigned int *port)
|
||||
{
|
||||
cJSON *claims = jwt->private_claims;
|
||||
cJSON *endpoint = NULL;
|
||||
@@ -121,62 +129,30 @@ int analyze_jwt (const cjwt_t *jwt)
|
||||
return TOKEN_ERR_INVALID_JWT_CONTENT;
|
||||
}
|
||||
|
||||
http_match = strncmp(endpoint->valuestring,"http:",5);
|
||||
ParodusInfo ("is_http strncmp: %d\n", http_match);
|
||||
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");
|
||||
OnboardLog ("JWT has expired\n");
|
||||
return TOKEN_ERR_JWT_EXPIRED;
|
||||
}
|
||||
}
|
||||
|
||||
return (http_match == 0);
|
||||
}
|
||||
|
||||
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;
|
||||
http_match = parse_webpa_url (endpoint->valuestring,
|
||||
url_buf, port);
|
||||
if (http_match < 0) {
|
||||
ParodusError ("Invalid endpoint claim in JWT\n");
|
||||
OnboardLog("Invalid endpoint claim in JWT\n");
|
||||
return TOKEN_ERR_BAD_ENDPOINT;
|
||||
}
|
||||
if (c == 0)
|
||||
return NULL;
|
||||
return src + i + 1;
|
||||
}
|
||||
ParodusInfo ("JWT is_http strncmp: %d\n", http_match);
|
||||
|
||||
// the algorithm mask indicates which algorithms are allowed
|
||||
unsigned int get_algo_mask (const char *algo_str)
|
||||
{
|
||||
unsigned int mask = 0;
|
||||
#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);
|
||||
abort ();
|
||||
}
|
||||
mask |= (1<<alg_val);
|
||||
}
|
||||
return mask;
|
||||
#undef BUFLEN
|
||||
return http_match;
|
||||
}
|
||||
|
||||
bool validate_algo(const cjwt_t *jwt)
|
||||
@@ -190,7 +166,7 @@ bool validate_algo(const cjwt_t *jwt)
|
||||
if ((alg < 0) || (alg >= num_algorithms))
|
||||
return false;
|
||||
alg_mask = 1<<alg;
|
||||
if ((alg_mask & get_algo_mask(cfg->jwt_algo)) == 0) {
|
||||
if ((alg_mask & cfg->jwt_algo) == 0) {
|
||||
ParodusError ("Algorithm %d not allowed (mask %d)\n", alg, alg_mask);
|
||||
return false;
|
||||
}
|
||||
@@ -198,7 +174,7 @@ bool validate_algo(const cjwt_t *jwt)
|
||||
}
|
||||
|
||||
|
||||
int nquery(const char* dns_txt_record_id,u_char *nsbuf)
|
||||
int nquery(const char* dns_txt_record_id, u_char *nsbuf)
|
||||
{
|
||||
|
||||
int len;
|
||||
@@ -206,15 +182,19 @@ int nquery(const char* dns_txt_record_id,u_char *nsbuf)
|
||||
|
||||
/* Initialize resolver */
|
||||
memset (&statp, 0, sizeof(__res_state));
|
||||
statp.options |= RES_DEBUG;
|
||||
if (res_ninit(&statp) < 0) {
|
||||
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 ("Domain : %s\n", dns_txt_record_id);
|
||||
ParodusInfo ("nquery: domain : %s\n", dns_txt_record_id);
|
||||
memset (nsbuf, 0, NS_MAXBUF);
|
||||
len = res_nquery(&statp, dns_txt_record_id, ns_c_any, ns_t_txt, nsbuf, 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);
|
||||
@@ -222,7 +202,8 @@ int nquery(const char* dns_txt_record_id,u_char *nsbuf)
|
||||
}
|
||||
return len;
|
||||
}
|
||||
res_nclose (&statp);
|
||||
__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;
|
||||
@@ -253,11 +234,10 @@ static bool is_digit (char c)
|
||||
// strip quotes and newlines from rr rec
|
||||
const char *strip_rr_data (const char *rr_ptr, int *rrlen)
|
||||
{
|
||||
int len;
|
||||
int len = *rrlen;
|
||||
const char *optr = rr_ptr;
|
||||
char c;
|
||||
|
||||
len = strlen (optr);
|
||||
if (len > 0) {
|
||||
c = optr[0];
|
||||
if (!is_digit(c)) {
|
||||
@@ -358,6 +338,7 @@ int get_rr_seq_table (ns_msg *msg_handle, int num_rr_recs, rr_rec_t *seq_table)
|
||||
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);
|
||||
@@ -443,25 +424,36 @@ int query_dns(const char* dns_txt_record_id,char *jwt_ans)
|
||||
if( !dns_txt_record_id || !jwt_ans )
|
||||
return l;
|
||||
|
||||
nsbuf = malloc (NS_MAXBUF);
|
||||
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 ("initparse\n");
|
||||
ret = ns_initparse(nsbuf, l, &msg_handle);
|
||||
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;
|
||||
@@ -478,12 +470,14 @@ static void get_dns_txt_record_id (char *buf)
|
||||
ParodusCfg *cfg = get_parodus_cfg();
|
||||
buf[0] = 0;
|
||||
|
||||
sprintf (buf, "%s.%s.webpa.comcast.net", cfg->hw_mac, cfg->dns_id);
|
||||
sprintf (buf, "%s.%s", cfg->hw_mac, cfg->dns_txt_url);
|
||||
ParodusInfo("dns_txt_record_id %s\n", buf);
|
||||
}
|
||||
#endif
|
||||
|
||||
int allow_insecure_conn(void)
|
||||
{
|
||||
int allow_insecure_conn(char **server_addr, unsigned int *port)
|
||||
{
|
||||
#ifdef FEATURE_DNS_QUERY
|
||||
int insecure=0, ret = -1;
|
||||
char *jwt_token, *key;
|
||||
cjwt_t *jwt = NULL;
|
||||
@@ -498,17 +492,19 @@ int allow_insecure_conn(void)
|
||||
|
||||
get_dns_txt_record_id (dns_txt_record_id);
|
||||
|
||||
//Querying dns for jwt token
|
||||
ret = query_dns(dns_txt_record_id, jwt_token);
|
||||
ParodusPrint("query_dns returns %d\n", ret);
|
||||
|
||||
if(ret){
|
||||
if (ret == TOKEN_ERR_MEMORY_FAIL) {
|
||||
ParodusError("Failed in DNS query\n");
|
||||
if (ret == TOKEN_ERR_MEMORY_FAIL){
|
||||
insecure = ret;
|
||||
} else {
|
||||
}
|
||||
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) );
|
||||
@@ -527,16 +523,26 @@ int allow_insecure_conn(void)
|
||||
|
||||
//validate algo from --jwt_algo
|
||||
if( validate_algo(jwt) ) {
|
||||
insecure = analyze_jwt (jwt);
|
||||
insecure = analyze_jwt (jwt, server_addr, port);
|
||||
} else {
|
||||
insecure = TOKEN_ERR_ALGO_NOT_ALLOWED;
|
||||
}
|
||||
|
||||
if (insecure >= 0) {
|
||||
char *claim_str = cJSON_Print (jwt->private_claims);
|
||||
ParodusInfo ("JWT claims: %s\n", claim_str);
|
||||
free (claim_str);
|
||||
}
|
||||
cjwt_destroy(&jwt);
|
||||
|
||||
end:
|
||||
if (NULL != jwt_token)
|
||||
free (jwt_token);
|
||||
#else
|
||||
(void) server_addr;
|
||||
(void) port;
|
||||
int insecure = TOKEN_NO_DNS_QUERY;
|
||||
#endif
|
||||
ParodusPrint ("Allow Insecure %d\n", insecure);
|
||||
return insecure;
|
||||
}
|
||||
|
||||
46
src/token.h
46
src/token.h
@@ -34,19 +34,57 @@ typedef enum {
|
||||
TOKEN_ERR_JWT_DECODE_FAIL = -102,
|
||||
TOKEN_ERR_ALGO_NOT_ALLOWED = -103,
|
||||
TOKEN_ERR_INVALID_JWT_CONTENT = -104,
|
||||
TOKEN_ERR_JWT_EXPIRED = -105
|
||||
|
||||
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 server_addr ptr to buffer ptr containing endpoint value found in JWT
|
||||
* will be NULL if invalid, otherwise needs to be freed
|
||||
* @param port ptr to variable receiving the port number
|
||||
* @return 1 if insecure connection is allowed, 0 if not,
|
||||
* or one of the error codes given above.
|
||||
*/
|
||||
int allow_insecure_conn(void);
|
||||
int allow_insecure_conn (char **server_addr, unsigned int *port);
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
371
src/upstream.c
371
src/upstream.c
@@ -28,18 +28,19 @@
|
||||
#include "connection.h"
|
||||
#include "client_list.h"
|
||||
#include "nopoll_helpers.h"
|
||||
#include "close_retry.h"
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Macros */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
#define METADATA_COUNT 12
|
||||
|
||||
#define PARODUS_SERVICE_NAME "parodus"
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* File Scoped Variables */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
void *metadataPack;
|
||||
size_t metaPackSize=-1;
|
||||
size_t metaPackSize=0;
|
||||
|
||||
|
||||
UpStreamMsg *UpStreamMsgQ = NULL;
|
||||
@@ -48,6 +49,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 */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
@@ -62,7 +83,6 @@ void packMetaData()
|
||||
//Pack the metadata initially to reuse for every upstream msg sending to server
|
||||
ParodusPrint("-------------- Packing metadata ----------------\n");
|
||||
sprintf(boot_time, "%d", get_parodus_cfg()->boot_time);
|
||||
|
||||
struct data meta_pack[METADATA_COUNT] = {
|
||||
{HW_MODELNAME, get_parodus_cfg()->hw_model},
|
||||
{HW_SERIALNUMBER, get_parodus_cfg()->hw_serial_number},
|
||||
@@ -74,10 +94,9 @@ void packMetaData()
|
||||
{LAST_RECONNECT_REASON, get_global_reconnect_reason()},
|
||||
{WEBPA_PROTOCOL, get_parodus_cfg()->webpa_protocol},
|
||||
{WEBPA_UUID,get_parodus_cfg()->webpa_uuid},
|
||||
{WEBPA_INTERFACE, get_parodus_cfg()->webpa_interface_used},
|
||||
{WEBPA_INTERFACE, getWebpaInterface()},
|
||||
{PARTNER_ID, get_parodus_cfg()->partner_id}
|
||||
};
|
||||
|
||||
const data_t metapack = {METADATA_COUNT, meta_pack};
|
||||
|
||||
metaPackSize = wrp_pack_metadata( &metapack , &metadataPack );
|
||||
@@ -108,6 +127,12 @@ void *handle_upstream()
|
||||
sock = nn_socket( AF_SP, NN_PULL );
|
||||
if(sock >= 0)
|
||||
{
|
||||
int t = NANO_SOCKET_RCV_TIMEOUT_MS;
|
||||
int rc = nn_setsockopt(sock, NN_SOL_SOCKET, NN_RCVTIMEO, &t, sizeof(t));
|
||||
if (rc < 0)
|
||||
{
|
||||
ParodusError ("Unable to set socket receive timeout (errno=%d, %s)\n",errno, strerror(errno));
|
||||
}
|
||||
ParodusPrint("Nanomsg bind with get_parodus_cfg()->local_url %s\n", get_parodus_cfg()->local_url);
|
||||
bind = nn_bind(sock, get_parodus_cfg()->local_url);
|
||||
if(bind < 0)
|
||||
@@ -116,11 +141,18 @@ void *handle_upstream()
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusInfo("nanomsg server gone into the listening mode...\n");
|
||||
while( FOREVER() )
|
||||
{
|
||||
buf = NULL;
|
||||
ParodusInfo("nanomsg server gone into the listening mode...\n");
|
||||
bytes = nn_recv (sock, &buf, NN_MSG, 0);
|
||||
if (g_shutdown)
|
||||
break;
|
||||
if (bytes < 0) {
|
||||
if ((errno != EAGAIN) && (errno != ETIMEDOUT))
|
||||
ParodusInfo ("Error (%d) receiving message from nanomsg client\n", errno);
|
||||
continue;
|
||||
}
|
||||
ParodusInfo ("Upstream message received from nanomsg client\n");
|
||||
message = (UpStreamMsg *)malloc(sizeof(UpStreamMsg));
|
||||
|
||||
@@ -156,6 +188,16 @@ void *handle_upstream()
|
||||
ParodusError("failure in allocation for message\n");
|
||||
}
|
||||
}
|
||||
if(nn_shutdown(sock, bind) < 0)
|
||||
{
|
||||
ParodusError ("nn_shutdown bind socket=%d endpt=%d, err=%d\n",
|
||||
sock, bind, errno);
|
||||
}
|
||||
if (nn_close (sock) < 0)
|
||||
{
|
||||
ParodusError ("nn_close bind socket=%d err=%d\n",
|
||||
sock, errno);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -171,12 +213,15 @@ void *processUpstreamMessage()
|
||||
{
|
||||
int rv=-1, rc = -1;
|
||||
int msgType;
|
||||
wrp_msg_t *msg;
|
||||
void *appendData, *bytes;
|
||||
size_t encodedSize;
|
||||
wrp_msg_t *msg,*retrieve_msg = NULL;
|
||||
void *bytes;
|
||||
reg_list_item_t *temp = NULL;
|
||||
int matchFlag = 0;
|
||||
int status = -1;
|
||||
char *device_id = NULL;
|
||||
size_t device_id_len = 0;
|
||||
size_t parodus_len;
|
||||
int ret = -1;
|
||||
|
||||
while(FOREVER())
|
||||
{
|
||||
@@ -197,34 +242,40 @@ void *processUpstreamMessage()
|
||||
if(rv > 0)
|
||||
{
|
||||
msgType = msg->msg_type;
|
||||
if(msgType == 9)
|
||||
if(msgType == WRP_MSG_TYPE__SVC_REGISTRATION)
|
||||
{
|
||||
ParodusInfo("\n Nanomsg client Registration for Upstream\n");
|
||||
//Extract serviceName and url & store it in a linked list for reg_clients
|
||||
temp = get_global_node();
|
||||
if(get_numOfClients() !=0)
|
||||
{
|
||||
matchFlag = 0;
|
||||
ParodusPrint("matchFlag reset to %d\n", matchFlag);
|
||||
temp = get_global_node();
|
||||
while(temp!=NULL)
|
||||
{
|
||||
if(strcmp(temp->service_name, msg->u.reg.service_name)==0)
|
||||
{
|
||||
ParodusInfo("match found, client is already registered\n");
|
||||
parStrncpy(temp->url,msg->u.reg.url, sizeof(temp->url));
|
||||
if(nn_shutdown(temp->sock, 0) < 0)
|
||||
if(nn_shutdown(temp->sock, temp->endpoint) < 0)
|
||||
{
|
||||
ParodusError ("Failed to shutdown\n");
|
||||
ParodusError ("nn_shutdown socket=%d endpt=%d, err=%d\n",
|
||||
temp->sock, temp->endpoint, errno);
|
||||
}
|
||||
if (nn_close (temp->sock) < 0)
|
||||
{
|
||||
ParodusError ("nn_close socket=%d err=%d\n",
|
||||
temp->sock, errno);
|
||||
}
|
||||
|
||||
temp->sock = nn_socket(AF_SP,NN_PUSH );
|
||||
if(temp->sock >= 0)
|
||||
{
|
||||
int t = NANOMSG_SOCKET_TIMEOUT_MSEC;
|
||||
int t = NANO_SOCKET_SEND_TIMEOUT_MS;
|
||||
rc = nn_setsockopt(temp->sock, NN_SOL_SOCKET, NN_SNDTIMEO, &t, sizeof(t));
|
||||
if(rc < 0)
|
||||
{
|
||||
ParodusError ("Unable to set socket timeout (errno=%d, %s)\n",errno, strerror(errno));
|
||||
ParodusError ("Unable to set socket send timeout (errno=%d, %s)\n",errno, strerror(errno));
|
||||
}
|
||||
rc = nn_connect(temp->sock, msg->u.reg.url);
|
||||
if(rc < 0)
|
||||
@@ -233,7 +284,8 @@ void *processUpstreamMessage()
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusInfo("Client registered before. Sending acknowledgement \n");
|
||||
temp->endpoint = rc;
|
||||
ParodusInfo("Client registered before. Sending ack on socket %d\n", temp->sock);
|
||||
status =sendAuthStatus(temp);
|
||||
|
||||
if(status == 0)
|
||||
@@ -264,16 +316,19 @@ void *processUpstreamMessage()
|
||||
ParodusPrint("sent auth status to reg client\n");
|
||||
}
|
||||
}
|
||||
release_global_node ();
|
||||
}
|
||||
else if(msgType == WRP_MSG_TYPE__EVENT)
|
||||
{
|
||||
ParodusInfo(" Received upstream event data: dest '%s'\n", msg->u.event.dest);
|
||||
partners_t *partnersList = NULL;
|
||||
int j = 0;
|
||||
|
||||
int ret = validate_partner_id(msg, &partnersList);
|
||||
if(ret == 1)
|
||||
{
|
||||
wrp_msg_t *eventMsg = (wrp_msg_t *) malloc(sizeof(wrp_msg_t));
|
||||
memset( eventMsg, 0, sizeof( wrp_msg_t ) );
|
||||
eventMsg->msg_type = msgType;
|
||||
eventMsg->u.event.content_type=msg->u.event.content_type;
|
||||
eventMsg->u.event.source=msg->u.event.source;
|
||||
@@ -283,6 +338,15 @@ void *processUpstreamMessage()
|
||||
eventMsg->u.event.headers=msg->u.event.headers;
|
||||
eventMsg->u.event.metadata=msg->u.event.metadata;
|
||||
eventMsg->u.event.partner_ids = partnersList;
|
||||
if(msg->u.event.transaction_uuid)
|
||||
{
|
||||
ParodusPrint("Inside Trans id in PARODUS\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusPrint("Assigning NULL to trans id\n");
|
||||
eventMsg->u.event.transaction_uuid = NULL;
|
||||
}
|
||||
|
||||
int size = wrp_struct_to( eventMsg, WRP_BYTES, &bytes );
|
||||
if(size > 0)
|
||||
@@ -297,47 +361,139 @@ void *processUpstreamMessage()
|
||||
{
|
||||
sendUpstreamMsgToServer(&message->msg, message->len);
|
||||
}
|
||||
if(partnersList != NULL)
|
||||
{
|
||||
for(j=0; j<(int)partnersList->count; j++)
|
||||
{
|
||||
if(NULL != partnersList->partner_ids[j])
|
||||
{
|
||||
free(partnersList->partner_ids[j]);
|
||||
}
|
||||
}
|
||||
free(partnersList);
|
||||
}
|
||||
partnersList = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
//Sending to server for msgTypes 3, 5, 6, 7, 8.
|
||||
ParodusInfo(" Received upstream data with MsgType: %d dest: '%s' transaction_uuid: %s\n", msgType, msg->u.req.dest, msg->u.req.transaction_uuid );
|
||||
//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");
|
||||
}
|
||||
}
|
||||
}
|
||||
//Sending to server for msgTypes 3, 5, 6, 7, 8.
|
||||
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 );
|
||||
sendUpstreamMsgToServer(&message->msg, message->len);
|
||||
}
|
||||
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 );
|
||||
if(WRP_MSG_TYPE__RETREIVE == msgType)
|
||||
{
|
||||
ret = getDeviceId(&device_id, &device_id_len);
|
||||
if(ret == 0)
|
||||
{
|
||||
ParodusPrint("device_id %s device_id_len %lu\n", device_id, device_id_len);
|
||||
/* Match dest based on device_id. Check dest start with: "mac:112233445xxx" ? */
|
||||
if( 0 == strncasecmp(device_id, msg->u.crud.dest, device_id_len-1) )
|
||||
{
|
||||
/* For this device. */
|
||||
parodus_len = strlen( PARODUS_SERVICE_NAME );
|
||||
if( 0 == strncmp(PARODUS_SERVICE_NAME, &msg->u.crud.dest[device_id_len], parodus_len-1) )
|
||||
{
|
||||
/* For Parodus CRUD queue. */
|
||||
ParodusInfo("Create RetrieveMsg and add to parodus CRUD queue\n");
|
||||
createUpstreamRetrieveMsg(msg, &retrieve_msg);
|
||||
addCRUDmsgToQueue(retrieve_msg);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* For nanomsg clients. */
|
||||
getServiceNameAndSendResponse(msg, &message->msg, message->len);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Not for this device. Send upstream */
|
||||
ParodusInfo("sendUpstreamMsgToServer \n");
|
||||
sendUpstreamMsgToServer(&message->msg, message->len);
|
||||
}
|
||||
if(device_id != NULL)
|
||||
{
|
||||
free(device_id);
|
||||
device_id = NULL;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusError("Failed to get device_id\n");
|
||||
}
|
||||
}
|
||||
else if((WRP_MSG_TYPE__UPDATE == msgType) || (WRP_MSG_TYPE__DELETE == msgType))
|
||||
{
|
||||
ParodusPrint("UPDATE/DELETE request\n");
|
||||
ret = getDeviceId(&device_id, &device_id_len);
|
||||
if(ret == 0)
|
||||
{
|
||||
ParodusPrint("device_id %s device_id_len %lu\n", device_id, device_id_len);
|
||||
/* Match dest based on device_id. Check dest start with: "mac:112233445xxx" ? */
|
||||
if( 0 == strncasecmp(device_id, msg->u.crud.dest, device_id_len-1) )
|
||||
{
|
||||
/* For this device. For nanomsg clients.*/
|
||||
getServiceNameAndSendResponse(msg, &message->msg, message->len);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Not for this device. Send upstream */
|
||||
ParodusInfo("sendUpstreamMsgToServer \n");
|
||||
sendUpstreamMsgToServer(&message->msg, message->len);
|
||||
}
|
||||
if(device_id != NULL)
|
||||
{
|
||||
free(device_id);
|
||||
device_id = NULL;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusError("Failed to get device_id\n");
|
||||
}
|
||||
}
|
||||
else if (WRP_MSG_TYPE__SVC_ALIVE != msgType) {
|
||||
/* Don't reply to service alive message */
|
||||
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) && wrp_does_service_match("parodus", msg->u.crud.source) == 0))
|
||||
{
|
||||
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
|
||||
{
|
||||
if (g_shutdown) {
|
||||
pthread_mutex_unlock (&nano_mut);
|
||||
break;
|
||||
}
|
||||
ParodusPrint("Before pthread cond wait in consumer thread\n");
|
||||
pthread_cond_wait(&nano_con, &nano_mut);
|
||||
pthread_mutex_unlock (&nano_mut);
|
||||
@@ -347,11 +503,113 @@ void *processUpstreamMessage()
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void sendUpstreamMsgToServer(void **resp_bytes, size_t resp_size)
|
||||
/**
|
||||
* @brief getDeviceId function to create deviceId in the format "mac:112233445xxx"
|
||||
*
|
||||
* @param[out] device_id in the format "mac:112233445xxx"
|
||||
* @param[out] total size of device_id
|
||||
*/
|
||||
int getDeviceId(char **device_id, size_t *device_id_len)
|
||||
{
|
||||
char *deviceID = NULL;
|
||||
size_t len;
|
||||
|
||||
if((get_parodus_cfg()->hw_mac !=NULL) && (strlen(get_parodus_cfg()->hw_mac)!=0))
|
||||
{
|
||||
len = strlen(get_parodus_cfg()->hw_mac) + 5;
|
||||
|
||||
deviceID = (char *) malloc(sizeof(char)*64);
|
||||
if(deviceID != NULL)
|
||||
{
|
||||
snprintf(deviceID, len, "mac:%s", get_parodus_cfg()->hw_mac);
|
||||
*device_id = deviceID;
|
||||
*device_id_len = len;
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusError("device_id allocation failed\n");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusError("device mac is NULL\n");
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief createUpstreamRetrieveMsg function to create new message for processing Retrieve requests
|
||||
*
|
||||
* @param[in] message The upstream message received from cloud or internal clients
|
||||
* @param[out] retrieve_msg New message for processing Retrieve requests
|
||||
*/
|
||||
void createUpstreamRetrieveMsg(wrp_msg_t *message, wrp_msg_t **retrieve_msg)
|
||||
{
|
||||
wrp_msg_t *msg;
|
||||
msg = ( wrp_msg_t * ) malloc( sizeof( wrp_msg_t ) );
|
||||
if(msg != NULL)
|
||||
{
|
||||
memset(msg, 0, sizeof(wrp_msg_t));
|
||||
|
||||
msg->msg_type = message->msg_type;
|
||||
if(message->u.crud.transaction_uuid != NULL)
|
||||
{
|
||||
msg->u.crud.transaction_uuid = strdup(message->u.crud.transaction_uuid);
|
||||
}
|
||||
if(message->u.crud.source !=NULL)
|
||||
{
|
||||
msg->u.crud.source = strdup(message->u.crud.source);
|
||||
}
|
||||
if(message->u.crud.dest != NULL)
|
||||
{
|
||||
msg->u.crud.dest = strdup(message->u.crud.dest);
|
||||
}
|
||||
*retrieve_msg = msg;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief getServiceNameAndSendResponse function to fetch client service name and to send msg to it.
|
||||
*
|
||||
* @param[in] msg The decoded message to fetch client service name from its dest field
|
||||
* @param[in] msg_bytes The encoded upstream msg to be sent to client
|
||||
* @param[in] msg_size Total size of the msg to send to client
|
||||
*/
|
||||
void getServiceNameAndSendResponse(wrp_msg_t *msg, void **msg_bytes, size_t msg_size)
|
||||
{
|
||||
char *serviceName = NULL;
|
||||
int sendStatus =-1;
|
||||
|
||||
serviceName = wrp_get_msg_element(WRP_ID_ELEMENT__SERVICE, msg, DEST);
|
||||
if ( serviceName != NULL)
|
||||
{
|
||||
sendStatus=sendMsgtoRegisteredClients(serviceName,(const char **)msg_bytes, msg_size);
|
||||
if(sendStatus ==1)
|
||||
{
|
||||
ParodusInfo("Send upstreamMsg successfully to registered client %s\n", serviceName);
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusError("Failed to send upstreamMsg to registered client %s\n", serviceName);
|
||||
}
|
||||
free(serviceName);
|
||||
serviceName = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusError("serviceName is NULL,not sending retrieve response to client\n");
|
||||
}
|
||||
}
|
||||
|
||||
int sendUpstreamMsgToServer(void **resp_bytes, size_t resp_size)
|
||||
{
|
||||
void *appendData;
|
||||
size_t encodedSize;
|
||||
|
||||
bool close_retry = false;
|
||||
int sendRetStatus = 1;
|
||||
//appending response with metadata
|
||||
if(metaPackSize > 0)
|
||||
{
|
||||
@@ -360,14 +618,29 @@ void sendUpstreamMsgToServer(void **resp_bytes, size_t resp_size)
|
||||
ParodusPrint("encodedSize after appending :%zu\n", encodedSize);
|
||||
|
||||
ParodusInfo("Sending response to server\n");
|
||||
sendMessage(get_global_conn(),appendData, encodedSize);
|
||||
|
||||
close_retry = get_close_retry();
|
||||
|
||||
/* send response when connection retry is not in progress. Also during cloud_disconnect UPDATE request. Here, close_retry becomes 1 hence check is added to send disconnect response to server. */
|
||||
//TODO: Upstream and downstream messages in queue should be handled and queue should be empty before parodus forcefully disconnect from cloud.
|
||||
if(!close_retry || (get_parodus_cfg()->cloud_disconnect !=NULL))
|
||||
{
|
||||
sendRetStatus = sendMessage(get_global_conn(),appendData, encodedSize);
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusInfo("close_retry is %d, unable to send response as connection retry is in progress\n", close_retry);
|
||||
OnboardLog("close_retry is %d, unable to send response as connection retry is in progress\n", close_retry);
|
||||
sendRetStatus = 1;
|
||||
}
|
||||
free(appendData);
|
||||
appendData =NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusError("Failed to send upstream as metadata packing is not successful\n");
|
||||
sendRetStatus = 1;
|
||||
}
|
||||
ParodusPrint("sendRetStatus is %d\n", sendRetStatus);
|
||||
|
||||
return sendRetStatus;
|
||||
}
|
||||
|
||||
@@ -24,10 +24,12 @@
|
||||
#ifndef _UPSTREAM_H_
|
||||
#define _UPSTREAM_H_
|
||||
|
||||
#include <pthread.h>
|
||||
#include <wrp-c.h>
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Data Structures */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
@@ -45,8 +47,18 @@ typedef struct UpStreamMsg__
|
||||
void packMetaData();
|
||||
void *handle_upstream();
|
||||
void *processUpstreamMessage();
|
||||
|
||||
void sendUpstreamMsgToServer(void **resp_bytes, size_t resp_size);
|
||||
void registerRBUSlistener();
|
||||
int getDeviceId(char **device_id, size_t *device_id_len);
|
||||
int sendUpstreamMsgToServer(void **resp_bytes, size_t resp_size);
|
||||
void getServiceNameAndSendResponse(wrp_msg_t *msg, void **msg_bytes, size_t msg_size);
|
||||
void createUpstreamRetrieveMsg(wrp_msg_t *message, wrp_msg_t **retrieve_msg);
|
||||
void set_global_UpStreamMsgQ(UpStreamMsg * UpStreamQ);
|
||||
#ifdef WAN_FAILOVER_SUPPORTED
|
||||
int subscribeCurrentActiveInterfaceEvent();
|
||||
#endif
|
||||
UpStreamMsg * get_global_UpStreamMsgQ(void);
|
||||
pthread_cond_t *get_global_nano_con(void);
|
||||
pthread_mutex_t *get_global_nano_mut(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
211
src/upstream_rbus.c
Normal file
211
src/upstream_rbus.c
Normal file
@@ -0,0 +1,211 @@
|
||||
/**
|
||||
* Copyright 2021 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_rbus.c
|
||||
*
|
||||
* @description This is used for parodus-RBUS communication
|
||||
* to send notification events upstream to cloud.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <rbus.h>
|
||||
#include "upstream.h"
|
||||
#include "ParodusInternal.h"
|
||||
#include "partners_check.h"
|
||||
#include "close_retry.h"
|
||||
#include "connection.h"
|
||||
#include "heartBeat.h"
|
||||
|
||||
#define WEBCFG_UPSTREAM_EVENT "Webconfig.Upstream"
|
||||
#ifdef WAN_FAILOVER_SUPPORTED
|
||||
#define WEBPA_INTERFACE "Device.X_RDK_WanManager.CurrentActiveInterface"
|
||||
#endif
|
||||
|
||||
rbusHandle_t rbus_Handle;
|
||||
rbusError_t err;
|
||||
|
||||
void processWebconfigUpstreamEvent(rbusHandle_t handle, rbusEvent_t const* event, rbusEventSubscription_t* subscription);
|
||||
|
||||
void subscribeAsyncHandler( rbusHandle_t handle, rbusEventSubscription_t* subscription, rbusError_t error);
|
||||
|
||||
rbusHandle_t get_parodus_rbus_Handle(void)
|
||||
{
|
||||
return rbus_Handle;
|
||||
}
|
||||
#ifdef WAN_FAILOVER_SUPPORTED
|
||||
void eventReceiveHandler( rbusHandle_t rbus_Handle, rbusEvent_t const* event, rbusEventSubscription_t* subscription );
|
||||
#endif
|
||||
|
||||
/* API to register RBUS listener to receive messages from webconfig */
|
||||
void subscribeRBUSevent()
|
||||
{
|
||||
int rc = RBUS_ERROR_SUCCESS;
|
||||
err = rbus_open(&rbus_Handle, "parodus");
|
||||
if (err)
|
||||
{
|
||||
ParodusError("rbus_open failed :%s\n", rbusError_ToString(err));
|
||||
return;
|
||||
}
|
||||
rc = rbusEvent_SubscribeAsync(rbus_Handle,WEBCFG_UPSTREAM_EVENT,processWebconfigUpstreamEvent,subscribeAsyncHandler,"parodus",10*60);
|
||||
if(rc != RBUS_ERROR_SUCCESS)
|
||||
ParodusError("rbusEvent_Subscribe failed: %d, %s\n", rc, rbusError_ToString(rc));
|
||||
else
|
||||
ParodusInfo("rbusEvent_Subscribe was successful\n");
|
||||
}
|
||||
|
||||
#ifdef WAN_FAILOVER_SUPPORTED
|
||||
/* API to subscribe Active Interface name on value change event*/
|
||||
int subscribeCurrentActiveInterfaceEvent()
|
||||
{
|
||||
int rc = RBUS_ERROR_SUCCESS;
|
||||
ParodusInfo("Subscribing to Device.X_RDK_WanManager.CurrentActiveInterface Event\n");
|
||||
rc = rbusEvent_SubscribeAsync(rbus_Handle,WEBPA_INTERFACE,eventReceiveHandler,subscribeAsyncHandler,"parodusInterface",10*20);
|
||||
if(rc != RBUS_ERROR_SUCCESS)
|
||||
{
|
||||
ParodusError("%s subscribe failed : %d - %s\n", WEBPA_INTERFACE, rc, rbusError_ToString(rc));
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
#endif
|
||||
|
||||
void processWebconfigUpstreamEvent(rbusHandle_t handle, rbusEvent_t const* event, rbusEventSubscription_t* subscription)
|
||||
{
|
||||
(void)handle;
|
||||
(void)subscription;
|
||||
|
||||
int rv=-1;
|
||||
wrp_msg_t *event_msg;
|
||||
void *bytes;
|
||||
const uint8_t* bytesVal = NULL;
|
||||
int len;
|
||||
rbusValue_t value = NULL;
|
||||
|
||||
value = rbusObject_GetValue(event->data, "value");
|
||||
bytesVal = rbusValue_GetBytes(value, &len);
|
||||
|
||||
bytes = (void*) bytesVal;
|
||||
rv = wrp_to_struct( bytes, len, WRP_BYTES, &event_msg );
|
||||
if(rv > 0)
|
||||
{
|
||||
ParodusInfo(" Received upstream event data: dest '%s'\n", event_msg->u.event.dest);
|
||||
partners_t *partnersList = NULL;
|
||||
int j = 0;
|
||||
|
||||
int ret = validate_partner_id(event_msg, &partnersList);
|
||||
if(ret == 1)
|
||||
{
|
||||
wrp_msg_t *eventMsg = (wrp_msg_t *) malloc(sizeof(wrp_msg_t));
|
||||
memset( eventMsg, 0, sizeof( wrp_msg_t ) );
|
||||
eventMsg->msg_type = event_msg->msg_type;
|
||||
eventMsg->u.event.content_type=event_msg->u.event.content_type;
|
||||
eventMsg->u.event.source=event_msg->u.event.source;
|
||||
eventMsg->u.event.dest=event_msg->u.event.dest;
|
||||
eventMsg->u.event.payload=event_msg->u.event.payload;
|
||||
eventMsg->u.event.payload_size=event_msg->u.event.payload_size;
|
||||
eventMsg->u.event.headers=event_msg->u.event.headers;
|
||||
eventMsg->u.event.metadata=event_msg->u.event.metadata;
|
||||
eventMsg->u.event.partner_ids = partnersList;
|
||||
if(event_msg->u.event.transaction_uuid)
|
||||
{
|
||||
ParodusPrint("Inside Trans id in PARODUS_rbus\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
ParodusPrint("Assigning NULL to trans id RBUS\n");
|
||||
eventMsg->u.event.transaction_uuid = NULL;
|
||||
}
|
||||
|
||||
int size = wrp_struct_to( eventMsg, WRP_BYTES, &bytes );
|
||||
if(size > 0)
|
||||
{
|
||||
sendUpstreamMsgToServer(&bytes, size);
|
||||
}
|
||||
free(eventMsg);
|
||||
free(bytes);
|
||||
bytes = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
sendUpstreamMsgToServer((void **)(&bytes), len);
|
||||
}
|
||||
if(partnersList != NULL)
|
||||
{
|
||||
for(j=0; j<(int)partnersList->count; j++)
|
||||
{
|
||||
if(NULL != partnersList->partner_ids[j])
|
||||
{
|
||||
free(partnersList->partner_ids[j]);
|
||||
}
|
||||
}
|
||||
free(partnersList);
|
||||
}
|
||||
partnersList = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
void subscribeAsyncHandler( rbusHandle_t handle, rbusEventSubscription_t* subscription, rbusError_t error)
|
||||
{
|
||||
(void)handle;
|
||||
ParodusInfo("subscribeAsyncHandler event %s, error %d - %s\n",subscription->eventName, error, rbusError_ToString(error));
|
||||
}
|
||||
|
||||
#ifdef WAN_FAILOVER_SUPPORTED
|
||||
void eventReceiveHandler( rbusHandle_t rbus_Handle, rbusEvent_t const* event, rbusEventSubscription_t* subscription )
|
||||
{
|
||||
(void)subscription;
|
||||
ParodusPrint("Handling event inside eventReceiveHandler\n");
|
||||
(void)rbus_Handle;
|
||||
char * interface = NULL;
|
||||
rbusValue_t newValue = rbusObject_GetValue(event->data, "value");
|
||||
rbusValue_t oldValue = rbusObject_GetValue(event->data, "oldValue");
|
||||
ParodusInfo("Consumer received ValueChange event for param %s\n", event->name);
|
||||
|
||||
if(newValue) {
|
||||
interface = (char *) rbusValue_GetString(newValue, NULL);
|
||||
setWebpaInterface(interface);
|
||||
}
|
||||
else {
|
||||
ParodusError("newValue is NULL\n");
|
||||
}
|
||||
|
||||
if(newValue !=NULL && oldValue!=NULL && interface!=NULL) {
|
||||
ParodusInfo("New Value: %s Old Value: %s New Interface Value: %s\n", rbusValue_GetString(newValue, NULL), rbusValue_GetString(oldValue, NULL), interface);
|
||||
|
||||
// If interface is already down then reset it and reconnect cloud conn as wan failover event is received
|
||||
if(get_interface_down_event())
|
||||
{
|
||||
reset_interface_down_event();
|
||||
ParodusInfo("Interface_down_event is reset\n");
|
||||
resume_heartBeatTimer();
|
||||
}
|
||||
// Close cloud conn and reconnect with the new interface as wan failover event is received
|
||||
set_global_reconnect_reason("WAN_FAILOVER");
|
||||
set_global_reconnect_status(true);
|
||||
set_close_retry();
|
||||
|
||||
}
|
||||
else {
|
||||
if(oldValue == NULL) {
|
||||
ParodusError("oldValue is NULL\n");
|
||||
}
|
||||
if(interface == NULL) {
|
||||
ParodusError("interface is NULL\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
1771
src/xmidtsend_rbus.c
Normal file
1771
src/xmidtsend_rbus.c
Normal file
File diff suppressed because it is too large
Load Diff
127
src/xmidtsend_rbus.h
Normal file
127
src/xmidtsend_rbus.h
Normal file
@@ -0,0 +1,127 @@
|
||||
/**
|
||||
* Copyright 2022 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 xmidtsend_rbus.h
|
||||
*
|
||||
* @description This header defines functions required to manage xmidt send messages via rbus.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _XMIDTSEND_RBUS_H_
|
||||
#define _XMIDTSEND_RBUS_H_
|
||||
#include <rbus.h>
|
||||
#include "config.h"
|
||||
#include <uuid/uuid.h>
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define XMIDT_SEND_METHOD "Device.X_RDK_Xmidt.SendData"
|
||||
#define INPARAMS_PATH "/tmp/inparams.txt"
|
||||
|
||||
#define CLOUD_ACK_TIMEOUT_SEC 7
|
||||
#define CRITICAL_QOS_EXPIRE_TIME 30*60
|
||||
#define HIGH_QOS_EXPIRE_TIME 25*60
|
||||
#define MEDIUM_QOS_EXPIRE_TIME 20*60
|
||||
#define LOW_QOS_EXPIRE_TIME 15*60
|
||||
|
||||
#define EXPIRY_CHECK_TIME 5*60 //To check expiry in every 5 mins when cloud connection is down.
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Data Structures */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
typedef struct XmidtMsg__
|
||||
{
|
||||
wrp_msg_t *msg;
|
||||
rbusMethodAsyncHandle_t asyncHandle;
|
||||
int state;
|
||||
long long enqueueTime;
|
||||
long long sentTime;
|
||||
struct XmidtMsg__ *next;
|
||||
} XmidtMsg;
|
||||
|
||||
typedef struct CloudAck__
|
||||
{
|
||||
char *transaction_id;
|
||||
int qos;
|
||||
int rdr;
|
||||
char *source;
|
||||
struct CloudAck__ *next;
|
||||
} CloudAck;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
DELIVERED_SUCCESS = 0,
|
||||
INVALID_MSG_TYPE,
|
||||
MISSING_SOURCE,
|
||||
MISSING_DEST,
|
||||
MISSING_CONTENT_TYPE,
|
||||
MISSING_PAYLOAD,
|
||||
MISSING_PAYLOADLEN,
|
||||
INVALID_CONTENT_TYPE,
|
||||
ENQUEUE_FAILURE = 100,
|
||||
CLIENT_DISCONNECT = 101,
|
||||
QUEUE_SIZE_EXCEEDED = 102,
|
||||
WRP_ENCODE_FAILURE = 103,
|
||||
MSG_PROCESSING_FAILED = 104,
|
||||
QOS_SEMANTICS_DISABLED = 105,
|
||||
MSG_EXPIRED = 106,
|
||||
QUEUE_OPTIMIZED = 107
|
||||
} XMIDT_STATUS;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
PENDING = 0,
|
||||
SENT,
|
||||
DELETE
|
||||
} MSG_STATUS;
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Function Prototypes */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
rbusHandle_t get_parodus_rbus_Handle(void);
|
||||
void addToXmidtUpstreamQ(wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle);
|
||||
void* processXmidtUpstreamMsg();
|
||||
void processXmidtData();
|
||||
int processData(XmidtMsg *Datanode, wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle);
|
||||
int sendXmidtEventToServer(XmidtMsg *msgnode, wrp_msg_t * msg, rbusMethodAsyncHandle_t asyncHandle);
|
||||
int checkInputParameters(rbusObject_t inParams);
|
||||
char* generate_transaction_uuid();
|
||||
void parseRbusInparamsToWrp(rbusObject_t inParams, char *trans_id, wrp_msg_t **eventMsg);
|
||||
void createOutParamsandSendAck(wrp_msg_t *msg, rbusMethodAsyncHandle_t asyncHandle, char *errorMsg, int statuscode, char *cloudsource, rbusError_t error);
|
||||
int validateXmidtData(wrp_msg_t * eventMsg, char **errorMsg, int *statusCode);
|
||||
void printSendMsgData(char* status, int qos, char* dest, char* transaction_uuid);
|
||||
bool highQosValueCheck(int qos);
|
||||
void waitTillConnectionIsUp();
|
||||
void printRBUSParams(rbusObject_t params, char* file_path);
|
||||
void addToCloudAckQ(char *transaction_id, int qos, int rdr, char *source);
|
||||
int checkCloudACK(XmidtMsg *xmdnode, rbusMethodAsyncHandle_t asyncHandle);
|
||||
int updateXmidtState(XmidtMsg * temp, int state);
|
||||
void print_xmidMsg_list();
|
||||
int deleteCloudACKNode(char* trans_id);
|
||||
int deleteFromXmidtQ(XmidtMsg **next_node);
|
||||
int checkCloudConn();
|
||||
void checkMaxQandOptimize(XmidtMsg *xmdMsg);
|
||||
void checkMsgExpiry(XmidtMsg *xmdMsg);
|
||||
void mapXmidtStatusToStatusMessage(int status, char **message);
|
||||
int xmidtQOptmize();
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#endif /* _XMIDTSEND_RBUS_H_ */
|
||||
|
||||
@@ -16,16 +16,25 @@ 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 -lwrp-c -luuid -lpthread -lmsgpackc -lnopoll -lnanomsg -Wl,--no-as-needed -lcjson -ltrower-base64 -lssl -lcrypto -lrt -lm)
|
||||
set (PARODUS_COMMON_SRC ../src/string_helpers.c ../src/mutex.c
|
||||
../src/time.c ../src/config.c ../src/spin_thread.c
|
||||
../src/event_handler.c ../src/token.c)
|
||||
set (PARODUS_COMMON_LIBS gcov -lcunit -lcimplog -lwrp-c
|
||||
-luuid -lmsgpackc -lnopoll -lnanomsg -lpthread
|
||||
-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 (ENABLE_CJWT)
|
||||
set (PARODUS_COMMON_LIBS ${PARODUS_COMMON_LIBS} -lcjwt -lresolv)
|
||||
endif (ENABLE_CJWT)
|
||||
if (FEATURE_DNS_QUERY)
|
||||
set (PARODUS_COMMON_LIBS ${PARODUS_COMMON_LIBS} -lucresolv -lresolv)
|
||||
endif (FEATURE_DNS_QUERY)
|
||||
|
||||
if (ENABLE_WEBCFGBIN)
|
||||
set (PARODUS_COMMON_LIBS ${PARODUS_COMMON_LIBS} -lrbus)
|
||||
endif (ENABLE_WEBCFGBIN)
|
||||
|
||||
if(NOT DISABLE_VALGRIND)
|
||||
set (MEMORY_CHECK valgrind --leak-check=full --show-reachable=yes -v)
|
||||
@@ -33,12 +42,29 @@ endif ()
|
||||
|
||||
link_directories ( ${LIBRARY_DIR} )
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
# test_heartBeatTimer
|
||||
#-------------------------------------------------------------------------------
|
||||
add_test(NAME test_heartBeatTimer COMMAND ${MEMORY_CHECK} ./test_heartBeatTimer)
|
||||
add_executable(test_heartBeatTimer test_heartBeatTimer.c ../src/heartBeat.c ../src/time.c)
|
||||
target_link_libraries (test_heartBeatTimer ${PARODUS_COMMON_LIBS} -lcmocka)
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
# test_close_retry
|
||||
#-------------------------------------------------------------------------------
|
||||
add_test(NAME test_close_retry COMMAND ${MEMORY_CHECK} ./test_close_retry)
|
||||
add_executable(test_close_retry test_close_retry.c ../src/close_retry.c)
|
||||
target_link_libraries (test_close_retry ${PARODUS_COMMON_LIBS} -lcmocka)
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
# test_mutex
|
||||
#-------------------------------------------------------------------------------
|
||||
add_test(NAME test_mutex COMMAND ${MEMORY_CHECK} ./test_mutex)
|
||||
add_executable(test_mutex test_mutex.c ../src/mutex.c)
|
||||
target_link_libraries (test_mutex ${PARODUS_COMMON_LIBS} -lcmocka)
|
||||
target_link_libraries (test_mutex gcov -lcunit -lcimplog -lwrp-c
|
||||
-luuid -lmsgpackc -lnopoll -lnanomsg -lpthread
|
||||
-Wl,--no-as-needed -lcjson -lcjwt -ltrower-base64
|
||||
-lssl -lcrypto -lrt -lm -lcmocka)
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
# test_networking
|
||||
@@ -51,29 +77,9 @@ target_link_libraries (test_networking ${PARODUS_COMMON_LIBS})
|
||||
# test_nopoll_helpers
|
||||
#-------------------------------------------------------------------------------
|
||||
add_test(NAME test_nopoll_helpers COMMAND ${MEMORY_CHECK} ./test_nopoll_helpers)
|
||||
add_executable(test_nopoll_helpers test_nopoll_helpers.c ../src/nopoll_helpers.c)
|
||||
target_link_libraries (test_nopoll_helpers -Wl,--no-as-needed -lrt -lcmocka -lcimplog -lnopoll)
|
||||
add_executable(test_nopoll_helpers test_nopoll_helpers.c ../src/nopoll_helpers.c ../src/string_helpers.c ../src/config.c)
|
||||
target_link_libraries (test_nopoll_helpers -Wl,--no-as-needed -lrt -lcmocka -lcimplog -lnopoll ${PARODUS_COMMON_LIBS})
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
# libpd_test
|
||||
#-------------------------------------------------------------------------------
|
||||
add_executable (libpd_test libpd_test.c ../src/string_helpers.c)
|
||||
|
||||
target_link_libraries (libpd_test
|
||||
cunit
|
||||
-llibparodus
|
||||
-lwrp-c
|
||||
-luuid
|
||||
-lmsgpackc
|
||||
-ltrower-base64
|
||||
-lnanomsg
|
||||
-lcimplog
|
||||
-lm
|
||||
-lpthread
|
||||
-lrt)
|
||||
if (ENABLE_SESHAT)
|
||||
target_link_libraries (libpd_test -llibseshat)
|
||||
endif (ENABLE_SESHAT)
|
||||
#-------------------------------------------------------------------------------
|
||||
# test_time
|
||||
#-------------------------------------------------------------------------------
|
||||
@@ -91,47 +97,52 @@ target_link_libraries (test_spin_thread_e ${PARODUS_COMMON_LIBS} )
|
||||
#-------------------------------------------------------------------------------
|
||||
# test_spin_thread success
|
||||
#-------------------------------------------------------------------------------
|
||||
add_test(NAME test_spin_thread_s COMMAND ${MEMORY_CHECK} ./test_spin_thread_s)
|
||||
add_executable(test_spin_thread_s test_spin_thread_s.c ../src/spin_thread.c)
|
||||
target_link_libraries (test_spin_thread_s ${PARODUS_COMMON_LIBS} )
|
||||
# add_test(NAME test_spin_thread_s COMMAND ${MEMORY_CHECK} ./test_spin_thread_s)
|
||||
# add_executable(test_spin_thread_s test_spin_thread_s.c ../src/spin_thread.c)
|
||||
# target_link_libraries (test_spin_thread_s ${PARODUS_COMMON_LIBS} )
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
# test_string_helpers
|
||||
#-------------------------------------------------------------------------------
|
||||
add_test(NAME test_string_helpers COMMAND ${MEMORY_CHECK} ./test_string_helpers)
|
||||
add_executable(test_string_helpers test_string_helpers.c ../src/string_helpers.c)
|
||||
target_link_libraries (test_string_helpers ${PARODUS_COMMON_LIBS} )
|
||||
# add_test(NAME test_string_helpers COMMAND ${MEMORY_CHECK} ./test_string_helpers)
|
||||
# add_executable(test_string_helpers test_string_helpers.c ../src/string_helpers.c)
|
||||
# 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 ../src/close_retry.c ../src/time.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 ../src/close_retry.c ../src/time.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})
|
||||
#target_link_libraries (test_connection ${PARODUS_COMMON_LIBS} -lcmocka)
|
||||
set(SOURCES test_connection.c ../src/connection.c ${PARODUS_COMMON_SRC})
|
||||
if (ENABLE_CJWT)
|
||||
set(SOURCES ${SOURCES} ../src/token.c)
|
||||
else ()
|
||||
set(SOURCES ${SOURCES} ../src/token_stub.c)
|
||||
endif (ENABLE_CJWT)
|
||||
add_executable(test_connection ${SOURCES})
|
||||
target_link_libraries (test_connection ${PARODUS_CONN_LIBS} ${PARODUS_COMMON_LIBS} -lcmocka)
|
||||
set (CONN_SRC ../src/connection.c
|
||||
../src/string_helpers.c ../src/mutex.c ../src/time.c
|
||||
../src/config.c ../src/auth_token.c ../src/spin_thread.c ../src/heartBeat.c ../src/close_retry.c)
|
||||
#set(CONN_SRC ../src/connection.c ${PARODUS_COMMON_SRC})
|
||||
add_executable(test_connection test_connection.c ${CONN_SRC})
|
||||
target_link_libraries (test_connection ${PARODUS_COMMON_LIBS} -lcmocka -lcurl -luuid)
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
# test_connection - function createNopollConnection
|
||||
#-------------------------------------------------------------------------------
|
||||
add_test(NAME test_createConnection COMMAND ${MEMORY_CHECK} ./test_createConnection)
|
||||
#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_CONN_LIBS} ${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
|
||||
@@ -139,25 +150,25 @@ target_link_libraries (test_createConnection ${PARODUS_CONN_LIBS} ${PARODUS_COMM
|
||||
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})
|
||||
#target_link_libraries (test_client_list ${PARODUS_COMMON_LIBS})
|
||||
set(SOURCES test_client_list.c ../src/client_list.c
|
||||
set(CLIST_SRC test_client_list.c ../src/client_list.c ../src/auth_token.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/downstream.c ../src/connection.c ../src/nopoll_handlers.c ../src/heartBeat.c ../src/close_retry.c
|
||||
../src/ParodusInternal.c ../src/thread_tasks.c ../src/conn_interface.c
|
||||
../src/partners_check.c ${PARODUS_COMMON_SRC})
|
||||
../src/partners_check.c ../src/crud_interface.c ../src/crud_tasks.c ../src/crud_internal.c ${PARODUS_COMMON_SRC})
|
||||
|
||||
if (ENABLE_SESHAT)
|
||||
set(SOURCES ${SOURCES} ../src/seshat_interface.c)
|
||||
set(CLIST_SRC ${CLIST_SRC} ../src/seshat_interface.c)
|
||||
else()
|
||||
set(SOURCES ${SOURCES} ../src/seshat_interface_stub.c)
|
||||
set(CLIST_SRC ${CLIST_SRC} ../src/seshat_interface_stub.c)
|
||||
endif (ENABLE_SESHAT)
|
||||
|
||||
if (ENABLE_CJWT)
|
||||
set(SOURCES ${SOURCES} ../src/token.c)
|
||||
else ()
|
||||
set(SOURCES ${SOURCES} ../src/token_stub.c)
|
||||
endif (ENABLE_CJWT)
|
||||
add_executable(test_client_list ${SOURCES})
|
||||
target_link_libraries (test_client_list ${PARODUS_CONN_LIBS} ${PARODUS_COMMON_LIBS})
|
||||
|
||||
if (ENABLE_WEBCFGBIN)
|
||||
set(CLIST_SRC ${CLIST_SRC} ../src/upstream_rbus.c ../src/xmidtsend_rbus.c)
|
||||
endif (ENABLE_WEBCFGBIN)
|
||||
|
||||
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} -lcurl -luuid)
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
# test_service_alive
|
||||
@@ -165,50 +176,109 @@ target_link_libraries (test_client_list ${PARODUS_CONN_LIBS} ${PARODUS_COMMON_LI
|
||||
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})
|
||||
#target_link_libraries (test_service_alive ${PARODUS_COMMON_LIBS})
|
||||
set(SOURCES 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})
|
||||
set(SVA_SRC test_service_alive.c ../src/client_list.c ../src/service_alive.c ../src/auth_token.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 ../src/close_retry.c ${PARODUS_COMMON_SRC})
|
||||
if (ENABLE_SESHAT)
|
||||
set(SOURCES ${SOURCES} ../src/seshat_interface.c)
|
||||
set(SVA_SRC ${SVA_SRC} ../src/seshat_interface.c)
|
||||
else()
|
||||
set(SOURCES ${SOURCES} ../src/seshat_interface_stub.c)
|
||||
set(SVA_SRC ${SVA_SRC} ../src/seshat_interface_stub.c)
|
||||
endif (ENABLE_SESHAT)
|
||||
|
||||
if (ENABLE_CJWT)
|
||||
set(SOURCES ${SOURCES} ../src/token.c)
|
||||
else ()
|
||||
set(SOURCES ${SOURCES} ../src/token_stub.c)
|
||||
endif (ENABLE_CJWT)
|
||||
add_executable(test_service_alive ${SOURCES})
|
||||
target_link_libraries (test_service_alive ${PARODUS_CONN_LIBS} ${PARODUS_COMMON_LIBS})
|
||||
if (ENABLE_WEBCFGBIN)
|
||||
set(SVA_SRC ${SVA_SRC} ../src/upstream_rbus.c ../src/xmidtsend_rbus.c)
|
||||
endif (ENABLE_WEBCFGBIN)
|
||||
|
||||
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} -lcurl -luuid)
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
# test_config
|
||||
#-------------------------------------------------------------------------------
|
||||
add_test(NAME test_config COMMAND ${MEMORY_CHECK} ./test_config)
|
||||
add_executable(test_config test_config.c ../src/config.c ../src/string_helpers.c)
|
||||
add_executable(test_config test_config.c ../src/config.c ../src/auth_token.c ../src/string_helpers.c)
|
||||
target_link_libraries (test_config -lcmocka
|
||||
-Wl,--no-as-needed -lcimplog
|
||||
-lcjson -ltrower-base64 -lssl -lcrypto -lrt -lm
|
||||
-lcjson -lcjwt -ltrower-base64 -lssl -lcrypto -lrt -lm -lcurl -luuid
|
||||
)
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
# test_auth_token
|
||||
#-------------------------------------------------------------------------------
|
||||
add_test(NAME test_auth_token COMMAND ${MEMORY_CHECK} ./test_auth_token)
|
||||
add_executable(test_auth_token test_auth_token.c ../src/config.c ../src/auth_token.c ../src/string_helpers.c)
|
||||
target_link_libraries (test_auth_token -lcmocka
|
||||
-Wl,--no-as-needed -lcimplog
|
||||
-lcjson -lcjwt -ltrower-base64 -lssl -lcrypto -lrt -lm -lcurl -luuid
|
||||
)
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
# test_auth_token_more
|
||||
#-------------------------------------------------------------------------------
|
||||
add_test(NAME test_auth_token_more COMMAND ${MEMORY_CHECK} ./test_auth_token_more)
|
||||
add_executable(test_auth_token_more test_auth_token_more.c ../src/config.c ../src/auth_token.c ../src/string_helpers.c ../src/config.c)
|
||||
target_link_libraries (test_auth_token_more -lcmocka
|
||||
-Wl,--no-as-needed -lcimplog
|
||||
-lcjson -lcjwt -ltrower-base64 -lssl -lcrypto -lrt -lm -lcurl -luuid
|
||||
)
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
# 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/close_retry.c
|
||||
../src/ParodusInternal.c ../src/string_helpers.c ../src/crud_internal.c ../src/client_list.c)
|
||||
target_link_libraries (test_crud_internal -lcmocka ${PARODUS_COMMON_LIBS} -lcurl -luuid)
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
# test_upstream
|
||||
#-------------------------------------------------------------------------------
|
||||
add_test(NAME test_upstream COMMAND ${MEMORY_CHECK} ./test_upstream)
|
||||
add_executable(test_upstream test_upstream.c ../src/upstream.c ../src/string_helpers.c)
|
||||
target_link_libraries (test_upstream -lcmocka ${PARODUS_COMMON_LIBS} )
|
||||
add_executable(test_upstream test_upstream.c ../src/upstream.c ../src/close_retry.c ../src/string_helpers.c)
|
||||
target_link_libraries (test_upstream -lcmocka gcov -lcunit -lcimplog
|
||||
-lwrp-c -luuid -lpthread -lmsgpackc -lnopoll
|
||||
-Wl,--no-as-needed -lcjson -lcjwt -ltrower-base64
|
||||
-lssl -lcrypto -lrt -lm -lnanomsg)
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
# test_upstream_sock
|
||||
#-------------------------------------------------------------------------------
|
||||
add_test(NAME test_upstream_sock COMMAND ${MEMORY_CHECK} ./test_upstream_sock)
|
||||
add_executable(test_upstream_sock test_upstream_sock.c ../src/upstream.c
|
||||
../src/client_list.c ../src/close_retry.c ../src/string_helpers.c)
|
||||
target_link_libraries (test_upstream_sock -lcmocka gcov -lcunit -lcimplog
|
||||
-lwrp-c -luuid -lpthread -lmsgpackc -lnopoll -lnanomsg
|
||||
-Wl,--no-as-needed -lcjson -lcjwt -ltrower-base64
|
||||
-lssl -lcrypto -lrt -lm)
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
# test_downstream
|
||||
#-------------------------------------------------------------------------------
|
||||
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} )
|
||||
add_executable(test_downstream test_downstream.c ../src/downstream.c ../src/string_helpers.c ../src/config.c)
|
||||
target_link_libraries (test_downstream -lcmocka gcov -lcunit -lcimplog
|
||||
-lwrp-c -luuid -lpthread -lmsgpackc -lnopoll
|
||||
-Wl,--no-as-needed -lcjson -lcjwt -ltrower-base64
|
||||
-lssl -lcrypto -lrt -lm)
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
# 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)
|
||||
add_executable(test_downstream_more test_downstream_more.c ../src/downstream.c ../src/string_helpers.c ../src/config.c)
|
||||
target_link_libraries (test_downstream_more -lcmocka ${PARODUS_COMMON_LIBS} )
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
@@ -222,21 +292,36 @@ 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)
|
||||
set(SOURCES 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/time.c
|
||||
../src/heartBeat.c
|
||||
../src/close_retry.c
|
||||
../src/event_handler.c
|
||||
../src/client_list.c
|
||||
)
|
||||
if (ENABLE_SESHAT)
|
||||
set(SOURCES ${SOURCES} ../src/seshat_interface.c)
|
||||
set(CONIFC_SRC ${CONIFC_SRC} ../src/seshat_interface.c)
|
||||
else()
|
||||
set(SOURCES ${SOURCES} ../src/seshat_interface_stub.c)
|
||||
set(CONIFC_SRC ${CONIFC_SRC} ../src/seshat_interface_stub.c)
|
||||
endif (ENABLE_SESHAT)
|
||||
add_executable(test_conn_interface ${SOURCES})
|
||||
target_link_libraries (test_conn_interface -lcmocka ${PARODUS_COMMON_LIBS} )
|
||||
if (ENABLE_WEBCFGBIN)
|
||||
set(CONIFC_SRC ${CONIFC_SRC} ../src/upstream_rbus.c ../src/xmidtsend_rbus.c)
|
||||
endif (ENABLE_WEBCFGBIN)
|
||||
add_executable(test_conn_interface ${CONIFC_SRC})
|
||||
target_link_libraries (test_conn_interface -lcmocka ${PARODUS_COMMON_LIBS} -lcurl -luuid )
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
# test_ParodusInternal
|
||||
#-------------------------------------------------------------------------------
|
||||
add_test(NAME test_ParodusInternal COMMAND ${MEMORY_CHECK} ./test_ParodusInternal)
|
||||
add_executable(test_ParodusInternal test_ParodusInternal.c ../src/ParodusInternal.c ../src/config.c ../src/string_helpers.c)
|
||||
target_link_libraries (test_ParodusInternal -lcmocka ${PARODUS_COMMON_LIBS} )
|
||||
target_link_libraries (test_ParodusInternal -lcmocka ${PARODUS_COMMON_LIBS} -lcurl -luuid)
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
# test_partners_check
|
||||
@@ -249,24 +334,49 @@ target_link_libraries (test_partners_check -lcmocka ${PARODUS_COMMON_LIBS} -lwrp
|
||||
# test_token - token.c tests
|
||||
#-------------------------------------------------------------------------------
|
||||
add_test(NAME test_token COMMAND ${MEMORY_CHECK} ./test_token)
|
||||
if (ENABLE_CJWT)
|
||||
set(SOURCES test_token.c ../src/token.c ../src/string_helpers.c ../src/config.c)
|
||||
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/auth_token.c
|
||||
../src/thread_tasks.c ../src/time.c
|
||||
../src/string_helpers.c ../src/mutex.c
|
||||
../src/token.c ../src/heartBeat.c
|
||||
../src/close_retry.c ../src/event_handler.c
|
||||
)
|
||||
|
||||
if (ENABLE_SESHAT)
|
||||
set(TOKEN_SRC ${TOKEN_SRC} ../src/seshat_interface.c)
|
||||
else()
|
||||
set(SOURCES test_token_stub.c ../src/token_stub.c)
|
||||
endif (ENABLE_CJWT)
|
||||
add_executable(test_token ${SOURCES} )
|
||||
target_link_libraries (test_token ${PARODUS_COMMON_LIBS} ${PARODUS_JWT_LIBS} -lcmocka )
|
||||
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)
|
||||
|
||||
if (ENABLE_WEBCFGBIN)
|
||||
set(TOKEN_SRC ${TOKEN_SRC} ../src/upstream_rbus.c ../src/xmidtsend_rbus.c)
|
||||
endif (ENABLE_WEBCFGBIN)
|
||||
|
||||
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 -lcurl -luuid)
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
# test_seshat_interface - registerWithSeshat
|
||||
#-------------------------------------------------------------------------------
|
||||
add_test(NAME test_seshat_interface COMMAND ${MEMORY_CHECK} ./test_seshat_interface)
|
||||
if (ENABLE_SESHAT)
|
||||
set(SOURCES test_seshat_interface.c ../src/seshat_interface.c ../src/string_helpers.c)
|
||||
set(SESHIFC_SRC test_seshat_interface.c ../src/seshat_interface.c ../src/string_helpers.c)
|
||||
else()
|
||||
set(SOURCES test_seshat_interface_stub.c ../src/seshat_interface_stub.c)
|
||||
set(SESHIFC_SRC test_seshat_interface_stub.c ../src/seshat_interface_stub.c)
|
||||
endif (ENABLE_SESHAT)
|
||||
add_executable(test_seshat_interface ${SOURCES})
|
||||
add_executable(test_seshat_interface ${SESHIFC_SRC})
|
||||
target_link_libraries (test_seshat_interface -lcmocka ${PARODUS_COMMON_LIBS} -lwrp-c)
|
||||
|
||||
if (INTEGRATION_TESTING)
|
||||
@@ -274,28 +384,28 @@ if (INTEGRATION_TESTING)
|
||||
# simple_connection test
|
||||
#-------------------------------------------------------------------------------
|
||||
add_test(NAME simple_connection COMMAND ${MEMORY_CHECK} ./simple_connection)
|
||||
set(SOURCES simple_connection.c ${PARODUS_COMMON_SRC} ../src/upstream.c ../src/conn_interface.c
|
||||
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(SOURCES ${SOURCES} ../src/seshat_interface.c)
|
||||
set(SIMCON_SRC ${SIMCON_SRC} ../src/seshat_interface.c)
|
||||
else()
|
||||
set(SOURCES ${SOURCES} ../src/seshat_interface_stub.c)
|
||||
set(SIMCON_SRC ${SIMCON_SRC} ../src/seshat_interface_stub.c)
|
||||
endif (ENABLE_SESHAT)
|
||||
add_executable(simple_connection ${SOURCES})
|
||||
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(SOURCES 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
|
||||
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(SOURCES ${SOURCES} ../src/seshat_interface.c)
|
||||
set(SIMPLE_SRC ${SIMPLE_SRC} ../src/seshat_interface.c)
|
||||
else()
|
||||
set(SOURCES ${SOURCES} ../src/seshat_interface_stub.c)
|
||||
set(SIMPLE_SRC ${SIMPLE_SRC} ../src/seshat_interface_stub.c)
|
||||
endif (ENABLE_SESHAT)
|
||||
add_executable(simple ${SOURCES})
|
||||
add_executable(simple ${SIMPLE_SRC})
|
||||
|
||||
target_link_libraries (simple ${PARODUS_CONN_LIBS} ${PARODUS_COMMON_LIBS} gcov -lnopoll -lnanomsg )
|
||||
target_link_libraries (simple ${PARODUS_CONN_LIBS} ${PARODUS_COMMON_LIBS} gcov -lnopoll )
|
||||
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-----
|
||||
@@ -1,403 +0,0 @@
|
||||
/**
|
||||
* 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 <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/wait.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
#include <CUnit/Basic.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
#include <libparodus.h>
|
||||
#include <pthread.h>
|
||||
#include "../src/ParodusInternal.h"
|
||||
|
||||
#define SEND_EVENT_MSGS 1
|
||||
|
||||
//#define TCP_URL(ip) "tcp://" ip
|
||||
|
||||
#define GOOD_CLIENT_URL "tcp://127.0.0.1:6667"
|
||||
//#define PARODUS_URL "ipc:///tmp/parodus_server.ipc"
|
||||
#define GOOD_PARODUS_URL "tcp://127.0.0.1:6666"
|
||||
//#define CLIENT_URL "ipc:///tmp/parodus_client.ipc"
|
||||
|
||||
|
||||
static void initEndKeypressHandler();
|
||||
static void *endKeypressHandlerTask();
|
||||
|
||||
static pthread_t endKeypressThreadId;
|
||||
|
||||
static const char *service_name = "iot";
|
||||
//static const char *service_name = "config";
|
||||
|
||||
static bool no_mock_send_only_test = false;
|
||||
|
||||
static libpd_instance_t test_instance;
|
||||
|
||||
// libparodus functions to be tested
|
||||
extern int flush_wrp_queue (uint32_t delay_ms);
|
||||
extern int connect_receiver (const char *rcv_url);
|
||||
extern int connect_sender (const char *send_url);
|
||||
extern void shutdown_socket (int *sock);
|
||||
|
||||
extern bool is_auth_received (void);
|
||||
extern int libparodus_receive__ (wrp_msg_t **msg, uint32_t ms);
|
||||
|
||||
// libparodus_log functions to be tested
|
||||
extern int get_valid_file_num (const char *file_name, const char *date);
|
||||
extern int get_last_file_num_in_dir (const char *date, const char *log_dir);
|
||||
|
||||
extern const char *wrp_queue_name;
|
||||
extern const char *parodus_url;
|
||||
extern const char *client_url;
|
||||
extern volatile int keep_alive_count;
|
||||
extern volatile int reconnect_count;
|
||||
|
||||
void show_src_dest_payload (char *src, char *dest, void *payload, size_t payload_size)
|
||||
{
|
||||
size_t i;
|
||||
char *payload_str = (char *) payload;
|
||||
printf (" SOURCE: %s\n", src);
|
||||
printf (" DEST : %s\n", dest);
|
||||
printf (" PAYLOAD: ");
|
||||
for (i=0; i<payload_size; i++)
|
||||
putchar (payload_str[i]);
|
||||
putchar ('\n');
|
||||
}
|
||||
|
||||
void show_wrp_req_msg (struct wrp_req_msg *msg)
|
||||
{
|
||||
show_src_dest_payload (msg->source, msg->dest, msg->payload, msg->payload_size);
|
||||
}
|
||||
|
||||
void show_wrp_event_msg (struct wrp_event_msg *msg)
|
||||
{
|
||||
show_src_dest_payload (msg->source, msg->dest, msg->payload, msg->payload_size);
|
||||
}
|
||||
|
||||
void show_wrp_msg (wrp_msg_t *wrp_msg)
|
||||
{
|
||||
printf ("Received WRP Msg type %d\n", wrp_msg->msg_type);
|
||||
if (wrp_msg->msg_type == WRP_MSG_TYPE__REQ) {
|
||||
show_wrp_req_msg (&wrp_msg->u.req);
|
||||
return;
|
||||
}
|
||||
if (wrp_msg->msg_type == WRP_MSG_TYPE__EVENT) {
|
||||
show_wrp_event_msg (&wrp_msg->u.event);
|
||||
return;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
void send_reply (wrp_msg_t *wrp_msg)
|
||||
{
|
||||
size_t i;
|
||||
size_t payload_size = wrp_msg->u.req.payload_size;
|
||||
char *payload = (char *) wrp_msg->u.req.payload;
|
||||
char *temp;
|
||||
// swap source and dest
|
||||
temp = wrp_msg->u.req.source;
|
||||
wrp_msg->u.req.source = wrp_msg->u.req.dest;
|
||||
wrp_msg->u.req.dest = temp;
|
||||
// Alter the payload
|
||||
for (i=0; i<payload_size; i++)
|
||||
payload[i] = tolower (payload[i]);
|
||||
libparodus_send (test_instance, wrp_msg);
|
||||
}
|
||||
|
||||
char *new_str (const char *str)
|
||||
{
|
||||
char *buf = malloc (strlen(str) + 1);
|
||||
if (NULL == buf)
|
||||
return NULL;
|
||||
parStrncpy(buf, str, (strlen(str)+1));
|
||||
return buf;
|
||||
}
|
||||
|
||||
void insert_number_into_buf (char *buf, unsigned num)
|
||||
{
|
||||
char *pos = strrchr (buf, '#');
|
||||
if (NULL == pos)
|
||||
return;
|
||||
while (true) {
|
||||
*pos = (num%10) + '0';
|
||||
num /= 10;
|
||||
if (pos <= buf)
|
||||
break;
|
||||
pos--;
|
||||
if (*pos != '#')
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
int send_event_msg (const char *src, const char *dest,
|
||||
const char *payload, unsigned event_num)
|
||||
{
|
||||
int rtn = 0;
|
||||
char *payload_buf;
|
||||
wrp_msg_t *new_msg;
|
||||
|
||||
#ifndef SEND_EVENT_MSGS
|
||||
return 0;
|
||||
#endif
|
||||
new_msg = malloc (sizeof (wrp_msg_t));
|
||||
if (NULL == new_msg)
|
||||
return -1;
|
||||
printf ("Making event msg\n");
|
||||
new_msg->msg_type = WRP_MSG_TYPE__EVENT;
|
||||
new_msg->u.event.source = new_str (src);
|
||||
new_msg->u.event.dest = new_str (dest);
|
||||
new_msg->u.event.headers = NULL;
|
||||
new_msg->u.event.metadata = NULL;
|
||||
payload_buf = new_str (payload);
|
||||
insert_number_into_buf (payload_buf, event_num);
|
||||
new_msg->u.event.payload = (void*) payload_buf;
|
||||
new_msg->u.event.payload_size = strlen (payload) + 1;
|
||||
printf ("Sending event msg %u\n", event_num);
|
||||
rtn = libparodus_send (test_instance, new_msg);
|
||||
//printf ("Freeing event msg\n");
|
||||
wrp_free_struct (new_msg);
|
||||
//printf ("Freed event msg\n");
|
||||
return rtn;
|
||||
}
|
||||
|
||||
int send_event_msgs (unsigned *msg_num, unsigned *event_num, int count)
|
||||
{
|
||||
int i;
|
||||
unsigned msg_num_mod;
|
||||
|
||||
#ifndef SEND_EVENT_MSGS
|
||||
return 0;
|
||||
#endif
|
||||
if (NULL != msg_num) {
|
||||
(*msg_num)++;
|
||||
msg_num_mod = (*msg_num) % 3;
|
||||
if (msg_num_mod != 0)
|
||||
return 0;
|
||||
}
|
||||
for (i=0; i<count; i++) {
|
||||
(*event_num)++;
|
||||
if (send_event_msg ("---LIBPARODUS---", "---ParodusService---",
|
||||
"---EventMessagePayload####", *event_num) != 0)
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int get_msg_num (const char *msg)
|
||||
{
|
||||
int num = -1;
|
||||
bool found_pound = false;
|
||||
int i;
|
||||
char c;
|
||||
|
||||
for (i=0; (c=msg[i]) != 0; i++)
|
||||
{
|
||||
if (!found_pound) {
|
||||
if (c == '#')
|
||||
found_pound = true;
|
||||
continue;
|
||||
}
|
||||
if ((c>='0') && (c<='9')) {
|
||||
if (num == -1)
|
||||
num = c - '0';
|
||||
else
|
||||
num = 10*num + (c - '0');
|
||||
}
|
||||
}
|
||||
return num;
|
||||
}
|
||||
|
||||
static int flush_queue_count = 0;
|
||||
|
||||
void qfree (void * msg)
|
||||
{
|
||||
flush_queue_count++;
|
||||
free (msg);
|
||||
}
|
||||
|
||||
void delay_ms(unsigned int secs, unsigned int msecs)
|
||||
{
|
||||
struct timespec ts;
|
||||
ts.tv_sec = (time_t) secs;
|
||||
ts.tv_nsec = (long) msecs * 1000000L;
|
||||
nanosleep (&ts, NULL);
|
||||
}
|
||||
|
||||
void dbg_log_err (const char *fmt, ...)
|
||||
{
|
||||
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));
|
||||
}
|
||||
|
||||
void wait_auth_received (void)
|
||||
{
|
||||
if (!is_auth_received ()) {
|
||||
printf ("Waiting for auth received\n");
|
||||
sleep(1);
|
||||
}
|
||||
if (!is_auth_received ()) {
|
||||
printf ("Waiting for auth received\n");
|
||||
sleep(1);
|
||||
}
|
||||
CU_ASSERT (is_auth_received ());
|
||||
}
|
||||
|
||||
void test_send_only (void)
|
||||
{
|
||||
unsigned event_num = 0;
|
||||
|
||||
libpd_cfg_t cfg = {.service_name = service_name,
|
||||
.receive = false, .keepalive_timeout_secs = 0};
|
||||
CU_ASSERT (libparodus_init (&test_instance, &cfg) == 0);
|
||||
CU_ASSERT (send_event_msgs (NULL, &event_num, 10) == 0);
|
||||
CU_ASSERT (libparodus_shutdown (&test_instance) == 0);
|
||||
}
|
||||
|
||||
void test_1(void)
|
||||
{
|
||||
unsigned msgs_received_count = 0;
|
||||
int rtn;
|
||||
wrp_msg_t *wrp_msg;
|
||||
unsigned event_num = 0;
|
||||
unsigned msg_num = 0;
|
||||
libpd_cfg_t cfg = {.service_name = service_name,
|
||||
.receive = true, .keepalive_timeout_secs = 0};
|
||||
|
||||
if (no_mock_send_only_test) {
|
||||
test_send_only ();
|
||||
return;
|
||||
}
|
||||
|
||||
cfg.parodus_url = GOOD_PARODUS_URL;
|
||||
cfg.client_url = GOOD_CLIENT_URL;
|
||||
CU_ASSERT (libparodus_init (&test_instance, &cfg) == 0);
|
||||
printf ("LIBPD_TEST: libparodus_init successful\n");
|
||||
initEndKeypressHandler ();
|
||||
|
||||
wait_auth_received ();
|
||||
|
||||
printf ("LIBPD_TEST: starting msg receive loop\n");
|
||||
while (true) {
|
||||
rtn = libparodus_receive (test_instance, &wrp_msg, 2000);
|
||||
if (rtn == 1) {
|
||||
printf ("LIBPD_TEST: Timed out waiting for msg\n");
|
||||
if (msgs_received_count > 0)
|
||||
if (send_event_msgs (&msg_num, &event_num, 5) != 0)
|
||||
break;
|
||||
continue;
|
||||
}
|
||||
if (rtn != 0)
|
||||
break;
|
||||
show_wrp_msg (wrp_msg);
|
||||
msgs_received_count++;
|
||||
if (wrp_msg->msg_type == WRP_MSG_TYPE__REQ)
|
||||
send_reply (wrp_msg);
|
||||
wrp_free_struct (wrp_msg);
|
||||
if (send_event_msgs (&msg_num, &event_num, 5) != 0)
|
||||
break;
|
||||
}
|
||||
printf ("Messages received %u\n", msgs_received_count);
|
||||
CU_ASSERT (libparodus_shutdown (&test_instance) == 0);
|
||||
}
|
||||
|
||||
/*
|
||||
* @brief To initiate end keypress handler
|
||||
*/
|
||||
static void initEndKeypressHandler()
|
||||
{
|
||||
int err = 0;
|
||||
err = pthread_create(&endKeypressThreadId, NULL, endKeypressHandlerTask, NULL);
|
||||
if (err != 0)
|
||||
{
|
||||
libpd_log (LEVEL_ERROR, "Error creating End Keypress Handler thread\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
printf ("End Keypress handler Thread created successfully\n");
|
||||
printf ("\n--->> Press <Enter> to shutdown the test. ---\n");
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* @brief To handle End Keypress
|
||||
*/
|
||||
static void *endKeypressHandlerTask()
|
||||
{
|
||||
char inbuf[10];
|
||||
memset(inbuf, 0, 10);
|
||||
while (true) {
|
||||
fgets (inbuf, 10, stdin);
|
||||
if ((inbuf[0] != '\n') && (inbuf[0] != '\0')) {
|
||||
printf ("endKeyPressHandler exiting\n");
|
||||
break;
|
||||
}
|
||||
}
|
||||
libparodus_close_receiver (test_instance);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
void add_suites( CU_pSuite *suite )
|
||||
{
|
||||
*suite = CU_add_suite( "libparodus tests", NULL, NULL );
|
||||
CU_add_test( *suite, "Test 1", test_1 );
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* External Functions */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
int main( int argc, char **argv __attribute__((unused)) )
|
||||
{
|
||||
unsigned rv = 1;
|
||||
CU_pSuite suite = NULL;
|
||||
|
||||
if (argc > 1) {
|
||||
const char *arg = argv[1];
|
||||
if ((arg[0] == 's') || (arg[0] == 'S'))
|
||||
no_mock_send_only_test = true;
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
|
||||
if( 0 != rv ) {
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
104
tests/mock_event_handler.c
Normal file
104
tests/mock_event_handler.c
Normal file
@@ -0,0 +1,104 @@
|
||||
/*
|
||||
* If not stated otherwise in this file or this component's Licenses.txt file the
|
||||
* following copyright and licenses apply:
|
||||
*
|
||||
* Copyright 2016 RDK Management
|
||||
* Copyright [2014] [Cisco Systems, Inc.]
|
||||
* 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 is a test version of event_handler.c that can be used
|
||||
* to simulate interface down, interface up event
|
||||
* You overwrite event_handler.c in the src diectory with this
|
||||
* version. It will generate interface down / interface up events
|
||||
* at random intervals between 60 secs and 124 secs
|
||||
*/
|
||||
|
||||
#include "parodus_log.h"
|
||||
#include "event_handler.h"
|
||||
#include "connection.h"
|
||||
#include "config.h"
|
||||
#include "heartBeat.h"
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <pthread.h>
|
||||
#include <unistd.h>
|
||||
#include "time.h"
|
||||
#include "close_retry.h"
|
||||
|
||||
extern bool g_shutdown;
|
||||
|
||||
static pthread_t sysevent_tid;
|
||||
|
||||
static void start_interface_down (void)
|
||||
{
|
||||
set_interface_down_event();
|
||||
ParodusInfo("Interface_down_event is set\n");
|
||||
pause_heartBeatTimer();
|
||||
}
|
||||
|
||||
static void end_interface_down (void)
|
||||
{
|
||||
reset_interface_down_event();
|
||||
ParodusInfo("Interface_down_event is reset\n");
|
||||
resume_heartBeatTimer();
|
||||
set_close_retry();
|
||||
}
|
||||
|
||||
// waits from 60 to 124 secs
|
||||
int wait_random (const char *msg)
|
||||
{
|
||||
#define HALF_SEC 500000l
|
||||
long delay = (random() >> 5) + 60000000l;
|
||||
long secs, usecs;
|
||||
struct timeval timeout;
|
||||
|
||||
secs = delay / 1000000;
|
||||
usecs = delay % 1000000;
|
||||
ParodusInfo ("Waiting %ld secs %ld usecs for %s\n", secs, usecs, msg);
|
||||
|
||||
while (!g_shutdown) {
|
||||
timeout.tv_sec = 0;
|
||||
if (delay <= HALF_SEC) {
|
||||
timeout.tv_usec = delay;
|
||||
select (0, NULL, NULL, NULL, &timeout);
|
||||
return 0;
|
||||
}
|
||||
timeout.tv_usec = HALF_SEC;
|
||||
delay -= HALF_SEC;
|
||||
select (0, NULL, NULL, NULL, &timeout);
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
static void *parodus_sysevent_handler (void *data)
|
||||
{
|
||||
while (!g_shutdown) {
|
||||
if (wait_random ("interface down") != 0)
|
||||
break;
|
||||
start_interface_down ();
|
||||
wait_random ("interface up");
|
||||
end_interface_down ();
|
||||
}
|
||||
ParodusInfo ("Exiting event handler\n");
|
||||
return data;
|
||||
}
|
||||
|
||||
void EventHandler()
|
||||
{
|
||||
ParodusInfo ("RAND_MAX is %ld (0x%lx)\n", RAND_MAX, RAND_MAX);
|
||||
srandom (getpid());
|
||||
|
||||
pthread_create(&sysevent_tid, NULL, parodus_sysevent_handler, NULL);
|
||||
}
|
||||
@@ -1,3 +1,3 @@
|
||||
./parodus --hw-model=TG1682 --hw-serial-number=Fer23u948590 --hw-manufacturer=ARRISGroup,Inc. --hw-mac=aabbccddeeff --hw-last-reboot-reason=unknown --fw-name=TG1682_DEV_master_2016000000sdy --boot-time=123589 --webpa-ping-time=180 --webpa-backoff-max=0 --webpa-inteface-used=p7p1 --webpa-url=fabric-beta.webpa.comcast.net --jwt-algo=none:RS256 --jwt-key=../../tests/webpa-rs256.pem --dns-id=test
|
||||
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-----
|
||||
1
tests/return_failure.bsh
Executable file
1
tests/return_failure.bsh
Executable file
@@ -0,0 +1 @@
|
||||
echo -n FAILURE
|
||||
1
tests/return_ser_mac.bsh
Executable file
1
tests/return_ser_mac.bsh
Executable file
@@ -0,0 +1 @@
|
||||
echo -n SER_MAC $1 $2
|
||||
1
tests/return_success.bsh
Executable file
1
tests/return_success.bsh
Executable file
@@ -0,0 +1 @@
|
||||
echo -n SUCCESS
|
||||
@@ -92,7 +92,7 @@ void test_set_parodus_cfg()
|
||||
CU_ASSERT_STRING_EQUAL(cfg.hw_last_reboot_reason,get_parodus_cfg()->hw_last_reboot_reason);
|
||||
CU_ASSERT_STRING_EQUAL(cfg.fw_name,get_parodus_cfg()->fw_name);
|
||||
CU_ASSERT_STRING_EQUAL(cfg.webpa_url, get_parodus_cfg()->webpa_url);
|
||||
CU_ASSERT_STRING_EQUAL(cfg.webpa_interface_used , get_parodus_cfg()->webpa_interface_used);
|
||||
CU_ASSERT_STRING_EQUAL(cfg.webpa_interface_used , getWebpaInterface());
|
||||
CU_ASSERT_STRING_EQUAL(cfg.webpa_protocol, get_parodus_cfg()->webpa_protocol);
|
||||
CU_ASSERT_EQUAL(cfg.boot_time, get_parodus_cfg()->boot_time);
|
||||
CU_ASSERT_EQUAL(cfg.webpa_ping_timeout, get_parodus_cfg()->webpa_ping_timeout);
|
||||
@@ -113,7 +113,7 @@ void test_getWebpaConveyHeader()
|
||||
CU_ASSERT_STRING_EQUAL(get_parodus_cfg()->hw_manufacturer, cJSON_GetObjectItem(payload, HW_MANUFACTURER)->valuestring);
|
||||
CU_ASSERT_STRING_EQUAL(get_parodus_cfg()->hw_last_reboot_reason, cJSON_GetObjectItem(payload, HW_LAST_REBOOT_REASON)->valuestring);
|
||||
CU_ASSERT_STRING_EQUAL(get_parodus_cfg()->fw_name, cJSON_GetObjectItem(payload, FIRMWARE_NAME)->valuestring);
|
||||
CU_ASSERT_STRING_EQUAL(get_parodus_cfg()->webpa_interface_used, cJSON_GetObjectItem(payload, WEBPA_INTERFACE)->valuestring);
|
||||
CU_ASSERT_STRING_EQUAL(getWebpaInterface(), cJSON_GetObjectItem(payload, WEBPA_INTERFACE)->valuestring);
|
||||
CU_ASSERT_STRING_EQUAL(get_parodus_cfg()->webpa_protocol, cJSON_GetObjectItem(payload, WEBPA_PROTOCOL)->valuestring);
|
||||
CU_ASSERT_EQUAL((int)get_parodus_cfg()->boot_time, cJSON_GetObjectItem(payload, BOOT_TIME)->valueint);
|
||||
|
||||
|
||||
@@ -68,7 +68,7 @@ void test_getWebpaConveyHeader()
|
||||
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 = FLAGS_SECURE;
|
||||
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_true(time_taken_ms >= 0);
|
||||
}
|
||||
|
||||
/*
|
||||
* 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_true(time_taken_ms <= 0);
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* 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);
|
||||
|
||||
435
tests/test_auth_token.c
Normal file
435
tests/test_auth_token.c
Normal file
@@ -0,0 +1,435 @@
|
||||
/**
|
||||
* 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 <CUnit/Basic.h>
|
||||
|
||||
#include "../src/config.h"
|
||||
#include "../src/auth_token.h"
|
||||
#include "../src/ParodusInternal.h"
|
||||
|
||||
extern int requestNewAuthToken(char *newToken, size_t len, int r_count);
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Mocks */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
typedef void CURL;
|
||||
|
||||
typedef enum {
|
||||
CURLINFO_RESPONSE_CODE = 2,
|
||||
CURLINFO_TOTAL_TIME
|
||||
} CURLINFO;
|
||||
|
||||
struct token_data test_data;
|
||||
|
||||
int curl_easy_perform(CURL *curl)
|
||||
{
|
||||
UNUSED(curl);
|
||||
char *msg = "response";
|
||||
int rtn;
|
||||
|
||||
function_called();
|
||||
rtn = (int) mock();
|
||||
if (0 == rtn)
|
||||
write_callback_fn (msg, 1, strlen(msg), &test_data);
|
||||
return rtn;
|
||||
}
|
||||
|
||||
extern int g_response_code;
|
||||
|
||||
void setGlobalResponseCode (int response_code)
|
||||
{
|
||||
g_response_code = response_code;
|
||||
}
|
||||
|
||||
int curl_easy_getinfo(CURL *curl, CURLINFO CURLINFO_RESPONSE_CODE, long response_code)
|
||||
{
|
||||
UNUSED(curl);
|
||||
UNUSED(CURLINFO_RESPONSE_CODE);
|
||||
if (0 != g_response_code)
|
||||
{
|
||||
response_code= g_response_code;
|
||||
ParodusInfo("response_code is %ld\n", response_code);
|
||||
}
|
||||
function_called();
|
||||
return (int) mock();
|
||||
}
|
||||
|
||||
char* get_global_reconnect_reason()
|
||||
{
|
||||
return "none";
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Tests */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
void getAuthToken_Null()
|
||||
{
|
||||
ParodusCfg cfg;
|
||||
memset(&cfg,0,sizeof(cfg));
|
||||
parStrncpy(cfg.hw_mac , "123567892366", sizeof(cfg.hw_mac));
|
||||
cfg.client_cert_path = NULL;
|
||||
getAuthToken(&cfg);
|
||||
set_parodus_cfg(&cfg);
|
||||
assert( cfg.client_cert_path == NULL);
|
||||
assert_int_equal (0, (int) cfg.webpa_auth_token[0]);
|
||||
}
|
||||
|
||||
void getAuthToken_MacNull()
|
||||
{
|
||||
ParodusCfg cfg;
|
||||
memset(&cfg,0,sizeof(cfg));
|
||||
cfg.client_cert_path = NULL;
|
||||
getAuthToken(&cfg);
|
||||
set_parodus_cfg(&cfg);
|
||||
assert( cfg.client_cert_path == NULL);
|
||||
assert_int_equal (0, (int) cfg.webpa_auth_token[0]);
|
||||
}
|
||||
|
||||
#if 0
|
||||
void test_requestNewAuthToken_init_fail ()
|
||||
{
|
||||
char token[32];
|
||||
ParodusCfg cfg;
|
||||
int output = -1;
|
||||
memset(&cfg,0,sizeof(cfg));
|
||||
|
||||
cfg.token_server_url = strdup("https://dev.comcast.net/token");
|
||||
parStrncpy(cfg.cert_path , "/etc/ssl/certs/ca-certificates.crt", sizeof(cfg.cert_path));
|
||||
parStrncpy(cfg.hw_serial_number, "Fer23u948590", sizeof(cfg.hw_serial_number));
|
||||
parStrncpy(cfg.hw_mac , "123567892366", sizeof(cfg.hw_mac));
|
||||
|
||||
set_parodus_cfg(&cfg);
|
||||
|
||||
will_return (curl_easy_perform, -1);
|
||||
expect_function_calls (curl_easy_perform, 1);
|
||||
|
||||
will_return (curl_easy_getinfo, 0);
|
||||
expect_function_calls (curl_easy_getinfo, 1);
|
||||
|
||||
will_return (curl_easy_getinfo, -1);
|
||||
expect_function_calls (curl_easy_getinfo, 1);
|
||||
|
||||
requestNewAuthToken (token, sizeof(token), 2);
|
||||
assert_int_equal (output, -1);
|
||||
free(cfg.token_server_url);
|
||||
}
|
||||
#endif
|
||||
|
||||
void test_requestNewAuthToken_failure ()
|
||||
{
|
||||
char token[32];
|
||||
ParodusCfg cfg;
|
||||
int output = -1;
|
||||
memset(&cfg,0,sizeof(cfg));
|
||||
|
||||
cfg.token_server_url = strdup("https://dev.comcast.net/token");
|
||||
parStrncpy(cfg.cert_path , "/etc/ssl/certs/ca-certificates.crt", sizeof(cfg.cert_path));
|
||||
parStrncpy(cfg.hw_serial_number, "Fer23u948590", sizeof(cfg.hw_serial_number));
|
||||
parStrncpy(cfg.hw_mac , "123567892366", sizeof(cfg.hw_mac));
|
||||
set_parodus_cfg(&cfg);
|
||||
|
||||
test_data.size = 0;
|
||||
test_data.data = token;
|
||||
will_return (curl_easy_perform, -1);
|
||||
expect_function_calls (curl_easy_perform, 1);
|
||||
|
||||
will_return (curl_easy_getinfo, 0);
|
||||
expect_function_calls (curl_easy_getinfo, 1);
|
||||
|
||||
will_return (curl_easy_getinfo, -1);
|
||||
expect_function_calls (curl_easy_getinfo, 1);
|
||||
|
||||
requestNewAuthToken (token, sizeof(token), 2);
|
||||
assert_int_equal (output, -1);
|
||||
assert_int_equal (0, (int) token[0]);
|
||||
free(cfg.token_server_url);
|
||||
}
|
||||
|
||||
|
||||
void test_requestNewAuthToken ()
|
||||
{
|
||||
char token[1024];
|
||||
ParodusCfg cfg;
|
||||
int output = -1;
|
||||
memset(&cfg,0,sizeof(cfg));
|
||||
|
||||
cfg.token_server_url = strdup("https://dev.comcast.net/token");
|
||||
parStrncpy(cfg.cert_path , "/etc/ssl/certs/ca-certificates.crt", sizeof(cfg.cert_path));
|
||||
parStrncpy(cfg.webpa_interface_used , "eth0", sizeof(cfg.webpa_interface_used));
|
||||
parStrncpy(cfg.hw_serial_number, "Fer23u948590", sizeof(cfg.hw_serial_number));
|
||||
parStrncpy(cfg.hw_mac , "123567892366", sizeof(cfg.hw_mac));
|
||||
set_parodus_cfg(&cfg);
|
||||
|
||||
test_data.size = 0;
|
||||
test_data.data = token;
|
||||
setGlobalResponseCode(200);
|
||||
will_return (curl_easy_perform, 0);
|
||||
expect_function_calls (curl_easy_perform, 1);
|
||||
will_return (curl_easy_getinfo, 0);
|
||||
expect_function_calls (curl_easy_getinfo, 1);
|
||||
|
||||
will_return (curl_easy_getinfo, 0);
|
||||
expect_function_calls (curl_easy_getinfo, 1);
|
||||
|
||||
output = requestNewAuthToken (token, sizeof(token), 1);
|
||||
assert_int_equal (output, 0);
|
||||
assert_string_equal (token, "response");
|
||||
free(cfg.token_server_url);
|
||||
}
|
||||
|
||||
void test_getAuthToken ()
|
||||
{
|
||||
ParodusCfg cfg;
|
||||
memset(&cfg,0,sizeof(cfg));
|
||||
|
||||
cfg.token_server_url = strdup("https://dev.comcast.net/token");
|
||||
cfg.client_cert_path = strdup("testcert");
|
||||
parStrncpy(cfg.cert_path , "/etc/ssl/certs/ca-certificates.crt", sizeof(cfg.cert_path));
|
||||
parStrncpy(cfg.webpa_interface_used , "eth0", sizeof(cfg.webpa_interface_used));
|
||||
parStrncpy(cfg.hw_serial_number, "Fer23u948590", sizeof(cfg.hw_serial_number));
|
||||
parStrncpy(cfg.hw_mac , "123567892366", sizeof(cfg.hw_mac));
|
||||
set_parodus_cfg(&cfg);
|
||||
|
||||
/* To test curl failure case and retry on v4 mode */
|
||||
will_return (curl_easy_perform, -1);
|
||||
expect_function_calls (curl_easy_perform, 1);
|
||||
|
||||
will_return (curl_easy_getinfo, 0);
|
||||
expect_function_calls (curl_easy_getinfo, 1);
|
||||
|
||||
will_return (curl_easy_getinfo, 0);
|
||||
expect_function_calls (curl_easy_getinfo, 1);
|
||||
|
||||
/* To test curl failure case and retry on v6 mode */
|
||||
will_return (curl_easy_perform, -1);
|
||||
expect_function_calls (curl_easy_perform, 1);
|
||||
|
||||
will_return (curl_easy_getinfo, 0);
|
||||
expect_function_calls (curl_easy_getinfo, 1);
|
||||
|
||||
will_return (curl_easy_getinfo, 0);
|
||||
expect_function_calls (curl_easy_getinfo, 1);
|
||||
|
||||
/* To test curl success case */
|
||||
test_data.size = 0;
|
||||
test_data.data = cfg.webpa_auth_token;
|
||||
setGlobalResponseCode(200);
|
||||
will_return (curl_easy_perform, 0);
|
||||
expect_function_calls (curl_easy_perform, 1);
|
||||
|
||||
will_return (curl_easy_getinfo, 0);
|
||||
expect_function_calls (curl_easy_getinfo, 1);
|
||||
|
||||
will_return (curl_easy_getinfo, 0);
|
||||
expect_function_calls (curl_easy_getinfo, 1);
|
||||
|
||||
getAuthToken(&cfg);
|
||||
assert_string_equal (cfg.webpa_auth_token, "response");
|
||||
free(cfg.client_cert_path);
|
||||
free(cfg.token_server_url);
|
||||
}
|
||||
|
||||
void test_getAuthTokenFailure ()
|
||||
{
|
||||
ParodusCfg cfg;
|
||||
memset(&cfg,0,sizeof(cfg));
|
||||
|
||||
cfg.token_server_url = strdup("https://dev.comcast.net/token");
|
||||
cfg.client_cert_path = strdup("testcert");
|
||||
parStrncpy(cfg.cert_path , "/etc/ssl/certs/ca-certificates.crt", sizeof(cfg.cert_path));
|
||||
parStrncpy(cfg.webpa_interface_used , "eth0", sizeof(cfg.webpa_interface_used));
|
||||
parStrncpy(cfg.hw_serial_number, "Fer23u948590", sizeof(cfg.hw_serial_number));
|
||||
parStrncpy(cfg.hw_mac , "123567892366", sizeof(cfg.hw_mac));
|
||||
set_parodus_cfg(&cfg);
|
||||
|
||||
will_return (curl_easy_perform, -1);
|
||||
expect_function_calls (curl_easy_perform, 1);
|
||||
|
||||
will_return (curl_easy_getinfo, 0);
|
||||
expect_function_calls (curl_easy_getinfo, 1);
|
||||
|
||||
will_return (curl_easy_getinfo, 0);
|
||||
expect_function_calls (curl_easy_getinfo, 1);
|
||||
|
||||
will_return (curl_easy_perform, -1);
|
||||
expect_function_calls (curl_easy_perform, 1);
|
||||
|
||||
will_return (curl_easy_getinfo, 0);
|
||||
expect_function_calls (curl_easy_getinfo, 1);
|
||||
|
||||
will_return (curl_easy_getinfo, 0);
|
||||
expect_function_calls (curl_easy_getinfo, 1);
|
||||
|
||||
will_return (curl_easy_perform, -1);
|
||||
expect_function_calls (curl_easy_perform, 1);
|
||||
|
||||
will_return (curl_easy_getinfo, 0);
|
||||
expect_function_calls (curl_easy_getinfo, 1);
|
||||
|
||||
will_return (curl_easy_getinfo, 0);
|
||||
expect_function_calls (curl_easy_getinfo, 1);
|
||||
|
||||
getAuthToken(&cfg);
|
||||
|
||||
assert_string_equal( cfg.webpa_auth_token, "");
|
||||
|
||||
free(cfg.client_cert_path);
|
||||
free(cfg.token_server_url);
|
||||
}
|
||||
|
||||
void test_write_callback_fn ()
|
||||
{
|
||||
ParodusCfg *cfg;
|
||||
size_t max_data_size = sizeof (cfg->webpa_auth_token);
|
||||
char *buffer1 = "response1";
|
||||
size_t buf1len = strlen(buffer1);
|
||||
char *buffer2 = "R2";
|
||||
size_t buf2len = strlen(buffer2);
|
||||
char buffer3[max_data_size];
|
||||
int out_len=0;
|
||||
struct token_data data;
|
||||
data.size = 0;
|
||||
|
||||
data.data = (char *) malloc(max_data_size);
|
||||
data.data[0] = '\0';
|
||||
|
||||
out_len = write_callback_fn(buffer1, 1, buf1len, &data);
|
||||
assert_string_equal(data.data, buffer1);
|
||||
assert_int_equal (out_len, buf1len);
|
||||
assert_int_equal (data.size, buf1len);
|
||||
|
||||
out_len = write_callback_fn(buffer2, 1, buf2len, &data);
|
||||
assert_string_equal(data.data, "response1R2");
|
||||
assert_int_equal (out_len, buf2len);
|
||||
assert_int_equal (data.size, buf1len+buf2len);
|
||||
|
||||
memset (buffer3, 'x', max_data_size);
|
||||
out_len = write_callback_fn(buffer3, 1, max_data_size, &data);
|
||||
assert_int_equal (out_len, 0);
|
||||
assert_int_equal (data.size, 0);
|
||||
|
||||
free(data.data);
|
||||
}
|
||||
|
||||
void test_requestNewAuthToken_non200 ()
|
||||
{
|
||||
char token[1024];
|
||||
ParodusCfg cfg;
|
||||
int output;
|
||||
memset(&cfg,0,sizeof(cfg));
|
||||
|
||||
cfg.token_server_url = strdup("https://dev.comcast.net/token");
|
||||
parStrncpy(cfg.cert_path , "/etc/ssl/certs/ca-certificates.crt", sizeof(cfg.cert_path));
|
||||
parStrncpy(cfg.webpa_interface_used , "eth0", sizeof(cfg.webpa_interface_used));
|
||||
parStrncpy(cfg.hw_serial_number, "Fer23u948590", sizeof(cfg.hw_serial_number));
|
||||
parStrncpy(cfg.hw_mac , "123567892366", sizeof(cfg.hw_mac));
|
||||
set_parodus_cfg(&cfg);
|
||||
|
||||
test_data.size = 0;
|
||||
test_data.data = token;
|
||||
setGlobalResponseCode(404);
|
||||
will_return (curl_easy_perform, 0);
|
||||
expect_function_calls (curl_easy_perform, 1);
|
||||
will_return (curl_easy_getinfo, 0);
|
||||
expect_function_calls (curl_easy_getinfo, 1);
|
||||
|
||||
will_return (curl_easy_getinfo, 0);
|
||||
expect_function_calls (curl_easy_getinfo, 1);
|
||||
|
||||
output = requestNewAuthToken (token, sizeof(token), 1);
|
||||
assert_int_equal (output, -1);
|
||||
assert_string_equal (token, "");
|
||||
ParodusInfo("requestNewAuthToken output: %d token empty len: %lu\n", output, strlen(token));
|
||||
free(cfg.token_server_url);
|
||||
}
|
||||
|
||||
void test_getAuthTokenFailure_non200 ()
|
||||
{
|
||||
ParodusCfg cfg;
|
||||
memset(&cfg,0,sizeof(cfg));
|
||||
|
||||
cfg.token_server_url = strdup("https://dev.comcast.net/token");
|
||||
cfg.client_cert_path = strdup("testcert");
|
||||
parStrncpy(cfg.cert_path , "/etc/ssl/certs/ca-certificates.crt", sizeof(cfg.cert_path));
|
||||
parStrncpy(cfg.webpa_interface_used , "eth0", sizeof(cfg.webpa_interface_used));
|
||||
parStrncpy(cfg.hw_serial_number, "Fer23u948590", sizeof(cfg.hw_serial_number));
|
||||
parStrncpy(cfg.hw_mac , "123567892366", sizeof(cfg.hw_mac));
|
||||
set_parodus_cfg(&cfg);
|
||||
|
||||
will_return (curl_easy_perform, 0);
|
||||
expect_function_calls (curl_easy_perform, 1);
|
||||
|
||||
will_return (curl_easy_getinfo, 0);
|
||||
expect_function_calls (curl_easy_getinfo, 1);
|
||||
|
||||
will_return (curl_easy_getinfo, 0);
|
||||
expect_function_calls (curl_easy_getinfo, 1);
|
||||
|
||||
will_return (curl_easy_perform, 0);
|
||||
expect_function_calls (curl_easy_perform, 1);
|
||||
|
||||
will_return (curl_easy_getinfo, 0);
|
||||
expect_function_calls (curl_easy_getinfo, 1);
|
||||
|
||||
will_return (curl_easy_getinfo, 0);
|
||||
expect_function_calls (curl_easy_getinfo, 1);
|
||||
|
||||
will_return (curl_easy_perform, 0);
|
||||
expect_function_calls (curl_easy_perform, 1);
|
||||
|
||||
will_return (curl_easy_getinfo, 0);
|
||||
expect_function_calls (curl_easy_getinfo, 1);
|
||||
|
||||
will_return (curl_easy_getinfo, 0);
|
||||
expect_function_calls (curl_easy_getinfo, 1);
|
||||
setGlobalResponseCode(504);
|
||||
getAuthToken(&cfg);
|
||||
|
||||
assert_string_equal( cfg.webpa_auth_token, "");
|
||||
|
||||
free(cfg.client_cert_path);
|
||||
free(cfg.token_server_url);
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* External Functions */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
int main(void)
|
||||
{
|
||||
const struct CMUnitTest tests[] = {
|
||||
cmocka_unit_test(test_write_callback_fn),
|
||||
cmocka_unit_test(test_requestNewAuthToken),
|
||||
// cmocka_unit_test(test_requestNewAuthToken_init_fail),
|
||||
cmocka_unit_test(test_requestNewAuthToken_failure),
|
||||
cmocka_unit_test(getAuthToken_Null),
|
||||
cmocka_unit_test(getAuthToken_MacNull),
|
||||
cmocka_unit_test(test_getAuthToken),
|
||||
cmocka_unit_test(test_getAuthTokenFailure),
|
||||
cmocka_unit_test(test_requestNewAuthToken_non200),
|
||||
cmocka_unit_test(test_getAuthTokenFailure_non200)
|
||||
};
|
||||
|
||||
return cmocka_run_group_tests(tests, NULL, NULL);
|
||||
}
|
||||
116
tests/test_auth_token_more.c
Normal file
116
tests/test_auth_token_more.c
Normal file
@@ -0,0 +1,116 @@
|
||||
/**
|
||||
* 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 <CUnit/Basic.h>
|
||||
|
||||
#include "../src/config.h"
|
||||
#include "../src/auth_token.h"
|
||||
#include "../src/ParodusInternal.h"
|
||||
|
||||
extern int requestNewAuthToken(char *newToken, size_t len, int r_count);
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Mocks */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
typedef void CURL;
|
||||
|
||||
typedef enum {
|
||||
CURLINFO_RESPONSE_CODE = 2,
|
||||
CURLINFO_TOTAL_TIME
|
||||
} CURLINFO;
|
||||
|
||||
struct token_data test_data;
|
||||
|
||||
CURL *curl_easy_init ()
|
||||
{
|
||||
function_called();
|
||||
return (CURL *) mock();
|
||||
}
|
||||
|
||||
int curl_easy_perform(CURL *curl)
|
||||
{
|
||||
UNUSED(curl);
|
||||
char *msg = "response";
|
||||
int rtn;
|
||||
|
||||
function_called();
|
||||
rtn = (int) mock();
|
||||
if (0 == rtn)
|
||||
write_callback_fn (msg, 1, strlen(msg), &test_data);
|
||||
return rtn;
|
||||
}
|
||||
|
||||
int curl_easy_getinfo(CURL *curl, CURLINFO CURLINFO_RESPONSE_CODE, long response_code)
|
||||
{
|
||||
UNUSED(curl);
|
||||
UNUSED(CURLINFO_RESPONSE_CODE);
|
||||
UNUSED(response_code);
|
||||
function_called();
|
||||
return (int) mock();
|
||||
}
|
||||
|
||||
char* get_global_reconnect_reason()
|
||||
{
|
||||
return "none";
|
||||
}
|
||||
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Tests */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
void test_requestNewAuthToken_init_fail ()
|
||||
{
|
||||
char token[32];
|
||||
ParodusCfg cfg;
|
||||
int output = -1;
|
||||
memset(&cfg,0,sizeof(cfg));
|
||||
|
||||
cfg.token_server_url = strdup("https://dev.comcast.net/token");
|
||||
parStrncpy(cfg.cert_path , "/etc/ssl/certs/ca-certificates.crt", sizeof(cfg.cert_path));
|
||||
parStrncpy(cfg.hw_serial_number, "Fer23u948590", sizeof(cfg.hw_serial_number));
|
||||
parStrncpy(cfg.hw_mac , "123567892366", sizeof(cfg.hw_mac));
|
||||
|
||||
set_parodus_cfg(&cfg);
|
||||
|
||||
will_return (curl_easy_init, NULL);
|
||||
expect_function_calls (curl_easy_init, 1);
|
||||
|
||||
requestNewAuthToken (token, sizeof(token), 2);
|
||||
assert_int_equal (output, -1);
|
||||
assert_int_equal (0, (int) token[0]);
|
||||
free(cfg.token_server_url);
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* External Functions */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
int main(void)
|
||||
{
|
||||
const struct CMUnitTest tests[] = {
|
||||
cmocka_unit_test(test_requestNewAuthToken_init_fail)
|
||||
};
|
||||
|
||||
return cmocka_run_group_tests(tests, NULL, NULL);
|
||||
}
|
||||
@@ -26,9 +26,14 @@
|
||||
#define TEST_CLIENT1_URL "tcp://127.0.0.1:6677"
|
||||
#define TEST_CLIENT2_URL "tcp://127.0.0.1:6655"
|
||||
|
||||
pthread_t test_tid;
|
||||
pthread_t test_tid2;
|
||||
|
||||
static void *client_rcv_task();
|
||||
static void *client2_rcv_task();
|
||||
|
||||
int numLoops;
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Tests */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
@@ -58,7 +63,7 @@ void test_client_addtolist()
|
||||
ParodusPrint("decoded service_name:%s\n", message->u.reg.service_name);
|
||||
ParodusPrint("decoded dest:%s\n", message->u.reg.url);
|
||||
|
||||
StartThread(client_rcv_task);
|
||||
StartThread(client_rcv_task, &test_tid);
|
||||
|
||||
status = addToList(&message);
|
||||
ParodusPrint("addToList status is %d\n", status);
|
||||
@@ -73,7 +78,7 @@ void test_client_addtolist()
|
||||
CU_ASSERT_STRING_EQUAL( temp->service_name, message->u.reg.service_name );
|
||||
CU_ASSERT_STRING_EQUAL( temp->url, message->u.reg.url );
|
||||
}
|
||||
|
||||
release_global_node ();
|
||||
wrp_free_struct(message);
|
||||
free(bytes);
|
||||
ParodusInfo("test_client_addtolist done..\n");
|
||||
@@ -189,7 +194,7 @@ void test_addtolist_multiple_clients()
|
||||
ParodusPrint("decoded service_name:%s\n", message->u.reg.service_name);
|
||||
ParodusPrint("decoded dest:%s\n", message->u.reg.url);
|
||||
|
||||
StartThread(client2_rcv_task);
|
||||
StartThread(client2_rcv_task, &test_tid2);
|
||||
|
||||
status = addToList(&message);
|
||||
ParodusPrint("addToList status is %d\n", status);
|
||||
@@ -206,7 +211,7 @@ void test_addtolist_multiple_clients()
|
||||
CU_ASSERT_STRING_EQUAL( temp->url, message->u.reg.url );
|
||||
|
||||
}
|
||||
|
||||
release_global_node ();
|
||||
wrp_free_struct(message);
|
||||
free(bytes);
|
||||
ParodusInfo("test_addtolist_multiple_clients done..\n");
|
||||
|
||||
93
tests/test_close_retry.c
Normal file
93
tests/test_close_retry.c
Normal file
@@ -0,0 +1,93 @@
|
||||
/**
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
#include <stdarg.h>
|
||||
#include <stddef.h>
|
||||
#include <setjmp.h>
|
||||
#include <cmocka.h>
|
||||
#include <pthread.h>
|
||||
|
||||
#include "../src/close_retry.h"
|
||||
#include "../src/parodus_log.h"
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Tests */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
void test_close_retry() {
|
||||
/* get close_retry initial value */
|
||||
bool close_retry =false;
|
||||
close_retry = get_close_retry();
|
||||
ParodusInfo("close_retry initial value is: %d\n", close_retry);
|
||||
assert_int_equal(close_retry, 0);
|
||||
|
||||
/* set close_retry value and check whether its returning modified value or not*/
|
||||
set_close_retry();
|
||||
close_retry = get_close_retry();
|
||||
ParodusInfo("close_retry modified to: %d\n", close_retry);
|
||||
assert_int_equal(close_retry,1);
|
||||
|
||||
/* reset close_retry */
|
||||
reset_close_retry();
|
||||
close_retry = get_close_retry();
|
||||
ParodusInfo("close_retry reset to: %d\n", close_retry);
|
||||
assert_int_equal(close_retry,0);
|
||||
}
|
||||
|
||||
void *test_mutex_set_close_retry() {
|
||||
set_close_retry();
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void *test_mutex_reset_close_retry() {
|
||||
reset_close_retry();
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void test_mutex_close_retry() {
|
||||
bool close_retry;
|
||||
pthread_t thread[3];
|
||||
|
||||
pthread_create(&thread[0], NULL, test_mutex_set_close_retry, NULL);
|
||||
pthread_create(&thread[1], NULL, test_mutex_set_close_retry, NULL);
|
||||
|
||||
pthread_join(thread[0], NULL);
|
||||
pthread_join(thread[1], NULL);
|
||||
|
||||
/* After execution of threads check the value of close_retry */
|
||||
close_retry = get_close_retry();
|
||||
ParodusInfo("Threads execution is completed, close_retry is: %d\n", close_retry);
|
||||
assert_int_equal(close_retry, 1);
|
||||
|
||||
pthread_create(&thread[2], NULL, test_mutex_reset_close_retry, NULL);
|
||||
pthread_join(thread[2], NULL);
|
||||
|
||||
close_retry = get_close_retry();
|
||||
ParodusInfo("close_retry reset to: %d\n", close_retry);
|
||||
assert_int_equal(close_retry, 0);
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* External Functions */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
int main(void)
|
||||
{
|
||||
const struct CMUnitTest tests[] = {
|
||||
cmocka_unit_test(test_close_retry),
|
||||
cmocka_unit_test(test_mutex_close_retry)
|
||||
};
|
||||
|
||||
return cmocka_run_group_tests(tests, NULL, NULL);
|
||||
}
|
||||
@@ -25,8 +25,20 @@
|
||||
#include <CUnit/Basic.h>
|
||||
|
||||
#include "../src/config.h"
|
||||
#include "../src/auth_token.h"
|
||||
#include "../src/ParodusInternal.h"
|
||||
#define K_argc 18
|
||||
|
||||
extern int parse_mac_address (char *target, const char *arg);
|
||||
extern int parse_serial_num(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 int parse_webpa_url (const char *full_url,
|
||||
char **server_addr, unsigned int *port);
|
||||
extern unsigned int get_algo_mask (const char *algo_str);
|
||||
extern unsigned int parse_num_arg (const char *arg, const char *arg_name);
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Mocks */
|
||||
@@ -41,6 +53,12 @@ void create_token_script(char *fname)
|
||||
sprintf(command, "chmod +x %s",fname);
|
||||
system(command);
|
||||
}
|
||||
|
||||
char* get_global_reconnect_reason()
|
||||
{
|
||||
return "none";
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Tests */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
@@ -57,22 +75,27 @@ void test_setParodusConfig()
|
||||
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_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 , "comcast", sizeof(cfg.partner_id));
|
||||
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 = FLAGS_SECURE;
|
||||
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);
|
||||
@@ -81,7 +104,7 @@ void test_setParodusConfig()
|
||||
assert_string_equal(cfg.hw_last_reboot_reason, temp->hw_last_reboot_reason);
|
||||
assert_string_equal(cfg.webpa_path_url, temp->webpa_path_url);
|
||||
assert_string_equal(cfg.webpa_url, temp->webpa_url);
|
||||
assert_string_equal(cfg.webpa_interface_used, temp->webpa_interface_used);
|
||||
assert_string_equal(cfg.webpa_interface_used, getWebpaInterface());
|
||||
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);
|
||||
@@ -92,6 +115,15 @@ void test_setParodusConfig()
|
||||
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);
|
||||
|
||||
free(cfg.crud_config_file);
|
||||
}
|
||||
|
||||
void test_getParodusConfig()
|
||||
@@ -107,43 +139,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;
|
||||
#ifndef ENABLE_SESHAT
|
||||
argc = argc - 1;
|
||||
char expectedToken[1280] = {'\0'};
|
||||
#ifdef FEATURE_DNS_QUERY
|
||||
const char *jwt_key = "AGdyuwyhwl2ow2ydsoioiygkshwdthuwd";
|
||||
#endif
|
||||
char * command[argc+1];
|
||||
int i = 0;
|
||||
char expectedToken[128] = {'\0'};
|
||||
|
||||
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-interface-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";
|
||||
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
|
||||
command[i++] = "--seshat-url=ipc://127.0.0.1:7777";
|
||||
"--seshat-url=ipc://127.0.0.1:7777",
|
||||
#endif
|
||||
command[i++] = "--force-ipv4";
|
||||
command[i++] = "--force-ipv6";
|
||||
command[i++] = "--webpa-token=/tmp/token.sh";
|
||||
command[i] = '\0';
|
||||
"--force-ipv4",
|
||||
"--force-ipv6",
|
||||
"--boot-time-retry-wait=10",
|
||||
"--ssl-cert-path=/etc/ssl/certs/ca-certificates.crt",
|
||||
"--client-cert-path=testcert",
|
||||
"--token-server-url=https://dev.comcast.net/token",
|
||||
#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));
|
||||
#ifdef FEATURE_DNS_QUERY
|
||||
write_key_to_file ("../../tests/jwt_key.tst", jwt_key);
|
||||
#endif
|
||||
create_token_script("/tmp/token.sh");
|
||||
parseCommandLine(argc,command,&parodusCfg);
|
||||
|
||||
assert_int_equal (parseCommandLine(argc,command,&parodusCfg), 0);
|
||||
assert_string_equal( parodusCfg.hw_model, "TG1682");
|
||||
assert_string_equal( parodusCfg.hw_serial_number, "Fer23u948590");
|
||||
assert_string_equal( parodusCfg.hw_manufacturer, "ARRISGroup,Inc.");
|
||||
@@ -151,8 +221,9 @@ void test_parseCommandLine()
|
||||
assert_string_equal( parodusCfg.hw_last_reboot_reason, "unknown");
|
||||
assert_string_equal( parodusCfg.fw_name, "TG1682_DEV_master_2016000000sdy");
|
||||
assert_int_equal( (int) parodusCfg.webpa_ping_timeout,180);
|
||||
assert_int_equal( (int) parodusCfg.boot_retry_wait,10);
|
||||
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");
|
||||
@@ -161,42 +232,82 @@ void test_parseCommandLine()
|
||||
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);
|
||||
assert_string_equal( parodusCfg.webpa_token,expectedToken);
|
||||
|
||||
|
||||
set_parodus_cfg(&parodusCfg);
|
||||
getAuthToken(&parodusCfg);
|
||||
assert_string_equal( get_parodus_cfg()->webpa_auth_token,expectedToken);
|
||||
assert_string_equal( parodusCfg.cert_path,"/etc/ssl/certs/ca-certificates.crt");
|
||||
assert_string_equal( parodusCfg.client_cert_path,"testcert");
|
||||
assert_string_equal( parodusCfg.token_server_url,"https://dev.comcast.net/token");
|
||||
#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_int_equal( (int) parodusCfg.boot_retry_wait, 10);
|
||||
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;
|
||||
#ifndef ENABLE_SESHAT
|
||||
argc = argc - 1;
|
||||
#endif
|
||||
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;
|
||||
Cfg = (ParodusCfg*)malloc(sizeof(ParodusCfg));
|
||||
ParodusCfg *Cfg = NULL;
|
||||
char protocol[32] = {'\0'};
|
||||
Cfg = (ParodusCfg*)malloc(sizeof(ParodusCfg));
|
||||
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));
|
||||
@@ -205,13 +316,25 @@ void test_loadParodusCfg()
|
||||
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_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->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");
|
||||
Cfg->client_cert_path = strdup("testcert");
|
||||
Cfg->token_server_url = strdup("https://dev.comcast.net/token");
|
||||
memset(&tmpcfg,0,sizeof(ParodusCfg));
|
||||
loadParodusCfg(Cfg,&tmpcfg);
|
||||
|
||||
@@ -222,6 +345,27 @@ void test_loadParodusCfg()
|
||||
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);
|
||||
assert_string_equal(tmpcfg.client_cert_path, "testcert");
|
||||
assert_string_equal(tmpcfg.token_server_url, "https://dev.comcast.net/token");
|
||||
#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.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(tmpcfg.client_cert_path);
|
||||
free(tmpcfg.token_server_url);
|
||||
free(tmpcfg.crud_config_file);
|
||||
|
||||
free(Cfg->crud_config_file);
|
||||
free(Cfg->client_cert_path);
|
||||
free(Cfg->token_server_url);
|
||||
free(Cfg);
|
||||
}
|
||||
|
||||
@@ -238,11 +382,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.flags,FLAGS_SECURE);
|
||||
assert_int_equal( (int) temp.flags,0);
|
||||
assert_string_equal( temp.webpa_path_url, WEBPA_PATH_URL);
|
||||
assert_string_equal( temp.webpa_uuid,"1234567-345456546");
|
||||
assert_string_equal( temp.local_url, PARODUS_UPSTREAM);
|
||||
|
||||
assert_null(temp.crud_config_file);
|
||||
free(cfg);
|
||||
}
|
||||
|
||||
@@ -270,10 +414,174 @@ void test_parodusGitVersion()
|
||||
}
|
||||
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");
|
||||
assert_string_equal(cfg->cloud_status, CLOUD_STATUS_OFFLINE);
|
||||
|
||||
free(cfg);
|
||||
}
|
||||
|
||||
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_parse_serial_num()
|
||||
{
|
||||
char result[14];
|
||||
assert_int_equal (parse_serial_num (result, "1234ABC00ab"), 0);
|
||||
assert_int_equal (parse_serial_num (result, "$@@"), 0);
|
||||
assert_int_equal (parse_serial_num (result, ""), 0);
|
||||
}
|
||||
|
||||
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");
|
||||
assert_int_equal (parse_webpa_url__ ("https://[2001:558:fc18:2:f816:3eff:fe7f:6efa]:8080",
|
||||
addr_buf, 80, port_buf, 8), 0);
|
||||
assert_string_equal (addr_buf, "2001:558:fc18:2:f816:3eff:fe7f:6efa");
|
||||
assert_string_equal (port_buf, "8080");
|
||||
assert_int_equal (parse_webpa_url__ ("https://[2001:558:fc18:2:f816:3eff:fe7f:6efa]",
|
||||
addr_buf, 80, port_buf, 8), 0);
|
||||
assert_string_equal (addr_buf, "2001:558:fc18:2:f816:3eff:fe7f:6efa");
|
||||
assert_string_equal (port_buf, "443");
|
||||
assert_int_equal (parse_webpa_url__ ("http://[2001:558:fc18:2:f816:3eff:fe7f:6efa]:8080",
|
||||
addr_buf, 80, port_buf, 8), 1);
|
||||
assert_string_equal (addr_buf, "2001:558:fc18:2:f816:3eff:fe7f:6efa");
|
||||
assert_string_equal (port_buf, "8080");
|
||||
assert_int_equal (parse_webpa_url__ ("http://[2001:558:fc18:2:f816:3eff:fe7f:6efa]",
|
||||
addr_buf, 80, port_buf, 8), 1);
|
||||
assert_string_equal (addr_buf, "2001:558:fc18:2:f816:3eff:fe7f:6efa");
|
||||
assert_string_equal (port_buf, "80");
|
||||
assert_int_equal (parse_webpa_url__ ("http://2001:558:fc18:2:f816:3eff:fe7f:6efa]",
|
||||
addr_buf, 80, port_buf, 8), -1);
|
||||
assert_int_equal (parse_webpa_url__ ("http://[2001:558:fc18:2:f816:3eff:fe7f:6efa",
|
||||
addr_buf, 80, port_buf, 8), -1);
|
||||
assert_int_equal (parse_webpa_url__ ("[2001:558:fc18:2:f816:3eff:fe7f:6efa",
|
||||
addr_buf, 80, port_buf, 8), -1);
|
||||
assert_int_equal (parse_webpa_url__ ("https://[2001:558:fc18:2:f816:3eff:fe7f:6efa]:8080/api/v2/",
|
||||
addr_buf, 80, port_buf, 8), 0);
|
||||
assert_string_equal (addr_buf, "2001:558:fc18:2:f816:3eff:fe7f:6efa");
|
||||
assert_string_equal (port_buf, "8080");
|
||||
|
||||
}
|
||||
|
||||
void test_parse_webpa_url ()
|
||||
{
|
||||
char *addr;
|
||||
unsigned int port;
|
||||
assert_int_equal (parse_webpa_url ("mydns.mycom.net:8080",
|
||||
&addr, &port), -1);
|
||||
assert_int_equal (parse_webpa_url ("https://mydns.mycom.net:8080",
|
||||
&addr, &port), 0);
|
||||
assert_string_equal (addr, "mydns.mycom.net");
|
||||
assert_int_equal (port, 8080);
|
||||
free (addr);
|
||||
assert_int_equal (parse_webpa_url ("https://mydns.mycom.net/",
|
||||
&addr, &port), 0);
|
||||
assert_string_equal (addr, "mydns.mycom.net");
|
||||
assert_int_equal (port, 443);
|
||||
free (addr);
|
||||
assert_int_equal (parse_webpa_url ("http://mydns.mycom.net:8080",
|
||||
&addr, &port), 1);
|
||||
assert_string_equal (addr, "mydns.mycom.net");
|
||||
assert_int_equal (port, 8080);
|
||||
free (addr);
|
||||
assert_int_equal (parse_webpa_url ("http://mydns.mycom.net",
|
||||
&addr, &port), 1);
|
||||
assert_string_equal (addr, "mydns.mycom.net");
|
||||
assert_int_equal (port, 80);
|
||||
free(addr);
|
||||
}
|
||||
|
||||
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 */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
@@ -286,10 +594,19 @@ 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_parse_serial_num),
|
||||
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_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_parodusGitVersion),
|
||||
cmocka_unit_test(test_setDefaultValuesToCfg),
|
||||
cmocka_unit_test(err_setDefaultValuesToCfg),
|
||||
};
|
||||
|
||||
return cmocka_run_group_tests(tests, NULL, NULL);
|
||||
|
||||
@@ -27,21 +27,41 @@
|
||||
#include "../src/conn_interface.h"
|
||||
#include "../src/connection.h"
|
||||
#include "../src/config.h"
|
||||
#include "../src/heartBeat.h"
|
||||
#include "../src/close_retry.h"
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* File Scoped Variables */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
static char *reconnect_reason = "webpa_process_starts";
|
||||
UpStreamMsg *UpStreamMsgQ;
|
||||
ParodusMsg *ParodusMsgQ;
|
||||
extern bool close_retry;
|
||||
extern pthread_mutex_t close_mut;
|
||||
extern volatile unsigned int heartBeatTimer;
|
||||
pthread_mutex_t g_mutex=PTHREAD_MUTEX_INITIALIZER;
|
||||
pthread_cond_t g_cond=PTHREAD_COND_INITIALIZER;
|
||||
pthread_mutex_t nano_mut=PTHREAD_MUTEX_INITIALIZER;
|
||||
pthread_cond_t nano_con=PTHREAD_COND_INITIALIZER;
|
||||
pthread_mutex_t svc_mut=PTHREAD_MUTEX_INITIALIZER;
|
||||
pthread_cond_t svc_con=PTHREAD_COND_INITIALIZER;
|
||||
int numLoops;
|
||||
parodusOnPingStatusChangeHandler on_ping_status_change;
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Mocks */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
int createNopollConnection(noPollCtx *ctx)
|
||||
void set_server_list_null (server_list_t *server_list)
|
||||
{
|
||||
UNUSED(ctx);
|
||||
UNUSED(server_list);
|
||||
}
|
||||
|
||||
int find_servers (server_list_t *server_list)
|
||||
{
|
||||
UNUSED(server_list);
|
||||
return FIND_SUCCESS;
|
||||
}
|
||||
|
||||
int createNopollConnection(noPollCtx *ctx, server_list_t *server_list)
|
||||
{
|
||||
UNUSED(ctx); UNUSED(server_list);
|
||||
function_called();
|
||||
return (int) mock();
|
||||
}
|
||||
@@ -51,7 +71,10 @@ void nopoll_log_set_handler (noPollCtx *ctx, noPollLogHandler handler, noPollPtr
|
||||
UNUSED(ctx); UNUSED(handler); UNUSED(user_data);
|
||||
function_called();
|
||||
}
|
||||
|
||||
int cloud_status_is_online (void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
void __report_log (noPollCtx * ctx, noPollDebugLevel level, const char * log_msg, noPollPtr user_data)
|
||||
{
|
||||
UNUSED(ctx); UNUSED(level); UNUSED(log_msg); UNUSED(user_data);
|
||||
@@ -67,12 +90,79 @@ noPollMutexUnlock mutex_unlock
|
||||
UNUSED(mutex_create); UNUSED(mutex_destroy); UNUSED(mutex_lock); UNUSED(mutex_unlock);
|
||||
function_called();
|
||||
}
|
||||
|
||||
char *get_global_reconnect_reason()
|
||||
{
|
||||
return reconnect_reason;
|
||||
}
|
||||
|
||||
char *get_global_shutdown_reason()
|
||||
{
|
||||
return SHUTDOWN_REASON_PARODUS_STOP;
|
||||
}
|
||||
|
||||
void set_global_shutdown_reason(char *reason)
|
||||
{
|
||||
UNUSED(reason);
|
||||
}
|
||||
|
||||
int getDeviceId(char **device_id, size_t *device_id_len)
|
||||
{
|
||||
UNUSED(device_id); UNUSED(device_id_len);
|
||||
return 0;
|
||||
}
|
||||
void start_conn_in_progress (unsigned long start_time)
|
||||
{
|
||||
UNUSED(start_time);
|
||||
}
|
||||
|
||||
void stop_conn_in_progress (void)
|
||||
{
|
||||
}
|
||||
|
||||
void reset_interface_down_event (void)
|
||||
{
|
||||
}
|
||||
|
||||
bool get_interface_down_event (void)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
void set_interface_down_event (void)
|
||||
{
|
||||
}
|
||||
|
||||
int wait_while_interface_down (void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
void terminate_backoff_delay (void)
|
||||
{
|
||||
}
|
||||
|
||||
void packMetaData()
|
||||
{
|
||||
function_called();
|
||||
}
|
||||
|
||||
int get_parodus_init()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
int get_cloud_disconnect_time(void)
|
||||
{
|
||||
function_called();
|
||||
return (int) (intptr_t)mock();
|
||||
}
|
||||
|
||||
void set_cloud_disconnect_time(int Time)
|
||||
{
|
||||
UNUSED(Time);
|
||||
function_called();
|
||||
}
|
||||
|
||||
void *handle_upstream()
|
||||
{
|
||||
@@ -89,9 +179,21 @@ void *messageHandlerTask()
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void *serviceAliveTask()
|
||||
int serviceAliveTask()
|
||||
{
|
||||
return NULL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int validate_partner_id(wrp_msg_t *msg, partners_t **partnerIds)
|
||||
{
|
||||
UNUSED(msg); UNUSED(partnerIds);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int sendUpstreamMsgToServer(void **resp_bytes, size_t resp_size)
|
||||
{
|
||||
UNUSED(resp_bytes); UNUSED(resp_size);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int nopoll_loop_wait(noPollCtx * ctx,long timeout)
|
||||
@@ -107,12 +209,25 @@ void set_global_reconnect_reason(char *reason)
|
||||
function_called();
|
||||
}
|
||||
|
||||
void close_and_unref_connection(noPollConn *conn)
|
||||
void set_global_reconnect_status(bool status)
|
||||
{
|
||||
UNUSED(conn);
|
||||
(void)status;
|
||||
function_called();
|
||||
}
|
||||
|
||||
void close_and_unref_connection(noPollConn *conn, bool is_shutting_down)
|
||||
{
|
||||
UNUSED(conn); UNUSED(is_shutting_down);
|
||||
function_called();
|
||||
}
|
||||
|
||||
int readFromFile(const char *file_name, char **data)
|
||||
{
|
||||
UNUSED(file_name);
|
||||
*data = strdup ("parodus_stopping");
|
||||
return 1;
|
||||
}
|
||||
|
||||
void nopoll_cleanup_library ()
|
||||
{
|
||||
function_called();
|
||||
@@ -136,12 +251,18 @@ void set_global_conn(noPollConn *conn)
|
||||
function_called();
|
||||
}
|
||||
|
||||
void StartThread(void *(*start_routine) (void *))
|
||||
void StartThread(void *(*start_routine) (void *), pthread_t *threadId)
|
||||
{
|
||||
UNUSED(start_routine);
|
||||
UNUSED(threadId);
|
||||
function_called();
|
||||
}
|
||||
|
||||
void JoinThread (pthread_t threadId)
|
||||
{
|
||||
UNUSED(threadId);
|
||||
}
|
||||
|
||||
noPollCtx* nopoll_ctx_new(void)
|
||||
{
|
||||
function_called();
|
||||
@@ -151,6 +272,51 @@ 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;
|
||||
}
|
||||
|
||||
pthread_cond_t *get_global_svc_con(void)
|
||||
{
|
||||
return &svc_con;
|
||||
}
|
||||
|
||||
pthread_mutex_t *get_global_svc_mut(void)
|
||||
{
|
||||
return &svc_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,10 +326,7 @@ void test_createSocketConnection()
|
||||
noPollCtx *ctx;
|
||||
ParodusCfg cfg;
|
||||
memset(&cfg,0,sizeof(ParodusCfg));
|
||||
|
||||
pthread_mutex_lock (&close_mut);
|
||||
close_retry = false;
|
||||
pthread_mutex_unlock (&close_mut);
|
||||
reset_close_retry();
|
||||
expect_function_call(nopoll_thread_handlers);
|
||||
|
||||
will_return(nopoll_ctx_new, (intptr_t)&ctx);
|
||||
@@ -173,13 +336,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);
|
||||
@@ -190,17 +354,16 @@ 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()
|
||||
{
|
||||
numLoops =0;
|
||||
noPollCtx *ctx;
|
||||
ParodusCfg cfg;
|
||||
memset(&cfg,0, sizeof(ParodusCfg));
|
||||
pthread_mutex_lock (&close_mut);
|
||||
close_retry = true;
|
||||
pthread_mutex_unlock (&close_mut);
|
||||
set_close_retry();
|
||||
expect_function_call(nopoll_thread_handlers);
|
||||
|
||||
will_return(nopoll_ctx_new, (intptr_t)&ctx);
|
||||
@@ -210,7 +373,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);
|
||||
|
||||
@@ -225,12 +388,12 @@ 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()
|
||||
{
|
||||
numLoops = 6;
|
||||
noPollCtx *ctx;
|
||||
ParodusCfg cfg;
|
||||
memset(&cfg,0,sizeof(ParodusCfg));
|
||||
@@ -245,11 +408,10 @@ void test_createSocketConnection2()
|
||||
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.webpa_ping_timeout = 1;
|
||||
|
||||
pthread_mutex_lock (&close_mut);
|
||||
close_retry = false;
|
||||
pthread_mutex_unlock (&close_mut);
|
||||
//Max ping timeout is 6 sec
|
||||
cfg.webpa_ping_timeout = 6;
|
||||
set_parodus_cfg(&cfg);
|
||||
reset_close_retry();
|
||||
expect_function_call(nopoll_thread_handlers);
|
||||
|
||||
will_return(nopoll_ctx_new, (intptr_t)&ctx);
|
||||
@@ -259,7 +421,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);
|
||||
@@ -268,9 +431,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);
|
||||
@@ -281,15 +445,14 @@ 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;
|
||||
pthread_mutex_unlock (&close_mut);
|
||||
heartBeatTimer = 0;
|
||||
numLoops =0;
|
||||
set_close_retry();
|
||||
reset_heartBeatTimer();
|
||||
expect_function_call(nopoll_thread_handlers);
|
||||
|
||||
will_return(nopoll_ctx_new, (intptr_t)NULL);
|
||||
@@ -299,7 +462,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);
|
||||
|
||||
@@ -314,7 +477,55 @@ 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);
|
||||
}
|
||||
|
||||
|
||||
void test_createSocketConnection_cloud_disconn()
|
||||
{
|
||||
numLoops =0;
|
||||
ParodusCfg cfg;
|
||||
memset(&cfg,0,sizeof(ParodusCfg));
|
||||
cfg.cloud_disconnect = strdup("XPC");
|
||||
set_parodus_cfg(&cfg);
|
||||
|
||||
set_close_retry();
|
||||
reset_heartBeatTimer();
|
||||
expect_function_call(nopoll_thread_handlers);
|
||||
|
||||
will_return(nopoll_ctx_new, (intptr_t)NULL);
|
||||
expect_function_call(nopoll_ctx_new);
|
||||
expect_function_call(nopoll_log_set_handler);
|
||||
will_return(createNopollConnection, nopoll_true);
|
||||
expect_function_call(createNopollConnection);
|
||||
expect_function_call(packMetaData);
|
||||
|
||||
expect_function_calls(StartThread, 5);
|
||||
will_return(nopoll_loop_wait, 1);
|
||||
expect_function_call(nopoll_loop_wait);
|
||||
|
||||
will_return(get_global_conn, (intptr_t)NULL);
|
||||
expect_function_call(get_global_conn);
|
||||
expect_function_call(close_and_unref_connection);
|
||||
expect_function_call(set_global_conn);
|
||||
|
||||
|
||||
expect_function_call(set_cloud_disconnect_time);
|
||||
will_return(get_cloud_disconnect_time, 0);
|
||||
expect_function_call(get_cloud_disconnect_time);
|
||||
will_return(get_cloud_disconnect_time, 0);
|
||||
expect_function_call(get_cloud_disconnect_time);
|
||||
will_return(get_cloud_disconnect_time, 0);
|
||||
expect_function_call(get_cloud_disconnect_time);
|
||||
|
||||
will_return(createNopollConnection, nopoll_true);
|
||||
expect_function_call(createNopollConnection);
|
||||
will_return(get_global_conn, (intptr_t)NULL);
|
||||
expect_function_call(get_global_conn);
|
||||
expect_function_call(close_and_unref_connection);
|
||||
expect_function_call(nopoll_ctx_unref);
|
||||
expect_function_call(nopoll_cleanup_library);
|
||||
createSocketConnection(NULL);
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
@@ -326,8 +537,9 @@ 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),
|
||||
cmocka_unit_test(test_createSocketConnection_cloud_disconn)
|
||||
};
|
||||
|
||||
return cmocka_run_group_tests(tests, NULL, NULL);
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
401
tests/test_crud_interface.c
Normal file
401
tests/test_crud_interface.c
Normal file
@@ -0,0 +1,401 @@
|
||||
/**
|
||||
* 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 */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
bool g_shutdown = false;
|
||||
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();
|
||||
}
|
||||
|
||||
char* getWebpaInterface(void)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* 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);
|
||||
}
|
||||
3029
tests/test_crud_internal.c
Normal file
3029
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);
|
||||
@@ -53,6 +61,21 @@ reg_list_item_t * get_global_node(void)
|
||||
return mock_ptr_type(reg_list_item_t *);
|
||||
}
|
||||
|
||||
void release_global_node (void)
|
||||
{
|
||||
}
|
||||
void addToCloudAckQ(char *transaction_id, int qos, int rdr)
|
||||
{
|
||||
(void)transaction_id;
|
||||
(void)qos;
|
||||
(void)rdr;
|
||||
return;
|
||||
}
|
||||
bool highQosValueCheck(int qos)
|
||||
{
|
||||
(void)qos;
|
||||
return false;
|
||||
}
|
||||
ssize_t wrp_to_struct( const void *bytes, const size_t length,
|
||||
const enum wrp_format fmt, wrp_msg_t **msg )
|
||||
{
|
||||
@@ -60,13 +83,22 @@ 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);
|
||||
parStrncpy((*msg)->u.req.dest,"mac:1122334455/iot", 100);
|
||||
parStrncpy((*msg)->u.req.partner_ids->partner_ids[0],"comcast", 64);
|
||||
(*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 = (char *) malloc(sizeof(char) *40);
|
||||
parStrncpy ((*msg)->u.crud.source, "tag-update", 40);
|
||||
(*msg)->u.crud.transaction_uuid = (char *) malloc(sizeof(char) *40);
|
||||
parStrncpy ((*msg)->u.crud.transaction_uuid, "1234", 40);
|
||||
}
|
||||
return (ssize_t) mock();
|
||||
}
|
||||
|
||||
@@ -189,6 +221,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 +251,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);
|
||||
|
||||
@@ -58,7 +58,7 @@ static test_t tests[] = {
|
||||
|
||||
.r.msg_type = WRP_MSG_TYPE__CREATE,
|
||||
.r.u.crud.transaction_uuid = "c2bb1f16-09c8-11e7-93ae-92361f002671",
|
||||
.r.u.crud.source = "fake-client1",
|
||||
.r.u.crud.source = "fake-client1/iot",
|
||||
.r.u.crud.dest = "fake-server1",
|
||||
.r.u.crud.partner_ids = NULL,
|
||||
.r.u.crud.headers = NULL,
|
||||
@@ -88,7 +88,7 @@ static test_t tests[] = {
|
||||
|
||||
.r.msg_type = WRP_MSG_TYPE__RETREIVE,
|
||||
.r.u.crud.transaction_uuid = "c2bb1f16-09c8-11e7-93ae-92361f002671",
|
||||
.r.u.crud.source = "fake-client2",
|
||||
.r.u.crud.source = "fake-client2/iot",
|
||||
.r.u.crud.dest = "fake-server2",
|
||||
.r.u.crud.partner_ids = NULL,
|
||||
.r.u.crud.headers = NULL,
|
||||
@@ -118,7 +118,7 @@ static test_t tests[] = {
|
||||
|
||||
.r.msg_type = WRP_MSG_TYPE__UPDATE,
|
||||
.r.u.crud.transaction_uuid = "c2bb1f16-09c8-11e7-93ae-92361f002671",
|
||||
.r.u.crud.source = "fake-client3",
|
||||
.r.u.crud.source = "fake-client3/iot",
|
||||
.r.u.crud.dest = "fake-server3",
|
||||
.r.u.crud.partner_ids = NULL,
|
||||
.r.u.crud.headers = NULL,
|
||||
@@ -148,7 +148,7 @@ static test_t tests[] = {
|
||||
|
||||
.r.msg_type = WRP_MSG_TYPE__DELETE,
|
||||
.r.u.crud.transaction_uuid = "c2bb1f16-09c8-11e7-93ae-92361f002671",
|
||||
.r.u.crud.source = "fake-client4",
|
||||
.r.u.crud.source = "fake-client4/iot",
|
||||
.r.u.crud.dest = "fake-server4",
|
||||
.r.u.crud.partner_ids = NULL,
|
||||
.r.u.crud.headers = NULL,
|
||||
@@ -180,12 +180,32 @@ 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;
|
||||
}
|
||||
|
||||
void addToCloudAckQ(char *transaction_id, int qos, int rdr)
|
||||
{
|
||||
(void)transaction_id;
|
||||
(void)qos;
|
||||
(void)rdr;
|
||||
return;
|
||||
}
|
||||
|
||||
bool highQosValueCheck(int qos)
|
||||
{
|
||||
(void)qos;
|
||||
return false;
|
||||
}
|
||||
|
||||
ssize_t wrp_to_struct( const void *bytes, const size_t length, const enum wrp_format fmt,
|
||||
wrp_msg_t **msg )
|
||||
{
|
||||
@@ -208,7 +228,8 @@ ssize_t wrp_to_struct( const void *bytes, const size_t length, const enum wrp_fo
|
||||
|
||||
ssize_t wrp_struct_to( const wrp_msg_t *msg, const enum wrp_format fmt, void **bytes )
|
||||
{
|
||||
(void) 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);
|
||||
@@ -237,6 +258,10 @@ reg_list_item_t *get_global_node(void)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void release_global_node (void)
|
||||
{
|
||||
}
|
||||
|
||||
void wrp_free_struct( wrp_msg_t *msg )
|
||||
{
|
||||
if( WRP_MSG_TYPE__EVENT == tests[i].s.msg_type ) {
|
||||
|
||||
93
tests/test_heartBeatTimer.c
Normal file
93
tests/test_heartBeatTimer.c
Normal file
@@ -0,0 +1,93 @@
|
||||
/**
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
#include <stdarg.h>
|
||||
#include <stddef.h>
|
||||
#include <setjmp.h>
|
||||
#include <cmocka.h>
|
||||
#include <pthread.h>
|
||||
|
||||
#include "../src/heartBeat.h"
|
||||
#include "../src/parodus_log.h"
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Tests */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
void test_heartBeatTimer() {
|
||||
/* get heartBeat timer's initial value */
|
||||
unsigned int heartBeatTimer =5;
|
||||
heartBeatTimer = get_heartBeatTimer();
|
||||
ParodusInfo("heartBeatTimer initial vaule is: %d\n", heartBeatTimer);
|
||||
assert_int_equal(heartBeatTimer, 0);
|
||||
|
||||
/* increment heartbeat timer value and check whether its returning modified value or not*/
|
||||
unsigned int inc_time_ms =5;
|
||||
increment_heartBeatTimer(inc_time_ms);
|
||||
heartBeatTimer = get_heartBeatTimer();
|
||||
ParodusInfo("heartBeatTimer incremented to: %d\n", heartBeatTimer);
|
||||
assert_int_equal(heartBeatTimer,5);
|
||||
|
||||
/* reset heartBeat timer to 0 */
|
||||
reset_heartBeatTimer();
|
||||
heartBeatTimer = get_heartBeatTimer();
|
||||
ParodusInfo("heartBeatTimer reset to: %d\n", heartBeatTimer);
|
||||
assert_int_equal(heartBeatTimer,0);
|
||||
}
|
||||
|
||||
void *test_mutexIncrementTimer() {
|
||||
unsigned int inc_time_ms =5;
|
||||
increment_heartBeatTimer(inc_time_ms);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void *test_mutexResetTimer() {
|
||||
reset_heartBeatTimer();
|
||||
return NULL;
|
||||
}
|
||||
void test_mutexHeartBeatTimer() {
|
||||
unsigned int heartBeatTimer;
|
||||
pthread_t thread[3];
|
||||
|
||||
pthread_create(&thread[0], NULL, test_mutexIncrementTimer, NULL);
|
||||
pthread_create(&thread[1], NULL, test_mutexIncrementTimer, NULL);
|
||||
|
||||
pthread_join(thread[0], NULL);
|
||||
pthread_join(thread[1], NULL);
|
||||
|
||||
/* After execution of both the threads check the value of timer */
|
||||
heartBeatTimer = get_heartBeatTimer();
|
||||
ParodusInfo("Threads execution is completed, heartBeatTimer is: %d\n", heartBeatTimer);
|
||||
assert_int_equal(heartBeatTimer, 10);
|
||||
|
||||
pthread_create(&thread[2], NULL, test_mutexResetTimer, NULL);
|
||||
pthread_join(thread[2], NULL);
|
||||
|
||||
heartBeatTimer = get_heartBeatTimer();
|
||||
ParodusInfo("heartBeatTimer reset to: %d\n", heartBeatTimer);
|
||||
assert_int_equal(heartBeatTimer, 0);
|
||||
}
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* External Functions */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
int main(void)
|
||||
{
|
||||
const struct CMUnitTest tests[] = {
|
||||
cmocka_unit_test(test_heartBeatTimer),
|
||||
cmocka_unit_test(test_mutexHeartBeatTimer),
|
||||
};
|
||||
|
||||
return cmocka_run_group_tests(tests, NULL, NULL);
|
||||
}
|
||||
@@ -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 )
|
||||
|
||||
@@ -21,16 +21,18 @@
|
||||
#include <nopoll_private.h>
|
||||
#include <pthread.h>
|
||||
|
||||
#include "../src/ParodusInternal.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;
|
||||
bool interface_down_event = false;
|
||||
int closeReason = 0;
|
||||
pthread_mutex_t interface_down_mut=PTHREAD_MUTEX_INITIALIZER;
|
||||
pthread_cond_t interface_down_con=PTHREAD_COND_INITIALIZER;
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Mocks */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
@@ -40,6 +42,34 @@ void set_global_reconnect_reason(char *reason)
|
||||
(void) reason;
|
||||
}
|
||||
|
||||
bool get_global_reconnect_status()
|
||||
{
|
||||
return LastReasonStatus;
|
||||
}
|
||||
|
||||
void set_interface_down_event()
|
||||
{
|
||||
interface_down_event = true;
|
||||
}
|
||||
|
||||
void reset_interface_down_event()
|
||||
{
|
||||
pthread_mutex_lock (&interface_down_mut);
|
||||
interface_down_event = false;
|
||||
pthread_cond_signal(&interface_down_con);
|
||||
pthread_mutex_unlock (&interface_down_mut);
|
||||
}
|
||||
|
||||
bool get_interface_down_event()
|
||||
{
|
||||
return interface_down_event;
|
||||
}
|
||||
|
||||
void set_global_reconnect_status(bool status)
|
||||
{
|
||||
(void) status ;
|
||||
}
|
||||
|
||||
const unsigned char *nopoll_msg_get_payload(noPollMsg *msg)
|
||||
{
|
||||
if( NULL != msg ) {
|
||||
@@ -59,12 +89,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 +161,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);
|
||||
@@ -153,6 +198,30 @@ void test_listenerOnPingMessage()
|
||||
listenerOnPingMessage(NULL, NULL, NULL, NULL);
|
||||
}
|
||||
|
||||
void test_getInterfaceDownEvent()
|
||||
{
|
||||
set_interface_down_event();
|
||||
CU_ASSERT_TRUE(get_interface_down_event());
|
||||
}
|
||||
|
||||
void test_interfaceDownEvent()
|
||||
{
|
||||
char str[] = "SSL_Socket_Close";
|
||||
set_global_reconnect_status(true);
|
||||
set_interface_down_event();
|
||||
listenerOnCloseMessage(NULL, NULL, (noPollPtr) str);
|
||||
|
||||
}
|
||||
|
||||
void test_noInterfaceDownEvent()
|
||||
{
|
||||
char str[] = "SSL_Socket_Close";
|
||||
set_global_reconnect_status(true);
|
||||
reset_interface_down_event();
|
||||
listenerOnCloseMessage(NULL, NULL, (noPollPtr) str);
|
||||
}
|
||||
|
||||
|
||||
void add_suites( CU_pSuite *suite )
|
||||
{
|
||||
ParodusInfo("--------Start of Test Cases Execution ---------\n");
|
||||
@@ -160,6 +229,9 @@ void add_suites( CU_pSuite *suite )
|
||||
CU_add_test( *suite, "Test 1", test_listenerOnMessage_queue );
|
||||
CU_add_test( *suite, "Test 2", test_listenerOnCloseMessage );
|
||||
CU_add_test( *suite, "Test 3", test_listenerOnPingMessage );
|
||||
CU_add_test( *suite, "Test 4", test_getInterfaceDownEvent );
|
||||
CU_add_test( *suite, "Test 5", test_interfaceDownEvent );
|
||||
CU_add_test( *suite, "Test 6", test_noInterfaceDownEvent );
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
139
tests/test_nopoll_handlers_fragment.c
Normal file
139
tests/test_nopoll_handlers_fragment.c
Normal file
@@ -0,0 +1,139 @@
|
||||
/**
|
||||
* 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 */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
bool LastReasonStatus;
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Mocks */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
void set_global_reconnect_reason(char *reason)
|
||||
{
|
||||
(void) reason;
|
||||
}
|
||||
|
||||
bool get_global_reconnect_status()
|
||||
{
|
||||
return LastReasonStatus;
|
||||
}
|
||||
|
||||
bool get_interface_down_event()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
@@ -16,12 +16,17 @@
|
||||
|
||||
#include <stdarg.h>
|
||||
#include <stddef.h>
|
||||
#include <stdbool.h>
|
||||
#include <setjmp.h>
|
||||
#include <cmocka.h>
|
||||
#include <nopoll.h>
|
||||
|
||||
#include "../src/parodus_log.h"
|
||||
#include "../src/nopoll_helpers.h"
|
||||
#include "../src/config.h"
|
||||
#include <cjwt/cjwt.h>
|
||||
#include "../src/connection.h"
|
||||
#include "../src/ParodusInternal.h"
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Macros */
|
||||
@@ -31,7 +36,8 @@
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* File Scoped Variables */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
static noPollConn *conn;
|
||||
static noPollConn *conn = NULL;
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Mocks */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
@@ -96,6 +102,32 @@ 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();
|
||||
}
|
||||
|
||||
bool get_interface_down_event()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Tests */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
@@ -186,13 +218,7 @@ void test_sendMessage()
|
||||
{
|
||||
int len = strlen("Hello Parodus!");
|
||||
|
||||
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);
|
||||
get_parodus_cfg()->cloud_status = CLOUD_STATUS_ONLINE;
|
||||
|
||||
expect_value(__nopoll_conn_send_common, (intptr_t)conn, (intptr_t)conn);
|
||||
expect_value(__nopoll_conn_send_common, length, len);
|
||||
@@ -202,18 +228,21 @@ void test_sendMessage()
|
||||
sendMessage(conn, "Hello Parodus!", len);
|
||||
}
|
||||
|
||||
void test_sendMessageOffline()
|
||||
{
|
||||
int len = strlen("Hello Parodus!");
|
||||
|
||||
get_parodus_cfg()->cloud_status = CLOUD_STATUS_OFFLINE;
|
||||
sendMessage(conn, "Hello Parodus!", len);
|
||||
|
||||
}
|
||||
|
||||
void err_sendMessage()
|
||||
{
|
||||
int len = strlen("Hello Parodus!");
|
||||
|
||||
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);
|
||||
|
||||
get_parodus_cfg()->cloud_status = CLOUD_STATUS_ONLINE;
|
||||
|
||||
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-2);
|
||||
@@ -231,10 +260,13 @@ void err_sendMessageConnNull()
|
||||
{
|
||||
int len = strlen("Hello Parodus!");
|
||||
|
||||
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);
|
||||
|
||||
get_parodus_cfg()->cloud_status = CLOUD_STATUS_ONLINE;
|
||||
|
||||
expect_value(__nopoll_conn_send_common, (intptr_t)conn, NULL);
|
||||
expect_value(__nopoll_conn_send_common, length, len);
|
||||
will_return(__nopoll_conn_send_common, len);
|
||||
expect_function_calls(__nopoll_conn_send_common, 1);
|
||||
|
||||
sendMessage(NULL, "Hello Parodus!", len);
|
||||
}
|
||||
|
||||
@@ -258,6 +290,7 @@ int main(void)
|
||||
cmocka_unit_test(err_sendResponseFlushWrites),
|
||||
cmocka_unit_test(err_sendResponseConnNull),
|
||||
cmocka_unit_test(test_sendMessage),
|
||||
cmocka_unit_test(test_sendMessageOffline),
|
||||
cmocka_unit_test(err_sendMessage),
|
||||
cmocka_unit_test(err_sendMessageConnNull),
|
||||
cmocka_unit_test(test_reportLog),
|
||||
|
||||
@@ -43,7 +43,26 @@ ParodusCfg *get_parodus_cfg(void)
|
||||
|
||||
void test_validate_partner_id_for_req()
|
||||
{
|
||||
static partners_t partner_ids = {1,{"comcast"}};
|
||||
static partners_t partner_ids = {3,{"shaw","","comcast"}};
|
||||
wrp_msg_t *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.partner_ids = &partner_ids;
|
||||
|
||||
ParodusCfg cfg;
|
||||
memset(&cfg, 0, sizeof(ParodusCfg));
|
||||
parStrncpy(cfg.partner_id, "shaw,bar,comcast", sizeof(cfg.partner_id));
|
||||
|
||||
will_return(get_parodus_cfg, (intptr_t)&cfg);
|
||||
expect_function_call(get_parodus_cfg);
|
||||
int ret = validate_partner_id(msg, NULL);
|
||||
assert_int_equal(ret, 1);
|
||||
free(msg);
|
||||
}
|
||||
|
||||
void test_validate_partner_id_for_req_case_insensitive()
|
||||
{
|
||||
static partners_t partner_ids = {2,{"Shaw","Comcast"}};
|
||||
wrp_msg_t *msg = (wrp_msg_t*) malloc(sizeof(wrp_msg_t));
|
||||
memset(msg, 0, sizeof(wrp_msg_t));
|
||||
msg->msg_type = WRP_MSG_TYPE__REQ;
|
||||
@@ -68,7 +87,7 @@ void test_validate_partner_id_for_req_listNULL()
|
||||
|
||||
ParodusCfg cfg;
|
||||
memset(&cfg, 0, sizeof(ParodusCfg));
|
||||
parStrncpy(cfg.partner_id, "comcast", sizeof(cfg.partner_id));
|
||||
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 +122,7 @@ void err_validate_partner_id_for_req()
|
||||
|
||||
ParodusCfg cfg;
|
||||
memset(&cfg, 0, sizeof(ParodusCfg));
|
||||
parStrncpy(cfg.partner_id, "comcast", sizeof(cfg.partner_id));
|
||||
parStrncpy(cfg.partner_id, "*,,comcast", sizeof(cfg.partner_id));
|
||||
|
||||
will_return(get_parodus_cfg, (intptr_t)&cfg);
|
||||
expect_function_call(get_parodus_cfg);
|
||||
@@ -114,7 +133,7 @@ void err_validate_partner_id_for_req()
|
||||
|
||||
void test_validate_partner_id_for_event()
|
||||
{
|
||||
static partners_t partner_ids = {1,{"comcast"}};
|
||||
static partners_t partner_ids = {4,{"shaw","","*","comcast"}};
|
||||
wrp_msg_t *msg = (wrp_msg_t*) malloc(sizeof(wrp_msg_t));
|
||||
memset(msg, 0, sizeof(wrp_msg_t));
|
||||
msg->msg_type = WRP_MSG_TYPE__EVENT;
|
||||
@@ -122,7 +141,29 @@ void test_validate_partner_id_for_event()
|
||||
|
||||
ParodusCfg cfg;
|
||||
memset(&cfg, 0, sizeof(ParodusCfg));
|
||||
parStrncpy(cfg.partner_id, "comcast", sizeof(cfg.partner_id));
|
||||
parStrncpy(cfg.partner_id, "abc,*,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);
|
||||
free(list);
|
||||
free(msg);
|
||||
}
|
||||
|
||||
void test_validate_partner_id_for_event_case_insensitive()
|
||||
{
|
||||
static partners_t partner_ids = {1,{"Comcast"}};
|
||||
wrp_msg_t *msg = (wrp_msg_t*) malloc(sizeof(wrp_msg_t));
|
||||
memset(msg, 0, sizeof(wrp_msg_t));
|
||||
msg->msg_type = WRP_MSG_TYPE__EVENT;
|
||||
msg->u.event.partner_ids = &partner_ids;
|
||||
|
||||
ParodusCfg cfg;
|
||||
memset(&cfg, 0, sizeof(ParodusCfg));
|
||||
parStrncpy(cfg.partner_id, "*,comcast", sizeof(cfg.partner_id));
|
||||
|
||||
will_return(get_parodus_cfg, (intptr_t)&cfg);
|
||||
expect_function_call(get_parodus_cfg);
|
||||
@@ -218,10 +259,12 @@ int main(void)
|
||||
{
|
||||
const struct CMUnitTest tests[] = {
|
||||
cmocka_unit_test(test_validate_partner_id_for_req),
|
||||
cmocka_unit_test(test_validate_partner_id_for_req_case_insensitive),
|
||||
cmocka_unit_test(test_validate_partner_id_for_req_listNULL),
|
||||
cmocka_unit_test(test_validate_partner_id_for_req_withoutId),
|
||||
cmocka_unit_test(err_validate_partner_id_for_req),
|
||||
cmocka_unit_test(test_validate_partner_id_for_event),
|
||||
cmocka_unit_test(test_validate_partner_id_for_event_case_insensitive),
|
||||
cmocka_unit_test(test_validate_partner_id_for_event_listNULL),
|
||||
cmocka_unit_test(test_validate_partner_id_for_event_withoutId),
|
||||
cmocka_unit_test(err_validate_partner_id_for_event),
|
||||
|
||||
@@ -32,12 +32,35 @@ static void *client_rcv_task();
|
||||
static void *keep_alive_thread();
|
||||
static void add_client();
|
||||
int sock1;
|
||||
int numLoops;
|
||||
pthread_t threadId;
|
||||
pthread_mutex_t crud_mut=PTHREAD_MUTEX_INITIALIZER;
|
||||
pthread_cond_t crud_con=PTHREAD_COND_INITIALIZER;
|
||||
|
||||
pthread_cond_t *get_global_crud_con(void)
|
||||
{
|
||||
return &crud_con;
|
||||
}
|
||||
|
||||
pthread_mutex_t *get_global_crud_mut(void)
|
||||
{
|
||||
return &crud_mut;
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Tests */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
void addCRUDmsgToQueue(wrp_msg_t *crudMsg)
|
||||
{
|
||||
(void)crudMsg;
|
||||
return;
|
||||
}
|
||||
|
||||
void *CRUDHandlerTask()
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void add_client()
|
||||
{
|
||||
@@ -45,6 +68,7 @@ static void add_client()
|
||||
.u.reg.service_name = "service_client",
|
||||
.u.reg.url = TEST_SERVICE_URL};
|
||||
|
||||
pthread_t test_tid;
|
||||
void *bytes;
|
||||
int size =0;
|
||||
int rv;
|
||||
@@ -62,7 +86,7 @@ static void add_client()
|
||||
ParodusPrint("decoded service_name:%s\n", message->u.reg.service_name);
|
||||
ParodusPrint("decoded dest:%s\n", message->u.reg.url);
|
||||
|
||||
StartThread(client_rcv_task);
|
||||
StartThread(client_rcv_task, &test_tid);
|
||||
status = addToList(&message);
|
||||
ParodusPrint("addToList status is %d\n", status);
|
||||
|
||||
@@ -114,13 +138,21 @@ static void *client_rcv_task()
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void handler(int signum)
|
||||
{
|
||||
UNUSED(signum);
|
||||
pthread_exit(NULL);
|
||||
}
|
||||
|
||||
static void *keep_alive_thread()
|
||||
{
|
||||
//ParodusPrint("keep_alive threadId is %d\n", threadId);
|
||||
sleep(2);
|
||||
ParodusPrint("Starting serviceAliveTask..\n");
|
||||
serviceAliveTask();
|
||||
while (true) {
|
||||
serviceAliveTask();
|
||||
sleep (30);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -144,9 +176,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 )
|
||||
{
|
||||
@@ -156,9 +189,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
|
||||
@@ -187,7 +220,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 );
|
||||
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
@@ -50,21 +50,6 @@ ParodusCfg *get_parodus_cfg(void)
|
||||
return &g_config;
|
||||
}
|
||||
|
||||
void loadParodusCfg(ParodusCfg *config, ParodusCfg *cfg)
|
||||
{
|
||||
UNUSED(config); UNUSED(cfg);
|
||||
}
|
||||
|
||||
void parseCommandLine(int argc,char **argv, ParodusCfg *cfg)
|
||||
{
|
||||
UNUSED(argc); UNUSED(argv); UNUSED(cfg);
|
||||
}
|
||||
|
||||
void set_parodus_cfg(ParodusCfg *cfg)
|
||||
{
|
||||
UNUSED(cfg);
|
||||
}
|
||||
|
||||
int init_lib_seshat (const char *url)
|
||||
{
|
||||
UNUSED(url);
|
||||
|
||||
@@ -23,6 +23,8 @@
|
||||
#include "../src/ParodusInternal.h"
|
||||
#include "../src/spin_thread.h"
|
||||
|
||||
pthread_t test_tid;
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Mocks */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
@@ -54,7 +56,7 @@ void *_routine(void *v)
|
||||
|
||||
void test_StartThread_error()
|
||||
{
|
||||
StartThread(&_routine);
|
||||
StartThread(&_routine, &test_tid);
|
||||
}
|
||||
|
||||
void add_suites( CU_pSuite *suite )
|
||||
|
||||
@@ -23,6 +23,8 @@
|
||||
#include "../src/ParodusInternal.h"
|
||||
#include "../src/spin_thread.h"
|
||||
|
||||
pthread_t test_tid;
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Mocks */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
@@ -44,7 +46,7 @@ void *_routine(void *v)
|
||||
|
||||
void test_StartThread_success()
|
||||
{
|
||||
StartThread(&_routine);
|
||||
StartThread(&_routine, &test_tid);
|
||||
}
|
||||
|
||||
void add_suites( CU_pSuite *suite )
|
||||
|
||||
@@ -30,6 +30,7 @@
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* File Scoped Variables */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
bool g_shutdown = false;
|
||||
ParodusMsg *ParodusMsgQ;
|
||||
pthread_mutex_t g_mutex;
|
||||
pthread_cond_t g_cond;
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
#include <cmocka.h>
|
||||
#include <assert.h>
|
||||
#include <cjwt/cjwt.h>
|
||||
#include <wrp-c.h>
|
||||
|
||||
#include "../src/token.h"
|
||||
#include "../src/ParodusInternal.h"
|
||||
@@ -38,11 +39,11 @@ time_t exp_time_bad = 1463955372; // 5/22/2016
|
||||
|
||||
const char *payload_good = "{" \
|
||||
"\"iss\": \"SHA256:jdcRysFunWUAT852huQoIM9GN6k2s5c7iTMTMgujPAk\"," \
|
||||
"\"endpoint\": \"https://fabric.webpa.comcast.net:8080/\"}";
|
||||
"\"endpoint\": \"https://mydns.mycom.net:8080/\"}";
|
||||
|
||||
const char *payload_insec = "{" \
|
||||
"\"iss\": \"SHA256:jdcRysFunWUAT852huQoIM9GN6k2s5c7iTMTMgujPAk\"," \
|
||||
"\"endpoint\": \"http://fabric.webpa.comcast.net:8080/\"}";
|
||||
"\"endpoint\": \"http://mydns.mycom.net:8080/\"}";
|
||||
|
||||
// missing endpoint
|
||||
const char *payload_no_end = "{" \
|
||||
@@ -52,69 +53,89 @@ 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:ji81f9B4vnaENEZJgPzYiYdVLvbkgg9rbI7RVcEjutIszb7XZA\"\n"
|
||||
"\"01:eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1MTQ3NjQ3OTksImlzcyI6IlNIQTI1NjpqZGNSeXNGdW5XVUFUODUyaHVRb0lNOUdONmsyczVjN2lUTVRNZ3VqUEFrIiwiZW5kcG9pbnQiOiJodHRwczovL2ZhYnJpYy53ZWJwYS5jb21jYXN0Lm5ldDo4MDgwLyJ9.ahYvcvZxKfKt-enfMZOT9JwCr7eGECv2fUYEDbVdm\"\n"
|
||||
"\"02:X1Jq1iPnD8MqkSOyHUQ8a17DOFQSmv8C3ZTKkjtFHEUR8l-KYhaA8bmU7Fzo8m0f4Ub411p4r4VE3KOdv8TWbKgKKIElONJmimpCDvHaUG6SZTaGB_proHyw5Vy5RzK4EAUc0C36hPBF6pIQfl5DgT1I66MHDcklMx2af2_F26Wv4rRX3pU_Q6fvustJhRTBcCJa7S6NZrm_Ca9rkRk5v2dyXkzrrB0_PCIoHITom8DPF8N56EDGzLyY25-\"\n"
|
||||
"\"03:iJmBr4pGROCCbRlbL3GpGDcSFJcaqBQFOriTRk0xKQ\"\n"
|
||||
"\"01:eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJTSEEyNTY6amRjUnlzRnVuV1VBVDg1Mmh1UW9JTTlHTjZrMnM1YzdpVE1UTWd1alBBayIsImVuZHBvaW50IjoiaHR0cHM6Ly9teWRucy5teWNvbS5uZXQ6ODA4MC8iLCJleHAiOjIxNDc0ODM2NDd9.VjG2PzPws2J707PiEaUGOTXD9NWnrGyfAUvvfyXFw-Px3gx5wg1\"\n"
|
||||
"\"02:EXGyJQXrxMYuepAiFPT0sWxvydHvZKxcx7S5MCmlOhRpWZRrzgFceNWMwFcRPAPxovOoc4aYvx2DqGMdckmAD1q3y3Gjjw1qyxd4503jmrXKfjrdW3eFZD_Q454iRVf4c0CMWA5tl0ElOlX9u_HC3G_dPiKGUBU5PpWONgHpg2-ewrQcUe4-J4hBQmqZmRSB9n-6zB1XD80cDQO7aHeJ9aysJS1vgmwaSuT9y6PhPsp05NUC0TDzZVJUX\"\n"
|
||||
;
|
||||
|
||||
const char *dns_recs_extra =
|
||||
"\"03:ji81f9B4vnaENEZJgPzYiYdVLvbkgg9rbI7RVcEjutIszb7XZA\"\n"
|
||||
"\"01:eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1MTQ3NjQ3OTksImlzcyI6IlNIQTI1NjpqZGNSeXNGdW5XVUFUODUyaHVRb0lNOUdONmsyczVjN2lUTVRNZ3VqUEFrIiwiZW5kcG9pbnQiOiJodHRwczovL2ZhYnJpYy53ZWJwYS5jb21jYXN0Lm5ldDo4MDgwLyJ9.ahYvcvZxKfKt-enfMZOT9JwCr7eGECv2fUYEDbVdm\"\n"
|
||||
"\"03:iJmBr4pGROCCbRlbL3GpGDcSFJcaqBQFOriTRk0xKQ\"\n"
|
||||
"\"01:eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJTSEEyNTY6amRjUnlzRnVuV1VBVDg1Mmh1UW9JTTlHTjZrMnM1YzdpVE1UTWd1alBBayIsImVuZHBvaW50IjoiaHR0cHM6Ly9teWRucy5teWNvbS5uZXQ6ODA4MC8iLCJleHAiOjIxNDc0ODM2NDd9.VjG2PzPws2J707PiEaUGOTXD9NWnrGyfAUvvfyXFw-Px3gx5wg1\"\n"
|
||||
"\n" // non-txt record type
|
||||
"\"02:X1Jq1iPnD8MqkSOyHUQ8a17DOFQSmv8C3ZTKkjtFHEUR8l-KYhaA8bmU7Fzo8m0f4Ub411p4r4VE3KOdv8TWbKgKKIElONJmimpCDvHaUG6SZTaGB_proHyw5Vy5RzK4EAUc0C36hPBF6pIQfl5DgT1I66MHDcklMx2af2_F26Wv4rRX3pU_Q6fvustJhRTBcCJa7S6NZrm_Ca9rkRk5v2dyXkzrrB0_PCIoHITom8DPF8N56EDGzLyY25-\"\n"
|
||||
"\"02:EXGyJQXrxMYuepAiFPT0sWxvydHvZKxcx7S5MCmlOhRpWZRrzgFceNWMwFcRPAPxovOoc4aYvx2DqGMdckmAD1q3y3Gjjw1qyxd4503jmrXKfjrdW3eFZD_Q454iRVf4c0CMWA5tl0ElOlX9u_HC3G_dPiKGUBU5PpWONgHpg2-ewrQcUe4-J4hBQmqZmRSB9n-6zB1XD80cDQO7aHeJ9aysJS1vgmwaSuT9y6PhPsp05NUC0TDzZVJUX\"\n"
|
||||
;
|
||||
|
||||
char *rr_recs_test[] = {
|
||||
"eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1MTQ3NjQ3OTksImlzcyI6IlNIQTI1NjpqZGNSeXNGdW5XVUFUODUyaHVRb0lNOUdONmsyczVjN2lUTVRNZ3VqUEFrIiwiZW5kcG9pbnQiOiJodHRwczovL2ZhYnJpYy53ZWJwYS5jb21jYXN0Lm5ldDo4MDgwLyJ9.ahYvcvZxKfKt-enfMZOT9JwCr7eGECv2fUYEDbVdm",
|
||||
"X1Jq1iPnD8MqkSOyHUQ8a17DOFQSmv8C3ZTKkjtFHEUR8l-KYhaA8bmU7Fzo8m0f4Ub411p4r4VE3KOdv8TWbKgKKIElONJmimpCDvHaUG6SZTaGB_proHyw5Vy5RzK4EAUc0C36hPBF6pIQfl5DgT1I66MHDcklMx2af2_F26Wv4rRX3pU_Q6fvustJhRTBcCJa7S6NZrm_Ca9rkRk5v2dyXkzrrB0_PCIoHITom8DPF8N56EDGzLyY25-",
|
||||
"ji81f9B4vnaENEZJgPzYiYdVLvbkgg9rbI7RVcEjutIszb7XZA"
|
||||
"eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJTSEEyNTY6amRjUnlzRnVuV1VBVDg1Mmh1UW9JTTlHTjZrMnM1YzdpVE1UTWd1alBBayIsImVuZHBvaW50IjoiaHR0cHM6Ly9teWRucy5teWNvbS5uZXQ6ODA4MC8iLCJleHAiOjIxNDc0ODM2NDd9.VjG2PzPws2J707PiEaUGOTXD9NWnrGyfAUvvfyXFw-Px3gx5wg1",
|
||||
"EXGyJQXrxMYuepAiFPT0sWxvydHvZKxcx7S5MCmlOhRpWZRrzgFceNWMwFcRPAPxovOoc4aYvx2DqGMdckmAD1q3y3Gjjw1qyxd4503jmrXKfjrdW3eFZD_Q454iRVf4c0CMWA5tl0ElOlX9u_HC3G_dPiKGUBU5PpWONgHpg2-ewrQcUe4-J4hBQmqZmRSB9n-6zB1XD80cDQO7aHeJ9aysJS1vgmwaSuT9y6PhPsp05NUC0TDzZVJUX",
|
||||
"iJmBr4pGROCCbRlbL3GpGDcSFJcaqBQFOriTRk0xKQ"
|
||||
};
|
||||
|
||||
char *dns_jwt_test =
|
||||
"eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1MTQ3NjQ3OTksImlzcyI6IlNIQTI1NjpqZGNSeXNGdW5XVUFUODUyaHVRb0lNOUdONmsyczVjN2lUTVRNZ3VqUEFrIiwiZW5kcG9pbnQiOiJodHRwczovL2ZhYnJpYy53ZWJwYS5jb21jYXN0Lm5ldDo4MDgwLyJ9.ahYvcvZxKfKt-enfMZOT9JwCr7eGECv2fUYEDbVdm"
|
||||
"X1Jq1iPnD8MqkSOyHUQ8a17DOFQSmv8C3ZTKkjtFHEUR8l-KYhaA8bmU7Fzo8m0f4Ub411p4r4VE3KOdv8TWbKgKKIElONJmimpCDvHaUG6SZTaGB_proHyw5Vy5RzK4EAUc0C36hPBF6pIQfl5DgT1I66MHDcklMx2af2_F26Wv4rRX3pU_Q6fvustJhRTBcCJa7S6NZrm_Ca9rkRk5v2dyXkzrrB0_PCIoHITom8DPF8N56EDGzLyY25-"
|
||||
"ji81f9B4vnaENEZJgPzYiYdVLvbkgg9rbI7RVcEjutIszb7XZA"
|
||||
"eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJTSEEyNTY6amRjUnlzRnVuV1VBVDg1Mmh1UW9JTTlHTjZrMnM1YzdpVE1UTWd1alBBayIsImVuZHBvaW50IjoiaHR0cHM6Ly9teWRucy5teWNvbS5uZXQ6ODA4MC8iLCJleHAiOjIxNDc0ODM2NDd9.VjG2PzPws2J707PiEaUGOTXD9NWnrGyfAUvvfyXFw-Px3gx5wg1"
|
||||
"EXGyJQXrxMYuepAiFPT0sWxvydHvZKxcx7S5MCmlOhRpWZRrzgFceNWMwFcRPAPxovOoc4aYvx2DqGMdckmAD1q3y3Gjjw1qyxd4503jmrXKfjrdW3eFZD_Q454iRVf4c0CMWA5tl0ElOlX9u_HC3G_dPiKGUBU5PpWONgHpg2-ewrQcUe4-J4hBQmqZmRSB9n-6zB1XD80cDQO7aHeJ9aysJS1vgmwaSuT9y6PhPsp05NUC0TDzZVJUX"
|
||||
"iJmBr4pGROCCbRlbL3GpGDcSFJcaqBQFOriTRk0xKQ"
|
||||
;
|
||||
|
||||
|
||||
const char *dns_recs_fabric =
|
||||
"\"eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0.eyJlbmRwb2ludCI6Imh0dHBzOi8vZmFicmljLndlYnBhLmNvbWNhc3QubmV0OjgwODAvIn0.24cvUmCGYqqXuSsgC7nNnle2JH-uy6Jwp5BKXADhXpc\""
|
||||
/*
|
||||
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\""
|
||||
;
|
||||
|
||||
char *rr_recs_fabric[] = {
|
||||
"eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0.eyJlbmRwb2ludCI6Imh0dHBzOi8vZmFicmljLndlYnBhLmNvbWNhc3QubmV0OjgwODAvIn0.24cvUmCGYqqXuSsgC7nNnle2JH-uy6Jwp5BKXADhXpc"
|
||||
// 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:ji81f9B4vnaENEZJgPzYiYdVLvbkgg9rbI7RVcEjutIszb7XZA\"\n"
|
||||
"\"eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1MTQ3NjQ3OTksImlzcyI6IlNIQTI1NjpqZGNSeXNGdW5XVUFUODUyaHVRb0lNOUdONmsyczVjN2lUTVRNZ3VqUEFrIiwiZW5kcG9pbnQiOiJodHRwczovL2ZhYnJpYy53ZWJwYS5jb21jYXN0Lm5ldDo4MDgwLyJ9.ahYvcvZxKfKt-enfMZOT9JwCr7eGECv2fUYEDbVdm\"\n"
|
||||
"\"02:X1Jq1iPnD8MqkSOyHUQ8a17DOFQSmv8C3ZTKkjtFHEUR8l-KYhaA8bmU7Fzo8m0f4Ub411p4r4VE3KOdv8TWbKgKKIElONJmimpCDvHaUG6SZTaGB_proHyw5Vy5RzK4EAUc0C36hPBF6pIQfl5DgT1I66MHDcklMx2af2_F26Wv4rRX3pU_Q6fvustJhRTBcCJa7S6NZrm_Ca9rkRk5v2dyXkzrrB0_PCIoHITom8DPF8N56EDGzLyY25-\"\n"
|
||||
"\"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:ji81f9B4vnaENEZJgPzYiYdVLvbkgg9rbI7RVcEjutIszb7XZA\"\n"
|
||||
"\"0:eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1MTQ3NjQ3OTksImlzcyI6IlNIQTI1NjpqZGNSeXNGdW5XVUFUODUyaHVRb0lNOUdONmsyczVjN2lUTVRNZ3VqUEFrIiwiZW5kcG9pbnQiOiJodHRwczovL2ZhYnJpYy53ZWJwYS5jb21jYXN0Lm5ldDo4MDgwLyJ9.ahYvcvZxKfKt-enfMZOT9JwCr7eGECv2fUYEDbVdm\"\n"
|
||||
"\"02:X1Jq1iPnD8MqkSOyHUQ8a17DOFQSmv8C3ZTKkjtFHEUR8l-KYhaA8bmU7Fzo8m0f4Ub411p4r4VE3KOdv8TWbKgKKIElONJmimpCDvHaUG6SZTaGB_proHyw5Vy5RzK4EAUc0C36hPBF6pIQfl5DgT1I66MHDcklMx2af2_F26Wv4rRX3pU_Q6fvustJhRTBcCJa7S6NZrm_Ca9rkRk5v2dyXkzrrB0_PCIoHITom8DPF8N56EDGzLyY25-\"\n"
|
||||
"\"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:ji81f9B4vnaENEZJgPzYiYdVLvbkgg9rbI7RVcEjutIszb7XZA\"\n"
|
||||
"\"99:eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1MTQ3NjQ3OTksImlzcyI6IlNIQTI1NjpqZGNSeXNGdW5XVUFUODUyaHVRb0lNOUdONmsyczVjN2lUTVRNZ3VqUEFrIiwiZW5kcG9pbnQiOiJodHRwczovL2ZhYnJpYy53ZWJwYS5jb21jYXN0Lm5ldDo4MDgwLyJ9.ahYvcvZxKfKt-enfMZOT9JwCr7eGECv2fUYEDbVdm\"\n"
|
||||
"\"02:X1Jq1iPnD8MqkSOyHUQ8a17DOFQSmv8C3ZTKkjtFHEUR8l-KYhaA8bmU7Fzo8m0f4Ub411p4r4VE3KOdv8TWbKgKKIElONJmimpCDvHaUG6SZTaGB_proHyw5Vy5RzK4EAUc0C36hPBF6pIQfl5DgT1I66MHDcklMx2af2_F26Wv4rRX3pU_Q6fvustJhRTBcCJa7S6NZrm_Ca9rkRk5v2dyXkzrrB0_PCIoHITom8DPF8N56EDGzLyY25-\"\n"
|
||||
"\"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:ji81f9B4vnaENEZJgPzYiYdVLvbkgg9rbI7RVcEjutIszb7XZA\"\n"
|
||||
"\"03:ji81f9B4vnaENEZJgPzYiYdVLvbkgg9rbI7RVcEjutIszb7XZA\"\n"
|
||||
"\"01:eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1MTQ3NjQ3OTksImlzcyI6IlNIQTI1NjpqZGNSeXNGdW5XVUFUODUyaHVRb0lNOUdONmsyczVjN2lUTVRNZ3VqUEFrIiwiZW5kcG9pbnQiOiJodHRwczovL2ZhYnJpYy53ZWJwYS5jb21jYXN0Lm5ldDo4MDgwLyJ9.ahYvcvZxKfKt-enfMZOT9JwCr7eGECv2fUYEDbVdm\"\n"
|
||||
"\"02:X1Jq1iPnD8MqkSOyHUQ8a17DOFQSmv8C3ZTKkjtFHEUR8l-KYhaA8bmU7Fzo8m0f4Ub411p4r4VE3KOdv8TWbKgKKIElONJmimpCDvHaUG6SZTaGB_proHyw5Vy5RzK4EAUc0C36hPBF6pIQfl5DgT1I66MHDcklMx2af2_F26Wv4rRX3pU_Q6fvustJhRTBcCJa7S6NZrm_Ca9rkRk5v2dyXkzrrB0_PCIoHITom8DPF8N56EDGzLyY25-\"\n"
|
||||
"\"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:ji81f9B4vnaENEZJgPzYiYdVLvbkgg9rbI7RVcEjutIszb7XZA\"\n"
|
||||
"\"03:iJmBr4pGROCCbRlbL3GpGDcSFJcaqBQFOriTRk0xKQ\"\n"
|
||||
"\n" // non-txt record type
|
||||
"\"02:X1Jq1iPnD8MqkSOyHUQ8a17DOFQSmv8C3ZTKkjtFHEUR8l-KYhaA8bmU7Fzo8m0f4Ub411p4r4VE3KOdv8TWbKgKKIElONJmimpCDvHaUG6SZTaGB_proHyw5Vy5RzK4EAUc0C36hPBF6pIQfl5DgT1I66MHDcklMx2af2_F26Wv4rRX3pU_Q6fvustJhRTBcCJa7S6NZrm_Ca9rkRk5v2dyXkzrrB0_PCIoHITom8DPF8N56EDGzLyY25-\"\n"
|
||||
"\"02:EXGyJQXrxMYuepAiFPT0sWxvydHvZKxcx7S5MCmlOhRpWZRrzgFceNWMwFcRPAPxovOoc4aYvx2DqGMdckmAD1q3y3Gjjw1qyxd4503jmrXKfjrdW3eFZD_Q454iRVf4c0CMWA5tl0ElOlX9u_HC3G_dPiKGUBU5PpWONgHpg2-ewrQcUe4-J4hBQmqZmRSB9n-6zB1XD80cDQO7aHeJ9aysJS1vgmwaSuT9y6PhPsp05NUC0TDzZVJUX\"\n"
|
||||
;
|
||||
|
||||
cjwt_t jwt1; // secure, payload good
|
||||
@@ -123,7 +144,7 @@ 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);
|
||||
extern int analyze_jwt (const cjwt_t *jwt, char **url_buf, unsigned int *port);
|
||||
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);
|
||||
@@ -137,6 +158,31 @@ 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);
|
||||
|
||||
pthread_mutex_t crud_mut=PTHREAD_MUTEX_INITIALIZER;
|
||||
pthread_cond_t crud_con=PTHREAD_COND_INITIALIZER;
|
||||
int numLoops;
|
||||
|
||||
pthread_cond_t *get_global_crud_con(void)
|
||||
{
|
||||
return &crud_con;
|
||||
}
|
||||
|
||||
pthread_mutex_t *get_global_crud_mut(void)
|
||||
{
|
||||
return &crud_mut;
|
||||
}
|
||||
|
||||
void addCRUDmsgToQueue(wrp_msg_t *crudMsg)
|
||||
{
|
||||
(void)crudMsg;
|
||||
return;
|
||||
}
|
||||
|
||||
void *CRUDHandlerTask()
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int setup_test_jwts (void)
|
||||
{
|
||||
memset (&jwt1, 0, sizeof(cjwt_t));
|
||||
@@ -182,8 +228,8 @@ static int get_dns_text (const char *dns_rec_id, u_char *nsbuf, int bufsize)
|
||||
rec = dns_recs_test;
|
||||
else if (strstr (dns_rec_id, ".extra.") != NULL)
|
||||
rec = dns_recs_extra;
|
||||
else if (strstr (dns_rec_id, ".fabric.") != NULL)
|
||||
rec = dns_recs_fabric;
|
||||
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)
|
||||
@@ -204,6 +250,9 @@ static int get_dns_text (const char *dns_rec_id, u_char *nsbuf, int bufsize)
|
||||
/* 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);
|
||||
@@ -248,12 +297,14 @@ int ns_parserr(ns_msg *msg_handle, ns_sect sect, int rec, ns_rr *rr)
|
||||
ptr += (l+1);
|
||||
}
|
||||
|
||||
if (strlen (ptr) == 0) {
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -282,26 +333,34 @@ void __res_nclose (res_state statp)
|
||||
function_called ();
|
||||
}
|
||||
|
||||
// Analyzes a jwt structure
|
||||
void test_analyze_jwt ()
|
||||
{
|
||||
unsigned int port;
|
||||
char *server_Address;
|
||||
int ret = setup_test_jwts ();
|
||||
assert_int_equal (ret, 0);
|
||||
ret = analyze_jwt (&jwt1);
|
||||
ret = analyze_jwt (&jwt1, &server_Address, &port);
|
||||
assert_int_equal (ret, 0);
|
||||
ret = analyze_jwt (&jwt2);
|
||||
assert_string_equal (server_Address, "mydns.mycom.net");
|
||||
assert_int_equal (port, 8080);
|
||||
free (server_Address);
|
||||
ret = analyze_jwt (&jwt2, &server_Address, &port);
|
||||
assert_int_equal (ret, TOKEN_ERR_JWT_EXPIRED);
|
||||
ret = analyze_jwt (&jwt3);
|
||||
ret = analyze_jwt (&jwt3, &server_Address, &port);
|
||||
assert_int_equal (ret, 1);
|
||||
ret = analyze_jwt (&jwt4);
|
||||
assert_string_equal (server_Address, "mydns.mycom.net");
|
||||
assert_int_equal (port, 8080);
|
||||
free (server_Address);
|
||||
ret = analyze_jwt (&jwt4, &server_Address, &port);
|
||||
assert_int_equal (ret, TOKEN_ERR_INVALID_JWT_CONTENT);
|
||||
|
||||
}
|
||||
|
||||
void test_validate_algo ()
|
||||
{
|
||||
bool ret;
|
||||
ParodusCfg cfg;
|
||||
parStrncpy (cfg.jwt_algo, "none:RS256", sizeof(cfg.jwt_algo));
|
||||
cfg.jwt_algo = 1025;
|
||||
set_parodus_cfg (&cfg);
|
||||
jwt1.header.alg = alg_rs256;
|
||||
ret = validate_algo (&jwt1);
|
||||
@@ -353,12 +412,14 @@ void test_strip_rrdata ()
|
||||
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) {
|
||||
@@ -444,7 +505,7 @@ void test_get_rr_seq_table()
|
||||
assert_int_equal (ret, 0);
|
||||
}
|
||||
|
||||
ret = get_dns_text (".fabric.", nsbuf, 4096);
|
||||
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);
|
||||
@@ -452,9 +513,9 @@ void test_get_rr_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_recs_fabric[0]);
|
||||
int len = strlen (rr_recs2_test[0]);
|
||||
assert_int_equal (len, seq_table[0].rr_len);
|
||||
ret = strncmp (seq_table[0].rr_ptr, rr_recs_fabric[0], len);
|
||||
ret = strncmp (seq_table[0].rr_ptr, rr_recs2_test[0], len);
|
||||
assert_int_equal (ret, 0);
|
||||
}
|
||||
|
||||
@@ -566,53 +627,57 @@ void test_query_dns ()
|
||||
void test_allow_insecure_conn ()
|
||||
{
|
||||
int insecure;
|
||||
char *server_addr;
|
||||
unsigned int port;
|
||||
ParodusCfg *cfg = get_parodus_cfg();
|
||||
|
||||
parStrncpy (cfg->hw_mac, "aabbccddeeff", sizeof(cfg->hw_mac));
|
||||
parStrncpy (cfg->dns_id, "test", sizeof(cfg->dns_id));
|
||||
parStrncpy (cfg->jwt_algo, "none:RS256", sizeof(cfg->jwt_algo));
|
||||
parStrncpy (cfg->dns_txt_url, "test.mydns.mycom.net", sizeof(cfg->dns_txt_url));
|
||||
cfg->jwt_algo = 1025;
|
||||
|
||||
read_key_from_file ("../../tests/webpa-rs256.pem", cfg->jwt_key, 4096);
|
||||
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 ();
|
||||
insecure = allow_insecure_conn (&server_addr, &port);
|
||||
free (server_addr);
|
||||
assert_int_equal (insecure, 0);
|
||||
|
||||
|
||||
parStrncpy (cfg->hw_mac, "aabbccddeeff", sizeof(cfg->hw_mac));
|
||||
parStrncpy (cfg->dns_id, "err5", sizeof(cfg->dns_id));
|
||||
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 ();
|
||||
insecure = allow_insecure_conn (&server_addr, &port);
|
||||
assert_int_equal (insecure, TOKEN_ERR_QUERY_DNS_FAIL);
|
||||
|
||||
parStrncpy (cfg->hw_mac, "aabbccddeeff", sizeof(cfg->hw_mac));
|
||||
parStrncpy (cfg->dns_id, "test", sizeof(cfg->dns_id));
|
||||
parStrncpy (cfg->jwt_algo, "none:RS256", sizeof(cfg->jwt_algo));
|
||||
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 ();
|
||||
insecure = allow_insecure_conn (&server_addr, &port);
|
||||
assert_int_equal (insecure, TOKEN_ERR_JWT_DECODE_FAIL);
|
||||
|
||||
parStrncpy (cfg->hw_mac, "aabbccddeeff", sizeof(cfg->hw_mac));
|
||||
parStrncpy (cfg->dns_id, "test", sizeof(cfg->dns_id));
|
||||
parStrncpy (cfg->jwt_algo, "none:RS512", sizeof(cfg->jwt_algo));
|
||||
read_key_from_file ("../../tests/webpa-rs256.pem", cfg->jwt_key, 4096);
|
||||
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 ();
|
||||
insecure = allow_insecure_conn (&server_addr, &port);
|
||||
assert_int_equal (insecure, TOKEN_ERR_ALGO_NOT_ALLOWED);
|
||||
|
||||
}
|
||||
@@ -644,11 +709,11 @@ void test_get_algo_mask ()
|
||||
{
|
||||
unsigned mask;
|
||||
|
||||
mask = get_algo_mask ("none");
|
||||
assert_int_equal ((int) mask, 1);
|
||||
mask = get_algo_mask ("rs256");
|
||||
assert_int_equal ((int) mask, 1024);
|
||||
|
||||
mask = get_algo_mask ("none:rs256");
|
||||
assert_int_equal ((int) mask, 1025);
|
||||
mask = get_algo_mask ("rs512:rs256");
|
||||
assert_int_equal ((int) mask, 5120);
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
@@ -22,19 +22,47 @@
|
||||
#include <setjmp.h>
|
||||
#include <cmocka.h>
|
||||
#include <assert.h>
|
||||
|
||||
#include <wrp-c.h>
|
||||
#include <pthread.h>
|
||||
#include "../src/token.h"
|
||||
|
||||
int numLoops;
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Mocks */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
pthread_mutex_t crud_mut=PTHREAD_MUTEX_INITIALIZER;
|
||||
pthread_cond_t crud_con=PTHREAD_COND_INITIALIZER;
|
||||
|
||||
pthread_cond_t *get_global_crud_con(void)
|
||||
{
|
||||
return &crud_con;
|
||||
}
|
||||
|
||||
pthread_mutex_t *get_global_crud_mut(void)
|
||||
{
|
||||
return &crud_mut;
|
||||
}
|
||||
|
||||
void addCRUDmsgToQueue(wrp_msg_t *crudMsg)
|
||||
{
|
||||
(void)crudMsg;
|
||||
return;
|
||||
}
|
||||
|
||||
void *CRUDHandlerTask()
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void test_allow_insecure_conn ()
|
||||
{
|
||||
int insecure;
|
||||
insecure = allow_insecure_conn ();
|
||||
assert_int_equal (insecure, 1);
|
||||
char *server_Address = NULL;
|
||||
unsigned int port;
|
||||
insecure = allow_insecure_conn (&server_Address, &port);
|
||||
assert_int_equal (insecure, TOKEN_NO_DNS_QUERY);
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
@@ -31,17 +31,25 @@
|
||||
#include "../src/client_list.h"
|
||||
#include "../src/ParodusInternal.h"
|
||||
#include "../src/partners_check.h"
|
||||
#include "../src/close_retry.h"
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* File Scoped Variables */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
static noPollConn *conn;
|
||||
static char *reconnect_reason = "webpa_process_starts";
|
||||
bool g_shutdown = false;
|
||||
static ParodusCfg parodusCfg;
|
||||
extern size_t metaPackSize;
|
||||
extern UpStreamMsg *UpStreamMsgQ;
|
||||
int numLoops = 1;
|
||||
int deviceIDNull =0;
|
||||
char webpa_interface[64]={'\0'};
|
||||
wrp_msg_t *temp = NULL;
|
||||
extern pthread_mutex_t nano_mut;
|
||||
extern pthread_cond_t nano_con;
|
||||
static int crud_test = 0;
|
||||
pthread_mutex_t config_mut=PTHREAD_MUTEX_INITIALIZER;
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Mocks */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
@@ -62,22 +70,75 @@ reg_list_item_t * get_global_node(void)
|
||||
return mock_ptr_type(reg_list_item_t *);
|
||||
}
|
||||
|
||||
void release_global_node (void)
|
||||
{
|
||||
}
|
||||
|
||||
int get_numOfClients()
|
||||
{
|
||||
function_called();
|
||||
return (int)mock();
|
||||
}
|
||||
|
||||
void addCRUDmsgToQueue(wrp_msg_t *crudMsg)
|
||||
{
|
||||
(void)crudMsg;
|
||||
function_called();
|
||||
return;
|
||||
}
|
||||
|
||||
int sendMsgtoRegisteredClients(char *dest,const char **Msg,size_t msgSize)
|
||||
{
|
||||
UNUSED(dest); UNUSED(Msg); UNUSED(msgSize);
|
||||
function_called();
|
||||
return (int)mock();
|
||||
}
|
||||
|
||||
void sendMessage(noPollConn *conn, void *msg, size_t len)
|
||||
{
|
||||
(void) conn; (void) msg; (void) len;
|
||||
function_called();
|
||||
}
|
||||
|
||||
void set_parodus_cfg(ParodusCfg *cfg)
|
||||
{
|
||||
memcpy(&parodusCfg, cfg, sizeof(ParodusCfg));
|
||||
}
|
||||
|
||||
ParodusCfg *get_parodus_cfg(void)
|
||||
{
|
||||
ParodusCfg cfg;
|
||||
memset(&cfg,0,sizeof(cfg));
|
||||
parStrncpy(cfg.hw_mac , "14cfe2142xxx", sizeof(cfg.hw_mac));
|
||||
if(deviceIDNull)
|
||||
{
|
||||
parStrncpy(cfg.hw_mac , "", sizeof(cfg.hw_mac));
|
||||
}
|
||||
set_parodus_cfg(&cfg);
|
||||
return &parodusCfg;
|
||||
}
|
||||
|
||||
char *getWebpaInterface(void)
|
||||
{
|
||||
ParodusCfg cfg;
|
||||
memset(&cfg,0,sizeof(cfg));
|
||||
#ifdef WAN_FAILOVER_SUPPORTED
|
||||
parStrncpy(cfg.webpa_interface_used , "wl0", sizeof(cfg.webpa_interface_used));
|
||||
#else
|
||||
parStrncpy(cfg.webpa_interface_used , "eth0", sizeof(cfg.webpa_interface_used));
|
||||
#endif
|
||||
set_parodus_cfg(&cfg);
|
||||
#ifdef WAN_FAILOVER_SUPPORTED
|
||||
ParodusPrint("WAN_FAILOVER_SUPPORTED mode \n");
|
||||
pthread_mutex_lock (&config_mut);
|
||||
parStrncpy(webpa_interface, get_parodus_cfg()->webpa_interface_used, sizeof(webpa_interface));
|
||||
pthread_mutex_unlock (&config_mut);
|
||||
#else
|
||||
parStrncpy(webpa_interface, get_parodus_cfg()->webpa_interface_used, sizeof(webpa_interface));
|
||||
#endif
|
||||
return webpa_interface;
|
||||
}
|
||||
|
||||
ssize_t wrp_pack_metadata( const data_t *packData, void **data )
|
||||
{
|
||||
(void) packData; (void) data;
|
||||
@@ -141,7 +202,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();
|
||||
}
|
||||
|
||||
@@ -165,6 +238,13 @@ int nn_shutdown (int s, int how)
|
||||
return (int)mock();
|
||||
}
|
||||
|
||||
int nn_close (int s)
|
||||
{
|
||||
UNUSED(s);
|
||||
function_called();
|
||||
return (int)mock();
|
||||
}
|
||||
|
||||
int nn_setsockopt (int s, int level, int option, const void *optval, size_t optvallen)
|
||||
{
|
||||
UNUSED(s); UNUSED(level); UNUSED(option); UNUSED(optval); UNUSED(optvallen);
|
||||
@@ -210,10 +290,16 @@ void test_handleUpstreamNull()
|
||||
UpStreamMsgQ = NULL;
|
||||
will_return(nn_socket, 1);
|
||||
expect_function_call(nn_socket);
|
||||
will_return(nn_setsockopt, 0);
|
||||
expect_function_call(nn_setsockopt);
|
||||
will_return(nn_bind, 1);
|
||||
expect_function_call(nn_bind);
|
||||
will_return(nn_recv, 12);
|
||||
expect_function_call(nn_recv);
|
||||
will_return(nn_shutdown, 0);
|
||||
expect_function_call(nn_shutdown);
|
||||
will_return(nn_close, 0);
|
||||
expect_function_call(nn_close);
|
||||
handle_upstream();
|
||||
}
|
||||
|
||||
@@ -229,10 +315,16 @@ void test_handle_upstream()
|
||||
UpStreamMsgQ->next->next = NULL;
|
||||
will_return(nn_socket, 1);
|
||||
expect_function_call(nn_socket);
|
||||
will_return(nn_setsockopt, 0);
|
||||
expect_function_call(nn_setsockopt);
|
||||
will_return(nn_bind, 1);
|
||||
expect_function_call(nn_bind);
|
||||
will_return(nn_recv, 12);
|
||||
expect_function_call(nn_recv);
|
||||
will_return(nn_shutdown, 0);
|
||||
expect_function_call(nn_shutdown);
|
||||
will_return(nn_close, 0);
|
||||
expect_function_call(nn_close);
|
||||
handle_upstream();
|
||||
free(UpStreamMsgQ->next);
|
||||
free(UpStreamMsgQ);
|
||||
@@ -242,6 +334,8 @@ void err_handleUpstreamBindFailure()
|
||||
{
|
||||
will_return(nn_socket, 1);
|
||||
expect_function_call(nn_socket);
|
||||
will_return(nn_setsockopt, 0);
|
||||
expect_function_call(nn_setsockopt);
|
||||
will_return(nn_bind, -1);
|
||||
expect_function_call(nn_bind);
|
||||
handle_upstream();
|
||||
@@ -280,10 +374,42 @@ 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);
|
||||
free(UpStreamMsgQ->next);
|
||||
free(UpStreamMsgQ);
|
||||
}
|
||||
|
||||
void test_processUpstreamReqMessage()
|
||||
{
|
||||
numLoops = 1;
|
||||
metaPackSize = 20;
|
||||
UpStreamMsgQ = (UpStreamMsg *) malloc(sizeof(UpStreamMsg));
|
||||
UpStreamMsgQ->msg = "First Message";
|
||||
UpStreamMsgQ->len = 13;
|
||||
UpStreamMsgQ->next = (UpStreamMsg *) malloc(sizeof(UpStreamMsg));
|
||||
UpStreamMsgQ->next->msg = "Second Message";
|
||||
UpStreamMsgQ->next->len = 15;
|
||||
UpStreamMsgQ->next->next = NULL;
|
||||
|
||||
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, 12);
|
||||
expect_function_call(wrp_to_struct);
|
||||
|
||||
will_return(appendEncodedData, 100);
|
||||
expect_function_call(appendEncodedData);
|
||||
|
||||
expect_function_call(sendMessage);
|
||||
will_return(nn_freemsg, 0);
|
||||
expect_function_call(nn_freemsg);
|
||||
expect_function_call(wrp_free_struct);
|
||||
|
||||
processUpstreamMessage();
|
||||
free(temp);
|
||||
@@ -317,10 +443,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);
|
||||
@@ -352,15 +477,18 @@ void test_processUpstreamMessageRegMsg()
|
||||
will_return(wrp_to_struct, 12);
|
||||
expect_function_call(wrp_to_struct);
|
||||
|
||||
will_return(get_numOfClients, 1);
|
||||
expect_function_call(get_numOfClients);
|
||||
|
||||
will_return(get_global_node, (intptr_t)head);
|
||||
expect_function_call(get_global_node);
|
||||
|
||||
will_return(get_numOfClients, 1);
|
||||
expect_function_call(get_numOfClients);
|
||||
|
||||
will_return(nn_shutdown, 1);
|
||||
expect_function_call(nn_shutdown);
|
||||
|
||||
will_return(nn_close, 0);
|
||||
expect_function_call(nn_close);
|
||||
|
||||
will_return(nn_socket, 1);
|
||||
expect_function_call(nn_socket);
|
||||
|
||||
@@ -375,10 +503,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);
|
||||
@@ -412,15 +539,17 @@ void test_processUpstreamMessageRegMsgNoClients()
|
||||
will_return(wrp_to_struct, 12);
|
||||
expect_function_call(wrp_to_struct);
|
||||
|
||||
will_return(get_global_node, (intptr_t)head);
|
||||
expect_function_call(get_global_node);
|
||||
|
||||
will_return(get_numOfClients, 0);
|
||||
expect_function_call(get_numOfClients);
|
||||
|
||||
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 +578,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 +603,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);
|
||||
@@ -512,21 +639,27 @@ void err_processUpstreamMessageRegMsg()
|
||||
will_return(wrp_to_struct, 12);
|
||||
expect_function_call(wrp_to_struct);
|
||||
|
||||
will_return(get_numOfClients, 1);
|
||||
expect_function_call(get_numOfClients);
|
||||
|
||||
will_return(get_global_node, (intptr_t)head);
|
||||
expect_function_call(get_global_node);
|
||||
|
||||
will_return(get_numOfClients, 1);
|
||||
expect_function_call(get_numOfClients);
|
||||
|
||||
will_return(nn_shutdown, -1);
|
||||
expect_function_call(nn_shutdown);
|
||||
|
||||
will_return(nn_close, 0);
|
||||
expect_function_call(nn_close);
|
||||
|
||||
will_return(nn_socket, -1);
|
||||
expect_function_call(nn_socket);
|
||||
|
||||
will_return(nn_shutdown, 1);
|
||||
expect_function_call(nn_shutdown);
|
||||
|
||||
will_return(nn_close, 0);
|
||||
expect_function_call(nn_close);
|
||||
|
||||
will_return(nn_socket, 1);
|
||||
expect_function_call(nn_socket);
|
||||
|
||||
@@ -538,10 +671,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);
|
||||
@@ -568,12 +700,199 @@ void test_sendUpstreamMsgToServer()
|
||||
free(bytes);
|
||||
}
|
||||
|
||||
void test_sendUpstreamMsg_close_retry()
|
||||
{
|
||||
set_close_retry();
|
||||
void *bytes = NULL;
|
||||
wrp_msg_t msg;
|
||||
memset(&msg, 0, sizeof(wrp_msg_t));
|
||||
msg.msg_type = WRP_MSG_TYPE__EVENT;
|
||||
wrp_struct_to( &msg, WRP_BYTES, &bytes );
|
||||
metaPackSize = 10;
|
||||
will_return(appendEncodedData, 100);
|
||||
expect_function_call(appendEncodedData);
|
||||
sendUpstreamMsgToServer(&bytes, 110);
|
||||
free(bytes);
|
||||
}
|
||||
|
||||
void err_sendUpstreamMsgToServer()
|
||||
{
|
||||
metaPackSize = 0;
|
||||
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);
|
||||
crud_test = 0;
|
||||
}
|
||||
|
||||
void test_processUpstreamMsg_cloud_status()
|
||||
{
|
||||
numLoops = 1;
|
||||
metaPackSize = 20;
|
||||
UpStreamMsgQ = (UpStreamMsg *) malloc(sizeof(UpStreamMsg));
|
||||
UpStreamMsgQ->msg = "First Message";
|
||||
UpStreamMsgQ->len = 13;
|
||||
UpStreamMsgQ->next= NULL;
|
||||
temp = (wrp_msg_t *) malloc(sizeof(wrp_msg_t));
|
||||
memset(temp,0,sizeof(wrp_msg_t));
|
||||
temp->msg_type = 6;
|
||||
temp->u.crud.dest = "mac:14cfe2142xxx/parodus/cloud-status";
|
||||
temp->u.crud.source = "mac:14cfe2142xxx/config";
|
||||
temp->u.crud.transaction_uuid = "123";
|
||||
|
||||
will_return(wrp_to_struct, 12);
|
||||
expect_function_call(wrp_to_struct);
|
||||
|
||||
expect_function_call(addCRUDmsgToQueue);
|
||||
|
||||
will_return(nn_freemsg, 0);
|
||||
expect_function_call(nn_freemsg);
|
||||
expect_function_call(wrp_free_struct);
|
||||
processUpstreamMessage();
|
||||
free(temp);
|
||||
free(UpStreamMsgQ);
|
||||
UpStreamMsgQ = NULL;
|
||||
}
|
||||
|
||||
void test_processUpstreamMsg_sendToClient()
|
||||
{
|
||||
numLoops = 2;
|
||||
metaPackSize = 20;
|
||||
UpStreamMsgQ = (UpStreamMsg *) malloc(sizeof(UpStreamMsg));
|
||||
UpStreamMsgQ->msg = strdup("First Message");
|
||||
UpStreamMsgQ->len = 13;
|
||||
UpStreamMsgQ->next= NULL;
|
||||
UpStreamMsgQ->next = (UpStreamMsg *) malloc(sizeof(UpStreamMsg));
|
||||
UpStreamMsgQ->next->msg = strdup("Second Message");
|
||||
UpStreamMsgQ->next->len = 15;
|
||||
UpStreamMsgQ->next->next = NULL;
|
||||
|
||||
temp = (wrp_msg_t *) malloc(sizeof(wrp_msg_t));
|
||||
memset(temp,0,sizeof(wrp_msg_t));
|
||||
temp->msg_type = 6;
|
||||
temp->u.crud.dest = strdup("mac:14cfe2142xxx/config");
|
||||
temp->u.crud.source = strdup("mac:14cfe2142xxx/parodus/cloud-status");
|
||||
temp->u.crud.transaction_uuid = strdup("123");
|
||||
|
||||
will_return(wrp_to_struct, 12);
|
||||
expect_function_call(wrp_to_struct);
|
||||
|
||||
will_return(sendMsgtoRegisteredClients, 1);
|
||||
expect_function_call(sendMsgtoRegisteredClients);
|
||||
|
||||
expect_function_call(wrp_free_struct);
|
||||
will_return(wrp_to_struct, 12);
|
||||
expect_function_call(wrp_to_struct);
|
||||
will_return(sendMsgtoRegisteredClients, 0);
|
||||
expect_function_call(sendMsgtoRegisteredClients);
|
||||
|
||||
expect_function_call(wrp_free_struct);
|
||||
processUpstreamMessage();
|
||||
free(temp);
|
||||
free(UpStreamMsgQ);
|
||||
UpStreamMsgQ = NULL;
|
||||
}
|
||||
|
||||
void test_processUpstreamMsg_serviceNameNULL()
|
||||
{
|
||||
numLoops = 1;
|
||||
metaPackSize = 20;
|
||||
UpStreamMsgQ = (UpStreamMsg *) malloc(sizeof(UpStreamMsg));
|
||||
UpStreamMsgQ->msg = strdup("First Message");
|
||||
UpStreamMsgQ->len = 13;
|
||||
UpStreamMsgQ->next= NULL;
|
||||
UpStreamMsgQ->next = (UpStreamMsg *) malloc(sizeof(UpStreamMsg));
|
||||
UpStreamMsgQ->next->msg = strdup("Second Message");
|
||||
UpStreamMsgQ->next->len = 15;
|
||||
UpStreamMsgQ->next->next = NULL;
|
||||
|
||||
temp = (wrp_msg_t *) malloc(sizeof(wrp_msg_t));
|
||||
memset(temp,0,sizeof(wrp_msg_t));
|
||||
temp->msg_type = 6;
|
||||
temp->u.crud.dest = strdup("mac:14cfe2142xxx/");
|
||||
temp->u.crud.source = strdup("mac:14cfe2142xxx/parodus/cloud-status");
|
||||
temp->u.crud.transaction_uuid = strdup("123");
|
||||
|
||||
will_return(wrp_to_struct, 12);
|
||||
expect_function_call(wrp_to_struct);
|
||||
expect_function_call(wrp_free_struct);
|
||||
processUpstreamMessage();
|
||||
free(temp);
|
||||
free(UpStreamMsgQ);
|
||||
UpStreamMsgQ = NULL;
|
||||
}
|
||||
|
||||
void err_processUpstreamMsg_deviceID()
|
||||
{
|
||||
numLoops = 1;
|
||||
metaPackSize = 20;
|
||||
deviceIDNull = 1;
|
||||
UpStreamMsgQ = (UpStreamMsg *) malloc(sizeof(UpStreamMsg));
|
||||
UpStreamMsgQ->msg = "First Message";
|
||||
UpStreamMsgQ->len = 13;
|
||||
UpStreamMsgQ->next= NULL;
|
||||
temp = (wrp_msg_t *) malloc(sizeof(wrp_msg_t));
|
||||
memset(temp,0,sizeof(wrp_msg_t));
|
||||
temp->msg_type = 6;
|
||||
temp->u.crud.dest = "mac:14cfe2142xxx/parodus/cloud-status";
|
||||
temp->u.crud.source = "mac:14cfe2142xxx/config";
|
||||
temp->u.crud.transaction_uuid = "123";
|
||||
|
||||
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(temp);
|
||||
free(UpStreamMsgQ);
|
||||
UpStreamMsgQ = NULL;
|
||||
}
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* External Functions */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
@@ -588,6 +907,7 @@ int main(void)
|
||||
cmocka_unit_test(err_handleUpstreamBindFailure),
|
||||
cmocka_unit_test(err_handleUpstreamSockFailure),
|
||||
cmocka_unit_test(test_processUpstreamMessage),
|
||||
cmocka_unit_test(test_processUpstreamReqMessage),
|
||||
cmocka_unit_test(test_processUpstreamMessageInvalidPartner),
|
||||
cmocka_unit_test(test_processUpstreamMessageRegMsg),
|
||||
cmocka_unit_test(test_processUpstreamMessageRegMsgNoClients),
|
||||
@@ -596,7 +916,17 @@ int main(void)
|
||||
cmocka_unit_test(err_processUpstreamMessageMetapackFailure),
|
||||
cmocka_unit_test(err_processUpstreamMessageRegMsg),
|
||||
cmocka_unit_test(test_sendUpstreamMsgToServer),
|
||||
cmocka_unit_test(test_sendUpstreamMsg_close_retry),
|
||||
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),
|
||||
cmocka_unit_test(test_processUpstreamMsg_cloud_status),
|
||||
cmocka_unit_test(test_processUpstreamMsg_sendToClient),
|
||||
cmocka_unit_test(test_processUpstreamMsg_serviceNameNULL),
|
||||
cmocka_unit_test(err_processUpstreamMsg_deviceID)
|
||||
};
|
||||
|
||||
return cmocka_run_group_tests(tests, NULL, NULL);
|
||||
|
||||
271
tests/test_upstream_sock.c
Normal file
271
tests/test_upstream_sock.c
Normal file
@@ -0,0 +1,271 @@
|
||||
/**
|
||||
* 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 <nopoll.h>
|
||||
#include <wrp-c.h>
|
||||
#include <nanomsg/nn.h>
|
||||
|
||||
#include "../src/upstream.h"
|
||||
#include "../src/config.h"
|
||||
#include "../src/client_list.h"
|
||||
#include "../src/ParodusInternal.h"
|
||||
#include "../src/partners_check.h"
|
||||
#include "../src/close_retry.h"
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* File Scoped Variables */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
#define GOOD_CLIENT_URL "tcp://127.0.0.1:6667"
|
||||
|
||||
static noPollConn *conn;
|
||||
static char *reconnect_reason = "webpa_process_starts";
|
||||
bool g_shutdown = false;
|
||||
static ParodusCfg parodusCfg;
|
||||
extern size_t metaPackSize;
|
||||
extern UpStreamMsg *UpStreamMsgQ;
|
||||
int numLoops = 1;
|
||||
int deviceIDNull =0;
|
||||
char webpa_interface[64]={'\0'};
|
||||
wrp_msg_t *reg_msg = NULL;
|
||||
extern pthread_mutex_t nano_mut;
|
||||
extern pthread_cond_t nano_con;
|
||||
pthread_mutex_t config_mut=PTHREAD_MUTEX_INITIALIZER;
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Mocks */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
reg_list_item_t *get_reg_list()
|
||||
{
|
||||
reg_list_item_t *item = get_global_node();
|
||||
release_global_node();
|
||||
return item;
|
||||
}
|
||||
|
||||
noPollConn *get_global_conn()
|
||||
{
|
||||
return conn;
|
||||
}
|
||||
|
||||
char *get_global_reconnect_reason()
|
||||
{
|
||||
return reconnect_reason;
|
||||
}
|
||||
|
||||
void addCRUDmsgToQueue(wrp_msg_t *crudMsg)
|
||||
{
|
||||
(void)crudMsg;
|
||||
function_called();
|
||||
return;
|
||||
}
|
||||
|
||||
void sendMessage(noPollConn *conn, void *msg, size_t len)
|
||||
{
|
||||
(void) conn; (void) msg; (void) len;
|
||||
function_called();
|
||||
}
|
||||
|
||||
void set_parodus_cfg(ParodusCfg *cfg)
|
||||
{
|
||||
memcpy(&parodusCfg, cfg, sizeof(ParodusCfg));
|
||||
}
|
||||
|
||||
ParodusCfg *get_parodus_cfg(void)
|
||||
{
|
||||
ParodusCfg cfg;
|
||||
memset(&cfg,0,sizeof(cfg));
|
||||
parStrncpy(cfg.hw_mac , "14cfe2142xxx", sizeof(cfg.hw_mac));
|
||||
if(deviceIDNull)
|
||||
{
|
||||
parStrncpy(cfg.hw_mac , "", sizeof(cfg.hw_mac));
|
||||
}
|
||||
set_parodus_cfg(&cfg);
|
||||
return &parodusCfg;
|
||||
}
|
||||
|
||||
char *getWebpaInterface(void)
|
||||
{
|
||||
ParodusCfg cfg;
|
||||
memset(&cfg,0,sizeof(cfg));
|
||||
#ifdef WAN_FAILOVER_SUPPORTED
|
||||
parStrncpy(cfg.webpa_interface_used , "wl0", sizeof(cfg.webpa_interface_used));
|
||||
#else
|
||||
parStrncpy(cfg.webpa_interface_used , "eth0", sizeof(cfg.webpa_interface_used));
|
||||
#endif
|
||||
set_parodus_cfg(&cfg);
|
||||
#ifdef WAN_FAILOVER_SUPPORTED
|
||||
ParodusPrint("WAN_FAILOVER_SUPPORTED mode \n");
|
||||
pthread_mutex_lock (&config_mut);
|
||||
parStrncpy(webpa_interface, get_parodus_cfg()->webpa_interface_used, sizeof(webpa_interface));
|
||||
pthread_mutex_unlock (&config_mut);
|
||||
#else
|
||||
parStrncpy(webpa_interface, get_parodus_cfg()->webpa_interface_used, sizeof(webpa_interface));
|
||||
#endif
|
||||
return webpa_interface;
|
||||
}
|
||||
|
||||
/*-------------------------------------------
|
||||
int nn_connect (int s, const char *addr)
|
||||
{
|
||||
(void) s; (void) addr;
|
||||
printf ("nn_connect, socket %d\n", s);
|
||||
return 1;
|
||||
}
|
||||
---------------------------------------------*/
|
||||
|
||||
ssize_t wrp_pack_metadata( const data_t *packData, void **data )
|
||||
{
|
||||
(void) packData; (void) data;
|
||||
function_called();
|
||||
|
||||
return (ssize_t)mock();
|
||||
}
|
||||
|
||||
size_t appendEncodedData( void **appendData, void *encodedBuffer, size_t encodedSize, void *metadataPack, size_t metadataSize )
|
||||
{
|
||||
(void) encodedBuffer; (void) encodedSize; (void) metadataPack; (void) metadataSize;
|
||||
function_called();
|
||||
char *data = (char *) malloc (sizeof(char) * 100);
|
||||
parStrncpy(data, "AAAAAAAAYYYYIGkYTUYFJH", 100);
|
||||
*appendData = data;
|
||||
return (size_t)mock();
|
||||
}
|
||||
|
||||
int nn_send (int s, const void *buf, size_t len, int flags)
|
||||
{
|
||||
UNUSED(s); UNUSED(buf); UNUSED(len); UNUSED(flags);
|
||||
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();
|
||||
}
|
||||
|
||||
ssize_t wrp_to_struct( const void *bytes, const size_t length, const enum wrp_format fmt, wrp_msg_t **msg )
|
||||
{
|
||||
UNUSED(bytes); UNUSED(length); UNUSED(fmt);
|
||||
function_called();
|
||||
*msg = reg_msg;
|
||||
return (ssize_t)mock();
|
||||
}
|
||||
|
||||
void wrp_free_struct( wrp_msg_t *msg )
|
||||
{
|
||||
UNUSED(msg);
|
||||
function_called();
|
||||
}
|
||||
|
||||
int nn_freemsg (void *msg)
|
||||
{
|
||||
UNUSED(msg);
|
||||
function_called();
|
||||
return (int)mock();
|
||||
}
|
||||
|
||||
int validate_partner_id(wrp_msg_t *msg, partners_t **partnerIds)
|
||||
{
|
||||
UNUSED(msg); UNUSED(partnerIds);
|
||||
function_called();
|
||||
return (int) mock();
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* Tests */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
|
||||
void test_message()
|
||||
{
|
||||
metaPackSize = 20;
|
||||
UpStreamMsgQ = (UpStreamMsg *) malloc(sizeof(UpStreamMsg));
|
||||
UpStreamMsgQ->msg = "First Message";
|
||||
UpStreamMsgQ->len = 13;
|
||||
UpStreamMsgQ->next = NULL;
|
||||
|
||||
numLoops = 1;
|
||||
reg_msg = (wrp_msg_t *) malloc(sizeof(wrp_msg_t));
|
||||
memset(reg_msg,0,sizeof(wrp_msg_t));
|
||||
reg_msg->msg_type = WRP_MSG_TYPE__SVC_REGISTRATION;
|
||||
reg_msg->u.reg.service_name = "config";
|
||||
reg_msg->u.reg.url = GOOD_CLIENT_URL;
|
||||
|
||||
will_return(wrp_to_struct, 12);
|
||||
expect_function_call(wrp_to_struct);
|
||||
|
||||
will_return(nn_send, 1);
|
||||
expect_function_call(nn_send);
|
||||
|
||||
will_return(nn_freemsg, 0);
|
||||
expect_function_call(nn_freemsg);
|
||||
expect_function_call(wrp_free_struct);
|
||||
|
||||
processUpstreamMessage();
|
||||
free(reg_msg);
|
||||
free(UpStreamMsgQ);
|
||||
}
|
||||
|
||||
void test_processUpstreamMessage()
|
||||
{
|
||||
int last_sock = -1;
|
||||
reg_list_item_t * reg_item = get_reg_list ();
|
||||
|
||||
assert_null (reg_item);
|
||||
test_message();
|
||||
reg_item = get_reg_list ();
|
||||
assert_non_null (reg_item);
|
||||
if (NULL == reg_item)
|
||||
return;
|
||||
|
||||
last_sock = reg_item->sock;
|
||||
test_message ();
|
||||
assert_int_equal (get_numOfClients(), 1);
|
||||
if (get_numOfClients() != 1)
|
||||
return;
|
||||
reg_item = get_reg_list ();
|
||||
assert_int_equal (last_sock, reg_item->sock);
|
||||
if (last_sock != reg_item->sock)
|
||||
return;
|
||||
|
||||
test_message ();
|
||||
assert_int_equal (get_numOfClients(), 1);
|
||||
if (get_numOfClients() != 1)
|
||||
return;
|
||||
reg_item = get_reg_list ();
|
||||
assert_int_equal (last_sock, reg_item->sock);
|
||||
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/* External Functions */
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
int main(void)
|
||||
{
|
||||
const struct CMUnitTest tests[] = {
|
||||
cmocka_unit_test(test_processUpstreamMessage)
|
||||
};
|
||||
return cmocka_run_group_tests(tests, NULL, NULL);
|
||||
}
|
||||
Reference in New Issue
Block a user