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