Example #1
0
 def setUp(self):
     self.some_feature = 'feature_0'
     self.some_other_feature = 'feature_1'
     self.some_impression_0 = Impression(matching_key=mock.MagicMock(),
                                         feature_name=self.some_feature,
                                         treatment=mock.MagicMock(),
                                         label=mock.MagicMock(),
                                         change_number=mock.MagicMock(),
                                         bucketing_key=mock.MagicMock(),
                                         time=mock.MagicMock())
     self.some_impression_1 = Impression(
         matching_key=mock.MagicMock(),
         feature_name=self.some_other_feature,
         treatment=mock.MagicMock(),
         label=mock.MagicMock(),
         change_number=mock.MagicMock(),
         bucketing_key=mock.MagicMock(),
         time=mock.MagicMock())
     self.some_impression_2 = Impression(
         matching_key=mock.MagicMock(),
         feature_name=self.some_other_feature,
         treatment=mock.MagicMock(),
         label=mock.MagicMock(),
         change_number=mock.MagicMock(),
         bucketing_key=mock.MagicMock(),
         time=mock.MagicMock())
Example #2
0
    def setUp(self):
        self._some_config = mock.MagicMock()
        self._split_changes_file_name = join(
            dirname(__file__), 'splitCustomImpressionListener.json')

        with open(self._split_changes_file_name) as f:
            self._json = load(f)
            split_definition = self._json['splits'][0]
            split_name = split_definition['name']

        self._redis = get_redis(
            {'redisPrefix': 'customImpressionListenerTest'})

        self._redis_split_cache = RedisSplitCache(self._redis)
        self._redis_split_cache.add_split(split_name, split_definition)
        self._client = Client(RedisBroker(self._redis, self._some_config))

        self.some_feature = 'feature_0'
        self.some_impression_0 = Impression(matching_key=mock.MagicMock(),
                                            feature_name=self.some_feature,
                                            treatment=mock.MagicMock(),
                                            label=mock.MagicMock(),
                                            change_number=mock.MagicMock(),
                                            bucketing_key=mock.MagicMock(),
                                            time=mock.MagicMock())
Example #3
0
    def fetch_all_and_clear(self):
        """Fetches all impressions from the cache and clears it. It returns a dictionary with the
        impressions grouped by feature name.
        :return: All cached impressions so far grouped by feature name
        :rtype: dict
        """
        features = self._adapter.cache_get(UWSGISplitCache._KEY_FEATURE_LIST,
                                           _SPLITIO_MISC_NAMESPACE)
        try:
            features = decode(features)
        except TypeError:
            features = set()

        # Include impressions for splits not in cache.
        features.add(self._MISSING)

        impressions = []
        for feature in features:
            key = self._IMPRESSIONS_KEY.format(feature=feature)
            lock_key = self._LOCK_IMPRESSION_KEY.format(feature=feature)
            with UWSGILock(lock_key):
                raw = self._adapter.cache_get(
                    key, _SPLITIO_IMPRESSIONS_CACHE_NAMESPACE)
                self._adapter.cache_del(key,
                                        _SPLITIO_IMPRESSIONS_CACHE_NAMESPACE)

            try:
                impressions.extend([Impression(*i) for i in decode(raw)])
            except TypeError:
                pass

        return self._build_impressions_dict(impressions)
Example #4
0
    def setUp(self):
        self.some_key = mock.MagicMock()
        self.some_feature_name = mock.MagicMock()
        self.some_treatment = mock.MagicMock()
        self.some_time = mock.MagicMock()
        self.deepcopy_mock = self.patch('splitio.impressions.deepcopy')
        self.defaultdict_mock_side_effect = [
            mock.MagicMock(),  # during __init__
            mock.MagicMock()  # afterwards
        ]
        self.defaultdict_mock = self.patch(
            'splitio.impressions.defaultdict',
            side_effect=self.defaultdict_mock_side_effect)
        self.rlock_mock = self.patch('splitio.impressions.RLock')
        self.treatment_log = InMemoryTreatmentLog()
        self.notify_eviction_mock = self.patch_object(self.treatment_log,
                                                      '_notify_eviction')

        self.some_label = mock.MagicMock()
        self.some_change_number = mock.MagicMock()
        self.some_impression = Impression(
            matching_key=self.some_key,
            feature_name=self.some_feature_name,
            treatment=self.some_treatment,
            label=self.some_label,
            change_number=self.some_change_number,
            bucketing_key=self.some_key,
            time=self.some_time)
    def fetch_all(self):
        '''
        Fetches all impressions from the cache. It returns a dictionary with the
        impressions  grouped by feature name.
        :return: All cached impressions so far grouped by feature name
        :rtype: dict
        '''
        impressions_list = list()
        impressions_keys = self._redis.keys(self._get_impressions_key('*'))

        for impression_key in impressions_keys:
            impression_key = bytes_to_string(impression_key)
            if (impression_key.replace(self._get_impressions_key(''),
                                       '') == 'impressions'):
                continue

            feature_name = impression_key.replace(
                self._get_impressions_key(''), '')

            for impression in self._redis.smembers(impression_key):
                impression = bytes_to_string(impression)
                impression_decoded = decode(impression)
                impression_tuple = Impression(
                    key=impression_decoded['keyName'],
                    feature_name=feature_name,
                    treatment=impression_decoded['treatment'],
                    time=impression_decoded['time'])
                impressions_list.append(impression_tuple)

        if not impressions_list:
            return dict()

        return self._build_impressions_dict(impressions_list)
 def _build_impression(self, feature_name):
     return Impression(matching_key=mock.MagicMock(),
                       feature_name=feature_name,
                       treatment=mock.MagicMock(),
                       label=mock.MagicMock(),
                       time=mock.MagicMock(),
                       change_number=mock.MagicMock(),
                       bucketing_key=mock.MagicMock())
Example #7
0
    def setUp(self):
        self._impression_1 = Impression(matching_key='matching_key',
                                      feature_name='feature_name_1',
                                      treatment='treatment',
                                      label='label',
                                      change_number='change_number',
                                      bucketing_key='bucketing_key',
                                      time=1325599980)

        self._impression_2 = Impression(matching_key='matching_key',
                                        feature_name='feature_name_2',
                                        treatment='treatment',
                                        label='label',
                                        change_number='change_number',
                                        bucketing_key='bucketing_key',
                                        time=1325599980)

        self.impression_cache = UWSGIImpressionsCache(get_uwsgi(emulator=True))
    def fetch_all_and_clear(self):
        '''
        Fetches all impressions from the cache and clears it.
        It returns a dictionary with the impressions grouped by feature name.
        :return: All cached impressions so far grouped by feature name
        :rtype: dict
        '''
        impressions_list = list()
        impressions_keys = self._redis.keys(self._get_impressions_key('*'))

        for impression_key in impressions_keys:

            impression_key = bytes_to_string(impression_key)

            if (impression_key.replace(self._get_impressions_key(''),
                                       '') == 'impressions'):
                continue

            feature_name = impression_key.replace(
                self._get_impressions_key(''), '')

            to_remove = list()
            for impression in self._redis.smembers(impression_key):
                to_remove.append(impression)

                impression = bytes_to_string(impression)

                impression_decoded = decode(impression)

                label = ''
                if 'label' in impression_decoded:
                    label = impression_decoded['label']

                change_number = -1
                if 'changeNumber' in impression_decoded:
                    change_number = impression_decoded['changeNumber']

                bucketing_key = ''
                if 'bucketingKey' in impression_decoded:
                    bucketing_key = impression_decoded['bucketingKey']

                impression_tuple = Impression(
                    matching_key=impression_decoded['keyName'],
                    feature_name=feature_name,
                    treatment=impression_decoded['treatment'],
                    label=label,
                    change_number=change_number,
                    bucketing_key=bucketing_key,
                    time=impression_decoded['time'])
                impressions_list.append(impression_tuple)

            self._redis.srem(impression_key, *set(to_remove))

        if not impressions_list:
            return dict()

        return self._build_impressions_dict(impressions_list)
Example #9
0
 def test_log_doesnt_call_internal_log_if_feature_name_is_none(self):
     """Tests that log doesn't call _log if feature name is None"""
     impression = Impression(matching_key=self.some_key,
                             feature_name=None,
                             treatment=self.some_treatment,
                             label=self.some_label,
                             change_number=self.some_change_number,
                             bucketing_key=self.some_key,
                             time=self.some_time)
     self.treatment_log.log(impression)
     self.log_mock.assert_not_called()
Example #10
0
    def _build_impression(self, matching_key, feature_name, treatment, label,
                          change_number, bucketing_key, time):

        if not self._labels_enabled:
            label = None

        return Impression(matching_key=matching_key,
                          feature_name=feature_name,
                          treatment=treatment,
                          label=label,
                          change_number=change_number,
                          bucketing_key=bucketing_key,
                          time=time)
Example #11
0
    def setUp(self):
        self.some_key = mock.MagicMock()
        self.some_feature_name = mock.MagicMock()
        self.some_treatment = mock.MagicMock()
        self.some_time = 123456
        self.treatment_log = TreatmentLog()
        self.log_mock = self.patch_object(self.treatment_log, '_log')

        self.some_label = mock.MagicMock()
        self.some_change_number = mock.MagicMock()
        self.some_impression = Impression(
            matching_key=self.some_key,
            feature_name=self.some_feature_name,
            treatment=self.some_treatment,
            label=self.some_label,
            change_number=self.some_change_number,
            bucketing_key=self.some_key,
            time=self.some_time)
Example #12
0
    def setUp(self):
        self.some_key = mock.MagicMock()
        self.some_feature_name = mock.MagicMock()
        self.some_treatment = mock.MagicMock()
        self.some_time = mock.MagicMock()
        self.some_impressions_cache = mock.MagicMock()
        self.treatment_log = CacheBasedTreatmentLog(
            self.some_impressions_cache)
        self.some_label = mock.MagicMock()
        self.some_change_number = mock.MagicMock()

        self.some_impression = Impression(
            matching_key=self.some_key,
            feature_name=self.some_feature_name,
            treatment=self.some_treatment,
            label=self.some_label,
            change_number=self.some_change_number,
            bucketing_key=self.some_key,
            time=self.some_time)
Example #13
0
    def setUp(self):
        self.some_key = mock.MagicMock()
        self.some_feature_name = mock.MagicMock()
        self.some_treatment = mock.MagicMock()
        self.some_time = mock.MagicMock()
        self.logger_mock = self.patch(
            'splitio.impressions.logging.getLogger').return_value
        self.treatment_log = LoggerBasedTreatmentLog()

        self.some_label = mock.MagicMock()
        self.some_change_number = mock.MagicMock()
        self.some_impression = Impression(
            matching_key=self.some_key,
            feature_name=self.some_feature_name,
            treatment=self.some_treatment,
            label=self.some_label,
            change_number=self.some_change_number,
            bucketing_key=self.some_key,
            time=self.some_time)
Example #14
0
    def fetch_all_and_clear(self):
        """Fetches all impressions from the cache and clears it. It returns a dictionary with the
        impressions grouped by feature name.
        :return: All cached impressions so far grouped by feature name
        :rtype: dict
        """

        if self._adapter.cache_exists(self._IMPRESSIONS_KEY,
                                      _SPLITIO_STATS_CACHE_NAMESPACE):
            impressions_list = list()

            self.__lock_impressions()

            cached_impressions = decode(
                self._adapter.cache_get(self._IMPRESSIONS_KEY,
                                        _SPLITIO_STATS_CACHE_NAMESPACE))
            self._adapter.cache_del(self._IMPRESSIONS_KEY,
                                    _SPLITIO_STATS_CACHE_NAMESPACE)

            self.__unlock_impressions()

            _logger.debug('**** Cached Impressions: %s' % cached_impressions)

            for feature_name in cached_impressions:
                impressions = cached_impressions[feature_name]

                for impression in impressions:
                    impression_tuple = Impression(
                        matching_key=impression['keyName'],
                        feature_name=feature_name,
                        treatment=impression['treatment'],
                        label=impression['label'],
                        change_number=impression['changeNumber'],
                        bucketing_key=impression['bucketingKey'],
                        time=impression['time'])
                    impressions_list.append(impression_tuple)

            if not impressions_list:
                return dict()

            return self._build_impressions_dict(impressions_list)

        return dict()
Example #15
0
    def setUp(self):
        self.some_key = mock.MagicMock()
        self.some_feature_name = mock.MagicMock()
        self.some_treatment = mock.MagicMock()
        self.some_label = mock.MagicMock()
        self.some_change_number = mock.MagicMock()
        self.some_time = mock.MagicMock()
        self.some_max_workers = mock.MagicMock()
        self.some_delegate_treatment_log = mock.MagicMock()
        self.thread_pool_executor_mock = self.patch(
            'splitio.impressions.ThreadPoolExecutor')
        self.treatment_log = AsyncTreatmentLog(
            self.some_delegate_treatment_log,
            max_workers=self.some_max_workers)

        self.some_impression = Impression(
            matching_key=self.some_key,
            feature_name=self.some_feature_name,
            treatment=self.some_treatment,
            label=self.some_label,
            change_number=self.some_change_number,
            bucketing_key=self.some_key,
            time=self.some_time)