Integration test for the build.md file

Change-Id: I93d25f1563636696a5f71471a06056eafee3e9e2
diff --git a/tests/itests/docutests/test_utils.py b/tests/itests/docutests/test_utils.py
new file mode 100644
index 0000000..a0b2422
--- /dev/null
+++ b/tests/itests/docutests/test_utils.py
@@ -0,0 +1,120 @@
+#
+# Copyright 2016 the original author or authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+import os
+import subprocess
+import socket
+import time
+import re
+
+
+def run_command_to_completion_with_raw_stdout(cmd):
+    try:
+        env = os.environ.copy()
+        proc = subprocess.Popen(
+            cmd,
+            env=env,
+            shell=True,
+            stdout=subprocess.PIPE
+        )
+        out, err = proc.communicate()
+        return out, err, proc.returncode
+    except OSError as e:
+        print 'Exception {} when running command:{}'.format(repr(e), cmd)
+    return None
+
+
+def run_command_to_completion_with_stdout_in_list(cmd):
+    stdout_response = []
+    try:
+        command = cmd
+        env = os.environ.copy()
+        proc = subprocess.Popen(
+            command,
+            env=env,
+            shell=True,
+            stdout=subprocess.PIPE,
+            stderr=subprocess.PIPE,
+            bufsize=1
+        )
+        with proc.stdout:
+            for line in iter(proc.stdout.readline, b''):
+                stdout_response.append(line)
+
+        if proc.wait() != 0:
+            err_msg = 'Command {} did not complete successfully '.format(cmd)
+            return [], err_msg, proc.returncode
+
+        return stdout_response, None, proc.returncode
+    except OSError as e:
+        print 'Exception {} when running command:{}'.format(repr(e), cmd)
+    return None
+
+
+def run_long_running_command_with_timeout(cmd, timeout,
+                                          return_word_number_x_of_each_line=-1):
+    captured_stdout = []
+    try:
+        t0 = time.time()
+        env = os.environ.copy()
+        proc = subprocess.Popen(
+            cmd,
+            env=env,
+            shell=True,
+            stdout=subprocess.PIPE,
+            stderr=subprocess.PIPE,
+            bufsize=1
+        )
+        for line in iter(proc.stdout.readline, b''):
+            if return_word_number_x_of_each_line != -1:
+                ansi_escape = re.compile(r'\x1b[^m]*m')
+                line = ansi_escape.sub('', line)
+                captured_stdout.append(
+                    line.split()[return_word_number_x_of_each_line])
+            else:
+                captured_stdout.append(line)
+            if time.time() - t0 > timeout:
+                try:
+                    proc.terminate()
+                    proc.wait()
+                    # In principle this 'reset' should not be required.
+                    # However, without it, the terminal is left in a funny
+                    # state and required
+                    subprocess.Popen(['reset']).wait()
+                except Exception as e:
+                    print "Received exception {} when killing process " \
+                          "started with {}".format(repr(e), cmd)
+                break
+        return captured_stdout
+    except Exception as e:
+        print 'Exception {} when running command:{}'.format(repr(e), cmd)
+    return None
+
+def is_open(ip_port):
+    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+    try:
+        items = ip_port.split(':')
+        s.connect((items[0], int(items[1])))
+        s.shutdown(2)
+        return True
+    except:
+        return False
+
+def is_valid_ip(ip):
+    try:
+        socket.inet_aton(ip)
+        return True
+    except socket.error:
+        return False