from utils import transport
from utils.ml import ML, AnomalyDetection, AnalyzeAnomaly
import unittest
import json
import os


path = os.environ['MONITOR_CONFIG_PATH']
f = open(path)
CONFIG = json.loads( f.read())
f.close()
factory = transport.DataSourceFactory()

class TestML(unittest.TestCase):
	def setUp(self):
		
		ref = CONFIG['store']['class']['read']
		p = CONFIG['store']['args']
		p['qid'] = ['apps']
		self.greader = factory.instance(type=ref,args=p)
	def test_has_date(self):
		r = self.greader.read()
		
		self.assertTrue(r)
	def test_Filter(self):
		r = self.greader.read()
		r = r['apps']
		#
		# To make this test case extensible we need to pull apps from the configuration
		#
		app = CONFIG['monitor']['processes']['config']['apps'][0]
		x = ML.Filter('label',app,r)
		app = ML.CleanupName(app)
		for row in x:			
			self.assertTrue(row['label'] == app)
	def test_Extract(self):
		r = self.greader.read()
		r = r['apps']
		app = CONFIG['monitor']['processes']['config']['apps'][0]
		x = ML.Filter('label',app,r)
		features =  CONFIG['learner']['anomalies']['features']
		self.assertTrue(features)
		x_ = ML.Extract(features, x)
		
		self.assertTrue (len (x) == len(x_))
		pass
	def test_Learn(self):
		ref = CONFIG['store']['class']['read']
		p	= CONFIG['store']['args']
		greader = factory.instance(type=ref,args=p)
		
		data = greader.read()
		
		data = data['apps']
		app = CONFIG['monitor']['processes']['config']['apps'][0]
		lhandler = AnomalyDetection()
		features = CONFIG['learner']['anomalies']['features']
		label	= CONFIG['learner']['anomalies']['label']
		x = lhandler.learn(data,'label',app,features,label)
		
		
	def test_Predict(self):
		ref = CONFIG['store']['class']['read']
		p	= CONFIG['store']['args']
		greader = factory.instance(type=ref,args=p)
		data = greader.read()
		if 'learn' in data :	
			info = data['learn']

			app = CONFIG['monitor']['processes']['config']['apps'][0]
			
			lhandler = AnalyzeAnomaly()
			features = CONFIG['learner']['anomalies']['features']
			label	= CONFIG['learner']['anomalies']['label']
		#x = lhandler.learn(data,'label',app,features,label)
			data = data['apps']
			xo = ML.Filter('label',app,data)
			info = ML.Filter('label',app,info)
			
			lhandler.predict(xo,info[0])

if __name__ == '__main__' :
	unittest.main()
