blob: c4e70884fd03621c8bf9461035c90183c3d1f9b4 [file] [log] [blame]
// Copyright 2017 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <wlan/mlme/buffer_reader.h>
#include <wlan/mlme/buffer_writer.h>
#include <gtest/gtest.h>
#include <algorithm>
#include <numeric>
namespace wlan {
namespace {
template<size_t N>
struct Container {
uint8_t data[N];
};
TEST(BufferUtils, Writer) {
uint8_t buf[16] = {};
std::iota(buf, buf + sizeof(buf), 0);
BufferWriter w(buf);
auto c1 = w.Write<Container<4>>();
c1->data[0] = 1;
c1->data[1] = 0;
c1->data[2] = 0;
c1->data[3] = 2;
auto c2 = w.Write<Container<2>>();
c2->data[0] = 3;
c2->data[1] = 4;
uint8_t data[4] = {5, 6, 7, 8};
w.Write(data);
EXPECT_EQ(w.WrittenBytes(), 10u);
EXPECT_EQ(w.RemainingBytes(), 6u);
EXPECT_EQ(buf[0], 1);
EXPECT_EQ(buf[3], 2);
EXPECT_EQ(buf[4], 3);
EXPECT_EQ(buf[5], 4);
EXPECT_EQ(buf[6], 5);
EXPECT_EQ(buf[9], 8);
}
TEST(BufferUtils, Reader) {
uint8_t buf[16] = {};
std::iota(buf, buf + sizeof(buf), 0);
BufferReader r(buf);
auto c1 = r.Read<Container<4>>();
ASSERT_NE(c1, nullptr);
EXPECT_EQ(c1->data[0], 0u);
EXPECT_EQ(c1->data[3], 3u);
auto c2 = r.Read<Container<2>>();
ASSERT_NE(c2, nullptr);
EXPECT_EQ(c2->data[0], 4u);
EXPECT_EQ(c2->data[1], 5u);
auto c3 = r.Peek<Container<3>>();
ASSERT_NE(c3, nullptr);
EXPECT_EQ(c3->data[0], 6u);
EXPECT_EQ(c3->data[2], 8u);
auto read_data = r.Read(3);
ASSERT_FALSE(read_data.empty());
ASSERT_EQ(read_data.size(), 3u);
EXPECT_EQ(read_data[0], 6u);
EXPECT_EQ(read_data[2], 8u);
EXPECT_EQ(r.ReadBytes(), 9u);
EXPECT_EQ(r.RemainingBytes(), 7u);
// Read over the remaining buffer size.
EXPECT_TRUE(r.Read(8).empty());
EXPECT_EQ(r.Peek<Container<8>>(), nullptr);
EXPECT_EQ(r.Read<Container<8>>(), nullptr);
auto remaining = r.ReadRemaining();
ASSERT_NE(remaining.data(), nullptr);
ASSERT_EQ(remaining.size(), 7u);
EXPECT_EQ(r.ReadBytes(), 16u);
EXPECT_EQ(r.RemainingBytes(), 0u);
EXPECT_EQ(remaining[0], 9u);
EXPECT_EQ(remaining[6], 15u);
}
} // namespace
} // namespace wlan