#!/usr/bin/env python2.4
from basetest import BaseTest
import sys, tempfile, os, shutil
import unittest

sys.path.insert(0, '..')
from zeroinstall.zerostore import manifest, BadDigest

class TestManifest(BaseTest):
	def setUp(self):
		BaseTest.setUp(self)
		self.tmpdir = tempfile.mkdtemp(prefix = 'test-manifest')

	def tearDown(self):	
		BaseTest.tearDown(self)
		shutil.rmtree(self.tmpdir)

	def testUnknownAlgorithm(self):
		try:
			manifest.get_algorithm('unknown')
			assert False
		except BadDigest:
			pass
	
	def testEmpty(self):
		self.assertEquals('',
			'\n'.join(manifest.generate_manifest(self.tmpdir)))
	
	def write(self, path, contents, time = None):
		assert not path.startswith('/')
		myfile = os.path.join(self.tmpdir, path)
		stream = file(myfile, 'w')
		stream.write(contents)
		stream.close()
		if time is not None:
			os.utime(myfile, (time, time))
		return myfile
	
	def testOldSHA(self):
		mydir = os.path.join(self.tmpdir, 'MyDir')
		os.mkdir(mydir)
		myfile = self.write('MyDir/Hello', 'Hello World', 30)
		myexec = self.write('MyDir/Run me', 'Bang!', 40)
		os.symlink('Hello', os.path.join(self.tmpdir, 'MyDir/Sym link'))
		os.chmod(myexec, 0700)
		os.utime(mydir, (10, 20))
		self.assertEquals([
			'D 20 /MyDir',
			'F 0a4d55a8d778e5022fab701977c5d840bbc486d0 30 11 Hello',
			'X 4001b8c42ddfb61c453d04930e8ce78fb3a40bc8 40 5 Run me',
			'S f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0 5 Sym link'],
			list(manifest.generate_manifest(self.tmpdir)))

	def testNewSHA1(self):
		mydir = os.path.join(self.tmpdir, 'MyDir')
		os.mkdir(mydir)
		myfile = self.write('MyDir/Hello', 'Hello World', 30)
		myexec = self.write('MyDir/Run me', 'Bang!', 40)
		os.symlink('Hello', os.path.join(self.tmpdir, 'MyDir/Sym link'))
		os.chmod(myexec, 0700)
		os.utime(mydir, (10, 20))
		self.assertEquals([
			'D /MyDir',
			'F 0a4d55a8d778e5022fab701977c5d840bbc486d0 30 11 Hello',
			'X 4001b8c42ddfb61c453d04930e8ce78fb3a40bc8 40 5 Run me',
			'S f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0 5 Sym link'],
			list(manifest.generate_manifest(self.tmpdir, alg = 'sha1new')))

	def testOrderingSHA1(self):
		mydir = os.path.join(self.tmpdir, 'Dir')
		os.mkdir(mydir)
		myfile = self.write('Hello', 'Hello World', 30)
		myfile = self.write('Dir/Hello', 'Hello World', 30)
		os.utime(mydir, (10, 20))
		self.assertEquals([
			'F 0a4d55a8d778e5022fab701977c5d840bbc486d0 30 11 Hello',
			'D /Dir',
			'F 0a4d55a8d778e5022fab701977c5d840bbc486d0 30 11 Hello'],
			list(manifest.generate_manifest(self.tmpdir, alg = 'sha1new')))

	def testNewSHA256(self):
		mydir = os.path.join(self.tmpdir, 'MyDir')
		os.mkdir(mydir)
		myfile = self.write('MyDir/Hello', 'Hello World', 30)
		myexec = self.write('MyDir/Run me', 'Bang!', 40)
		os.symlink('Hello', os.path.join(self.tmpdir, 'MyDir/Sym link'))
		os.chmod(myexec, 0700)
		self.assertEquals([
			'D /MyDir',
			'F a591a6d40bf420404a011733cfb7b190d62c65bf0bcda32b57b277d9ad9f146e 30 11 Hello',
			'X 640628586b08f8ed3910bd1e75ba02818959e843b54efafb9c2260a1f77e3ddf 40 5 Run me',
			'S 185f8db32271fe25f561a6fc938b2e264306ec304eda518007d1764826381969 5 Sym link'],
			list(manifest.generate_manifest(self.tmpdir, alg = 'sha256')))

	def testOrdering(self):
		mydir = os.path.join(self.tmpdir, 'Dir')
		os.mkdir(mydir)
		myfile = self.write('Hello', 'Hello World', 30)
		os.utime(mydir, (10, 20))
		self.assertEquals([
			'F a591a6d40bf420404a011733cfb7b190d62c65bf0bcda32b57b277d9ad9f146e 30 11 Hello',
			'D /Dir'],
			list(manifest.generate_manifest(self.tmpdir, alg='sha256')))

suite = unittest.makeSuite(TestManifest)
if __name__ == '__main__':
	sys.argv.append('-v')
	unittest.main()


syntax highlighted by Code2HTML, v. 0.9.1