src/
Coverage:
low: ≥ 0%
medium: ≥ 75.0%
high: ≥ 90.0%
Lines:
50 / 54
92.6%
Branches:
95 / 143
66.4%
Functions:
7 / 7
100.0%

ProtoParse.cpp
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