blob: 483c88f7a95d3edbadac7ed7a7fd572eec56508d [file] [log] [blame]
// Copyright 2019 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.
//
// Unittest code for the platform-support code in platform/.
#include <gtest/gtest.h>
#include "third_party/iwlwifi/platform/align.h"
#include "third_party/iwlwifi/platform/compiler.h"
#include "third_party/iwlwifi/platform/debug.h"
#include "third_party/iwlwifi/platform/ieee80211.h"
#include "third_party/iwlwifi/platform/kernel.h"
namespace {
class PlatformTest : public testing::Test {
public:
PlatformTest() {}
~PlatformTest() {}
};
TEST_F(PlatformTest, __set_bit) {
unsigned long masks[] = {0, 0};
// Test LSB at first addr.
__set_bit(0, masks);
EXPECT_EQ(masks[0], 0x0000000000000001);
EXPECT_EQ(masks[1], 0x0000000000000000);
// Test MSB at first addr.
__set_bit(63, masks);
EXPECT_EQ(masks[0], 0x8000000000000001);
EXPECT_EQ(masks[1], 0x0000000000000000);
// Test LSB at 2nd addr.
__set_bit(64, masks);
EXPECT_EQ(masks[0], 0x8000000000000001);
EXPECT_EQ(masks[1], 0x0000000000000001);
}
TEST_F(PlatformTest, set_bit) {
unsigned long masks[] = {0, 0};
// Test LSB at first addr.
set_bit(0, masks);
EXPECT_EQ(masks[0], 0x0000000000000001);
EXPECT_EQ(masks[1], 0x0000000000000000);
// Test MSB at first addr.
set_bit(63, masks);
EXPECT_EQ(masks[0], 0x8000000000000001);
EXPECT_EQ(masks[1], 0x0000000000000000);
// Test LSB at 2nd addr.
set_bit(64, masks);
EXPECT_EQ(masks[0], 0x8000000000000001);
EXPECT_EQ(masks[1], 0x0000000000000001);
}
TEST_F(PlatformTest, clear_bit) {
unsigned long masks[] = {0xffffffffffffffff, 0xffffffffffffffff};
// Test LSB at first addr.
clear_bit(0, masks);
EXPECT_EQ(masks[0], 0xfffffffffffffffe);
EXPECT_EQ(masks[1], 0xffffffffffffffff);
// Test MSB at first addr.
clear_bit(63, masks);
EXPECT_EQ(masks[0], 0x7ffffffffffffffe);
EXPECT_EQ(masks[1], 0xffffffffffffffff);
// Test LSB at 2nd addr.
clear_bit(64, masks);
EXPECT_EQ(masks[0], 0x7ffffffffffffffe);
EXPECT_EQ(masks[1], 0xfffffffffffffffe);
}
TEST_F(PlatformTest, bits_to_ints) {
EXPECT_EQ(0, BITS_TO_INTS(0));
EXPECT_EQ(1, BITS_TO_INTS(1));
EXPECT_EQ(1, BITS_TO_INTS(BITS_PER_INT - 1));
EXPECT_EQ(1, BITS_TO_INTS(BITS_PER_INT));
EXPECT_EQ(2, BITS_TO_INTS(BITS_PER_INT + 1));
}
TEST_F(PlatformTest, bits_to_longs) {
EXPECT_EQ(0, BITS_TO_LONGS(0));
EXPECT_EQ(1, BITS_TO_LONGS(1));
EXPECT_EQ(1, BITS_TO_LONGS(BITS_PER_LONG - 1));
EXPECT_EQ(1, BITS_TO_LONGS(BITS_PER_LONG));
EXPECT_EQ(2, BITS_TO_LONGS(BITS_PER_LONG + 1));
}
TEST_F(PlatformTest, eth_broadcast_addr) {
uint8_t mac[] = {0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde};
eth_broadcast_addr(mac);
uint8_t expected[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xde};
EXPECT_EQ(0, std::memcmp(expected, mac, sizeof(expected)));
}
TEST_F(PlatformTest, find_first_bit) {
unsigned test0[] = {
0x00000000,
0x00000000,
};
EXPECT_EQ(1, find_first_bit(test0, 1)); // Not found
EXPECT_EQ(31, find_first_bit(test0, 31)); // Not found
EXPECT_EQ(32, find_first_bit(test0, 32)); // Not found
EXPECT_EQ(64, find_first_bit(test0, 64)); // Not found
unsigned test1[] = {
0x80000000,
0xdead0001,
};
ASSERT_EQ(sizeof(*test1), 4);
EXPECT_EQ(1, find_first_bit(test1, 1)); // Not found
EXPECT_EQ(31, find_first_bit(test1, 31)); // Not found
EXPECT_EQ(31, find_first_bit(test1, 32));
EXPECT_EQ(31, find_first_bit(test1, 33));
EXPECT_EQ(31, find_first_bit(test1, 64));
unsigned test2[] = {
0x00000000,
0xdead0001,
};
EXPECT_EQ(31, find_first_bit(test2, 31)); // Not found
EXPECT_EQ(32, find_first_bit(test2, 32)); // Not found
EXPECT_EQ(32, find_first_bit(test2, 33));
EXPECT_EQ(32, find_first_bit(test2, 64));
}
TEST_F(PlatformTest, find_last_bit) {
unsigned test0[] = {
0x00000000,
0x00000000,
};
EXPECT_EQ(1, find_last_bit(test0, 1)); // Not found
EXPECT_EQ(31, find_last_bit(test0, 31)); // Not found
EXPECT_EQ(32, find_last_bit(test0, 32)); // Not found
EXPECT_EQ(64, find_last_bit(test0, 64)); // Not found
unsigned test1[] = {
0x40000000,
0x00010001,
};
ASSERT_EQ(sizeof(*test1), 4);
EXPECT_EQ(1, find_last_bit(test1, 1)); // Not found
EXPECT_EQ(30, find_last_bit(test1, 31));
EXPECT_EQ(30, find_last_bit(test1, 32));
EXPECT_EQ(32, find_last_bit(test1, 33));
EXPECT_EQ(32, find_last_bit(test1, 48));
EXPECT_EQ(48, find_last_bit(test1, 64));
unsigned test2[] = {
0x00000000,
0x80000000,
};
EXPECT_EQ(31, find_last_bit(test2, 31)); // Not found
EXPECT_EQ(32, find_last_bit(test2, 32)); // Not found
EXPECT_EQ(33, find_last_bit(test2, 33)); // Not found
EXPECT_EQ(63, find_last_bit(test2, 64));
}
TEST_F(PlatformTest, find_next_bit) {
unsigned test[] = {
0x00001000,
0x00000000,
};
EXPECT_EQ(32, find_next_bit(test, 32, 16)); // Not found
EXPECT_EQ(12, find_next_bit(test, 32, 0));
EXPECT_EQ(12, find_next_bit(test, 64, 0));
}
TEST_F(PlatformTest, ieee80211_sn_less) {
EXPECT_FALSE(ieee80211_sn_less(0x0000, 0x0000));
EXPECT_FALSE(ieee80211_sn_less(0x0040, 0x0040));
EXPECT_TRUE(ieee80211_sn_less(0x0000, 0x0001));
EXPECT_FALSE(ieee80211_sn_less(0x0001, 0x0000));
EXPECT_TRUE(ieee80211_sn_less(0x0000, 0x07ff));
EXPECT_FALSE(ieee80211_sn_less(0x07ff, 0x0000));
EXPECT_FALSE(ieee80211_sn_less(0x0000, 0x0800));
EXPECT_FALSE(ieee80211_sn_less(0x0800, 0x0000));
EXPECT_TRUE(ieee80211_sn_less(0x0801, 0x0000));
EXPECT_TRUE(ieee80211_sn_less(0x0003, 0x0800));
EXPECT_TRUE(ieee80211_sn_less(0x0f00, 0x0000));
EXPECT_FALSE(ieee80211_sn_less(0x0fff, 0x07ff));
EXPECT_FALSE(ieee80211_sn_less(0x07ff, 0x0fff));
EXPECT_TRUE(ieee80211_sn_less(0x0fff, 0x07fe));
EXPECT_TRUE(ieee80211_sn_less(0x0800, 0x0fff));
}
TEST_F(PlatformTest, u32_encode_bits) {
// normal cases
EXPECT_EQ(0x00000066, u32_encode_bits(0x5566, 0x000000ff));
EXPECT_EQ(0x00556600, u32_encode_bits(0x5566, 0x00ffff00));
EXPECT_EQ(0x55660000, u32_encode_bits(0x5566, 0xffff0000));
EXPECT_EQ(0x05566180, u32_encode_bits(0x556618, 0x0ffffff0));
// overflow cases
EXPECT_EQ(0x00000001, u32_encode_bits(0xffff, 0x00000001));
EXPECT_EQ(0x00018300, u32_encode_bits(0x55660183, 0x00ffff00));
EXPECT_EQ(0x66018300, u32_encode_bits(0x55660183, 0xffffff00));
// unusual masks
EXPECT_EQ(0x00001001, u32_encode_bits(0xffff, 0xf0f01001)); // shift 0
}
TEST_F(PlatformTest, is_power_of_2) {
EXPECT_TRUE(is_power_of_2(0));
EXPECT_TRUE(is_power_of_2(1));
EXPECT_TRUE(is_power_of_2(2));
EXPECT_FALSE(is_power_of_2(3));
EXPECT_TRUE(is_power_of_2(0x10000000));
EXPECT_FALSE(is_power_of_2(0xf0000000));
}
TEST_F(PlatformTest, ALIGN) {
EXPECT_EQ(8, ALIGN(5, 4));
EXPECT_EQ(14, ALIGN(11, 7));
}
TEST_F(PlatformTest, lower_upper) {
EXPECT_EQ(0x34567890, lower_32_bits(0x1234567890));
EXPECT_EQ(0x12, upper_32_bits(0x1234567890));
}
TEST_F(PlatformTest, ilog2) {
EXPECT_EQ(31, ilog2(0x80000000));
EXPECT_EQ(31, ilog2(0xffffffff));
EXPECT_EQ(1, ilog2(0x00000003));
EXPECT_EQ(0, ilog2(0x00000001));
EXPECT_EQ(-1, ilog2(0));
}
} // namespace