236 lines
8.3 KiB
Python
236 lines
8.3 KiB
Python
|
# Copyright 2016 Google Inc. All rights reserved.
|
||
|
#
|
||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||
|
# you may not use this file except in compliance with the License.
|
||
|
# You may obtain a copy of the License at
|
||
|
#
|
||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||
|
#
|
||
|
# Unless required by applicable law or agreed to in writing, software
|
||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
|
# See the License for the specific language governing permissions and
|
||
|
# limitations under the License.
|
||
|
|
||
|
import unittest2
|
||
|
|
||
|
|
||
|
class Test_logger_name_from_path(unittest2.TestCase):
|
||
|
|
||
|
def _callFUT(self, path):
|
||
|
from gcloud.logging.entries import logger_name_from_path
|
||
|
return logger_name_from_path(path)
|
||
|
|
||
|
def test_w_simple_name(self):
|
||
|
LOGGER_NAME = 'LOGGER_NAME'
|
||
|
PROJECT = 'my-project-1234'
|
||
|
PATH = 'projects/%s/logs/%s' % (PROJECT, LOGGER_NAME)
|
||
|
logger_name = self._callFUT(PATH)
|
||
|
self.assertEqual(logger_name, LOGGER_NAME)
|
||
|
|
||
|
def test_w_name_w_all_extras(self):
|
||
|
LOGGER_NAME = 'LOGGER_NAME-part.one~part.two%part-three'
|
||
|
PROJECT = 'my-project-1234'
|
||
|
PATH = 'projects/%s/logs/%s' % (PROJECT, LOGGER_NAME)
|
||
|
logger_name = self._callFUT(PATH)
|
||
|
self.assertEqual(logger_name, LOGGER_NAME)
|
||
|
|
||
|
|
||
|
class Test_BaseEntry(unittest2.TestCase):
|
||
|
|
||
|
PROJECT = 'PROJECT'
|
||
|
LOGGER_NAME = 'LOGGER_NAME'
|
||
|
|
||
|
def _getTargetClass(self):
|
||
|
from gcloud.logging.entries import _BaseEntry
|
||
|
|
||
|
class _Dummy(_BaseEntry):
|
||
|
_PAYLOAD_KEY = 'dummyPayload'
|
||
|
|
||
|
return _Dummy
|
||
|
|
||
|
def _makeOne(self, *args, **kw):
|
||
|
return self._getTargetClass()(*args, **kw)
|
||
|
|
||
|
def test_ctor_defaults(self):
|
||
|
PAYLOAD = 'PAYLOAD'
|
||
|
logger = _Logger(self.LOGGER_NAME, self.PROJECT)
|
||
|
entry = self._makeOne(PAYLOAD, logger)
|
||
|
self.assertEqual(entry.payload, PAYLOAD)
|
||
|
self.assertTrue(entry.logger is logger)
|
||
|
self.assertTrue(entry.insert_id is None)
|
||
|
self.assertTrue(entry.timestamp is None)
|
||
|
self.assertTrue(entry.labels is None)
|
||
|
self.assertTrue(entry.severity is None)
|
||
|
self.assertTrue(entry.http_request is None)
|
||
|
|
||
|
def test_ctor_explicit(self):
|
||
|
import datetime
|
||
|
PAYLOAD = 'PAYLOAD'
|
||
|
IID = 'IID'
|
||
|
TIMESTAMP = datetime.datetime.now()
|
||
|
LABELS = {'foo': 'bar', 'baz': 'qux'}
|
||
|
SEVERITY = 'CRITICAL'
|
||
|
METHOD = 'POST'
|
||
|
URI = 'https://api.example.com/endpoint'
|
||
|
STATUS = '500'
|
||
|
REQUEST = {
|
||
|
'requestMethod': METHOD,
|
||
|
'requestUrl': URI,
|
||
|
'status': STATUS,
|
||
|
}
|
||
|
logger = _Logger(self.LOGGER_NAME, self.PROJECT)
|
||
|
entry = self._makeOne(PAYLOAD, logger,
|
||
|
insert_id=IID,
|
||
|
timestamp=TIMESTAMP,
|
||
|
labels=LABELS,
|
||
|
severity=SEVERITY,
|
||
|
http_request=REQUEST)
|
||
|
self.assertEqual(entry.payload, PAYLOAD)
|
||
|
self.assertTrue(entry.logger is logger)
|
||
|
self.assertEqual(entry.insert_id, IID)
|
||
|
self.assertEqual(entry.timestamp, TIMESTAMP)
|
||
|
self.assertEqual(entry.labels, LABELS)
|
||
|
self.assertEqual(entry.severity, SEVERITY)
|
||
|
self.assertEqual(entry.http_request['requestMethod'], METHOD)
|
||
|
self.assertEqual(entry.http_request['requestUrl'], URI)
|
||
|
self.assertEqual(entry.http_request['status'], STATUS)
|
||
|
|
||
|
def test_from_api_repr_missing_data_no_loggers(self):
|
||
|
client = _Client(self.PROJECT)
|
||
|
PAYLOAD = 'PAYLOAD'
|
||
|
LOG_NAME = 'projects/%s/logs/%s' % (self.PROJECT, self.LOGGER_NAME)
|
||
|
API_REPR = {
|
||
|
'dummyPayload': PAYLOAD,
|
||
|
'logName': LOG_NAME,
|
||
|
}
|
||
|
klass = self._getTargetClass()
|
||
|
entry = klass.from_api_repr(API_REPR, client)
|
||
|
self.assertEqual(entry.payload, PAYLOAD)
|
||
|
self.assertTrue(entry.insert_id is None)
|
||
|
self.assertTrue(entry.timestamp is None)
|
||
|
self.assertTrue(entry.severity is None)
|
||
|
self.assertTrue(entry.http_request is None)
|
||
|
logger = entry.logger
|
||
|
self.assertTrue(isinstance(logger, _Logger))
|
||
|
self.assertTrue(logger.client is client)
|
||
|
self.assertEqual(logger.name, self.LOGGER_NAME)
|
||
|
|
||
|
def test_from_api_repr_w_loggers_no_logger_match(self):
|
||
|
from datetime import datetime
|
||
|
from gcloud._helpers import UTC
|
||
|
klass = self._getTargetClass()
|
||
|
client = _Client(self.PROJECT)
|
||
|
PAYLOAD = 'PAYLOAD'
|
||
|
SEVERITY = 'CRITICAL'
|
||
|
IID = 'IID'
|
||
|
NOW = datetime.utcnow().replace(tzinfo=UTC)
|
||
|
TIMESTAMP = _datetime_to_rfc3339_w_nanos(NOW)
|
||
|
LOG_NAME = 'projects/%s/logs/%s' % (self.PROJECT, self.LOGGER_NAME)
|
||
|
LABELS = {'foo': 'bar', 'baz': 'qux'}
|
||
|
METHOD = 'POST'
|
||
|
URI = 'https://api.example.com/endpoint'
|
||
|
STATUS = '500'
|
||
|
API_REPR = {
|
||
|
'dummyPayload': PAYLOAD,
|
||
|
'logName': LOG_NAME,
|
||
|
'insertId': IID,
|
||
|
'timestamp': TIMESTAMP,
|
||
|
'labels': LABELS,
|
||
|
'severity': SEVERITY,
|
||
|
'httpRequest': {
|
||
|
'requestMethod': METHOD,
|
||
|
'requestUrl': URI,
|
||
|
'status': STATUS,
|
||
|
},
|
||
|
}
|
||
|
loggers = {}
|
||
|
entry = klass.from_api_repr(API_REPR, client, loggers=loggers)
|
||
|
self.assertEqual(entry.payload, PAYLOAD)
|
||
|
self.assertEqual(entry.insert_id, IID)
|
||
|
self.assertEqual(entry.timestamp, NOW)
|
||
|
self.assertEqual(entry.labels, LABELS)
|
||
|
self.assertEqual(entry.severity, SEVERITY)
|
||
|
self.assertEqual(entry.http_request['requestMethod'], METHOD)
|
||
|
self.assertEqual(entry.http_request['requestUrl'], URI)
|
||
|
self.assertEqual(entry.http_request['status'], STATUS)
|
||
|
logger = entry.logger
|
||
|
self.assertTrue(isinstance(logger, _Logger))
|
||
|
self.assertTrue(logger.client is client)
|
||
|
self.assertEqual(logger.name, self.LOGGER_NAME)
|
||
|
self.assertEqual(loggers, {LOG_NAME: logger})
|
||
|
|
||
|
def test_from_api_repr_w_loggers_w_logger_match(self):
|
||
|
from datetime import datetime
|
||
|
from gcloud._helpers import UTC
|
||
|
client = _Client(self.PROJECT)
|
||
|
PAYLOAD = 'PAYLOAD'
|
||
|
IID = 'IID'
|
||
|
NOW = datetime.utcnow().replace(tzinfo=UTC)
|
||
|
TIMESTAMP = _datetime_to_rfc3339_w_nanos(NOW)
|
||
|
LOG_NAME = 'projects/%s/logs/%s' % (self.PROJECT, self.LOGGER_NAME)
|
||
|
LABELS = {'foo': 'bar', 'baz': 'qux'}
|
||
|
API_REPR = {
|
||
|
'dummyPayload': PAYLOAD,
|
||
|
'logName': LOG_NAME,
|
||
|
'insertId': IID,
|
||
|
'timestamp': TIMESTAMP,
|
||
|
'labels': LABELS,
|
||
|
}
|
||
|
LOGGER = object()
|
||
|
loggers = {LOG_NAME: LOGGER}
|
||
|
klass = self._getTargetClass()
|
||
|
entry = klass.from_api_repr(API_REPR, client, loggers=loggers)
|
||
|
self.assertEqual(entry.payload, PAYLOAD)
|
||
|
self.assertEqual(entry.insert_id, IID)
|
||
|
self.assertEqual(entry.timestamp, NOW)
|
||
|
self.assertEqual(entry.labels, LABELS)
|
||
|
self.assertTrue(entry.logger is LOGGER)
|
||
|
|
||
|
|
||
|
class TestProtobufEntry(unittest2.TestCase):
|
||
|
|
||
|
PROJECT = 'PROJECT'
|
||
|
LOGGER_NAME = 'LOGGER_NAME'
|
||
|
|
||
|
def _getTargetClass(self):
|
||
|
from gcloud.logging.entries import ProtobufEntry
|
||
|
return ProtobufEntry
|
||
|
|
||
|
def _makeOne(self, *args, **kw):
|
||
|
return self._getTargetClass()(*args, **kw)
|
||
|
|
||
|
def test_parse_message(self):
|
||
|
import json
|
||
|
from google.protobuf.json_format import MessageToJson
|
||
|
from google.protobuf.struct_pb2 import Struct, Value
|
||
|
LOGGER = object()
|
||
|
message = Struct(fields={'foo': Value(bool_value=False)})
|
||
|
with_true = Struct(fields={'foo': Value(bool_value=True)})
|
||
|
PAYLOAD = json.loads(MessageToJson(with_true))
|
||
|
entry = self._makeOne(PAYLOAD, LOGGER)
|
||
|
entry.parse_message(message)
|
||
|
self.assertTrue(message.fields['foo'])
|
||
|
|
||
|
|
||
|
def _datetime_to_rfc3339_w_nanos(value):
|
||
|
from gcloud._helpers import _RFC3339_NO_FRACTION
|
||
|
no_fraction = value.strftime(_RFC3339_NO_FRACTION)
|
||
|
return '%s.%09dZ' % (no_fraction, value.microsecond * 1000)
|
||
|
|
||
|
|
||
|
class _Logger(object):
|
||
|
|
||
|
def __init__(self, name, client):
|
||
|
self.name = name
|
||
|
self.client = client
|
||
|
|
||
|
|
||
|
class _Client(object):
|
||
|
|
||
|
def __init__(self, project):
|
||
|
self.project = project
|
||
|
|
||
|
def logger(self, name):
|
||
|
return _Logger(name, self)
|