From 24f01eaba767b5e4b627474f64e048ce6cb7a236 Mon Sep 17 00:00:00 2001
From: Heesuk Jung <hsjung1305@gmail.com>
Date: Mon, 31 Mar 2014 22:00:01 +0900
Subject: [PATCH] Suggest AndroidTestUninstaller class The lava-android-test
 does not define formal AndroidTestUninstaller class yet. I suggest
 AndroidTestUninstaller class to set up general uninstall step incuding APK
 removing.

---
 lava_android_test/testdef.py | 44 +++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 43 insertions(+), 1 deletion(-)

diff --git a/lava_android_test/testdef.py b/lava_android_test/testdef.py
index 0cb97aa..195b20f 100644
--- a/lava_android_test/testdef.py
+++ b/lava_android_test/testdef.py
@@ -118,7 +118,7 @@ class AndroidTest(ITest):
         return self.adb
 
     def __init__(self, testname, version="", installer=None, runner=None,
-                 parser=None, default_options=None,
+                 parser=None, uninstaller=None, default_options=None,
                  org_ouput_file='stdout.log',
                  attachments=[]):
         self.testname = testname
@@ -126,6 +126,7 @@ class AndroidTest(ITest):
         self.installer = installer
         self.runner = runner
         self.parser = parser
+        self.uninstaller = uninstaller
         self.default_options = default_options
         self.org_ouput_file = org_ouput_file
         self.origdir = os.path.abspath(os.curdir)
@@ -194,6 +195,9 @@ class AndroidTest(ITest):
         if self.adb.exists(path):
             self.adb.rmtree(path)
 
+        if self.uninstaller is not None:
+            self.uninstaller.uninstall()
+
     def _add_install_options(self, bundle, config):
         optionfile = "%s/%s/install_options" % (config.installdir_android,
                                                 self.testname)
@@ -374,6 +378,44 @@ class AndroidTestInstaller(object):
         self.adb = adb
 
 
+class AndroidTestUninstaller(object):
+
+    adb = ADB()
+
+    """Base class for defining an uninstaller object.
+
+    This class can be used as-is for simple uninstallers, or extended for more
+    advanced funcionality.
+
+    steps_host - list of steps to be executed on host
+    steps_android - list of steps to be executed on android
+    """
+    def __init__(self, steps_host_pre=[], steps_adb_pre=[], pkgs=[],
+                 steps_adb_post=[], steps_host_post=[], **kwargs):
+        self.steps_host_pre = steps_host_pre
+        self.steps_adb_pre = steps_adb_pre
+        self.pkgs = pkgs
+        self.steps_adb_post = steps_adb_post
+        self.steps_host_post = steps_host_post
+
+    def _uninstallapk(self):
+        for pkg in self.pkgs:
+            rc = self.adb.uninstallapk(pkg)
+            if rc:
+                raise RuntimeError(
+                        "Failed to uninstall apk '%s' failed. %d" % (pkg, rc))
+
+    def uninstall(self):
+        _run_steps_host(self.steps_host_pre, self.adb.serial)
+        _run_steps_adb(self.steps_adb_pre, self.adb.serial)
+        self._uninstallapk()
+        _run_steps_adb(self.steps_adb_post, self.adb.serial)
+        _run_steps_host(self.steps_host_post, self.adb.serial)
+
+    def setadb(self, adb=None):
+        self.adb = adb
+
+
 class AndroidTestRunner(object):
 
     adb = ADB()
-- 
1.8.1.2

