mirror of
				https://git.proxmox.com/git/libgit2
				synced 2025-10-31 16:19:17 +00:00 
			
		
		
		
	 681008c768
			
		
	
	
		681008c768
		
	
	
	
	
		
			
			The clay script didn't match the latest version from upstream. Additionaly, add core/strtol.c to complete porting the core tests to clay. Signed-off-by: schu <schu-github@schulog.org>
		
			
				
	
	
		
			203 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			203 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
| #!/usr/bin/env python
 | |
| 
 | |
| from __future__ import with_statement
 | |
| from string import Template
 | |
| import re, fnmatch, os
 | |
| 
 | |
| VERSION = "0.8.0"
 | |
| 
 | |
| TEST_FUNC_REGEX = r"^(void\s+(test_%s__(\w+))\(\s*(void)?\s*\))\s*\{"
 | |
| 
 | |
| CLAY_HEADER = """
 | |
| /*
 | |
|  * Clay v0.7.0
 | |
|  *
 | |
|  * This is an autogenerated file. Do not modify.
 | |
|  * To add new unit tests or suites, regenerate the whole
 | |
|  * file with `./clay`
 | |
|  */
 | |
| """
 | |
| 
 | |
| TEMPLATE_SUITE = Template(
 | |
| r"""
 | |
|     {
 | |
|         "${clean_name}",
 | |
|         ${initialize},
 | |
|         ${cleanup},
 | |
|         ${cb_ptr}, ${cb_count}
 | |
|     }
 | |
| """)
 | |
| 
 | |
| def main():
 | |
|     from optparse import OptionParser
 | |
| 
 | |
|     parser = OptionParser()
 | |
| 
 | |
|     parser.add_option('-c', '--clay-path', dest='clay_path')
 | |
|     parser.add_option('-v', '--report-to', dest='print_mode', default='stdout')
 | |
| 
 | |
|     options, args = parser.parse_args()
 | |
| 
 | |
|     for folder in args:
 | |
|         builder = ClayTestBuilder(folder,
 | |
|             clay_path = options.clay_path,
 | |
|             print_mode = options.print_mode)
 | |
| 
 | |
|         builder.render()
 | |
| 
 | |
| 
 | |
| class ClayTestBuilder:
 | |
|     def __init__(self, path, clay_path = None, print_mode = 'stdout'):
 | |
|         self.declarations = []
 | |
|         self.callbacks = []
 | |
|         self.suites = []
 | |
|         self.suite_list = []
 | |
| 
 | |
|         self.clay_path = os.path.abspath(clay_path) if clay_path else None
 | |
|         self.print_mode = print_mode
 | |
| 
 | |
|         self.path = os.path.abspath(path)
 | |
|         self.modules = ["clay_sandbox.c", "clay_fixtures.c", "clay_fs.c"]
 | |
| 
 | |
|         print("Loading test suites...")
 | |
| 
 | |
|         for root, dirs, files in os.walk(self.path):
 | |
|             module_root = root[len(self.path):]
 | |
|             module_root = [c for c in module_root.split(os.sep) if c]
 | |
| 
 | |
|             tests_in_module = fnmatch.filter(files, "*.c")
 | |
|             tests_in_module.sort()
 | |
| 
 | |
|             for test_file in tests_in_module:
 | |
|                 full_path = os.path.join(root, test_file)
 | |
|                 test_name = "_".join(module_root + [test_file[:-2]])
 | |
| 
 | |
|                 with open(full_path) as f:
 | |
|                     self._process_test_file(test_name, f.read())
 | |
| 
 | |
|         if not self.suites:
 | |
|             raise RuntimeError(
 | |
|                 'No tests found under "%s"' % folder_name)
 | |
| 
 | |
|     def render(self):
 | |
|         main_file = os.path.join(self.path, 'clay_main.c')
 | |
|         with open(main_file, "w") as out:
 | |
|             template = Template(self._load_file('clay.c'))
 | |
| 
 | |
|             output = template.substitute(
 | |
|                 clay_print = self._get_print_method(),
 | |
|                 clay_modules = self._get_modules(),
 | |
| 
 | |
|                 suites_str = ", ".join(self.suite_list),
 | |
| 
 | |
|                 test_callbacks = ",\n\t".join(self.callbacks),
 | |
|                 cb_count = len(self.callbacks),
 | |
| 
 | |
|                 test_suites = ",\n\t".join(self.suites),
 | |
|                 suite_count = len(self.suites),
 | |
|             )
 | |
| 
 | |
|             out.write(output)
 | |
| 
 | |
|         header_file = os.path.join(self.path, 'clay.h')
 | |
|         with open(header_file, "w") as out:
 | |
|             template = Template(self._load_file('clay.h'))
 | |
| 
 | |
|             output = template.substitute(
 | |
|                 extern_declarations = "\n".join(self.declarations),
 | |
|             )
 | |
| 
 | |
|             out.write(output)
 | |
| 
 | |
|         print ('Written Clay suite to "%s"' % self.path)
 | |
| 
 | |
|     #####################################################
 | |
|     # Internal methods
 | |
|     #####################################################
 | |
|     def _get_print_method(self):
 | |
|         return {
 | |
|                 'stdout' : 'printf(__VA_ARGS__)',
 | |
|                 'stderr' : 'fprintf(stderr, __VA_ARGS__)',
 | |
|                 'silent' : ''
 | |
|         }[self.print_mode]
 | |
| 
 | |
|     def _load_file(self, filename):
 | |
|         if self.clay_path:
 | |
|             filename = os.path.join(self.clay_path, filename)
 | |
|             with open(filename) as cfile:
 | |
|                 return cfile.read()
 | |
| 
 | |
|         else:
 | |
|             import zlib, base64, sys
 | |
|             content = CLAY_FILES[filename]
 | |
| 
 | |
|             if sys.version_info >= (3, 0):
 | |
|                 content = bytearray(content, 'utf_8')
 | |
|                 content = base64.b64decode(content)
 | |
|                 content = zlib.decompress(content)
 | |
|                 return str(content)
 | |
|             else:
 | |
|                 content = base64.b64decode(content)
 | |
|                 return zlib.decompress(content)
 | |
| 
 | |
|     def _get_modules(self):
 | |
|         return "\n".join(self._load_file(f) for f in self.modules)
 | |
| 
 | |
|     def _parse_comment(self, comment):
 | |
|         comment = comment[2:-2]
 | |
|         comment = comment.splitlines()
 | |
|         comment = [line.strip() for line in comment]
 | |
|         comment = "\n".join(comment)
 | |
| 
 | |
|         return comment
 | |
| 
 | |
|     def _process_test_file(self, test_name, contents):
 | |
|         regex_string = TEST_FUNC_REGEX % test_name
 | |
|         regex = re.compile(regex_string, re.MULTILINE)
 | |
| 
 | |
|         callbacks = []
 | |
|         initialize = cleanup = "{NULL, NULL, 0}"
 | |
| 
 | |
|         for (declaration, symbol, short_name, _) in regex.findall(contents):
 | |
|             self.declarations.append("extern %s;" % declaration)
 | |
|             func_ptr = '{"%s", &%s, %d}' % (
 | |
|                 short_name, symbol, len(self.suites)
 | |
|             )
 | |
| 
 | |
|             if short_name == 'initialize':
 | |
|                 initialize = func_ptr
 | |
|             elif short_name == 'cleanup':
 | |
|                 cleanup = func_ptr
 | |
|             else:
 | |
|                 callbacks.append(func_ptr)
 | |
| 
 | |
|         if not callbacks:
 | |
|             return
 | |
| 
 | |
|         clean_name = test_name.replace("_", "::")
 | |
| 
 | |
|         suite = TEMPLATE_SUITE.substitute(
 | |
|             clean_name = clean_name,
 | |
|             initialize = initialize,
 | |
|             cleanup = cleanup,
 | |
|             cb_ptr = "&_all_callbacks[%d]" % len(self.callbacks),
 | |
|             cb_count = len(callbacks)
 | |
|         ).strip()
 | |
| 
 | |
|         self.callbacks += callbacks
 | |
|         self.suites.append(suite)
 | |
|         self.suite_list.append(clean_name)
 | |
| 
 | |
|         print("  %s (%d tests)" % (clean_name, len(callbacks)))
 | |
| 
 | |
| 
 | |
| CLAY_FILES = {
 | |
| "clay.c" : r"""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""",
 | |
| "clay_sandbox.c" : r"""eJyNVV1P20AQfLZ/xRIkYpNATItaVSkPlaBVVEoiEgQSRJaxz+SEfY7uLmkD4r931+fEHwRahBST3Zudmb0xSgeahxDOAgl+mAQrfx7o2e2x9+XTtG/bypS50DZX/jJIeOTrdJ43OWEmlDZH9+kL1362rfHk28SfgNJ42uIxOAThULkLe0q7sHMCnmtblmR6IQV4676dsT8Ynw4u8cCh0n6aRcxt9hXPThCGTKkC9dof/nThhGD79kuNc8xFlW/O9H4Rx0x2QfEn5mtImHgw1Hd5LCIWg389uPj4wbYKHKOy6F4G0g+zhdBwAsf9Ro/BZ2KJRkl1O8UeNMRqTX6NUFerC/SUf5yZz6vx2eXocvh9cH7WssF6QYlgFZM46Y0zCQ5HHK8PHL6W4/vQ6XA3h2/MxuYHpvHB2RDhUzTGMibjl2QqndJcLBhNySuv10utZgTKlCKcr5y1d1jqrp0j6MqSLOvFxl/b6u3DIAY9Y9TNZSZShrZFGVOijX4GKwjESs+4eOiClivQGSwUgx7Oh/2e/QapFtVbBa8mLVOsMasQQ1K7LFHMQP9gesLS+YhAndPr4eWpa451wcA1Lt8uExGPja7JjCtQK6VZuhGU8EeGAmpaSHy4kDIXziULdYbFd8Qdvqns8D1Z6z8PjqoBWGY8gjzSC6ECEd1nfxz6Lo8pEajk3ZtSgNp3XrtUjVcDI1FNRDhDFcgSaVYMiZUv0wpYM4XoJ08iv6BglG54VG4vFXwd8CRPTivHI2tu8p8WpW0T2fVLox7wkoOJdxZXabkYoOqbh9yyLQTDaeg3PtRFNNU/A65eZDLFpT2xnC4tejQcD24Ak/o7kBGoJFAzpvIlV6JsvYoyiShD3NwHL/Zxl+/DsholaPfam6htFtHAIGUHcDSlNy72m0H1eqdTgtE9Wl+7sgs6xLRbLmebszgGm7ZYRozSR4zJ3Ff/3E7jH4NZj0Gga1c97n32vK0HKgHHUzS4xhM9vbg6P391qDCwTFX9AucI/x8h2Nvbdue33z9CMbmqEt3qRY3eX120XBI=""",
 | |
| "clay_fixtures.c" : r"""eJyFUV1LwzAUfW5+xZU9rLUVJ4ggZQ9DFAUfRCZMRglZmrBAl5Qkk03xv9v0a82U+Zabc+45595rLLGCAlXSWKBrouEccbGzW81wSew6HCIrYljicTuqJBsWoS8UmFbPobXA8npye5OlFSI+GbaglbK4YDJFKOjeMAVjdfUInUPkyFZLWu7DWiKBxtgpKN78RZETEByactlLXcBVBmdTGF+OIxQEPhrHGdRQ1zzMv5xUYN84ROLY8b1MEPeTJEdsV3tRq0wdt06tWcWVzXpS9I3QSPCccbh7nr3jh6fF/O31Hr/M5o9ouGpa4NYlPHmBVt074i/lBLy+OsWHEjkcXLAhMl+p3Wk3bjBV1VIG6TxOApgWZN8s4k8bWjAit+W/NnoTejMddI+GqW1GTOaCox8pOffr""",
 | |
| "clay_fs.c" : r"""eJylVdtu20YQfSa/YkAD8TKWY8dJX6L0wXDEVqgsBhINN7UFhiGX1qIkl9hd+dLG/57ZCynJUWEkfZE0s7NnZufMGe2xsqAlpJfj6ZsT399DgzUUojhKo8npb3Mg+ud8PBlNE/hq/NP4LJ5G49n5aTKOp71zNJvFs4vx06DzPz6MZ6HvS5UplkO+zAS89EtWUd7KtM3UkuS8kcqdGE/o/+t71tYm/ArTi8lk6HuS/UNTBRVtbtRyAGzo+x4rgaQ2zMaFvucJqlaicdd8z15AHKkE/rbxIQI6+DqrKp4TF3YAJ2GH/AxwTeu8fTBRA0jtl0Xp0K+sucAsx9suzPPauX2v5AIIMxYweO9AhnBwwELAbvTFXLGFrmf/aF+X4/Uu2L++3scEjwjmitRnQ/+x7/0tZ0XXecIaBTUv6AC22i/5SuRPnQWVynAy/z3CSYg/zpPZxVkCJQLp4m2YvYqVbJHrEHU7bJgG+y7IZNBQf1HBz2nNxQN5oeEHoDnnJdlOHYa2aa18dRetmlxziI8ZOl8bCV5ruk3u3ptw9OlUnaeMquxGorOfd/OcKs2kpEKlBFuMibHUuKUCm8gbW1aoOTge4HFwyZqC30l4EgdlhmYR+J4tVVBK1q0wpnv0U4JkKmqygxTDQEdfFKcfRpNRMsKx6zgzM7oLL+c4oz9A80aSs/jjp40U6bpmA46t0vgVzZpVS7TLApg3lOwe55A6ivMqe3AKCV4GoQXZo5WkXbk4kr5c0qpK+UoRW5SrMBM3t1cLg60HV19YSS0nVuA+wE/dY/zSg8XF32StX/S9h2OrobIVeLskUhVUCM2eF8wfpKI1oM3FO/hsb3+GHDeCo/DVdRNozjx6zxQ5fB06lXXwehIsPr2n+S0xtR4vBqboLvguYwqD9YUBvLD1D/DesFfr5ejPcTJPTpOLObHn/4PLnkprmpJ+WQy3pbpeqNZOcenovvVCxm1ZIK0bEl4Hrpdpf2pbYs2rjchDs+f6nfVfAXYRuu6hGRx9Yc1R3gZD5zVBweGsd5wsNjVuXG+0y81O6KRuDt4u+r8Ro/B6JRWOo5RG5OuxM6QZYUeGfVAcdM9B6b3lRlpqr8ya4gu/363wZ0W9oekNjt4udvVA1N/1oNxuQvfiHc342TdbTYNa0u2XPiN9I/NV464Qs/e1a8PxiLJvClb63wD3Q6FA""",
 | |
| "clay.h" : r"""eJy9Vctu2zAQPEdfsbV6sAQhTq9pGsAIbMSAERStg7YngqZWEVGZVEmqcVH030NSfkm2qqYHn0wtOTuzu0M65JlIMQNC7ubjb2Qx+bwg94QEoQ1ygUfxIOSCFVWKcKNNWvDlZX4bBD8lT4EV9BchVGtUZhhccGGASZFyw6VIggu71jaSUwVxxgtM6iOFZWntolJStWIpaqZ4ucnlgDqXVZESupTKRO93GohGQ1iBVFTl0MeG8eYzqr/jKIF6IUv6o0IL3mIz3YC6tCHPXH98F6azr4vHTxPycby4Dw7VOShfm0rhsFmmjxFBVw2WTVhTkS7l+jWQrbq/QEK0Pc+CYBTHAcQw9vOwbYMVZUpqeOYmB1yXBWfcgO81rFBr+oT2/Gg3ecu6qrQhpZ0oGVqASsBNIWoO2u9EcPsBrhLrlulsPiHEreazB78aTCvBvABGiwIyamefXsMAwn3OBN5FR8TuZD/xTSfvZF0iM5hC1hBgpNfQo6Am6ad/01235Ve2r46YaxDSgFEVnuLdzuouR/b9P+bEHO5Mg7qKjpnPPKlTEs4wqKuo51IJ+Y/XaSOpecPqYAIPj/P56cvQgtVd74Rtyt9hto5uArqt11fN3nR7jkMjdgrbe6YN7KnIH2pjOuqZSsWcoWxG+zaOnqkSXDy1a/AiTnimyykLtK9ufTEuB6cfjg3Ta7J+qSGQVsr9GEeCa2SVc9j14IT/vI4VmlymdtOSKOrOal/f29+4NqgEOdz5E2z/GF4ABeagMA=="""
 | |
| }
 | |
| if __name__ == '__main__':
 | |
|     main()
 |