From 4ac4e96bed7ff1d981ba0de7004362d2639bd1a0 Mon Sep 17 00:00:00 2001 From: Subv Date: Sun, 27 Dec 2015 19:04:32 -0500 Subject: [PATCH] Tests/Kernel: Added hwtests for svcArbitrateAddress --- source/tests/kernel/address_arbiter.cpp | 53 +++++++++++++++++++++++++ source/tests/kernel/kernel.cpp | 2 + 2 files changed, 55 insertions(+) create mode 100644 source/tests/kernel/address_arbiter.cpp diff --git a/source/tests/kernel/address_arbiter.cpp b/source/tests/kernel/address_arbiter.cpp new file mode 100644 index 0000000..8a99f49 --- /dev/null +++ b/source/tests/kernel/address_arbiter.cpp @@ -0,0 +1,53 @@ +#include +#include +#include <3ds.h> + +#include "common/scope_exit.h" +#include "tests/test.h" + +namespace Kernel { +namespace AddressArbiter { + +static bool Test_ArbitrateAddress() { + const Result ERR_TIMEOUT = 0x09401BFE; + + Handle arbiter; + TestEquals(svcCreateAddressArbiter(&arbiter), 0); + SCOPE_EXIT({ svcCloseHandle(arbiter); }); + + s32 arbitration_value = 0; + + // Test ARBITRATION_WAIT_IF_LESS_THAN, should not wait + TestEquals(svcArbitrateAddress(arbiter, (u32)&arbitration_value, ARBITRATION_WAIT_IF_LESS_THAN, 0, 0), 0); + TestEquals(arbitration_value, 0); + + // Test ARBITRATION_WAIT_IF_LESS_THAN_TIMEOUT, this one should _not_ wait, however, it still returns a Timeout error + TestEquals(svcArbitrateAddress(arbiter, (u32)&arbitration_value, ARBITRATION_WAIT_IF_LESS_THAN_TIMEOUT, 0, 3000000000), ERR_TIMEOUT); + TestEquals(arbitration_value, 0); + + // Test ARBITRATION_WAIT_IF_LESS_THAN_TIMEOUT, this should wait and return a Timeout error + TestEquals(svcArbitrateAddress(arbiter, (u32)&arbitration_value, ARBITRATION_WAIT_IF_LESS_THAN_TIMEOUT, 1, 3000000000), ERR_TIMEOUT); + TestEquals(arbitration_value, 0); + + // Test ARBITRATION_DECREMENT_AND_WAIT_IF_LESS_THAN_TIMEOUT, this one should wait and return a Timeout error + TestEquals(svcArbitrateAddress(arbiter, (u32)&arbitration_value, ARBITRATION_DECREMENT_AND_WAIT_IF_LESS_THAN_TIMEOUT, 1, 3000000000), ERR_TIMEOUT); + // The value must be modified if the thread was put to sleep + TestEquals(arbitration_value, -1); + + // Reset the value + arbitration_value = 0; + + // Test ARBITRATION_DECREMENT_AND_WAIT_IF_LESS_THAN, this one should not wait and return RESULT_SUCCESS + TestEquals(svcArbitrateAddress(arbiter, (u32)&arbitration_value, ARBITRATION_DECREMENT_AND_WAIT_IF_LESS_THAN, 0, 0), 0); + // The value must not be modified if the thread was not put to sleep + TestEquals(arbitration_value, 0); + + return true; +} + +void TestAll() { + Test("Kernel::AddressArbiter", "ArbitrateAddress", Test_ArbitrateAddress(), true); +} + +} // namespace +} // namespace diff --git a/source/tests/kernel/kernel.cpp b/source/tests/kernel/kernel.cpp index 7976ead..e14392d 100644 --- a/source/tests/kernel/kernel.cpp +++ b/source/tests/kernel/kernel.cpp @@ -4,10 +4,12 @@ namespace Kernel { namespace Ports { void TestAll(); } namespace WaitSynch { void TestAll(); } +namespace AddressArbiter { void TestAll(); } void TestAll() { Ports::TestAll(); WaitSynch::TestAll(); + AddressArbiter::TestAll(); } } // namespace