diff --git a/Package.swift b/Package.swift index d7e1ed10..a1980a1d 100644 --- a/Package.swift +++ b/Package.swift @@ -573,6 +573,7 @@ let package = Package( "internal/test/fake_timer_test.cc", "internal/test/fake_device_info_test.cc", "internal/test/fake_task_runner_test.cc", + "internal/weave/control_packet_write_request_test.cc", "internal/weave/packet_test.cc", "internal/weave/packet_sequence_number_generator_test.cc", "internal/weave/packetizer_test.cc", diff --git a/internal/weave/BUILD b/internal/weave/BUILD index 074929c5..d07faf54 100644 --- a/internal/weave/BUILD +++ b/internal/weave/BUILD @@ -6,6 +6,7 @@ cc_library( "packetizer.cc", ], hdrs = [ + "control_packet_write_request.h", "packet.h", "packet_sequence_number_generator.h", "packetizer.h", @@ -62,3 +63,17 @@ cc_test( "@com_google_googletest//:gtest_main", ], ) + +cc_test( + name = "control_packet_write_request_test", + srcs = [ + "control_packet_write_request_test.cc", + ], + deps = [ + ":weave", + "//internal/platform/implementation/g3", # build_cleaner: keep + "@com_github_protobuf_matchers//protobuf-matchers", + "@com_google_absl//absl/status", + "@com_google_googletest//:gtest_main", + ], +) diff --git a/internal/weave/control_packet_write_request.h b/internal/weave/control_packet_write_request.h new file mode 100644 index 00000000..9006365f --- /dev/null +++ b/internal/weave/control_packet_write_request.h @@ -0,0 +1,49 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef THIRD_PARTY_NEARBY_INTERNAL_WEAVE_SINGLE_PACKET_WRITE_REQUEST_H_ +#define THIRD_PARTY_NEARBY_INTERNAL_WEAVE_SINGLE_PACKET_WRITE_REQUEST_H_ + +#include + +#include "absl/status/status.h" +#include "internal/weave/packet.h" + +namespace nearby { +namespace weave { + +// This class encapsulates a Weave control packet to be sent over the wire. +// Note that this means it is only responsible for writing one packet. +class ControlPacketWriteRequest { + public: + explicit ControlPacketWriteRequest(Packet packet) + : control_packet_(std::move(packet)) {} + + absl::StatusOr NextPacket(int) { + if (is_started_) { + return absl::OutOfRangeError("Packet was already sent"); + } + is_started_ = true; + return std::move(control_packet_); + } + + private: + Packet control_packet_; + bool is_started_ = false; +}; + +} // namespace weave +} // namespace nearby + +#endif // THIRD_PARTY_NEARBY_INTERNAL_WEAVE_SINGLE_PACKET_WRITE_REQUEST_H_ diff --git a/internal/weave/control_packet_write_request_test.cc b/internal/weave/control_packet_write_request_test.cc new file mode 100644 index 00000000..50a1f72b --- /dev/null +++ b/internal/weave/control_packet_write_request_test.cc @@ -0,0 +1,54 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "internal/weave/control_packet_write_request.h" + +#include +#include +#include + +#include "gmock/gmock.h" +#include "protobuf-matchers/protocol-buffer-matchers.h" +#include "gtest/gtest.h" +#include "absl/status/status.h" +#include "internal/weave/packet.h" + +namespace nearby { +namespace weave { +namespace { + +TEST(ControlPacketWriteRequestTest, WriteRequestIsNotTriviallyConstructible) { + EXPECT_FALSE( + std::is_trivially_constructible::value); +} + +TEST(ControlPacketWriteRequestTest, WriteRequestWorks) { + Packet packet = Packet::CreateConnectionRequestPacket(1, 1, 15, "").value(); + std::string packet_bytes = packet.GetBytes(); + auto request = ControlPacketWriteRequest(std::move(packet)); + EXPECT_EQ(packet_bytes, request.NextPacket(15).value().GetBytes()); +} + +TEST(ControlPacketWriteRequestTest, TestOutOfRange) { + Packet packet = Packet::CreateConnectionRequestPacket(1, 1, 15, "").value(); + std::string packet_bytes = packet.GetBytes(); + auto request = ControlPacketWriteRequest(std::move(packet)); + EXPECT_EQ(packet_bytes, request.NextPacket(15).value().GetBytes()); + EXPECT_THAT(request.NextPacket(15), + testing::status::StatusIs(absl::StatusCode::kOutOfRange)); +} + +} // namespace +} // namespace weave +} // namespace nearby