blob: 095b98e6e789a4d9a43dfbfd486c62de10bf35dc [file] [log] [blame]
// Copyright 2018 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 <gtest/gtest.h>
#include <wlan/common/macaddr.h>
#include <wlan/mlme/sequence.h>
namespace wlan {
namespace common {
namespace {
class SequenceTest : public ::testing::Test {
protected:
virtual void SetUp() {
addr1.Set("01:02:03:04:05:06");
addr2.Set("02:02:03:04:05:06");
addr3.Set("03:02:03:04:05:06");
}
virtual void TearDown() {}
MacAddr addr1;
MacAddr addr2;
MacAddr addr3;
};
TEST_F(SequenceTest, FirstCall) {
Sequence seq;
EXPECT_EQ(0, seq.Sns1(addr1)->GetLastUsed());
EXPECT_EQ(1, seq.Sns1(addr2)->Next());
EXPECT_EQ(123, seq.Sns1(addr3)->SetTo(123));
uint8_t tid = 15;
uint8_t aci = 3;
EXPECT_EQ(0, seq.Sns2(addr1, tid)->GetLastUsed());
EXPECT_EQ(1, seq.Sns4(addr2, aci)->Next());
EXPECT_EQ(123, seq.Sns5()->SetTo(123));
}
TEST_F(SequenceTest, SetTo) {
Sequence seq;
uint8_t tid = 1;
for (uint32_t val = 0; val < 10000; val += 100) {
seq_t want = val % 4096;
seq_t got1 = seq.Sns2(addr1, tid)->SetTo(val);
seq_t got2 = seq.Sns2(addr1, tid)->GetLastUsed();
EXPECT_EQ(want, got1);
EXPECT_EQ(want, got2);
}
}
TEST_F(SequenceTest, Sns1Next) {
Sequence seq;
for (uint32_t i = 0; i < 4095; i++) {
seq_t want = i + 1;
EXPECT_EQ(want, seq.Sns1(addr1)->Next());
}
EXPECT_EQ(4095, seq.Sns1(addr1)->GetLastUsed());
seq.Sns1(addr1)->Next();
EXPECT_EQ(0, seq.Sns1(addr1)->GetLastUsed());
}
TEST_F(SequenceTest, Sns4Next) {
Sequence seq;
uint8_t aci = 1;
for (uint32_t i = 0; i < 1023; i++) {
seq_t want = i + 1;
EXPECT_EQ(want, seq.Sns4(addr1, aci)->Next());
}
EXPECT_EQ(1023, seq.Sns4(addr1, aci)->GetLastUsed());
seq.Sns4(addr1, aci)->Next();
EXPECT_EQ(0, seq.Sns4(addr1, aci)->GetLastUsed());
}
TEST_F(SequenceTest, Racing) {
Sequence seq;
seq.Sns1(addr1)->SetTo(10);
seq.Sns1(addr2)->SetTo(20);
for (uint32_t i = 0; i < 10; i++) {
seq.Sns1(addr1)->Next();
}
EXPECT_EQ(seq.Sns1(addr1)->GetLastUsed(), seq.Sns1(addr2)->GetLastUsed());
for (uint32_t i = 0; i < 10; i++) {
seq.Sns1(addr1)->Next();
}
EXPECT_EQ(seq.Sns1(addr1)->GetLastUsed(), seq.Sns1(addr2)->GetLastUsed() + 10);
for (uint32_t i = 0; i < 10; i++) {
seq.Sns1(addr2)->Next();
}
EXPECT_EQ(seq.Sns1(addr1)->GetLastUsed(), seq.Sns1(addr2)->GetLastUsed());
for (uint32_t i = 0; i < 10; i++) {
seq.Sns1(addr2)->Next();
}
EXPECT_EQ(seq.Sns1(addr1)->GetLastUsed() + 10, seq.Sns1(addr2)->GetLastUsed());
}
TEST_F(SequenceTest, MultipleSNS) {
Sequence seq;
uint8_t tid = 0;
uint8_t aci = 0;
seq.Sns1(addr1)->SetTo(10);
seq.Sns2(addr1, tid)->SetTo(20);
seq.Sns4(addr1, aci)->SetTo(30);
EXPECT_EQ(seq.Sns1(addr1)->GetLastUsed(), 10);
EXPECT_EQ(seq.Sns2(addr1, tid)->GetLastUsed(), 20);
EXPECT_EQ(seq.Sns4(addr1, aci)->GetLastUsed(), 30);
}
} // namespace
} // namespace common
} // namespace wlan