Skip to content

Commit 04ee3c3

Browse files
committed
Translate tests/test_lexer.py to C unit test
To try out our new testing framework, move some simple Python unit tests for the internal lexer API to C unit tests. Signed-off-by: Omar Sandoval <[email protected]>
1 parent 2087f6b commit 04ee3c3

File tree

5 files changed

+94
-49
lines changed

5 files changed

+94
-49
lines changed

libdrgn/Makefile.am

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,7 @@ examples_load_debug_info_LDADD = libdrgnimpl.la
214214
# Python unit tests instead.
215215
TESTS = $(check_PROGRAMS)
216216

217-
check_PROGRAMS =
217+
check_PROGRAMS = tests/lexer
218218

219219
EXTRA_DIST += $(addsuffix .c.in,$(check_PROGRAMS))
220220

@@ -230,5 +230,9 @@ test_cflags = $(AM_CFLAGS) $(check_CFLAGS)
230230
test_cppflags = $(AM_CPPFLAGS) -iquote $(srcdir)/tests
231231
test_ldadd = $(check_LIBS) libdrgnimpl.la
232232

233+
tests_lexer_CFLAGS = $(test_cflags)
234+
tests_lexer_CPPFLAGS = $(test_cppflags)
235+
tests_lexer_LDADD = $(test_ldadd)
236+
233237
# Don't delete test-suite.log on failure.
234238
.PRECIOUS: $(TEST_SUITE_LOG)

libdrgn/python/test.c

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -50,22 +50,6 @@ DRGNPY_PUBLIC struct drgn_error *drgn_test_lexer_peek(struct drgn_lexer *lexer,
5050
return drgn_lexer_peek(lexer, token);
5151
}
5252

53-
struct drgn_error *drgn_test_lexer_func(struct drgn_lexer *lexer,
54-
struct drgn_token *token);
55-
DRGNPY_PUBLIC struct drgn_error *drgn_test_lexer_func(struct drgn_lexer *lexer,
56-
struct drgn_token *token)
57-
{
58-
token->kind = *lexer->p;
59-
token->value = lexer->p;
60-
if (token->kind) {
61-
token->len = 1;
62-
lexer->p++;
63-
} else {
64-
token->len = 0;
65-
}
66-
return NULL;
67-
}
68-
6953
typeof(drgn_c_family_lexer_func) drgn_test_lexer_c;
7054
DRGNPY_PUBLIC struct drgn_error *drgn_test_lexer_c(struct drgn_lexer *lexer,
7155
struct drgn_token *token)

libdrgn/tests/lexer.c.in

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
// Copyright (c) Meta Platforms, Inc. and affiliates.
2+
// SPDX-License-Identifier: LGPL-2.1-or-later
3+
4+
#include "test_util.h"
5+
#include "../lexer.h"
6+
7+
static struct drgn_error *dummy_lexer_func(struct drgn_lexer *lexer,
8+
struct drgn_token *token)
9+
{
10+
token->kind = *lexer->p;
11+
token->value = lexer->p;
12+
if (token->kind) {
13+
token->len = 1;
14+
lexer->p++;
15+
} else {
16+
token->len = 0;
17+
}
18+
return NULL;
19+
}
20+
21+
#suite lexer
22+
23+
#tcase lexer
24+
25+
#test pop
26+
{
27+
struct drgn_lexer lexer;
28+
drgn_lexer_init(&lexer, dummy_lexer_func, "12345");
29+
struct drgn_token token;
30+
for (int i = 0; i < 5; i++) {
31+
drgn_ck_no_err(drgn_lexer_pop(&lexer, &token));
32+
ck_assert_int_eq(token.kind, '1' + i);
33+
ck_assert_uint_eq(token.len, 1);
34+
ck_assert_int_eq(*token.value, '1' + i);
35+
}
36+
drgn_ck_no_err(drgn_lexer_pop(&lexer, &token));
37+
ck_assert_int_eq(token.kind, 0);
38+
ck_assert_uint_eq(token.len, 0);
39+
drgn_lexer_deinit(&lexer);
40+
}
41+
42+
#test push
43+
{
44+
struct drgn_lexer lexer;
45+
drgn_lexer_init(&lexer, dummy_lexer_func, "12345");
46+
struct drgn_token tokens[4];
47+
for (int i = 0; i < 4; i++)
48+
drgn_ck_no_err(drgn_lexer_pop(&lexer, &tokens[i]));
49+
for (int i = 3; i >= 0; i--)
50+
drgn_ck_no_err(drgn_lexer_push(&lexer, &tokens[i]));
51+
struct drgn_token token;
52+
for (int i = 0; i < 5; i++) {
53+
drgn_ck_no_err(drgn_lexer_pop(&lexer, &token));
54+
ck_assert_int_eq(token.kind, '1' + i);
55+
ck_assert_uint_eq(token.len, 1);
56+
ck_assert_int_eq(*token.value, '1' + i);
57+
}
58+
drgn_ck_no_err(drgn_lexer_pop(&lexer, &token));
59+
ck_assert_int_eq(token.kind, 0);
60+
ck_assert_uint_eq(token.len, 0);
61+
drgn_lexer_deinit(&lexer);
62+
}
63+
64+
#test peek
65+
{
66+
struct drgn_lexer lexer;
67+
drgn_lexer_init(&lexer, dummy_lexer_func, "12345");
68+
struct drgn_token token;
69+
for (int i = 0; i < 5; i++) {
70+
drgn_ck_no_err(drgn_lexer_peek(&lexer, &token));
71+
ck_assert_int_eq(token.kind, '1' + i);
72+
ck_assert_uint_eq(token.len, 1);
73+
ck_assert_int_eq(*token.value, '1' + i);
74+
75+
drgn_ck_no_err(drgn_lexer_pop(&lexer, &token));
76+
ck_assert_int_eq(token.kind, '1' + i);
77+
ck_assert_uint_eq(token.len, 1);
78+
ck_assert_int_eq(*token.value, '1' + i);
79+
}
80+
81+
drgn_ck_no_err(drgn_lexer_peek(&lexer, &token));
82+
ck_assert_int_eq(token.kind, 0);
83+
ck_assert_uint_eq(token.len, 0);
84+
85+
drgn_ck_no_err(drgn_lexer_pop(&lexer, &token));
86+
ck_assert_int_eq(token.kind, 0);
87+
ck_assert_uint_eq(token.len, 0);
88+
drgn_lexer_deinit(&lexer);
89+
}

tests/libdrgn.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,6 @@ class _drgn_c_family_lexer(ctypes.Structure):
160160

161161

162162
drgn_c_family_lexer_func = drgn_lexer_func.in_dll(_drgn_cdll, "drgn_test_lexer_c")
163-
drgn_test_lexer_func = drgn_lexer_func.in_dll(_drgn_cdll, "drgn_test_lexer_func")
164163

165164

166165
class C_TOKEN(enum.IntEnum):

tests/test_lexer.py

Lines changed: 0 additions & 31 deletions
This file was deleted.

0 commit comments

Comments
 (0)