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