def test_params_data_type_conversion(self):
     self.confs['test'].post(**{'field.data': 'number', 'accelerated_fields.data': '{"data": -1}'})
     for x in range(50):
         self.col.insert(json.dumps({'_key': str(x), 'data': str(x), 'ignore': x}))
     data = self.col.query(sort='data:-1', limit=20, fields='data,_id:0', skip=10)
     self.assertEqual(len(data), 20)
     for x in range(20):
         self.assertEqual(data[x]['data'], 39 - x)
         self.assertTrue(not 'ignore' in data[x])
         self.assertTrue(not '_key' in data[x])
 def test_list_with_offset(self):
     import random
     for offset in [random.randint(3,50) for x in range(5)]:
         for coll_name in collections:
             coll = getattr(self.service, coll_name)
             expected = [ent.name for ent in coll.list(count=offset+10)][offset:]
             found = [ent.name for ent in coll.list(offset=offset, count=10)]
             self.assertEqual(expected, found,
                              msg='on %s (expected %s, found %s)' % \
                                  (coll_name, expected, found))
 def test_insert_query_delete_data(self):
     for x in range(50):
         self.col.insert(json.dumps({'_key': str(x), 'data': '#' + str(x), 'num': x}))
     self.assertEqual(len(self.col.query()), 50)
     self.assertEqual(len(self.col.query(query='{"num": 10}')), 1)
     self.assertEqual(self.col.query(query='{"num": 10}')[0]['data'], '#10')
     self.col.delete(json.dumps({'num': {'$gt': 39}}))
     self.assertEqual(len(self.col.query()), 40)
     self.col.delete()
     self.assertEqual(len(self.col.query()), 0)
    def _run(self):

        writer = RecordWriterV2(self.recorder.output, maxresultrows=10)
        write_record = writer.write_record
        names = self.fieldnames

        for self._serial_number in range(0, 31):
            record = OrderedDict(izip(names, self.row))
            write_record(record)

        return
 def test_update_delete_data(self):
     for x in range(50):
         self.col.insert(json.dumps({'_key': str(x), 'data': '#' + str(x), 'num': x}))
     self.assertEqual(len(self.col.query()), 50)
     self.assertEqual(self.col.query(query='{"num": 49}')[0]['data'], '#49')
     self.col.update(str(49), json.dumps({'data': '#50', 'num': 50}))
     self.assertEqual(len(self.col.query()), 50)
     self.assertEqual(self.col.query(query='{"num": 50}')[0]['data'], '#50')
     self.assertEqual(len(self.col.query(query='{"num": 49}')), 0)
     self.col.delete_by_id(49)
     self.assertEqual(len(self.col.query(query='{"num": 50}')), 0)
    def test_insert_find_update_data(self):
        data = [{'_key': str(x), 'data': '#' + str(x), 'num': x} for x in range(1000)]
        self.col.batch_save(*data)

        testData = self.col.query(sort='num')
        self.assertEqual(len(testData), 1000)

        for x in range(1000):
            self.assertEqual(testData[x]['_key'], str(x))
            self.assertEqual(testData[x]['data'], '#' + str(x))
            self.assertEqual(testData[x]['num'], x)

        data = [{'_key': str(x), 'data': '#' + str(x + 1), 'num': x + 1} for x in range(1000)]
        self.col.batch_save(*data)

        testData = self.col.query(sort='num')
        self.assertEqual(len(testData), 1000)

        for x in range(1000):
            self.assertEqual(testData[x]['_key'], str(x))
            self.assertEqual(testData[x]['data'], '#' + str(x + 1))
            self.assertEqual(testData[x]['num'], x + 1)

        query = [{"query": {"num": x + 1}} for x in range(100)]
        testData = self.col.batch_find(*query)

        self.assertEqual(len(testData), 100)
        testData.sort(key=lambda x: x[0]['num'])

        for x in range(100):
            self.assertEqual(testData[x][0]['_key'], str(x))
            self.assertEqual(testData[x][0]['data'], '#' + str(x + 1))
            self.assertEqual(testData[x][0]['num'], x + 1)
 def test_query_data(self):
     if ('test1' in self.confs):
         self.confs['test1'].delete() 
     self.confs.create('test1')
     self.col = self.confs['test1'].data
     for x in range(10):
         self.col.insert(json.dumps({'_key': str(x), 'data': '#' + str(x), 'num': x}))
     data = self.col.query(sort='data:-1', skip=9)
     self.assertEqual(len(data), 1)
     self.assertEqual(data[0]['data'], '#0')
     data = self.col.query(sort='data:1')
     self.assertEqual(data[0]['data'], '#0')
     data = self.col.query(limit=2, skip=9)
     self.assertEqual(len(data), 1)
    def test_command_line_parser_unquote(self):
        parser = CommandLineParser

        options = [
            r'foo',                 # unquoted string with no escaped characters
            r'fo\o\ b\"a\\r',       # unquoted string with some escaped characters
            r'"foo"',               # quoted string with no special characters
            r'"""foobar1"""',       # quoted string with quotes escaped like this: ""
            r'"\"foobar2\""',       # quoted string with quotes escaped like this: \"
            r'"foo ""x"" bar"',     # quoted string with quotes escaped like this: ""
            r'"foo \"x\" bar"',     # quoted string with quotes escaped like this: \"
            r'"\\foobar"',          # quoted string with an escaped backslash
            r'"foo \\ bar"',        # quoted string with an escaped backslash
            r'"foobar\\"',          # quoted string with an escaped backslash
            r'foo\\\bar',           # quoted string with an escaped backslash and an escaped 'b'
            r'""',                  # pair of quotes
            r'']                    # empty string

        expected = [
            r'foo',
            r'foo b"a\r',
            r'foo',
            r'"foobar1"',
            r'"foobar2"',
            r'foo "x" bar',
            r'foo "x" bar',
            '\\foobar',
            r'foo \ bar',
            'foobar\\',
            r'foo\bar',
            r'',
            r'']

        # Command line with an assortment of string values

        self.assertEqual(expected[-4], parser.unquote(options[-4]))

        for i in range(0, len(options)):
            self.assertEqual(expected[i], parser.unquote(options[i]))

        self.assertRaises(SyntaxError, parser.unquote, '"')
        self.assertRaises(SyntaxError, parser.unquote, '"foo')
        self.assertRaises(SyntaxError, parser.unquote, 'foo"')
        self.assertRaises(SyntaxError, parser.unquote, 'foo\\')
    def test_duration(self):

        # Duration validator should parse and format time intervals of the form
        # HH:MM:SS

        validator = validators.Duration()

        for seconds in range(0, 25 * 60 * 60, 59):
            for value in six.text_type(seconds), bytes(seconds):
                self.assertEqual(validator(value), seconds)
                self.assertEqual(validator(validator.format(seconds)), seconds)
                value = '%d:%02d' % (seconds / 60, seconds % 60)
                self.assertEqual(validator(value), seconds)
                self.assertEqual(validator(validator.format(seconds)), seconds)
                value = '%d:%02d:%02d' % (seconds / 3600, (seconds / 60) % 60, seconds % 60)
                self.assertEqual(validator(value), seconds)
                self.assertEqual(validator(validator.format(seconds)), seconds)

        self.assertEqual(validator('230:00:00'), 230 * 60 * 60)
        self.assertEqual(validator('23:00:00'), 23 * 60 * 60)
        self.assertEqual(validator('00:59:00'), 59 * 60)
        self.assertEqual(validator('00:00:59'), 59)

        self.assertEqual(validator.format(230 * 60 * 60), '230:00:00')
        self.assertEqual(validator.format(23 * 60 * 60), '23:00:00')
        self.assertEqual(validator.format(59 * 60), '00:59:00')
        self.assertEqual(validator.format(59), '00:00:59')

        self.assertRaises(ValueError, validator, '-1')
        self.assertRaises(ValueError, validator, '00:-1')
        self.assertRaises(ValueError, validator, '-1:00')
        self.assertRaises(ValueError, validator, '00:00:-1')
        self.assertRaises(ValueError, validator, '00:-1:00')
        self.assertRaises(ValueError, validator, '-1:00:00')
        self.assertRaises(ValueError, validator, '00:00:60')
        self.assertRaises(ValueError, validator, '00:60:00')

        return
Beispiel #10
0
    def test_insert_find_update_data(self):
        data = [{
            '_key': str(x),
            'data': '#' + str(x),
            'num': x
        } for x in range(1000)]
        self.col.batch_save(*data)

        testData = self.col.query(sort='num')
        self.assertEqual(len(testData), 1000)

        for x in range(1000):
            self.assertEqual(testData[x]['_key'], str(x))
            self.assertEqual(testData[x]['data'], '#' + str(x))
            self.assertEqual(testData[x]['num'], x)

        data = [{
            '_key': str(x),
            'data': '#' + str(x + 1),
            'num': x + 1
        } for x in range(1000)]
        self.col.batch_save(*data)

        testData = self.col.query(sort='num')
        self.assertEqual(len(testData), 1000)

        for x in range(1000):
            self.assertEqual(testData[x]['_key'], str(x))
            self.assertEqual(testData[x]['data'], '#' + str(x + 1))
            self.assertEqual(testData[x]['num'], x + 1)

        query = [{"query": {"num": x + 1}} for x in range(100)]
        testData = self.col.batch_find(*query)

        self.assertEqual(len(testData), 100)
        testData.sort(key=lambda x: x[0]['num'])

        for x in range(100):
            self.assertEqual(testData[x][0]['_key'], str(x))
            self.assertEqual(testData[x][0]['data'], '#' + str(x + 1))
            self.assertEqual(testData[x][0]['num'], x + 1)
Beispiel #11
0
    def test_integer(self):

        # Point of interest:
        #
        # On all *nix operating systems an int is 32-bits long on 32-bit systems and 64-bits long on 64-bit systems so
        # that you can count on this equality:
        #
        #   sys.maxint == sys.maxsize
        #
        # On Windows an int is always 32-bits long and you cannot count on the same equality. Specifically, on 64-bit
        # systems:
        #
        #   sys.maxint != sys.maxsize

        maxsize = sys.maxsize
        minsize = -(sys.maxsize - 1)

        # The Integer validator should convert values in the range of a Python long which has unlimited precision
        # Anecdotal evidence: This portion of the test checks 5-10 K integer values and runs for less than 2-3 seconds

        validator = validators.Integer()

        def test(integer):
            for s in str(integer), six.text_type(integer):
                value = validator.__call__(s)
                self.assertEqual(value, integer)
                if six.PY2:
                    self.assertIsInstance(value, long)
                else:
                    self.assertIsInstance(value, int)
            self.assertEqual(validator.format(integer), six.text_type(integer))

        test(2 * minsize)
        test(minsize)
        test(-1)
        test(0)
        test(1)
        test(2 * maxsize)

        for i in range(0, 10000):
            test(randint(minsize, maxsize))

        # The Integer validator can impose a range restriction

        validator = validators.Integer(minimum=0)
        self.assertEqual(validator.__call__(0), 0)
        self.assertEqual(validator.__call__(2 * maxsize), 2 * maxsize)
        self.assertRaises(ValueError, validator.__call__, -1)

        validator = validators.Integer(minimum=1, maximum=maxsize)
        self.assertEqual(validator.__call__(1), 1)
        self.assertEqual(validator.__call__(maxsize), maxsize)
        self.assertRaises(ValueError, validator.__call__, 0)
        self.assertRaises(ValueError, validator.__call__, maxsize + 1)

        validator = validators.Integer(minimum=minsize, maximum=maxsize)
        self.assertEqual(validator.__call__(minsize), minsize)
        self.assertEqual(validator.__call__(0), 0)
        self.assertEqual(validator.__call__(maxsize), maxsize)
        self.assertRaises(ValueError, validator.__call__, minsize - 1)
        self.assertRaises(ValueError, validator.__call__, maxsize + 1)

        return
Beispiel #12
0
    def test_record_writer_with_random_data(self, save_recording=False):

        # Confirmed: [minint, maxint) covers the full range of values that xrange allows

        # RecordWriter writes apps in units of maxresultrows records. Default: 50,0000.
        # Partial results are written when the record count reaches maxresultrows.

        writer = RecordWriterV2(
            StringIO(),
            maxresultrows=10)  # small for the purposes of this unit test
        test_data = OrderedDict()

        fieldnames = [
            '_serial', '_time', 'random_bytes', 'random_dict',
            'random_integers', 'random_unicode'
        ]
        test_data['fieldnames'] = fieldnames
        test_data['values'] = []

        write_record = writer.write_record

        for serial_number in range(0, 31):
            values = [
                serial_number,
                time(),
                random_bytes(),
                random_dict(),
                random_integers(),
                random_unicode()
            ]
            record = OrderedDict(izip(fieldnames, values))
            #try:
            write_record(record)
            #except Exception as error:
            #    self.fail(error)
            test_data['values'].append(values)

        # RecordWriter accumulates inspector messages and metrics until maxresultrows are written, a partial result
        # is produced or we're finished

        messages = [('debug', random_unicode()), ('error', random_unicode()),
                    ('fatal', random_unicode()), ('info', random_unicode()),
                    ('warn', random_unicode())]

        test_data['messages'] = messages

        for message_type, message_text in messages:
            writer.write_message(message_type, '{}', message_text)

        metrics = {
            'metric-1': SearchMetric(1, 2, 3, 4),
            'metric-2': SearchMetric(5, 6, 7, 8)
        }

        test_data['metrics'] = metrics

        for name, metric in six.iteritems(metrics):
            writer.write_metric(name, metric)

        self.assertEqual(writer._chunk_count, 3)
        self.assertEqual(writer._record_count, 1)
        self.assertGreater(writer._buffer.tell(), 0)
        self.assertEqual(writer._total_record_count, 30)
        self.assertListEqual(writer._fieldnames, fieldnames)
        self.assertListEqual(writer._inspector['messages'], messages)

        self.assertDictEqual(
            dict(
                ifilter(lambda k_v: k_v[0].startswith('metric.'),
                        six.iteritems(writer._inspector))),
            dict(
                imap(lambda k_v1: ('metric.' + k_v1[0], k_v1[1]),
                     six.iteritems(metrics))))

        writer.flush(finished=True)

        self.assertEqual(writer._chunk_count, 4)
        self.assertEqual(writer._record_count, 0)
        self.assertEqual(writer._buffer.tell(), 0)
        self.assertEqual(writer._buffer.getvalue(), '')
        self.assertEqual(writer._total_record_count, 31)

        self.assertRaises(AssertionError,
                          writer.flush,
                          finished=True,
                          partial=True)
        self.assertRaises(AssertionError, writer.flush, finished='non-boolean')
        self.assertRaises(AssertionError, writer.flush, partial='non-boolean')
        self.assertRaises(AssertionError, writer.flush)

        self.assertRaises(RuntimeError, writer.write_record, {})

        self.assertFalse(writer._ofile.closed)
        self.assertIsNone(writer._fieldnames)
        self.assertDictEqual(writer._inspector, OrderedDict())

        # P2 [ ] TODO: Verify that RecordWriter gives consumers the ability to write partial results by calling
        # RecordWriter.flush(partial=True).

        # P2 [ ] TODO: Verify that RecordWriter gives consumers the ability to finish early by calling
        # RecordWriter.flush(finish=True).

        if save_recording:

            cls = self.__class__
            method = cls.test_record_writer_with_recordings
            base_path = os.path.join(
                self._recordings_path, '.'.join(
                    (cls.__name__, method.__name__, six.text_type(time()))))

            with gzip.open(base_path + '.input.gz', 'wb') as f:
                pickle.dump(test_data, f)

            with open(base_path + '.output', 'wb') as f:
                f.write(writer._ofile.getvalue())

        return
Beispiel #13
0
def random_unicode():
    return ''.join(
        imap(lambda x: six.unichr(x),
             random.sample(range(maxunicode), random.randint(0, max_length))))
    def test_integer(self):

        # Point of interest:
        #
        # On all *nix operating systems an int is 32-bits long on 32-bit systems and 64-bits long on 64-bit systems so
        # that you can count on this equality:
        #
        #   sys.maxint == sys.maxsize
        #
        # On Windows an int is always 32-bits long and you cannot count on the same equality. Specifically, on 64-bit
        # systems:
        #
        #   sys.maxint != sys.maxsize

        maxsize = sys.maxsize
        minsize = -(sys.maxsize - 1)

        # The Integer validator should convert values in the range of a Python long which has unlimited precision
        # Anecdotal evidence: This portion of the test checks 5-10 K integer values and runs for less than 2-3 seconds

        validator = validators.Integer()

        def test(integer):
            for s in str(integer), six.text_type(integer):
                value = validator.__call__(s)
                self.assertEqual(value, integer)
                if six.PY2:
                    self.assertIsInstance(value, long)
                else:
                    self.assertIsInstance(value, int)
            self.assertEqual(validator.format(integer), six.text_type(integer))

        test(2 * minsize)
        test(minsize)
        test(-1)
        test(0)
        test(1)
        test(2 * maxsize)

        for i in range(0, 10000):
            test(randint(minsize, maxsize))

        # The Integer validator can impose a range restriction

        validator = validators.Integer(minimum=0)
        self.assertEqual(validator.__call__(0), 0)
        self.assertEqual(validator.__call__(2 * maxsize), 2 * maxsize)
        self.assertRaises(ValueError, validator.__call__, -1)

        validator = validators.Integer(minimum=1, maximum=maxsize)
        self.assertEqual(validator.__call__(1), 1)
        self.assertEqual(validator.__call__(maxsize), maxsize)
        self.assertRaises(ValueError, validator.__call__, 0)
        self.assertRaises(ValueError, validator.__call__, maxsize + 1)

        validator = validators.Integer(minimum=minsize, maximum=maxsize)
        self.assertEqual(validator.__call__(minsize), minsize)
        self.assertEqual(validator.__call__(0), 0)
        self.assertEqual(validator.__call__(maxsize), maxsize)
        self.assertRaises(ValueError, validator.__call__, minsize - 1)
        self.assertRaises(ValueError, validator.__call__, maxsize + 1)

        return
Beispiel #15
0
def random_unicode():
    return ''.join(
        imap(
            lambda x: six.unichr(x),
            random.sample(range(MAX_NARROW_UNICODE),
                          random.randint(0, max_length))))
def random_unicode():
    return ''.join(imap(lambda x: six.unichr(x), random.sample(range(maxunicode), random.randint(0, max_length))))
    def test_record_writer_with_random_data(self, save_recording=False):

        # Confirmed: [minint, maxint) covers the full range of values that xrange allows

        # RecordWriter writes apps in units of maxresultrows records. Default: 50,0000.
        # Partial results are written when the record count reaches maxresultrows.

        writer = RecordWriterV2(StringIO(), maxresultrows=10)  # small for the purposes of this unit test
        test_data = OrderedDict()

        fieldnames = ['_serial', '_time', 'random_bytes', 'random_dict', 'random_integers', 'random_unicode']
        test_data['fieldnames'] = fieldnames
        test_data['values'] = []

        write_record = writer.write_record

        for serial_number in range(0, 31):
            values = [serial_number, time(), random_bytes(), random_dict(), random_integers(), random_unicode()]
            record = OrderedDict(izip(fieldnames, values))
            #try:
            write_record(record)
            #except Exception as error:
            #    self.fail(error)
            test_data['values'].append(values)

        # RecordWriter accumulates inspector messages and metrics until maxresultrows are written, a partial result
        # is produced or we're finished

        messages = [
            ('debug', random_unicode()),
            ('error', random_unicode()),
            ('fatal', random_unicode()),
            ('info', random_unicode()),
            ('warn', random_unicode())]

        test_data['messages'] = messages

        for message_type, message_text in messages:
            writer.write_message(message_type, '{}', message_text)

        metrics = {
            'metric-1': SearchMetric(1, 2, 3, 4),
            'metric-2': SearchMetric(5, 6, 7, 8)
        }

        test_data['metrics'] = metrics

        for name, metric in six.iteritems(metrics):
            writer.write_metric(name, metric)

        self.assertEqual(writer._chunk_count, 3)
        self.assertEqual(writer._record_count, 1)
        self.assertGreater(writer._buffer.tell(), 0)
        self.assertEqual(writer._total_record_count, 30)
        self.assertListEqual(writer._fieldnames, fieldnames)
        self.assertListEqual(writer._inspector['messages'], messages)

        self.assertDictEqual(
            dict(ifilter(lambda k_v: k_v[0].startswith('metric.'), six.iteritems(writer._inspector))),
            dict(imap(lambda k_v1: ('metric.' + k_v1[0], k_v1[1]), six.iteritems(metrics))))

        writer.flush(finished=True)

        self.assertEqual(writer._chunk_count, 4)
        self.assertEqual(writer._record_count, 0)
        self.assertEqual(writer._buffer.tell(), 0)
        self.assertEqual(writer._buffer.getvalue(), '')
        self.assertEqual(writer._total_record_count, 31)

        self.assertRaises(AssertionError, writer.flush, finished=True, partial=True)
        self.assertRaises(AssertionError, writer.flush, finished='non-boolean')
        self.assertRaises(AssertionError, writer.flush, partial='non-boolean')
        self.assertRaises(AssertionError, writer.flush)

        self.assertRaises(RuntimeError, writer.write_record, {})

        self.assertFalse(writer._ofile.closed)
        self.assertIsNone(writer._fieldnames)
        self.assertDictEqual(writer._inspector, OrderedDict())

        # P2 [ ] TODO: Verify that RecordWriter gives consumers the ability to write partial results by calling
        # RecordWriter.flush(partial=True).

        # P2 [ ] TODO: Verify that RecordWriter gives consumers the ability to finish early by calling
        # RecordWriter.flush(finish=True).

        if save_recording:

            cls = self.__class__
            method = cls.test_record_writer_with_recordings
            base_path = os.path.join(self._recordings_path, '.'.join((cls.__name__, method.__name__, six.text_type(time()))))

            with gzip.open(base_path + '.input.gz', 'wb') as f:
                pickle.dump(test_data, f)

            with open(base_path + '.output', 'wb') as f:
                f.write(writer._ofile.getvalue())

        return
 def generate(self):
     text = self.text
     for i in range(1, self.count + 1):
         yield {'_serial': i, '_time': time.time(), '_raw': six.text_type(i) + '. ' + text}
Beispiel #19
0
 def generate(self):
     self.logger.debug("Generating %s events" % self.count)
     for i in range(1, self.count + 1):
         text = 'Hello World %d' % i
         yield {'_time': time.time(), 'event_no': i, '_raw': text}
 def generate(self):
     text = self.text
     self.logger.debug("Generating %d events with text %s" % (self.count, self.text))
     for i in range(1, self.count + 1):
         yield {'_serial': i, '_time': time.time(), '_raw': six.text_type(i) + '. ' + text}