enb,ue,process: move stdout counter helper to process objects

this patch adds the stdout counter to count events happening
on the stdout (known from the UE already) to the common
process class so they can also be used from the eNB (and other objects)

In addition, we add a PRACH counter to be used for tests.

Change-Id: I434f072b8aa6f4dce9f90889c6b40832f6798ff8
diff --git a/src/osmo_gsm_tester/core/process.py b/src/osmo_gsm_tester/core/process.py
index bac258a..e305c64 100644
--- a/src/osmo_gsm_tester/core/process.py
+++ b/src/osmo_gsm_tester/core/process.py
@@ -164,6 +164,15 @@
         self.outputs[name] = (path, f)
         return f
 
+    def get_counter_stdout(self, keyword):
+        # Match stdout against keyword
+        n = 0
+        stdout_lines = (self.get_stdout() or '').splitlines()
+        for l in stdout_lines:
+            if keyword in l:
+                n += 1
+        return n
+
     def launch(self):
         preexec_fn = None
         log.dbg('cd %r; %s %s' % (
diff --git a/src/osmo_gsm_tester/obj/enb.py b/src/osmo_gsm_tester/obj/enb.py
index 3944459..d2e48a6 100644
--- a/src/osmo_gsm_tester/obj/enb.py
+++ b/src/osmo_gsm_tester/obj/enb.py
@@ -346,4 +346,8 @@
     def addr(self):
         return self._run_node.run_addr()
 
+    @abstractmethod
+    def get_counter(self, counter_name):
+        pass
+
 # vim: expandtab tabstop=4 shiftwidth=4
diff --git a/src/osmo_gsm_tester/obj/enb_amarisoft.py b/src/osmo_gsm_tester/obj/enb_amarisoft.py
index ef28100..60985f4 100644
--- a/src/osmo_gsm_tester/obj/enb_amarisoft.py
+++ b/src/osmo_gsm_tester/obj/enb_amarisoft.py
@@ -247,6 +247,11 @@
     def running(self):
         return not self.process.terminated()
 
+    def get_counter(self, counter_name):
+        if counter_name == 'prach_received':
+            return self.process.get_counter_stdout('PRACH:')
+        raise log.Error('counter %s not implemented!' % counter_name)
+
     def get_rfemu(self, cell=0, dl=True):
         cell_list = self.gen_conf['enb'].get('cell_list', None)
         if cell_list is None or len(cell_list) < cell + 1:
diff --git a/src/osmo_gsm_tester/obj/enb_srs.py b/src/osmo_gsm_tester/obj/enb_srs.py
index 6afc873..bf988eb 100644
--- a/src/osmo_gsm_tester/obj/enb_srs.py
+++ b/src/osmo_gsm_tester/obj/enb_srs.py
@@ -258,6 +258,11 @@
     def running(self):
         return not self.process.terminated()
 
+    def get_counter(self, counter_name):
+        if counter_name == 'prach_received':
+            return self.process.get_counter_stdout('RACH:')
+        raise log.Error('counter %s not implemented!' % counter_name)
+
     def get_rfemu(self, cell=0, dl=True):
         cell_list = self.gen_conf['enb'].get('cell_list', None)
         if cell_list is None or len(cell_list) < cell + 1:
diff --git a/src/osmo_gsm_tester/obj/ms_srs.py b/src/osmo_gsm_tester/obj/ms_srs.py
index 610d3e6..2f19f3f 100644
--- a/src/osmo_gsm_tester/obj/ms_srs.py
+++ b/src/osmo_gsm_tester/obj/ms_srs.py
@@ -382,30 +382,21 @@
         proc.launch_sync()
         return proc
 
-    def _get_counter_stdout(self, keyword):
-        # Match stdout against keyword
-        n = 0
-        stdout_lines = (self.process.get_stdout() or '').splitlines()
-        for l in stdout_lines:
-            if keyword in l:
-                n += 1
-        return n
-
     def get_counter(self, counter_name):
         if counter_name == 'handover_success':
-            return self._get_counter_stdout('HO successful')
+            return self.process.get_counter_stdout('HO successful')
         if counter_name == 'prach_sent':
-            return self._get_counter_stdout('Random Access Transmission')
+            return self.process.get_counter_stdout('Random Access Transmission')
         if counter_name == 'paging_received':
-            return self._get_counter_stdout('S-TMSI match in paging message')
+            return self.process.get_counter_stdout('S-TMSI match in paging message')
         if counter_name == 'reestablishment_attempts':
-            return self._get_counter_stdout('RRC Connection Reestablishment')
+            return self.process.get_counter_stdout('RRC Connection Reestablishment')
         if counter_name == 'reestablishment_ok':
-            return self._get_counter_stdout('Reestablishment OK')
+            return self.process.get_counter_stdout('Reestablishment OK')
         if counter_name == 'rrc_connected_transitions':
-            return self._get_counter_stdout('RRC Connected')
+            return self.process.get_counter_stdout('RRC Connected')
         if counter_name == 'rrc_idle_transitions':
-            return self._get_counter_stdout('RRC IDLE')
+            return self.process.get_counter_stdout('RRC IDLE')
         raise log.Error('counter %s not implemented!' % counter_name)
 
     def verify_metric(self, value, operation='avg', metric='dl_brate', criterion='gt', window=1):
diff --git a/src/osmo_gsm_tester/obj/srslte_common.py b/src/osmo_gsm_tester/obj/srslte_common.py
index e221940..1d03a58 100644
--- a/src/osmo_gsm_tester/obj/srslte_common.py
+++ b/src/osmo_gsm_tester/obj/srslte_common.py
@@ -97,4 +97,4 @@
             return analyzer.get_num_phy_errors(kpi)
         except ImportError:
             self.log("Can't load KPI analyzer module.")
-            return 0
\ No newline at end of file
+            return 0