[OE-core] [PATCH] utils/decorators.py: TestNeedsBin, decorator for sending binaries to images
Costin Constantin
costin.c.constantin at intel.com
Fri Aug 28 16:12:18 UTC 2015
TestNeedsBin is a decorator to help deploy binaries to the running image.
It uses no package management system.
It gets it's source binaries from the rpm built packages found under
DEPLOY_DIR_RPM. As mandatory arguments, it requires only the binary
name. The binary is sent by default to the DUT's "/usr/bin" dir, making
it available in system PATH. Like this, a test should only call the desired
binary name without any path.
Left to do:
- implement support for binaries versioning
- accept any source path to a given binaries directory
- add a tag
- add support for exported tests that will run on remote testing env.
without presence of poky
related to [Yocto #7850]
Signed-off-by: Costin Constantin <costin.c.constantin at intel.com>
---
meta/lib/oeqa/utils/decorators.py | 73 +++++++++++++++++++++++++++++++++++++--
1 file changed, 71 insertions(+), 2 deletions(-)
diff --git a/meta/lib/oeqa/utils/decorators.py b/meta/lib/oeqa/utils/decorators.py
index b9fc76c..a999018 100644
--- a/meta/lib/oeqa/utils/decorators.py
+++ b/meta/lib/oeqa/utils/decorators.py
@@ -6,13 +6,15 @@
# Most useful is skipUnlessPassed which can be used for
# creating dependecies between two test methods.
-import os
+import os,re
import logging
import sys
import unittest
import threading
import signal
from functools import wraps
+import subprocess as s
+
#get the "result" object from one of the upper frames provided that one of these upper frames is a unittest.case frame
class getResults(object):
@@ -185,4 +187,71 @@ def timeout(seconds):
return wrapped_f
else:
return fn
- return decorator
\ No newline at end of file
+ return decorator
+
+# this part for the bin <---> test binding
+from difflib import SequenceMatcher as SM
+def get_dest_folder(tune_features, folder_list):
+ features_list = tune_features.split(" ")
+ features_list.reverse()
+ features_list = "_".join(features_list)
+ match_rate = 0
+ best_match = None
+ for folder in folder_list:
+ if SM(None, folder, features_list).ratio() > match_rate:
+ match_rate = SM(None, folder, features_list).ratio()
+ best_match = folder
+ return best_match
+
+
+
+class TestNeedsBin(object):
+
+ def __init__(self, bin_name, bin_ver=None, source_dir=None, dest_dir="/usr/bin", TAG=None):
+ try:
+ import bb
+ self.under_bitbake_env = True
+ except:
+ self.under_bitbake_env = False
+ self.bin_name = bin_name
+ self.bin_ver = bin_ver
+ self.source_dir = source_dir
+ self.dest_dir = dest_dir
+ self.TAG = TAG
+
+ def transfer_bin(self):
+ from oeqa.oetest import oeRuntimeTest
+ if self.under_bitbake_env:
+ if not self.source_dir:
+ arch_dir = get_dest_folder(oeRuntimeTest.tc.d.getVar("TUNE_FEATURES", True), os.listdir(oeRuntimeTest.tc.d.getVar("DEPLOY_DIR_RPM", True)))
+ self.source_dir = os.path.join(oeRuntimeTest.tc.d.getVar("DEPLOY_DIR_RPM", True), arch_dir)
+ if not arch_dir:
+ bb.warn("cannot find source dir")
+ for file in os.listdir(self.source_dir):
+ if re.match("%s-[0-9].*rpm" % self.bin_name, file):
+ rpm_name = file
+ local_binary = s.check_output("rpm -qlp %s" % os.path.join(self.source_dir, rpm_name), shell=True).split("\n")[-2]
+ if local_binary[0] == r'/':
+ local_binary = local_binary[1:]
+ if os.path.isfile(os.path.join(self.source_dir, rpm_name)):
+ command = "/usr/bin/rpm2cpio %s | cpio -idm" % os.path.join(self.source_dir, rpm_name)
+ s.check_output(command, shell=True)
+ else:
+ bb.warn("Cannot find package file to extract!")
+ if os.path.isfile(local_binary):
+ (status, output) = oeRuntimeTest.tc.target.copy_to(local_binary, self.dest_dir)
+ else:
+ bb.warn("Cannot find binary file!")
+ if status != 0:
+ bb.warn("Error at copying binary!")
+
+ else: #when decorator is on the remote machine
+ #this part will serve when tests are present on remote machine
+ pass
+
+ def __call__(self, func):
+ def wrapped_f(*args):
+ self.transfer_bin()
+ return func(*args)
+ wrapped_f.__name__ = func.__name__
+ return wrapped_f
--
2.1.4
More information about the Openembedded-core
mailing list