sanitycheck: refactor add_goal
refactor all add_goal routines in to one single function that can handle
multiple platforms. Move everything to one single add_goal function.
Signed-off-by: Anas Nashif <anas.nashif@intel.com>
diff --git a/scripts/sanitycheck b/scripts/sanitycheck
index 7bc01d3..51a2f71 100755
--- a/scripts/sanitycheck
+++ b/scripts/sanitycheck
@@ -302,6 +302,7 @@
"""
self.lock = threading.Lock()
self.state = "waiting"
+ self.run = False
self.metrics = {}
self.metrics["handler_time"] = 0
self.metrics["ram_size"] = 0
@@ -618,6 +619,7 @@
super().__init__(instance)
self.results = {}
+ self.run = True
# We pass this to QEMU which looks for fifos with .in and .out
# suffixes.
@@ -946,18 +948,9 @@
def _get_rule_footer(self, name):
return MakeGenerator.GOAL_FOOTER_TMPL.format(goal=name)
- def _add_goal(self, outdir):
- if not os.path.exists(outdir):
- os.makedirs(outdir)
-
- def add_instance_build_goal(self, instance, args, buildlog, make_args=""):
-
- self.add_build_goal(instance.name, instance.test.code_location,
- instance.outdir, args, buildlog, make_args)
-
def add_build_goal(self, name, directory, outdir,
args, buildlog, make_args=""):
- """Add a goal to invoke a Kbuild session
+ """Add a goal to invoke a build session
@param name A unique string name for this build goal. The results
dictionary returned by execute() will be keyed by this name.
@@ -968,46 +961,28 @@
@param args Extra command line arguments to pass to 'cmake', typically
environment variables or specific Make goals
"""
- self._add_goal(outdir)
- build_logfile = os.path.join(outdir, buildlog)
- text = (
- self._get_rule_header(name) +
- self._get_sub_make(
- name,
- "building",
- directory,
- outdir,
- build_logfile,
- args,
- make_args=make_args) +
- self._get_rule_footer(name))
- self.goals[name] = MakeGoal(
- name,
- text,
- None,
- self.logfile,
- build_logfile,
- None,
- None)
- def add_qemu_goal(self, instance, args):
- """Add a goal to build a Zephyr project and then run it under QEMU
+ if not os.path.exists(outdir):
+ os.makedirs(outdir)
+
+ build_logfile = os.path.join(outdir, buildlog)
+ text = self._get_rule_header(name)
+ text += self._get_sub_make(name, "building", directory, outdir, build_logfile,
+ args, make_args=make_args)
+ text += self._get_rule_footer(name)
+
+ self.goals[name] = MakeGoal( name, text, None, self.logfile, build_logfile, None, None)
+
+ def add_goal(self, instance, type, args, make_args=""):
+ """Add a goal to build a Zephyr project and then run it using a handler
The generated make goal invokes Make twice, the first time it will
build the default goal, and the second will invoke the 'qemu' goal.
- The output of the QEMU session will be monitored, and terminated
+ The output of the handler session will be monitored, and terminated
either upon pass/fail result of the test program, or the timeout
is reached.
- @param name A unique string name for this build goal. The results
- dictionary returned by execute() will be keyed by this name.
- @param directory Absolute path to working directory, will be passed
- to make -C
- @param outdir Absolute path to output directory, will be passed to
- Kbuild via -O=<path>
@param args Extra cache entries to define in CMake.
- @param timeout Maximum length of time QEMU session should be allowed
- to run before automatically killing it. Default is 30 seconds.
"""
name = instance.name
@@ -1017,88 +992,42 @@
build_logfile = os.path.join(outdir, "build.log")
run_logfile = os.path.join(outdir, "run.log")
handler_logfile = os.path.join(outdir, "handler.log")
- self._add_goal(outdir)
- qemu_handler = QEMUHandler(instance)
- args.append("QEMU_PIPE=%s" % qemu_handler.get_fifo())
- text = (self._get_rule_header(name) +
- self._get_sub_make(name, "building", directory,
- outdir, build_logfile, args) +
- self._get_sub_make(name, "running", directory,
- outdir, run_logfile,
- args, make_args="run") +
- self._get_rule_footer(name))
- self.goals[name] = MakeGoal(name, text, qemu_handler, self.logfile, build_logfile,
- run_logfile, handler_logfile)
+ if not os.path.exists(outdir):
+ os.makedirs(outdir)
- def add_unit_goal(self, instance, args, timeout=30):
- outdir = instance.outdir
- timeout = instance.test.timeout
- name = instance.name
- directory = instance.test.code_location
+ handler = None
+ if type == "qemu":
+ handler = QEMUHandler(instance)
+ elif type == "native":
+ handler = NativeHandler(instance)
+ elif type == "unit":
+ handler = UnitHandler(instance)
+ elif type == "device":
+ handler = DeviceHandler(instance)
- self._add_goal(outdir)
- build_logfile = os.path.join(outdir, "build.log")
- run_logfile = os.path.join(outdir, "run.log")
- handler_logfile = os.path.join(outdir, "handler.log")
if options.enable_coverage:
args += ["COVERAGE=1", "EXTRA_LDFLAGS=--coverage"]
-
- # we handle running in the UnitHandler class
- text = (self._get_rule_header(name) +
- self._get_sub_make(name, "building", directory,
- outdir, build_logfile, args) +
- self._get_rule_footer(name))
- unit_handler = UnitHandler(instance)
- self.goals[name] = MakeGoal(name, text, unit_handler, self.logfile, build_logfile,
- run_logfile, handler_logfile)
-
- def add_native_goal(self, instance, args):
-
- outdir = instance.outdir
- timeout = instance.test.timeout
- name = instance.name
- directory = instance.test.code_location
-
- self._add_goal(outdir)
- build_logfile = os.path.join(outdir, "build.log")
- run_logfile = os.path.join(outdir, "run.log")
- handler_logfile = os.path.join(outdir, "handler.log")
-
- if options.enable_coverage:
args += ["CONFIG_COVERAGE=y"]
- # we handle running in the NativeHandler class
+ if type == 'qemu':
+ args.append("QEMU_PIPE=%s" % handler.get_fifo())
+
text = (self._get_rule_header(name) +
self._get_sub_make(name, "building", directory,
- outdir, build_logfile, args) +
- self._get_rule_footer(name))
- native_handler = NativeHandler(instance)
- self.goals[name] = MakeGoal(name, text, native_handler, self.logfile, build_logfile,
- run_logfile, handler_logfile)
+ outdir, build_logfile, args, make_args=make_args))
+ if handler and handler.run:
+ text += self._get_sub_make(name, "running", directory,
+ outdir, run_logfile,
+ args, make_args="run")
- def add_device_goal(self, instance, args):
+ text += self._get_rule_footer(name)
- outdir = instance.outdir
- timeout = instance.test.timeout
- name = instance.name
- directory = instance.test.code_location
-
- self._add_goal(outdir)
- build_logfile = os.path.join(outdir, "build.log")
- run_logfile = os.path.join(outdir, "run.log")
- handler_logfile = os.path.join(outdir, "handler.log")
-
- # we handle running in the NativeHandler class
- text = (self._get_rule_header(name) +
- self._get_sub_make(name, "building", directory,
- outdir, build_logfile, args) +
- self._get_rule_footer(name))
- handler = DeviceHandler(instance)
self.goals[name] = MakeGoal(name, text, handler, self.logfile, build_logfile,
run_logfile, handler_logfile)
+
def add_test_instance(self, ti, extra_args=[]):
"""Add a goal to build/test a TestInstance object
@@ -1117,20 +1046,21 @@
do_build_only = ti.build_only or options.build_only
do_run = (not do_build_only) and do_run_slow
+ # FIXME: Need refactoring and cleanup
+ type = None
if ti.platform.qemu_support and do_run:
- self.add_qemu_goal(ti, args)
+ type = "qemu"
elif ti.test.type == "unit":
- self.add_unit_goal(ti, args)
+ type = "unit"
elif ti.platform.type == "native" and do_run:
- self.add_native_goal(ti, args)
+ type = "native"
elif options.device_testing and (not ti.build_only) and (not options.build_only):
- self.add_device_goal(ti, args)
+ type = "device"
- else:
- self.add_instance_build_goal(ti, args, "build.log")
+ self.add_goal(ti, type, args)
def execute(self, callback_fn=None, context=None):
"""Execute all the registered build goals
@@ -1885,14 +1815,10 @@
args.append("CONFIG_COVERAGE=y")
o = os.path.join(self.outdir, plat.name, tc.path)
- dlist[tc, plat, tc.name.split(
- "/")[-1]] = os.path.join(o, "zephyr", ".config")
- goal = "_".join([plat.name, "_".join(
- tc.name.split("/")), "config-sanitycheck"])
- mg.add_build_goal(goal,
- os.path.join(ZEPHYR_BASE, tc.code_location),
- o, args,
- "config-sanitycheck.log", make_args="config-sanitycheck")
+ dlist[tc, plat, tc.name.split("/")[-1]] = os.path.join(o, "zephyr", ".config")
+ goal = "_".join([plat.name, "_".join(tc.name.split("/")), "config-sanitycheck"])
+ mg.add_build_goal(goal, os.path.join(ZEPHYR_BASE, tc.code_location),
+ o, args, "config-sanitycheck.log", make_args="config-sanitycheck")
info("Building testcase defconfigs...")
results = mg.execute(defconfig_cb)