From: Sergey Matveev Date: Wed, 18 Jun 2025 12:35:27 +0000 (+0300) Subject: Schema integration tests X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=b970a50f43cba332496a226bda08fb9e9a0b721c517eed5d73b48236f6e35c92;p=keks.git Schema integration tests --- diff --git a/c/lib/schema.c b/c/lib/schema.c index 2301f27..c253b2a 100644 --- a/c/lib/schema.c +++ b/c/lib/schema.c @@ -490,9 +490,8 @@ Eached: return err; } err.msg = "TIMEPREC"; - if (v == SIZE_MAX) { - err.code = KEKSSchemaErrNo; - } else { + err.code = KEKSSchemaErrNo; + if (v != SIZE_MAX) { if (data->list[v].atom.typ != KEKSItemTAI64) { err.code = KEKSSchemaErrUnexpectedState; err.msg = "non-TAI64 taken"; @@ -504,18 +503,21 @@ Eached: if (data->list[v].atom.v.str.len > 8) { err.code = KEKSSchemaErrInvalidData; err.msg = ">TAI64"; + return err; } break; case 3: // ms if (data->list[v].atom.v.str.len > 12) { err.code = KEKSSchemaErrInvalidData; err.msg = ">TAI64N"; + return err; } if (data->list[v].atom.v.str.len > 8) { val = (uint32_t)keksFromBE(data->list[v].atom.v.str.ptr + 8, 4); if ((val % 1000000) != 0) { err.code = KEKSSchemaErrInvalidData; err.msg = ">ms"; + return err; } } break; @@ -523,12 +525,14 @@ Eached: if (data->list[v].atom.v.str.len > 12) { err.code = KEKSSchemaErrInvalidData; err.msg = ">TAI64N"; + return err; } if (data->list[v].atom.v.str.len > 8) { val = (uint32_t)keksFromBE(data->list[v].atom.v.str.ptr + 8, 4); if ((val % 1000) != 0) { err.code = KEKSSchemaErrInvalidData; err.msg = ">µs"; + return err; } } break; @@ -536,6 +540,7 @@ Eached: if (data->list[v].atom.v.str.len > 12) { err.code = KEKSSchemaErrInvalidData; err.msg = ">TAI64N"; + return err; } break; case 12: // ps @@ -544,6 +549,7 @@ Eached: if ((val % 1000000) != 0) { err.code = KEKSSchemaErrInvalidData; err.msg = ">ps"; + return err; } } break; @@ -553,17 +559,15 @@ Eached: if ((val % 1000) != 0) { err.code = KEKSSchemaErrInvalidData; err.msg = ">fs"; + return err; } } break; - case 18: // as - break; default: err.code = KEKSSchemaErrInvalidSchema; err.msg = "unknown TIMEPREC value"; return err; } - err.code = KEKSSchemaErrNo; } } else if (KEKSStrEqual(&(schema->list[idxSchema].atom), CmdUTC)) { err.msg = "UTC"; diff --git a/go/cmd/schema-validate/main.go b/go/cmd/schema-validate/main.go index f78673b..c3cbb4c 100644 --- a/go/cmd/schema-validate/main.go +++ b/go/cmd/schema-validate/main.go @@ -16,9 +16,11 @@ package main import ( + "bufio" "errors" "flag" "fmt" + "io" "log" "os" @@ -29,15 +31,15 @@ import ( func main() { flag.Parse() log.SetFlags(0) - if flag.NArg() != 3 { - fmt.Fprintf(os.Stderr, "Usage: schema-validate SCHEMA.keks SCHEMA-NAME DATA.keks\n") + if flag.NArg() != 2 { + fmt.Fprintf(os.Stderr, "Usage: schema-validate SCHEMA.keks SCHEMA-NAME -91 <91}} + longitude {{field . {int} >-181 <181}} + where { + {field . {list} len=2} + {field 0 {with latitude}} + {field 1 {with longitude}} + } + wheres {{field . {list} {of where} >0}} + +And [cm/pub/] as: << [schemas/pub.tcl] << [schemas/fpr.tcl] @@ -51,7 +62,7 @@ empty. (use "len=" for integers). "prec=p" issues TIMEPREC command, but instead of specifying the raw -integer values, you choose one of: s, ms, us, ns, ps, fs, as. +integer values, you choose one of: s, ms, us, ns, ps, fs. "utc" issues UTC command. diff --git a/tcl/schema.t/generic.t b/tcl/schema.t/generic.t new file mode 100755 index 0000000..dde238e --- /dev/null +++ b/tcl/schema.t/generic.t @@ -0,0 +1,574 @@ +#!/bin/sh + +test_description="Various generic tests" +. $SHARNESS_TEST_SRCDIR/sharness.sh +root=$(realpath ../..) +SCHEMA_VALIDATE=${SCHEMA_VALIDATE:-schema-validate} +export TCLLIBPATH=$root + +cat >schema.tcl <schema.keks +$root/keks.tcl >data.keks.hex <data.keks +test_expect_success "type ok" "$SCHEMA_VALIDATE schema.keks e data.keks.hex <data.keks +test_expect_success "type ok" "$SCHEMA_VALIDATE schema.keks e data.keks.hex <data.keks +test_expect_success "type !ok" "! $SCHEMA_VALIDATE schema.keks e schema.tcl <schema.keks +$root/keks.tcl >data.keks.hex <data.keks +test_expect_success "set ok" "$SCHEMA_VALIDATE schema.keks e data.keks.hex <data.keks +test_expect_success "set !ok" "! $SCHEMA_VALIDATE schema.keks e data.keks.hex <data.keks +test_expect_success "set macro" "$SCHEMA_VALIDATE schema.keks e schema.tcl <schema.keks +$root/keks.tcl >data.keks.hex <data.keks +test_expect_success "map various" "$SCHEMA_VALIDATE schema.keks e schema.tcl <schema.keks +$root/keks.tcl >data.keks.hex <data.keks +test_expect_success "map !of int" "! $SCHEMA_VALIDATE schema.keks e data.keks.hex <data.keks +test_expect_success "map of int" "$SCHEMA_VALIDATE schema.keks e schema.tcl <schema.keks +$root/keks.tcl >data.keks.hex <data.keks +test_expect_success "map of int schema" "$SCHEMA_VALIDATE schema.keks e schema.tcl <schema.keks +$root/keks.tcl >data.keks.hex <data.keks +test_expect_success "list various" "$SCHEMA_VALIDATE schema.keks e schema.tcl <schema.keks +$root/keks.tcl >data.keks.hex <data.keks +test_expect_success "list !of int" "! $SCHEMA_VALIDATE schema.keks e data.keks.hex <data.keks +test_expect_success "list of int" "$SCHEMA_VALIDATE schema.keks e schema.tcl <schema.keks +$root/keks.tcl >data.keks.hex <data.keks +test_expect_success "list of int schema" "$SCHEMA_VALIDATE schema.keks e schema.tcl <schema.keks +$root/keks.tcl >data.keks.hex <data.keks +test_expect_success "!only schema" "! $SCHEMA_VALIDATE schema.keks e data.keks.hex <data.keks +test_expect_success "only schema" "$SCHEMA_VALIDATE schema.keks e schema.tcl <schema.keks +$root/keks.tcl >data.keks.hex <data.keks +test_expect_success "map exists" "$SCHEMA_VALIDATE schema.keks e data.keks.hex <data.keks +test_expect_success "map !exists" "! $SCHEMA_VALIDATE schema.keks e schema.tcl <schema.keks +$root/keks.tcl >data.keks.hex <data.keks +test_expect_success "map optional" "$SCHEMA_VALIDATE schema.keks e data.keks.hex <data.keks +test_expect_success "map optional !exists" "$SCHEMA_VALIDATE schema.keks e data.keks.hex <data.keks +test_expect_success "map optional bad type" "! $SCHEMA_VALIDATE schema.keks e schema.tcl <schema.keks +$root/keks.tcl >data.keks.hex <data.keks +test_expect_success "map !!exists" "! $SCHEMA_VALIDATE schema.keks e data.keks.hex <data.keks +test_expect_success "map !exists" "$SCHEMA_VALIDATE schema.keks e schema.tcl <0}} +EOF +$root/schema.tcl schema.tcl | xxd -r -p >schema.keks +$root/keks.tcl >data.keks.hex <data.keks +test_expect_success "int !>0" "! $SCHEMA_VALIDATE schema.keks e data.keks.hex <data.keks +test_expect_success "int >0" "$SCHEMA_VALIDATE schema.keks e schema.tcl <-1000}} +EOF +$root/schema.tcl schema.tcl | xxd -r -p >schema.keks +$root/keks.tcl >data.keks.hex <data.keks +test_expect_success "int !>-999" "! $SCHEMA_VALIDATE schema.keks e data.keks.hex <data.keks +test_expect_success "int >-999" "$SCHEMA_VALIDATE schema.keks e schema.tcl <0}} +EOF +$root/schema.tcl schema.tcl | xxd -r -p >schema.keks +$root/keks.tcl >data.keks.hex <data.keks +test_expect_success "str !>0" "! $SCHEMA_VALIDATE schema.keks e data.keks.hex <data.keks +test_expect_success "str >0" "$SCHEMA_VALIDATE schema.keks e schema.tcl <0}} +EOF +$root/schema.tcl schema.tcl | xxd -r -p >schema.keks +$root/keks.tcl >data.keks.hex <data.keks +test_expect_success "list !>0" "! $SCHEMA_VALIDATE schema.keks e data.keks.hex <data.keks +test_expect_success "list >0" "$SCHEMA_VALIDATE schema.keks e schema.tcl <0}} +EOF +$root/schema.tcl schema.tcl | xxd -r -p >schema.keks +$root/keks.tcl >data.keks.hex <data.keks +test_expect_success "map !>0" "! $SCHEMA_VALIDATE schema.keks e data.keks.hex <data.keks +test_expect_success "map >0" "$SCHEMA_VALIDATE schema.keks e schema.tcl <schema.keks +$root/keks.tcl >data.keks.hex <data.keks +test_expect_success "map len=0" "$SCHEMA_VALIDATE schema.keks e schema.tcl <schema.keks +$root/keks.tcl >data.keks.hex <data.keks +test_expect_success "list len=0" "$SCHEMA_VALIDATE schema.keks e schema.tcl <schema.keks +$root/keks.tcl >data.keks.hex <data.keks +test_expect_success "str len=0" "$SCHEMA_VALIDATE schema.keks e schema.tcl <schema.keks +$root/keks.tcl >data.keks.hex <data.keks +test_expect_success "int len=0" "$SCHEMA_VALIDATE schema.keks e schema.tcl <schema.keks +$root/keks.tcl >data.keks.hex <data.keks +test_expect_success "map len=3" "$SCHEMA_VALIDATE schema.keks e schema.tcl <schema.keks +$root/keks.tcl >data.keks.hex <data.keks +test_expect_success "list len=3" "$SCHEMA_VALIDATE schema.keks e schema.tcl <schema.keks +$root/keks.tcl >data.keks.hex <data.keks +test_expect_success "str len=3" "$SCHEMA_VALIDATE schema.keks e schema.tcl <schema.keks +$root/keks.tcl >data.keks.hex <data.keks +test_expect_success "int len=0" "$SCHEMA_VALIDATE schema.keks e schema.tcl <schema.keks +$root/keks.tcl >data.keks.hex <data.keks +test_expect_success "fpr !exists" "$SCHEMA_VALIDATE schema.keks e data.keks.hex <data.keks +test_expect_success "fpr bad type" "! $SCHEMA_VALIDATE schema.keks e data.keks.hex <data.keks +test_expect_success "fpr ok" "$SCHEMA_VALIDATE schema.keks e schema.tcl <schema.keks +$root/keks.tcl >data.keks.hex <data.keks +test_expect_success "tai64 ok" "$SCHEMA_VALIDATE schema.keks e data.keks.hex <data.keks +test_expect_success "tai64 !utc" "$SCHEMA_VALIDATE schema.keks e schema.tcl <schema.keks +$root/keks.tcl >data.keks.hex <data.keks +test_expect_success "tai64 !!utc" "! $SCHEMA_VALIDATE schema.keks e schema.tcl <schema.keks +$root/keks.tcl >data.keks.hex <data.keks +test_expect_success "tai64 prec=s" "$SCHEMA_VALIDATE schema.keks e data.keks.hex <data.keks +test_expect_success "tai64 !prec=s" "! $SCHEMA_VALIDATE schema.keks e schema.tcl <schema.keks +$root/keks.tcl >data.keks.hex <data.keks +test_expect_success "tai64 prec=ms" "$SCHEMA_VALIDATE schema.keks e data.keks.hex <data.keks +test_expect_success "tai64 !prec=ms" "! $SCHEMA_VALIDATE schema.keks e schema.tcl <schema.keks +$root/keks.tcl >data.keks.hex <data.keks +test_expect_success "tai64 prec=us" "$SCHEMA_VALIDATE schema.keks e data.keks.hex <data.keks +test_expect_success "tai64 !prec=us" "! $SCHEMA_VALIDATE schema.keks e schema.tcl <schema.keks +$root/keks.tcl >data.keks.hex <data.keks +test_expect_success "tai64 prec=ns" "$SCHEMA_VALIDATE schema.keks e data.keks.hex <data.keks +test_expect_success "tai64 prec=ns" "$SCHEMA_VALIDATE schema.keks e data.keks.hex <data.keks +test_expect_success "tai64 !prec=ns" "! $SCHEMA_VALIDATE schema.keks e schema.tcl <schema.keks +$root/keks.tcl >data.keks.hex <data.keks +test_expect_success "tai64 prec=ps" "$SCHEMA_VALIDATE schema.keks e data.keks.hex <data.keks +test_expect_success "tai64 prec=ps" "$SCHEMA_VALIDATE schema.keks e data.keks.hex <data.keks +test_expect_success "tai64 !prec=ps" "! $SCHEMA_VALIDATE schema.keks e schema.tcl <schema.keks +$root/keks.tcl >data.keks.hex <data.keks +test_expect_success "tai64 prec=fs" "$SCHEMA_VALIDATE schema.keks e data.keks.hex <data.keks +test_expect_success "tai64 !prec=fs" "! $SCHEMA_VALIDATE schema.keks e schema.tcl <schema.keks +$root/keks.tcl >data.keks.hex <data.keks +test_expect_success "tai64 prec=fs" "$SCHEMA_VALIDATE schema.keks e schema.keks.hex <} {INT 100}}} + {LIST {{STR <} {INT 300}}} +}}} +EOF +xxd -r -p schema.keks +$root/keks.tcl >data.keks.hex <data.keks +test_expect_success "manual int ranges" "$SCHEMA_VALIDATE schema.keks e our.schema.tcl <0}} +fpr {{field . {bin} len=32}} +our { + {field a {with ai}} + {field v {bin str}} + {field fpr {with fpr}} + {field comment {str} optional} +} +EOF +$root/schema.tcl our.schema.tcl | xxd -r -p >our.schema.keks + +$root/keks.tcl >data.keks.hex <data.keks +test_expect_success "ok" "$SCHEMA_VALIDATE our.schema.keks our data.keks.hex <data.keks +test_expect_success "no comment" "$SCHEMA_VALIDATE our.schema.keks our data.keks.hex <data.keks +test_expect_success "empty comment" "$SCHEMA_VALIDATE our.schema.keks our data.keks.hex <data.keks +test_expect_success "fpr longer" "! $SCHEMA_VALIDATE our.schema.keks our data.keks.hex <data.keks +test_expect_success "fpr shorter" "! $SCHEMA_VALIDATE our.schema.keks our data.keks.hex <data.keks +test_expect_success "v empty" "$SCHEMA_VALIDATE our.schema.keks our data.keks.hex <data.keks +test_expect_success "a empty" "! $SCHEMA_VALIDATE our.schema.keks our data.keks.hex <data.keks +test_expect_success "a bad type" "! $SCHEMA_VALIDATE our.schema.keks our data.keks.hex <data.keks +test_expect_success "fpr no" "! $SCHEMA_VALIDATE our.schema.keks our data.keks.hex <data.keks +test_expect_success "a no" "! $SCHEMA_VALIDATE our.schema.keks our wheres.schema.tcl <-91 <91}} +longitude {{field . {int} >-181 <181}} +where { + {field . {list} len=2} + {field 0 {with latitude}} + {field 1 {with longitude}} +} +wheres {{field . {list} {of where} >0}} +EOF +$root/schema.tcl wheres.schema.tcl | xxd -r -p >wheres.schema.keks + +$root/keks.tcl >data.keks.hex <data.keks +test_expect_success "wheres empty" "! $SCHEMA_VALIDATE wheres.schema.keks wheres data.keks.hex <data.keks +test_expect_success "where empty" "! $SCHEMA_VALIDATE wheres.schema.keks wheres data.keks.hex <data.keks +test_expect_success "ok" "$SCHEMA_VALIDATE wheres.schema.keks wheres data.keks.hex <data.keks +test_expect_success "lat negative" "$SCHEMA_VALIDATE wheres.schema.keks wheres data.keks.hex <data.keks +test_expect_success "lon negative" "$SCHEMA_VALIDATE wheres.schema.keks wheres data.keks.hex <data.keks +test_expect_success "oob lat" "! $SCHEMA_VALIDATE wheres.schema.keks wheres data.keks.hex <data.keks +test_expect_success "oob lon" "! $SCHEMA_VALIDATE wheres.schema.keks wheres data.keks.hex <data.keks +test_expect_success "lon bad len" "! $SCHEMA_VALIDATE wheres.schema.keks wheres