예제 #1
0
class TestCellular(unittest.TestCase):

    filetext = "\
    lease {\n\
      interface \"eth0\"\n\
      fixed-address 192.168.10.26\n\
      option subnet-mask 255.255.0.0\n\
      option routers 192.168.31.115\n\
      option dhcp-lease-time 5566\n\
      option dhcp-message-type 5\n\
      option domain-name-server 8.8.8.58 20.20.20.20 40.40.4.1\n\
      option dhcp-server-identifier 192.168.31.115\n\
      option domain-name \"MXcloud115\"\n\
      renew 3 2014/10/29 12:52:19\n\
      rebind 3 2014/10/29 13:37:52\n\
      expire 3 2014/10/29 13:49:28\n\
      }\n\
      "

    filetext_fail = " "

    @patch("cellular.Cellular.set_pincode_by_id")
    def setUp(self, set_pincode_by_id):
        sh.echo("1234, 1234", _out="/run/shm/cellular.tmp")
        try:
            os.unlink(dirpath + "/../data/cellular.json")
        except Exception:
            pass
        set_pincode_by_id.return_value = True
        self.cellular = Cellular(connection=Mockup())

    def tearDown(self):
        self.cellular = None

    @patch("cellular.subprocess")
    def put_simple_test_cases(self, subprocess):
        subprocess.check_output.return_value = True
        subprocess.call.return_value = True
        test_msg = {
            "id": 12345,
            "method": "put",
            "param": {
                "id": "1"
            },
            "resource": "/network/cellulars"
        }

        # case 1: no data attribute
        def test_put_with_no_data(code=200, data=None):
            self.assertEqual(400, code)
            self.assertEqual(data, {"message": "Invalid Input."})

        message = Message(test_msg)
        self.cellular.put_root_by_id(message,
                                     response=test_put_with_no_data,
                                     test=True)

        # case 2: data dict is empty or no enable exist
        def test_put_with_random_data(code=200, data=None):
            self.assertEqual(400, code)
            self.assertEqual(data, {"message": "No such resources."})

        test_msg["data"] = dict()
        message = Message(test_msg)
        self.cellular.put_root_by_id(message,
                                     response=test_put_with_random_data,
                                     test=True)

        # case 3: data not found
        def test_put_with_unknown_data(code=200, data=None):
            self.assertEqual(400, code)
            self.assertEqual(data, {"message": "No such resources."})

        test_msg["data"] = {"path": "abcde"}
        message = Message(test_msg)
        self.cellular.id = 1
        self.cellular.put_root_by_id(message,
                                     response=test_put_with_unknown_data,
                                     test=True)

    def put_complicate_test_cases(self):
        test_msg = {
            "id": 1,
            "method": "put",
            "param": {
                "id": "1"
            },
            "resource": "/network/cellulars/1"
        }

        # case 1: data valid. test do not check message coming back
        def test_multi_input_with_valid_data(code=200, data=None):
            self.assertEqual(200, code)
            self.assertDictContainsSubset(
                data, {
                    "id": 1,
                    "apn": "internet",
                    "username": "******",
                    "enable": 0,
                    "name": "wwan1",
                    "ip": "",
                    "gateway": "",
                    "dns": "",
                    "dialNumber": "9999",
                    "password": "",
                    "pinCode": "",
                    "authType": "",
                    "modemPort": "/dev/cdc-wdm1",
                    "atPort": "/dev/ttyUSB2",
                    "enableAuth": 0,
                    "status": 0,
                    "authType": "PAP",
                    "delay": 40
                })

        test_msg["data"] = {"username": "******", "dialNumber": "9999"}
        message = Message(test_msg)
        self.cellular.put_root_by_id(message,
                                     response=test_multi_input_with_valid_data,
                                     test=True)

        def test_get_root(code=200, data=None):
            self.assertEqual(200, code)

        self.cellular.get_root_by_id(message,
                                     response=test_get_root,
                                     test=True)

        def test_enable_with_valid_data(code=200, data=None):
            self.assertEqual(200, code)
            self.assertDictContainsSubset(
                data, {
                    "id": 1,
                    "apn": "internet",
                    "username": "******",
                    "enable": 1,
                    "name": "wwan1",
                    "ip": "",
                    "gateway": "",
                    "dns": "",
                    "dialNumber": "9999",
                    "password": "",
                    "pinCode": "",
                    "authType": "",
                    "modemPort": "/dev/cdc-wdm1",
                    "atPort": "/dev/ttyUSB2",
                    "enableAuth": 0,
                    "status": 0,
                    "authType": "PAP",
                    "delay": 40
                })

        test_msg["data"] = {"enable": 1}
        message = Message(test_msg)
        self.cellular.put_root_by_id(message,
                                     response=test_enable_with_valid_data,
                                     test=True)

        def test_apn_with_valid_data(code=200, data=None):
            self.assertEqual(200, code)
            self.assertDictContainsSubset(
                data, {
                    "id": 1,
                    "apn": "hinet",
                    "username": "******",
                    "enable": 1,
                    "name": "wwan1",
                    "ip": "",
                    "gateway": "",
                    "dns": "",
                    "dialNumber": "9999",
                    "password": "",
                    "pinCode": "",
                    "authType": "",
                    "modemPort": "/dev/cdc-wdm1",
                    "atPort": "/dev/ttyUSB2",
                    "enableAuth": 0,
                    "status": 0,
                    "authType": "PAP",
                    "delay": 40
                })

        test_msg["data"] = {"apn": "hinet"}
        message = Message(test_msg)
        self.cellular.put_root_by_id(message,
                                     response=test_apn_with_valid_data,
                                     test=True)

        def test_username_with_valid_data(code=200, data=None):
            self.assertEqual(200, code)
            self.assertDictContainsSubset(
                data, {
                    "id": 1,
                    "apn": "hinet",
                    "username": "******",
                    "enable": 1,
                    "name": "wwan1",
                    "ip": "",
                    "gateway": "",
                    "dns": "",
                    "dialNumber": "9999",
                    "password": "",
                    "pinCode": "",
                    "authType": "",
                    "modemPort": "/dev/cdc-wdm1",
                    "atPort": "/dev/ttyUSB2",
                    "enableAuth": 0,
                    "status": 0,
                    "authType": "PAP",
                    "delay": 40
                })

        test_msg["data"] = {"username": "******"}
        message = Message(test_msg)
        self.cellular.put_root_by_id(message,
                                     response=test_username_with_valid_data,
                                     test=True)

        def test_name_with_valid_data(code=200, data=None):
            self.assertEqual(200, code)
            self.assertDictContainsSubset(
                data, {
                    "id": 1,
                    "apn": "hinet",
                    "username": "******",
                    "enable": 1,
                    "name": "root",
                    "ip": "",
                    "gateway": "",
                    "dns": "",
                    "dialNumber": "9999",
                    "password": "",
                    "pinCode": "",
                    "authType": "",
                    "modemPort": "/dev/cdc-wdm1",
                    "atPort": "/dev/ttyUSB2",
                    "enableAuth": 0,
                    "status": 0,
                    "authType": "PAP",
                    "delay": 40
                })

        test_msg["data"] = {"name": "root"}
        message = Message(test_msg)
        self.cellular.put_root_by_id(message,
                                     response=test_name_with_valid_data,
                                     test=True)

        def test_dialNumber_valid_data(code=200, data=None):
            self.assertEqual(200, code)
            self.assertDictContainsSubset(
                data, {
                    "id": 1,
                    "apn": "hinet",
                    "username": "******",
                    "enable": 1,
                    "name": "root",
                    "ip": "",
                    "gateway": "",
                    "dns": "",
                    "dialNumber": "*88#",
                    "password": "",
                    "pinCode": "",
                    "authType": "",
                    "modemPort": "/dev/cdc-wdm1",
                    "atPort": "/dev/ttyUSB2",
                    "enableAuth": 0,
                    "status": 0,
                    "authType": "PAP",
                    "delay": 40
                })

        test_msg["data"] = {"dialNumber": "*88#"}
        message = Message(test_msg)
        self.cellular.put_root_by_id(message,
                                     response=test_dialNumber_valid_data,
                                     test=True)

        def test_password_with_valid_data(code=200, data=None):
            self.assertEqual(200, code)
            self.assertDictContainsSubset(
                data, {
                    "id": 1,
                    "apn": "hinet",
                    "username": "******",
                    "enable": 1,
                    "name": "root",
                    "ip": "",
                    "gateway": "",
                    "dns": "",
                    "dialNumber": "*88#",
                    "password": "******",
                    "pinCode": "",
                    "authType": "",
                    "modemPort": "/dev/cdc-wdm1",
                    "atPort": "/dev/ttyUSB2",
                    "enableAuth": 0,
                    "status": 0,
                    "authType": "PAP",
                    "delay": 40
                })

        test_msg["data"] = {"password": "******"}
        message = Message(test_msg)
        self.cellular.put_root_by_id(message,
                                     response=test_password_with_valid_data,
                                     test=True)

        def test_enableAuth_with_valid_data(code=200, data=None):
            self.assertEqual(200, code)
            self.assertDictContainsSubset(
                data, {
                    "id": 1,
                    "apn": "hinet",
                    "username": "******",
                    "enable": 1,
                    "name": "root",
                    "ip": "",
                    "gateway": "",
                    "dns": "",
                    "dialNumber": "*88#",
                    "password": "******",
                    "pinCode": "",
                    "modemPort": "/dev/cdc-wdm1",
                    "atPort": "/dev/ttyUSB2",
                    "enableAuth": 1,
                    "status": 0,
                    "authType": "BOTH",
                    "delay": 40
                })

        test_msg["data"] = {
            "enableAuth": 1,
            "authType": "BOTH",
            "username": "******",
            "password": "******"
        }
        message = Message(test_msg)
        self.cellular.put_root_by_id(message,
                                     response=test_enableAuth_with_valid_data,
                                     test=True)

        def test_enableAuth_with_no_username(code=200, data=None):
            self.assertEqual(400, code)
            self.assertEqual(data, {"message": "require field is empty."})

        test_msg["data"] = {"enableAuth": 1, "username": ""}
        message = Message(test_msg)
        self.cellular.put_root_by_id(message,
                                     response=test_enableAuth_with_no_username,
                                     test=True)

        def test_authType_with_invalid_data(code=200, data=None):
            self.assertEqual(400, code)
            self.assertEqual(data, {"message": "Data invalid."})

        test_msg["data"] = {"authType": "SSS"}
        message = Message(test_msg)
        self.cellular.put_root_by_id(message,
                                     response=test_authType_with_invalid_data,
                                     test=True)

        def test_authType_with_valid_data(code=200, data=None):
            self.assertEqual(200, code)

        test_msg["data"] = {"authType": "PAP"}
        message = Message(test_msg)
        self.cellular.put_root_by_id(message,
                                     response=test_authType_with_valid_data,
                                     test=True)

    def get_complicate_test_cases(self):
        test_msg = {
            "id": 1,
            "method": "get",
            "param": {
                "id": "1"
            },
            "resource": "/network/cellulars"
        }

        def test_get_with_correct_id(code=200, data=None):
            self.assertEqual(200, code)
            self.assertDictContainsSubset(
                data, {
                    "id": 0,
                    "apn": "hinet",
                    "username": "******",
                    "enable": 1,
                    "name": "root",
                    "ip": "",
                    "gateway": "",
                    "dns": "",
                    "dialNumber": "*88#",
                    "password": "******",
                    "pinCode": "",
                    "authType": "",
                    "modemPort": "/dev/cdc-wdm1",
                    "atPort": "/dev/ttyUSB2",
                    "enableAuth": 0,
                    "status": 0,
                    "delay": 40
                })
            message = Message(test_msg)
            self.cellular.get_root_by_id(message,
                                         response=test_get_with_correct_id,
                                         test=True)

        def test_pincode_with_valid_data(code=200, data=None):
            self.assertEqual(200, code)
            self.assertDictContainsSubset(
                data, {
                    "id": 0,
                    "apn": "hinet",
                    "username": "******",
                    "enable": 1,
                    "name": "root",
                    "ip": "",
                    "gateway": "",
                    "dns": "",
                    "dialNumber": "*88#",
                    "password": "******",
                    "pinCode": "",
                    "authType": "",
                    "modemPort": "/dev/cdc-wdm1",
                    "atPort": "/dev/ttyUSB2",
                    "enableAuth": 0,
                    "status": 0,
                    "delay": 40
                })
            test_msg["data"] = {"id": "0", "pinCode": "0000"}
            message = Message(test_msg)
            self.cellular.put_root_by_id(message,
                                         response=test_pincode_with_valid_data,
                                         test=True)

    def get_test_cases(self):
        test_msg = {"id": 1, "method": "get", "resource": "/network/cellulars"}

        # case 1: data
        def test_get_root(code=200, data=None):
            self.assertEqual(200, code)

        message = Message(test_msg)
        self.cellular.get_root(message, response=test_get_root, test=True)

    def test_get_signal_by_id(self):
        self.cellular = Cellular(connection=Mockup())
        with patch("cellular.subprocess") as subprocess:
            subprocess.check_output.return_value = "-80"
            res = self.cellular.get_signal_by_id(0)
            self.assertEqual(res, -80)

    def test_get_signal_by_id_fail(self):
        self.cellular = Cellular(connection=Mockup())
        with patch("cellular.subprocess") as subprocess:
            subprocess.check_output.return_value = ""
            res = self.cellular.get_signal_by_id(0)
            self.assertEqual(res, 99)

    def test_get_signal_by_id_exception(self):
        self.cellular = Cellular(connection=Mockup())
        with patch("cellular.subprocess") as subprocess:
            subprocess.check_output.side_effect = Exception
            res = self.cellular.get_signal_by_id(0)
            self.assertEqual(res, 0)

    def test_get_cops_by_id(self):
        self.cellular = Cellular(connection=Mockup())
        with patch("cellular.modemcmd") as modemcmd:
            modemcmd.return_value = "+COPS: 0,0,\"Chunghwa Telecom\",2\r\nOK"
            res = self.cellular.get_cops_by_id(0)
            self.assertEqual(res, "Chunghwa Telecom")

    def test_get_cops_by_id_fail(self):
        self.cellular = Cellular(connection=Mockup())
        with patch("cellular.modemcmd") as modemcmd:
            modemcmd.return_value = ""
            res = self.cellular.get_cops_by_id(0)
            self.assertEqual(res, "Unknown Operator")

    def test_get_cops_by_id_exception(self):
        self.cellular = Cellular(connection=Mockup())
        with patch("cellular.modemcmd") as modemcmd:
            modemcmd.side_effect = Exception
            res = self.cellular.get_cops_by_id(0)
            self.assertEqual(res, "Unknown Operator")

    def test_get_status_by_id_disconnect(self):
        self.cellular = Cellular(connection=Mockup())
        with patch("cellular.subprocess") as subprocess:
            subprocess.check_output.return_value =\
                "Connection status: 'disconnected'"
            subprocess.call.return_value = True
            res = self.cellular.get_status_by_id(0)
            self.assertEqual(res, 0)

    def test_get_status_by_id_connect(self):
        self.cellular = Cellular(connection=Mockup())
        with patch("cellular.subprocess") as subprocess:
            subprocess.check_output.return_value =\
                "Connection status: 'connected'"
            subprocess.call.return_value = True
            res = self.cellular.get_status_by_id(0)
            self.assertEqual(res, 1)

    def test_get_status_by_id_search_fail(self):
        self.cellular = Cellular(connection=Mockup())
        with patch("cellular.subprocess") as subprocess:
            subprocess.check_output.return_value =\
                "xxxx"
            subprocess.call.return_value = None
            res = self.cellular.get_status_by_id(0)
            self.assertEqual(res, 2)

    def test_get_status_by_id_with_no_cid(self):
        self.cellular = Cellular(connection=Mockup())
        with patch("cellular.subprocess") as subprocess:
            self.cellular.cid = "1234"
            subprocess.check_output.return_value = True
            subprocess.call.return_value = True
            res = self.cellular.get_status_by_id(0)
            self.assertEqual(res, 2)

    def test_get_status_by_id_exception(self):
        self.cellular = Cellular(connection=Mockup())
        with patch("cellular.subprocess") as subprocess:
            subprocess.check_output.side_effect = Exception
            res = self.cellular.get_status_by_id(0)
            self.assertEqual(res, 2)

    def test_set_online_by_id(self):
        self.cellular = Cellular(connection=Mockup())
        self.cellular.model.db = [{
            'enable': 1,
            'name': 'wwan1',
            'modemPort': '/dev/ttyS0',
            'id': 0,
            'atPort': '/dev/ttyS0',
            'enableAuth': 1,
            'apn': 'internet',
            'authType': 'PAP',
            'username': '******',
            'password': '******'
        }]
        self.cellular.check_dhclient = Mock()
        with patch("cellular.subprocess") as subprocess:
            subprocess.check_output.\
                return_value = "\
                                Packet data handle: '123'\
                                CID: '23'"

            self.cellular.cid = "1234"
            res = self.cellular.set_online_by_id(0)
            self.assertEqual(res, True)

    def test_set_online_by_id_exception(self):
        self.cellular = Cellular(connection=Mockup())
        with patch("cellular.subprocess") as subprocess:
            subprocess.check_output.side_effect = Exception
            res = self.cellular.set_online_by_id(0)
            self.assertFalse(res)

    def test_set_offline_by_id_with_no_cid(self):
        self.cellular = Cellular(connection=Mockup())
        with patch("cellular.subprocess") as subprocess:
            subprocess.check_output.return_value = True
            self.cellular.cid = ""
            self.cellular.pdh = ""
            res = self.cellular.set_offline_by_id(0)
            self.assertEqual(res, True)

    def test_set_offline_by_id_exception(self):
        self.cellular = Cellular(connection=Mockup())
        with patch("cellular.subprocess") as subprocess:
            subprocess.check_output.side_effect = Exception
            res = self.cellular.set_offline_by_id(0)
            self.assertFalse(res)

    def test_search_name(self):
        self.cellular = Cellular(connection=Mockup())
        self.cellular.dhclient_info = self.filetext
        res = self.cellular.search_name()
        self.assertEqual(res, 'eth0')

    def test_search_name_fail(self):
        self.cellular = Cellular(connection=Mockup())
        self.cellular.dhclient_info = self.filetext_fail
        res = self.cellular.search_name()
        self.assertEqual(res, 'N/A')

    def test_search_router(self):
        self.cellular = Cellular(connection=Mockup())
        self.cellular.dhclient_info = self.filetext
        res = self.cellular.search_router()
        self.assertEqual(res, '192.168.31.115')

    def test_search_router_fail(self):
        self.cellular = Cellular(connection=Mockup())
        self.cellular.dhclient_info = self.filetext_fail
        res = self.cellular.search_router()
        self.assertEqual(res, 'N/A')

    def test_search_dns(self):
        self.cellular = Cellular(connection=Mockup())
        self.cellular.dhclient_info = self.filetext
        res = self.cellular.search_dns()
        self.assertEqual(res, ["8.8.8.58", "20.20.20.20", "40.40.4.1"])

    def test_search_dns_fail(self):
        self.cellular = Cellular(connection=Mockup())
        self.cellular.dhclient_info = self.filetext_fail
        res = self.cellular.search_dns()
        self.assertEqual(res, 'N/A')

    def test_search_ip(self):
        self.cellular = Cellular(connection=Mockup())
        self.cellular.dhclient_info = self.filetext
        res = self.cellular.search_ip()
        self.assertEqual(res, '192.168.10.26')

    def test_search_ip_fail(self):
        self.cellular = Cellular(connection=Mockup())
        self.cellular.dhclient_info = self.filetext_fail
        res = self.cellular.search_ip()
        self.assertEqual(res, 'N/A')

    def test_search_subnet(self):
        self.cellular = Cellular(connection=Mockup())
        self.cellular.dhclient_info = self.filetext
        res = self.cellular.search_subnet()
        self.assertEqual(res, '255.255.0.0')

    def test_search_subnet_fail(self):
        self.cellular = Cellular(connection=Mockup())
        res = self.cellular.search_subnet()
        self.assertEqual(res, 'N/A')

    def test_reconnect_if_disconnected(self):
        self.cellular.model.db = [{
            'enable': 1,
            'modemPort': '/dev/ttyS0',
            'atPort': '/dev/ttyS0',
            'id': 0,
            'apn': 'internet'
        }]
        self.cellular.get_signal_by_id = Mock(return_value=99)
        self.cellular.set_signal_led = Mock()
        self.cellular.is_target_device_appear = Mock(return_value=False)
        self.cellular.get_status_by_id = Mock(return_value=0)
        self.cellular.get_cops_by_id = Mock(return_value="unknown")
        self.cellular.publish.event = Mock()
        self.cellular.reconnect_if_disconnected()
        self.assertEqual(self.cellular.model.db[0]['signal'], 99)

    def test_reconnect_if_disconnected_operator_fail(self):
        self.cellular.model.db = [{
            'enable': 1,
            'name': "wwan1",
            'modemPort': '/dev/ttyS0',
            'atPort': '/dev/ttyS0',
            'id': 0,
            'apn': 'internet'
        }]
        self.cellular.get_signal_by_id = Mock(return_value=99)
        self.cellular.set_signal_led = Mock()
        self.cellular.is_target_device_appear = Mock(return_value=True)
        self.cellular.get_status_by_id = Mock(return_value=2)
        self.cellular.get_cops_by_id = Mock(return_value="unknown")
        self.cellular.publish.event = Mock()
        self.cellular.reconnect_if_disconnected()
        self.assertEqual(self.cellular.model.db[0]['signal'], 99)

    def test_reconnect_if_disconnected_current_offline_setting_offline(self):
        self.cellular.model.db = [{
            'enable': 1,
            'name': 'wwan1',
            'modemPort': '/dev/ttyS0',
            'atPort': '/dev/ttyS0',
            'enable': 0,
            'id': 0,
            'apn': 'internet'
        }]
        self.cellular.get_signal_by_id = Mock(return_value=99)
        self.cellular.set_signal_led = Mock()
        self.cellular.is_target_device_appear = Mock(return_value=True)
        self.cellular.get_status_by_id = Mock(return_value=0)
        self.cellular.get_cops_by_id = Mock(return_value="unknown")
        self.cellular.publish.event = Mock()
        self.cellular.reconnect_if_disconnected()
        self.assertEqual(self.cellular.model.db[0]['signal'], 99)

    def test_reconnect_if_disconnected_when_disconnect_and_enable_true(self):
        self.cellular.model.db = [{
            'enable': 1,
            'name': "wwan1",
            'modemPort': '/dev/ttyS0',
            'atPort': '/dev/ttyS0',
            'id': 0,
            'apn': 'internet'
        }]
        self.cellular.is_target_device_appear = Mock(return_value=True)
        self.cellular.get_signal_by_id = Mock(return_value=78)
        self.cellular.set_signal_led = Mock()
        self.cellular.get_status_by_id = Mock(return_value=0)
        self.cellular.get_cops_by_id = Mock(return_value="unknown")
        self.cellular.is_leases_file_appear = Mock(return_value=self.filetext)
        self.cellular.set_offline_by_id = Mock()
        self.cellular.set_online_by_id = Mock()
        self.cellular.publish.event = Mock()
        self.cellular.reconnect_if_disconnected()
        self.assertEqual(self.cellular.model.db[0]['signal'], 78)

    def test_reconnect_if_disconnected_when_connect_and_enable_false(self):
        self.cellular.model.db = [{
            'enable': 0,
            'name': 'wwan1',
            'atPort': '/dev/ttyS0',
            'modemPort': '/dev/ttyS0',
            'id': 0
        }]
        self.cellular.is_target_device_appear = Mock(return_value=True)
        self.cellular.get_signal_by_id = Mock(return_value=78)
        self.cellular.set_signal_led = Mock()
        self.cellular.get_status_by_id = Mock(return_value=1)
        self.cellular.get_cops_by_id = Mock(return_value="unknown")
        self.cellular.is_leases_file_appear = Mock(return_value=self.filetext)
        self.cellular.publish.event = Mock()
        self.cellular.reconnect_if_disconnected()
        self.assertEqual(self.cellular.model.db[0]['signal'], 78)

    def test_reconnect_if_disconnected_when_disconnect_and_enable_false(self):
        self.cellular.model.db = [{
            'enable': 1,
            'name': "wwan1",
            'atPort': '/dev/ttyS0',
            'modemPort': '/dev/ttyS0',
            'id': 0
        }]
        self.cellular.is_target_device_appear = Mock(return_value=True)
        self.cellular.get_signal_by_id = Mock(return_value=78)
        self.cellular.set_signal_led = Mock()
        self.cellular.get_status_by_id = Mock(return_value=1)
        self.cellular.get_cops_by_id = Mock(return_value="unknown")
        self.cellular.is_leases_file_appear = Mock(return_value=self.filetext)
        self.cellular.publish.event = Mock()
        self.cellular.reconnect_if_disconnected()
        self.assertEqual(self.cellular.model.db[0]['signal'], 78)

    def test_is_target_device_appear(self):
        res = self.cellular.is_target_device_appear('data/cellular.json')
        self.assertEqual(res, True)

    def test_is_target_device_appear_false(self):
        res = self.cellular.is_target_device_appear('/dev/asdfasdf')
        self.assertEqual(res, False)

    def test_init(self):
        with patch("cellular.ModelInitiator") as model:
            model.return_value.db.__getitem__.return_value = 1
            self.cellular.set_pincode_by_id = Mock(return_value=True)
            self.cellular.init()
예제 #2
0
class TestCellular(unittest.TestCase):

    filetext = "\
    lease {\n\
      interface \"eth0\"\n\
      fixed-address 192.168.10.26\n\
      option subnet-mask 255.255.0.0\n\
      option routers 192.168.31.115\n\
      option dhcp-lease-time 5566\n\
      option dhcp-message-type 5\n\
      option domain-name-server 8.8.8.58 20.20.20.20 40.40.4.1\n\
      option dhcp-server-identifier 192.168.31.115\n\
      option domain-name \"MXcloud115\"\n\
      renew 3 2014/10/29 12:52:19\n\
      rebind 3 2014/10/29 13:37:52\n\
      expire 3 2014/10/29 13:49:28\n\
      }\n\
      "
    filetext_fail = " "

    @patch("cellular.Cellular.set_pincode_by_id")
    def setUp(self, set_pincode_by_id):
        sh.echo("1234, 1234", _out="/run/shm/cellular.tmp")
        try:
            os.unlink(dirpath + "/../data/cellular.json")
        except Exception:
            pass
        set_pincode_by_id.return_value = True
        self.cellular = Cellular(connection=Mockup())

    def tearDown(self):
        self.cellular = None

    @patch("cellular.subprocess")
    def put_simple_test_cases(self, subprocess):
        subprocess.check_output.return_value = True
        subprocess.call.return_value = True
        test_msg = {
            "id": 12345,
            "method": "put",
            "param": {"id": "1"},
            "resource": "/network/cellulars"
        }

        # case 1: no data attribute
        def test_put_with_no_data(code=200, data=None):
            self.assertEqual(400, code)
            self.assertEqual(data, {"message": "Invalid Input."})
        message = Message(test_msg)
        self.cellular.put_root_by_id(message, response=test_put_with_no_data,
                                     test=True)

        # case 2: data dict is empty or no enable exist
        def test_put_with_random_data(code=200, data=None):
            self.assertEqual(400, code)
            self.assertEqual(data, {"message": "No such resources."})
        test_msg["data"] = dict()
        message = Message(test_msg)
        self.cellular.put_root_by_id(message,
                                     response=test_put_with_random_data,
                                     test=True)

        # case 3: data not found
        def test_put_with_unknown_data(code=200, data=None):
            self.assertEqual(400, code)
            self.assertEqual(data, {"message": "No such resources."})
        test_msg["data"] = {"path": "abcde"}
        message = Message(test_msg)
        self.cellular.id = 1
        self.cellular.put_root_by_id(message,
                                     response=test_put_with_unknown_data,
                                     test=True)

    def put_complicate_test_cases(self):
        test_msg = {
            "id": 1,
            "method": "put",
            "param": {"id": "1"},
            "resource": "/network/cellulars/1"
        }

        # case 1: data valid. test do not check message coming back
        def test_multi_input_with_valid_data(code=200, data=None):
            self.assertEqual(200, code)
            self.assertDictContainsSubset(data, {"id": 1,
                                                 "apn": "internet",
                                                 "username": "******",
                                                 "enable": 0,
                                                 "name": "wwan1",
                                                 "ip": "",
                                                 "gateway": "",
                                                 "dns": "",
                                                 "dialNumber": "9999",
                                                 "password": "",
                                                 "pinCode": "",
                                                 "authType": "",
                                                 "modemPort": "/dev/cdc-wdm1",
                                                 "atPort": "/dev/ttyUSB2",
                                                 "enableAuth": 0,
                                                 "status": 0,
                                                 "authType": "PAP",
                                                 "delay": 40
                                                 })
        test_msg["data"] = {"username": "******", "dialNumber": "9999"}
        message = Message(test_msg)
        self.cellular.put_root_by_id(message,
                                     response=test_multi_input_with_valid_data,
                                     test=True)

        def test_get_root(code=200, data=None):
            self.assertEqual(200, code)
        self.cellular.get_root_by_id(message,
                                     response=test_get_root,
                                     test=True)

        def test_enable_with_valid_data(code=200, data=None):
            self.assertEqual(200, code)
            self.assertDictContainsSubset(data, {"id": 1,
                                                 "apn": "internet",
                                                 "username": "******",
                                                 "enable": 1,
                                                 "name": "wwan1",
                                                 "ip": "",
                                                 "gateway": "",
                                                 "dns": "",
                                                 "dialNumber": "9999",
                                                 "password": "",
                                                 "pinCode": "",
                                                 "authType": "",
                                                 "modemPort": "/dev/cdc-wdm1",
                                                 "atPort": "/dev/ttyUSB2",
                                                 "enableAuth": 0,
                                                 "status": 0,
                                                 "authType": "PAP",
                                                 "delay": 40
                                                 })
        test_msg["data"] = {"enable": 1}
        message = Message(test_msg)
        self.cellular.put_root_by_id(message,
                                     response=test_enable_with_valid_data,
                                     test=True)

        def test_apn_with_valid_data(code=200, data=None):
            self.assertEqual(200, code)
            self.assertDictContainsSubset(data, {"id": 1,
                                                 "apn": "hinet",
                                                 "username": "******",
                                                 "enable": 1,
                                                 "name": "wwan1",
                                                 "ip": "",
                                                 "gateway": "",
                                                 "dns": "",
                                                 "dialNumber": "9999",
                                                 "password": "",
                                                 "pinCode": "",
                                                 "authType": "",
                                                 "modemPort": "/dev/cdc-wdm1",
                                                 "atPort": "/dev/ttyUSB2",
                                                 "enableAuth": 0,
                                                 "status": 0,
                                                 "authType": "PAP",
                                                 "delay": 40
                                                 })
        test_msg["data"] = {"apn": "hinet"}
        message = Message(test_msg)
        self.cellular.put_root_by_id(message,
                                     response=test_apn_with_valid_data,
                                     test=True)

        def test_username_with_valid_data(code=200, data=None):
            self.assertEqual(200, code)
            self.assertDictContainsSubset(data, {"id": 1,
                                                 "apn": "hinet",
                                                 "username": "******",
                                                 "enable": 1,
                                                 "name": "wwan1",
                                                 "ip": "",
                                                 "gateway": "",
                                                 "dns": "",
                                                 "dialNumber": "9999",
                                                 "password": "",
                                                 "pinCode": "",
                                                 "authType": "",
                                                 "modemPort": "/dev/cdc-wdm1",
                                                 "atPort": "/dev/ttyUSB2",
                                                 "enableAuth": 0,
                                                 "status": 0,
                                                 "authType": "PAP",
                                                 "delay": 40
                                                 })
        test_msg["data"] = {"username": "******"}
        message = Message(test_msg)
        self.cellular.put_root_by_id(message,
                                     response=test_username_with_valid_data,
                                     test=True)

        def test_name_with_valid_data(code=200, data=None):
            self.assertEqual(200, code)
            self.assertDictContainsSubset(data, {"id": 1,
                                                 "apn": "hinet",
                                                 "username": "******",
                                                 "enable": 1,
                                                 "name": "root",
                                                 "ip": "",
                                                 "gateway": "",
                                                 "dns": "",
                                                 "dialNumber": "9999",
                                                 "password": "",
                                                 "pinCode": "",
                                                 "authType": "",
                                                 "modemPort": "/dev/cdc-wdm1",
                                                 "atPort": "/dev/ttyUSB2",
                                                 "enableAuth": 0,
                                                 "status": 0,
                                                 "authType": "PAP",
                                                 "delay": 40
                                                 })
        test_msg["data"] = {"name": "root"}
        message = Message(test_msg)
        self.cellular.put_root_by_id(message,
                                     response=test_name_with_valid_data,
                                     test=True)

        def test_dialNumber_valid_data(code=200, data=None):
            self.assertEqual(200, code)
            self.assertDictContainsSubset(data, {"id": 1,
                                                 "apn": "hinet",
                                                 "username": "******",
                                                 "enable": 1,
                                                 "name": "root",
                                                 "ip": "",
                                                 "gateway": "",
                                                 "dns": "",
                                                 "dialNumber": "*88#",
                                                 "password": "",
                                                 "pinCode": "",
                                                 "authType": "",
                                                 "modemPort": "/dev/cdc-wdm1",
                                                 "atPort": "/dev/ttyUSB2",
                                                 "enableAuth": 0,
                                                 "status": 0,
                                                 "authType": "PAP",
                                                 "delay": 40
                                                 })
        test_msg["data"] = {"dialNumber": "*88#"}
        message = Message(test_msg)
        self.cellular.put_root_by_id(message,
                                     response=test_dialNumber_valid_data,
                                     test=True)

        def test_password_with_valid_data(code=200, data=None):
            self.assertEqual(200, code)
            self.assertDictContainsSubset(data, {"id": 1,
                                                 "apn": "hinet",
                                                 "username": "******",
                                                 "enable": 1,
                                                 "name": "root",
                                                 "ip": "",
                                                 "gateway": "",
                                                 "dns": "",
                                                 "dialNumber": "*88#",
                                                 "password": "******",
                                                 "pinCode": "",
                                                 "authType": "",
                                                 "modemPort": "/dev/cdc-wdm1",
                                                 "atPort": "/dev/ttyUSB2",
                                                 "enableAuth": 0,
                                                 "status": 0,
                                                 "authType": "PAP",
                                                 "delay": 40
                                                 })
        test_msg["data"] = {"password": "******"}
        message = Message(test_msg)
        self.cellular.put_root_by_id(message,
                                     response=test_password_with_valid_data,
                                     test=True)

        def test_enableAuth_with_valid_data(code=200, data=None):
            self.assertEqual(200, code)
            self.assertDictContainsSubset(data, {"id": 1,
                                                 "apn": "hinet",
                                                 "username": "******",
                                                 "enable": 1,
                                                 "name": "root",
                                                 "ip": "",
                                                 "gateway": "",
                                                 "dns": "",
                                                 "dialNumber": "*88#",
                                                 "password": "******",
                                                 "pinCode": "",
                                                 "modemPort": "/dev/cdc-wdm1",
                                                 "atPort": "/dev/ttyUSB2",
                                                 "enableAuth": 1,
                                                 "status": 0,
                                                 "authType": "BOTH",
                                                 "delay": 40
                                                 })
        test_msg["data"] = {"enableAuth": 1, "authType": "BOTH",
                            "username": "******", "password": "******"}
        message = Message(test_msg)
        self.cellular.put_root_by_id(message,
                                     response=test_enableAuth_with_valid_data,
                                     test=True)

        def test_enableAuth_with_no_username(code=200, data=None):
            self.assertEqual(400, code)
            self.assertEqual(data, {"message": "require field is empty."})
        test_msg["data"] = {"enableAuth": 1, "username": ""}
        message = Message(test_msg)
        self.cellular.put_root_by_id(message,
                                     response=test_enableAuth_with_no_username,
                                     test=True)

        def test_authType_with_invalid_data(code=200, data=None):
            self.assertEqual(400, code)
            self.assertEqual(data, {"message": "Data invalid."})
        test_msg["data"] = {"authType": "SSS"}
        message = Message(test_msg)
        self.cellular.put_root_by_id(message,
                                     response=test_authType_with_invalid_data,
                                     test=True)

        def test_authType_with_valid_data(code=200, data=None):
            self.assertEqual(200, code)
        test_msg["data"] = {"authType": "PAP"}
        message = Message(test_msg)
        self.cellular.put_root_by_id(message,
                                     response=test_authType_with_valid_data,
                                     test=True)

    def get_complicate_test_cases(self):
        test_msg = {
            "id": 1,
            "method": "get",
            "param": {"id": "1"},
            "resource": "/network/cellulars"
        }

        def test_get_with_correct_id(code=200, data=None):
            self.assertEqual(200, code)
            self.assertDictContainsSubset(data, {"id": 0,
                                                 "apn": "hinet",
                                                 "username": "******",
                                                 "enable": 1,
                                                 "name": "root",
                                                 "ip": "",
                                                 "gateway": "",
                                                 "dns": "",
                                                 "dialNumber": "*88#",
                                                 "password": "******",
                                                 "pinCode": "",
                                                 "authType": "",
                                                 "modemPort": "/dev/cdc-wdm1",
                                                 "atPort": "/dev/ttyUSB2",
                                                 "enableAuth": 0,
                                                 "status": 0,
                                                 "delay": 40
                                                 })
            message = Message(test_msg)
            self.cellular.get_root_by_id(message,
                                         response=test_get_with_correct_id,
                                         test=True)

        def test_pincode_with_valid_data(code=200, data=None):
            self.assertEqual(200, code)
            self.assertDictContainsSubset(data, {"id": 0,
                                                 "apn": "hinet",
                                                 "username": "******",
                                                 "enable": 1,
                                                 "name": "root",
                                                 "ip": "",
                                                 "gateway": "",
                                                 "dns": "",
                                                 "dialNumber": "*88#",
                                                 "password": "******",
                                                 "pinCode": "",
                                                 "authType": "",
                                                 "modemPort": "/dev/cdc-wdm1",
                                                 "atPort": "/dev/ttyUSB2",
                                                 "enableAuth": 0,
                                                 "status": 0,
                                                 "delay": 40
                                                 })
            test_msg["data"] = {"id": "0", "pinCode": "0000"}
            message = Message(test_msg)
            self.cellular.put_root_by_id(message,
                                         response=test_pincode_with_valid_data,
                                         test=True)

    def get_test_cases(self):
        test_msg = {
            "id": 1,
            "method": "get",
            "resource": "/network/cellulars"
        }

        # case 1: data
        def test_get_root(code=200, data=None):
            self.assertEqual(200, code)
        message = Message(test_msg)
        self.cellular.get_root(message, response=test_get_root, test=True)

    def test_get_signal_by_id(self):
        self.cellular = Cellular(connection=Mockup())
        with patch("cellular.subprocess") as subprocess:
            subprocess.check_output.return_value = "-80"
            res = self.cellular.get_signal_by_id(0)
            self.assertEqual(res, -80)

    def test_get_signal_by_id_fail(self):
        self.cellular = Cellular(connection=Mockup())
        with patch("cellular.subprocess") as subprocess:
            subprocess.check_output.return_value = ""
            res = self.cellular.get_signal_by_id(0)
            self.assertEqual(res, 99)

    def test_get_signal_by_id_exception(self):
        self.cellular = Cellular(connection=Mockup())
        with patch("cellular.subprocess") as subprocess:
            subprocess.check_output.side_effect = Exception
            res = self.cellular.get_signal_by_id(0)
            self.assertEqual(res, 0)

    def test_get_cops_by_id(self):
        self.cellular = Cellular(connection=Mockup())
        with patch("cellular.modemcmd") as modemcmd:
            modemcmd.return_value = "+COPS: 0,0,\"Chunghwa Telecom\",2\r\nOK"
            res = self.cellular.get_cops_by_id(0)
            self.assertEqual(res, "Chunghwa Telecom")

    def test_get_cops_by_id_fail(self):
        self.cellular = Cellular(connection=Mockup())
        with patch("cellular.modemcmd") as modemcmd:
            modemcmd.return_value = ""
            res = self.cellular.get_cops_by_id(0)
            self.assertEqual(res, "Unknown Operator")

    def test_get_cops_by_id_exception(self):
        self.cellular = Cellular(connection=Mockup())
        with patch("cellular.modemcmd") as modemcmd:
            modemcmd.side_effect = Exception
            res = self.cellular.get_cops_by_id(0)
            self.assertEqual(res, "Unknown Operator")

    def test_get_status_by_id_disconnect(self):
        self.cellular = Cellular(connection=Mockup())
        with patch("cellular.subprocess") as subprocess:
            subprocess.check_output.return_value =\
                "Connection status: 'disconnected'"
            subprocess.call.return_value = True
            res = self.cellular.get_status_by_id(0)
            self.assertEqual(res, 0)

    def test_get_status_by_id_connect(self):
        self.cellular = Cellular(connection=Mockup())
        with patch("cellular.subprocess") as subprocess:
            subprocess.check_output.return_value =\
                "Connection status: 'connected'"
            subprocess.call.return_value = True
            res = self.cellular.get_status_by_id(0)
            self.assertEqual(res, 1)

    def test_get_status_by_id_search_fail(self):
        self.cellular = Cellular(connection=Mockup())
        with patch("cellular.subprocess") as subprocess:
            subprocess.check_output.return_value =\
                "xxxx"
            subprocess.call.return_value = None
            res = self.cellular.get_status_by_id(0)
            self.assertEqual(res, 2)

    def test_get_status_by_id_with_no_cid(self):
        self.cellular = Cellular(connection=Mockup())
        with patch("cellular.subprocess") as subprocess:
            self.cellular.cid = "1234"
            subprocess.check_output.return_value = True
            subprocess.call.return_value = True
            res = self.cellular.get_status_by_id(0)
            self.assertEqual(res, 2)

    def test_get_status_by_id_exception(self):
        self.cellular = Cellular(connection=Mockup())
        with patch("cellular.subprocess") as subprocess:
            subprocess.check_output.side_effect = Exception
            res = self.cellular.get_status_by_id(0)
            self.assertEqual(res, 2)

    def test_set_online_by_id(self):
        self.cellular = Cellular(connection=Mockup())
        self.cellular.model.db = [{'enable': 1,
                                   'name': 'wwan1',
                                   'modemPort': '/dev/ttyS0', 'id': 0,
                                   'atPort': '/dev/ttyS0',
                                   'enableAuth': 1, 'apn': 'internet',
                                   'authType': 'PAP',
                                   'username': '******',
                                   'password': '******'}]
        self.cellular.check_dhclient = Mock()
        with patch("cellular.subprocess") as subprocess:
            subprocess.check_output.\
                return_value = "\
                                Packet data handle: '123'\
                                CID: '23'"
            self.cellular.cid = "1234"
            res = self.cellular.set_online_by_id(0)
            self.assertEqual(res, True)

    def test_set_online_by_id_exception(self):
        self.cellular = Cellular(connection=Mockup())
        with patch("cellular.subprocess") as subprocess:
            subprocess.check_output.side_effect = Exception
            res = self.cellular.set_online_by_id(0)
            self.assertFalse(res)

    def test_set_offline_by_id_with_no_cid(self):
        self.cellular = Cellular(connection=Mockup())
        with patch("cellular.subprocess") as subprocess:
            subprocess.check_output.return_value = True
            self.cellular.cid = ""
            self.cellular.pdh = ""
            res = self.cellular.set_offline_by_id(0)
            self.assertEqual(res, True)

    def test_set_offline_by_id_exception(self):
        self.cellular = Cellular(connection=Mockup())
        with patch("cellular.subprocess") as subprocess:
            subprocess.check_output.side_effect = Exception
            res = self.cellular.set_offline_by_id(0)
            self.assertFalse(res)

    def test_search_name(self):
        self.cellular = Cellular(connection=Mockup())
        self.cellular.dhclient_info = self.filetext
        res = self.cellular.search_name()
        self.assertEqual(res, 'eth0')

    def test_search_name_fail(self):
        self.cellular = Cellular(connection=Mockup())
        self.cellular.dhclient_info = self.filetext_fail
        res = self.cellular.search_name()
        self.assertEqual(res, 'N/A')

    def test_search_router(self):
        self.cellular = Cellular(connection=Mockup())
        self.cellular.dhclient_info = self.filetext
        res = self.cellular.search_router()
        self.assertEqual(res, '192.168.31.115')

    def test_search_router_fail(self):
        self.cellular = Cellular(connection=Mockup())
        self.cellular.dhclient_info = self.filetext_fail
        res = self.cellular.search_router()
        self.assertEqual(res, 'N/A')

    def test_search_dns(self):
        self.cellular = Cellular(connection=Mockup())
        self.cellular.dhclient_info = self.filetext
        res = self.cellular.search_dns()
        self.assertEqual(res, ["8.8.8.58", "20.20.20.20", "40.40.4.1"])

    def test_search_dns_fail(self):
        self.cellular = Cellular(connection=Mockup())
        self.cellular.dhclient_info = self.filetext_fail
        res = self.cellular.search_dns()
        self.assertEqual(res, 'N/A')

    def test_search_ip(self):
        self.cellular = Cellular(connection=Mockup())
        self.cellular.dhclient_info = self.filetext
        res = self.cellular.search_ip()
        self.assertEqual(res, '192.168.10.26')

    def test_search_ip_fail(self):
        self.cellular = Cellular(connection=Mockup())
        self.cellular.dhclient_info = self.filetext_fail
        res = self.cellular.search_ip()
        self.assertEqual(res, 'N/A')

    def test_search_subnet(self):
        self.cellular = Cellular(connection=Mockup())
        self.cellular.dhclient_info = self.filetext
        res = self.cellular.search_subnet()
        self.assertEqual(res, '255.255.0.0')

    def test_search_subnet_fail(self):
        self.cellular = Cellular(connection=Mockup())
        res = self.cellular.search_subnet()
        self.assertEqual(res, 'N/A')

    def test_reconnect_if_disconnected(self):
        self.cellular.model.db = [{'enable': 1,
                                   'modemPort': '/dev/ttyS0',
                                   'atPort': '/dev/ttyS0',
                                   'id': 0, 'apn': 'internet'}]
        self.cellular.get_signal_by_id = Mock(return_value=99)
        self.cellular.set_signal_led = Mock()
        self.cellular.is_target_device_appear = Mock(return_value=False)
        self.cellular.get_status_by_id = Mock(return_value=0)
        self.cellular.get_cops_by_id = Mock(return_value="unknown")
        self.cellular.publish.event = Mock()
        self.cellular.reconnect_if_disconnected()
        self.assertEqual(self.cellular.model.db[0]['signal'], 99)

    def test_reconnect_if_disconnected_operator_fail(self):
        self.cellular.model.db = [{'enable': 1,
                                   'name': "wwan1",
                                   'modemPort': '/dev/ttyS0',
                                   'atPort': '/dev/ttyS0',
                                   'id': 0, 'apn': 'internet'}]
        self.cellular.get_signal_by_id = Mock(return_value=99)
        self.cellular.set_signal_led = Mock()
        self.cellular.is_target_device_appear = Mock(return_value=True)
        self.cellular.get_status_by_id = Mock(return_value=2)
        self.cellular.get_cops_by_id = Mock(return_value="unknown")
        self.cellular.publish.event = Mock()
        self.cellular.reconnect_if_disconnected()
        self.assertEqual(self.cellular.model.db[0]['signal'], 99)

    def test_reconnect_if_disconnected_current_offline_setting_offline(self):
        self.cellular.model.db = [{'enable': 1,
                                   'name': 'wwan1',
                                   'modemPort': '/dev/ttyS0',
                                   'atPort': '/dev/ttyS0',
                                   'enable': 0,
                                   'id': 0, 'apn': 'internet'}]
        self.cellular.get_signal_by_id = Mock(return_value=99)
        self.cellular.set_signal_led = Mock()
        self.cellular.is_target_device_appear = Mock(return_value=True)
        self.cellular.get_status_by_id = Mock(return_value=0)
        self.cellular.get_cops_by_id = Mock(return_value="unknown")
        self.cellular.publish.event = Mock()
        self.cellular.reconnect_if_disconnected()
        self.assertEqual(self.cellular.model.db[0]['signal'], 99)

    def test_reconnect_if_disconnected_when_disconnect_and_enable_true(self):
        self.cellular.model.db = [{'enable': 1,
                                   'name': "wwan1",
                                   'modemPort': '/dev/ttyS0',
                                   'atPort': '/dev/ttyS0',
                                   'id': 0, 'apn': 'internet'}]
        self.cellular.is_target_device_appear = Mock(return_value=True)
        self.cellular.get_signal_by_id = Mock(return_value=78)
        self.cellular.set_signal_led = Mock()
        self.cellular.get_status_by_id = Mock(return_value=0)
        self.cellular.get_cops_by_id = Mock(return_value="unknown")
        self.cellular.is_leases_file_appear = Mock(return_value=self.filetext)
        self.cellular.set_offline_by_id = Mock()
        self.cellular.set_online_by_id = Mock()
        self.cellular.publish.event = Mock()
        self.cellular.reconnect_if_disconnected()
        self.assertEqual(self.cellular.model.db[0]['signal'], 78)

    def test_reconnect_if_disconnected_when_connect_and_enable_false(self):
        self.cellular.model.db = [{'enable': 0,
                                   'name': 'wwan1',
                                   'atPort': '/dev/ttyS0',
                                   'modemPort': '/dev/ttyS0', 'id': 0}]
        self.cellular.is_target_device_appear = Mock(return_value=True)
        self.cellular.get_signal_by_id = Mock(return_value=78)
        self.cellular.set_signal_led = Mock()
        self.cellular.get_status_by_id = Mock(return_value=1)
        self.cellular.get_cops_by_id = Mock(return_value="unknown")
        self.cellular.is_leases_file_appear = Mock(return_value=self.filetext)
        self.cellular.publish.event = Mock()
        self.cellular.reconnect_if_disconnected()
        self.assertEqual(self.cellular.model.db[0]['signal'], 78)

    def test_reconnect_if_disconnected_when_disconnect_and_enable_false(self):
        self.cellular.model.db = [{'enable': 1,
                                   'name': "wwan1",
                                   'atPort': '/dev/ttyS0',
                                   'modemPort': '/dev/ttyS0', 'id': 0}]
        self.cellular.is_target_device_appear = Mock(return_value=True)
        self.cellular.get_signal_by_id = Mock(return_value=78)
        self.cellular.set_signal_led = Mock()
        self.cellular.get_status_by_id = Mock(return_value=1)
        self.cellular.get_cops_by_id = Mock(return_value="unknown")
        self.cellular.is_leases_file_appear = Mock(return_value=self.filetext)
        self.cellular.publish.event = Mock()
        self.cellular.reconnect_if_disconnected()
        self.assertEqual(self.cellular.model.db[0]['signal'], 78)

    def test_is_target_device_appear(self):
        res = self.cellular.is_target_device_appear('data/cellular.json')
        self.assertEqual(res, True)

    def test_is_target_device_appear_false(self):
        res = self.cellular.is_target_device_appear('/dev/asdfasdf')
        self.assertEqual(res, False)

    def test_init(self):
        with patch("cellular.ModelInitiator") as model:
            model.return_value.db.__getitem__.return_value = 1
            self.cellular.set_pincode_by_id = Mock(return_value=True)
            self.cellular.init()
예제 #3
0
class TestCellular(unittest.TestCase):

    filetext = "\
    lease {\n\
      interface \"eth0\";\n\
      fixed-address 192.168.10.26;\n\
      option subnet-mask 255.255.0.0;\n\
      option routers 192.168.31.115;\n\
      option dhcp-lease-time 5566;\n\
      option dhcp-message-type 5;\n\
      option domain-name-servers 8.8.8.58,20.20.20.20,40.40.4.1;\n\
      option dhcp-server-identifier 192.168.31.115;\n\
      option domain-name \"MXcloud115\";\n\
      renew 3 2014/10/29 12:52:19;\n\
      rebind 3 2014/10/29 13:37:52;\n\
      expire 3 2014/10/29 13:49:28;\n\
      }\n\
      "
    filetext_fail = " "

    def setUp(self):
        def zombiefn():
            pass
        self.cellular = Cellular(connection=Mockup())

    def tearDown(self):
        self.cellular = None

    @patch("cellular.subprocess")
    def test1_put(self, subprocess):
        subprocess.check_output.return_value = True
        subprocess.call.return_value = True
        test_msg = {
            "id": 12345,
            "method": "put",
            "param": {"id": "1"},
            "resource": "/network/cellulars"
        }

        # case 1: no data attribute
        def resp1(code=200, data=None):
            self.assertEqual(400, code)
            self.assertEqual(data, {"message": "Invalid Input."})
        message = Message(test_msg)
        self.cellular.put_root_by_id(message, response=resp1, test=True)

        # case 2: data dict is empty or no enable exist
        def resp2(code=200, data=None):
            self.assertEqual(400, code)
            self.assertEqual(data, {"message": "No such resources."})
        test_msg["data"] = dict()
        message = Message(test_msg)
        self.cellular.put_root_by_id(message, response=resp2, test=True)

        # case 3: data not found
        def resp3(code=200, data=None):
            self.assertEqual(400, code)
            self.assertEqual(data, {"message": "No such resources."})
        test_msg["data"] = {"path": "abcde"}
        message = Message(test_msg)
        self.cellular.id = 1
        self.cellular.put_root_by_id(message, response=resp3, test=True)

    def test2_put(self):
        test_msg = {
            "id": 1,
            "method": "put",
            "param": {"id": "1"},
            "resource": "/network/cellulars"
            }

        # case 1: data valid. test do not check message coming back
        def resp1(code=200, data=None):
            self.assertEqual(200, code)
            self.assertDictContainsSubset(data, {"id": 1,
                                                 "apn": "internet",
                                                 "username": "******",
                                                 "enable": 0,
                                                 "name": "ppp",
                                                 "ip": "",
                                                 "gateway": "",
                                                 "dns": "",
                                                 "dialNumber": "9999",
                                                 "password": "",
                                                 "pinCode": "",
                                                 "modemPort": "/dev/cdc-wdm1",
                                                 "enableAuth": 0,
                                                 "modes": "default",
                                                 "delay": 40
                                                 })
        test_msg["data"] = {"username": "******", "dialNumber": "9999"}
        message = Message(test_msg)
        self.cellular.put_root_by_id(message, response=resp1, test=True)

        # case 2: data
        def resp2(code=200, data=None):
            self.assertEqual(200, code)
        self.cellular.get_root_by_id(message, response=resp2, test=True)

        # case 3: data
        def resp3(code=200, data=None):
            self.assertEqual(200, code)
            self.assertDictContainsSubset(data, {"id": 1,
                                                 "apn": "internet",
                                                 "username": "******",
                                                 "enable": 1,
                                                 "name": "ppp",
                                                 "ip": "",
                                                 "gateway": "",
                                                 "dns": "",
                                                 "dialNumber": "9999",
                                                 "password": "",
                                                 "pinCode": "",
                                                 "modemPort": "/dev/cdc-wdm1",
                                                 "enableAuth": 0,
                                                 "modes": "default",
                                                 "delay": 40
                                                 })
        test_msg["data"] = {"enable": 1}
        message = Message(test_msg)
        self.cellular.put_root_by_id(message, response=resp3, test=True)

        # case 4: data
        def resp4(code=200, data=None):
            self.assertEqual(200, code)
            self.assertDictContainsSubset(data, {"id": 1,
                                                 "apn": "hinet",
                                                 "username": "******",
                                                 "enable": 1,
                                                 "name": "ppp",
                                                 "ip": "",
                                                 "gateway": "",
                                                 "dns": "",
                                                 "dialNumber": "9999",
                                                 "password": "",
                                                 "pinCode": "",
                                                 "modemPort": "/dev/cdc-wdm1",
                                                 "enableAuth": 0,
                                                 "modes": "default",
                                                 "delay": 40
                                                 })
        test_msg["data"] = {"apn": "hinet"}
        message = Message(test_msg)
        self.cellular.put_root_by_id(message, response=resp4, test=True)

        # case 5: data
        def resp5(code=200, data=None):
            self.assertEqual(200, code)
            self.assertDictContainsSubset(data, {"id": 1,
                                                 "apn": "hinet",
                                                 "username": "******",
                                                 "enable": 1,
                                                 "name": "ppp",
                                                 "ip": "",
                                                 "gateway": "",
                                                 "dns": "",
                                                 "dialNumber": "9999",
                                                 "password": "",
                                                 "pinCode": "",
                                                 "modemPort": "/dev/cdc-wdm1",
                                                 "enableAuth": 0,
                                                 "modes": "default",
                                                 "delay": 40
                                                 })
        test_msg["data"] = {"username": "******"}
        message = Message(test_msg)
        self.cellular.put_root_by_id(message, response=resp5, test=True)

        # case 6: data
        def resp6(code=200, data=None):
            self.assertEqual(200, code)
            self.assertDictContainsSubset(data, {"id": 1,
                                                 "apn": "hinet",
                                                 "username": "******",
                                                 "enable": 1,
                                                 "name": "root",
                                                 "ip": "",
                                                 "gateway": "",
                                                 "dns": "",
                                                 "dialNumber": "9999",
                                                 "password": "",
                                                 "pinCode": "",
                                                 "modemPort": "/dev/cdc-wdm1",
                                                 "enableAuth": 0,
                                                 "modes": "default",
                                                 "delay": 40
                                                 })
        test_msg["data"] = {"name": "root"}
        message = Message(test_msg)
        self.cellular.put_root_by_id(message, response=resp6, test=True)

        # case 7: data
        def resp7(code=200, data=None):
            self.assertEqual(200, code)
            self.assertDictContainsSubset(data, {"id": 1,
                                                 "apn": "hinet",
                                                 "username": "******",
                                                 "enable": 1,
                                                 "name": "root",
                                                 "ip": "",
                                                 "gateway": "",
                                                 "dns": "",
                                                 "dialNumber": "*88#",
                                                 "password": "",
                                                 "pinCode": "",
                                                 "modemPort": "/dev/cdc-wdm1",
                                                 "enableAuth": 0,
                                                 "modes": "default",
                                                 "delay": 40
                                                 })
        test_msg["data"] = {"dialNumber": "*88#"}
        message = Message(test_msg)
        self.cellular.put_root_by_id(message, response=resp7, test=True)

        # case 8: data
        def resp8(code=200, data=None):
            self.assertEqual(200, code)
            self.assertDictContainsSubset(data, {"id": 1,
                                                 "apn": "hinet",
                                                 "username": "******",
                                                 "enable": 1,
                                                 "name": "root",
                                                 "ip": "",
                                                 "gateway": "",
                                                 "dns": "",
                                                 "dialNumber": "*88#",
                                                 "password": "******",
                                                 "pinCode": "",
                                                 "modemPort": "/dev/cdc-wdm1",
                                                 "enableAuth": 0,
                                                 "modes": "default",
                                                 "delay": 40
                                                 })
        test_msg["data"] = {"password": "******"}
        message = Message(test_msg)
        self.cellular.put_root_by_id(message, response=resp8, test=True)

        # case 9: data
        def resp9(code=200, data=None):
            self.assertEqual(200, code)
            self.assertDictContainsSubset(data, {"id": 1,
                                                 "apn": "hinet",
                                                 "username": "******",
                                                 "enable": 1,
                                                 "name": "root",
                                                 "ip": "",
                                                 "gateway": "",
                                                 "dns": "",
                                                 "dialNumber": "*88#",
                                                 "password": "******",
                                                 "pinCode": "89191230",
                                                 "modemPort": "/dev/cdc-wdm1",
                                                 "enableAuth": 0,
                                                 "modes": "default",
                                                 "delay": 40
                                                 })
        test_msg["data"] = {"pinCode": "89191230"}
        message = Message(test_msg)
        self.cellular.put_root_by_id(message, response=resp9, test=True)

        # case 10: data
        def resp10(code=200, data=None):
            self.assertEqual(200, code)
            self.assertDictContainsSubset(data, {"id": 1,
                                                 "apn": "hinet",
                                                 "username": "******",
                                                 "enable": 1,
                                                 "name": "root",
                                                 "ip": "",
                                                 "gateway": "",
                                                 "dns": "",
                                                 "dialNumber": "*88#",
                                                 "password": "******",
                                                 "pinCode": "89191230",
                                                 "modemPort": "/dev/cdc-wdm1",
                                                 "enableAuth": 1,
                                                 "modes": "default",
                                                 "delay": 40
                                                 })
        test_msg["data"] = {"enableAuth": 1}
        message = Message(test_msg)
        self.cellular.put_root_by_id(message, response=resp10, test=True)

        # case 11: data
        def resp11(code=400, data=None):
            self.assertEqual(400, code)
            self.assertEqual(data, {"message": "No such id resources."})
        test_msg["data"] = {"id": "5"}
        message = Message(test_msg)
        self.cellular.model.db = ''
        self.cellular.get_root_by_id(message, response=resp11, test=True)

    def test_get(self):
        test_msg = {
            "id": 1,
            "method": "get",
            "resource": "/network/cellulars"
            }

        # case 1: data
        def resp1(code=200, data=None):
            self.assertEqual(200, code)
            self.assertDictContainsSubset(data[1], {"id": 1,
                                                    "apn": "internet",
                                                    "username": "",
                                                    "enable": 0,
                                                    "name": "ppp",
                                                    "ip": "",
                                                    "gateway": "",
                                                    "dns": "",
                                                    "dialNumber": "*99#",
                                                    "password": "",
                                                    "pinCode": "",
                                                    "modemPort":
                                                    "/dev/cdc-wdm1",
                                                    "enableAuth": 0,
                                                    "modes": "default",
                                                    "delay": 40
                                                    })
        message = Message(test_msg)
        self.cellular.get_root(message, response=resp1, test=True)

    def test_get_signal_by_id(self):
        self.cellular = Cellular(connection=Mockup())
        with patch("cellular.subprocess") as subprocess:
            subprocess.check_output.return_value = True
            res = self.cellular.get_signal_by_id('1')
            self.assertEqual(res, 99)

    def test_get_signal_by_id_exception(self):
        self.cellular = Cellular(connection=Mockup())
        with patch("cellular.subprocess") as subprocess:
            subprocess.check_output.side_effect = Exception
            res = self.cellular.get_signal_by_id('1')
            self.assertEqual(res, 99)

    def test_get_status_by_id(self):
        self.cellular = Cellular(connection=Mockup())
        with patch("cellular.subprocess") as subprocess:
            subprocess.call.return_value = True
            res = self.cellular.get_status_by_id('1')
            self.assertEqual(res, 'disconnected')

    def test_get_status_by_id_exception(self):
        self.cellular = Cellular(connection=Mockup())
        with patch("cellular.subprocess") as subprocess:
            subprocess.check_output.side_effect = Exception
            res = self.cellular.get_status_by_id('1')
            self.assertEqual(res, 'disconnected')

    def test_set_online_by_id(self):
        self.cellular = Cellular(connection=Mockup())
        with patch("cellular.subprocess") as subprocess:
            subprocess.call.return_value = True
            res = self.cellular.set_online_by_id('1')
            self.assertEqual(res, 'success')

    def test_set_online_by_id_exception(self):
        self.cellular = Cellular(connection=Mockup())
        with patch("cellular.subprocess") as subprocess:
            subprocess.check_output.side_effect = Exception
            res = self.cellular.set_online_by_id('1')
            self.assertEqual(res, 'fail')

    def test_set_offline_by_id(self):
        self.cellular = Cellular(connection=Mockup())
        with patch("cellular.subprocess") as subprocess:
            subprocess.call.return_value = True
            res = self.cellular.set_offline_by_id('1')
            self.assertEqual(res, 'success')

    def test_set_offline_by_id_exception(self):
        self.cellular = Cellular(connection=Mockup())
        with patch("cellular.subprocess") as subprocess:
            subprocess.check_output.side_effect = Exception
            res = self.cellular.set_offline_by_id('1')
            self.assertEqual(res, 'fail')

    def test_search_name(self):
        self.cellular = Cellular(connection=Mockup())
        res = self.cellular.search_name(self.filetext)
        self.assertEqual(res, 'eth0')

    def test_search_name_fail(self):
        self.cellular = Cellular(connection=Mockup())
        res = self.cellular.search_name(self.filetext_fail)
        self.assertEqual(res, 'N/A')

    def test_search_router(self):
        self.cellular = Cellular(connection=Mockup())
        res = self.cellular.search_router(self.filetext)
        self.assertEqual(res, '192.168.31.115')

    def test_search_router_fail(self):
        self.cellular = Cellular(connection=Mockup())
        res = self.cellular.search_router(self.filetext_fail)
        self.assertEqual(res, 'N/A')

    def test_search_dns(self):
        self.cellular = Cellular(connection=Mockup())
        res = self.cellular.search_dns(self.filetext)
        self.assertEqual(res, '8.8.8.58,20.20.20.20,40.40.4.1')

    def test_search_dns_fail(self):
        self.cellular = Cellular(connection=Mockup())
        res = self.cellular.search_dns(self.filetext_fail)
        self.assertEqual(res, 'N/A')

    def test_search_ip(self):
        self.cellular = Cellular(connection=Mockup())
        res = self.cellular.search_ip(self.filetext)
        self.assertEqual(res, '192.168.10.26')

    def test_search_ip_fail(self):
        self.cellular = Cellular(connection=Mockup())
        res = self.cellular.search_ip(self.filetext_fail)
        self.assertEqual(res, 'N/A')

    def test_search_subnet(self):
        self.cellular = Cellular(connection=Mockup())
        res = self.cellular.search_subnet(self.filetext)
        self.assertEqual(res, '255.255.0.0')

    def test_search_subnet_fail(self):
        self.cellular = Cellular(connection=Mockup())
        res = self.cellular.search_subnet(self.filetext_fail)
        self.assertEqual(res, 'N/A')

    def test_reconnect_if_disconnected(self):
        self.cellular.model.db = [{'enable': 1,
                                   'modemPort': '/dev/ttyS0', 'id': '0'}]
        self.cellular.get_signal_by_id = Mock(return_value=99)
        self.cellular.is_target_device_appear = Mock(return_value=False)
        self.cellular.get_status_by_id = Mock(return_value='disconnected')
        self.cellular.reconnect_if_disconnected()
        self.assertEqual(self.cellular.model.db[0]['signal'], 99)

    def test_reconnect_if_disconnected_when_disconnect_and_enable_true(self):
        self.cellular.model.db = [{'enable': 1,
                                   'modemPort': '/dev/ttyS0', 'id': '0'}]
        self.cellular.is_target_device_appear = Mock(return_value=True)
        self.cellular.get_signal_by_id = Mock(return_value=78)
        self.cellular.get_status_by_id = Mock(return_value="'disconnected'")
        self.cellular.is_leases_file_appear = Mock(return_value=self.filetext)
        self.cellular.reconnect_if_disconnected()
        self.assertEqual(self.cellular.model.db[0]['signal'], 78)

    def test_reconnect_if_disconnected_when_disconnect_and_enable_false(self):
        self.cellular.model.db = [{'enable': 1,
                                   'modemPort': '/dev/ttyS0', 'id': '0'}]
        self.cellular.is_target_device_appear = Mock(return_value=True)
        self.cellular.get_signal_by_id = Mock(return_value=78)
        self.cellular.get_status_by_id = Mock(return_value="'connected'")
        self.cellular.is_leases_file_appear = Mock(return_value=self.filetext)
        self.cellular.reconnect_if_disconnected()
        self.assertEqual(self.cellular.model.db[0]['signal'], 78)

    def test_is_leases_file_appear_true(self):
        m = mock_open()
        with patch("cellular.open", m, create=True):
            res = self.cellular.is_leases_file_appear()
            self.assertEqual(res, '')

    def test_is_leases_file_appear_false(self):
        res = self.cellular.is_leases_file_appear()
        self.assertEqual(res, '')

    def test_is_target_device_appear(self):
        res = self.cellular.is_target_device_appear('data/cellular.json')
        self.assertEqual(res, True)

    def test_is_target_device_appear_false(self):
        res = self.cellular.is_target_device_appear('/dev/asdfasdf')
        self.assertEqual(res, False)

    def test_init(self):
        with patch("cellular.ModelInitiator") as model:
            model.return_value.db.__getitem__.return_value = 1
            self.cellular.init()