from __future__ import with_statement
import cache
import feed
import unittest
import os
import sys
import fcntl
import pickle
import uuid
import urllib

def getlock(path):
    try:
        fcntl.flock(open(path), fcntl.LOCK_EX|fcntl.LOCK_NB)
    except IOError:
        raise SystemExit(0)
    raise SystemExit(1)


class CacheModuleTest(unittest.TestCase):
    def testto_filename(self):
        prefix = cache.DEFAULT_CACHE_PATH
        suffix = cache.SUFFIX
        cases = [
                    ("smoke", "http://foo.bar.tld/some/path/feed.xml"),
                    ("not http", "mms://something.tld/whatever.wmv"),
                    ("empty", ""),
                ]
        for case in cases:
            self.assertEqual(cache.to_filename(case[1]), 
                    os.path.join(prefix, urllib.quote_plus(case[1]) 
                        + suffix), 
                    case[0])

    def testlocking(self):
        url = "http://some_test_url.tld/blah/blah/index.xml"
        with cache.Cache(url) as c:
            pid = os.fork()
            if pid:
                child,exit_status = os.wait()
            else:
                os.execl(sys.executable, sys.executable, 
                        "-c", "import test; test.getlock('%s')"%cache.to_filename(url))
            self.assertEqual(child,pid)
            self.assertEqual(exit_status>>8, 0)

    def testremember(self):
        url = "test_remember"
        test_data = "foobarbaz"
        with cache.Cache(url) as c:
            c.clear()

        with cache.Cache(url) as c:
            c.remember(test_data)

        self.failUnless(os.path.exists(cache.to_filename(url)))
        ttl,data = pickle.load(open(cache.to_filename(url)))
        self.assertEqual(ttl, cache.DEFAULT_TTL)
        self.assertEqual(data, test_data)

    def testroundtrip(self):
        url = "test_roundtrip"
        test_data = str(uuid.uuid1())

        with cache.Cache(url) as c:
            c.remember(test_data)

        with cache.Cache(url) as c:
            self.failUnless(c.alive())
            self.failUnless(c.data == test_data)

    def testalive(self):
        url = "test_alive"
        test_data = "dontcare"
        ttl = 0

        with cache.Cache(url) as c:
            c.remember(test_data, ttl)

        with cache.Cache(url) as c:
            self.failUnless(not c.alive())

if __name__ == "__main__":
    unittest.main()

