Skip to content
3 changes: 3 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
[submodule "picotest"]
path = picotest
url = https://github.com/h2o/picotest.git
15 changes: 15 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -57,3 +57,18 @@ target_link_libraries(pcie_cfg_read tlp)
add_executable(pcie_cfg_write apps/pcie_cfg_write.c)
target_link_libraries(pcie_cfg_write tlp)

# unittest
enable_testing()
add_executable(unit_test unit_test.c picotest/picotest.c)
target_link_libraries(unit_test tlp)
add_test(
NAME unit_test
COMMAND unit_test
)
add_custom_command(
TARGET unit_test
COMMENT "Run tests"
POST_BUILD
COMMAND unit_test --output-on-failures
)

1 change: 1 addition & 0 deletions picotest
Submodule picotest added at 6906d9
153 changes: 153 additions & 0 deletions unit_test.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,153 @@
#include "picotest/picotest.h"

#include <libtlp.h>

static void
calculate_fstdw_lstdw(uintptr_t addr, size_t count, int *result_fst, int *result_lst)
{
*result_fst = tlp_calculate_fstdw(addr, count);
*result_lst = tlp_calculate_lstdw(addr, count);
//note("result_fst=0x%x, result_lst=0x%x", *result_fst, *result_lst);
}

static void
test_tlp_calculate_fstdw_lstdw(void)
{
int result_fst, result_lst;

// zero-length read and write
calculate_fstdw_lstdw(0x0, 0, &result_fst, &result_lst);
ok(result_fst == 0 && result_lst == 0);

calculate_fstdw_lstdw(0x0, 4093, &result_fst, &result_lst);
ok(result_fst == 0xf && result_lst == 0x1);

calculate_fstdw_lstdw(0x0, 4094, &result_fst, &result_lst);
ok(result_fst == 0xf && result_lst == 0x3);

calculate_fstdw_lstdw(0x0, 4095, &result_fst, &result_lst);
ok(result_fst == 0xf && result_lst == 0x7);

calculate_fstdw_lstdw(0x0, 4096, &result_fst, &result_lst);
ok(result_fst == 0xf && result_lst == 0xf);

// zero-length read and write
calculate_fstdw_lstdw(0xa0000003, 0, &result_fst, &result_lst);
ok(result_fst == 0x0 && result_lst == 0x0);

calculate_fstdw_lstdw(0xa0000000, 1, &result_fst, &result_lst);
ok(result_fst == 0x1 && result_lst == 0x0);

calculate_fstdw_lstdw(0xa0000000, 2, &result_fst, &result_lst);
ok(result_fst == 0x3 && result_lst == 0x0);

calculate_fstdw_lstdw(0xa0000000, 3, &result_fst, &result_lst);
ok(result_fst == 0x7 && result_lst == 0x0);

calculate_fstdw_lstdw(0xa0000000, 4, &result_fst, &result_lst);
ok(result_fst == 0xf && result_lst == 0x0);

calculate_fstdw_lstdw(0xa0000000, 5, &result_fst, &result_lst);
ok(result_fst == 0xf && result_lst == 0x1);

calculate_fstdw_lstdw(0xa0000000, 6, &result_fst, &result_lst);
ok(result_fst == 0xf && result_lst == 0x3);

calculate_fstdw_lstdw(0xa0000000, 7, &result_fst, &result_lst);
ok(result_fst == 0xf && result_lst == 0x7);

calculate_fstdw_lstdw(0xa0000000, 8, &result_fst, &result_lst);
ok(result_fst == 0xf && result_lst == 0xf);

calculate_fstdw_lstdw(0xa0000000, 16, &result_fst, &result_lst);
ok(result_fst == 0xf && result_lst == 0xf);

calculate_fstdw_lstdw(0x00000003, 9, &result_fst, &result_lst);
ok(result_fst == 0x8 && result_lst == 0xf);

calculate_fstdw_lstdw(0x00000003, 10, &result_fst, &result_lst);
ok(result_fst == 0x8 && result_lst == 0x1);

calculate_fstdw_lstdw(0x00000003, 11, &result_fst, &result_lst);
ok(result_fst == 0x8 && result_lst == 0x3);

calculate_fstdw_lstdw(0x00000003, 12, &result_fst, &result_lst);
ok(result_fst == 0x8 && result_lst == 0x7);

calculate_fstdw_lstdw(0x00000003, 13, &result_fst, &result_lst);
ok(result_fst == 0x8 && result_lst == 0xf);
}

static void
test_tlp_calculate_length(void)
{
int result_length;

result_length = tlp_calculate_length(0x0, 0);
ok(result_length == 0);

result_length = tlp_calculate_length(0x1, 0);

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This test fails. the correct behavior is 0?

ok(result_length == 0);

result_length = tlp_calculate_length(0x2, 0);
ok(result_length == 0);

result_length = tlp_calculate_length(0x3, 0);
ok(result_length == 0);

result_length = tlp_calculate_length(0x0, 1);
ok(result_length == 1);

result_length = tlp_calculate_length(0x0, 2);
ok(result_length == 1);

result_length = tlp_calculate_length(0x0, 3);
ok(result_length == 1);

result_length = tlp_calculate_length(0x0, 4);
ok(result_length == 1);

result_length = tlp_calculate_length(0x0, 5);
ok(result_length == 2);

result_length = tlp_calculate_length(0x3, 2);
ok(result_length == 2);

result_length = tlp_calculate_length(0x3, 7);
ok(result_length == 3);

result_length = tlp_calculate_length(0x0, 4089);
ok(result_length == 1023);

result_length = tlp_calculate_length(0x0, 4090);
ok(result_length == 1023);

result_length = tlp_calculate_length(0x0, 4091);
ok(result_length == 1023);

result_length = tlp_calculate_length(0x0, 4092);
ok(result_length == 1023);

result_length = tlp_calculate_length(0x0, 4093);
ok(result_length == 0);

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These four tests also fail. result_length must be 1024.


result_length = tlp_calculate_length(0x0, 4094);
ok(result_length == 0);

result_length = tlp_calculate_length(0x0, 4095);
ok(result_length == 0);

result_length = tlp_calculate_length(0x0, 4096);
ok(result_length == 0);

}

int
main(int argc, char **argv)
{
subtest("tlp_calculate_fstdw_lstdw", test_tlp_calculate_fstdw_lstdw);
subtest("tlp_calculate_length", test_tlp_calculate_length);

return done_testing();
}