Esempio n. 1
0
 def execute(id):
     if Platform.get_by_key_name(key):
         error[0] = 'Platform "%s" already exists' % key
         return
     platform = Platform(id=id, name=name, key_name=key)
     platform.put()
     return platform
Esempio n. 2
0
    def __init__(self):
        # FIXME: This function is massive. Break it up
        self._test_map = {}
        platform_id_map = {}
        branch_id_map = {}
        for test in Test.all():
            if test.hidden:
                continue

            branch_ids = [Branch.get(branch_key).id for branch_key in test.branches]
            platform_ids = [Platform.get(platform_key).id for platform_key in test.platforms]
            self._test_map[test.id] = {
                'name': test.name,
                'branchIds': branch_ids,
                'platformIds': platform_ids,
            }

            for platform_id in platform_ids:
                platform_id_map.setdefault(platform_id, {'tests': [], 'branches': []})
                platform_id_map[platform_id]['tests'].append(test.id)
                platform_id_map[platform_id]['branches'] += branch_ids

            for branch_id in branch_ids:
                branch_id_map.setdefault(branch_id, {'tests': [], 'platforms': []})
                branch_id_map[branch_id]['tests'].append(test.id)
                branch_id_map[branch_id]['platforms'] += platform_ids

        self._platform_map = {}
        for platform in Platform.all():
            if platform.id not in platform_id_map:
                continue

            if platform.hidden:
                for test_id in platform_id_map[platform.id]['tests']:
                    self._test_map[test_id]['platformIds'].remove(platform.id)
                for branch_id in platform_id_map[platform.id]['branches']:
                    branch_id_map[branch_id]['platforms'].remove(platform.id)
                continue

            self._platform_map[platform.id] = {
                'name': platform.name,
                'testIds': list(set(platform_id_map[platform.id]['tests'])),
                'branchIds': list(set(platform_id_map[platform.id]['branches'])),
            }

        self._branch_map = {}
        for branch in Branch.all():
            if branch.id not in branch_id_map:
                continue
            self._branch_map[branch.id] = {
                'name': branch.name,
                'testIds': list(set(branch_id_map[branch.id]['tests'])),
                'platformIds': list(set(branch_id_map[branch.id]['platforms'])),
            }
Esempio n. 3
0
 def test_value_two_platforms(self):
     webkit_trunk = Branch.create_if_possible('webkit-trunk', 'WebKit trunk')
     some_platform = Platform.create_if_possible('some-platform', 'Some Platform')
     other_platform = Platform.create_if_possible('other-platform', 'Other Platform')
     Test.update_or_insert('some-test', webkit_trunk, some_platform)
     Test.update_or_insert('some-test', webkit_trunk, other_platform)
     self.assertEqual(DashboardJSONGenerator().value(), {
         'defaultBranch': 'WebKit trunk',
         'branchToId': {'WebKit trunk': webkit_trunk.id},
         'platformToId': {'Some Platform': some_platform.id, 'Other Platform': other_platform.id},
         'testToId': {'some-test': Test.get_by_key_name('some-test').id},
     })
Esempio n. 4
0
    def test_create_if_possible(self):
        self.assertThereIsNoInstanceOf(Platform)

        platform = Platform.create_if_possible('some-platform', 'some platform')
        self.assertTrue(platform)
        self.assertTrue(platform.key().name(), 'some-platform')
        self.assertTrue(platform.name, 'some platform')
        self.assertOnlyInstance(platform)

        self.assertFalse(Platform.create_if_possible('some-platform', 'some other platform'))
        self.assertTrue(platform.name, 'some platform')
        self.assertOnlyInstance(platform)
Esempio n. 5
0
    def get(self):
        self.response.headers['Content-Type'] = 'text/plain; charset=utf-8';
        cache = memcache.get('manifest')
        if cache:
            self.response.out.write(cache)
            return

        testMap = {}
        platformIdMap = {}
        branchIdMap = {}
        for test in Test.all():
            branchIds = [Branch.get(branchKey).id for branchKey in test.branches]
            platformIds = [Platform.get(platformKey).id for platformKey in test.platforms]
            testMap[test.id] = {
                'name': test.name,
                'branchIds': branchIds,
                'platformIds': platformIds,
            }

            for platformId in platformIds:
                platformIdMap.setdefault(platformId, {'tests': [], 'branches': []})
                platformIdMap[platformId]['tests'].append(test.id)
                platformIdMap[platformId]['branches'] += branchIds

            for branchId in branchIds:
                branchIdMap.setdefault(branchId, {'tests': [], 'platforms': []})
                branchIdMap[branchId]['tests'].append(test.id)
                branchIdMap[branchId]['platforms'] += platformIds

        platformMap = {}
        for platform in Platform.all():
            if platform.id not in platformIdMap:
                continue
            platformMap[platform.id] = {
                'name': platform.name,
                'testIds': list(set(platformIdMap[platform.id]['tests'])),
                'branchIds': list(set(platformIdMap[platform.id]['branches'])),
            }

        branchMap = {}
        for branch in Branch.all():
            if branch.id not in branchIdMap:
                continue
            branchMap[branch.id] = {
                'name': branch.name,
                'testIds': list(set(branchIdMap[branch.id]['tests'])),
                'platformIds': list(set(branchIdMap[branch.id]['platforms'])),
            }

        result = json.dumps({'testMap': testMap, 'platformMap': platformMap, 'branchMap': branchMap})
        self.response.out.write(result)
        memcache.add('manifest', result)
Esempio n. 6
0
    def test_update_or_insert_to_update(self):
        branch = Branch.create_if_possible('some-branch', 'Some Branch')
        platform = Platform.create_if_possible('some-platform', 'Some Platform')
        test = Test.update_or_insert('some-test', branch, platform)
        self.assertOnlyInstance(test)

        other_branch = Branch.create_if_possible('other-branch', 'Other Branch')
        other_platform = Platform.create_if_possible('other-platform', 'Other Platform')
        test = Test.update_or_insert('some-test', other_branch, other_platform, 'ms')
        self.assertOnlyInstance(test)
        self.assertEqualUnorderedList(test.branches, [branch.key(), other_branch.key()])
        self.assertEqualUnorderedList(test.platforms, [platform.key(), other_platform.key()])
        self.assertEqualUnorderedList(test.unit, 'ms')
Esempio n. 7
0
    def get(self):
        self.response.headers["Content-Type"] = "text/plain; charset=utf-8"
        self.response.out.write('{"testMap":')

        testMap = {}
        platformIdMap = {}
        branchIdMap = {}
        for test in Test.all():
            branchIds = [Branch.get(branchKey).id for branchKey in test.branches]
            platformIds = [Platform.get(platformKey).id for platformKey in test.platforms]
            testMap[test.id] = {"name": test.name, "branchIds": branchIds, "platformIds": platformIds}

            for platformId in platformIds:
                platformIdMap.setdefault(platformId, {"tests": [], "branches": []})
                platformIdMap[platformId]["tests"].append(test.id)
                platformIdMap[platformId]["branches"] += branchIds

            for branchId in branchIds:
                branchIdMap.setdefault(branchId, {"tests": [], "platforms": []})
                branchIdMap[branchId]["tests"].append(test.id)
                branchIdMap[branchId]["platforms"] += platformIds

        self.response.out.write(json.dumps(testMap))
        self.response.out.write(',"platformMap":')

        platformMap = {}
        for platform in Platform.all():
            if platform.id not in platformIdMap:
                continue
            platformMap[platform.id] = {
                "name": platform.name,
                "testIds": list(set(platformIdMap[platform.id]["tests"])),
                "branchIds": list(set(platformIdMap[platform.id]["branches"])),
            }

        self.response.out.write(json.dumps(platformMap))
        self.response.out.write(',"branchMap":')

        branchMap = {}
        for branch in Branch.all():
            if branch.id not in branchIdMap:
                continue
            branchMap[branch.id] = {
                "name": branch.name,
                "testIds": list(set(branchIdMap[branch.id]["tests"])),
                "platformIds": list(set(branchIdMap[branch.id]["platforms"])),
            }

        self.response.out.write(json.dumps(branchMap))
        self.response.out.write("}")
Esempio n. 8
0
    def get(self):
        self.response.headers["Content-Type"] = "application/json; charset=utf-8"

        cache = memcache.get("dashboard")
        if cache:
            self.response.out.write(cache)
            return

        webkitTrunk = Branch.get_by_key_name("webkit-trunk")

        # FIXME: Determine popular branches, platforms, and tests
        dashboard = {
            "defaultBranch": "WebKit trunk",
            "branchToId": {webkitTrunk.name: webkitTrunk.id},
            "platformToId": {},
            "testToId": {},
        }

        for platform in Platform.all():
            dashboard["platformToId"][platform.name] = platform.id

        for test in Test.all():
            dashboard["testToId"][test.name] = test.id

        result = json.dumps(dashboard)
        self.response.out.write(result)
        memcache.add("dashboard", result)
Esempio n. 9
0
    def post(self):
        self.response.headers['Content-Type'] = 'text/plain; charset=utf-8'

        try:
            payload = json.loads(self.request.body)
            hide = payload['hide']
        except:
            self.response.out.write("Failed to parse the payload: %s" % self.request.body)
            return

        if 'platform' in payload:
            model = Platform.get_by_key_name(payload['platform'])
        elif 'test' in payload:
            model = Test.get_by_key_name(payload['test'])
        else:
            self.response.out.write('Not supported')
            return

        if not model:
            self.response.out.write('Could not find the model')
            return

        model.hidden = hide
        model.put()
        schedule_dashboard_update()
        schedule_manifest_update()

        self.response.out.write('OK')
Esempio n. 10
0
    def test_chart_params_with_value(self):
        some_branch = Branch.create_if_possible('some-branch', 'Some Branch')
        some_platform = Platform.create_if_possible('some-platform', 'Some Platform')
        some_builder = Builder.get(Builder.create('some-builder', 'Some Builder'))
        some_test = Test.update_or_insert('some-test', some_branch, some_platform)

        start_time = datetime(2011, 2, 21, 12, 0, 0)
        end_time = datetime(2011, 2, 28, 12, 0, 0)
        results = self._create_results(some_branch, some_platform, some_builder, 'some-test',
            [50.0, 51.0, 52.0, 49.0, 48.0, 51.9, 50.7, 51.1],
            [start_time + timedelta(day) for day in range(0, 8)])

        # Use int despite of its impreciseness since tests may fail due to rounding errors otherwise.
        def split_as_int(string):
            return [int(float(value)) for value in string.split(',')]

        params = Runs.update_or_insert(some_branch, some_platform, some_test).chart_params(7)
        self.assertEqual(params['chxl'], '0:|Feb 21|Feb 22|Feb 23|Feb 24|Feb 25|Feb 26|Feb 27|Feb 28')
        self.assertEqual(split_as_int(params['chxr']), [1, 0, 57, int(52 * 1.1 / 5 + 0.5)])
        x_min, x_max, y_min, y_max = split_as_int(params['chds'])
        self.assertEqual(datetime.fromtimestamp(x_min), start_time)
        self.assertEqual(datetime.fromtimestamp(x_max), end_time)
        self.assertEqual(y_min, 0)
        self.assertEqual(y_max, int(52 * 1.1))
        self.assertEqual(split_as_int(params['chg']), [int(100 / 7), 20, 0, 0])

        params = Runs.update_or_insert(some_branch, some_platform, some_test).chart_params(14)
        self.assertEqual(params['chxl'], '0:|Feb 14|Feb 16|Feb 18|Feb 20|Feb 22|Feb 24|Feb 26|Feb 28')
        self.assertEqual(split_as_int(params['chxr']), [1, 0, 57, int(52 * 1.1 / 5 + 0.5)])
        x_min, x_max, y_min, y_max = split_as_int(params['chds'])
        self.assertEqual(datetime.fromtimestamp(x_min), datetime(2011, 2, 14, 12, 0, 0))
        self.assertEqual(datetime.fromtimestamp(x_max), end_time)
        self.assertEqual(y_min, 0)
        self.assertEqual(y_max, int(52 * 1.1))
        self.assertEqual(split_as_int(params['chg']), [int(100 / 7), 20, 0, 0])
Esempio n. 11
0
    def test_update_incrementally(self):
        some_branch = Branch.create_if_possible('some-branch', 'Some Branch')
        some_platform = Platform.create_if_possible('some-platform', 'Some Platform')
        some_builder = Builder.get(Builder.create('some-builder', 'Some Builder'))
        some_test = Test.update_or_insert('some-test', some_branch, some_platform)
        self.assertThereIsNoInstanceOf(Runs)

        timestamps = [datetime.now(), datetime.now()]
        builds, results = self._create_results(some_branch, some_platform, some_builder, 'some-test', [50.0, 52.0], timestamps)
        runs = Runs.update_or_insert(some_branch, some_platform, some_test)
        self.assertOnlyInstance(runs)
        self.assertEqual(json.loads('[' + runs.json_runs + ']'),
            [[5, [4, 0, 100, None], mktime(timestamps[0].timetuple()), 50.0, 0, [], None, None],
            [7, [6, 1, 101, None], mktime(timestamps[1].timetuple()), 52.0, 0, [], None, None]])
        self.assertEqual(json.loads('{' + runs.json_averages + '}'), {"100": 50.0, "101": 52.0})
        self.assertEqual(runs.json_min, 50.0)
        self.assertEqual(runs.json_max, 52.0)

        timestamps.append(datetime.now())
        builds, results = self._create_results(some_branch, some_platform, some_builder, 'some-test', [48.0],
            timestamps[2:], starting_revision=102)
        runs.update_incrementally(builds[0], results[0])

        self.assertOnlyInstance(runs)
        self.assertEqual(json.loads('[' + runs.json_runs + ']'),
            [[5, [4, 0, 100, None], mktime(timestamps[0].timetuple()), 50.0, 0, [], None, None],
            [7, [6, 1, 101, None], mktime(timestamps[1].timetuple()), 52.0, 0, [], None, None],
            [9, [8, 0, 102, None], mktime(timestamps[2].timetuple()), 48.0, 0, [], None, None]])
        self.assertEqual(json.loads('{' + runs.json_averages + '}'), {"100": 50.0, "101": 52.0, "102": 48.0})
        self.assertEqual(runs.json_min, 48.0)
        self.assertEqual(runs.json_max, 52.0)
Esempio n. 12
0
    def test_update_or_insert(self):
        some_branch = Branch.create_if_possible('some-branch', 'Some Branch')
        some_platform = Platform.create_if_possible('some-platform', 'Some Platform')
        some_builder = Builder.get(Builder.create('some-builder', 'Some Builder'))
        some_test = Test.update_or_insert('some-test', some_branch, some_platform)
        self.assertThereIsNoInstanceOf(Runs)

        runs = Runs.update_or_insert(some_branch, some_platform, some_test)
        self.assertOnlyInstance(runs)
        self.assertEqual(runs.json_runs, '')
        self.assertEqual(runs.json_averages, '')
        self.assertEqual(runs.json_min, None)
        self.assertEqual(runs.json_max, None)
        old_memcache_value = memcache.get(Runs._key_name(some_branch.id, some_platform.id, some_test.id))
        self.assertTrue(old_memcache_value)

        runs.delete()
        self.assertThereIsNoInstanceOf(Runs)

        builds, results = self._create_results(some_branch, some_platform, some_builder, 'some-test', [50.0])
        runs = Runs.update_or_insert(some_branch, some_platform, some_test)
        self.assertOnlyInstance(runs)
        self.assertTrue(runs.json_runs.startswith('[5, [4, 0, 100, null],'))
        self.assertEqual(json.loads('{' + runs.json_averages + '}'), {"100": 50.0})
        self.assertEqual(runs.json_min, 50.0)
        self.assertEqual(runs.json_max, 50.0)
        self.assertNotEqual(memcache.get(Runs._key_name(some_branch.id, some_platform.id, some_test.id)), old_memcache_value)
Esempio n. 13
0
    def test_value_single_platform(self):
        some_branch = Branch.create_if_possible('some-branch', 'Some Branch')
        some_platform = Platform.create_if_possible('some-platform', 'Some Platform')
        self.assertEqual(ManifestJSONGenerator().value(), {'branchMap': {}, 'platformMap': {}, 'testMap': {}})

        some_test = Test.update_or_insert('some-test', some_branch, some_platform)
        self._assert_single_test(ManifestJSONGenerator().value(), some_branch, some_platform, some_test)
Esempio n. 14
0
    def test_to_json_with_results(self):
        some_branch = Branch.create_if_possible('some-branch', 'Some Branch')
        some_platform = Platform.create_if_possible('some-platform', 'Some Platform')
        some_builder = Builder.get(Builder.create('some-builder', 'Some Builder'))
        some_test = Test.update_or_insert('some-test', some_branch, some_platform)
        builds, results = self._create_results(some_branch, some_platform, some_builder, 'some-test', [50.0, 51.0, 52.0, 49.0, 48.0])

        value = json.loads(Runs.update_or_insert(some_branch, some_platform, some_test).to_json())
        self.assertEqualUnorderedList(value.keys(), ['test_runs', 'averages', 'min', 'max', 'unit', 'date_range', 'stat'])
        self.assertEqual(value['stat'], 'ok')
        self.assertEqual(value['min'], 48.0)
        self.assertEqual(value['max'], 52.0)
        self.assertEqual(value['unit'], None)
        self.assertEqual(value['date_range'], None)  # date_range is never given

        self.assertEqual(len(value['test_runs']), len(results))
        for i, run in enumerate(value['test_runs']):
            result = results[i]
            self.assertEqual(run[0], result.key().id())
            self.assertEqual(run[1][1], i)  # Build number
            self.assertEqual(run[1][2], 100 + i)  # Revision
            self.assertEqual(run[1][3], None)  # Supplementary revision
            self.assertEqual(run[3], result.value)
            self.assertEqual(run[6], some_builder.key().id())
            self.assertEqual(run[7], None)  # Statistics
Esempio n. 15
0
    def get(self):
        self.response.headers['Content-Type'] = 'application/json; charset=utf-8';
        cache = memcache.get('dashboard')
        if cache:
            self.response.out.write(cache)
            return

        webkit_trunk = Branch.get_by_key_name('webkit-trunk')

        # FIXME: Determine popular branches, platforms, and tests
        dashboard = {
            'defaultBranch': 'WebKit trunk',
            'branchToId': {webkit_trunk.name: webkit_trunk.id},
            'platformToId': {},
            'testToId': {},
        }

        for platform in Platform.all():
            dashboard['platformToId'][platform.name] = platform.id

        for test in Test.all():
            dashboard['testToId'][test.name] = test.id

        result = json.dumps(dashboard)
        self.response.out.write(result)
        memcache.add('dashboard', result)
Esempio n. 16
0
    def get(self, campaign_id, platform_name):
        """
        Handles incoming clicks for given campaign_id and platform_name.
        If click is valid then user is redirected to url defined in the campaign
        and statistic about this click is saved. All invalid clicks (e.g. for non
        existing campaigns, platforms) users are redirected to http://outfit7.com.
        """
        # cast campaign_id, type checking is done through route definition
        try:
            campaign_id = int(campaign_id)
        except ValueError:
            return webapp2.redirect("http://outfit7.com", permanent=True)

        platform_id = "%d-%s" % (campaign_id, platform_name)
        platform = Platform.get_by_id(platform_id)
        if platform:
            memcache.incr(platform_id, 1, namespace="counters", initial_value=0)
            try:
                deferred.defer(Platform.increment, platform_id, _countdown=TRACKER_COUNTER_UPDATE_INTERVAL_LENGTH,
                               _name="%s-%d" % (platform_id, get_interval_index()))
            except (taskqueue.TaskAlreadyExistsError, taskqueue.TombstonedTaskError), e:
                pass
            # TODO: optimize with async operations
            campaign = Campaign.get_by_id(campaign_id)
            return webapp2.redirect(campaign.link.encode("utf8"))
Esempio n. 17
0
    def test_to_json_with_unit(self):
        some_branch = Branch.create_if_possible('some-branch', 'Some Branch')
        some_platform = Platform.create_if_possible('some-platform', 'Some Platform')
        some_builder = Builder.get(Builder.create('some-builder', 'Some Builder'))
        some_test = Test.update_or_insert('some-test', some_branch, some_platform, 'runs/s')
        builds, results = self._create_results(some_branch, some_platform, some_builder, 'some-test', [50.0, 51.0, 52.0, 49.0, 48.0])

        value = json.loads(Runs.update_or_insert(some_branch, some_platform, some_test).to_json())
        self.assertEqual(value['unit'], 'runs/s')
Esempio n. 18
0
 def test_value_with_hidden_platform_and_tesst(self):
     webkit_trunk = Branch.create_if_possible('webkit-trunk', 'WebKit trunk')
     some_platform = Platform.create_if_possible('some-platform', 'Some Platform')
     hidden_platform = Platform.create_if_possible('hidden-platform', 'Hidden Platform')
     hidden_platform.hidden = True
     hidden_platform.put()
     Test.update_or_insert('some-test', webkit_trunk, some_platform)
     Test.update_or_insert('some-test', webkit_trunk, hidden_platform)
     Test.update_or_insert('other-test', webkit_trunk, some_platform)
     Test.update_or_insert('other-test', webkit_trunk, hidden_platform)
     Test.update_or_insert('hidden-test', webkit_trunk, some_platform)
     Test.update_or_insert('hidden-test', webkit_trunk, hidden_platform)
     hidden_test = Test.get_by_key_name('hidden-test')
     hidden_test.hidden = True
     hidden_test.put()
     self.assertEqual(DashboardJSONGenerator().value()['platformToId'], {'Some Platform': some_platform.id})
     self.assertEqual(DashboardJSONGenerator().value()['testToId'],
         {'some-test': Test.get_by_key_name('some-test').id, 'other-test': Test.get_by_key_name('other-test').id})
Esempio n. 19
0
    def test_platform(self):
        log = self._create_log_with_payload('{"key": "value"}')
        self.assertEqual(log.platform(), None)

        log = self._create_log_with_payload('{"platform": "some-platform"}')
        self.assertEqual(log.platform(), None)

        platform = Platform.create_if_possible("some-platform", "Some Platform")
        log = self._create_log_with_payload('{"platform": "some-platform"}')
        self.assertEqual(log.platform().key(), platform.key())
Esempio n. 20
0
    def test_update_or_insert(self):
        branch = Branch.create_if_possible('some-branch', 'Some Branch')
        platform = Platform.create_if_possible('some-platform', 'Some Platform')

        self.assertThereIsNoInstanceOf(Test)

        test = Test.update_or_insert('some-test', branch, platform)
        self.assertTrue(test)
        self.assertEqual(test.branches, [branch.key()])
        self.assertEqual(test.platforms, [platform.key()])
        self.assertOnlyInstance(test)
Esempio n. 21
0
    def test_value_two_platforms(self):
        some_branch = Branch.create_if_possible('some-branch', 'Some Branch')
        some_platform = Platform.create_if_possible('some-platform', 'Some Platform')
        other_platform = Platform.create_if_possible('other-platform', 'Other Platform')
        some_test = Test.update_or_insert('some-test', some_branch, some_platform)

        self._assert_single_test(ManifestJSONGenerator().value(), some_branch, some_platform, some_test)

        some_test = Test.update_or_insert('some-test', some_branch, other_platform)
        self.assertEqualUnorderedList(some_test.platforms, [some_platform.key(), other_platform.key()])

        value = ManifestJSONGenerator().value()
        expected_platform_ids = [some_platform.id, other_platform.id]
        self.assertEqualUnorderedList(value.keys(), ['branchMap', 'platformMap', 'testMap'])
        self.assertEqualUnorderedList(value['branchMap'],
            {some_branch.id: {'name': some_branch.name, 'testIds': [some_test.id], 'platformIds': expected_platform_ids}})
        self.assertEqual(value['platformMap'],
            {some_platform.id: {'name': some_platform.name, 'branchIds': [some_branch.id], 'testIds': [some_test.id]},
            other_platform.id: {'name': other_platform.name, 'branchIds': [some_branch.id], 'testIds': [some_test.id]}})
        self.assertEqual(value['testMap'],
            {some_test.id: {'name': some_test.name, 'branchIds': [some_branch.id], 'platformIds': expected_platform_ids}})
Esempio n. 22
0
 def test_value_without_results(self):
     some_branch = Branch.create_if_possible('some-branch', 'Some Branch')
     some_platform = Platform.create_if_possible('some-platform', 'Some Platform')
     self.assertThereIsNoInstanceOf(Test)
     self.assertThereIsNoInstanceOf(TestResult)
     self.assertEqual(Runs(some_branch, some_platform, 'some-test').value(), {
         'test_runs': [],
         'averages': {},
         'min': None,
         'max': None,
         'date_range': None,
         'stat': 'ok'})
Esempio n. 23
0
 def test_to_json_without_results(self):
     some_branch = Branch.create_if_possible('some-branch', 'Some Branch')
     some_platform = Platform.create_if_possible('some-platform', 'Some Platform')
     some_test = Test.update_or_insert('some-test', some_branch, some_platform)
     self.assertOnlyInstance(some_test)
     self.assertThereIsNoInstanceOf(TestResult)
     self.assertEqual(json.loads(Runs.update_or_insert(some_branch, some_platform, some_test).to_json()), {
         'test_runs': [],
         'averages': {},
         'min': None,
         'max': None,
         'date_range': None,
         'stat': 'ok'})
Esempio n. 24
0
 def test_to_json_without_results(self):
     some_branch = Branch.create_if_possible('some-branch', 'Some Branch')
     some_platform = Platform.create_if_possible('some-platform', 'Some Platform')
     some_test = Test.update_or_insert('some-test', some_branch, some_platform)
     self.assertOnlyInstance(some_test)
     self.assertThereIsNoInstanceOf(TestResult)
     self.assertEqual(json.loads(Runs.update_or_insert(some_branch, some_platform, some_test).to_json()), {
         'test_runs': [],
         'averages': {},
         'min': None,
         'max': None,
         'unit': None,
         'date_range': None,
         'stat': 'ok'})
Esempio n. 25
0
    def test_generate_runs(self):
        some_branch = Branch.create_if_possible('some-branch', 'Some Branch')
        some_platform = Platform.create_if_possible('some-platform', 'Some Platform')
        some_builder = Builder.get(Builder.create('some-builder', 'Some Builder'))

        results = self._create_results(some_branch, some_platform, some_builder, 'some-test', [50.0, 51.0, 52.0, 49.0, 48.0])
        last_i = 0
        for i, (build, result) in enumerate(Runs._generate_runs(some_branch, some_platform, "some-test")):
            self.assertEqual(build.buildNumber, i)
            self.assertEqual(build.revision, 100 + i)
            self.assertEqual(result.name, 'some-test')
            self.assertEqual(result.value, results[i].value)
            last_i = i
        self.assertTrue(last_i + 1, len(results))
Esempio n. 26
0
    def test_platform_games(self):
        p1 = Platform(name="Commodore 64", short="C64")
        p2 = Platform(name="Game Boy", short="GB")
        self.session.add(p1)
        self.session.add(p2)

        g1 = Game(name="A Random Game")
        g2 = Game(name="A Random Game 2")
        g3 = Game(name="A Random Game 2: Spinoff")
        g4 = Game(name="A Random Game 3: Return of the Jedi")
        g1.platforms.append(p1)
        g2.platforms.append(p1)
        g3.platforms.append(p2)
        g4.platforms.append(p1)
        g4.platforms.append(p2)

        self.session.add(g1)
        self.session.add(g2)
        self.session.add(g3)
        self.session.add(g4)

        self.assertEqual(len(p1.games.all()), 3)
        self.assertEqual(len(p2.games.all()), 2)
Esempio n. 27
0
 def test_value_two_platforms(self):
     webkit_trunk = Branch.create_if_possible('webkit-trunk',
                                              'WebKit trunk')
     some_platform = Platform.create_if_possible('some-platform',
                                                 'Some Platform')
     other_platform = Platform.create_if_possible('other-platform',
                                                  'Other Platform')
     Test.update_or_insert('some-test', webkit_trunk, some_platform)
     Test.update_or_insert('some-test', webkit_trunk, other_platform)
     self.assertEqual(
         DashboardJSONGenerator().value(), {
             'defaultBranch': 'WebKit trunk',
             'branchToId': {
                 'WebKit trunk': webkit_trunk.id
             },
             'platformToId': {
                 'Some Platform': some_platform.id,
                 'Other Platform': other_platform.id
             },
             'testToId': {
                 'some-test': Test.get_by_key_name('some-test').id
             },
         })
Esempio n. 28
0
    def get(self, platform_name):
        """List all existing campaigns available on a given platform."""
        @ndb.tasklet
        def callback(platform):
            campaign, platforms = yield platform.campaign.get_async(), \
                                        Platform.query(Platform.campaign == platform.campaign,
                                                       projection=[Platform.name, Platform.counter]).order(
                                            Platform.name).fetch_async(3)
            raise ndb.Return(campaign_to_dict(campaign, platforms=platforms))

        query = Platform.query(Platform.name == platform_name,
                               projection=[Platform.campaign])
        output = query.map(callback)
        return output
Esempio n. 29
0
 def test_game_platform_model_creation_2(self):
     c = Company.Company(*TestModels.test_company)
     db.session.add(c)
     db.session.commit()
     new_platform = Platform.Platform(1, "test platform")
     db.session.add(new_platform)
     db.session.commit()
     new_game_platform = Game_Platform.Game_Platform(1, 1)
     try:
         db.session.add(new_game_platform)
         db.session.commit()
         assert (False)
     except Exception as e:
         db.session.rollback()
Esempio n. 30
0
    def test_value_single_platform(self):
        some_branch = Branch.create_if_possible('some-branch', 'Some Branch')
        some_platform = Platform.create_if_possible('some-platform',
                                                    'Some Platform')
        self.assertEqual(ManifestJSONGenerator().value(), {
            'branchMap': {},
            'platformMap': {},
            'testMap': {}
        })

        some_test = Test.update_or_insert('some-test', some_branch,
                                          some_platform)
        self._assert_single_test(ManifestJSONGenerator().value(), some_branch,
                                 some_platform, some_test)
Esempio n. 31
0
    def test_value_with_hidden_platform_and_test(self):
        some_branch = Branch.create_if_possible('some-branch', 'Some Branch')
        some_platform = Platform.create_if_possible('some-platform', 'Some Platform')
        hidden_platform = Platform.create_if_possible('hidden-platform', 'Hidden Platform')
        hidden_platform.hidden = True
        hidden_platform.put()

        Test.update_or_insert('some-test', some_branch, some_platform)
        some_test = Test.update_or_insert('some-test', some_branch, hidden_platform)

        Test.update_or_insert('hidden-test', some_branch, some_platform)
        hidden_test = Test.update_or_insert('hidden-test', some_branch, hidden_platform)
        hidden_test.hidden = True
        hidden_test.put()

        value = ManifestJSONGenerator().value()
        expected_test_ids = []
        self.assertEqualUnorderedList(value.keys(), ['branchMap', 'platformMap', 'testMap'])
        self.assertEqual(value['branchMap'],
            {some_branch.id: {'name': some_branch.name, 'testIds': [some_test.id], 'platformIds': [some_platform.id]}})
        self.assertEqual(value['platformMap'],
            {some_platform.id: {'name': some_platform.name, 'branchIds': [some_branch.id], 'testIds': [some_test.id]}})
        self.assertEqual(value['testMap'],
            {some_test.id: {'name': some_test.name, 'branchIds': [some_branch.id], 'platformIds': [some_platform.id]}})
Esempio n. 32
0
    def test_generate_runs(self):
        some_branch = Branch.create_if_possible('some-branch', 'Some Branch')
        some_platform = Platform.create_if_possible('some-platform', 'Some Platform')
        some_builder = Builder.get(Builder.create('some-builder', 'Some Builder'))
        some_test = Test.update_or_insert('some-test', some_branch, some_platform)

        builds, results = self._create_results(some_branch, some_platform, some_builder, 'some-test', [50.0, 51.0, 52.0, 49.0, 48.0])
        last_i = 0
        for i, (build, result) in enumerate(Runs._generate_runs(some_branch, some_platform, some_test)):
            self.assertEqual(build.buildNumber, i)
            self.assertEqual(build.revision, 100 + i)
            self.assertEqual(result.name, 'some-test')
            self.assertEqual(result.value, results[i].value)
            last_i = i
        self.assertTrue(last_i + 1, len(results))
Esempio n. 33
0
    def test_chart_params_with_value(self):
        some_branch = Branch.create_if_possible('some-branch', 'Some Branch')
        some_platform = Platform.create_if_possible('some-platform',
                                                    'Some Platform')
        some_builder = Builder.get(
            Builder.create('some-builder', 'Some Builder'))
        some_test = Test.update_or_insert('some-test', some_branch,
                                          some_platform)

        start_time = datetime(2011, 2, 21, 12, 0, 0)
        end_time = datetime(2011, 2, 28, 12, 0, 0)
        results = self._create_results(
            some_branch, some_platform, some_builder, 'some-test',
            [50.0, 51.0, 52.0, 49.0, 48.0, 51.9, 50.7, 51.1],
            [start_time + timedelta(day) for day in range(0, 8)])

        # Use int despite of its impreciseness since tests may fail due to rounding errors otherwise.
        def split_as_int(string):
            return [int(float(value)) for value in string.split(',')]

        params = Runs.update_or_insert(some_branch, some_platform,
                                       some_test).chart_params(7, end_time)
        self.assertEqual(
            params['chxl'],
            '0:|Feb 21|Feb 22|Feb 23|Feb 24|Feb 25|Feb 26|Feb 27|Feb 28')
        self.assertEqual(split_as_int(params['chxr']),
                         [1, 0, 57, int(52 * 1.1 / 5 + 0.5)])
        x_min, x_max, y_min, y_max = split_as_int(params['chds'])
        self.assertEqual(datetime.fromtimestamp(x_min), start_time)
        self.assertEqual(datetime.fromtimestamp(x_max), end_time)
        self.assertEqual(y_min, 0)
        self.assertEqual(y_max, int(52 * 1.1))
        self.assertEqual(split_as_int(params['chg']), [int(100 / 7), 20, 0, 0])

        params = Runs.update_or_insert(some_branch, some_platform,
                                       some_test).chart_params(14, end_time)
        self.assertEqual(
            params['chxl'],
            '0:|Feb 14|Feb 16|Feb 18|Feb 20|Feb 22|Feb 24|Feb 26|Feb 28')
        self.assertEqual(split_as_int(params['chxr']),
                         [1, 0, 57, int(52 * 1.1 / 5 + 0.5)])
        x_min, x_max, y_min, y_max = split_as_int(params['chds'])
        self.assertEqual(datetime.fromtimestamp(x_min),
                         datetime(2011, 2, 14, 12, 0, 0))
        self.assertEqual(datetime.fromtimestamp(x_max), end_time)
        self.assertEqual(y_min, 0)
        self.assertEqual(y_max, int(52 * 1.1))
        self.assertEqual(split_as_int(params['chg']), [int(100 / 7), 20, 0, 0])
Esempio n. 34
0
    def setUp(self):
        self.pf_source_mock = MagicMock()
        self.scraper = Scraper("www.platform.url", "Test Platform", "tp", [self.pf_source_mock])

        # don't know how to mock properly yet so mocking out db
        # operations using partial mock.
        self.scraper.get_platform = MagicMock(name="get_platform")
        self.db_platform = Platform()
        self.scraper.get_platform.return_value = self.db_platform

        self.save_mock = MagicMock(name="save_batch")
        self.scraper.save_batch = self.save_mock

        self.logger_mock = Mock()
        get_logger_mock = Mock(return_value=self.logger_mock)
        self.scraper.get_logger = get_logger_mock
Esempio n. 35
0
    def test_to_json_with_unit(self):
        some_branch = Branch.create_if_possible('some-branch', 'Some Branch')
        some_platform = Platform.create_if_possible('some-platform',
                                                    'Some Platform')
        some_builder = Builder.get(
            Builder.create('some-builder', 'Some Builder'))
        some_test = Test.update_or_insert('some-test', some_branch,
                                          some_platform, 'runs/s')
        builds, results = self._create_results(some_branch, some_platform,
                                               some_builder, 'some-test',
                                               [50.0, 51.0, 52.0, 49.0, 48.0])

        value = json.loads(
            Runs.update_or_insert(some_branch, some_platform,
                                  some_test).to_json())
        self.assertEqual(value['unit'], 'runs/s')
Esempio n. 36
0
    def test_run_from_build_and_result(self):
        branch = Branch.create_if_possible('some-branch', 'Some Branch')
        platform = Platform.create_if_possible('some-platform', 'Some Platform')
        builder = Builder.get(Builder.create('some-builder', 'Some Builder'))
        test_name = ' some-test'

        def create_build(build_number, revision):
            timestamp = datetime.now().replace(microsecond=0)
            build = Build(branch=branch, platform=platform, builder=builder, buildNumber=build_number,
                revision=revision, timestamp=timestamp)
            build.put()
            return build

        build = create_build(1, 101)
        result = TestResult(name=test_name, value=123.0, build=build)
        result.put()
        self._assert_entry(Runs._entry_from_build_and_result(build, result), build, result, 123.0)

        build = create_build(2, 102)
        result = TestResult(name=test_name, value=456.0, valueMedian=789.0, build=build)
        result.put()
        self._assert_entry(Runs._entry_from_build_and_result(build, result), build, result, 456.0)

        result.valueStdev = 7.0
        result.put()
        self._assert_entry(Runs._entry_from_build_and_result(build, result), build, result, 456.0)

        result.valueStdev = None
        result.valueMin = 123.0
        result.valueMax = 789.0
        result.put()
        self._assert_entry(Runs._entry_from_build_and_result(build, result), build, result, 456.0)

        result.valueStdev = 8.0
        result.valueMin = 123.0
        result.valueMax = 789.0
        result.put()
        self._assert_entry(Runs._entry_from_build_and_result(build, result), build, result, 456.0,
            statistics={'stdev': 8.0, 'min': 123.0, 'max': 789.0})

        result.valueMedian = 345.0  # Median is never used by the frontend.
        result.valueStdev = 8.0
        result.valueMin = 123.0
        result.valueMax = 789.0
        result.put()
        self._assert_entry(Runs._entry_from_build_and_result(build, result), build, result, 456.0,
            statistics={'stdev': 8.0, 'min': 123.0, 'max': 789.0})
Esempio n. 37
0
    def test_run_from_build_and_result(self):
        branch = Branch.create_if_possible('some-branch', 'Some Branch')
        platform = Platform.create_if_possible('some-platform', 'Some Platform')
        builder = Builder.get(Builder.create('some-builder', 'Some Builder'))
        test_name = ' some-test'

        def create_build(build_number, revision):
            timestamp = datetime.now().replace(microsecond=0)
            build = Build(branch=branch, platform=platform, builder=builder, buildNumber=build_number,
                revision=revision, timestamp=timestamp)
            build.put()
            return build

        build = create_build(1, 101)
        result = TestResult(name=test_name, value=123.0, build=build)
        result.put()
        self._assert_entry(Runs._entry_from_build_and_result(build, result), build, result, 123.0)

        build = create_build(2, 102)
        result = TestResult(name=test_name, value=456.0, valueMedian=789.0, build=build)
        result.put()
        self._assert_entry(Runs._entry_from_build_and_result(build, result), build, result, 456.0)

        result.valueStdev = 7.0
        result.put()
        self._assert_entry(Runs._entry_from_build_and_result(build, result), build, result, 456.0)

        result.valueStdev = None
        result.valueMin = 123.0
        result.valueMax = 789.0
        result.put()
        self._assert_entry(Runs._entry_from_build_and_result(build, result), build, result, 456.0)

        result.valueStdev = 8.0
        result.valueMin = 123.0
        result.valueMax = 789.0
        result.put()
        self._assert_entry(Runs._entry_from_build_and_result(build, result), build, result, 456.0,
            statistics={'stdev': 8.0, 'min': 123.0, 'max': 789.0})

        result.valueMedian = 345.0  # Median is never used by the frontend.
        result.valueStdev = 8.0
        result.valueMin = 123.0
        result.valueMax = 789.0
        result.put()
        self._assert_entry(Runs._entry_from_build_and_result(build, result), build, result, 456.0,
            statistics={'stdev': 8.0, 'min': 123.0, 'max': 789.0})
Esempio n. 38
0
    def test_value_two_tests(self):
        some_branch = Branch.create_if_possible('some-branch', 'Some Branch')
        some_platform = Platform.create_if_possible('some-platform',
                                                    'Some Platform')
        some_test = Test.update_or_insert('some-test', some_branch,
                                          some_platform)

        self._assert_single_test(ManifestJSONGenerator().value(), some_branch,
                                 some_platform, some_test)

        other_test = Test.update_or_insert('other-test', some_branch,
                                           some_platform)

        value = ManifestJSONGenerator().value()
        expected_test_ids = [some_test.id, other_test.id]
        self.assertEqualUnorderedList(value.keys(),
                                      ['branchMap', 'platformMap', 'testMap'])
        self.assertEqual(
            value['branchMap'], {
                some_branch.id: {
                    'name': some_branch.name,
                    'testIds': expected_test_ids,
                    'platformIds': [some_platform.id]
                }
            })
        self.assertEqual(
            value['platformMap'], {
                some_platform.id: {
                    'name': some_platform.name,
                    'branchIds': [some_branch.id],
                    'testIds': expected_test_ids
                }
            })
        self.assertEqual(
            value['testMap'], {
                some_test.id: {
                    'name': some_test.name,
                    'branchIds': [some_branch.id],
                    'platformIds': [some_platform.id]
                },
                other_test.id: {
                    'name': other_test.name,
                    'branchIds': [some_branch.id],
                    'platformIds': [some_platform.id]
                }
            })
Esempio n. 39
0
def process_id(upload_id):
    from run import config
    # Fetch upload id
    queued_sample = QueuedSample.query.filter(
        QueuedSample.id == upload_id).first()
    if queued_sample is not None:
        if queued_sample.user_id == g.user.id:
            # Allowed to process
            versions = CCExtractorVersion.query.all()
            form = FinishQueuedSampleForm(request.form)
            form.version.choices = [(v.id, v.version) for v in versions]
            if form.validate_on_submit():
                # Store in DB
                db_committed = False
                temp_path = os.path.join(config.get('SAMPLE_REPOSITORY', ''),
                                         'QueuedFiles', queued_sample.filename)
                final_path = os.path.join(config.get('SAMPLE_REPOSITORY', ''),
                                          'TestFiles', queued_sample.filename)
                try:
                    extension = queued_sample.extension[1:] if len(
                        queued_sample.extension) > 0 else ""
                    sample = Sample(queued_sample.sha, extension,
                                    queued_sample.original_name)
                    g.db.add(sample)
                    g.db.flush([sample])
                    uploaded = Upload(g.user.id, sample.id, form.version.data,
                                      Platform.from_string(form.platform.data),
                                      form.parameters.data, form.notes.data)
                    g.db.add(uploaded)
                    g.db.delete(queued_sample)
                    g.db.commit()
                    db_committed = True
                except:
                    traceback.print_exc()
                    g.db.rollback()
                # Move file
                if db_committed:
                    os.rename(temp_path, final_path)
                    return redirect(
                        url_for('sample.sample_by_id', sample_id=sample.id))

            return {'form': form, 'queued_sample': queued_sample}

    # Raise error
    raise QueuedSampleNotFoundException()
Esempio n. 40
0
    def delete(self, campaign_id):
        """Delete the existing campaign."""
        campaign_id = int(campaign_id)
        campaign = Campaign.get_by_id(campaign_id)

        if campaign:
            # delete the campaign first, so that updates are not possible
            futures = [campaign.key.delete_async()]
            # delete all platforms that correspond to the campaign
            futures.extend(
                ndb.delete_multi_async([
                    platform.key for platform in Platform.query(
                        Platform.campaign == campaign.key).fetch(3)
                ]))
            Future.wait_all(futures)
        else:
            # the campaign does not exist, just send 204
            self.response.status_int = 204
Esempio n. 41
0
    def test_json_by_ids(self):
        some_branch = Branch.create_if_possible('some-branch', 'Some Branch')
        some_platform = Platform.create_if_possible('some-platform', 'Some Platform')
        some_builder = Builder.get(Builder.create('some-builder', 'Some Builder'))
        some_test = Test.update_or_insert('some-test', some_branch, some_platform)

        self._create_results(some_branch, some_platform, some_builder, 'some-test', [50.0])
        runs = Runs.update_or_insert(some_branch, some_platform, some_test)
        runs_json = runs.to_json()

        key_name = Runs._key_name(some_branch.id, some_platform.id, some_test.id)
        self.assertEqual(Runs.json_by_ids(some_branch.id, some_platform.id, some_test.id), runs_json)
        self.assertEqual(memcache.get(key_name), runs_json)

        memcache.set(key_name, 'blah')
        self.assertEqual(Runs.json_by_ids(some_branch.id, some_platform.id, some_test.id), 'blah')

        memcache.delete(key_name)
        self.assertEqual(Runs.json_by_ids(some_branch.id, some_platform.id, some_test.id), runs_json)
        self.assertEqual(memcache.get(key_name), runs_json)
Esempio n. 42
0
    def __init__(self):
        # FIXME: Don't hard-code webkit-trunk here; ideally we want this be customizable.
        webkit_trunk = Branch.get_by_key_name('webkit-trunk')
        if not webkit_trunk:
            self._dashboard = None
            return

        # FIXME: Determine popular branches, platforms, and tests
        self._dashboard = {
            'defaultBranch': 'WebKit trunk',
            'branchToId': {webkit_trunk.name: webkit_trunk.id},
            'platformToId': {},
            'testToId': {},
        }

        for platform in Platform.all():
            self._dashboard['platformToId'][platform.name] = platform.id

        for test in Test.all():
            self._dashboard['testToId'][test.name] = test.id
Esempio n. 43
0
    def test_json_by_ids(self):
        some_branch = Branch.create_if_possible('some-branch', 'Some Branch')
        some_platform = Platform.create_if_possible('some-platform', 'Some Platform')
        some_builder = Builder.get(Builder.create('some-builder', 'Some Builder'))
        some_test = Test.update_or_insert('some-test', some_branch, some_platform)

        self._create_results(some_branch, some_platform, some_builder, 'some-test', [50.0])
        runs = Runs.update_or_insert(some_branch, some_platform, some_test)
        runs_json = runs.to_json()

        key_name = Runs._key_name(some_branch.id, some_platform.id, some_test.id)
        self.assertEqual(Runs.json_by_ids(some_branch.id, some_platform.id, some_test.id), runs_json)
        self.assertEqual(memcache.get(key_name), runs_json)

        memcache.set(key_name, 'blah')
        self.assertEqual(Runs.json_by_ids(some_branch.id, some_platform.id, some_test.id), 'blah')

        memcache.delete(key_name)
        self.assertEqual(Runs.json_by_ids(some_branch.id, some_platform.id, some_test.id), runs_json)
        self.assertEqual(memcache.get(key_name), runs_json)
Esempio n. 44
0
    def test_update_or_insert(self):
        some_branch = Branch.create_if_possible('some-branch', 'Some Branch')
        some_platform = Platform.create_if_possible('some-platform',
                                                    'Some Platform')
        some_builder = Builder.get(
            Builder.create('some-builder', 'Some Builder'))
        some_test = Test.update_or_insert('some-test', some_branch,
                                          some_platform)
        self.assertThereIsNoInstanceOf(Runs)

        runs = Runs.update_or_insert(some_branch, some_platform, some_test)
        self.assertOnlyInstance(runs)
        self.assertEqual(runs.json_runs, '')
        self.assertEqual(runs.json_averages, '')
        self.assertEqual(runs.json_min, None)
        self.assertEqual(runs.json_max, None)
        old_memcache_value = memcache.get(
            Runs._key_name(some_branch.id, some_platform.id, some_test.id))
        self.assertTrue(old_memcache_value)

        runs.delete()
        self.assertThereIsNoInstanceOf(Runs)

        builds, results = self._create_results(some_branch, some_platform,
                                               some_builder, 'some-test',
                                               [50.0])
        runs = Runs.update_or_insert(some_branch, some_platform, some_test)
        self.assertOnlyInstance(runs)
        self.assertTrue(runs.json_runs.startswith('[5, [4, 0, 100, null],'))
        self.assertEqual(json.loads('{' + runs.json_averages + '}'),
                         {"100": 50.0})
        self.assertEqual(runs.json_min, 50.0)
        self.assertEqual(runs.json_max, 50.0)
        self.assertNotEqual(
            memcache.get(
                Runs._key_name(some_branch.id, some_platform.id,
                               some_test.id)), old_memcache_value)
Esempio n. 45
0
def increase_user_resource(total_fee: int, out_trade_no: str,
                           transaction_id: str, attach: str):
    # 根据out_trade_no检查数据库订单
    order = Order.get(out_trade_no=out_trade_no)
    assert order
    assert not order.is_paid()
    account = Account.get(user_id=order.user_id, platform_id=order.platform_id)
    assert account
    # 计算时长叠加
    tariff = Tariff.attach_to_tariff(attach)
    before = account.expired_at
    after = tariff.increase_duration(before)
    with transaction.atomic():
        # 变更免费资源
        account.update(expired_at=after)
        # 变更订单状态 和 微信订单号
        order.update(status=Order.Status.PAID.value,
                     transaction_id=transaction_id)
        # 插入免费资源历史变更表
        ResourceChange.create(user_id=account.user_id,
                              out_trade_no=order.out_trade_no,
                              before=before,
                              after=after)
    log.i(
        f"UPDATE orders SET status = '{order.status}', transaction_id = '{transaction_id}' WHERE out_trade_no = '{out_trade_no}'"
    )
    # 公众号消息通知owner
    platform = Platform.get(platform_id=account.platform_id)
    user = User.get(user_id=account.user_id)
    owner = User.get(user_id=platform.owner_user_id)
    WePush.notify_owner_order_paid(platform_id=platform.platform_id,
                                   openid=owner.openid,
                                   total_fee=order.total_fee,
                                   nickname=user.nickname,
                                   paid_at=order.updated_at,
                                   trade_no=out_trade_no)
Esempio n. 46
0
    def __init__(self):
        # FIXME: Don't hard-code webkit-trunk here; ideally we want this be customizable.
        webkit_trunk = Branch.get_by_key_name('webkit-trunk')
        if not webkit_trunk:
            self._dashboard = None
            return

        # FIXME: Determine popular branches, platforms, and tests
        self._dashboard = {
            'defaultBranch': 'WebKit trunk',
            'branchToId': {
                webkit_trunk.name: webkit_trunk.id
            },
            'platformToId': {},
            'testToId': {},
        }

        for platform in Platform.all():
            if not platform.hidden:
                self._dashboard['platformToId'][platform.name] = platform.id

        for test in Test.all():
            if not test.hidden:
                self._dashboard['testToId'][test.name] = test.id
Esempio n. 47
0
 def test_results_in_array(self):
     platform = Platform.create_if_possible("some-platform", "Some Platform")
     log = self._create_log_with_payload('[{"platform": "some-platform", "build-number": 123, "webkit-revision": 456}]')
     self.assertEqual(log.platform().key(), platform.key())
     self.assertEqual(log.build_number(), 123)
     self.assertEqual(log.webkit_revision(), 456)
Esempio n. 48
0
def process_id(upload_id):
    """
    Process the sample that is uploaded to the platform

    :param upload_id: The identity of uploaded file that will be processed
    :type upload_id: str
    :return: Process progress in form and queue the sample
    :rtype: str
    """
    from run import config, log
    # Fetch upload id
    queued_sample = QueuedSample.query.filter(
        QueuedSample.id == upload_id).first()
    if queued_sample is not None:
        if queued_sample.user_id == g.user.id:
            # Allowed to process
            versions = CCExtractorVersion.query.all()
            form = FinishQueuedSampleForm(request.form)
            form.version.choices = [(v.id, v.version) for v in versions]
            if form.validate_on_submit():
                # Store in DB
                db_committed = False
                repo_folder = config.get('SAMPLE_REPOSITORY', '')
                temp_path = os.path.join(repo_folder, 'QueuedFiles',
                                         queued_sample.filename)
                final_path = os.path.join(repo_folder, 'TestFiles',
                                          queued_sample.filename)
                try:
                    extension = queued_sample.extension[1:] if len(
                        queued_sample.extension) > 0 else ""
                    sample = Sample(queued_sample.sha, extension,
                                    queued_sample.original_name)
                    g.db.add(sample)
                    g.db.flush([sample])
                    uploaded = Upload(g.user.id, sample.id, form.version.data,
                                      Platform.from_string(form.platform.data),
                                      form.parameters.data, form.notes.data)
                    g.db.add(uploaded)
                    g.db.delete(queued_sample)
                    g.db.commit()
                    db_committed = True
                except Exception:
                    traceback.print_exc()
                    g.db.rollback()
                # Move file
                if db_committed:
                    if form.report.data == 'y':
                        data = ""
                        try:
                            kvm_name = config.get('KVM_LINUX_NAME', '')
                            repo = Repo(
                                os.path.join(repo_folder, 'vm_data', kvm_name,
                                             'unsafe-ccextractor'))
                            data = repo.git.show('{branch}:{file}'.format(
                                branch=repo.heads.master,
                                file='.github/ISSUE_TEMPLATE.md'))
                        except InvalidGitRepositoryError:
                            log.critical(
                                " Could not open CCExtractor's repository ")

                        version = CCExtractorVersion.query.filter(
                            CCExtractorVersion.id ==
                            form.version.data).first()
                        data = data.replace('**X.X**', version.version)
                        data = data.replace('[ ] I have read',
                                            '[X] I have read')
                        data = data.replace('[ ] I have checked',
                                            '[X] I have checked')
                        data = data.replace('[ ] I have used',
                                            '[X] I have used')
                        data = data.replace(
                            '[ ] I am an active contributor to CCExtractor.',
                            '[X] I used the platform to submit this issue!')
                        data = data.replace(
                            '`-autoprogram`',
                            '`{param}`'.format(param=form.parameters.data,
                                               version=form.version.data))
                        platform = form.platform.data.title()
                        data = data.replace('[ ] ' + platform,
                                            '[X] ' + platform)
                        # Remove everything starting from the video links
                        data = data[:data.find('**Video links**')]
                        # Append our own content here
                        sample_link = url_for('sample.sample_by_id',
                                              sample_id=sample.id,
                                              _external=True)
                        data += '**Sample**\n\n[Sample {id}]({link}) was uploaded on the sample platform.\n'.format(
                            id=sample.id, link=sample_link)
                        data += '**Extra information**\n\n*Notes:*\n{notes}\n*Description:*\n{desc}'.format(
                            notes=form.notes.data, desc=form.IssueBody.data)
                        issue_title = '[BUG] {data}'.format(
                            data=form.IssueTitle.data)
                        issue_upload = make_github_issue(
                            issue_title, data,
                            ['bug', 'sample' + str(sample.id)])

                        if issue_upload != 'ERROR':
                            issue_data = json.loads(issue_upload)
                            issue_id = issue_data['number']
                            issue_title = issue_data['title']
                            issue_user = issue_data['user']['login']
                            issue_date = issue_data['created_at']
                            issue_status = issue_data['state']
                            issue = Issue(sample.id, issue_id, issue_date,
                                          issue_title, issue_user,
                                          issue_status)
                            g.db.add(issue)
                            g.db.commit()
                        else:
                            flash(
                                'Could not submit an issue on GitHub (did you revoke permissions for the  platform?).'
                                ' Please submit it manually.')

                    os.rename(temp_path, final_path)
                    return redirect(
                        url_for('sample.sample_by_id', sample_id=sample.id))

            return {'form': form, 'queued_sample': queued_sample}

    # Raise error
    raise QueuedSampleNotFoundException()
Esempio n. 49
0
 def callback(platform):
     campaign, platforms = yield platform.campaign.get_async(), \
                                 Platform.query(Platform.campaign == platform.campaign,
                                                projection=[Platform.name, Platform.counter]).order(
                                     Platform.name).fetch_async(3)
     raise ndb.Return(campaign_to_dict(campaign, platforms=platforms))
Esempio n. 50
0
    def test_update_incrementally(self):
        some_branch = Branch.create_if_possible('some-branch', 'Some Branch')
        some_platform = Platform.create_if_possible('some-platform',
                                                    'Some Platform')
        some_builder = Builder.get(
            Builder.create('some-builder', 'Some Builder'))
        some_test = Test.update_or_insert('some-test', some_branch,
                                          some_platform)
        self.assertThereIsNoInstanceOf(Runs)

        timestamps = [datetime.now(), datetime.now()]
        builds, results = self._create_results(some_branch, some_platform,
                                               some_builder, 'some-test',
                                               [50.0, 52.0], timestamps)
        runs = Runs.update_or_insert(some_branch, some_platform, some_test)
        self.assertOnlyInstance(runs)
        self.assertEqual(
            json.loads('[' + runs.json_runs + ']'),
            [[
                5, [4, 0, 100, None],
                mktime(timestamps[0].timetuple()), 50.0, 0, [], None, None
            ],
             [
                 7, [6, 1, 101, None],
                 mktime(timestamps[1].timetuple()), 52.0, 0, [], None, None
             ]])
        self.assertEqual(json.loads('{' + runs.json_averages + '}'), {
            "100": 50.0,
            "101": 52.0
        })
        self.assertEqual(runs.json_min, 50.0)
        self.assertEqual(runs.json_max, 52.0)

        timestamps.append(datetime.now())
        builds, results = self._create_results(some_branch,
                                               some_platform,
                                               some_builder,
                                               'some-test', [48.0],
                                               timestamps[2:],
                                               starting_revision=102)
        runs.update_incrementally(builds[0], results[0])

        self.assertOnlyInstance(runs)
        self.assertEqual(
            json.loads('[' + runs.json_runs + ']'),
            [[
                5, [4, 0, 100, None],
                mktime(timestamps[0].timetuple()), 50.0, 0, [], None, None
            ],
             [
                 7, [6, 1, 101, None],
                 mktime(timestamps[1].timetuple()), 52.0, 0, [], None, None
             ],
             [
                 9, [8, 0, 102, None],
                 mktime(timestamps[2].timetuple()), 48.0, 0, [], None, None
             ]])
        self.assertEqual(json.loads('{' + runs.json_averages + '}'), {
            "100": 50.0,
            "101": 52.0,
            "102": 48.0
        })
        self.assertEqual(runs.json_min, 48.0)
        self.assertEqual(runs.json_max, 52.0)
Esempio n. 51
0
 def get(self, campaign_id, platform_name):
     """Retrieves the number of clicks for given campaign on the given platform."""
     campaign_id = int(campaign_id)
     platform = Platform.get_by_id("%d-%s" % (campaign_id, platform_name))
     return platform_to_dict(platform)
Esempio n. 52
0
 def test_results_in_array(self):
     platform = Platform.create_if_possible("some-platform", "Some Platform")
     log = self._create_log_with_payload('[{"platform": "some-platform", "build-number": 123, "webkit-revision": 456}]')
     self.assertEqual(log.platform().key(), platform.key())
     self.assertEqual(log.build_number(), 123)
     self.assertEqual(log.webkit_revision(), 456)
Esempio n. 53
0
        def get_reply_msg():
            # 被动回复 https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Passive_user_reply_message.html
            if isinstance(msg, SubscribeScanEvent) or isinstance(
                    msg, ScanEvent):
                # 未关注用户扫描带参数二维码事件 - 订阅关注
                # 已关注用户扫描带参数二维码事件
                platform_id = int(msg.scene_id)
                platform = Platform.get(platform_id=platform_id)
                assert platform
                user = User.get(openid=from_user_openid)
                if not user:
                    # 创建 user
                    user = User.create(openid=from_user_openid,
                                       bind_platform_id=platform.platform_id)
                else:
                    # user 表记录, 存在
                    if user.bind_platform_id != platform.platform_id:
                        log.w(
                            f'platform_id change: {user.bind_platform_id} -> {platform.platform_id}, openid: {user.openid}'
                        )
                        user.update(bind_platform_id=platform.platform_id)
                account = Account.get(user_id=user.user_id,
                                      platform_id=user.bind_platform_id)
                if not account:
                    # 创建 account
                    username = MyRandom.random_digit(length=8)
                    expired_at = Datetime.localtime() + datetime.timedelta(
                        days=1)  # 新账户一天内免费
                    account = Account.create(
                        user_id=user.user_id,
                        platform_id=user.bind_platform_id,
                        username=username,
                        password=username,
                        radius_password=username,
                        role=Account.Role.PAY_USER.value,
                        expired_at=expired_at,
                    )
                sentry_sdk.capture_message(
                    f'有用户扫描带参数二维码, platform_id: {platform.platform_id}, openid: {from_user_openid}'
                )
                # 判断是否允许房东注册
                if platform.platform_id == settings.ADMIN_PLATFORM_ID:
                    redis = get_redis()
                    if redis.get('enable_platform_register'):
                        # 新创建平台
                        new_platform = create_new_platform(
                            user_id=user.user_id)
                        platform_url = f'{settings.API_SERVER_URL}/platform/{new_platform.platform_id}'
                        sentry_sdk.capture_message(
                            f'房东平台已建立, platform_url: {platform_url}')
                        redis.delete('enable_platform_register')
                # 应答
                return TextReply(
                    source=appid,
                    target=from_user_openid,
                    content=
                    f'账号: {account.username}\n密码: {account.password}\n状态: {account.status}'
                )

            if isinstance(msg, ClickEvent):
                # 点击按钮 - 账号中心
                if msg.key == WeClient.ACCOUNT_VIEW_BTN_EVENT:
                    user = User.get(openid=from_user_openid)
                    if not user or user.bind_platform_id is None:
                        # 用户未经扫码, 进入公众号
                        return TextReply(source=appid,
                                         target=from_user_openid,
                                         content=f'请先扫描房东的WIFI二维码')
                    else:
                        platform = Platform.get(
                            platform_id=user.bind_platform_id)
                        if platform.is_platform_owner(
                                user_id=user.user_id
                        ) and not settings.is_admin(openid=from_user_openid):
                            # 房东不能打开充值页面, 但 admin 可以
                            return TextReply(source=appid,
                                             target=from_user_openid,
                                             content=f'房东不允许打开充值页面')
                        r = ArticlesReply(source=appid,
                                          target=from_user_openid)
                        r.add_article({
                            'title': f'点击进入',
                            'description': '查询WIFI密码 / WIFI续费',
                            'image':
                            'http://zlxpic.lynatgz.cn/zhuzaiyuan_mini.jpg',
                            'url': WeClient.ACCOUNT_VIEW_URI,
                        })
                        return r
                elif msg.key == WeClient.CUSTOMER_SERVICE_BTN_EVENT:
                    return TextReply(source=appid,
                                     target=from_user_openid,
                                     content=settings.MP_DEFAULT_REPLY)

            elif isinstance(msg, SubscribeEvent):  # 关注公众号事件
                pass

            elif isinstance(msg, TextMessage):  # 文本消息
                if msg.content in ['help', '帮助', '命令']:
                    command = [
                        'id',
                        '搜索 $name',
                        'free',
                        '放通mac',
                        '房东注册',
                    ]
                    message = '命令:\n  ' + '\n  '.join(command)
                    return TextReply(source=appid,
                                     target=from_user_openid,
                                     content=message)

                elif msg.content == 'id':
                    # 查看用户ID
                    user = User.get(openid=from_user_openid)
                    messages = [
                        f'你的信息:',
                        f'openid: {user.openid}',
                        f'user_id: {user.user_id}',
                    ]
                    return TextReply(source=appid,
                                     target=from_user_openid,
                                     content='\n'.join(messages))

                # 以下命令需要 admin 权限
                elif msg.content.startswith('搜索') and settings.is_admin(
                        openid=from_user_openid):
                    # 搜索用户信息
                    name = msg.content.split('搜索')[1].strip()
                    return TextReply(
                        source=appid,
                        target=from_user_openid,
                        content=
                        f'{settings.API_SERVER_URL}/search/user?name={name}')

                elif msg.content.startswith('放通mac') and settings.is_admin(
                        openid=from_user_openid):
                    redis = get_redis()
                    ex = 60 * 5
                    redis.set('enable_mac_authentication',
                              str(datetime.datetime.now()),
                              ex=ex)
                    return TextReply(source=appid,
                                     target=from_user_openid,
                                     content=f'有效时间: {ex}秒')

                elif msg.content.startswith('房东注册') and settings.is_admin(
                        openid=from_user_openid):
                    redis = get_redis()
                    ex = 60 * 5
                    redis.set('enable_platform_register',
                              str(datetime.datetime.now()),
                              ex=ex)
                    return TextReply(source=appid,
                                     target=from_user_openid,
                                     content=f'有效时间: {ex}秒')

                elif msg.content.startswith('free') and settings.is_admin(
                        openid=from_user_openid):
                    expired_at = Datetime.localtime() + datetime.timedelta(
                        minutes=30)
                    account = Account.get(user_id=0, platform_id=0)
                    if not account:
                        account = Account.create(
                            user_id=0,
                            platform_id=0,
                            username='******',
                            password='******',
                            radius_password='******',
                            role=Account.Role.FREE_USER.value,
                            expired_at=expired_at,
                        )
                    else:
                        account.update(expired_at=expired_at)
                    content = f'用户名: {account.username}, 密码: {account.password}, 失效时间: {Datetime.to_str(expired_at, fmt="%Y-%m-%d %H:%M:%S")}'
                    return TextReply(source=appid,
                                     target=from_user_openid,
                                     content=content)

                else:
                    return TextReply(source=appid,
                                     target=from_user_openid,
                                     content=settings.MP_DEFAULT_REPLY)
            return None
Esempio n. 54
0
def _create_some_builder():
    branch = Branch.create_if_possible('some-branch', 'Some Branch')
    platform = Platform.create_if_possible('some-platform', 'Some Platform')
    builder_key = Builder.create('some-builder', 'Some Builder')
    return branch, platform, Builder.get(builder_key)
Esempio n. 55
0
    def __init__(self):
        # FIXME: This function is massive. Break it up
        self._test_map = {}
        platform_id_map = {}
        branch_id_map = {}
        for test in Test.all():
            if test.hidden:
                continue

            branch_ids = [
                Branch.get(branch_key).id for branch_key in test.branches
            ]
            platform_ids = [
                Platform.get(platform_key).id
                for platform_key in test.platforms
            ]
            self._test_map[test.id] = {
                'name': test.name,
                'branchIds': branch_ids,
                'platformIds': platform_ids,
            }

            for platform_id in platform_ids:
                platform_id_map.setdefault(platform_id, {
                    'tests': [],
                    'branches': []
                })
                platform_id_map[platform_id]['tests'].append(test.id)
                platform_id_map[platform_id]['branches'] += branch_ids

            for branch_id in branch_ids:
                branch_id_map.setdefault(branch_id, {
                    'tests': [],
                    'platforms': []
                })
                branch_id_map[branch_id]['tests'].append(test.id)
                branch_id_map[branch_id]['platforms'] += platform_ids

        self._platform_map = {}
        for platform in Platform.all():
            if platform.id not in platform_id_map:
                continue

            if platform.hidden:
                for test_id in platform_id_map[platform.id]['tests']:
                    self._test_map[test_id]['platformIds'].remove(platform.id)
                for branch_id in platform_id_map[platform.id]['branches']:
                    branch_id_map[branch_id]['platforms'].remove(platform.id)
                continue

            self._platform_map[platform.id] = {
                'name': platform.name,
                'testIds': list(set(platform_id_map[platform.id]['tests'])),
                'branchIds':
                list(set(platform_id_map[platform.id]['branches'])),
            }

        self._branch_map = {}
        for branch in Branch.all():
            if branch.id not in branch_id_map:
                continue
            self._branch_map[branch.id] = {
                'name': branch.name,
                'testIds': list(set(branch_id_map[branch.id]['tests'])),
                'platformIds':
                list(set(branch_id_map[branch.id]['platforms'])),
            }
Esempio n. 56
0
 def _create_platform(self, key, name):
     if not key or not name:
         return 'Invalid key name'
     return None if Platform.create_if_possible(
         key, name) else 'Platform "%s" already exists' % key
Esempio n. 57
0
 def test_update_or_insert_with_unit(self):
     branch = Branch.create_if_possible('some-branch', 'Some Branch')
     platform = Platform.create_if_possible('some-platform', 'Some Platform')
     test = Test.update_or_insert('some-test', branch, platform, 'runs/s')
     self.assertOnlyInstance(test)
     self.assertEqualUnorderedList(test.unit, 'runs/s')
Esempio n. 58
0
def _create_some_builder():
    branch = Branch.create_if_possible('some-branch', 'Some Branch')
    platform = Platform.create_if_possible('some-platform', 'Some Platform')
    builder_key = Builder.create('some-builder', 'Some Builder')
    return branch, platform, Builder.get(builder_key)
Esempio n. 59
0
 def callback(campaign):
     platforms = yield Platform.query(
         Platform.campaign == campaign.key,
         projection=[Platform.name, Platform.counter
                     ]).order(Platform.name).fetch_async(3)
     raise ndb.Return(campaign_to_dict(campaign, platforms=platforms))
Esempio n. 60
0
Base.metadata.bind = engine

DBSession = sessionmaker(bind=engine)
# A DBSession() instance establishes all conversations with the database
# and represents a "staging zone" for all the objects loaded into the
# database session object. Any change made against the objects in the
# session won't be persisted into the database until you call
# session.commit(). If you're not happy about the changes, you can
# revert all of them back to the last commit by calling
# session.rollback()
session = DBSession()

platform1 = Platform(id=1,
                     user_id=1,
                     name='Playstation',
                     medium='CD',
                     internet_enabled=False,
                     controller_ports=2,
                     manufacturer='Sony',
                     release_date=datetime.date(1994, 12, 3))

session.add(platform1)
session.commit()

game1 = Game(user_id=1,
             title='Metal Gear Solid',
             developer='Konami Computer Entertainment Japan',
             publisher='Konami',
             platform_id=1,
             release_date=datetime.date(1996, 12, 3))

session.add(game1)