blob: 87d5c836920dbfc20b07c87d6eac93f94a1a057e [file] [log] [blame]
Alexei Frolov5d6d3922020-05-08 13:57:02 -07001// Copyright 2020 The Pigweed Authors
2//
3// Licensed under the Apache License, Version 2.0 (the "License"); you may not
4// use this file except in compliance with the License. You may obtain a copy of
5// the License at
6//
7// https://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12// License for the specific language governing permissions and limitations under
13// the License.
14
15#include "pw_rpc/internal/packet.h"
16
17#include "gtest/gtest.h"
Wyatt Hepler142616c2020-06-01 10:16:04 -070018#include "pw_protobuf/codegen.h"
19#include "pw_protobuf/wire_format.h"
Alexei Frolov5d6d3922020-05-08 13:57:02 -070020
21namespace pw::rpc::internal {
22namespace {
23
24using std::byte;
25
Wyatt Hepler142616c2020-06-01 10:16:04 -070026constexpr byte kPayload[] = {byte(0x82), byte(0x02), byte(0xff), byte(0xff)};
27
28constexpr byte kEncoded[] = {
29 // Payload
30 byte{MakeKey(5, protobuf::WireType::kDelimited)},
31 byte{0x04},
32 byte{0x82},
33 byte{0x02},
34 byte{0xff},
35 byte{0xff},
36
37 // Packet type
38 byte{MakeKey(1, protobuf::WireType::kVarint)},
39 byte{0}, // RPC
40
41 // Channel ID
42 byte{MakeKey(2, protobuf::WireType::kVarint)},
43 byte{1},
44
45 // Service ID
46 byte{MakeKey(3, protobuf::WireType::kVarint)},
47 byte{42},
48
49 // Method ID
50 byte{MakeKey(4, protobuf::WireType::kVarint)},
51 byte{100},
52
53 // Status
54 byte{MakeKey(6, protobuf::WireType::kVarint)},
55 byte{0x00},
56};
57
Wyatt Hepler142616c2020-06-01 10:16:04 -070058TEST(Packet, Encode) {
59 byte buffer[64];
60
61 Packet packet(PacketType::RPC, 1, 42, 100, kPayload);
62
63 auto sws = packet.Encode(buffer);
64 ASSERT_EQ(sizeof(kEncoded), sws.size());
65 EXPECT_EQ(std::memcmp(kEncoded, buffer, sizeof(kEncoded)), 0);
66}
67
68TEST(Packet, Decode) {
69 Packet packet = Packet::FromBuffer(kEncoded);
70
71 EXPECT_EQ(PacketType::RPC, packet.type());
72 EXPECT_EQ(1u, packet.channel_id());
73 EXPECT_EQ(42u, packet.service_id());
74 EXPECT_EQ(100u, packet.method_id());
75 ASSERT_EQ(sizeof(kPayload), packet.payload().size());
76 EXPECT_EQ(0,
77 std::memcmp(packet.payload().data(), kPayload, sizeof(kPayload)));
78}
79
Alexei Frolov5d6d3922020-05-08 13:57:02 -070080TEST(Packet, EncodeDecode) {
81 constexpr byte payload[]{byte(0x00), byte(0x01), byte(0x02), byte(0x03)};
82
Wyatt Hepler142616c2020-06-01 10:16:04 -070083 Packet packet = Packet(PacketType::RPC);
Alexei Frolov5d6d3922020-05-08 13:57:02 -070084 packet.set_channel_id(12);
85 packet.set_service_id(0xdeadbeef);
86 packet.set_method_id(0x03a82921);
87 packet.set_payload(payload);
Alexei Frolov00890942020-05-19 10:45:08 -070088 packet.set_status(Status::UNAVAILABLE);
Alexei Frolov5d6d3922020-05-08 13:57:02 -070089
90 byte buffer[128];
91 StatusWithSize sws = packet.Encode(buffer);
92 ASSERT_EQ(sws.status(), Status::OK);
93
Wyatt Heplere2cbadf2020-06-22 11:21:45 -070094 std::span<byte> packet_data(buffer, sws.size());
Alexei Frolov5d6d3922020-05-08 13:57:02 -070095 Packet decoded = Packet::FromBuffer(packet_data);
96
97 EXPECT_EQ(decoded.type(), packet.type());
98 EXPECT_EQ(decoded.channel_id(), packet.channel_id());
99 EXPECT_EQ(decoded.service_id(), packet.service_id());
100 EXPECT_EQ(decoded.method_id(), packet.method_id());
101 ASSERT_EQ(decoded.payload().size(), packet.payload().size());
102 EXPECT_EQ(std::memcmp(decoded.payload().data(),
103 packet.payload().data(),
104 packet.payload().size()),
105 0);
Alexei Frolov00890942020-05-19 10:45:08 -0700106 EXPECT_EQ(decoded.status(), Status::UNAVAILABLE);
Alexei Frolov5d6d3922020-05-08 13:57:02 -0700107}
108
Wyatt Hepler671946e2020-06-09 14:39:33 -0700109constexpr size_t kReservedSize = 2 /* type */ + 2 /* channel */ +
110 2 /* service */ + 2 /* method */ +
111 2 /* payload key */ + 2 /* status */;
Wyatt Hepler142616c2020-06-01 10:16:04 -0700112
113TEST(Packet, PayloadUsableSpace_ExactFit) {
Wyatt Hepler671946e2020-06-09 14:39:33 -0700114 EXPECT_EQ(kReservedSize,
115 Packet(PacketType::RPC, 1, 42, 100).MinEncodedSizeBytes());
Wyatt Hepler142616c2020-06-01 10:16:04 -0700116}
117
118TEST(Packet, PayloadUsableSpace_LargerVarints) {
Wyatt Hepler671946e2020-06-09 14:39:33 -0700119 EXPECT_EQ(kReservedSize + 2 + 1 + 1,
120 Packet(PacketType::RPC, 17000, 200, 200).MinEncodedSizeBytes());
Wyatt Hepler142616c2020-06-01 10:16:04 -0700121}
122
Alexei Frolov5d6d3922020-05-08 13:57:02 -0700123} // namespace
124} // namespace pw::rpc::internal