tox: base test command and positional arguments
[deliverable/lttng-ivc.git] / lttng_ivc / utils / utils.py
index 1660aba1383469d0f6d289aeab431dc87ceedea0..d7592c637869f93fd074546de3ce97b0b1186b4f 100644 (file)
@@ -1,3 +1,23 @@
+# Copyright (c) 2017 Jonathan Rajotte-Julien <jonathan.rajotte-julien@efficios.com>
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in all
+# copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
 import signal
 import hashlib
 import os
@@ -47,15 +67,56 @@ def __dummy_sigusr1_handler():
     pass
 
 
-def sessiond_spawn(runtime):
+def sessiond_spawn(runtime, opt_args=""):
     agent_port = find_free_port()
     previous_handler = signal.signal(signal.SIGUSR1, __dummy_sigusr1_handler)
-    sessiond = runtime.spawn_subprocess("lttng-sessiond -vvv -S --agent-tcp-port {}".format(agent_port))
+    cmd = "lttng-sessiond -vvv --verbose-consumer -S --agent-tcp-port {}".format(agent_port)
+    cmd = " ".join([cmd, opt_args])
+    sessiond = runtime.spawn_subprocess(cmd)
     signal.sigtimedwait({signal.SIGUSR1}, 60)
     previous_handler = signal.signal(signal.SIGUSR1, previous_handler)
     return sessiond
 
 
+def relayd_spawn(runtime, url="localhost"):
+    """
+    Return a tuple (relayd_uuid, ctrl_port, data_port, live_port)
+    """
+    ports = find_multiple_free_port(3)
+    data_port = ports.pop()
+    ctrl_port = ports.pop()
+    live_port = ports.pop()
+
+    base_cmd = "lttng-relayd -vvv"
+    data_string = "-D tcp://{}:{}".format(url, data_port)
+    ctrl_string = "-C tcp://{}:{}".format(url, ctrl_port)
+    live_string = "-L tcp://{}:{}".format(url, live_port)
+
+    cmd = " ".join([base_cmd, data_string, ctrl_string, live_string])
+    relayd = runtime.spawn_subprocess(cmd)
+
+    # Synchronization based on verbosity since no -S is available for
+    # lttng-relayd yet.
+    log_path = runtime.get_subprocess_stderr_path(relayd)
+
+    # TODO: Move to settings.
+    ready_cue = "Listener accepting live viewers connections"
+    # TODO: Move to settings.
+    timeout = 60
+    ready = False
+    for i in range(timeout):
+        if file_contains(log_path, ready_cue):
+            ready = True
+            break
+        time.sleep(1)
+
+    if not ready:
+        # Cleanup is performed by runtime
+        raise Exception("Relayd readyness timeout expired")
+
+    return (relayd, ctrl_port, data_port, live_port)
+
+
 def find_free_port():
     # There is no guarantee that the port will be free at runtime but should be
     # good enough
@@ -64,6 +125,20 @@ def find_free_port():
         return s.getsockname()[1]
 
 
+def find_multiple_free_port(number):
+    """
+    Return a list of supposedly free port
+    """
+    assert(number >= 0)
+    ports = []
+    while(len(ports) != number):
+        port = find_free_port()
+        if port in ports:
+            continue
+        ports.append(port)
+    return ports
+
+
 def file_contains(file_path, list_of_string):
     with open(file_path, 'r') as f:
         for line in f:
@@ -88,14 +163,11 @@ def find_file(root, name):
     """
     Returns the absolute path or None.
     """
-    print(root)
-    print(name)
     abs_path = None
     for base, dirs, files in os.walk(root):
         for tmp in files:
             if tmp.endswith(name):
                 abs_path = os.path.abspath(os.path.join(base, tmp))
-    print(abs_path)
     return abs_path
 
 
This page took 0.02626 seconds and 5 git commands to generate.