def test_get_measure_summary_high_beta(prepopulated_version_cache, base_datapoint_time, initial_data): (application_name, platform_name, channel_name, measure_name) = ( 'firefox', 'linux', 'release', 'main_crashes') for (version, buildid, delta) in [('55.0b1', '20170629075044', datetime.timedelta()), ('55.0b2', '20180629075044', datetime.timedelta(hours=1)), ('55.0b10', '20190629075044', datetime.timedelta(hours=2))]: latest_timestamp = _generate_fake_data(application_name, platform_name, channel_name, measure_name, buildid, version, base_datapoint_time + delta, 2) assert get_measure_summary( application_name, platform_name, channel_name, measure_name) == { "versions": [ { "version": "55.0b10", "adjustedCount": 6, "count": 6, "adjustedRate": 2000.0, "rate": 2000.0, "fieldDuration": 3600 }, { "version": "55.0b2", "adjustedCount": 6, "count": 6, "adjustedRate": 2000.0, "rate": 2000.0, "fieldDuration": 3600 }, { "version": "55.0b1", "adjustedCount": 6, "count": 6, "adjustedRate": 2000.0, "rate": 2000.0, "fieldDuration": 3600 }, { "version": "55", "adjustedCount": 18, "adjustedRate": 2000.0, "count": 18, "rate": 2000.0, "fieldDuration": 10800 } ], "lastUpdated": latest_timestamp }
def test_get_measure_summary(fake_measure_data, prepopulated_version_cache): from missioncontrol.etl.measuresummary import get_measure_summary assert get_measure_summary('linux', 'release', 'main_crashes') == { 'lastUpdated': datetime.datetime(2017, 7, 1, 12, 0, tzinfo=tzutc()), 'latest': { 'median': 625.0, 'stdev': 2562.754, 'usageHours': 56.0, 'version': '55.0.1' }, 'previous': { 'median': 625.0, 'stdev': 2562.754, 'usageHours': 56.0, 'version': None } }
def test_get_measure_summary_recent_releases(prepopulated_version_cache, base_datapoint_time, initial_data): (application_name, platform_name, measure_name) = ('firefox', 'linux', 'main_crashes') for (channel_name, versions, expected_versions) in ( ('release', ['55.0.2', '55.0.1', '54.0.1', '54.0'], ['55.0.2', '55.0.1', '55', '54']), ('beta', ['55.0b6', '55.0b5', '55.0b4', '55.0b3', '54.0b8', '54.0b7'], ['55.0b6', '55.0b5', '55.0b4', '55', '54']), ('nightly', ['56.0a1', '55.0a1', '54.0a1'], ['56', '55', '54'])): offsets = [datetime.timedelta(hours=i) for i in range(len(versions))] for (version, offset) in zip(reversed(versions), offsets): _generate_fake_data(application_name, platform_name, channel_name, measure_name, '20150629075044', version, base_datapoint_time + offset, 2) measure_summary = get_measure_summary( application_name, platform_name, channel_name, measure_name) assert [version['version'] for version in measure_summary['versions']] == expected_versions
def test_measure_summary_incorporated(client, monkeypatch, prepopulated_version_cache, fake_measure_data): # create a summary from the fake data we added, verify it's there cache.set( get_measure_summary_cache_key('linux', 'release', 'main_crashes'), get_measure_summary('linux', 'release', 'main_crashes'), None) resp = client.get(reverse('channel-platform-summary'), { 'platform': 'linux', 'channel': 'release', 'measure': 'main_crashes' }) assert resp.status_code == 200 assert resp.json() == { 'summaries': [{ 'channel': 'release', 'platform': 'linux', 'measures': [{ 'lastUpdated': '2017-07-01T12:00:00Z', 'latest': { 'median': 625.0, 'stdev': 2562.754, 'usageHours': 56.0, 'version': '55.0.1' }, 'name': 'main_crashes', 'previous': { 'median': 625.0, 'stdev': 2562.754, 'usageHours': 56.0, 'version': None } }] }] }
def test_get_measure_summary(prepopulated_version_cache, base_datapoint_time, initial_data, num_datapoints): ''' Test getting the measure summary with a small number of datapoints Small number of endpoints are edge cases of the summarization algorithm ''' (application_name, platform_name, channel_name, measure_name) = ( 'firefox', 'linux', 'release', 'main_crashes') latest_timestamp = _generate_fake_data(application_name, platform_name, channel_name, measure_name, '20170629075044', '55.0', base_datapoint_time, num_datapoints) if num_datapoints == 0: assert get_measure_summary( application_name, platform_name, channel_name, measure_name) is None elif num_datapoints == 1: assert get_measure_summary( application_name, platform_name, channel_name, measure_name) is None elif num_datapoints == 2: # num_datapoints == 2 assert get_measure_summary( application_name, platform_name, channel_name, measure_name) == { "versions": [ { "version": "55.0", "adjustedCount": 6, "count": 6, "adjustedRate": 2000.0, "rate": 2000.0, "fieldDuration": 3600 }, { "version": "55", "adjustedCount": 6, "adjustedRate": 2000.0, "count": 6, "rate": 2000.0, "fieldDuration": 3600 } ], "lastUpdated": latest_timestamp } else: # num_datapoints == 100 assert get_measure_summary( application_name, platform_name, channel_name, measure_name) == { "versions": [ { "version": "55.0", "adjustedCount": 10305, "count": 10305, "adjustedRate": 520.23, "rate": 520.23, "fieldDuration": 716400 }, { "version": "55", "adjustedCount": 10305, "adjustedRate": 520.23, "count": 10305, "rate": 520.23, "fieldDuration": 716400 } ], "lastUpdated": latest_timestamp }
def test_measure_summary_incorporated(client, monkeypatch, prepopulated_version_cache, fake_measure_data): # create a summary from the fake data we added, verify it's there cache.set( get_measure_summary_cache_key('firefox', 'linux', 'release', 'main_crashes'), get_measure_summary('firefox', 'linux', 'release', 'main_crashes'), None) resp = client.get(reverse('channel-platform-summary'), { 'platform': 'linux', 'channel': 'release' }) assert resp.status_code == 200 assert resp.json() == { 'summaries': [{ 'application': 'firefox', 'channel': 'release', 'platform': 'linux', 'latestVersionFieldDuration': 600, 'latestVersionSeen': '55.0.1', 'expectedMeasures': list( Measure.objects.filter( channels=Channel.objects.filter(name='release'), application__name='firefox', platform__name='linux').values_list('name', flat=True)), 'measures': [{ 'name': 'main_crashes', 'lastUpdated': '2017-07-01T12:00:00Z', 'versions': [{ 'adjustedCount': 120, 'adjustedRate': 2142.86, 'count': 120, 'fieldDuration': 600, 'rate': 2142.86, 'version': '55.0.1' }, { 'adjustedCount': 240, 'adjustedRate': 2142.86, 'count': 240, 'fieldDuration': 600, 'rate': 2142.86, 'version': '55' }] }] }] } # verify that the measure / summary disappears when we disable it Measure.objects.all().update(enabled=False) resp = client.get(reverse('channel-platform-summary'), { 'platform': 'linux', 'channel': 'release' }) assert resp.status_code == 200 assert resp.json() == {'summaries': []}
def test_get_measure_summary(base_datapoint_time, initial_data, num_datapoints): ''' Test getting the measure summary with a small number of datapoints Small number of endpoints are edge cases of the summarization algorithm ''' (platform_name, channel_name, measure_name) = ('linux', 'release', 'main_crashes') build = Build.objects.create( platform=Platform.objects.get(name=platform_name), channel=Channel.objects.get(name=channel_name), build_id='20170629075044', version='55.0') measure = Measure.objects.get(name=measure_name, platform__name=platform_name) series = Series.objects.create(build=build, measure=measure) latest_timestamp = None for i in range(num_datapoints): latest_timestamp = base_datapoint_time + datetime.timedelta(hours=i) (value, usage_hours, client_count) = (float(i), float(i + 1), i) Datum.objects.create(series=series, timestamp=latest_timestamp, value=value, usage_hours=usage_hours, client_count=client_count) if num_datapoints == 0: assert get_measure_summary(platform_name, channel_name, measure_name) == { "latest": { "version": None, "median": None, "stdev": 0.0, "usageHours": 0.0 }, "previous": { "version": None, "median": None, "stdev": 0.0, "usageHours": 0.0 }, "lastUpdated": None } elif num_datapoints == 1: assert get_measure_summary(platform_name, channel_name, measure_name) == { "latest": { "version": "55.0", "median": 0.0, "stdev": 0.0, "usageHours": 1.0 }, "previous": { "version": None, "median": None, "stdev": 0.0, "usageHours": 0.0 }, "lastUpdated": latest_timestamp } else: # num_datapoints == 2 assert get_measure_summary(platform_name, channel_name, measure_name) == { "latest": { "version": "55.0", "median": 250.0, "stdev": 353.553, "usageHours": 3.0 }, "previous": { "version": None, "median": None, "stdev": 0.0, "usageHours": 0.0 }, "lastUpdated": latest_timestamp }