from s3tests import realistic
import shutil
import tempfile


# XXX not used for now
def create_files(mean=2000):
    return realistic.files2(
        mean=1024 * mean,
        stddev=1024 * 500,
        seed=1256193726,
        numfiles=4,
    )


class TestFiles(object):
    # the size and seed is what we can get when generating a bunch of files
    # with pseudo random numbers based on sttdev, seed, and mean.

    # this fails, demonstrating the (current) problem
    #def test_random_file_invalid(self):
    #    size = 2506764
    #    seed = 3391518755
    #    source = realistic.RandomContentFile(size=size, seed=seed)
    #    t = tempfile.SpooledTemporaryFile()
    #    shutil.copyfileobj(source, t)
    #    precomputed = realistic.PrecomputedContentFile(t)
    #    assert precomputed.valid()

    #    verifier = realistic.FileVerifier()
    #    shutil.copyfileobj(precomputed, verifier)

    #    assert verifier.valid()

    # this passes
    def test_random_file_valid(self):
        size = 2506001
        seed = 3391518755
        source = realistic.RandomContentFile(size=size, seed=seed)
        t = tempfile.SpooledTemporaryFile()
        shutil.copyfileobj(source, t)
        precomputed = realistic.PrecomputedContentFile(t)

        verifier = realistic.FileVerifier()
        shutil.copyfileobj(precomputed, verifier)

        assert verifier.valid()


# new implementation
class TestFileValidator(object):

    def test_new_file_is_valid(self):
        size = 2506001
        contents = realistic.generate_file_contents(size)
        t = tempfile.SpooledTemporaryFile()
        t.write(contents)
        t.seek(0)
        fp = realistic.FileValidator(t)
        assert fp.valid()

    def test_new_file_is_valid_when_size_is_1(self):
        size = 1
        contents = realistic.generate_file_contents(size)
        t = tempfile.SpooledTemporaryFile()
        t.write(contents)
        t.seek(0)
        fp = realistic.FileValidator(t)
        assert fp.valid()

    def test_new_file_is_valid_on_several_calls(self):
        size = 2506001
        contents = realistic.generate_file_contents(size)
        t = tempfile.SpooledTemporaryFile()
        t.write(contents)
        t.seek(0)
        fp = realistic.FileValidator(t)
        assert fp.valid()
        assert fp.valid()