#!/usr/bin/python import os import sys import re import random import idl def randomize_char(c): if random.random() < 0.5: return str.lower(c) else: return str.upper(c) def randomize_case(s): r = [randomize_char(c) for c in s] return "".join(r) def randomize_enum(e): return random.choice([v.name for v in e.values]) handcoded = ["libxl_bitmap", "libxl_key_value_list", "libxl_cpuid_policy_list", "libxl_string_list"] def gen_rand_init(ty, v, indent = " ", parent = None): s = "" if isinstance(ty, idl.Enumeration): s += "%s = %s;\n" % (ty.pass_arg(v, parent is None), randomize_enum(ty)) elif isinstance(ty, idl.Array): if parent is None: raise Exception("Array type must have a parent") s += "%s = rand()%%8;\n" % (parent + ty.lenvar.name) s += "%s = calloc(%s, sizeof(*%s));\n" % \ (v, parent + ty.lenvar.name, v) s += "{\n" s += " int i;\n" s += " for (i=0; i<%s; i++)\n" % (parent + ty.lenvar.name) s += gen_rand_init(ty.elem_type, v+"[i]", indent + " ", parent) s += "}\n" elif isinstance(ty, idl.KeyedUnion): if parent is None: raise Exception("KeyedUnion type must have a parent") s += "switch (%s) {\n" % (parent + ty.keyvar.name) for f in ty.fields: (nparent,fexpr) = ty.member(v, f, parent is None) s += "case %s:\n" % f.enumname s += gen_rand_init(f.type, fexpr, indent + " ", nparent) s += " break;\n" s += "}\n" elif isinstance(ty, idl.Struct) \ and (parent is None or ty.json_fn is None): for f in [f for f in ty.fields if not f.const]: (nparent,fexpr) = ty.member(v, f, parent is None) s += gen_rand_init(f.type, fexpr, "", nparent) elif hasattr(ty, "rand_init") and ty.rand_init is not None: s += "%s(%s);\n" % (ty.rand_init, ty.pass_arg(v, isref=parent is None, passby=idl.PASS_BY_REFERENCE)) elif ty.typename in ["libxl_uuid", "libxl_mac", "libxl_hwcap"]: s += "rand_bytes((uint8_t *)%s, sizeof(*%s));\n" % (v,v) elif ty.typename in ["libxl_domid", "libxl_devid"] or isinstance(ty, idl.Number): s += "%s = rand() %% (sizeof(%s)*8);\n" % \ (ty.pass_arg(v, parent is None), ty.pass_arg(v, parent is None)) elif ty.typename in ["bool"]: s += "%s = rand() %% 2;\n" % v elif ty.typename in ["libxl_defbool"]: s += "libxl_defbool_set(%s, !!rand() %% 1);\n" % v elif ty.typename in ["char *"]: s += "%s = rand_str();\n" % v elif ty.private: pass elif ty.typename in handcoded: raise Exception("Gen for handcoded %s" % ty.typename) else: raise Exception("Cannot randomly init %s" % ty.typename) if s != "": s = indent + s return s.replace("\n", "\n%s" % indent).rstrip(indent) if __name__ == '__main__': if len(sys.argv) < 3: print >>sys.stderr, "Usage: gentest.py " sys.exit(1) random.seed(os.getenv('LIBXL_TESTIDL_SEED')) (builtins,types) = idl.parse(sys.argv[1]) impl = sys.argv[2] f = open(impl, "w") f.write(""" #include #include #include #include "libxl.h" #include "libxl_utils.h" static char *rand_str(void) { int i, sz = rand() % 32; char *s = malloc(sz+1); for (i=0; isize = rand() % 16; bitmap->map = calloc(bitmap->size, sizeof(*bitmap->map)); libxl_for_each_bit(i, *bitmap) { if (rand() % 2) libxl_bitmap_set(bitmap, i); else libxl_bitmap_reset(bitmap, i); } } static void libxl_key_value_list_rand_init(libxl_key_value_list *pkvl) { int i, nr_kvp = rand() % 16; libxl_key_value_list kvl = calloc(nr_kvp+1, 2*sizeof(char *)); for (i = 0; i<2*nr_kvp; i += 2) { kvl[i] = rand_str(); if (rand() % 8) kvl[i+1] = rand_str(); else kvl[i+1] = NULL; } kvl[i] = NULL; kvl[i+1] = NULL; *pkvl = kvl; } static void libxl_cpuid_policy_list_rand_init(libxl_cpuid_policy_list *pp) { int i, nr_policies = rand() % 16; struct { const char *n; int w; } options[] = { /* A random selection from libxl_cpuid_parse_config */ {"maxleaf", 32}, {"family", 8}, {"model", 8}, {"stepping", 4}, {"localapicid", 8}, {"proccount", 8}, {"clflush", 8}, {"brandid", 8}, {"f16c", 1}, {"avx", 1}, {"osxsave", 1}, {"xsave", 1}, {"aes", 1}, {"popcnt", 1}, {"movbe", 1}, {"x2apic", 1}, {"sse4.2", 1}, {"sse4.1", 1}, {"dca", 1}, {"pdcm", 1}, {"procpkg", 6}, }; const int nr_options = sizeof(options)/sizeof(options[0]); char buf[64]; libxl_cpuid_policy_list p = NULL; for (i = 0; i < nr_policies; i++) { int opt = rand() % nr_options; int val = rand() % (1<