from nose.tools import *
from nose.tools import assert_raises
from testutil.helpers import *

import io
import os
import sys
import time

import nilmdb.server
from nilmdb.utils import timer, lock

class TestMisc(object):
    def test_timer(self):
        capture = io.StringIO()
        old = sys.stdout
        sys.stdout = capture
        with nilmdb.utils.Timer("test"):
            time.sleep(0.01)
        with nilmdb.utils.Timer("test syslog", tosyslog=True):
            time.sleep(0.01)
        sys.stdout = old
        in_("test: ", capture.getvalue())

    def test_lock(self):
        with open("/dev/null") as f:
            eq_(nilmdb.utils.lock.exclusive_lock(f), True)
            nilmdb.utils.lock.exclusive_unlock(f)
        # Test error conditions
        class FakeFile():
            def __init__(self, fileno):
                self._fileno = fileno
            def fileno(self):
                return self._fileno
        with assert_raises(TypeError):
            nilmdb.utils.lock.exclusive_lock(FakeFile('none'))
        with assert_raises(ValueError):
            nilmdb.utils.lock.exclusive_lock(FakeFile(-1))
        with assert_raises(IOError):
            nilmdb.utils.lock.exclusive_lock(FakeFile(12345))

        # Lock failure is tested in test_bulkdata

    def test_replace_file(self):
        fn = b"tests/misc-testdb/file"
        try:
            os.mkdir(os.path.dirname(fn))
        except FileExistsError:
            pass
        with open(fn, "wb") as f:
            f.write(b"hello, world")
        nilmdb.utils.atomic.replace_file(fn, b"goodbye, world")
        with open(fn, "rb") as f:
            eq_(f.read(), b"goodbye, world")
