147 lines
4.7 KiB
Python
147 lines
4.7 KiB
Python
# -*- coding: utf-8 -*-
|
|
"""Define the line protocol test module."""
|
|
|
|
from __future__ import absolute_import
|
|
from __future__ import division
|
|
from __future__ import print_function
|
|
from __future__ import unicode_literals
|
|
|
|
from datetime import datetime
|
|
import unittest
|
|
from pytz import UTC, timezone
|
|
|
|
from influxdb import line_protocol
|
|
|
|
|
|
class TestLineProtocol(unittest.TestCase):
|
|
"""Define the LineProtocol test object."""
|
|
|
|
def test_make_lines(self):
|
|
"""Test make new lines in TestLineProtocol object."""
|
|
data = {
|
|
"tags": {
|
|
"empty_tag": "",
|
|
"none_tag": None,
|
|
"backslash_tag": "C:\\",
|
|
"integer_tag": 2,
|
|
"string_tag": "hello"
|
|
},
|
|
"points": [
|
|
{
|
|
"measurement": "test",
|
|
"fields": {
|
|
"string_val": "hello!",
|
|
"int_val": 1,
|
|
"float_val": 1.1,
|
|
"none_field": None,
|
|
"bool_val": True,
|
|
}
|
|
}
|
|
]
|
|
}
|
|
|
|
self.assertEqual(
|
|
line_protocol.make_lines(data),
|
|
'test,backslash_tag=C:\\\\ ,integer_tag=2,string_tag=hello '
|
|
'bool_val=True,float_val=1.1,int_val=1i,string_val="hello!"\n'
|
|
)
|
|
|
|
def test_timezone(self):
|
|
"""Test timezone in TestLineProtocol object."""
|
|
dt = datetime(2009, 11, 10, 23, 0, 0, 123456)
|
|
utc = UTC.localize(dt)
|
|
berlin = timezone('Europe/Berlin').localize(dt)
|
|
eastern = berlin.astimezone(timezone('US/Eastern'))
|
|
data = {
|
|
"points": [
|
|
{"measurement": "A", "fields": {"val": 1},
|
|
"time": 0},
|
|
{"measurement": "A", "fields": {"val": 1},
|
|
"time": "2009-11-10T23:00:00.123456Z"},
|
|
{"measurement": "A", "fields": {"val": 1}, "time": dt},
|
|
{"measurement": "A", "fields": {"val": 1}, "time": utc},
|
|
{"measurement": "A", "fields": {"val": 1}, "time": berlin},
|
|
{"measurement": "A", "fields": {"val": 1}, "time": eastern},
|
|
]
|
|
}
|
|
self.assertEqual(
|
|
line_protocol.make_lines(data),
|
|
'\n'.join([
|
|
'A val=1i 0',
|
|
'A val=1i 1257894000123456000',
|
|
'A val=1i 1257894000123456000',
|
|
'A val=1i 1257894000123456000',
|
|
'A val=1i 1257890400123456000',
|
|
'A val=1i 1257890400123456000',
|
|
]) + '\n'
|
|
)
|
|
|
|
def test_string_val_newline(self):
|
|
"""Test string value with newline in TestLineProtocol object."""
|
|
data = {
|
|
"points": [
|
|
{
|
|
"measurement": "m1",
|
|
"fields": {
|
|
"multi_line": "line1\nline1\nline3"
|
|
}
|
|
}
|
|
]
|
|
}
|
|
|
|
self.assertEqual(
|
|
line_protocol.make_lines(data),
|
|
'm1 multi_line="line1\\nline1\\nline3"\n'
|
|
)
|
|
|
|
def test_make_lines_unicode(self):
|
|
"""Test make unicode lines in TestLineProtocol object."""
|
|
data = {
|
|
"tags": {
|
|
"unicode_tag": "\'Привет!\'" # Hello! in Russian
|
|
},
|
|
"points": [
|
|
{
|
|
"measurement": "test",
|
|
"fields": {
|
|
"unicode_val": "Привет!", # Hello! in Russian
|
|
}
|
|
}
|
|
]
|
|
}
|
|
|
|
self.assertEqual(
|
|
line_protocol.make_lines(data),
|
|
'test,unicode_tag=\'Привет!\' unicode_val="Привет!"\n'
|
|
)
|
|
|
|
def test_quote_ident(self):
|
|
"""Test quote indentation in TestLineProtocol object."""
|
|
self.assertEqual(
|
|
line_protocol.quote_ident(r"""\foo ' bar " Örf"""),
|
|
r'''"\\foo ' bar \" Örf"'''
|
|
)
|
|
|
|
def test_quote_literal(self):
|
|
"""Test quote literal in TestLineProtocol object."""
|
|
self.assertEqual(
|
|
line_protocol.quote_literal(r"""\foo ' bar " Örf"""),
|
|
r"""'\\foo \' bar " Örf'"""
|
|
)
|
|
|
|
def test_float_with_long_decimal_fraction(self):
|
|
"""Ensure precision is preserved when casting floats into strings."""
|
|
data = {
|
|
"points": [
|
|
{
|
|
"measurement": "test",
|
|
"fields": {
|
|
"float_val": 1.0000000000000009,
|
|
}
|
|
}
|
|
]
|
|
}
|
|
self.assertEqual(
|
|
line_protocol.make_lines(data),
|
|
'test float_val=1.0000000000000009\n'
|
|
)
|