blob: b96e019e5f652320ed4a202611a7a2e4709e9a23 [file] [log] [blame]
#!/usr/bin/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.
"""Tests for presterastats."""
__author__ = 'poist@google.com (Gregory Poist)'
import json
import os
import subprocess
import time
import unittest
import presterastats
VALID_JSON_RESPONSE = """
garbage here
JSONSTART
{ "valid": {
"0/0": {
"unicast_packets_sent": 19
}
}}
JSONEND
garbage there
"""
VALID_JSON_CONTENT = """
{ "valid": {
"0/0": {
"unicast_packets_sent": 19
}
}}
"""
NO_START_BLOCK_RESPONSE = """
blah
blah
blah
no json here
"""
class FakePresteraStats(presterastats.PresteraStats):
"""Mock PresteraStats."""
def StartCpssSubprocess(self):
return subprocess.Popen(self.command.split(),
stdin=self.cpss_in, stdout=self.cpss_out,
preexec_fn=os.setsid)
class PresteraStatsTest(unittest.TestCase):
def setUp(self):
self.poller = FakePresteraStats('0/0,0/4', 1)
self.poller.command = ''
self.poller.cpss_in = subprocess.PIPE
self.poller.cpss_out = subprocess.PIPE
def testRequestStatsTimeout(self):
start_time = time.time()
self.poller.command = '/bin/sleep 30'
self.poller.subproc_response_fd = subprocess.PIPE
result = self.poller.GetMibStats()
end_time = time.time()
self.assertIsNone(result)
self.assertTrue(end_time - start_time < 30)
def testValidJsonBlock(self):
self.poller.command = '/bin/cat'
self.poller.cpss_in, out_fd = os.pipe()
os.write(out_fd, VALID_JSON_RESPONSE)
os.close(out_fd)
result = self.poller.GetMibStats()
os.close(self.poller.cpss_in)
self.assertEquals(result, json.loads(VALID_JSON_CONTENT))
def testNoJsonBlock(self):
self.poller.command = '/bin/cat'
self.poller.cpss_in, out_fd = os.pipe()
os.write(out_fd, NO_START_BLOCK_RESPONSE)
os.close(out_fd)
result = self.poller.GetMibStats()
os.close(self.poller.cpss_in)
self.assertIsNone(result)
def testBogusCommand(self):
self.poller.command = 'aintgottimeforthat'
try:
_ = self.poller.GetMibStats()
self.fail('Should explode')
except OSError:
pass
if __name__ == '__main__':
unittest.main()