You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
234 lines
8.2 KiB
C
234 lines
8.2 KiB
C
#include <tau/tau.h>
|
|
#include <libmseed.h>
|
|
#include <yyjson.h>
|
|
|
|
#include "../yyjson.h"
|
|
|
|
char *testheaders = "{ \
|
|
\"FDSN\": {\
|
|
\"Time\": {\
|
|
\"Quality\": 100,\
|
|
\"Correction\": 1.234\
|
|
},\
|
|
\"Event\": { \
|
|
\"Begin\": true,\
|
|
\"End\": true,\
|
|
\"InProgress\": true,\
|
|
\"Detection\": [\
|
|
{\
|
|
\"Type\": \"MURDOCK\",\
|
|
\"SignalAmplitude\": 80,\
|
|
\"SignalPeriod\": 0.4,\
|
|
\"BackgroundEstimate\": 18,\
|
|
\"Wave\": \"DILATATION\",\
|
|
\"Units\": \"COUNTS\",\
|
|
\"OnsetTime\": \"2022-06-05T20:32:39.120000Z\",\
|
|
\"MEDSNR\": [ 1, 3, 2, 1, 4, 0 ],\
|
|
\"MEDLookback\": 2,\
|
|
\"MEDPickAlgorithm\": 0,\
|
|
\"Detector\": \"Z_SPWWSS\"\
|
|
}\
|
|
]\
|
|
}\
|
|
}\
|
|
}";
|
|
|
|
TEST (extraheaders, get_set)
|
|
{
|
|
MS3Record *msr = NULL;
|
|
int64_t getint;
|
|
double getnum;
|
|
char getstr[100];
|
|
int getbool;
|
|
int rv;
|
|
|
|
int64_t setint;
|
|
double setnum;
|
|
char *setstr;
|
|
int setbool;
|
|
|
|
msr = msr3_init (msr);
|
|
REQUIRE (msr != NULL, "msr3_init() returned unexpected NULL");
|
|
|
|
msr->extralength = strlen (testheaders);
|
|
msr->extra = malloc (msr->extralength);
|
|
REQUIRE (msr->extra != NULL, "Error allocating memory for msr->extra");
|
|
memcpy (msr->extra, testheaders, msr->extralength);
|
|
|
|
/* Matching */
|
|
rv = mseh_exists (msr, "/FDSN/Time/Quality");
|
|
CHECK (rv, "mseh_exists() returned unexpected false");
|
|
|
|
rv = mseh_exists (msr, "/FDSN/Event/Detection/0");
|
|
CHECK (rv, "mseh_exists() returned unexpected false for array element");
|
|
|
|
rv = mseh_get_number (msr, "/FDSN/Time/Correction", &getnum);
|
|
CHECK (rv == 0, "mseh_get_number() returned unexpected non-match");
|
|
CHECK (getnum == 1.234, "/FDSN/Time/Correction is not expected 1.234");
|
|
|
|
rv = mseh_get_int64 (msr, "/FDSN/Time/Quality", &getint);
|
|
CHECK (rv == 0, "mseh_get_int64() returned unexpected non-match");
|
|
CHECK (getint == 100, "/FDSN/Time/Quality is not expected 100");
|
|
|
|
/* Key in first (0th) object of /FDSN/Event/Detection array */
|
|
rv = mseh_get_string (msr, "/FDSN/Event/Detection/0/Type", getstr, sizeof(getstr));
|
|
CHECK (rv == 0, "mseh_get_string() returned unexpected non-match");
|
|
CHECK_STREQ (getstr, "MURDOCK");
|
|
|
|
rv = mseh_get_boolean (msr, "/FDSN/Event/Begin", &getbool);
|
|
CHECK (rv == 0, "mseh_get_boolean() returned unexpected non-match");
|
|
CHECK (getbool, "/FDSN/Event/Begin is not expected True");
|
|
|
|
/* Non matching */
|
|
rv = mseh_exists (msr, "/FDSN/Event/Detection/1");
|
|
CHECK (!rv, "mseh_exists() returned unexpected true for array element");
|
|
|
|
rv = mseh_get_int64 (msr, "/A/Non/Existant/Header", &getint);
|
|
CHECK (rv != 0, "mseh_get_int64() returned unexpected match");
|
|
|
|
/* Set and get */
|
|
setnum = 3.14159;
|
|
rv = mseh_set_number (msr, "/New/Number", &setnum);
|
|
CHECK (rv == 0, "mseh_set_num() returned unexpected error");
|
|
|
|
rv = mseh_get_number (msr, "/New/Number", &getnum);
|
|
CHECK (rv == 0, "mseh_get_num() returned unexpected non-match");
|
|
CHECK (getnum == setnum);
|
|
|
|
setint = 51204;
|
|
rv = mseh_set_int64 (msr, "/New/Integer", &setint);
|
|
CHECK (rv == 0, "mseh_set_int64() returned unexpected error");
|
|
|
|
rv = mseh_get_int64 (msr, "/New/Integer", &getint);
|
|
CHECK (rv == 0, "mseh_set_int64() returned unexpected non-match");
|
|
CHECK (getint == setint);
|
|
|
|
setstr = "Value";
|
|
rv = mseh_set_string (msr, "/New/String", setstr);
|
|
CHECK (rv == 0, "mseh_set_string() returned unexpected error");
|
|
|
|
rv = mseh_get_string (msr, "/New/String", getstr, sizeof(getstr));
|
|
CHECK (rv == 0, "mseh_get_string() returned unexpected non-match");
|
|
CHECK_STREQ (getstr, setstr);
|
|
|
|
setbool = true;
|
|
rv = mseh_set_boolean (msr, "/New/Boolean", &setbool);
|
|
CHECK (rv == 0, "mseh_set_boolean() returned unexpected error");
|
|
|
|
rv = mseh_get_boolean (msr, "/New/Boolean", &getbool);
|
|
CHECK (rv == 0, "mseh_set_boolean() returned unexpected non-match");
|
|
CHECK (getbool == setbool);
|
|
|
|
msr3_free (&msr);
|
|
}
|
|
|
|
TEST (extraheaders, mergepatch)
|
|
{
|
|
MS3Record *msr = NULL;
|
|
char *jsondoc;
|
|
char *patchdoc;
|
|
int rv;
|
|
|
|
msr = msr3_init (msr);
|
|
REQUIRE (msr != NULL, "msr3_init() returned unexpected NULL");
|
|
|
|
/* Populate initial header JSON */
|
|
jsondoc = "{\"root\":{\"string\":\"value\"}}";
|
|
msr->extralength = strlen (jsondoc);
|
|
msr->extra = malloc (msr->extralength);
|
|
REQUIRE (msr->extra != NULL, "Error allocating memory for msr->extra");
|
|
memcpy (msr->extra, jsondoc, msr->extralength);
|
|
|
|
/* Replace /root/string value with a pointer to the whole document ("") */
|
|
patchdoc = "{\"root\":{\"string\":\"Updated value\"}}";
|
|
rv = mseh_set_ptr_r (msr, "", patchdoc, 'M', NULL);
|
|
CHECK (rv == 0, "mseh_set_ptr_r() returned unexpected error");
|
|
REQUIRE (msr->extra != NULL, "msr->extra cannot be NULL");
|
|
jsondoc = patchdoc;
|
|
CHECK_SUBSTREQ (msr->extra, jsondoc, strlen(jsondoc));
|
|
|
|
/* Add the /root/array value with pointer to /root */
|
|
patchdoc = "{\"array\":[1,2,3]}";
|
|
rv = mseh_set_ptr_r (msr, "/root", patchdoc, 'M', NULL);
|
|
CHECK (rv == 0, "mseh_set_ptr_r() returned unexpected error");
|
|
REQUIRE (msr->extra != NULL, "msr->extra cannot be NULL");
|
|
jsondoc = "{\"root\":{\"string\":\"Updated value\",\"array\":[1,2,3]}}";
|
|
CHECK_SUBSTREQ (msr->extra, jsondoc, strlen(jsondoc));
|
|
|
|
/* Remove /root/string, /root/array, and add /root/boolean */
|
|
patchdoc = "{\"root\":{\"string\":null,\"array\":null,\"boolean\":true}}";
|
|
rv = mseh_set_ptr_r (msr, "", patchdoc, 'M', NULL);
|
|
CHECK (rv == 0, "mseh_set_ptr_r() returned unexpected error");
|
|
REQUIRE (msr->extra != NULL, "msr->extra cannot be NULL");
|
|
jsondoc = "{\"root\":{\"boolean\":true}}";
|
|
CHECK_SUBSTREQ (msr->extra, jsondoc, strlen(jsondoc));
|
|
|
|
msr3_free (&msr);
|
|
}
|
|
|
|
TEST (extraheaders, internal)
|
|
{
|
|
MS3Record *msr = NULL;
|
|
yyjson_mut_val mut_val;
|
|
int64_t getint;
|
|
double getnum;
|
|
int getbool;
|
|
char *string;
|
|
int rv;
|
|
|
|
/* Test internal functionality of raw yyjson values and array appending */
|
|
|
|
msr = msr3_init (msr);
|
|
REQUIRE (msr != NULL, "msr3_init() returned unexpected NULL");
|
|
|
|
yyjson_mut_set_str (&mut_val, "value");
|
|
rv = mseh_set_ptr_r (msr, "/root/string", &mut_val, 'V', NULL);
|
|
CHECK (rv == 0, "mseh_set_ptr_r() returned unexpected error");
|
|
string = "{\"root\":{\"string\":\"value\"}}";
|
|
CHECK_SUBSTREQ (msr->extra, string, strlen(string));
|
|
|
|
yyjson_mut_set_real (&mut_val, 123.456);
|
|
rv = mseh_set_ptr_r (msr, "/root/real", &mut_val, 'V', NULL);
|
|
CHECK (rv == 0, "mseh_set_ptr_r() returned unexpected error");
|
|
rv = mseh_get_number (msr, "/root/real", &getnum);
|
|
CHECK (rv == 0, "mseh_get_number() returned unexpected non-match");
|
|
CHECK (getnum == 123.456, "mseh_get_number() did not return expected value");
|
|
|
|
yyjson_mut_set_sint (&mut_val, -123456);
|
|
rv = mseh_set_ptr_r (msr, "/root/int", &mut_val, 'V', NULL);
|
|
CHECK (rv == 0, "mseh_set_ptr_r() returned unexpected error");
|
|
rv = mseh_get_int64 (msr, "/root/int", &getint);
|
|
CHECK (rv == 0, "mseh_get_int64() returned unexpected non-match");
|
|
CHECK (getint == -123456, "mseh_get_int64() did not return expected value");
|
|
|
|
yyjson_mut_set_bool (&mut_val, false);
|
|
rv = mseh_set_ptr_r (msr, "/root/bool", &mut_val, 'V', NULL);
|
|
CHECK (rv == 0, "mseh_set_ptr_r() returned unexpected error");
|
|
rv = mseh_get_boolean (msr, "/root/bool", &getbool);
|
|
CHECK (rv == 0, "mseh_get_boolean() returned unexpected non-match");
|
|
CHECK (getbool == false, "mseh_get_boolean() did not return expected value");
|
|
|
|
/* Build array of values */
|
|
yyjson_mut_set_str (&mut_val, "value");
|
|
rv = mseh_set_ptr_r (msr, "/root/array", &mut_val, 'A', NULL);
|
|
CHECK (rv == 0, "mseh_set_ptr_r() returned unexpected error");
|
|
|
|
yyjson_mut_set_real (&mut_val, 123.456);
|
|
rv = mseh_set_ptr_r (msr, "/root/array", &mut_val, 'A', NULL);
|
|
CHECK (rv == 0, "mseh_set_ptr_r() returned unexpected error");
|
|
|
|
yyjson_mut_set_sint (&mut_val, -123456);
|
|
rv = mseh_set_ptr_r (msr, "/root/array", &mut_val, 'A', NULL);
|
|
CHECK (rv == 0, "mseh_set_ptr_r() returned unexpected error");
|
|
|
|
yyjson_mut_set_bool (&mut_val, false);
|
|
rv = mseh_set_ptr_r (msr, "/root/array", &mut_val, 'A', NULL);
|
|
CHECK (rv == 0, "mseh_set_ptr_r() returned unexpected error");
|
|
|
|
/* Get 2nd value */
|
|
rv = mseh_get_number (msr, "/root/array/1", &getnum);
|
|
CHECK (rv == 0, "mseh_get_number() returned unexpected non-match");
|
|
CHECK (getnum == 123.456, "mseh_get_number() did not return expected value");
|
|
|
|
msr3_free (&msr);
|
|
} |