/*
* Copyright 2024 The WebRTC Project Authors . All rights reserved .
*
* Use of this source code is governed by a BSD - style license
* that can be found in the LICENSE file in the root of the source
* tree . An additional intellectual property rights grant can be found
* in the file PATENTS . All contributing project authors may
* be found in the AUTHORS file in the root of the source tree .
*/
#include "p2p/dtls/dtls_utils.h"
#include <cstdint>
#include <span>
#include <vector>
#include "absl/container/flat_hash_set.h"
#include "test/gtest.h"
namespace webrtc {
std::vector<uint8_t> ToVector(std::span<const uint8_t> array) {
return std::vector<uint8_t>(array.begin(), array.end());
}
TEST(PacketStash, Add) {
PacketStash stash;
std::vector<uint8_t> packet = {
0 x2f, 0 x5b, 0 x4c, 0 x00, 0 x23, 0 x47, 0 xab, 0 xe7, 0 x90, 0 x96,
0 xc0, 0 xac, 0 x2f, 0 x25, 0 x40, 0 x35, 0 x35, 0 xa3, 0 x81, 0 x50,
0 x0c, 0 x38, 0 x0a, 0 xf6, 0 xd4, 0 xd5, 0 x7d, 0 xbe, 0 x9a, 0 xa3,
0 xcb, 0 xcb, 0 x67, 0 xb0, 0 x77, 0 x79, 0 x8b, 0 x48, 0 x60, 0 xf8,
};
stash.Add(packet);
EXPECT_EQ(stash.size(), 1 );
EXPECT_EQ(ToVector(stash.GetNext()), packet);
stash.Add(packet);
EXPECT_EQ(stash.size(), 2 );
EXPECT_EQ(ToVector(stash.GetNext()), packet);
EXPECT_EQ(ToVector(stash.GetNext()), packet);
}
TEST(PacketStash, AddIfUnique) {
PacketStash stash;
std::vector<uint8_t> packet1 = {
0 x2f, 0 x5b, 0 x4c, 0 x00, 0 x23, 0 x47, 0 xab, 0 xe7, 0 x90, 0 x96,
0 xc0, 0 xac, 0 x2f, 0 x25, 0 x40, 0 x35, 0 x35, 0 xa3, 0 x81, 0 x50,
0 x0c, 0 x38, 0 x0a, 0 xf6, 0 xd4, 0 xd5, 0 x7d, 0 xbe, 0 x9a, 0 xa3,
0 xcb, 0 xcb, 0 x67, 0 xb0, 0 x77, 0 x79, 0 x8b, 0 x48, 0 x60, 0 xf8,
};
std::vector<uint8_t> packet2 = {
0 x16, 0 xfe, 0 xff, 0 x00, 0 x00, 0 x00, 0 x00, 0 x00, 0 x00,
0 x00, 0 x00, 0 x00, 0 x0c, 0 x0e, 0 x00, 0 x00, 0 x00, 0 x00,
0 xac, 0 x00, 0 x00, 0 x00, 0 x00, 0 x00, 0 x00,
};
stash.AddIfUnique(packet1);
EXPECT_EQ(stash.size(), 1 );
EXPECT_EQ(ToVector(stash.GetNext()), packet1);
stash.AddIfUnique(packet1);
EXPECT_EQ(stash.size(), 1 );
EXPECT_EQ(ToVector(stash.GetNext()), packet1);
stash.AddIfUnique(packet2);
EXPECT_EQ(stash.size(), 2 );
EXPECT_EQ(ToVector(stash.GetNext()), packet1);
EXPECT_EQ(ToVector(stash.GetNext()), packet2);
stash.AddIfUnique(packet2);
EXPECT_EQ(stash.size(), 2 );
}
TEST(PacketStash, Prune) {
PacketStash stash;
std::vector<uint8_t> packet1 = {
0 x2f, 0 x5b, 0 x4c, 0 x00, 0 x23, 0 x47, 0 xab, 0 xe7, 0 x90, 0 x96,
0 xc0, 0 xac, 0 x2f, 0 x25, 0 x40, 0 x35, 0 x35, 0 xa3, 0 x81, 0 x50,
0 x0c, 0 x38, 0 x0a, 0 xf6, 0 xd4, 0 xd5, 0 x7d, 0 xbe, 0 x9a, 0 xa3,
0 xcb, 0 xcb, 0 x67, 0 xb0, 0 x77, 0 x79, 0 x8b, 0 x48, 0 x60, 0 xf8,
};
std::vector<uint8_t> packet2 = {
0 x16, 0 xfe, 0 xff, 0 x00, 0 x00, 0 x00, 0 x00, 0 x00, 0 x00,
0 x00, 0 x00, 0 x00, 0 x0c, 0 x0e, 0 x00, 0 x00, 0 x00, 0 x00,
0 xac, 0 x00, 0 x00, 0 x00, 0 x00, 0 x00, 0 x00,
};
stash.AddIfUnique(packet1);
stash.AddIfUnique(packet2);
EXPECT_EQ(stash.size(), 2 );
EXPECT_EQ(ToVector(stash.GetNext()), packet1);
EXPECT_EQ(ToVector(stash.GetNext()), packet2);
absl::flat_hash_set<uint32_t> remove;
remove.insert(PacketStash::Hash(packet1));
stash.Prune(remove);
EXPECT_EQ(stash.size(), 1 );
EXPECT_EQ(ToVector(stash.GetNext()), packet2);
}
TEST(PacketStash, PruneSize) {
PacketStash stash;
std::vector<uint8_t> packet1 = {
0 x2f, 0 x5b, 0 x4c, 0 x00, 0 x23, 0 x47, 0 xab, 0 xe7, 0 x90, 0 x96,
0 xc0, 0 xac, 0 x2f, 0 x25, 0 x40, 0 x35, 0 x35, 0 xa3, 0 x81, 0 x50,
0 x0c, 0 x38, 0 x0a, 0 xf6, 0 xd4, 0 xd5, 0 x7d, 0 xbe, 0 x9a, 0 xa3,
0 xcb, 0 xcb, 0 x67, 0 xb0, 0 x77, 0 x79, 0 x8b, 0 x48, 0 x60, 0 xf8,
};
std::vector<uint8_t> packet2 = {
0 x16, 0 xfe, 0 xff, 0 x00, 0 x00, 0 x00, 0 x00, 0 x00, 0 x00,
0 x00, 0 x00, 0 x00, 0 x0c, 0 x0e, 0 x00, 0 x00, 0 x00, 0 x00,
0 xac, 0 x00, 0 x00, 0 x00, 0 x00, 0 x00, 0 x00,
};
std::vector<uint8_t> packet3 = {0 x3};
std::vector<uint8_t> packet4 = {0 x4};
std::vector<uint8_t> packet5 = {0 x5};
std::vector<uint8_t> packet6 = {0 x6};
stash.AddIfUnique(packet1);
stash.AddIfUnique(packet2);
stash.AddIfUnique(packet3);
stash.AddIfUnique(packet4);
stash.AddIfUnique(packet5);
stash.AddIfUnique(packet6);
EXPECT_EQ(stash.size(), 6 );
EXPECT_EQ(ToVector(stash.GetNext()), packet1);
EXPECT_EQ(ToVector(stash.GetNext()), packet2);
EXPECT_EQ(ToVector(stash.GetNext()), packet3);
EXPECT_EQ(ToVector(stash.GetNext()), packet4);
EXPECT_EQ(ToVector(stash.GetNext()), packet5);
EXPECT_EQ(ToVector(stash.GetNext()), packet6);
// Should be NOP.
stash.Prune(/* max_size= */ 6);
EXPECT_EQ(ToVector(stash.GetNext()), packet1);
EXPECT_EQ(ToVector(stash.GetNext()), packet2);
EXPECT_EQ(ToVector(stash.GetNext()), packet3);
EXPECT_EQ(ToVector(stash.GetNext()), packet4);
EXPECT_EQ(ToVector(stash.GetNext()), packet5);
EXPECT_EQ(ToVector(stash.GetNext()), packet6);
// Move "cursor" forward.
EXPECT_EQ(ToVector(stash.GetNext()), packet1);
stash.Prune(/* max_size= */ 4);
EXPECT_EQ(stash.size(), 4 );
EXPECT_EQ(ToVector(stash.GetNext()), packet3);
EXPECT_EQ(ToVector(stash.GetNext()), packet4);
EXPECT_EQ(ToVector(stash.GetNext()), packet5);
EXPECT_EQ(ToVector(stash.GetNext()), packet6);
}
TEST(PacketStash, PruneSome) {
PacketStash stash;
std::vector<uint8_t> packet1 = {1 };
std::vector<uint8_t> packet2 = {2 };
std::vector<uint8_t> packet3 = {3 };
stash.AddIfUnique(packet1);
stash.AddIfUnique(packet2);
stash.AddIfUnique(packet3);
EXPECT_EQ(stash.size(), 3 );
EXPECT_EQ(ToVector(stash.GetNext()), packet1);
EXPECT_EQ(ToVector(stash.GetNext()), packet2);
EXPECT_EQ(ToVector(stash.GetNext()), packet3);
EXPECT_EQ(ToVector(stash.GetNext()), packet1);
absl::flat_hash_set<uint32_t> remove;
remove.insert(PacketStash::Hash(packet1));
remove.insert(PacketStash::Hash(packet2));
EXPECT_EQ(stash.Prune(remove), 2 u);
EXPECT_EQ(stash.Prune(remove), 0 u);
EXPECT_EQ(ToVector(stash.GetNext()), packet3);
}
} // namespace webrtc
Messung V0.5 in Prozent C=93 H=100 G=96
¤ Dauer der Verarbeitung: 0.5 Sekunden
¤
*© Formatika GbR, Deutschland