xref: /linux/tools/unittests/test_tokenizer.py (revision 14b7775ef7471fbb9380048aabb3e96faa1e9123)
1c6c23449SMauro Carvalho Chehab#!/usr/bin/env python3
2c6c23449SMauro Carvalho Chehab
3c6c23449SMauro Carvalho Chehab"""
4c6c23449SMauro Carvalho ChehabUnit tests for struct/union member extractor class.
5c6c23449SMauro Carvalho Chehab"""
6c6c23449SMauro Carvalho Chehab
7c6c23449SMauro Carvalho Chehab
8c6c23449SMauro Carvalho Chehabimport os
9c6c23449SMauro Carvalho Chehabimport re
10c6c23449SMauro Carvalho Chehabimport unittest
11c6c23449SMauro Carvalho Chehabimport sys
12c6c23449SMauro Carvalho Chehab
13c6c23449SMauro Carvalho Chehabfrom unittest.mock import MagicMock
14c6c23449SMauro Carvalho Chehab
15c6c23449SMauro Carvalho ChehabSRC_DIR = os.path.dirname(os.path.realpath(__file__))
16c6c23449SMauro Carvalho Chehabsys.path.insert(0, os.path.join(SRC_DIR, "../lib/python"))
17c6c23449SMauro Carvalho Chehab
185f6fc8edSMauro Carvalho Chehabfrom kdoc.c_lex import CToken, CTokenizer
19c6c23449SMauro Carvalho Chehabfrom unittest_helper import run_unittest
20c6c23449SMauro Carvalho Chehab
21c6c23449SMauro Carvalho Chehab#
22c6c23449SMauro Carvalho Chehab# List of tests.
23c6c23449SMauro Carvalho Chehab#
24c6c23449SMauro Carvalho Chehab# The code will dynamically generate one test for each key on this dictionary.
25c6c23449SMauro 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}
137c6c23449SMauro 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
159c6c23449SMauro Carvalho Chehab#: Tests to check if CTokenizer is handling properly public/private comments.
160c6c23449SMauro Carvalho ChehabTESTS_PRIVATE = {
161c6c23449SMauro Carvalho Chehab    #
162c6c23449SMauro Carvalho Chehab    # Simplest case: no private. Ensure that trimming won't affect struct
163c6c23449SMauro Carvalho Chehab    #
164fe79f85fSMauro Carvalho Chehab    "__run__": make_private_test,
165c6c23449SMauro Carvalho Chehab    "no private": {
166c6c23449SMauro Carvalho Chehab        "source": """
167c6c23449SMauro Carvalho Chehab            struct foo {
168c6c23449SMauro Carvalho Chehab                int a;
169c6c23449SMauro Carvalho Chehab                int b;
170c6c23449SMauro Carvalho Chehab                int c;
171c6c23449SMauro Carvalho Chehab            };
172c6c23449SMauro Carvalho Chehab        """,
173c6c23449SMauro Carvalho Chehab        "trimmed": """
174c6c23449SMauro Carvalho Chehab            struct foo {
175c6c23449SMauro Carvalho Chehab                int a;
176c6c23449SMauro Carvalho Chehab                int b;
177c6c23449SMauro Carvalho Chehab                int c;
178c6c23449SMauro Carvalho Chehab            };
179c6c23449SMauro Carvalho Chehab        """,
180c6c23449SMauro Carvalho Chehab    },
181c6c23449SMauro Carvalho Chehab
182c6c23449SMauro Carvalho Chehab    #
183c6c23449SMauro Carvalho Chehab    # Play "by the books" by always having a public in place
184c6c23449SMauro Carvalho Chehab    #
185c6c23449SMauro Carvalho Chehab
186c6c23449SMauro Carvalho Chehab    "balanced_private": {
187c6c23449SMauro Carvalho Chehab        "source": """
188c6c23449SMauro Carvalho Chehab            struct foo {
189c6c23449SMauro Carvalho Chehab                int a;
190c6c23449SMauro Carvalho Chehab                /* private: */
191c6c23449SMauro Carvalho Chehab                int b;
192c6c23449SMauro Carvalho Chehab                /* public: */
193c6c23449SMauro Carvalho Chehab                int c;
194c6c23449SMauro Carvalho Chehab            };
195c6c23449SMauro Carvalho Chehab        """,
196c6c23449SMauro Carvalho Chehab        "trimmed": """
197c6c23449SMauro Carvalho Chehab            struct foo {
198c6c23449SMauro Carvalho Chehab                int a;
199c6c23449SMauro Carvalho Chehab                int c;
200c6c23449SMauro Carvalho Chehab            };
201c6c23449SMauro Carvalho Chehab        """,
202c6c23449SMauro Carvalho Chehab    },
203c6c23449SMauro Carvalho Chehab
204c6c23449SMauro Carvalho Chehab    "balanced_non_greddy_private": {
205c6c23449SMauro Carvalho Chehab        "source": """
206c6c23449SMauro Carvalho Chehab            struct foo {
207c6c23449SMauro Carvalho Chehab                int a;
208c6c23449SMauro Carvalho Chehab                /* private: */
209c6c23449SMauro Carvalho Chehab                int b;
210c6c23449SMauro Carvalho Chehab                /* public: */
211c6c23449SMauro Carvalho Chehab                int c;
212c6c23449SMauro Carvalho Chehab                /* private: */
213c6c23449SMauro Carvalho Chehab                int d;
214c6c23449SMauro Carvalho Chehab                /* public: */
215c6c23449SMauro Carvalho Chehab                int e;
216c6c23449SMauro Carvalho Chehab
217c6c23449SMauro Carvalho Chehab            };
218c6c23449SMauro Carvalho Chehab        """,
219c6c23449SMauro Carvalho Chehab        "trimmed": """
220c6c23449SMauro Carvalho Chehab            struct foo {
221c6c23449SMauro Carvalho Chehab                int a;
222c6c23449SMauro Carvalho Chehab                int c;
223c6c23449SMauro Carvalho Chehab                int e;
224c6c23449SMauro Carvalho Chehab            };
225c6c23449SMauro Carvalho Chehab        """,
226c6c23449SMauro Carvalho Chehab    },
227c6c23449SMauro Carvalho Chehab
228c6c23449SMauro Carvalho Chehab    "balanced_inner_private": {
229c6c23449SMauro Carvalho Chehab        "source": """
230c6c23449SMauro Carvalho Chehab            struct foo {
231c6c23449SMauro Carvalho Chehab                struct {
232c6c23449SMauro Carvalho Chehab                    int a;
233c6c23449SMauro Carvalho Chehab                    /* private: ignore below */
234c6c23449SMauro Carvalho Chehab                    int b;
235c6c23449SMauro Carvalho Chehab                /* public: but this should not be ignored */
236c6c23449SMauro Carvalho Chehab                };
237c6c23449SMauro Carvalho Chehab                int b;
238c6c23449SMauro Carvalho Chehab            };
239c6c23449SMauro Carvalho Chehab        """,
240c6c23449SMauro Carvalho Chehab        "trimmed": """
241c6c23449SMauro Carvalho Chehab            struct foo {
242c6c23449SMauro Carvalho Chehab                struct {
243c6c23449SMauro Carvalho Chehab                    int a;
244c6c23449SMauro Carvalho Chehab                };
245c6c23449SMauro Carvalho Chehab                int b;
246c6c23449SMauro Carvalho Chehab            };
247c6c23449SMauro Carvalho Chehab        """,
248c6c23449SMauro Carvalho Chehab    },
249c6c23449SMauro Carvalho Chehab
250c6c23449SMauro Carvalho Chehab    #
251c6c23449SMauro Carvalho Chehab    # Test what happens if there's no public after private place
252c6c23449SMauro Carvalho Chehab    #
253c6c23449SMauro Carvalho Chehab
254c6c23449SMauro Carvalho Chehab    "unbalanced_private": {
255c6c23449SMauro Carvalho Chehab        "source": """
256c6c23449SMauro Carvalho Chehab            struct foo {
257c6c23449SMauro Carvalho Chehab                int a;
258c6c23449SMauro Carvalho Chehab                /* private: */
259c6c23449SMauro Carvalho Chehab                int b;
260c6c23449SMauro Carvalho Chehab                int c;
261c6c23449SMauro Carvalho Chehab            };
262c6c23449SMauro Carvalho Chehab        """,
263c6c23449SMauro Carvalho Chehab        "trimmed": """
264c6c23449SMauro Carvalho Chehab            struct foo {
265c6c23449SMauro Carvalho Chehab                int a;
266c6c23449SMauro Carvalho Chehab            };
267c6c23449SMauro Carvalho Chehab        """,
268c6c23449SMauro Carvalho Chehab    },
269c6c23449SMauro Carvalho Chehab
270c6c23449SMauro Carvalho Chehab    "unbalanced_inner_private": {
271c6c23449SMauro Carvalho Chehab        "source": """
272c6c23449SMauro Carvalho Chehab            struct foo {
273c6c23449SMauro Carvalho Chehab                struct {
274c6c23449SMauro Carvalho Chehab                    int a;
275c6c23449SMauro Carvalho Chehab                    /* private: ignore below */
276c6c23449SMauro Carvalho Chehab                    int b;
277c6c23449SMauro Carvalho Chehab                /* but this should not be ignored */
278c6c23449SMauro Carvalho Chehab                };
279c6c23449SMauro Carvalho Chehab                int b;
280c6c23449SMauro Carvalho Chehab            };
281c6c23449SMauro Carvalho Chehab        """,
282c6c23449SMauro Carvalho Chehab        "trimmed": """
283c6c23449SMauro Carvalho Chehab            struct foo {
284c6c23449SMauro Carvalho Chehab                struct {
285c6c23449SMauro Carvalho Chehab                    int a;
286c6c23449SMauro Carvalho Chehab                };
287c6c23449SMauro Carvalho Chehab                int b;
288c6c23449SMauro Carvalho Chehab            };
289c6c23449SMauro Carvalho Chehab        """,
290c6c23449SMauro Carvalho Chehab    },
291c6c23449SMauro Carvalho Chehab
292c6c23449SMauro Carvalho Chehab    "unbalanced_struct_group_tagged_with_private": {
293c6c23449SMauro Carvalho Chehab        "source": """
294c6c23449SMauro Carvalho Chehab            struct page_pool_params {
295c6c23449SMauro Carvalho Chehab                struct_group_tagged(page_pool_params_fast, fast,
296c6c23449SMauro Carvalho Chehab                        unsigned int    order;
297c6c23449SMauro Carvalho Chehab                        unsigned int    pool_size;
298c6c23449SMauro Carvalho Chehab                        int             nid;
299c6c23449SMauro Carvalho Chehab                        struct device   *dev;
300c6c23449SMauro Carvalho Chehab                        struct napi_struct *napi;
301c6c23449SMauro Carvalho Chehab                        enum dma_data_direction dma_dir;
302c6c23449SMauro Carvalho Chehab                        unsigned int    max_len;
303c6c23449SMauro Carvalho Chehab                        unsigned int    offset;
304c6c23449SMauro Carvalho Chehab                };
305c6c23449SMauro Carvalho Chehab                struct_group_tagged(page_pool_params_slow, slow,
306c6c23449SMauro Carvalho Chehab                        struct net_device *netdev;
307c6c23449SMauro Carvalho Chehab                        unsigned int queue_idx;
308c6c23449SMauro Carvalho Chehab                        unsigned int    flags;
309c6c23449SMauro Carvalho Chehab                        /* private: used by test code only */
310c6c23449SMauro Carvalho Chehab                        void (*init_callback)(netmem_ref netmem, void *arg);
311c6c23449SMauro Carvalho Chehab                        void *init_arg;
312c6c23449SMauro Carvalho Chehab                };
313c6c23449SMauro Carvalho Chehab            };
314c6c23449SMauro Carvalho Chehab        """,
315c6c23449SMauro Carvalho Chehab        "trimmed": """
316c6c23449SMauro Carvalho Chehab            struct page_pool_params {
317c6c23449SMauro Carvalho Chehab                struct_group_tagged(page_pool_params_fast, fast,
318c6c23449SMauro Carvalho Chehab                        unsigned int    order;
319c6c23449SMauro Carvalho Chehab                        unsigned int    pool_size;
320c6c23449SMauro Carvalho Chehab                        int             nid;
321c6c23449SMauro Carvalho Chehab                        struct device   *dev;
322c6c23449SMauro Carvalho Chehab                        struct napi_struct *napi;
323c6c23449SMauro Carvalho Chehab                        enum dma_data_direction dma_dir;
324c6c23449SMauro Carvalho Chehab                        unsigned int    max_len;
325c6c23449SMauro Carvalho Chehab                        unsigned int    offset;
326c6c23449SMauro Carvalho Chehab                };
327c6c23449SMauro Carvalho Chehab                struct_group_tagged(page_pool_params_slow, slow,
328c6c23449SMauro Carvalho Chehab                        struct net_device *netdev;
329c6c23449SMauro Carvalho Chehab                        unsigned int queue_idx;
330c6c23449SMauro Carvalho Chehab                        unsigned int    flags;
331c6c23449SMauro Carvalho Chehab                };
332c6c23449SMauro Carvalho Chehab            };
333c6c23449SMauro Carvalho Chehab        """,
334c6c23449SMauro Carvalho Chehab    },
335c6c23449SMauro Carvalho Chehab
336c6c23449SMauro Carvalho Chehab    "unbalanced_two_struct_group_tagged_first_with_private": {
337c6c23449SMauro Carvalho Chehab        "source": """
338c6c23449SMauro Carvalho Chehab            struct page_pool_params {
339c6c23449SMauro Carvalho Chehab                struct_group_tagged(page_pool_params_slow, slow,
340c6c23449SMauro Carvalho Chehab                        struct net_device *netdev;
341c6c23449SMauro Carvalho Chehab                        unsigned int queue_idx;
342c6c23449SMauro Carvalho Chehab                        unsigned int    flags;
343c6c23449SMauro Carvalho Chehab                        /* private: used by test code only */
344c6c23449SMauro Carvalho Chehab                        void (*init_callback)(netmem_ref netmem, void *arg);
345c6c23449SMauro Carvalho Chehab                        void *init_arg;
346c6c23449SMauro Carvalho Chehab                };
347c6c23449SMauro Carvalho Chehab                struct_group_tagged(page_pool_params_fast, fast,
348c6c23449SMauro Carvalho Chehab                        unsigned int    order;
349c6c23449SMauro Carvalho Chehab                        unsigned int    pool_size;
350c6c23449SMauro Carvalho Chehab                        int             nid;
351c6c23449SMauro Carvalho Chehab                        struct device   *dev;
352c6c23449SMauro Carvalho Chehab                        struct napi_struct *napi;
353c6c23449SMauro Carvalho Chehab                        enum dma_data_direction dma_dir;
354c6c23449SMauro Carvalho Chehab                        unsigned int    max_len;
355c6c23449SMauro Carvalho Chehab                        unsigned int    offset;
356c6c23449SMauro Carvalho Chehab                };
357c6c23449SMauro Carvalho Chehab            };
358c6c23449SMauro Carvalho Chehab        """,
359c6c23449SMauro Carvalho Chehab        "trimmed": """
360c6c23449SMauro Carvalho Chehab            struct page_pool_params {
361c6c23449SMauro Carvalho Chehab                struct_group_tagged(page_pool_params_slow, slow,
362c6c23449SMauro Carvalho Chehab                        struct net_device *netdev;
363c6c23449SMauro Carvalho Chehab                        unsigned int queue_idx;
364c6c23449SMauro Carvalho Chehab                        unsigned int    flags;
365c6c23449SMauro Carvalho Chehab                };
366c6c23449SMauro Carvalho Chehab                struct_group_tagged(page_pool_params_fast, fast,
367c6c23449SMauro Carvalho Chehab                        unsigned int    order;
368c6c23449SMauro Carvalho Chehab                        unsigned int    pool_size;
369c6c23449SMauro Carvalho Chehab                        int             nid;
370c6c23449SMauro Carvalho Chehab                        struct device   *dev;
371c6c23449SMauro Carvalho Chehab                        struct napi_struct *napi;
372c6c23449SMauro Carvalho Chehab                        enum dma_data_direction dma_dir;
373c6c23449SMauro Carvalho Chehab                        unsigned int    max_len;
374c6c23449SMauro Carvalho Chehab                        unsigned int    offset;
375c6c23449SMauro Carvalho Chehab                };
376c6c23449SMauro Carvalho Chehab            };
377c6c23449SMauro Carvalho Chehab        """,
378c6c23449SMauro Carvalho Chehab    },
379c6c23449SMauro Carvalho Chehab    "unbalanced_without_end_of_line": {
380c6c23449SMauro Carvalho Chehab        "source": """ \
381c6c23449SMauro Carvalho Chehab            struct page_pool_params { \
382c6c23449SMauro Carvalho Chehab                struct_group_tagged(page_pool_params_slow, slow, \
383c6c23449SMauro Carvalho Chehab                        struct net_device *netdev; \
384c6c23449SMauro Carvalho Chehab                        unsigned int queue_idx; \
385c6c23449SMauro Carvalho Chehab                        unsigned int    flags;
386c6c23449SMauro Carvalho Chehab                        /* private: used by test code only */
387c6c23449SMauro Carvalho Chehab                        void (*init_callback)(netmem_ref netmem, void *arg); \
388c6c23449SMauro Carvalho Chehab                        void *init_arg; \
389c6c23449SMauro Carvalho Chehab                }; \
390c6c23449SMauro Carvalho Chehab                struct_group_tagged(page_pool_params_fast, fast, \
391c6c23449SMauro Carvalho Chehab                        unsigned int    order; \
392c6c23449SMauro Carvalho Chehab                        unsigned int    pool_size; \
393c6c23449SMauro Carvalho Chehab                        int             nid; \
394c6c23449SMauro Carvalho Chehab                        struct device   *dev; \
395c6c23449SMauro Carvalho Chehab                        struct napi_struct *napi; \
396c6c23449SMauro Carvalho Chehab                        enum dma_data_direction dma_dir; \
397c6c23449SMauro Carvalho Chehab                        unsigned int    max_len; \
398c6c23449SMauro Carvalho Chehab                        unsigned int    offset; \
399c6c23449SMauro Carvalho Chehab                }; \
400c6c23449SMauro Carvalho Chehab            };
401c6c23449SMauro Carvalho Chehab        """,
402c6c23449SMauro Carvalho Chehab        "trimmed": """
403c6c23449SMauro Carvalho Chehab            struct page_pool_params {
404c6c23449SMauro Carvalho Chehab                struct_group_tagged(page_pool_params_slow, slow,
405c6c23449SMauro Carvalho Chehab                        struct net_device *netdev;
406c6c23449SMauro Carvalho Chehab                        unsigned int queue_idx;
407c6c23449SMauro Carvalho Chehab                        unsigned int    flags;
408c6c23449SMauro Carvalho Chehab                };
409c6c23449SMauro Carvalho Chehab                struct_group_tagged(page_pool_params_fast, fast,
410c6c23449SMauro Carvalho Chehab                        unsigned int    order;
411c6c23449SMauro Carvalho Chehab                        unsigned int    pool_size;
412c6c23449SMauro Carvalho Chehab                        int             nid;
413c6c23449SMauro Carvalho Chehab                        struct device   *dev;
414c6c23449SMauro Carvalho Chehab                        struct napi_struct *napi;
415c6c23449SMauro Carvalho Chehab                        enum dma_data_direction dma_dir;
416c6c23449SMauro Carvalho Chehab                        unsigned int    max_len;
417c6c23449SMauro Carvalho Chehab                        unsigned int    offset;
418c6c23449SMauro Carvalho Chehab                };
419c6c23449SMauro Carvalho Chehab            };
420c6c23449SMauro Carvalho Chehab        """,
421c6c23449SMauro Carvalho Chehab    },
422c6c23449SMauro Carvalho Chehab}
423c6c23449SMauro 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}
429c6c23449SMauro Carvalho Chehab
430c6c23449SMauro Carvalho Chehabdef setUp(self):
431c6c23449SMauro Carvalho Chehab    self.maxDiff = None
432c6c23449SMauro Carvalho Chehab
433fe79f85fSMauro Carvalho Chehabdef build_test_class(group_name, table):
434c6c23449SMauro 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.
440c6c23449SMauro Carvalho Chehab    """
441c6c23449SMauro Carvalho Chehab
442fe79f85fSMauro Carvalho Chehab    class_dict = {
443fe79f85fSMauro Carvalho Chehab        "setUp": setUp
444fe79f85fSMauro Carvalho Chehab    }
445c6c23449SMauro Carvalho Chehab
446fe79f85fSMauro Carvalho Chehab    run = table["__run__"]
447c6c23449SMauro Carvalho Chehab
448fe79f85fSMauro Carvalho Chehab    for test_name, data in table.items():
449fe79f85fSMauro Carvalho Chehab        if test_name == "__run__":
450fe79f85fSMauro Carvalho Chehab            continue
451c6c23449SMauro Carvalho Chehab
452fe79f85fSMauro Carvalho Chehab        class_dict[f"test_{test_name}"] = run(test_name, data)
453c6c23449SMauro Carvalho Chehab
454fe79f85fSMauro Carvalho Chehab    cls = type(group_name, (unittest.TestCase,), class_dict)
455c6c23449SMauro Carvalho Chehab
456fe79f85fSMauro Carvalho Chehab    return cls.__name__, cls
457c6c23449SMauro Carvalho Chehab
458c6c23449SMauro Carvalho Chehab#
459fe79f85fSMauro Carvalho Chehab# Create classes and add them to the global dictionary
460c6c23449SMauro 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]
464c6c23449SMauro Carvalho Chehab
465c6c23449SMauro Carvalho Chehab#
466c6c23449SMauro Carvalho Chehab# main
467c6c23449SMauro Carvalho Chehab#
468c6c23449SMauro Carvalho Chehabif __name__ == "__main__":
469c6c23449SMauro Carvalho Chehab    run_unittest(__file__)
470