Merge "sql: add buildset.branch column"
diff --git a/tests/unit/test_scheduler.py b/tests/unit/test_scheduler.py
index c833fa2..b640e33 100755
--- a/tests/unit/test_scheduler.py
+++ b/tests/unit/test_scheduler.py
@@ -3577,6 +3577,56 @@
         self.assertEqual(len(self.history), 0)
         self.assertEqual(len(self.builds), 0)
 
+    def test_client_enqueue_ref_negative(self):
+        "Test that the RPC client returns errors"
+        client = zuul.rpcclient.RPCClient('127.0.0.1',
+                                          self.gearman_server.port)
+        self.addCleanup(client.shutdown)
+        with testtools.ExpectedException(zuul.rpcclient.RPCFailure,
+                                         "New rev must be 40 character sha1"):
+            r = client.enqueue_ref(
+                tenant='tenant-one',
+                pipeline='post',
+                project='org/project',
+                trigger='gerrit',
+                ref='master',
+                oldrev='90f173846e3af9154517b88543ffbd1691f31366',
+                newrev='10054041')
+            self.assertEqual(r, False)
+        with testtools.ExpectedException(zuul.rpcclient.RPCFailure,
+                                         "Old rev must be 40 character sha1"):
+            r = client.enqueue_ref(
+                tenant='tenant-one',
+                pipeline='post',
+                project='org/project',
+                trigger='gerrit',
+                ref='master',
+                oldrev='10054041',
+                newrev='90f173846e3af9154517b88543ffbd1691f31366')
+            self.assertEqual(r, False)
+        with testtools.ExpectedException(zuul.rpcclient.RPCFailure,
+                                         "New rev must be base16 hash"):
+            r = client.enqueue_ref(
+                tenant='tenant-one',
+                pipeline='post',
+                project='org/project',
+                trigger='gerrit',
+                ref='master',
+                oldrev='90f173846e3af9154517b88543ffbd1691f31366',
+                newrev='notbase16')
+            self.assertEqual(r, False)
+        with testtools.ExpectedException(zuul.rpcclient.RPCFailure,
+                                         "Old rev must be base16 hash"):
+            r = client.enqueue_ref(
+                tenant='tenant-one',
+                pipeline='post',
+                project='org/project',
+                trigger='gerrit',
+                ref='master',
+                oldrev='notbase16',
+                newrev='90f173846e3af9154517b88543ffbd1691f31366')
+            self.assertEqual(r, False)
+
     def test_client_promote(self):
         "Test that the RPC client can promote a change"
         self.executor_server.hold_jobs_in_build = True
diff --git a/tools/test-logs.sh b/tools/test-logs.sh
old mode 100644
new mode 100755
index a514dd8..429bac5
--- a/tools/test-logs.sh
+++ b/tools/test-logs.sh
@@ -15,10 +15,25 @@
 # limitations under the License.
 
 ZUUL_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )/.." && pwd )"
-ARA_DIR=$(dirname $(python3 -c 'import ara ; print(ara.__file__)'))
-WORK_DIR=$PWD/test-logs-output
+# Initialize tox environment if it's not set up
+if [[ ! -d "${ZUUL_DIR}/.tox/venv" ]]; then
+    pushd $ZUUL_DIR
+        echo "Virtualenv doesn't exist... creating."
+        tox -e venv --notest
+    popd
+fi
+# Source tox environment
+source ${ZUUL_DIR}/.tox/venv/bin/activate
 
-mkdir -p $WORK_DIR
+# Install ARA if it's not installed (not in requirements.txt by default)
+python -c "import ara" &> /dev/null
+if [ $? -eq 1 ]; then
+    echo "ARA isn't installed... Installing it."
+    pip install ara
+fi
+ARA_DIR=$(dirname $(python3 -c 'import ara; print(ara.__file__)'))
+
+WORK_DIR=$(mktemp -d /tmp/zuul_logs_XXXX)
 
 if [ -z $1 ] ; then
     INVENTORY=$WORK_DIR/hosts.yaml
@@ -26,11 +41,11 @@
 all:
   hosts:
     controller:
-      ansible_host: localhost
+      ansible_connection: local
     node1:
-      ansible_host: localhost
+      ansible_connection: local
     node2:
-      ansible_host: localhost
+      ansible_connection: local
 node:
   hosts:
     node1: null
@@ -63,4 +78,5 @@
 rm -rf $ARA_DIR
 ansible-playbook $ZUUL_DIR/playbooks/zuul-stream/fixtures/test-stream.yaml
 ansible-playbook $ZUUL_DIR/playbooks/zuul-stream/fixtures/test-stream-failure.yaml
+# ansible-playbook $ZUUL_DIR/playbooks/zuul-stream/functional.yaml
 echo "Logs are in $WORK_DIR"
diff --git a/zuul/rpclistener.py b/zuul/rpclistener.py
index f3f55f6..7c777fd 100644
--- a/zuul/rpclistener.py
+++ b/zuul/rpclistener.py
@@ -235,6 +235,22 @@
             event.ref = args['ref']
             event.oldrev = args['oldrev']
             event.newrev = args['newrev']
+            try:
+                int(event.oldrev, 16)
+                if len(event.oldrev) != 40:
+                    errors += 'Old rev must be 40 character sha1: ' \
+                              '%s\n' % event.oldrev
+            except Exception:
+                errors += 'Old rev must be base16 hash: ' \
+                          '%s\n' % event.oldrev
+            try:
+                int(event.newrev, 16)
+                if len(event.newrev) != 40:
+                    errors += 'New rev must be 40 character sha1: ' \
+                              '%s\n' % event.newrev
+            except Exception:
+                errors += 'New rev must be base16 hash: ' \
+                          '%s\n' % event.newrev
 
         if errors:
             job.sendWorkException(errors.encode('utf8'))