blob: 72581bb783f45ec78a5e6292de58f2d640f6938f [file] [log] [blame]
// Copyright 2025 The Fuchsia Authors
//
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file or at
// https://opensource.org/licenses/MIT
#include <lib/power-management/bandwidth-reservation-cache.h>
#include <gtest/gtest.h>
namespace {
using power_management::BandwidthReservationCache;
using power_management::Time;
using power_management::Utilization;
TEST(BandwidthReservationCacheTest, Add) {
BandwidthReservationCache<4> bandwdith_reservation_cache;
ASSERT_EQ(bandwdith_reservation_cache.total_deferred_utilization(), Utilization{0});
// Fill up the cache with reservations. Since there are no evictions, no
// deferred utilization should be removed in the process of adding an entry.
EXPECT_EQ(bandwdith_reservation_cache.Add(1, Time{10}, Utilization{1}), Utilization{0});
EXPECT_EQ(bandwdith_reservation_cache.Add(2, Time{20}, Utilization{2}), Utilization{0});
EXPECT_EQ(bandwdith_reservation_cache.Add(3, Time{30}, Utilization{3}), Utilization{0});
EXPECT_EQ(bandwdith_reservation_cache.Add(4, Time{40}, Utilization{4}), Utilization{0});
ASSERT_EQ(bandwdith_reservation_cache.total_deferred_utilization(), Utilization{10});
// Adding another reservation with an earlier finish time than at least one
// existing entry should evict the entry with the latest finish time and
// return the reservation that was removed.
EXPECT_EQ(bandwdith_reservation_cache.Add(5, Time{15}, Utilization{5}), Utilization{4});
ASSERT_EQ(bandwdith_reservation_cache.total_deferred_utilization(), Utilization{11});
// Attempting to add another reservation with a later finish time than any
// existing entry in the cache should have no effect.
EXPECT_EQ(bandwdith_reservation_cache.Add(6, Time{60}, Utilization{6}), Utilization{6});
ASSERT_EQ(bandwdith_reservation_cache.total_deferred_utilization(), Utilization{11});
// Adding an existing tid should update the entry and return the previous
// reservation.
EXPECT_EQ(bandwdith_reservation_cache.Add(5, Time{25}, Utilization{6}), Utilization{5});
ASSERT_EQ(bandwdith_reservation_cache.total_deferred_utilization(), Utilization{12});
}
TEST(BandwidthReservationCacheTest, Prune) {
BandwidthReservationCache<4> bandwdith_reservation_cache;
ASSERT_EQ(bandwdith_reservation_cache.total_deferred_utilization(), Utilization{0});
EXPECT_EQ(bandwdith_reservation_cache.Add(1, Time{10}, Utilization{1}), Utilization{0});
EXPECT_EQ(bandwdith_reservation_cache.Add(2, Time{20}, Utilization{2}), Utilization{0});
EXPECT_EQ(bandwdith_reservation_cache.Add(3, Time{30}, Utilization{3}), Utilization{0});
EXPECT_EQ(bandwdith_reservation_cache.Add(4, Time{40}, Utilization{4}), Utilization{0});
ASSERT_EQ(bandwdith_reservation_cache.total_deferred_utilization(), Utilization{10});
// Pruning to earlier than any finish time should have no effect.
EXPECT_EQ(bandwdith_reservation_cache.Prune(Time{5}), Utilization{0});
ASSERT_EQ(bandwdith_reservation_cache.total_deferred_utilization(), Utilization{10});
EXPECT_EQ(bandwdith_reservation_cache.Prune(Time{10}), Utilization{1});
ASSERT_EQ(bandwdith_reservation_cache.total_deferred_utilization(), Utilization{9});
EXPECT_EQ(bandwdith_reservation_cache.Prune(Time{25}), Utilization{2});
ASSERT_EQ(bandwdith_reservation_cache.total_deferred_utilization(), Utilization{7});
// Pruning should remove all entries with earlier finish times.
EXPECT_EQ(bandwdith_reservation_cache.Prune(Time{50}), Utilization{7});
ASSERT_EQ(bandwdith_reservation_cache.total_deferred_utilization(), Utilization{0});
}
TEST(BandwidthReservationCacheTest, Clear) {
BandwidthReservationCache<4> bandwdith_reservation_cache;
ASSERT_EQ(bandwdith_reservation_cache.total_deferred_utilization(), Utilization{0});
EXPECT_EQ(bandwdith_reservation_cache.Add(1, Time{10}, Utilization{1}), Utilization{0});
EXPECT_EQ(bandwdith_reservation_cache.Add(2, Time{20}, Utilization{2}), Utilization{0});
EXPECT_EQ(bandwdith_reservation_cache.Add(3, Time{30}, Utilization{3}), Utilization{0});
EXPECT_EQ(bandwdith_reservation_cache.Add(4, Time{40}, Utilization{4}), Utilization{0});
ASSERT_EQ(bandwdith_reservation_cache.total_deferred_utilization(), Utilization{10});
// Clearing the cache should remove all reservations and deferred utilization.
EXPECT_EQ(bandwdith_reservation_cache.Clear(), Utilization{10});
ASSERT_EQ(bandwdith_reservation_cache.total_deferred_utilization(), Utilization{0});
}
TEST(BandwidthReservationCacheTest, ClampToNextFinishTime) {
BandwidthReservationCache<4> bandwdith_reservation_cache;
ASSERT_EQ(bandwdith_reservation_cache.total_deferred_utilization(), Utilization{0});
EXPECT_EQ(bandwdith_reservation_cache.Add(1, Time{10}, Utilization{1}), Utilization{0});
EXPECT_EQ(bandwdith_reservation_cache.Add(2, Time{20}, Utilization{2}), Utilization{0});
EXPECT_EQ(bandwdith_reservation_cache.Add(3, Time{30}, Utilization{3}), Utilization{0});
EXPECT_EQ(bandwdith_reservation_cache.Add(4, Time{40}, Utilization{4}), Utilization{0});
ASSERT_EQ(bandwdith_reservation_cache.total_deferred_utilization(), Utilization{10});
EXPECT_EQ(bandwdith_reservation_cache.ClampToNextFinishTime(Time{5}), Time{5});
EXPECT_EQ(bandwdith_reservation_cache.ClampToNextFinishTime(Time{10}), Time{10});
EXPECT_EQ(bandwdith_reservation_cache.ClampToNextFinishTime(Time{20}), Time{10});
EXPECT_EQ(bandwdith_reservation_cache.ClampToNextFinishTime(Time{30}), Time{10});
EXPECT_EQ(bandwdith_reservation_cache.ClampToNextFinishTime(Time{40}), Time{10});
EXPECT_EQ(bandwdith_reservation_cache.ClampToNextFinishTime(Time{50}), Time{10});
EXPECT_EQ(bandwdith_reservation_cache.Remove(1), Utilization{1});
ASSERT_EQ(bandwdith_reservation_cache.total_deferred_utilization(), Utilization{9});
EXPECT_EQ(bandwdith_reservation_cache.ClampToNextFinishTime(Time{5}), Time{5});
EXPECT_EQ(bandwdith_reservation_cache.ClampToNextFinishTime(Time{10}), Time{10});
EXPECT_EQ(bandwdith_reservation_cache.ClampToNextFinishTime(Time{20}), Time{20});
EXPECT_EQ(bandwdith_reservation_cache.ClampToNextFinishTime(Time{30}), Time{20});
EXPECT_EQ(bandwdith_reservation_cache.ClampToNextFinishTime(Time{40}), Time{20});
EXPECT_EQ(bandwdith_reservation_cache.ClampToNextFinishTime(Time{50}), Time{20});
EXPECT_EQ(bandwdith_reservation_cache.Clear(), Utilization{9});
EXPECT_EQ(bandwdith_reservation_cache.ClampToNextFinishTime(Time{5}), Time{5});
EXPECT_EQ(bandwdith_reservation_cache.ClampToNextFinishTime(Time{10}), Time{10});
EXPECT_EQ(bandwdith_reservation_cache.ClampToNextFinishTime(Time{20}), Time{20});
EXPECT_EQ(bandwdith_reservation_cache.ClampToNextFinishTime(Time{30}), Time{30});
EXPECT_EQ(bandwdith_reservation_cache.ClampToNextFinishTime(Time{40}), Time{40});
EXPECT_EQ(bandwdith_reservation_cache.ClampToNextFinishTime(Time{50}), Time{50});
}
TEST(BandwidthReservationCacheTest, Mix) {
BandwidthReservationCache<4> bandwdith_reservation_cache;
ASSERT_EQ(bandwdith_reservation_cache.total_deferred_utilization(), Utilization{0});
EXPECT_EQ(bandwdith_reservation_cache.Add(1, Time{10}, Utilization{1}), Utilization{0});
EXPECT_EQ(bandwdith_reservation_cache.Add(2, Time{20}, Utilization{2}), Utilization{0});
EXPECT_EQ(bandwdith_reservation_cache.Add(3, Time{30}, Utilization{3}), Utilization{0});
EXPECT_EQ(bandwdith_reservation_cache.Add(4, Time{40}, Utilization{4}), Utilization{0});
ASSERT_EQ(bandwdith_reservation_cache.total_deferred_utilization(), Utilization{10});
// Adding another reservation with an earlier finish time than at least one
// existing entry should evict the entry with the latest finish time and
// return the reservation that was removed.
EXPECT_EQ(bandwdith_reservation_cache.Add(5, Time{15}, Utilization{5}), Utilization{4});
ASSERT_EQ(bandwdith_reservation_cache.total_deferred_utilization(), Utilization{11});
// Attempting to add another reservation with a later finish time than any
// existing entry in the cache should have no effect.
EXPECT_EQ(bandwdith_reservation_cache.Add(6, Time{60}, Utilization{6}), Utilization{6});
ASSERT_EQ(bandwdith_reservation_cache.total_deferred_utilization(), Utilization{11});
// Prune the reservations with finish times less than or equal to 20,
// returning the total bandwidth reservation removed.
EXPECT_EQ(bandwdith_reservation_cache.Prune(Time{20}), Utilization{8});
ASSERT_EQ(bandwdith_reservation_cache.total_deferred_utilization(), Utilization{3});
// Removing an entry that is not in the cache should have no effect.
EXPECT_EQ(bandwdith_reservation_cache.Remove(6), Utilization{0});
ASSERT_EQ(bandwdith_reservation_cache.total_deferred_utilization(), Utilization{3});
// Removing an existing entry should return the reservation that was removed.
EXPECT_EQ(bandwdith_reservation_cache.Remove(3), Utilization{3});
ASSERT_EQ(bandwdith_reservation_cache.total_deferred_utilization(), Utilization{0});
}
} // anonymous namespace