static void test_merge_array(void) { JsonElement *a = JsonArrayCreate(2); JsonArrayAppendString(a, "a"); JsonArrayAppendString(a, "b"); JsonElement *b = JsonArrayCreate(2); JsonArrayAppendString(b, "c"); JsonArrayAppendString(b, "d"); JsonElement *c = JsonMerge(a, b); assert_int_equal(2, JsonLength(a)); assert_int_equal(2, JsonLength(b)); assert_int_equal(4, JsonLength(c)); assert_string_equal("a", JsonArrayGetAsString(c, 0)); assert_string_equal("b", JsonArrayGetAsString(c, 1)); assert_string_equal("c", JsonArrayGetAsString(c, 2)); assert_string_equal("d", JsonArrayGetAsString(c, 3)); JsonDestroy(a); JsonDestroy(b); JsonDestroy(c); }
static void test_copy_compare(void) { JsonElement *bench = LoadTestFile("benchmark.json"); assert_true(bench != NULL); JsonElement *copy = JsonCopy(bench); assert_true(copy != NULL); assert_int_equal(0, JsonCompare(copy, bench)); JsonDestroy(bench); JsonDestroy(copy); }
static void test_parse_escaped_string(void) { { const char *data = "\"\\\\\""; const char *original = data; JsonElement *json = NULL; assert_int_equal(JSON_PARSE_OK, JsonParse(&data, &json)); assert_string_equal("\\", JsonPrimitiveGetAsString(json)); char *out = JsonToString(json); assert_string_equal(original, out); free(out); JsonDestroy(json); } { // included by paranoia from Redmine #5773 const char *data = "\"/\\\\//\\\\/\\\\\""; const char *original = data; JsonElement *json = NULL; assert_int_equal(JSON_PARSE_OK, JsonParse(&data, &json)); assert_string_equal("/\\//\\/\\", JsonPrimitiveGetAsString(json)); char *out = JsonToString(json); assert_string_equal(original, out); free(out); JsonDestroy(json); } { const char *data = "\"x\\tx\""; const char *original = data; JsonElement *json = NULL; assert_int_equal(JSON_PARSE_OK, JsonParse(&data, &json)); assert_string_equal("x\tx", JsonPrimitiveGetAsString(json)); char *out = JsonToString(json); assert_string_equal(original, out); free(out); JsonDestroy(json); } }
void RvalDestroy(Rval rval) { if (rval.item == NULL) { return; } switch (rval.type) { case RVAL_TYPE_SCALAR: ThreadLock(cft_lock); free(RvalScalarValue(rval)); ThreadUnlock(cft_lock); return; case RVAL_TYPE_LIST: RlistDestroy(RvalRlistValue(rval)); return; case RVAL_TYPE_FNCALL: FnCallDestroy(RvalFnCallValue(rval)); break; case RVAL_TYPE_CONTAINER: JsonDestroy(RvalContainerValue(rval)); break; case RVAL_TYPE_NOPROMISEE: return; } }
static void test_detach_key_from_object(void) { JsonElement *object = JsonObjectCreate(3); JsonObjectAppendInteger(object, "one", 1); JsonObjectAppendInteger(object, "two", 2); JsonObjectAppendInteger(object, "three", 3); JsonElement *detached = JsonObjectDetachKey(object, "two"); assert_int_equal(2, JsonLength(object)); JsonDestroy(object); assert_int_equal(1, JsonLength(detached)); JsonDestroy(detached); }
static void test_show_object_compound_compact(void) { JsonElement *json = JsonObjectCreate(10); JsonObjectAppendString(json, "first", "one"); { JsonElement *inner = JsonObjectCreate(10); JsonObjectAppendString(inner, "third", "three"); JsonObjectAppendObject(json, "second", inner); } { JsonElement *inner = JsonObjectCreate(10); JsonObjectAppendString(inner, "fifth", "five"); JsonObjectAppendObject(json, "fourth", inner); } Writer *writer = StringWriter(); JsonWriteCompact(writer, json); char *output = StringWriterClose(writer); assert_string_equal("{\"first\":\"one\",\"second\":{\"third\":\"three\"},\"fourth\":{\"fifth\":\"five\"}}", output); JsonDestroy(json); free(output); }
static void test_new_delete(void) { JsonElement *json = JsonObjectCreate(10); JsonObjectAppendString(json, "first", "one"); JsonDestroy(json); }
/** * @brief Writes a file with a contained timestamp to mark a policy file as validated * @param filename the filename * @return True if successful. */ static bool WritePolicyValidatedFile(ARG_UNUSED const GenericAgentConfig *config, const char *filename) { if (!MakeParentDirectory(filename, true)) { Log(LOG_LEVEL_ERR, "While writing policy validated marker file '%s', could not create directory (MakeParentDirectory: %s)", filename, GetErrorStr()); return false; } int fd = creat(filename, 0600); if (fd == -1) { Log(LOG_LEVEL_ERR, "While writing policy validated marker file '%s', could not create file (creat: %s)", filename, GetErrorStr()); return false; } JsonElement *info = JsonObjectCreate(3); JsonObjectAppendInteger(info, "timestamp", time(NULL)); Writer *w = FileWriter(fdopen(fd, "w")); JsonWrite(w, info, 0); WriterClose(w); JsonDestroy(info); Log(LOG_LEVEL_VERBOSE, "Saved policy validated marker file '%s'", filename); return true; }
static void test_show_object_compound(void) { JsonElement *json = JsonObjectCreate(10); JsonObjectAppendString(json, "first", "one"); { JsonElement *inner = JsonObjectCreate(10); JsonObjectAppendString(inner, "third", "three"); JsonObjectAppendObject(json, "second", inner); } { JsonElement *inner = JsonObjectCreate(10); JsonObjectAppendString(inner, "fifth", "five"); JsonObjectAppendObject(json, "fourth", inner); } Writer *writer = StringWriter(); JsonWrite(writer, json, 0); char *output = StringWriterClose(writer); assert_string_equal(OBJECT_COMPOUND, output); JsonDestroy(json); free(output); }
/** * @brief Writes a file with a contained release ID based on git SHA, * or file checksum if git SHA is not available. * @param filename the release_id file * @param dirname the directory to checksum or get the Git hash * @return True if successful */ static bool WriteReleaseIdFile(const char *filename, const char *dirname) { char release_id[GENERIC_AGENT_CHECKSUM_SIZE]; bool have_release_id = GeneratePolicyReleaseID(release_id, sizeof(release_id), dirname); if (!have_release_id) { return false; } int fd = creat(filename, 0600); if (fd == -1) { Log(LOG_LEVEL_ERR, "While writing policy release ID file '%s', could not create file (creat: %s)", filename, GetErrorStr()); return false; } JsonElement *info = JsonObjectCreate(3); JsonObjectAppendString(info, "releaseId", release_id); Writer *w = FileWriter(fdopen(fd, "w")); JsonWrite(w, info, 0); WriterClose(w); JsonDestroy(info); Log(LOG_LEVEL_VERBOSE, "Saved policy release ID file '%s'", filename); return true; }
static void test_parse_array_diverse(void) { { const char *data = "[1, \"snookie\", 1.0, {}, [], true, false, null ]"; JsonElement *json = NULL; assert_int_equal(JSON_PARSE_OK, JsonParse(&data, &json)); assert_true(json); JsonDestroy(json); } { const char *data = "[1,\"snookie\",1.0,{},[],true,false,null]"; JsonElement *json = NULL; assert_int_equal(JSON_PARSE_OK, JsonParse(&data, &json)); assert_true(json); JsonDestroy(json); } }
static void test_parse_object_diverse(void) { { const char *data = "{ \"a\": 1, \"b\": \"snookie\", \"c\": 1.0, \"d\": {}, \"e\": [], \"f\": true, \"g\": false, \"h\": null }"; JsonElement *json = NULL; assert_int_equal(JSON_PARSE_OK, JsonParse(&data, &json)); assert_true(json); JsonDestroy(json); } { const char *data = "{\"a\":1,\"b\":\"snookie\",\"c\":1.0,\"d\":{},\"e\":[],\"f\":true,\"g\":false,\"h\":null}"; JsonElement *json = NULL; assert_int_equal(JSON_PARSE_OK, JsonParse(&data, &json)); assert_true(json); JsonDestroy(json); } }
static void test_parse_array_extra_closing(void) { const char *data = " []]"; JsonElement *json = NULL; assert_int_equal(JSON_PARSE_OK, JsonParse(&data, &json)); assert_true(json); JsonDestroy(json); }
static void test_parse_tzz_evil_key(void) { const char *data = "{ \"third key! can? be$ anything&\": [ \"a\", \"b\", \"c\" ]}"; JsonElement *obj = NULL; assert_int_equal(JSON_PARSE_OK, JsonParse(&data, &obj)); assert_string_equal("b", JsonArrayGetAsString(JsonObjectGetAsArray(obj, "third key! can? be$ anything&"), 1)); JsonDestroy(obj); }
static void test_parse_array_simple(void) { const char *data = ARRAY_SIMPLE; JsonElement *arr = NULL; assert_int_equal(JSON_PARSE_OK, JsonParse(&data, &arr)); assert_string_equal(JsonArrayGetAsString(arr, 1), "two"); assert_string_equal(JsonArrayGetAsString(arr, 0), "one"); JsonDestroy(arr); }
static void test_object_duplicate_key(void) { JsonElement *a = JsonObjectCreate(1); JsonObjectAppendString(a, "a", "a"); JsonObjectAppendString(a, "a", "a"); assert_int_equal(1, JsonLength(a)); JsonDestroy(a); }
static void test_parse_object_simple(void) { const char *data = OBJECT_SIMPLE; JsonElement *obj = NULL; assert_int_equal(JSON_PARSE_OK, JsonParse(&data, &obj)); assert_string_equal(JsonObjectGetAsString(obj, "second"), "two"); assert_string_equal(JsonObjectGetAsString(obj, "first"), "one"); assert_int_equal(JsonObjectGetAsString(obj, "third"), NULL); JsonDestroy(obj); }
static void test_parse_array_object(void) { const char *data = ARRAY_OBJECT; JsonElement *arr = NULL; assert_int_equal(JSON_PARSE_OK, JsonParse(&data, &arr)); JsonElement *first = JsonArrayGetAsObject(arr, 0); assert_string_equal(JsonObjectGetAsString(first, "first"), "one"); JsonDestroy(arr); }
static void test_array_get_string(void) { JsonElement *arr = JsonArrayCreate(10); JsonArrayAppendString(arr, "first"); JsonArrayAppendString(arr, "second"); assert_string_equal(JsonArrayGetAsString(arr, 1), "second"); assert_string_equal(JsonArrayGetAsString(arr, 0), "first"); JsonDestroy(arr); }
static void test_object_get_string(void) { JsonElement *obj = JsonObjectCreate(10); JsonObjectAppendString(obj, "first", "one"); JsonObjectAppendString(obj, "second", "two"); assert_string_equal(JsonObjectGetAsString(obj, "second"), "two"); assert_string_equal(JsonObjectGetAsString(obj, "first"), "one"); JsonDestroy(obj); }
int main(int argc, char *argv[]) { EvalContext *ctx = EvalContextNew(); GenericAgentConfig *config = CheckOpts(ctx, argc, argv); GenericAgentConfigApply(ctx, config); GenericAgentDiscoverContext(ctx, config); Policy *policy = GenericAgentLoadPolicy(ctx, config); if (!policy) { Log(LOG_LEVEL_ERR, "Input files contain errors."); exit(EXIT_FAILURE); } if (SHOWREPORTS) { ShowPromises(policy->bundles, policy->bodies); } switch (config->agent_specific.common.policy_output_format) { case GENERIC_AGENT_CONFIG_COMMON_POLICY_OUTPUT_FORMAT_CF: { Policy *output_policy = ParserParseFile(config->input_file, config->agent_specific.common.parser_warnings, config->agent_specific.common.parser_warnings_error); Writer *writer = FileWriter(stdout); PolicyToString(policy, writer); WriterClose(writer); PolicyDestroy(output_policy); } break; case GENERIC_AGENT_CONFIG_COMMON_POLICY_OUTPUT_FORMAT_JSON: { Policy *output_policy = ParserParseFile(config->input_file, config->agent_specific.common.parser_warnings, config->agent_specific.common.parser_warnings_error); JsonElement *json_policy = PolicyToJson(output_policy); Writer *writer = FileWriter(stdout); JsonWrite(writer, json_policy, 2); WriterClose(writer); JsonDestroy(json_policy); PolicyDestroy(output_policy); } break; case GENERIC_AGENT_CONFIG_COMMON_POLICY_OUTPUT_FORMAT_NONE: break; } GenericAgentConfigDestroy(config); EvalContextDestroy(ctx); }
static void test_show_string(void) { JsonElement *str = JsonStringCreate("snookie"); Writer *writer = StringWriter(); JsonWrite(writer, str, 0); char *output = StringWriterClose(writer); assert_string_equal("\"snookie\"", output); JsonDestroy(str); free(output); }
static void test_show_array_empty(void) { JsonElement *array = JsonArrayCreate(10); Writer *writer = StringWriter(); JsonWrite(writer, array, 0); char *output = StringWriterClose(writer); assert_string_equal("[]", output); JsonDestroy(array); free(output); }
static void test_remove_key_from_object(void) { JsonElement *object = JsonObjectCreate(3); JsonObjectAppendInteger(object, "one", 1); JsonObjectAppendInteger(object, "two", 2); JsonObjectAppendInteger(object, "three", 3); JsonObjectRemoveKey(object, "two"); assert_int_equal(2, JsonLength(object)); JsonDestroy(object); }
static void test_parse_primitives(void) { JsonElement *pri = NULL; const char *data = "\"foo\""; assert_int_equal(JSON_PARSE_OK, JsonParse(&data, &pri)); assert_string_equal("foo", JsonPrimitiveGetAsString(pri)); JsonDestroy(pri); data = "-123"; assert_int_equal(JSON_PARSE_OK, JsonParse(&data, &pri)); assert_true(-123 == JsonPrimitiveGetAsInteger(pri)); JsonDestroy(pri); data = "1.23"; assert_int_equal(JSON_PARSE_OK, JsonParse(&data, &pri)); assert_double_close(1.23, JsonPrimitiveGetAsReal(pri)); JsonDestroy(pri); data = "true"; assert_int_equal(JSON_PARSE_OK, JsonParse(&data, &pri)); assert_true(JsonPrimitiveGetAsBool(pri)); JsonDestroy(pri); }
static void test_show_array_infinity(void) { JsonElement *array = JsonArrayCreate(10); JsonArrayAppendReal(array, INFINITY); Writer *writer = StringWriter(); JsonWrite(writer, array, 0); char *output = StringWriterClose(writer); assert_string_equal("[\n 0.0000\n]", output); JsonDestroy(array); free(output); }
static void test_parse_empty_string(void) { const char *data = ""; JsonElement *json = NULL; assert_int_not_equal(JSON_PARSE_OK, JsonParse(&data, &json)); assert_false(json); data = "\"\""; assert_int_equal(JSON_PARSE_OK, JsonParse(&data, &json)); assert_string_equal("", JsonPrimitiveGetAsString(json)); JsonDestroy(json); }
static void test_merge_object(void) { JsonElement *a = JsonObjectCreate(2); JsonObjectAppendString(a, "a", "a"); JsonObjectAppendString(a, "b", "b"); JsonElement *b = JsonObjectCreate(2); JsonObjectAppendString(b, "b", "b"); JsonObjectAppendString(b, "c", "c"); JsonElement *c = JsonMerge(a, b); assert_int_equal(2, JsonLength(a)); assert_int_equal(2, JsonLength(b)); assert_int_equal(3, JsonLength(c)); assert_string_equal("a", JsonObjectGetAsString(c, "a")); assert_string_equal("b", JsonObjectGetAsString(c, "b")); assert_string_equal("c", JsonObjectGetAsString(c, "c")); JsonDestroy(a); JsonDestroy(b); JsonDestroy(c); }
static void test_parse_empty_containers(void) { { const char *data = "{}"; JsonElement *obj = NULL; assert_int_equal(JSON_PARSE_OK, JsonParse(&data, &obj)); assert_true(obj != NULL); assert_int_equal(JSON_ELEMENT_TYPE_CONTAINER, JsonGetElementType(obj)); assert_int_equal(JSON_CONTAINER_TYPE_OBJECT, JsonGetContainerType(obj)); assert_int_equal(0, JsonLength(obj)); JsonDestroy(obj); } { const char *data = "[]"; JsonElement *arr = NULL; assert_int_equal(JSON_PARSE_OK, JsonParse(&data, &arr)); assert_true(arr != NULL); assert_int_equal(JSON_ELEMENT_TYPE_CONTAINER, JsonGetElementType(arr)); assert_int_equal(JSON_CONTAINER_TYPE_ARRAY, JsonGetContainerType(arr)); assert_int_equal(0, JsonLength(arr)); JsonDestroy(arr); } }
static void test_show_object_boolean(void) { JsonElement *json = JsonObjectCreate(10); JsonObjectAppendBool(json, "bool_value", true); Writer *writer = StringWriter(); JsonWrite(writer, json, 0); char *output = StringWriterClose(writer); assert_string_equal(OBJECT_BOOLEAN, output); JsonDestroy(json); free(output); }