blob: cdddc142ee360ab360842ed13d460b9d7b5fd454 [file] [log] [blame]
Wyatt Hepler671946e2020-06-09 14:39:33 -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/channel.h"
16
17#include "gtest/gtest.h"
18#include "pw_rpc/internal/packet.h"
Wyatt Hepler8aa02922020-07-17 08:54:37 -070019#include "pw_rpc_private/internal_test_utils.h"
Wyatt Hepler671946e2020-06-09 14:39:33 -070020
21namespace pw::rpc::internal {
22namespace {
23
24using std::byte;
25
26TEST(ChannelOutput, Name) {
27 class NameTester : public ChannelOutput {
28 public:
29 NameTester(const char* name) : ChannelOutput(name) {}
Wyatt Heplere2cbadf2020-06-22 11:21:45 -070030 std::span<std::byte> AcquireBuffer() override { return {}; }
Wyatt Heplerd78f7c62020-09-28 14:27:32 -070031 Status SendAndReleaseBuffer(size_t) override { return Status::Ok(); }
Wyatt Hepler671946e2020-06-09 14:39:33 -070032 };
33
34 EXPECT_STREQ("hello_world", NameTester("hello_world").name());
35 EXPECT_EQ(nullptr, NameTester(nullptr).name());
36}
37
Wyatt Hepler0f262352020-07-29 09:51:27 -070038constexpr Packet kTestPacket(PacketType::RESPONSE, 1, 42, 100);
Wyatt Hepler712d3672020-07-13 15:52:11 -070039const size_t kReservedSize = 2 /* type */ + 2 /* channel */ + 5 /* service */ +
40 5 /* method */ + 2 /* payload key */ +
Wyatt Hepler671946e2020-06-09 14:39:33 -070041 2 /* status */;
42
43TEST(Channel, TestPacket_ReservedSizeMatchesMinEncodedSizeBytes) {
44 EXPECT_EQ(kReservedSize, kTestPacket.MinEncodedSizeBytes());
45}
46
47TEST(Channel, OutputBuffer_EmptyBuffer) {
48 TestOutput<0> output;
49 internal::Channel channel(100, &output);
50
51 Channel::OutputBuffer buffer = channel.AcquireBuffer();
52 EXPECT_TRUE(buffer.payload(kTestPacket).empty());
53}
54
55TEST(Channel, OutputBuffer_TooSmall) {
56 TestOutput<kReservedSize - 1> output;
57 internal::Channel channel(100, &output);
58
59 Channel::OutputBuffer output_buffer = channel.AcquireBuffer();
60 EXPECT_TRUE(output_buffer.payload(kTestPacket).empty());
61
Wyatt Heplerd78f7c62020-09-28 14:27:32 -070062 EXPECT_EQ(Status::Internal(), channel.Send(output_buffer, kTestPacket));
Wyatt Hepler671946e2020-06-09 14:39:33 -070063}
64
65TEST(Channel, OutputBuffer_ExactFit) {
66 TestOutput<kReservedSize> output;
67 internal::Channel channel(100, &output);
68
69 Channel::OutputBuffer output_buffer(channel.AcquireBuffer());
Wyatt Heplere2cbadf2020-06-22 11:21:45 -070070 const std::span payload = output_buffer.payload(kTestPacket);
Wyatt Hepler671946e2020-06-09 14:39:33 -070071
72 EXPECT_EQ(payload.size(), output.buffer().size() - kReservedSize);
73 EXPECT_EQ(output.buffer().data() + kReservedSize, payload.data());
74
Wyatt Heplerd78f7c62020-09-28 14:27:32 -070075 EXPECT_EQ(Status::Ok(), channel.Send(output_buffer, kTestPacket));
Wyatt Hepler671946e2020-06-09 14:39:33 -070076}
77
78TEST(Channel, OutputBuffer_PayloadDoesNotFit_ReportsError) {
79 TestOutput<kReservedSize> output;
80 internal::Channel channel(100, &output);
81
Wyatt Hepler671946e2020-06-09 14:39:33 -070082 Packet packet = kTestPacket;
83 byte data[1] = {};
84 packet.set_payload(data);
85
Wyatt Heplerd78f7c62020-09-28 14:27:32 -070086 EXPECT_EQ(Status::Internal(), channel.Send(packet));
Wyatt Hepler671946e2020-06-09 14:39:33 -070087}
88
89TEST(Channel, OutputBuffer_ExtraRoom) {
90 TestOutput<kReservedSize * 3> output;
91 internal::Channel channel(100, &output);
92
93 Channel::OutputBuffer output_buffer = channel.AcquireBuffer();
Wyatt Heplere2cbadf2020-06-22 11:21:45 -070094 const std::span payload = output_buffer.payload(kTestPacket);
Wyatt Hepler671946e2020-06-09 14:39:33 -070095
96 EXPECT_EQ(payload.size(), output.buffer().size() - kReservedSize);
97 EXPECT_EQ(output.buffer().data() + kReservedSize, payload.data());
98
Wyatt Heplerd78f7c62020-09-28 14:27:32 -070099 EXPECT_EQ(Status::Ok(), channel.Send(output_buffer, kTestPacket));
Wyatt Hepler671946e2020-06-09 14:39:33 -0700100}
101
Wyatt Hepler51ee98e2020-09-18 09:09:50 -0700102TEST(Channel, OutputBuffer_ReturnsStatusFromChannelOutputSend) {
103 TestOutput<kReservedSize * 3> output;
104 internal::Channel channel(100, &output);
105
106 Channel::OutputBuffer output_buffer = channel.AcquireBuffer();
Wyatt Heplerd78f7c62020-09-28 14:27:32 -0700107 output.set_send_status(Status::Aborted());
Wyatt Hepler51ee98e2020-09-18 09:09:50 -0700108
Wyatt Heplerd78f7c62020-09-28 14:27:32 -0700109 EXPECT_EQ(Status::Aborted(), channel.Send(output_buffer, kTestPacket));
Wyatt Hepler51ee98e2020-09-18 09:09:50 -0700110}
111
Wyatt Hepler671946e2020-06-09 14:39:33 -0700112} // namespace
113} // namespace pw::rpc::internal