dcsctp: Add handover test for interleaved streams
This test was missing, which made me believe that it wasn't supported as the handover state only included SSN and not MID. But when adding tests, I saw that the current implementation used the SSN field to handover the MID information for ordered streams which is sufficient given the 32 bit type used for that (SSNs are only 16 bits). For unordered streams, there is no need to handover any state there are no expected next MID for unordered streams (they can be received in any order). So, adding tests and removing the handover state I just added. Bug: webrtc:41481008 Change-Id: If1799cb1def5bd9f585a87cff6d835f4a9053b4f Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/370121 Reviewed-by: Mirko Bonadei <mbonadei@webrtc.org> Commit-Queue: Victor Boivie <boivie@webrtc.org> Cr-Commit-Position: refs/heads/main@{#43495}
This commit is contained in:
parent
1d2f30b8b9
commit
b0acde349c
@ -67,11 +67,9 @@ struct DcSctpSocketHandoverState {
|
||||
struct OrderedStream {
|
||||
uint32_t id = 0;
|
||||
uint32_t next_ssn = 0;
|
||||
uint32_t next_mid = 0;
|
||||
};
|
||||
struct UnorderedStream {
|
||||
uint32_t id = 0;
|
||||
uint32_t next_mid = 0;
|
||||
};
|
||||
struct Receive {
|
||||
bool seen_packet = false;
|
||||
|
||||
@ -13,6 +13,7 @@
|
||||
#include <memory>
|
||||
#include <utility>
|
||||
|
||||
#include "net/dcsctp/common/handover_testing.h"
|
||||
#include "net/dcsctp/common/sequence_numbers.h"
|
||||
#include "net/dcsctp/packet/chunk/forward_tsn_common.h"
|
||||
#include "net/dcsctp/packet/chunk/iforward_tsn_chunk.h"
|
||||
@ -25,6 +26,7 @@
|
||||
namespace dcsctp {
|
||||
namespace {
|
||||
using ::testing::ElementsAre;
|
||||
using ::testing::Field;
|
||||
using ::testing::MockFunction;
|
||||
using ::testing::NiceMock;
|
||||
using ::testing::Property;
|
||||
@ -209,5 +211,58 @@ TEST_F(InterleavedReassemblyStreamsTest, CanReassembleFastPathOrdered) {
|
||||
EXPECT_EQ(streams.Add(tsn(2), std::move(data2)), -1);
|
||||
EXPECT_EQ(streams.Add(tsn(4), std::move(data4)), 0);
|
||||
}
|
||||
|
||||
TEST_F(InterleavedReassemblyStreamsTest, CanHandoverOrderedStreams) {
|
||||
InterleavedReassemblyStreams streams1("", [](auto...) {});
|
||||
|
||||
EXPECT_EQ(streams1.Add(tsn(1), gen_.Ordered({1}, "B")), 1);
|
||||
EXPECT_EQ(streams1.GetHandoverReadiness(),
|
||||
HandoverReadinessStatus(
|
||||
HandoverUnreadinessReason::kOrderedStreamHasUnassembledChunks));
|
||||
EXPECT_EQ(streams1.Add(tsn(2), gen_.Ordered({2, 3, 4}, "E")), -1);
|
||||
EXPECT_TRUE(streams1.GetHandoverReadiness().IsReady());
|
||||
|
||||
DcSctpSocketHandoverState state;
|
||||
streams1.AddHandoverState(state);
|
||||
g_handover_state_transformer_for_test(&state);
|
||||
|
||||
MockFunction<ReassemblyStreams::OnAssembledMessage> on_assembled;
|
||||
EXPECT_CALL(on_assembled,
|
||||
Call(ElementsAre(tsn(3)),
|
||||
Property(&DcSctpMessage::payload, ElementsAre(5, 6, 7, 8))));
|
||||
|
||||
InterleavedReassemblyStreams streams2("", on_assembled.AsStdFunction());
|
||||
streams2.RestoreFromState(state);
|
||||
Data data = gen_.Ordered({5, 6, 7, 8}, "BE");
|
||||
EXPECT_EQ(data.mid, MID(1));
|
||||
EXPECT_EQ(streams2.Add(tsn(3), std::move(data)), 0);
|
||||
}
|
||||
|
||||
TEST_F(InterleavedReassemblyStreamsTest, CanHandoverUnorderedStreams) {
|
||||
InterleavedReassemblyStreams streams1("", [](auto...) {});
|
||||
|
||||
EXPECT_EQ(streams1.Add(tsn(1), gen_.Unordered({1}, "B")), 1);
|
||||
EXPECT_EQ(
|
||||
streams1.GetHandoverReadiness(),
|
||||
HandoverReadinessStatus(
|
||||
HandoverUnreadinessReason::kUnorderedStreamHasUnassembledChunks));
|
||||
EXPECT_EQ(streams1.Add(tsn(2), gen_.Unordered({2, 3, 4}, "E")), -1);
|
||||
EXPECT_TRUE(streams1.GetHandoverReadiness().IsReady());
|
||||
|
||||
DcSctpSocketHandoverState state;
|
||||
streams1.AddHandoverState(state);
|
||||
g_handover_state_transformer_for_test(&state);
|
||||
|
||||
MockFunction<ReassemblyStreams::OnAssembledMessage> on_assembled;
|
||||
EXPECT_CALL(on_assembled,
|
||||
Call(ElementsAre(tsn(3)),
|
||||
Property(&DcSctpMessage::payload, ElementsAre(5, 6, 7, 8))));
|
||||
|
||||
InterleavedReassemblyStreams streams2("", on_assembled.AsStdFunction());
|
||||
streams2.RestoreFromState(state);
|
||||
Data data = gen_.Unordered({5, 6, 7, 8}, "BE");
|
||||
EXPECT_EQ(data.mid, MID(1));
|
||||
EXPECT_EQ(streams2.Add(tsn(3), std::move(data)), 0);
|
||||
}
|
||||
} // namespace
|
||||
} // namespace dcsctp
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user