From 1ebee25370c4c20f36e1c434e16d8a9e75118729 Mon Sep 17 00:00:00 2001
From: Andreas <andreasv@fsmpi.rwth-aachen.de>
Date: Mon, 22 Jan 2018 17:55:14 +0100
Subject: [PATCH] added unit tests for livestreams

---
 encoding.py    |  1 -
 jobs.py        |  4 ++--
 livestreams.py |  7 ++++---
 server.py      |  1 +
 tests.py       | 36 ++++++++++++++++++++++++++++++++++++
 5 files changed, 43 insertions(+), 6 deletions(-)

diff --git a/encoding.py b/encoding.py
index 3b912f0..22bc8b9 100644
--- a/encoding.py
+++ b/encoding.py
@@ -114,7 +114,6 @@ def update_lecture_videos(jobid, jobtype, data, state, status):
 
 @edit_handler('chapters')
 def chapter_changed(table, column, value, id, user):
-	print('chapter_changed')
 	chapters = query('SELECT * FROM chapters WHERE id = ?', id)
 	if not chapters:
 		return
diff --git a/jobs.py b/jobs.py
index 0696c73..1168e33 100644
--- a/jobs.py
+++ b/jobs.py
@@ -2,6 +2,7 @@ from server import *
 import traceback
 import json
 import random
+from time import sleep
 
 job_handlers = {}
 def job_handler(*types, state='finished'):
@@ -147,8 +148,7 @@ def jobs_schedule(hostname):
 		try:
 			query("BEGIN")
 			for i in query('SELECT * FROM jobs WHERE state = "ready" ORDER BY priority DESC'):
-				if i['type'] in hostdata['jobtypes'] and \
-						i['queue'] in hostdata['queues']:
+				if i['type'] in hostdata['jobtypes'] and i['queue'] in hostdata['queues']:
 					job = i
 					break
 			if not job:
diff --git a/livestreams.py b/livestreams.py
index 42ebc0d..8f71de6 100644
--- a/livestreams.py
+++ b/livestreams.py
@@ -10,9 +10,10 @@ def livestream_thumbnail():
 @app.route('/internal/streaming/legacy_auth/<server>', methods=['GET', 'POST'])
 def streamauth(server=None):
 	internal = False
-	for net in config.get('FSMPI_IP_RANGES', []):
-		if ip_address(request.headers['X-Real-IP']) in ip_network(net):
-			internal = True
+	if 'X-Real-IP' in request.headers:
+		for net in config.get('FSMPI_IP_RANGES', []):
+			if ip_address(request.headers['X-Real-IP']) in ip_network(net):
+				internal = True
 	if request.values['app'] != 'live':
 		return 'Bad request', 400
 	if not internal:
diff --git a/server.py b/server.py
index b762ae1..bf5ebaa 100644
--- a/server.py
+++ b/server.py
@@ -36,6 +36,7 @@ if sys.argv[0].endswith('tests.py'):
 	config['SQLITE_INIT_SCHEMA'] = True
 	config['DEBUG'] = True
 	config['DISABLE_SCHEDULER'] = True
+	config['JOBS_API_KEY'] = '1'
 if config['DEBUG']:
 	app.jinja_env.auto_reload = True
 
diff --git a/tests.py b/tests.py
index acdb6f6..805d78f 100755
--- a/tests.py
+++ b/tests.py
@@ -3,6 +3,7 @@
 import os
 import unittest
 import server
+import json
 
 import flask
 from flask import url_for
@@ -210,6 +211,41 @@ class VideoTestCase(unittest.TestCase):
 			assert r.status_code == 302
 			assert url_for('embed', id='4105', course='14ws-ex3') in r.data.decode()
 
+	def test_livestream(self):
+		with self.app as c:
+			# fails because no ip is sent
+			r = self.app.get('/internal/streaming/legacy_auth', data={'app': 'live', 'call': 'publish', 'pass': 'caisoh8aht0wuSu', 'lecture': 7011, 'name': '16ss-dsal'})
+			assert r.status_code == 403
+			
+			r = self.app.get('/internal/streaming/legacy_auth/testserver', data={'app': 'live', 'call': 'publish', 'pass': 'caisoh8aht0wuSu', 'lecture': 6981, 'name': '15ws-afi'}, headers={'X-Real-IP': '137.226.35.193'})
+			assert r.status_code == 200
+
+			# test for livestream job
+			r = self.app.post('/internal/jobs/api/worker/test/schedule', data=json.dumps({'jobtypes': ['simple_live_transcode'], 'queues': ['default'], 'apikey': '1'}), content_type='application/json')
+			assert r.status_code == 200
+			jobdata = json.loads(json.loads(r.data.decode())['data'])
+			assert jobdata.get('src') == 'rtmp://testserver/live/15ws-afi'
+
+			# test for thumbnail job
+			import livestreams
+			livestreams.livestream_thumbnail()
+			r = self.app.post('/internal/jobs/api/worker/test/schedule', data=json.dumps({'jobtypes': ['thumbnail'], 'queues': ['default'], 'apikey': '1'}), content_type='application/json')
+			assert r.status_code == 200
+			jobdata = json.loads(json.loads(r.data.decode())['data'])
+			assert jobdata.get('lectureid') == '6981'
+			assert jobdata.get('path') == 'pub/hls/15ws-afi.m3u8'
+
+			r = self.app.get('/internal/streaming/legacy_auth/testserver', data={'app': 'live', 'call': 'publish_done', 'pass': 'caisoh8aht0wuSu', 'lecture': 6981, 'name': '15ws-afi'}, headers={'X-Real-IP': '137.226.35.193'})
+			assert r.status_code == 200
+			
+			# test if there are more jobs
+			r = self.app.post('/internal/jobs/api/worker/test/schedule', data=json.dumps({'jobtypes': ['simple_live_transcode'], 'queues': ['default'], 'apikey': '1'}), content_type='application/json')
+			assert r.status_code == 503
+
+			# test if job was cancled
+			r = self.app.post('/internal/jobs/api/job/1/ping', data={'apikey': '1', 'host': 'test', 'status': '{}', 'state': '{}'})
+			assert r.status_code == 205
+
 if __name__ == '__main__':
 	unittest.main()
 
-- 
GitLab