| Line |
Branch |
Exec |
Source |
| 1 |
|
|
#include "ProtoParse.h" |
| 2 |
|
|
|
| 3 |
|
11 |
proto_error_t parseClientFrame(const char *text, size_t len, JsonDocument &doc, proto_message_t &out) { |
| 4 |
|
11 |
out = proto_message_t(); |
| 5 |
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 11 times.
|
11 |
if(len > PROTO_MAX_CLIENT_FRAME) return proto_error_t::badRequest; |
| 6 |
3/4
✓ Branch 1 taken 11 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 time.
✓ Branch 5 taken 10 times.
|
11 |
if(deserializeJson(doc, text, len) != DeserializationError::Ok) return proto_error_t::badRequest; |
| 7 |
3/4
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 time.
✓ Branch 4 taken 9 times.
|
10 |
if(!doc.is<JsonObject>()) return proto_error_t::badRequest; |
| 8 |
2/4
✓ Branch 1 taken 9 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 9 times.
✗ Branch 5 not taken.
|
9 |
JsonVariantConst id = doc["id"]; |
| 9 |
4/6
✓ Branch 1 taken 9 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 3 times.
✓ Branch 4 taken 6 times.
✓ Branch 6 taken 3 times.
✗ Branch 7 not taken.
|
9 |
if(id.is<uint32_t>()) out.id = id.as<uint32_t>(); |
| 10 |
2/2
✓ Branch 1 taken 1 time.
✓ Branch 2 taken 5 times.
|
6 |
else if(!id.isNull()) return proto_error_t::badRequest; |
| 11 |
8/12
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 8 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 8 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 time.
✓ Branch 12 taken 7 times.
✓ Branch 13 taken 1 time.
✓ Branch 14 taken 7 times.
|
16 |
if(!doc["v"].is<int>() || doc["v"].as<int>() != PROTO_VERSION) return proto_error_t::badRequest; |
| 12 |
2/4
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 7 times.
✗ Branch 5 not taken.
|
7 |
JsonVariantConst t = doc["t"]; |
| 13 |
9/14
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 5 times.
✓ Branch 4 taken 2 times.
✓ Branch 6 taken 5 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 5 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 5 times.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✓ Branch 14 taken 5 times.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 5 times.
|
7 |
if(!t.is<int>() || t.as<int>() < 1 || t.as<int>() > 255) return proto_error_t::badRequest; |
| 14 |
1/2
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
|
5 |
out.type = static_cast<uint8_t>(t.as<int>()); |
| 15 |
3/4
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 3 times.
|
5 |
if(!protoClientMaySend(out.type)) return proto_error_t::unknownOp; |
| 16 |
2/6
✗ Branch 1 not taken.
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 3 times.
|
3 |
if(protoIsOp(out.type) && out.id == 0) return proto_error_t::badRequest; |
| 17 |
2/4
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
|
3 |
JsonVariantConst d = doc["d"]; |
| 18 |
7/8
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 time.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✓ Branch 7 taken 1 time.
✓ Branch 8 taken 1 time.
✓ Branch 9 taken 2 times.
|
3 |
if(!d.isNull() && !d.is<JsonObjectConst>()) return proto_error_t::badRequest; |
| 19 |
|
2 |
return proto_error_t::none; |
| 20 |
|
|
} |
| 21 |
|
|
|
| 22 |
|
3 |
int32_t protoInt(JsonObjectConst d, proto_field_t field) { |
| 23 |
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
|
3 |
const proto_field_info_t &f = protoField(field); |
| 24 |
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
|
3 |
JsonVariantConst v = d[f.key]; |
| 25 |
4/6
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 1 time.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
|
6 |
return v.is<int32_t>() ? v.as<int32_t>() : f.def; |
| 26 |
|
|
} |
| 27 |
|
1 |
bool protoBool(JsonObjectConst d, proto_field_t field) { |
| 28 |
1/2
✓ Branch 1 taken 1 time.
✗ Branch 2 not taken.
|
1 |
const proto_field_info_t &f = protoField(field); |
| 29 |
1/2
✓ Branch 1 taken 1 time.
✗ Branch 2 not taken.
|
1 |
JsonVariantConst v = d[f.key]; |
| 30 |
2/6
✓ Branch 1 taken 1 time.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 time.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
|
2 |
return v.is<int>() ? v.as<int>() != 0 : f.def != 0; |
| 31 |
|
|
} |
| 32 |
|
80 |
const char *protoString(JsonObjectConst d, proto_field_t field) { |
| 33 |
2/4
✓ Branch 1 taken 80 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 80 times.
✗ Branch 5 not taken.
|
80 |
JsonVariantConst v = d[protoField(field).key]; |
| 34 |
4/6
✓ Branch 1 taken 80 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 76 times.
✓ Branch 4 taken 4 times.
✓ Branch 6 taken 76 times.
✗ Branch 7 not taken.
|
160 |
return v.is<const char *>() ? v.as<const char *>() : nullptr; |
| 35 |
|
|
} |
| 36 |
2/4
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
|
2 |
bool protoHas(JsonObjectConst d, proto_field_t field) { return !d[protoField(field).key].isNull(); } |
| 37 |
|
|
|
| 38 |
|
124 |
bool protoRouteValue(const proto_field_info_t &f, JsonVariantConst v, JsonVariant out) { |
| 39 |
4/5
✓ Branch 0 taken 17 times.
✓ Branch 1 taken 68 times.
✓ Branch 2 taken 12 times.
✓ Branch 3 taken 27 times.
✗ Branch 4 not taken.
|
124 |
switch(f.kind) { |
| 40 |
|
17 |
case 'b': |
| 41 |
|
|
// Booleans are 1 and 0; the routes read true and false. |
| 42 |
8/8
✓ Branch 1 taken 15 times.
✓ Branch 2 taken 2 times.
✓ Branch 4 taken 9 times.
✓ Branch 5 taken 6 times.
✓ Branch 7 taken 1 time.
✓ Branch 8 taken 8 times.
✓ Branch 9 taken 3 times.
✓ Branch 10 taken 14 times.
|
17 |
if(!v.is<int>() || (v.as<int>() != 0 && v.as<int>() != 1)) return false; |
| 43 |
2/4
✓ Branch 1 taken 14 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 14 times.
✗ Branch 5 not taken.
|
14 |
out.set(v.as<int>() == 1); |
| 44 |
|
14 |
return true; |
| 45 |
|
68 |
case 'i': |
| 46 |
6/6
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 65 times.
✓ Branch 4 taken 1 time.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 66 times.
✓ Branch 7 taken 2 times.
|
68 |
if(v.is<int64_t>() || v.is<uint64_t>()) return out.set(v); |
| 47 |
|
2 |
return false; |
| 48 |
|
12 |
case 'n': |
| 49 |
2/2
✓ Branch 1 taken 11 times.
✓ Branch 2 taken 1 time.
|
12 |
if(v.is<float>()) return out.set(v); |
| 50 |
|
1 |
return false; |
| 51 |
|
27 |
case 's': |
| 52 |
2/2
✓ Branch 1 taken 25 times.
✓ Branch 2 taken 2 times.
|
27 |
if(v.is<const char *>()) return out.set(v); |
| 53 |
|
2 |
return false; |
| 54 |
|
✗ |
default: |
| 55 |
|
✗ |
return false; |
| 56 |
|
|
} |
| 57 |
|
|
} |
| 58 |
|
8 |
const char *protoKindName(char kind) { |
| 59 |
4/6
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 time.
✓ Branch 3 taken 2 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
8 |
switch(kind) { |
| 60 |
|
3 |
case 'b': return "boolean (1 or 0)"; |
| 61 |
|
2 |
case 'i': return "whole number"; |
| 62 |
|
1 |
case 'n': return "number"; |
| 63 |
|
2 |
case 's': return "string"; |
| 64 |
|
✗ |
case 'l': return "list"; |
| 65 |
|
✗ |
default: return "object"; |
| 66 |
|
|
} |
| 67 |
|
|
} |
| 68 |
|
|
|