Skip to content
This repository was archived by the owner on Dec 6, 2024. It is now read-only.

Commit 55fd20c

Browse files
prepare 2.4.5 release (#46)
1 parent 87edbe8 commit 55fd20c

File tree

12 files changed

+453
-21
lines changed

12 files changed

+453
-21
lines changed

.circleci/config.yml

Lines changed: 37 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,29 @@
11
version: 2.1
22

33
orbs:
4-
win: circleci/windows@1.0.0
4+
win: circleci/windows@1.0.0
55

66
workflows:
77
version: 2
88
build_and_test_all:
99
jobs:
10-
- build-test-linux
1110
- build-test-linux-clang11
1211
- build-test-linux-optimized
12+
- build-test-linux-valgrind:
13+
requires:
14+
- build-test-linux-optimized
15+
- build-test-linux-helgrind:
16+
requires:
17+
- build-test-linux-optimized
1318
- build-test-linux-32bit
1419
- build-test-osx
1520
- build-test-windows
1621

1722
jobs:
18-
build-test-linux:
23+
build-test-linux-valgrind:
1924
docker:
2025
- image: ldcircleci/ld-c-sdk-ubuntu # defined in sdks-ci-docker project
2126
- image: redis
22-
environment:
23-
CTEST_OUTPUT_ON_FAILURE: 1
2427
steps:
2528
- checkout
2629
- run:
@@ -34,12 +37,32 @@ jobs:
3437
cmake -D REDIS_STORE=ON ..
3538
cmake --build .
3639
- run:
37-
name: Unit test with memcheck
40+
name: Unit test with valgrind
3841
command: |
3942
cd build
40-
GTEST_OUTPUT="xml:$(pwd)/../reports/" ctest -T memcheck
41-
- store_test_results:
42-
path: reports
43+
valgrind --error-exitcode=100 --leak-check=full ./tests/google_tests
44+
45+
build-test-linux-helgrind:
46+
docker:
47+
- image: ldcircleci/ld-c-sdk-ubuntu # defined in sdks-ci-docker project
48+
- image: redis
49+
steps:
50+
- checkout
51+
- run:
52+
name: Install dependencies
53+
command: |
54+
apt-get update -y && apt-get install -y git
55+
- run:
56+
name: Build
57+
command: |
58+
mkdir build && cd build
59+
cmake -D REDIS_STORE=ON ..
60+
cmake --build .
61+
- run:
62+
name: Unit test with helgrind
63+
command: |
64+
cd build
65+
valgrind --tool=helgrind --suppressions=../valgrind-suppressions.supp --error-exitcode=100 ./tests/google_tests
4366
4467
build-test-linux-optimized:
4568
docker:
@@ -50,9 +73,9 @@ jobs:
5073
steps:
5174
- checkout
5275
- run:
53-
name: Install dependencies
54-
command: |
55-
apt-get update -y && apt-get install -y git
76+
name: Install dependencies
77+
command: |
78+
apt-get update -y && apt-get install -y git
5679
- run:
5780
name: Build
5881
command: |
@@ -161,8 +184,8 @@ jobs:
161184
- run:
162185
name: Test
163186
command: |
164-
cd build
165-
GTEST_OUTPUT="xml:$(pwd)/../reports/" make test
187+
cd build
188+
GTEST_OUTPUT="xml:$(pwd)/../reports/" make test
166189
- store_test_results:
167190
path: reports
168191

c-sdk-common/include/launchdarkly/json.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/*!
22
* @file json.h
3-
* @brief Public API Interface for JSON usage
3+
* @brief Public API for JSON usage
44
*/
55

66
#pragma once

c-sdk-common/include/launchdarkly/logging.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/*!
22
* @file logging.h
3-
* @brief Public API Interface for Logging.
3+
* @brief Public API for Logging.
44
*/
55

66
#pragma once

c-sdk-common/include/launchdarkly/user.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/*!
22
* @file user.h
3-
* @brief Public API Interface for User construction
3+
* @brief Public API for User construction
44
*/
55

66
#pragma once

include/launchdarkly/client.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/*!
22
* @file client.h
3-
* @brief Public API Interface for Client operations
3+
* @brief Public API for Client operations
44
*/
55

66
#pragma once

include/launchdarkly/config.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/*!
22
* @file config.h
3-
* @brief Public API Interface for Configuration
3+
* @brief Public API for Configuration
44
*/
55

66
#pragma once

include/launchdarkly/store.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/*!
22
* @file store.h
3-
* @brief Public API Interface for Store implementations
3+
* @brief Public API for Store implementations
44
*/
55

66
#pragma once

include/launchdarkly/variations.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/*!
22
* @file variations.h
3-
* @brief Public API Interface for evaluation variations
3+
* @brief Public API for evaluation variations
44
*/
55

66
#pragma once

src/json_internal_helpers.c

Lines changed: 212 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,212 @@
1+
#include "assertion.h"
2+
#include "json_internal_helpers.h"
3+
#include "cJSON.h"
4+
5+
LDBoolean
6+
LDObjectSetString(struct LDJSON *const rawObject, const char *const key, const char *const value) {
7+
cJSON *const object = (cJSON *)rawObject;
8+
9+
LD_ASSERT_API(object);
10+
LD_ASSERT_API(cJSON_IsObject(object));
11+
LD_ASSERT_API(key);
12+
LD_ASSERT_API(value);
13+
14+
#ifdef LAUNCHDARKLY_DEFENSIVE
15+
if (object == NULL) {
16+
LD_LOG(LD_LOG_WARNING, "LDObjectSetString NULL object");
17+
18+
return LDBooleanFalse;
19+
}
20+
21+
if (cJSON_IsObject(object) == LDBooleanFalse) {
22+
LD_LOG(LD_LOG_WARNING, "LDObjectSetString not object");
23+
24+
return LDBooleanFalse;
25+
}
26+
27+
if (key == NULL) {
28+
LD_LOG(LD_LOG_WARNING, "LDObjectSetString NULL key");
29+
30+
return LDBooleanFalse;
31+
}
32+
33+
if (value == NULL) {
34+
LD_LOG(LD_LOG_WARNING, "LDObjectSetString NULL value");
35+
36+
return LDBooleanFalse;
37+
}
38+
#endif
39+
40+
cJSON_DeleteItemFromObjectCaseSensitive(object, key);
41+
42+
if (!cJSON_AddStringToObject(object, key, value)) {
43+
LD_LOG(LD_LOG_ERROR, "LDObjectSetString failed to set value");
44+
45+
return LDBooleanFalse;
46+
}
47+
48+
return LDBooleanTrue;
49+
}
50+
51+
LDBoolean
52+
LDObjectSetBool(struct LDJSON *rawObject, const char *const key, LDBoolean value) {
53+
cJSON *const object = (cJSON *)rawObject;
54+
55+
LD_ASSERT_API(object);
56+
LD_ASSERT_API(cJSON_IsObject(object));
57+
LD_ASSERT_API(key);
58+
59+
#ifdef LAUNCHDARKLY_DEFENSIVE
60+
if (object == NULL) {
61+
LD_LOG(LD_LOG_WARNING, "LDObjectSetBool NULL object");
62+
63+
return LDBooleanFalse;
64+
}
65+
66+
if (cJSON_IsObject(object) == LDBooleanFalse) {
67+
LD_LOG(LD_LOG_WARNING, "LDObjectSetBool not object");
68+
69+
return LDBooleanFalse;
70+
}
71+
72+
if (key == NULL) {
73+
LD_LOG(LD_LOG_WARNING, "LDObjectSetBool NULL key");
74+
75+
return LDBooleanFalse;
76+
}
77+
78+
#endif
79+
80+
cJSON_DeleteItemFromObjectCaseSensitive(object, key);
81+
82+
if (!cJSON_AddBoolToObject(object, key, value)) {
83+
LD_LOG(LD_LOG_ERROR, "LDObjectSetBool failed to set value");
84+
85+
return LDBooleanFalse;
86+
}
87+
88+
return LDBooleanTrue;
89+
}
90+
91+
struct LDJSON *
92+
LDObjectNewChild(struct LDJSON *rawObject, const char *const key) {
93+
cJSON *const object = (cJSON *)rawObject;
94+
cJSON *child = NULL;
95+
96+
LD_ASSERT_API(object);
97+
LD_ASSERT_API(cJSON_IsObject(object));
98+
LD_ASSERT_API(key);
99+
100+
#ifdef LAUNCHDARKLY_DEFENSIVE
101+
if (object == NULL) {
102+
LD_LOG(LD_LOG_WARNING, "LDObjectNewChild NULL object");
103+
104+
return NULL;
105+
}
106+
107+
if (cJSON_IsObject(object) == LDBooleanFalse) {
108+
LD_LOG(LD_LOG_WARNING, "LDObjectNewChild not object");
109+
110+
return NULL;
111+
}
112+
113+
if (key == NULL) {
114+
LD_LOG(LD_LOG_WARNING, "LDObjectNewChild NULL key");
115+
116+
return NULL;
117+
}
118+
119+
#endif
120+
121+
cJSON_DeleteItemFromObjectCaseSensitive(object, key);
122+
123+
if (!(child = cJSON_AddObjectToObject(object, key))) {
124+
LD_LOG(LD_LOG_ERROR, "LDObjectNewChild failed to create child object");
125+
126+
return NULL;
127+
}
128+
129+
return (struct LDJSON*) child;
130+
}
131+
132+
LDBoolean
133+
LDObjectSetNumber(struct LDJSON *rawObject, const char *const key, const double number) {
134+
cJSON *const object = (cJSON *)rawObject;
135+
136+
LD_ASSERT_API(object);
137+
LD_ASSERT_API(cJSON_IsObject(object));
138+
LD_ASSERT_API(key);
139+
140+
#ifdef LAUNCHDARKLY_DEFENSIVE
141+
if (object == NULL) {
142+
LD_LOG(LD_LOG_WARNING, "LDObjectSetNumber NULL object");
143+
144+
return LDBooleanFalse;
145+
}
146+
147+
if (cJSON_IsObject(object) == LDBooleanFalse) {
148+
LD_LOG(LD_LOG_WARNING, "LDObjectSetNumber not object");
149+
150+
return LDBooleanFalse;
151+
}
152+
153+
if (key == NULL) {
154+
LD_LOG(LD_LOG_WARNING, "LDObjectSetNumber NULL key");
155+
156+
return LDBooleanFalse;
157+
}
158+
159+
#endif
160+
161+
cJSON_DeleteItemFromObjectCaseSensitive(object, key);
162+
163+
if (!cJSON_AddNumberToObject(object, key, number)) {
164+
LD_LOG(LD_LOG_ERROR, "LDObjectSetNumber failed to set value");
165+
166+
return LDBooleanFalse;
167+
}
168+
169+
return LDBooleanTrue;
170+
}
171+
172+
173+
LDBoolean
174+
LDObjectSetReference(struct LDJSON *const rawObject, const char *const key, struct LDJSON *const item)
175+
{
176+
cJSON *const object = (cJSON *)rawObject;
177+
178+
LD_ASSERT_API(object);
179+
LD_ASSERT_API(cJSON_IsObject(object));
180+
LD_ASSERT_API(key);
181+
LD_ASSERT_API(item);
182+
183+
#ifdef LAUNCHDARKLY_DEFENSIVE
184+
if (object == NULL) {
185+
LD_LOG(LD_LOG_WARNING, "LDObjectSetReference NULL object");
186+
187+
return LDBooleanFalse;
188+
}
189+
190+
if (cJSON_IsObject(object) == LDBooleanFalse) {
191+
LD_LOG(LD_LOG_WARNING, "LDObjectSetReference not object");
192+
193+
return LDBooleanFalse;
194+
}
195+
196+
if (key == NULL) {
197+
LD_LOG(LD_LOG_WARNING, "LDObjectSetReference NULL key");
198+
199+
return LDBooleanFalse;
200+
}
201+
202+
if (item == NULL) {
203+
LD_LOG(LD_LOG_WARNING, "LDObjectSetReference NULL item");
204+
205+
return LDBooleanFalse;
206+
}
207+
#endif
208+
209+
cJSON_AddItemReferenceToObject(object, key, (cJSON *)item);
210+
211+
return LDBooleanTrue;
212+
}

0 commit comments

Comments
 (0)