Ejemplo n.º 1
0
def testScenario():
    print('Starting scenario tests...')
    # Mimic a normal flow

    platform = Platform()
    summoner_url = 'https://na1.api.riotgames.com/lol/summoner/v3/summoners/by-name/SomeSummonerName'
    platform.addURL(summoner_url)
    assert (platform.count == 1)
    url, platform_limit_needed, endpoint_limit_needed = platform.get()
    assert (url == summoner_url)
    assert (platform_limit_needed == True)
    assert (endpoint_limit_needed == True)

    headers = {
        'X-Method-Rate-Limit': '1:0.1,10:1',
        'X-Method-Rate-Limit-Count': '1:0.1,1:1',
        'X-App-Rate-Limit': '5:0.1,40:1',
        'X-App-Rate-Limit-Count': '1:0.1,1:1'
    }
    platform.setLimitAndCount(headers)
    platform.setEndpointLimitAndCount(url, headers)
    assert (platform.available() == False)  # Method limit hit
    matchlist_url = 'https://na1.api.riotgames.com/lol/match/v3/matchlists/by-account/123456789'
    platform.addURL(matchlist_url)
    assert (platform.available())  # New endpoint without a method limit hit
    url, platform_limit_needed, endpoint_limit_needed = platform.get()
    assert (url == matchlist_url)
    assert (platform_limit_needed == False)
    assert (endpoint_limit_needed == True)

    headers = {
        'X-Method-Rate-Limit': '1:0.1,10:1',
        'X-Method-Rate-Limit-Count': '1:0.1,1:1',
        'X-App-Rate-Limit': '5:0.1,40:1',
        'X-App-Rate-Limit-Count': '2:0.1,2:1'
    }
    platform.setEndpointLimitAndCount(url, headers)
    assert (platform.available() == False)  # Method limit hit
    match_example = 'https://na1.api.riotgames.com/lol/match/v3/matches/'
    #print('Generating Matches')
    for matchid in range(1, 50):
        url = '%s%s' % (match_example, matchid)
        #print('%s -> %s'%(url, Endpoint.identifyEndpoint(url)))
        platform.addURL(url)
    assert (platform.count == 49)
    url, platform_limit_needed, endpoint_limit_needed = platform.get()
    assert (url == '%s%s' % (match_example, 1))
    assert (platform_limit_needed == False)
    assert (endpoint_limit_needed == True)

    headers = {
        'X-Method-Rate-Limit': '1:0.1,5:1',  # Note: 5 per 1 second
        'X-Method-Rate-Limit-Count': '1:0.1,1:1',
        'X-App-Rate-Limit': '5:0.1,40:1',
        'X-App-Rate-Limit-Count': '3:0.1,3:1'
    }
    platform.setEndpointLimitAndCount('%s%s' % (match_example, 1), headers)
    #print('Checking available')
    #print(platform.getUsage())
    assert (platform.available() == False)  # Method limit 1:0.1, 1:1
    time.sleep(0.1)  # Time = 0.1
    assert (platform.available())
    url, platform_limit_needed, endpoint_limit_needed = platform.get()
    assert (url == '%s%s' % (match_example, 2))
    assert (platform_limit_needed == False)
    assert (endpoint_limit_needed == False)

    assert (platform.available() == False)  # Method limit 1:0.1, 2:1
    time.sleep(0.1)  # Time = 0.2
    url, platform_limit_needed, endpoint_limit_needed = platform.get()
    assert (url == '%s%s' % (match_example, 3))
    assert (platform_limit_needed == False)
    assert (endpoint_limit_needed == False)

    assert (platform.available() == False)  # Method limit 1:0.1, 3:1
    time.sleep(0.1)  # Time = 0.3
    url, platform_limit_needed, endpoint_limit_needed = platform.get()
    assert (url == '%s%s' % (match_example, 4))
    assert (platform_limit_needed == False)
    assert (endpoint_limit_needed == False)

    assert (platform.available() == False)  # Method limit 1:0.1, 4:1
    time.sleep(0.1)  # Time = 0.4
    url, platform_limit_needed, endpoint_limit_needed = platform.get()
    assert (url == '%s%s' % (match_example, 5))
    assert (platform_limit_needed == False)
    assert (endpoint_limit_needed == False)

    assert (platform.available() == False)  # Method Limit 1:0.1, 5:1
    time.sleep(0.1)  # Time = 0.5
    url, platform_limit_needed, endpoint_limit_needed = platform.get()
    assert (url == None)
    assert (platform_limit_needed == False)
    assert (endpoint_limit_needed == False)

    assert (platform.available() == False)  # Method Limit 0:0.1, 5:1
    time.sleep(0.1)  # Time = 0.6
    assert (platform.available() == False)  # Method Limit 0:0.1, 5:1
    time.sleep(0.1)  # Time = 0.7
    assert (platform.available() == False)  # Method Limit 0:0.1, 5:1
    time.sleep(0.1)  # Time = 0.8
    assert (platform.available() == False)  # Method Limit 0:0.1, 5:1
    time.sleep(0.1)  # Time = 0.9
    assert (platform.available() == False)  # Method Limit 0:0.1, 5:1
    time.sleep(0.1)  # Time = 1.0
    assert (platform.available())  # Method Limit 0:0.1, 0:1

    # Check that requests from other platforms still go through just fine without causing a delay
    url, platform_limit_needed, endpoint_limit_needed = platform.get()
    assert (url == '%s%s' % (match_example, 6))
    platform.addURL(summoner_url)
    assert (platform.available())
    url, platform_limit_needed, endpoint_limit_needed = platform.get()
    assert (url == summoner_url)
    assert (platform.available() == False)
    time.sleep(0.1)
    url, platform_limit_needed, endpoint_limit_needed = platform.get()
    assert (url == '%s%s' % (match_example, 7))

    print('First 8 manual tests passed, the rest should be staggered')
    # Automatically continue
    next = 8
    while platform.count > 0:
        url, platform_limit_needed, endpoint_limit_needed = grabWhenReady(
            platform)
        assert (url == '%s%s' % (match_example, next))
        print(next)
        next += 1

    print('Scenario tests pass')
Ejemplo n.º 2
0
class TestPlatform(unittest.TestCase):
    def setUp(self):
        self.slug = 'na'
        self.platform = Platform(self.slug)

    def test_count_and_has_url(self):
        self.assertEqual(self.platform.count, 0)
        self.assertFalse(self.platform.has_url())

        self.platform.add_data({'url': match_url_template.format(matchid=1)})
        self.assertEqual(self.platform.count, 1)
        self.assertTrue(self.platform.has_url())

        self.platform.add_data(
            {'url': summoner_url_template.format(name=fake_name)})
        self.assertEqual(self.platform.count, 2)
        self.assertTrue(self.platform.has_url())

        self.platform.add_data({'url': static_champions_url})
        self.assertEqual(self.platform.count, 3)
        self.assertTrue(self.platform.has_url())

        self.platform.get()
        self.assertEqual(self.platform.count, 2)
        self.assertTrue(self.platform.has_url())

        self.platform.get()
        self.assertEqual(self.platform.count, 1)
        self.assertTrue(self.platform.has_url())

        self.platform.get()
        self.assertEqual(self.platform.count, 0)
        self.assertFalse(self.platform.has_url())

    def test_rate_limit_ok(self):
        url = match_url_template.format(matchid=1)
        self.assertTrue(self.platform.rate_limit_ok())
        self.platform.add_data({'url': match_url_template.format(matchid=1)})
        self.platform.handle_response_headers(url, headers)
        self.assertTrue(self.platform.rate_limit_ok())
        new_headers = copy.copy(headers)
        new_headers['X-App-Rate-Limit'] = "1:0.01"
        new_headers['X-App-Rate-Limit-Count'] = "1:0.01"
        new_headers['X-Method-Rate-Limit'] = "5:1"
        new_headers['X-Method-Rate-Limit-Count'] = "1:1"
        self.platform.handle_response_headers(url, new_headers)
        self.assertFalse(self.platform.rate_limit_ok())
        time.sleep(0.01)
        self.assertTrue(self.platform.rate_limit_ok())
        self.platform.get()
        self.assertFalse(self.platform.rate_limit_ok())

    def test_handle_response_headers(self):
        url = match_url_template.format(matchid=1)
        endpoint_str = Endpoint.identify_endpoint(url)
        self.assertRaises(Exception, self.platform.handle_response_headers,
                          (url, headers))
        self.platform.add_data({'url': url})
        self.assertEqual(self.platform.platform_limits, {})
        self.platform.handle_response_headers(url, headers)
        self.assertEqual(len(self.platform.platform_limits), 2)
        self.assertEqual(self.platform.platform_limits["1"].cap, 20)
        self.assertEqual(self.platform.platform_limits["1"].seconds, 1)
        self.assertEqual(self.platform.platform_limits["1"].used, 1)
        self.assertEqual(self.platform.platform_limits["120"].cap, 100)
        self.assertEqual(self.platform.platform_limits["120"].seconds, 120)
        self.assertEqual(self.platform.platform_limits["120"].used, 1)
        self.assertEqual(len(self.platform.limited_endpoints), 1)
        self.assertEqual(
            self.platform.limited_endpoints[endpoint_str].limits["60"].cap,
            270)
        self.assertEqual(
            self.platform.limited_endpoints[endpoint_str].limits["60"].seconds,
            60)
        self.assertEqual(
            self.platform.limited_endpoints[endpoint_str].limits["60"].used, 1)
        new_headers = copy.copy(headers)
        new_headers['X-App-Rate-Limit'] = "1:1"
        new_headers['X-App-Rate-Limit-Count'] = "1:1"
        new_headers['X-Method-Rate-Limit'] = "5:1"
        new_headers['X-Method-Rate-Limit-Count'] = "1:1"
        self.platform.handle_response_headers(url, new_headers)
        self.assertEqual(len(self.platform.platform_limits), 1)
        self.assertEqual(self.platform.platform_limits["1"].cap, 1)
        self.assertEqual(self.platform.platform_limits["1"].seconds, 1)
        self.assertEqual(self.platform.platform_limits["1"].used, 1)
        self.assertEqual(len(self.platform.limited_endpoints), 1)
        self.assertEqual(
            self.platform.limited_endpoints[endpoint_str].limits["1"].cap, 5)
        self.assertEqual(
            self.platform.limited_endpoints[endpoint_str].limits["1"].seconds,
            1)
        self.assertEqual(
            self.platform.limited_endpoints[endpoint_str].limits["1"].used, 1)

    def test_add_data_static_random(self):
        s1 = {'url': static_champions_url}
        s2 = {'url': static_summoner_spells_url}
        s3 = {'url': static_items_url}
        s = [s1, s2, s3]
        self.platform.add_data(s1)
        self.platform.add_data(s2)
        self.platform.add_data(s3)
        self.assertEqual(self.platform.static_count, 3)
        self.assertTrue(self.platform.get() in s)
        self.assertTrue(self.platform.get() in s)
        self.assertTrue(self.platform.get() in s)
        self.assertRaises(Exception, self.platform.get)

    def test_add_data_static_sorted(self):
        c1 = {'url': static_champion_url.format(id=1)}
        c2 = {'url': static_champion_url.format(id=2)}
        c3 = {'url': static_champion_url.format(id=3)}
        self.platform.add_data(c1)
        self.platform.add_data(c2)
        self.platform.add_data(c3)
        self.assertEqual(self.platform.static_count, 3)
        self.assertEqual(self.platform.get(), c1)
        self.assertEqual(self.platform.get(), c2)
        self.assertEqual(self.platform.get(), c3)
        self.assertRaises(Exception, self.platform.get)

    def test_add_data_static_sorted_atFront(self):
        c1 = {'url': static_champion_url.format(id=1)}
        c2 = {'url': static_champion_url.format(id=2)}
        c3 = {'url': static_champion_url.format(id=3)}
        self.platform.add_data(c1, front=True)
        self.platform.add_data(c2, front=True)
        self.platform.add_data(c3, front=True)
        self.assertEqual(self.platform.static_count, 3)
        self.assertEqual(self.platform.get(), c3)
        self.assertEqual(self.platform.get(), c2)
        self.assertEqual(self.platform.get(), c1)
        self.assertRaises(Exception, self.platform.get)

    def test_add_data_limited_alternate(self):
        m1 = {'url': match_url_template.format(matchid=1)}
        m2 = {'url': match_url_template.format(matchid=2)}
        m3 = {'url': match_url_template.format(matchid=3)}
        s1 = {'url': summoner_url_template.format(name=1)}
        s2 = {'url': summoner_url_template.format(name=2)}
        s3 = {'url': summoner_url_template.format(name=3)}
        self.platform.add_data(m1)
        self.platform.add_data(m2)
        self.platform.add_data(m3)
        self.platform.add_data(s1)
        self.platform.add_data(s2)
        self.platform.add_data(s3)
        self.assertEqual(self.platform.limited_count, 6)
        self.assertEqual(self.platform.get(), m1)
        self.assertEqual(self.platform.get(), s1)
        self.assertEqual(self.platform.get(), m2)
        self.assertEqual(self.platform.get(), s2)
        self.assertEqual(self.platform.get(), m3)
        self.assertEqual(self.platform.get(), s3)
        self.assertRaises(Exception, self.platform.get)

    def test_add_data_limited_sorted(self):
        m1 = {'url': match_url_template.format(matchid=1)}
        m2 = {'url': match_url_template.format(matchid=2)}
        m3 = {'url': match_url_template.format(matchid=3)}
        self.platform.add_data(m1)
        self.platform.add_data(m2)
        self.platform.add_data(m3)
        self.assertEqual(self.platform.limited_count, 3)
        self.assertEqual(self.platform.get(), m1)
        self.assertEqual(self.platform.get(), m2)
        self.assertEqual(self.platform.get(), m3)
        self.assertRaises(Exception, self.platform.get)

    def test_add_data_limited_sorted_atFront(self):
        m1 = {'url': match_url_template.format(matchid=1)}
        m2 = {'url': match_url_template.format(matchid=2)}
        m3 = {'url': match_url_template.format(matchid=3)}
        self.platform.add_data(m1, front=True)
        self.platform.add_data(m2, front=True)
        self.platform.add_data(m3, front=True)
        self.assertEqual(self.platform.limited_count, 3)
        self.assertEqual(self.platform.get(), m3)
        self.assertEqual(self.platform.get(), m2)
        self.assertEqual(self.platform.get(), m1)
        self.assertRaises(Exception, self.platform.get)

    def test_available(self):
        self.assertFalse(self.platform.available())
        static_data_1 = {'url': static_items_url}
        limited_data_1 = {'url': match_url_template.format(matchid=100)}
        limited_data_2 = {'url': match_url_template.format(matchid=200)}
        self.platform.add_data(static_data_1)
        self.assertTrue(self.platform.available())
        self.platform.get()
        self.assertFalse(self.platform.available())
        self.platform.add_data(limited_data_1)
        self.assertTrue(self.platform.available())
        self.platform.add_data(limited_data_2)
        self.platform.get()
        self.assertTrue(self.platform.available())  # No response headers yet

        new_headers = copy.copy(headers)
        new_headers['X-Method-Rate-Limit'] = '1:0.1'
        new_headers['X-Method-Rate-Limit-Count'] = '1:0.1'
        self.platform.handle_response_headers(
            match_url_template.format(matchid=100), new_headers, 200)
        self.assertFalse(self.platform.available())
        time.sleep(0.1)
        self.assertTrue(self.platform.available())

    def test_handle_delay(self):
        limited_data_1 = {'url': match_url_template.format(matchid=100)}
        limited_data_2 = {'url': match_url_template.format(matchid=200)}
        self.platform.add_data(limited_data_1)
        self.platform.add_data(limited_data_2)
        self.assertTrue(self.platform.available())
        self.platform.get()
        new_headers = get_date_header()
        new_headers['X-Method-Rate-Limit'] = '2:0.1'
        new_headers['X-Method-Rate-Limit-Count'] = '1:0.1'
        self.platform.handle_response_headers(
            match_url_template.format(matchid=100), new_headers, 429)
        self.assertFalse(
            self.platform.available())  # Should have a default delay
        time.sleep(1)
        self.assertTrue(self.platform.available())

    def test_get_usage(self):
        used = {'static': {}, 'limited': {}}
        self.assertEqual(self.platform.get_usage(), used)
        url = match_url_template.format(matchid=100)
        match_endpoint = Endpoint.identify_endpoint(url)
        used['limited'][match_endpoint] = 'No limits defined'
        self.platform.add_data({'url': url})
        self.assertEqual(self.platform.get_usage(), used)
        self.platform.handle_response_headers(url, headers)
        used['limited'][match_endpoint] = '1:270'
        self.assertEqual(self.platform.get_usage(), used)
        self.platform.get()
        used['limited'][match_endpoint] = '2:270'
        self.assertEqual(self.platform.get_usage(), used)

        # Static tests
        static_endpoint = Endpoint.identify_endpoint(static_champions_url)
        self.platform.add_data({'url': static_champions_url})
        used['static'][static_endpoint] = 'No limits defined'
        self.assertEqual(self.platform.get_usage(), used)
        self.platform.get()
        new_headers = copy.copy(headers)
        new_headers['X-Method-Rate-Limit-Count'] = '1:60,2:120'
        new_headers['X-Method-Rate-Limit'] = '7:60,10:120'
        used['static'][static_endpoint] = '1:7,2:10'
        self.platform.handle_response_headers(static_champions_url,
                                              new_headers)
Ejemplo n.º 3
0
def testPlatform():
    platform = Platform()
    assert (platform.rate_limit_ok())
    assert (platform.has_url() == False)
    assert (platform.available() == False)  # no URLS
    assert (platform.time_next_available() == None)
    assert (platform.count == 0)
    assert (platform.get() == (None, True, False))

    summoner_url = 'https://na1.api.riotgames.com/lol/summoner/v3/summoners/by-name/SomeSummonerName'
    platform.addURL(summoner_url)
    assert (platform.count == 1)
    assert (platform.static_count == 0)
    assert (platform.limited_count == 1)
    assert (platform.time_next_available() < time.time())
    assert (platform.available())

    static_url = 'https://na1.api.riotgames.com/lol/static-data/v3/champions?locale=en_US&dataById=false'
    platform.addURL(static_url)
    assert (platform.count == 2)
    assert (platform.static_count == 1)
    assert (platform.limited_count == 1)
    assert (platform.time_next_available() < time.time())
    assert (platform.available())

    # When two are present, static should be pulled first
    assert (platform.get() == (static_url, True, True))
    assert (platform.count == 1)
    assert (platform.static_count == 0)
    assert (platform.get() == (summoner_url, True, True))
    assert (platform.count == 0)

    platform = Platform()
    champ_mastery_url = 'https://na1.api.riotgames.com/lol/champion-mastery/v3/champion-masteries/by-summoner/28341307'
    platform.addURL(summoner_url)
    platform.addURL(summoner_url)
    platform.addURL(champ_mastery_url)
    platform.addURL(champ_mastery_url)
    assert (platform.count == 4)
    assert (platform.last_limited_endpoint == '')
    # summoner_url was added first, so that endpoint gets pulled first
    # it then rotates to champ_mastery_url, the next endpoint added
    assert (platform.get() == (summoner_url, True, True))
    assert (platform.get() == (champ_mastery_url, True, True))
    assert (platform.get() == (summoner_url, True, True))
    assert (platform.get() == (champ_mastery_url, True, True))

    headers = {
        'X-Method-Rate-Limit': '1:0.1,10:1',
        'X-Method-Rate-Limit-Count': '0:0.1,9:1',
        'X-App-Rate-Limit': '5:0.1,40:1',
        'X-App-Rate-Limit-Count': '0:0.1,39:1'
    }
    platform.setLimit(headers)
    platform.setCount(headers)
    assert (platform.rate_limit_ok())
    platform.addURL(summoner_url)
    platform.addURL(summoner_url)
    assert (platform.get() == (summoner_url, False, True))
    assert (platform.rate_limit_ok() == False)
    assert (platform.get() == (None, False, False))

    platform = Platform()
    platform.addURL(summoner_url)
    platform.addURL(summoner_url)
    platform.setLimitAndCount(headers)
    assert (platform.rate_limit_ok())
    assert (platform.get() == (summoner_url, False, True))
    assert (platform.rate_limit_ok() == False)
    platform.addURL(summoner_url)
    assert (platform.get() == (None, False, False))

    platform = Platform()
    platform.addURL(summoner_url)
    platform.addURL(summoner_url)
    platform.setEndpointLimit(summoner_url, headers)
    platform.setEndpointCount(summoner_url, headers)
    assert (platform.get() == (summoner_url, True, False))
    assert (platform.get() == (None, True, False))

    platform = Platform()
    platform.addURL(summoner_url)
    platform.setEndpointLimitAndCount(summoner_url, headers)
    assert (platform.get() == (summoner_url, True, False))

    platform = Platform()
    platform.addURL(summoner_url)
    platform.setLimitAndCount(headers)
    platform.setEndpointLimitAndCount(summoner_url, headers)
    assert (platform.get() == (summoner_url, False, False))

    print('Platform tests pass')