xref: /linux/tools/unittests/test_tokenizer.py (revision 5181afcdf99527dd92a88f80fc4d0d8013e1b510)
1fe79f85fSMauro Carvalho Chehab#!/usr/bin/env python3
2fe79f85fSMauro Carvalho Chehab
3fe79f85fSMauro Carvalho Chehab"""
4fe79f85fSMauro Carvalho ChehabUnit tests for struct/union member extractor class.
5fe79f85fSMauro Carvalho Chehab"""
6fe79f85fSMauro Carvalho Chehab
7fe79f85fSMauro Carvalho Chehab
8fe79f85fSMauro Carvalho Chehabimport os
9fe79f85fSMauro Carvalho Chehabimport re
10fe79f85fSMauro Carvalho Chehabimport unittest
11fe79f85fSMauro Carvalho Chehabimport sys
12fe79f85fSMauro Carvalho Chehab
13fe79f85fSMauro Carvalho Chehabfrom unittest.mock import MagicMock
14fe79f85fSMauro Carvalho Chehab
15fe79f85fSMauro Carvalho ChehabSRC_DIR = os.path.dirname(os.path.realpath(__file__))
16fe79f85fSMauro Carvalho Chehabsys.path.insert(0, os.path.join(SRC_DIR, "../lib/python"))
17fe79f85fSMauro Carvalho Chehab
185f6fc8edSMauro Carvalho Chehabfrom kdoc.c_lex import CToken, CTokenizer
19fe79f85fSMauro Carvalho Chehabfrom unittest_helper import run_unittest
20fe79f85fSMauro Carvalho Chehab
21fe79f85fSMauro Carvalho Chehab#
22fe79f85fSMauro Carvalho Chehab# List of tests.
23fe79f85fSMauro Carvalho Chehab#
24fe79f85fSMauro Carvalho Chehab# The code will dynamically generate one test for each key on this dictionary.
25fe79f85fSMauro Carvalho Chehab#
265f6fc8edSMauro Carvalho Chehabdef tokens_to_list(tokens):
275f6fc8edSMauro Carvalho Chehab    tuples = []
285f6fc8edSMauro Carvalho Chehab
295f6fc8edSMauro Carvalho Chehab    for tok in tokens:
305f6fc8edSMauro Carvalho Chehab        if tok.kind == CToken.SPACE:
315f6fc8edSMauro Carvalho Chehab            continue
325f6fc8edSMauro Carvalho Chehab
335f6fc8edSMauro Carvalho Chehab        tuples += [(tok.kind, tok.value, tok.level)]
345f6fc8edSMauro Carvalho Chehab
355f6fc8edSMauro Carvalho Chehab    return tuples
365f6fc8edSMauro Carvalho Chehab
375f6fc8edSMauro Carvalho Chehab
385f6fc8edSMauro Carvalho Chehabdef make_tokenizer_test(name, data):
395f6fc8edSMauro Carvalho Chehab    """
405f6fc8edSMauro Carvalho Chehab    Create a test named ``name`` using parameters given by ``data`` dict.
415f6fc8edSMauro Carvalho Chehab    """
425f6fc8edSMauro Carvalho Chehab
435f6fc8edSMauro Carvalho Chehab    def test(self):
445f6fc8edSMauro Carvalho Chehab        """In-lined lambda-like function to run the test"""
455f6fc8edSMauro Carvalho Chehab
465f6fc8edSMauro Carvalho Chehab        #
475f6fc8edSMauro Carvalho Chehab        # Check if logger is working
485f6fc8edSMauro Carvalho Chehab        #
49*14b7775eSMauro Carvalho Chehab        if "log_msg" in data:
50*14b7775eSMauro Carvalho Chehab            with self.assertLogs() as cm:
515f6fc8edSMauro Carvalho Chehab                tokenizer = CTokenizer(data["source"])
525f6fc8edSMauro Carvalho Chehab
53*14b7775eSMauro Carvalho Chehab                msg_found = False
54*14b7775eSMauro Carvalho Chehab                for result in cm.output:
55*14b7775eSMauro Carvalho Chehab                    if data["log_msg"] in result:
56*14b7775eSMauro Carvalho Chehab                        msg_found = True
57*14b7775eSMauro Carvalho Chehab
58*14b7775eSMauro Carvalho Chehab                self.assertTrue(msg_found, f"Missing log {data['log_msg']}")
59*14b7775eSMauro Carvalho Chehab
605f6fc8edSMauro Carvalho Chehab            return
615f6fc8edSMauro Carvalho Chehab
625f6fc8edSMauro Carvalho Chehab        #
635f6fc8edSMauro Carvalho Chehab        # Check if tokenizer is producing expected results
645f6fc8edSMauro Carvalho Chehab        #
655f6fc8edSMauro Carvalho Chehab        tokens = CTokenizer(data["source"]).tokens
665f6fc8edSMauro Carvalho Chehab
675f6fc8edSMauro Carvalho Chehab        result = tokens_to_list(tokens)
685f6fc8edSMauro Carvalho Chehab        expected = tokens_to_list(data["expected"])
695f6fc8edSMauro Carvalho Chehab
705f6fc8edSMauro Carvalho Chehab        self.assertEqual(result, expected, msg=f"{name}")
715f6fc8edSMauro Carvalho Chehab
725f6fc8edSMauro Carvalho Chehab    return test
735f6fc8edSMauro Carvalho Chehab
745f6fc8edSMauro Carvalho Chehab#: Tokenizer tests.
755f6fc8edSMauro Carvalho ChehabTESTS_TOKENIZER = {
765f6fc8edSMauro Carvalho Chehab    "__run__": make_tokenizer_test,
775f6fc8edSMauro Carvalho Chehab
785f6fc8edSMauro Carvalho Chehab    "basic_tokens": {
795f6fc8edSMauro Carvalho Chehab        "source": """
805f6fc8edSMauro Carvalho Chehab            int a; // comment
815f6fc8edSMauro Carvalho Chehab            float b = 1.23;
825f6fc8edSMauro Carvalho Chehab        """,
835f6fc8edSMauro Carvalho Chehab        "expected": [
845f6fc8edSMauro Carvalho Chehab            CToken(CToken.NAME, "int"),
855f6fc8edSMauro Carvalho Chehab            CToken(CToken.NAME, "a"),
865f6fc8edSMauro Carvalho Chehab            CToken(CToken.ENDSTMT, ";"),
875f6fc8edSMauro Carvalho Chehab            CToken(CToken.COMMENT, "// comment"),
885f6fc8edSMauro Carvalho Chehab            CToken(CToken.NAME, "float"),
895f6fc8edSMauro Carvalho Chehab            CToken(CToken.NAME, "b"),
905f6fc8edSMauro Carvalho Chehab            CToken(CToken.OP, "="),
915f6fc8edSMauro Carvalho Chehab            CToken(CToken.NUMBER, "1.23"),
925f6fc8edSMauro Carvalho Chehab            CToken(CToken.ENDSTMT, ";"),
935f6fc8edSMauro Carvalho Chehab        ],
945f6fc8edSMauro Carvalho Chehab    },
955f6fc8edSMauro Carvalho Chehab
965f6fc8edSMauro Carvalho Chehab    "depth_counters": {
975f6fc8edSMauro Carvalho Chehab        "source": """
985f6fc8edSMauro Carvalho Chehab            struct X {
995f6fc8edSMauro Carvalho Chehab                int arr[10];
1005f6fc8edSMauro Carvalho Chehab                func(a[0], (b + c));
1015f6fc8edSMauro Carvalho Chehab            }
1025f6fc8edSMauro Carvalho Chehab        """,
1035f6fc8edSMauro Carvalho Chehab        "expected": [
1045f6fc8edSMauro Carvalho Chehab            CToken(CToken.STRUCT, "struct"),
1055f6fc8edSMauro Carvalho Chehab            CToken(CToken.NAME, "X"),
1065f6fc8edSMauro Carvalho Chehab            CToken(CToken.BEGIN, "{", brace_level=1),
1075f6fc8edSMauro Carvalho Chehab
1085f6fc8edSMauro Carvalho Chehab            CToken(CToken.NAME, "int", brace_level=1),
1095f6fc8edSMauro Carvalho Chehab            CToken(CToken.NAME, "arr", brace_level=1),
1105f6fc8edSMauro Carvalho Chehab            CToken(CToken.BEGIN, "[", brace_level=1, bracket_level=1),
1115f6fc8edSMauro Carvalho Chehab            CToken(CToken.NUMBER, "10", brace_level=1, bracket_level=1),
1125f6fc8edSMauro Carvalho Chehab            CToken(CToken.END, "]", brace_level=1),
1135f6fc8edSMauro Carvalho Chehab            CToken(CToken.ENDSTMT, ";", brace_level=1),
1145f6fc8edSMauro Carvalho Chehab            CToken(CToken.NAME, "func", brace_level=1),
1155f6fc8edSMauro Carvalho Chehab            CToken(CToken.BEGIN, "(", brace_level=1, paren_level=1),
1165f6fc8edSMauro Carvalho Chehab            CToken(CToken.NAME, "a", brace_level=1, paren_level=1),
1175f6fc8edSMauro Carvalho Chehab            CToken(CToken.BEGIN, "[", brace_level=1, paren_level=1, bracket_level=1),
1185f6fc8edSMauro Carvalho Chehab            CToken(CToken.NUMBER, "0", brace_level=1, paren_level=1, bracket_level=1),
1195f6fc8edSMauro Carvalho Chehab            CToken(CToken.END, "]", brace_level=1, paren_level=1),
1205f6fc8edSMauro Carvalho Chehab            CToken(CToken.PUNC, ",", brace_level=1, paren_level=1),
1215f6fc8edSMauro Carvalho Chehab            CToken(CToken.BEGIN, "(", brace_level=1, paren_level=2),
1225f6fc8edSMauro Carvalho Chehab            CToken(CToken.NAME, "b", brace_level=1, paren_level=2),
1235f6fc8edSMauro Carvalho Chehab            CToken(CToken.OP, "+", brace_level=1, paren_level=2),
1245f6fc8edSMauro Carvalho Chehab            CToken(CToken.NAME, "c", brace_level=1, paren_level=2),
1255f6fc8edSMauro Carvalho Chehab            CToken(CToken.END, ")", brace_level=1, paren_level=1),
1265f6fc8edSMauro Carvalho Chehab            CToken(CToken.END, ")", brace_level=1),
1275f6fc8edSMauro Carvalho Chehab            CToken(CToken.ENDSTMT, ";", brace_level=1),
1285f6fc8edSMauro Carvalho Chehab            CToken(CToken.END, "}"),
1295f6fc8edSMauro Carvalho Chehab        ],
1305f6fc8edSMauro Carvalho Chehab    },
1315f6fc8edSMauro Carvalho Chehab
1325f6fc8edSMauro Carvalho Chehab    "mismatch_error": {
1335f6fc8edSMauro Carvalho Chehab        "source": "int a$ = 5;",          # $ is illegal
134*14b7775eSMauro Carvalho Chehab        "log_msg": "Unexpected token",
1355f6fc8edSMauro Carvalho Chehab    },
1365f6fc8edSMauro Carvalho Chehab}
137fe79f85fSMauro Carvalho Chehab
138fe79f85fSMauro Carvalho Chehabdef make_private_test(name, data):
139fe79f85fSMauro Carvalho Chehab    """
140fe79f85fSMauro Carvalho Chehab    Create a test named ``name`` using parameters given by ``data`` dict.
141fe79f85fSMauro Carvalho Chehab    """
142fe79f85fSMauro Carvalho Chehab
143fe79f85fSMauro Carvalho Chehab    def test(self):
144fe79f85fSMauro Carvalho Chehab        """In-lined lambda-like function to run the test"""
145fe79f85fSMauro Carvalho Chehab        tokens = CTokenizer(data["source"])
146fe79f85fSMauro Carvalho Chehab        result = str(tokens)
147fe79f85fSMauro Carvalho Chehab
148fe79f85fSMauro Carvalho Chehab        #
149fe79f85fSMauro Carvalho Chehab        # Avoid whitespace false positives
150fe79f85fSMauro Carvalho Chehab        #
151fe79f85fSMauro Carvalho Chehab        result = re.sub(r"\s++", " ", result).strip()
152fe79f85fSMauro Carvalho Chehab        expected = re.sub(r"\s++", " ", data["trimmed"]).strip()
153fe79f85fSMauro Carvalho Chehab
154fe79f85fSMauro Carvalho Chehab        msg = f"failed when parsing this source:\n{data['source']}"
155fe79f85fSMauro Carvalho Chehab        self.assertEqual(result, expected, msg=msg)
156fe79f85fSMauro Carvalho Chehab
157fe79f85fSMauro Carvalho Chehab    return test
158fe79f85fSMauro Carvalho Chehab
159fe79f85fSMauro Carvalho Chehab#: Tests to check if CTokenizer is handling properly public/private comments.
160fe79f85fSMauro Carvalho ChehabTESTS_PRIVATE = {
161fe79f85fSMauro Carvalho Chehab    #
162fe79f85fSMauro Carvalho Chehab    # Simplest case: no private. Ensure that trimming won't affect struct
163fe79f85fSMauro Carvalho Chehab    #
164fe79f85fSMauro Carvalho Chehab    "__run__": make_private_test,
165fe79f85fSMauro Carvalho Chehab    "no private": {
166fe79f85fSMauro Carvalho Chehab        "source": """
167fe79f85fSMauro Carvalho Chehab            struct foo {
168fe79f85fSMauro Carvalho Chehab                int a;
169fe79f85fSMauro Carvalho Chehab                int b;
170fe79f85fSMauro Carvalho Chehab                int c;
171fe79f85fSMauro Carvalho Chehab            };
172fe79f85fSMauro Carvalho Chehab        """,
173fe79f85fSMauro Carvalho Chehab        "trimmed": """
174fe79f85fSMauro Carvalho Chehab            struct foo {
175fe79f85fSMauro Carvalho Chehab                int a;
176fe79f85fSMauro Carvalho Chehab                int b;
177fe79f85fSMauro Carvalho Chehab                int c;
178fe79f85fSMauro Carvalho Chehab            };
179fe79f85fSMauro Carvalho Chehab        """,
180fe79f85fSMauro Carvalho Chehab    },
181fe79f85fSMauro Carvalho Chehab
182fe79f85fSMauro Carvalho Chehab    #
183fe79f85fSMauro Carvalho Chehab    # Play "by the books" by always having a public in place
184fe79f85fSMauro Carvalho Chehab    #
185fe79f85fSMauro Carvalho Chehab
186fe79f85fSMauro Carvalho Chehab    "balanced_private": {
187fe79f85fSMauro Carvalho Chehab        "source": """
188fe79f85fSMauro Carvalho Chehab            struct foo {
189fe79f85fSMauro Carvalho Chehab                int a;
190fe79f85fSMauro Carvalho Chehab                /* private: */
191fe79f85fSMauro Carvalho Chehab                int b;
192fe79f85fSMauro Carvalho Chehab                /* public: */
193fe79f85fSMauro Carvalho Chehab                int c;
194fe79f85fSMauro Carvalho Chehab            };
195fe79f85fSMauro Carvalho Chehab        """,
196fe79f85fSMauro Carvalho Chehab        "trimmed": """
197fe79f85fSMauro Carvalho Chehab            struct foo {
198fe79f85fSMauro Carvalho Chehab                int a;
199fe79f85fSMauro Carvalho Chehab                int c;
200fe79f85fSMauro Carvalho Chehab            };
201fe79f85fSMauro Carvalho Chehab        """,
202fe79f85fSMauro Carvalho Chehab    },
203fe79f85fSMauro Carvalho Chehab
204fe79f85fSMauro Carvalho Chehab    "balanced_non_greddy_private": {
205fe79f85fSMauro Carvalho Chehab        "source": """
206fe79f85fSMauro Carvalho Chehab            struct foo {
207fe79f85fSMauro Carvalho Chehab                int a;
208fe79f85fSMauro Carvalho Chehab                /* private: */
209fe79f85fSMauro Carvalho Chehab                int b;
210fe79f85fSMauro Carvalho Chehab                /* public: */
211fe79f85fSMauro Carvalho Chehab                int c;
212fe79f85fSMauro Carvalho Chehab                /* private: */
213fe79f85fSMauro Carvalho Chehab                int d;
214fe79f85fSMauro Carvalho Chehab                /* public: */
215fe79f85fSMauro Carvalho Chehab                int e;
216fe79f85fSMauro Carvalho Chehab
217fe79f85fSMauro Carvalho Chehab            };
218fe79f85fSMauro Carvalho Chehab        """,
219fe79f85fSMauro Carvalho Chehab        "trimmed": """
220fe79f85fSMauro Carvalho Chehab            struct foo {
221fe79f85fSMauro Carvalho Chehab                int a;
222fe79f85fSMauro Carvalho Chehab                int c;
223fe79f85fSMauro Carvalho Chehab                int e;
224fe79f85fSMauro Carvalho Chehab            };
225fe79f85fSMauro Carvalho Chehab        """,
226fe79f85fSMauro Carvalho Chehab    },
227fe79f85fSMauro Carvalho Chehab
228fe79f85fSMauro Carvalho Chehab    "balanced_inner_private": {
229fe79f85fSMauro Carvalho Chehab        "source": """
230fe79f85fSMauro Carvalho Chehab            struct foo {
231fe79f85fSMauro Carvalho Chehab                struct {
232fe79f85fSMauro Carvalho Chehab                    int a;
233fe79f85fSMauro Carvalho Chehab                    /* private: ignore below */
234fe79f85fSMauro Carvalho Chehab                    int b;
235fe79f85fSMauro Carvalho Chehab                /* public: but this should not be ignored */
236fe79f85fSMauro Carvalho Chehab                };
237fe79f85fSMauro Carvalho Chehab                int b;
238fe79f85fSMauro Carvalho Chehab            };
239fe79f85fSMauro Carvalho Chehab        """,
240fe79f85fSMauro Carvalho Chehab        "trimmed": """
241fe79f85fSMauro Carvalho Chehab            struct foo {
242fe79f85fSMauro Carvalho Chehab                struct {
243fe79f85fSMauro Carvalho Chehab                    int a;
244fe79f85fSMauro Carvalho Chehab                };
245fe79f85fSMauro Carvalho Chehab                int b;
246fe79f85fSMauro Carvalho Chehab            };
247fe79f85fSMauro Carvalho Chehab        """,
248fe79f85fSMauro Carvalho Chehab    },
249fe79f85fSMauro Carvalho Chehab
250fe79f85fSMauro Carvalho Chehab    #
251fe79f85fSMauro Carvalho Chehab    # Test what happens if there's no public after private place
252fe79f85fSMauro Carvalho Chehab    #
253fe79f85fSMauro Carvalho Chehab
254fe79f85fSMauro Carvalho Chehab    "unbalanced_private": {
255fe79f85fSMauro Carvalho Chehab        "source": """
256fe79f85fSMauro Carvalho Chehab            struct foo {
257fe79f85fSMauro Carvalho Chehab                int a;
258fe79f85fSMauro Carvalho Chehab                /* private: */
259fe79f85fSMauro Carvalho Chehab                int b;
260fe79f85fSMauro Carvalho Chehab                int c;
261fe79f85fSMauro Carvalho Chehab            };
262fe79f85fSMauro Carvalho Chehab        """,
263fe79f85fSMauro Carvalho Chehab        "trimmed": """
264fe79f85fSMauro Carvalho Chehab            struct foo {
265fe79f85fSMauro Carvalho Chehab                int a;
266fe79f85fSMauro Carvalho Chehab            };
267fe79f85fSMauro Carvalho Chehab        """,
268fe79f85fSMauro Carvalho Chehab    },
269fe79f85fSMauro Carvalho Chehab
270fe79f85fSMauro Carvalho Chehab    "unbalanced_inner_private": {
271fe79f85fSMauro Carvalho Chehab        "source": """
272fe79f85fSMauro Carvalho Chehab            struct foo {
273fe79f85fSMauro Carvalho Chehab                struct {
274fe79f85fSMauro Carvalho Chehab                    int a;
275fe79f85fSMauro Carvalho Chehab                    /* private: ignore below */
276fe79f85fSMauro Carvalho Chehab                    int b;
277fe79f85fSMauro Carvalho Chehab                /* but this should not be ignored */
278fe79f85fSMauro Carvalho Chehab                };
279fe79f85fSMauro Carvalho Chehab                int b;
280fe79f85fSMauro Carvalho Chehab            };
281fe79f85fSMauro Carvalho Chehab        """,
282fe79f85fSMauro Carvalho Chehab        "trimmed": """
283fe79f85fSMauro Carvalho Chehab            struct foo {
284fe79f85fSMauro Carvalho Chehab                struct {
285fe79f85fSMauro Carvalho Chehab                    int a;
286fe79f85fSMauro Carvalho Chehab                };
287fe79f85fSMauro Carvalho Chehab                int b;
288fe79f85fSMauro Carvalho Chehab            };
289fe79f85fSMauro Carvalho Chehab        """,
290fe79f85fSMauro Carvalho Chehab    },
291fe79f85fSMauro Carvalho Chehab
292fe79f85fSMauro Carvalho Chehab    "unbalanced_struct_group_tagged_with_private": {
293fe79f85fSMauro Carvalho Chehab        "source": """
294fe79f85fSMauro Carvalho Chehab            struct page_pool_params {
295fe79f85fSMauro Carvalho Chehab                struct_group_tagged(page_pool_params_fast, fast,
296fe79f85fSMauro Carvalho Chehab                        unsigned int    order;
297fe79f85fSMauro Carvalho Chehab                        unsigned int    pool_size;
298fe79f85fSMauro Carvalho Chehab                        int             nid;
299fe79f85fSMauro Carvalho Chehab                        struct device   *dev;
300fe79f85fSMauro Carvalho Chehab                        struct napi_struct *napi;
301fe79f85fSMauro Carvalho Chehab                        enum dma_data_direction dma_dir;
302fe79f85fSMauro Carvalho Chehab                        unsigned int    max_len;
303fe79f85fSMauro Carvalho Chehab                        unsigned int    offset;
304fe79f85fSMauro Carvalho Chehab                };
305fe79f85fSMauro Carvalho Chehab                struct_group_tagged(page_pool_params_slow, slow,
306fe79f85fSMauro Carvalho Chehab                        struct net_device *netdev;
307fe79f85fSMauro Carvalho Chehab                        unsigned int queue_idx;
308fe79f85fSMauro Carvalho Chehab                        unsigned int    flags;
309fe79f85fSMauro Carvalho Chehab                        /* private: used by test code only */
310fe79f85fSMauro Carvalho Chehab                        void (*init_callback)(netmem_ref netmem, void *arg);
311fe79f85fSMauro Carvalho Chehab                        void *init_arg;
312fe79f85fSMauro Carvalho Chehab                };
313fe79f85fSMauro Carvalho Chehab            };
314fe79f85fSMauro Carvalho Chehab        """,
315fe79f85fSMauro Carvalho Chehab        "trimmed": """
316fe79f85fSMauro Carvalho Chehab            struct page_pool_params {
317fe79f85fSMauro Carvalho Chehab                struct_group_tagged(page_pool_params_fast, fast,
318fe79f85fSMauro Carvalho Chehab                        unsigned int    order;
319fe79f85fSMauro Carvalho Chehab                        unsigned int    pool_size;
320fe79f85fSMauro Carvalho Chehab                        int             nid;
321fe79f85fSMauro Carvalho Chehab                        struct device   *dev;
322fe79f85fSMauro Carvalho Chehab                        struct napi_struct *napi;
323fe79f85fSMauro Carvalho Chehab                        enum dma_data_direction dma_dir;
324fe79f85fSMauro Carvalho Chehab                        unsigned int    max_len;
325fe79f85fSMauro Carvalho Chehab                        unsigned int    offset;
326fe79f85fSMauro Carvalho Chehab                };
327fe79f85fSMauro Carvalho Chehab                struct_group_tagged(page_pool_params_slow, slow,
328fe79f85fSMauro Carvalho Chehab                        struct net_device *netdev;
329fe79f85fSMauro Carvalho Chehab                        unsigned int queue_idx;
330fe79f85fSMauro Carvalho Chehab                        unsigned int    flags;
331fe79f85fSMauro Carvalho Chehab                };
332fe79f85fSMauro Carvalho Chehab            };
333fe79f85fSMauro Carvalho Chehab        """,
334fe79f85fSMauro Carvalho Chehab    },
335fe79f85fSMauro Carvalho Chehab
336fe79f85fSMauro Carvalho Chehab    "unbalanced_two_struct_group_tagged_first_with_private": {
337fe79f85fSMauro Carvalho Chehab        "source": """
338fe79f85fSMauro Carvalho Chehab            struct page_pool_params {
339fe79f85fSMauro Carvalho Chehab                struct_group_tagged(page_pool_params_slow, slow,
340fe79f85fSMauro Carvalho Chehab                        struct net_device *netdev;
341fe79f85fSMauro Carvalho Chehab                        unsigned int queue_idx;
342fe79f85fSMauro Carvalho Chehab                        unsigned int    flags;
343fe79f85fSMauro Carvalho Chehab                        /* private: used by test code only */
344fe79f85fSMauro Carvalho Chehab                        void (*init_callback)(netmem_ref netmem, void *arg);
345fe79f85fSMauro Carvalho Chehab                        void *init_arg;
346fe79f85fSMauro Carvalho Chehab                };
347fe79f85fSMauro Carvalho Chehab                struct_group_tagged(page_pool_params_fast, fast,
348fe79f85fSMauro Carvalho Chehab                        unsigned int    order;
349fe79f85fSMauro Carvalho Chehab                        unsigned int    pool_size;
350fe79f85fSMauro Carvalho Chehab                        int             nid;
351fe79f85fSMauro Carvalho Chehab                        struct device   *dev;
352fe79f85fSMauro Carvalho Chehab                        struct napi_struct *napi;
353fe79f85fSMauro Carvalho Chehab                        enum dma_data_direction dma_dir;
354fe79f85fSMauro Carvalho Chehab                        unsigned int    max_len;
355fe79f85fSMauro Carvalho Chehab                        unsigned int    offset;
356fe79f85fSMauro Carvalho Chehab                };
357fe79f85fSMauro Carvalho Chehab            };
358fe79f85fSMauro Carvalho Chehab        """,
359fe79f85fSMauro Carvalho Chehab        "trimmed": """
360fe79f85fSMauro Carvalho Chehab            struct page_pool_params {
361fe79f85fSMauro Carvalho Chehab                struct_group_tagged(page_pool_params_slow, slow,
362fe79f85fSMauro Carvalho Chehab                        struct net_device *netdev;
363fe79f85fSMauro Carvalho Chehab                        unsigned int queue_idx;
364fe79f85fSMauro Carvalho Chehab                        unsigned int    flags;
365fe79f85fSMauro Carvalho Chehab                };
366fe79f85fSMauro Carvalho Chehab                struct_group_tagged(page_pool_params_fast, fast,
367fe79f85fSMauro Carvalho Chehab                        unsigned int    order;
368fe79f85fSMauro Carvalho Chehab                        unsigned int    pool_size;
369fe79f85fSMauro Carvalho Chehab                        int             nid;
370fe79f85fSMauro Carvalho Chehab                        struct device   *dev;
371fe79f85fSMauro Carvalho Chehab                        struct napi_struct *napi;
372fe79f85fSMauro Carvalho Chehab                        enum dma_data_direction dma_dir;
373fe79f85fSMauro Carvalho Chehab                        unsigned int    max_len;
374fe79f85fSMauro Carvalho Chehab                        unsigned int    offset;
375fe79f85fSMauro Carvalho Chehab                };
376fe79f85fSMauro Carvalho Chehab            };
377fe79f85fSMauro Carvalho Chehab        """,
378fe79f85fSMauro Carvalho Chehab    },
379fe79f85fSMauro Carvalho Chehab    "unbalanced_without_end_of_line": {
380fe79f85fSMauro Carvalho Chehab        "source": """ \
381fe79f85fSMauro Carvalho Chehab            struct page_pool_params { \
382fe79f85fSMauro Carvalho Chehab                struct_group_tagged(page_pool_params_slow, slow, \
383fe79f85fSMauro Carvalho Chehab                        struct net_device *netdev; \
384fe79f85fSMauro Carvalho Chehab                        unsigned int queue_idx; \
385fe79f85fSMauro Carvalho Chehab                        unsigned int    flags;
386fe79f85fSMauro Carvalho Chehab                        /* private: used by test code only */
387fe79f85fSMauro Carvalho Chehab                        void (*init_callback)(netmem_ref netmem, void *arg); \
388fe79f85fSMauro Carvalho Chehab                        void *init_arg; \
389fe79f85fSMauro Carvalho Chehab                }; \
390fe79f85fSMauro Carvalho Chehab                struct_group_tagged(page_pool_params_fast, fast, \
391fe79f85fSMauro Carvalho Chehab                        unsigned int    order; \
392fe79f85fSMauro Carvalho Chehab                        unsigned int    pool_size; \
393fe79f85fSMauro Carvalho Chehab                        int             nid; \
394fe79f85fSMauro Carvalho Chehab                        struct device   *dev; \
395fe79f85fSMauro Carvalho Chehab                        struct napi_struct *napi; \
396fe79f85fSMauro Carvalho Chehab                        enum dma_data_direction dma_dir; \
397fe79f85fSMauro Carvalho Chehab                        unsigned int    max_len; \
398fe79f85fSMauro Carvalho Chehab                        unsigned int    offset; \
399fe79f85fSMauro Carvalho Chehab                }; \
400fe79f85fSMauro Carvalho Chehab            };
401fe79f85fSMauro Carvalho Chehab        """,
402fe79f85fSMauro Carvalho Chehab        "trimmed": """
403fe79f85fSMauro Carvalho Chehab            struct page_pool_params {
404fe79f85fSMauro Carvalho Chehab                struct_group_tagged(page_pool_params_slow, slow,
405fe79f85fSMauro Carvalho Chehab                        struct net_device *netdev;
406fe79f85fSMauro Carvalho Chehab                        unsigned int queue_idx;
407fe79f85fSMauro Carvalho Chehab                        unsigned int    flags;
408fe79f85fSMauro Carvalho Chehab                };
409fe79f85fSMauro Carvalho Chehab                struct_group_tagged(page_pool_params_fast, fast,
410fe79f85fSMauro Carvalho Chehab                        unsigned int    order;
411fe79f85fSMauro Carvalho Chehab                        unsigned int    pool_size;
412fe79f85fSMauro Carvalho Chehab                        int             nid;
413fe79f85fSMauro Carvalho Chehab                        struct device   *dev;
414fe79f85fSMauro Carvalho Chehab                        struct napi_struct *napi;
415fe79f85fSMauro Carvalho Chehab                        enum dma_data_direction dma_dir;
416fe79f85fSMauro Carvalho Chehab                        unsigned int    max_len;
417fe79f85fSMauro Carvalho Chehab                        unsigned int    offset;
418fe79f85fSMauro Carvalho Chehab                };
419fe79f85fSMauro Carvalho Chehab            };
420fe79f85fSMauro Carvalho Chehab        """,
421fe79f85fSMauro Carvalho Chehab    },
422fe79f85fSMauro Carvalho Chehab}
423fe79f85fSMauro Carvalho Chehab
424fe79f85fSMauro Carvalho Chehab#: Dict containing all test groups fror CTokenizer
425fe79f85fSMauro Carvalho ChehabTESTS = {
426fe79f85fSMauro Carvalho Chehab    "TestPublicPrivate": TESTS_PRIVATE,
4275f6fc8edSMauro Carvalho Chehab    "TestTokenizer": TESTS_TOKENIZER,
428fe79f85fSMauro Carvalho Chehab}
429fe79f85fSMauro Carvalho Chehab
430fe79f85fSMauro Carvalho Chehabdef setUp(self):
431fe79f85fSMauro Carvalho Chehab    self.maxDiff = None
432fe79f85fSMauro Carvalho Chehab
433fe79f85fSMauro Carvalho Chehabdef build_test_class(group_name, table):
434fe79f85fSMauro Carvalho Chehab    """
435fe79f85fSMauro Carvalho Chehab    Dynamically creates a class instance using type() as a generator
436fe79f85fSMauro Carvalho Chehab    for a new class derivated from unittest.TestCase.
437fe79f85fSMauro Carvalho Chehab
438fe79f85fSMauro Carvalho Chehab    We're opting to do it inside a function to avoid the risk of
439fe79f85fSMauro Carvalho Chehab    changing the globals() dictionary.
440fe79f85fSMauro Carvalho Chehab    """
441fe79f85fSMauro Carvalho Chehab
442fe79f85fSMauro Carvalho Chehab    class_dict = {
443fe79f85fSMauro Carvalho Chehab        "setUp": setUp
444fe79f85fSMauro Carvalho Chehab    }
445fe79f85fSMauro Carvalho Chehab
446fe79f85fSMauro Carvalho Chehab    run = table["__run__"]
447fe79f85fSMauro Carvalho Chehab
448fe79f85fSMauro Carvalho Chehab    for test_name, data in table.items():
449fe79f85fSMauro Carvalho Chehab        if test_name == "__run__":
450fe79f85fSMauro Carvalho Chehab            continue
451fe79f85fSMauro Carvalho Chehab
452fe79f85fSMauro Carvalho Chehab        class_dict[f"test_{test_name}"] = run(test_name, data)
453fe79f85fSMauro Carvalho Chehab
454fe79f85fSMauro Carvalho Chehab    cls = type(group_name, (unittest.TestCase,), class_dict)
455fe79f85fSMauro Carvalho Chehab
456fe79f85fSMauro Carvalho Chehab    return cls.__name__, cls
457fe79f85fSMauro Carvalho Chehab
458fe79f85fSMauro Carvalho Chehab#
459fe79f85fSMauro Carvalho Chehab# Create classes and add them to the global dictionary
460fe79f85fSMauro Carvalho Chehab#
461fe79f85fSMauro Carvalho Chehabfor group, table in TESTS.items():
462fe79f85fSMauro Carvalho Chehab    t = build_test_class(group, table)
463fe79f85fSMauro Carvalho Chehab    globals()[t[0]] = t[1]
464fe79f85fSMauro Carvalho Chehab
465fe79f85fSMauro Carvalho Chehab#
466fe79f85fSMauro Carvalho Chehab# main
467fe79f85fSMauro Carvalho Chehab#
468fe79f85fSMauro Carvalho Chehabif __name__ == "__main__":
469fe79f85fSMauro Carvalho Chehab    run_unittest(__file__)
470