def testStartupPeriodicInformInterval(self): ms.PERIODIC_CALLBACK = MockPeriodicCallback cpe_ms = ms.CpeManagementServer(acs_config=FakeAcsConfig(), port=0, ping_path='/') for _ in range(5): self.assertEqual(60, cpe_ms.PeriodicInformInterval) cpe_ms.SuccessfulSession() self.assertEqual(15 * 60, cpe_ms.PeriodicInformInterval) cpe_ms = ms.CpeManagementServer(acs_config=FakeAcsConfig(), port=0, ping_path='/') self.assertEqual(60, cpe_ms.PeriodicInformInterval) cpe_ms.SuccessfulSession() cpe_ms.PeriodicInformInterval = 900 self.assertEqual(900, cpe_ms.PeriodicInformInterval)
def __init__(self, ip, cpe, listenport, platform_config, ping_path, acs_url=None, ping_ip6dev=None, fetch_args=dict(), ioloop=None, restrict_acs_hosts=None): self.cpe = cpe self.cpe_soap = api_soap.CPE(self.cpe) self.encode = api_soap.Encode() self.outstanding = None self.response_queue = [] self.request_queue = [] self.event_queue = LimitDeque(MAX_EVENT_QUEUE_SIZE, self.EventQueueHandler) self.ioloop = ioloop or tornado.ioloop.IOLoop.instance() self.retry_count = 0 # for Inform.RetryCount self.start_session_timeout = None # timer for CWMPRetryInterval self.session = None self.my_configured_ip = ip self.ping_ip6dev = ping_ip6dev self.fetch_args = fetch_args self.rate_limit_seconds = 60 self.platform_config = platform_config self.previous_ping_time = 0 self.ping_timeout_pending = None self._changed_parameters = set() self._changed_parameters_sent = set() self.cpe_management_server = cpe_management_server.CpeManagementServer( acs_url=acs_url, platform_config=platform_config, port=listenport, ping_path=ping_path, get_parameter_key=cpe.getParameterKey, start_periodic_session=self.NewPeriodicSession, ioloop=self.ioloop, restrict_acs_hosts=restrict_acs_hosts)
def testTransaction(self): cpe_ms = ms.CpeManagementServer(platform_config=None, port=5, ping_path='/', restrict_acs_hosts='.gfsvc.com') orig = copy.deepcopy(cpe_ms.config) # sanity self.assertEqual(orig.CWMPRetryMinimumWaitInterval, cpe_ms.CWMPRetryMinimumWaitInterval) cpe_ms.StartTransaction() cpe_ms.AbandonTransaction() self.assertEqual(orig.CWMPRetryMinimumWaitInterval, cpe_ms.CWMPRetryMinimumWaitInterval) cpe_ms.StartTransaction() cpe_ms.CommitTransaction() self.assertEqual(orig.CWMPRetryMinimumWaitInterval, cpe_ms.CWMPRetryMinimumWaitInterval) cpe_ms.StartTransaction() cpe_ms.CWMPRetryMinimumWaitInterval *= 2 cpe_ms.AbandonTransaction() self.assertEqual(orig.CWMPRetryMinimumWaitInterval, cpe_ms.CWMPRetryMinimumWaitInterval) cpe_ms.StartTransaction() cpe_ms.CWMPRetryMinimumWaitInterval *= 2 cpe_ms.CommitTransaction() self.assertEqual(orig.CWMPRetryMinimumWaitInterval * 2, cpe_ms.CWMPRetryMinimumWaitInterval)
def testGetSessionTimeout(self): cpe_ms = ms.CpeManagementServer(acs_config=FakeAcsConfig(), port=0, ping_path='/') self.assertEqual(cpe_ms.GetTimeout('/no_such_file_at_this_path'), 60) self.assertEqual( cpe_ms.GetTimeout('testdata/cpe_management_server/garbage'), 60) self.assertEqual( cpe_ms.GetTimeout('testdata/cpe_management_server/timeout'), 120)
def testIsIp6Address(self): cpe_ms = ms.CpeManagementServer(platform_config=FakePlatformConfig(), port=5, ping_path='/ping/path') self.assertTrue(cpe_ms._isIp6Address('fe80::21d:9ff:fe11:f55f')) self.assertTrue( cpe_ms._isIp6Address('2620:0:1000:5200:222:3ff:fe44:5555')) self.assertFalse(cpe_ms._isIp6Address('1.2.3.4')) self.assertFalse(cpe_ms._isIp6Address('foobar'))
def testConnectionRequestURL(self): cpe_ms = ms.CpeManagementServer(platform_config=FakePlatformConfig(), port=5, ping_path='/ping/path') cpe_ms.my_ip = '1.2.3.4' self.assertEqual(cpe_ms.ConnectionRequestURL, 'http://1.2.3.4:5/ping/path') cpe_ms.my_ip = '2620:0:1000:5200:222:3ff:fe44:5555' self.assertEqual( cpe_ms.ConnectionRequestURL, 'http://[2620:0:1000:5200:222:3ff:fe44:5555]:5/ping/path')
def testValidateServer(self): def TryUrl(cpe, value): valid = True try: cpe_ms.ValidateAcsUrl(value) except ValueError: valid = False return valid cpe_ms = ms.CpeManagementServer( platform_config=FakePlatformConfig(), port=5, ping_path='/', restrict_acs_hosts='google.com .gfsvc.com foo.com') self.assertTrue(TryUrl(cpe_ms, 'https://bugger.gfsvc.com')) self.assertTrue(TryUrl(cpe_ms, 'https://acs.prod.gfsvc.com')) self.assertTrue(TryUrl(cpe_ms, 'https://acs.prod.google.com')) self.assertTrue(TryUrl(cpe_ms, 'https://google.com')) self.assertFalse(TryUrl(cpe_ms, 'https://imposter.evilgfsvc.com')) self.assertFalse(TryUrl(cpe_ms, 'https://evilgfsvc.com')) self.assertFalse(TryUrl(cpe_ms, 'https://gfsvc.com.evil.com')) # No restrictions cpe_ms = ms.CpeManagementServer(platform_config=FakePlatformConfig(), port=5, ping_path='/') self.assertTrue(TryUrl(cpe_ms, 'https://bugger.gfsvc.com')) self.assertTrue(TryUrl(cpe_ms, 'https://gfsvc.com.evil.com')) # Single domain cpe_ms = ms.CpeManagementServer(platform_config=FakePlatformConfig(), port=5, ping_path='/', restrict_acs_hosts='.gfsvc.com') self.assertTrue(TryUrl(cpe_ms, 'https://bugger.gfsvc.com')) self.assertTrue(TryUrl(cpe_ms, 'https://acs.prod.gfsvc.com')) self.assertFalse(TryUrl(cpe_ms, 'https://acs.prod.google.com')) self.assertFalse(TryUrl(cpe_ms, 'https://google.com')) self.assertFalse(TryUrl(cpe_ms, 'https://imposter.evilgfsvc.com')) self.assertFalse(TryUrl(cpe_ms, 'https://evilgfsvc.com')) self.assertFalse(TryUrl(cpe_ms, 'https://gfsvc.com.evil.com'))
def testAcsUrl(self): pc = MockPlatformConfig() cpe_ms = ms.CpeManagementServer(platform_config=pc, port=0, ping_path='') self.assertEqual(cpe_ms.URL, 'http://acs.example.com/cwmp') self.assertRaises(AttributeError, cpe_ms.SetURL, 'http://example.com/') self.assertTrue(pc.set_acs_url_called) pc.set_acs_raise = False pc.set_acs_url_called = False cpe_ms.URL = 'http://example.com/' self.assertTrue(pc.set_acs_url_called) self.assertEqual(pc.acs_url, 'http://example.com/')
def testInvalidateUrl(self): mock_config = MockAcsConfig() mock_config.acs_url_list = [ 'http://foo1.com', 'https://foo.prod.gfsvc.com', 'http://foow2.com' ] cpe_ms = ms.CpeManagementServer(acs_config=mock_config, port=5, ping_path='/', restrict_acs_hosts='.gfsvc.com') self.assertEqual('https://foo.prod.gfsvc.com', cpe_ms.URL) self.assertEqual(2, len(mock_config.acs_url_list)) mock_config.acs_url_list = ['http://foo1.com', 'http://foow2.com'] self.assertEqual(None, cpe_ms.URL)
def testWriteParameters(self): cpe_ms = ms.CpeManagementServer(platform_config=None, port=5, ping_path='/', restrict_acs_hosts='.gfsvc.com') cpe_ms.CWMPRetryMinimumWaitInterval = 10 cpe_ms.CWMPRetryIntervalMultiplier = 100 cpe_ms.ConnectionRequestPassword = '******' cpe_ms.ConnectionRequestUsername = '******' cpe_ms.DefaultActiveNotificationThrottle = True cpe_ms.PeriodicInformEnable = True cpe_ms.PeriodicInformInterval = 10 cpe_ms.PeriodicInformTime = '2012-08-22T15:50:14.725772Z' cpe_ms.Password = '******' cpe_ms.Username = '******'
def testPeriodicLongInterval(self): ms.PERIODIC_CALLBACK = MockPeriodicCallback io = MockIoloop() cpe_ms = ms.CpeManagementServer( platform_config=FakePlatformConfig(), port=0, ping_path='/', start_periodic_session=self.start_session, ioloop=io) cpe_ms.PeriodicInformEnable = 'true' cpe_ms.PeriodicInformTime = cwmpdate.format(datetime.datetime.now()) cpe_ms.PeriodicInformInterval = '1200' # Just check that the delay is reasonable self.assertNotEqual(io.timeout_time, datetime.timedelta(seconds=0))
def testReadParameters(self): cpe_ms = ms.CpeManagementServer(platform_config=None, port=5, ping_path='/', restrict_acs_hosts='.gfsvc.com') _ = cpe_ms.CWMPRetryMinimumWaitInterval _ = cpe_ms.CWMPRetryIntervalMultiplier _ = cpe_ms.ConnectionRequestPassword _ = cpe_ms.ConnectionRequestUsername _ = cpe_ms.DefaultActiveNotificationThrottle _ = cpe_ms.EnableCWMP _ = cpe_ms.PeriodicInformEnable _ = cpe_ms.PeriodicInformInterval _ = cpe_ms.PeriodicInformTime _ = cpe_ms.Password _ = cpe_ms.Username
def testPeriodicEnable(self): ms.PERIODIC_CALLBACK = MockPeriodicCallback cpe_ms = ms.CpeManagementServer( acs_config=FakeAcsConfig(), port=0, ping_path='/', start_periodic_session=self.start_session) cpe_ms.PeriodicInformEnable = 'true' cpe_ms.PeriodicInformInterval = '15' loop = mainloop.MainLoop() loop.RunOnce() # cpe_ms should schedule the callbacks when Enable and Interval both set self.assertEqual(len(periodic_callbacks), 1) cb = periodic_callbacks[0] self.assertTrue(cb.callback) self.assertGreater(cb.callback_time, 0)
def __init__(self, ip, cpe, listenport, acs_config, ping_path, acs_url=None, fetch_args=None, ioloop=None, restrict_acs_hosts=None): tornado.httpclient.AsyncHTTPClient.configure( 'tornado.curl_httpclient.CurlAsyncHTTPClient') # pylint:disable=protected-access oldcreate = tornado.curl_httpclient._curl_create tornado.curl_httpclient._curl_create = ( lambda *args, **kwargs: CurlCreator(oldcreate, *args, **kwargs)) # pylint:enable=protected-access self.cpe = cpe self.cpe_soap = api_soap.CPE(self.cpe) self.encode = api_soap.Encode() self.cwmplogger = cwmplog.Logger(full_logs=10) self.outstanding = None self.response_queue = [] self.request_queue = [] self.event_queue = LimitDeque(MAX_EVENT_QUEUE_SIZE, self.EventQueueHandler) self.ioloop = ioloop or tornado.ioloop.IOLoop.instance() self.retry_count = 0 # for Inform.RetryCount self.start_session_timeout = None # timer for CWMPRetryInterval self.session = None self.my_configured_ip = ip self.fetch_args = fetch_args or dict() self.ping_rate_limit_seconds = 2 self.previous_ping_time = 0 self.ping_timeout_pending = None self._changed_parameters = set() self._changed_parameters_sent = set() self._acs_config = acs_config self.cpe_management_server = cpe_management_server.CpeManagementServer( acs_url=acs_url, acs_config=acs_config, port=listenport, ping_path=ping_path, get_parameter_key=cpe.getParameterKey, start_periodic_session=self.NewPeriodicSession, ioloop=self.ioloop, restrict_acs_hosts=restrict_acs_hosts) self.last_success_response = 0 # used by DiagUI self.num_599_responses = 0 self._acs_disabled_until = None try: notifier = filenotifier.FileNotifier(mainloop.MainLoop()) self.watch_acs_disabled = notifier.WatchObj(self._AcsDisabledFilename(), self._UpdateAcsDisabled) self._UpdateAcsDisabled() except pyinotify.WatchManagerError: print 'cwmp temp dir (%s) does not exist' % CWMP_TMPDIR
def testSessionRetryWait(self): """Test $SPEC3 Table3 timings.""" cpe_ms = ms.CpeManagementServer(platform_config=FakePlatformConfig(), port=5, ping_path='/') cpe_ms.PeriodicInformInterval = 100000 for _ in range(1000): self.assertEqual(cpe_ms.SessionRetryWait(0), 0) self.assertTrue(5 <= cpe_ms.SessionRetryWait(1) <= 10) self.assertTrue(10 <= cpe_ms.SessionRetryWait(2) <= 20) self.assertTrue(20 <= cpe_ms.SessionRetryWait(3) <= 40) self.assertTrue(40 <= cpe_ms.SessionRetryWait(4) <= 80) self.assertTrue(80 <= cpe_ms.SessionRetryWait(5) <= 160) self.assertTrue(160 <= cpe_ms.SessionRetryWait(6) <= 320) self.assertTrue(320 <= cpe_ms.SessionRetryWait(7) <= 640) self.assertTrue(640 <= cpe_ms.SessionRetryWait(8) <= 1280) self.assertTrue(1280 <= cpe_ms.SessionRetryWait(9) <= 2560) self.assertTrue(2560 <= cpe_ms.SessionRetryWait(10) <= 5120) self.assertTrue(2560 <= cpe_ms.SessionRetryWait(99) <= 5120) cpe_ms.CWMPRetryMinimumWaitInterval = 10 cpe_ms.CWMPRetryIntervalMultiplier = 2500 for _ in range(1000): self.assertEqual(cpe_ms.SessionRetryWait(0), 0) self.assertTrue(10 <= cpe_ms.SessionRetryWait(1) <= 25) self.assertTrue(25 <= cpe_ms.SessionRetryWait(2) <= 62) self.assertTrue(62 <= cpe_ms.SessionRetryWait(3) <= 156) self.assertTrue(156 <= cpe_ms.SessionRetryWait(4) <= 390) self.assertTrue(390 <= cpe_ms.SessionRetryWait(5) <= 976) self.assertTrue(976 <= cpe_ms.SessionRetryWait(6) <= 2441) self.assertTrue(2441 <= cpe_ms.SessionRetryWait(7) <= 6103) self.assertTrue(6103 <= cpe_ms.SessionRetryWait(8) <= 15258) self.assertTrue(15258 <= cpe_ms.SessionRetryWait(9) <= 38146) self.assertTrue(38146 <= cpe_ms.SessionRetryWait(10) <= 95367) self.assertTrue(38146 <= cpe_ms.SessionRetryWait(99) <= 95367) # Check that the time never exceeds the periodic inform time. cpe_ms.PeriodicInformInterval = 30 for _ in range(1000): self.assertEqual(cpe_ms.SessionRetryWait(0), 0) self.assertTrue(10 <= cpe_ms.SessionRetryWait(1) <= 25) self.assertTrue(12 <= cpe_ms.SessionRetryWait(2) <= 30) self.assertTrue(12 <= cpe_ms.SessionRetryWait(3) <= 30)
def testPeriodicEnable(self): ms.PERIODIC_CALLBACK = MockPeriodicCallback io = MockIoloop() cpe_ms = ms.CpeManagementServer( platform_config=FakePlatformConfig(), port=0, ping_path='/', start_periodic_session=self.start_session, ioloop=io) cpe_ms.PeriodicInformEnable = 'true' cpe_ms.PeriodicInformInterval = '15' # cpe_ms should schedule the callbacks when Enable and Interval both set self.assertEqual(io.timeout_time, datetime.timedelta(0.0)) self.assertEqual(len(periodic_callbacks), 1) cb = periodic_callbacks[0] self.assertTrue(cb.callback) self.assertEqual(cb.callback_time, 15 * 1000) self.assertEqual(cb.io_loop, io) io.timeout_callback() self.assertTrue(cb.start_called)
def testAcsUrl(self): conman_dir = tempfile.mkdtemp() try: pc = MockAcsConfig() cpe_ms = ms.CpeManagementServer(acs_config=pc, port=0, ping_path='', conman_dir=conman_dir) self.assertEqual(cpe_ms.URL, 'http://acs.example.com/cwmp') self.assertRaises(AttributeError, cpe_ms.SetURL, 'http://example.com/') self.assertTrue(pc.set_acs_url_called) pc.set_acs_raise = False pc.set_acs_url_called = False cpe_ms.URL = 'http://example.com/' self.assertTrue(pc.set_acs_url_called) self.assertEqual(pc.acs_url_list[0], 'http://example.com/') self.assertEqual(cpe_ms.URL, 'http://example.com/') # Test URLs which already contain GET params. cpe_ms.URL = 'http://example.com/?foo=bar' self.assertEqual(pc.acs_url_list[0], 'http://example.com/?foo=bar') self.assertEqual(cpe_ms.URL, 'http://example.com/?foo=bar') # Test URL which already contains noautoprov. cpe_ms.URL = 'http://example.com/?foo=bar&options=noautoprov' self.assertEqual(pc.acs_url_list[0], 'http://example.com/?foo=bar&options=noautoprov') self.assertEqual(cpe_ms.URL, 'http://example.com/?foo=bar&options=noautoprov') finally: shutil.rmtree(conman_dir)
def testParameterKey(self): cpe_ms = ms.CpeManagementServer(platform_config=FakePlatformConfig(), port=0, ping_path='/', get_parameter_key=self.GetParameterKey) self.assertEqual(cpe_ms.ParameterKey, self.GetParameterKey())