import os
import tempfile
import unittest
import errors

from system.wifi_manager import wifi_manager


SHORT_PASSWD = "123"
LONG_PASSWD = "0123456789012345678901234567890123456789012345678901234567890123456789"
NEW_PASSWD = "1234567890"
NEW_PASSWD_2 = "123456789022"
WRONG_SSID = "0123456789012345678901234567890123456789"



class TestWifiManager(unittest.TestCase):
    
    def setUp(self):
        
        found_ssid = False
        found_chan = False
        found_passwd = False
        
        with open(wifi_manager.HOSTAPD_FILE) as file:
            for line in file:
                if "channel=" in line:
                    self.orig_chan = line.replace("channel=", "") 
                    self.orig_chan = self.orig_chan.rstrip("\n")
                    found_chan = True
                if "ssid=" in line:
                    self.orig_ssid = line.replace("ssid=", "")
                    self.orig_ssid = self.orig_ssid.rstrip("\n")
                    found_ssid = True
                if "wpa_passphrase=" in line:
                    self.orig_passwd = line.replace("wpa_passphrase=", "")
                    self.orig_passwd = self.orig_passwd.rstrip("\n")
                    found_passwd = True
                     
                    
        self.assertTrue(found_chan ,"Wifi conf test setup : can't find channel") 
        self.assertTrue(found_ssid ,"Wifi conf test setup : can't find ssid")
        self.assertTrue(found_passwd ,"Wifi conf test setup : can't find passwd")

	print "Wifi conf test : original SSID : " + self.orig_ssid
	print "Wifi conf test : original channel : " + self.orig_chan
	print "Wifi conf test : original password : "+ self.orig_passwd
    
    def testBadParameters(self):
        with self.assertRaises(errors.WrongWifiPassword):
            wifi_manager.set_wifi_conf(SHORT_PASSWD, "kingklem")
            
        with self.assertRaises(errors.WrongWifiPassword):
            wifi_manager.set_wifi_conf(LONG_PASSWD, "kingklem")
            
        with self.assertRaises(errors.WifiError):    
            wifi_manager.set_wifi_conf(self.orig_passwd, WRONG_SSID)
            


        with self.assertRaises(errors.WrongWifiPassword):       
            wifi_manager.set_wifi_conf(SHORT_PASSWD, new_channel="4")

        with self.assertRaises(errors.WrongWifiPassword):
            wifi_manager.set_wifi_conf(LONG_PASSWD, new_channel="4")

        with self.assertRaises(errors.WifiError):   
            wifi_manager.set_wifi_conf(self.orig_passwd, new_channel="19")

        with self.assertRaises(errors.WifiError): 
            wifi_manager.set_wifi_conf(self.orig_passwd, new_channel="123")


        with self.assertRaises(errors.WrongWifiPassword): 
            wifi_manager.set_wifi_conf(SHORT_PASSWD, new_passwd=NEW_PASSWD)
            
        with self.assertRaises(errors.WrongWifiPassword):
            wifi_manager.set_wifi_conf(LONG_PASSWD,  new_passwd=NEW_PASSWD)
            
        with self.assertRaises(errors.WifiError): 
            wifi_manager.set_wifi_conf(self.orig_passwd,  new_passwd=SHORT_PASSWD)
            
        with self.assertRaises(errors.WifiError): 
            wifi_manager.set_wifi_conf(self.orig_passwd,  new_passwd=LONG_PASSWD) 

            
        with self.assertRaises(errors.WrongWifiPassword): 
            wifi_manager.set_wifi_conf(SHORT_PASSWD, "king klem", "4", NEW_PASSWD)
            
        with self.assertRaises(errors.WrongWifiPassword): 
            wifi_manager.set_wifi_conf(LONG_PASSWD, "king klem", "4", NEW_PASSWD)
            
        with self.assertRaises(errors.WifiError): 
            wifi_manager.set_wifi_conf(self.orig_passwd, WRONG_SSID, "4", NEW_PASSWD)
            
        with self.assertRaises(errors.WifiError): 
            wifi_manager.set_wifi_conf(self.orig_passwd, "king klem", "19", NEW_PASSWD)
  
        with self.assertRaises(errors.WifiError): 
            wifi_manager.set_wifi_conf(self.orig_passwd, "king klem", "123", NEW_PASSWD)
            
        with self.assertRaises(errors.WifiError): 
            wifi_manager.set_wifi_conf(self.orig_passwd, "king klem", "4", SHORT_PASSWD)
            
        with self.assertRaises(errors.WifiError): 
            wifi_manager.set_wifi_conf(self.orig_passwd, "king klem", "4", LONG_PASSWD)
 

    
    def testGetVal(self):
        
        found = False
        ssid = wifi_manager.get_ssid()
        with open(wifi_manager.HOSTAPD_FILE) as file:
            for line in file:
                if "ssid=" in line:
                    orig_val_ssid = line.replace("ssid=", "")
                    orig_val_ssid = orig_val_ssid.rstrip("\n")
                    self.assertEqual(ssid, orig_val_ssid, "get wrong ssid")
                    found = True 
            
                
        self.assertTrue(found,"Wifi conf test : can't find ssid")                       
        
        found = False
        chan = wifi_manager.get_channel()
        with open(wifi_manager.HOSTAPD_FILE) as file:
            for line in file:
                if "channel" in line :
                    orig_val_chan = line.replace("channel=", "")
                    orig_val_chan = orig_val_chan.rstrip("\n")
                    self.assertEqual(chan, orig_val_chan, "get wrong channel")
                    found = True

        self.assertTrue(found,"Wifi conf test : can't find channel")    

        
    def testSetConf(self):
        wifi_manager.set_wifi_conf(self.orig_passwd, "test_test", "4", NEW_PASSWD)
        
        found_ssid = False
        found_chan = False
        found_passwd = False
        
        with open(wifi_manager.HOSTAPD_FILE) as file:
            for line in file:
                if "channel=" in line:
                    orig_val_chan = line.replace("channel=", "")
                    orig_val_chan = orig_val_chan.rstrip("\n")
                    self.assertEqual(orig_val_chan, "4", "Wifi conf test : get wrong channel")
                    found_chan = True
                if "ssid=" in line:
                    orig_val_ssid = line.replace("ssid=", "")
                    orig_val_ssid = orig_val_ssid.rstrip("\n")
                    self.assertEqual(orig_val_ssid, "ORAH4i_test_test", "Wifi conf test : get wrong ssid")
                    found_ssid = True
                if "wpa_passphrase=" in line:
                    orig_val_passwd = line.replace("wpa_passphrase=", "")
                    orig_val_passwd = orig_val_passwd.rstrip("\n")
                    self.assertEqual(orig_val_passwd, NEW_PASSWD, "Wifi conf test : get wrong password")
                    found_passwd = True
                    
                    
        self.assertTrue(found_chan ,"Wifi conf test : can't find channel") 
        self.assertTrue(found_ssid ,"Wifi conf test : can't find ssid")
        self.assertTrue(found_passwd ,"Wifi conf test : can't find passwd")
        
        #check each set function
        wifi_manager.set_wifi_conf(NEW_PASSWD, "kingklem")
        wifi_manager.set_wifi_conf(NEW_PASSWD, new_channel="3")
        wifi_manager.set_wifi_conf(NEW_PASSWD, new_passwd=NEW_PASSWD_2)
        
        
        with open(wifi_manager.HOSTAPD_FILE) as file:
            for line in file:
                if "channel=" in line:
                    orig_val_chan = line.replace("channel=", "")
                    orig_val_chan = orig_val_chan.rstrip("\n")
                    self.assertEqual(orig_val_chan, "3", "Wifi conf test : get wrong channel")
                    found_chan = True
                if "ssid=" in line:
                    orig_val_ssid = line.replace("ssid=", "")
                    orig_val_ssid = orig_val_ssid.rstrip("\n")
                    self.assertEqual(orig_val_ssid, "ORAH4i_kingklem", "Wifi conf test : get wrong ssid")
                    found_ssid = True
                if "wpa_passphrase=" in line:
                    orig_val_passwd = line.replace("wpa_passphrase=", "")
                    orig_val_passwd = orig_val_passwd.rstrip("\n")
                    self.assertEqual(orig_val_passwd, NEW_PASSWD_2, "Wifi conf test : get wrong password")
                    found_passwd = True
                    
            
        self.assertTrue(found_chan ,"Wifi conf test : can't find channel") 
        self.assertTrue(found_ssid ,"Wifi conf test : can't find ssid")
        self.assertTrue(found_passwd ,"Wifi conf test : can't find passwd")
        
        #put back original value
        wifi_manager.set_wifi_conf(NEW_PASSWD_2, self.orig_ssid, self.orig_chan, self.orig_passwd)
                    
        
        with open(wifi_manager.HOSTAPD_FILE) as file:
            for line in file:
                if "channel=" in line:
                    orig_val_chan = line.replace("channel=", "")
                    orig_val_chan = orig_val_chan.rstrip("\n")
                    self.assertEqual(orig_val_chan, self.orig_chan, "Wifi conf test : get wrong channel")
                    found_chan = True
                if "ssid=" in line:
                    orig_val_ssid = line.replace("ssid=", "")
                    orig_val_ssid = orig_val_ssid.rstrip("\n")
                    self.assertEqual(orig_val_ssid, self.orig_ssid, "Wifi conf test : get wrong ssid")
                    found_ssid = True
                if "wpa_passphrase=" in line:
                    orig_val_passwd = line.replace("wpa_passphrase=", "")
                    orig_val_passwd = orig_val_passwd.rstrip("\n")
                    self.assertEqual(orig_val_passwd, self.orig_passwd, "Wifi conf test : get wrong password")
                    found_passwd = True


        self.assertTrue(found_chan ,"Wifi conf test : can't find channel")
        self.assertTrue(found_ssid ,"Wifi conf test : can't find ssid")
        self.assertTrue(found_passwd ,"Wifi conf test : can't find passwd")