def test_get_reverse_proxy_returns_probability_and_caches(self): # If the entity exists, get_reverse_proxy should return it. ndt7_probability = model.ReverseProxyProbability( name="ndt7", probability=1.0, url="https://fake.appspot.com") ndt_ssl_probability = model.ReverseProxyProbability( name="ndt_ssl", probability=1.0, url="https://fake.appspot.com") ndt7_probability.put() ndt_ssl_probability.put() actual = reverse_proxy.get_reverse_proxy('ndt_ssl') self.assertEqual(actual.name, ndt_ssl_probability.name) self.assertEqual(actual.probability, ndt_ssl_probability.probability) self.assertEqual(actual.url, ndt_ssl_probability.url)
def test_try_reverse_proxy_url_when_probability_zero_returns_emptystr( self): ndt_zero_probability = model.ReverseProxyProbability( name="ndt_ssl", probability=0.0, url="https://fake.appspot.com") ndt_zero_probability.put() mock_request = mock.Mock() mock_request.path = '/ndt_ssl' url = reverse_proxy.try_reverse_proxy_url(mock_request) self.assertEqual(url, "")
def test_try_reverse_proxy_url_when_outside_business_returns_emptystr( self): ndt_ssl_probability = model.ReverseProxyProbability( name="ndt_ssl", probability=1.0, url="https://fake.appspot.com") ndt_ssl_probability.put() mock_request = mock.Mock() mock_request.path = '/ndt_ssl' t = datetime.datetime(2019, 1, 25, 16, 0, 0) url = reverse_proxy.try_reverse_proxy_url(mock_request, t) self.assertEqual(url, "")
def test_get_reverse_proxy_caches_entities(self): # get_reverse_proxy should refresh memcache at each cache miss. ndt7_probability = model.ReverseProxyProbability( name="ndt7", probability=1.0, url="https://fake.appspot.com") ndt_ssl_probability = model.ReverseProxyProbability( name="ndt_ssl", probability=1.0, url="https://fake.appspot.com") ndt7_probability.put() ndt_ssl_probability.put() reverse_proxy.get_reverse_proxy("ndt_ssl") cached_ndt = memcache.get( "ndt_ssl", namespace=constants.MEMCACHE_NAMESPACE_REVERSE_PROXY) cached_ndt7 = memcache.get( "ndt7", namespace=constants.MEMCACHE_NAMESPACE_REVERSE_PROXY) self.assertEqual(cached_ndt.name, ndt_ssl_probability.name) self.assertEqual(cached_ndt.probability, ndt_ssl_probability.probability) self.assertEqual(cached_ndt.url, ndt_ssl_probability.url) self.assertEqual(cached_ndt7.name, ndt7_probability.name) self.assertEqual(cached_ndt7.probability, ndt7_probability.probability) self.assertEqual(cached_ndt7.url, ndt7_probability.url)
def test_try_reverse_proxy_url_returns_url_with_latlon(self): ndt_ssl_probability = model.ReverseProxyProbability( name="ndt_ssl", probability=1.0, url="https://fake.appspot.com") ndt_ssl_probability.put() mock_request = mock.Mock() mock_request.path = '/ndt_ssl' mock_request.path_qs = '/ndt_ssl?format=geo_options' mock_request.latitude = 40.7 mock_request.longitude = 74.0 actual_url = reverse_proxy.try_reverse_proxy_url(mock_request) self.assertEqual(actual_url, ( 'https://fake.appspot.com/ndt_ssl?format=geo_options&lat=40.700000' '&lon=74.000000'))
def test_try_reverse_proxy_url_returns_url_with_only_latlon(self): ndt_ssl_probability = model.ReverseProxyProbability( name="ndt_ssl", probability=1.0, url="https://fake.appspot.com") ndt_ssl_probability.put() mock_request = mock.Mock() mock_request.path = '/ndt_ssl' mock_request.path_qs = '/ndt_ssl' mock_request.latitude = 40.7 mock_request.longitude = 74.0 t = datetime.datetime(2019, 1, 24, 16, 0, 0) actual_url = reverse_proxy.try_reverse_proxy_url(mock_request, t) self.assertEqual( actual_url, 'https://fake.appspot.com/ndt_ssl?lat=40.700000&lon=74.000000')
import logging import random from google.appengine.api import memcache from mlabns.db import model from mlabns.util import constants # Default value if datastore contains no record for a given experiment. # This object should not be returned directly, but you can make a copy # with a custom name by calling default_reverse_proxy.with_name("name"). default_reverse_proxy = model.ReverseProxyProbability( name="default", probability=0.0, url="https://mlab-ns.appspot.com") def get_reverse_proxy(experiment): """Reads the ReverseProxyProbability record for an experiment. If the entity is not cached, it also refreshes the cache. """ reverse_proxy = memcache.get( experiment, namespace=constants.MEMCACHE_NAMESPACE_REVERSE_PROXY) if reverse_proxy is None: # Update ReverseProxyProbability for all the experiments. for prob in model.ReverseProxyProbability.all().run(): if experiment == prob.name: reverse_proxy = prob if not memcache.set( prob.name,