# test_lafilefixer.py -- Portage Unit Testing Functionality
# Copyright 2010 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2

from portage.tests import TestCase
from portage.exception import InvalidData

class test_lafilefixer(TestCase):

	def get_test_cases_clean(self):
		yield b"dlname='libfoo.so.1'\n" + \
			b"library_names='libfoo.so.1.0.2 libfoo.so.1 libfoo.so'\n" + \
			b"old_library='libpdf.a'\n" + \
			b"dependency_libs=' -lm'\n" + \
			b"current=6\n" + \
			b"age=0\n" + \
			b"revision=2\n" + \
			b"installed=yes\n" + \
			b"dlopen=''\n" + \
			b"dlpreopen=''\n" + \
			b"libdir='/usr/lib64'\n"
		yield b"dlname='libfoo.so.1'\n" + \
			b"library_names='libfoo.so.1.0.2 libfoo.so.1 libfoo.so'\n" + \
			b"old_library='libpdf.a'\n" + \
			b"dependency_libs=' -lm'\n" + \
			b"current=6\n" + \
			b"age=0\n" + \
			b"revision=2\n" + \
			b"installed=yes\n" + \
			b"dlopen=''\n" + \
			b"dlpreopen=''\n" + \
			b"libdir='/usr/lib64'\n"
		yield b"dependency_libs=' liba.la /usr/lib64/bar.la -lc'\n"

	def get_test_cases_update(self):
		#.la -> -l*
		yield b"dlname='libfoo.so.1'\n" + \
			b"library_names='libfoo.so.1.0.2 libfoo.so.1 libfoo.so'\n" + \
			b"old_library='libpdf.a'\n" + \
			b"dependency_libs=' /usr/lib64/liba.la /usr/lib64/libb.la -lc'\n", \
			b"dlname='libfoo.so.1'\n" + \
			b"library_names='libfoo.so.1.0.2 libfoo.so.1 libfoo.so'\n" + \
			b"old_library='libpdf.a'\n" + \
			b"dependency_libs=' -L/usr/lib64 -la -lb -lc'\n"
		#move stuff into inherited_linker_flags
		yield b"dlname='libfoo.so.1'\n" + \
			b"library_names='libfoo.so.1.0.2 libfoo.so.1 libfoo.so'\n" + \
			b"old_library='libpdf.a'\n" + \
			b"dependency_libs=' /usr/lib64/liba.la -pthread /usr/lib64/libb.la -lc'\n" + \
			b"inherited_linker_flags=''\n", \
			b"dlname='libfoo.so.1'\n" + \
			b"library_names='libfoo.so.1.0.2 libfoo.so.1 libfoo.so'\n" + \
			b"old_library='libpdf.a'\n" + \
			b"dependency_libs=' -L/usr/lib64 -la -lb -lc'\n" + \
			b"inherited_linker_flags=' -pthread'\n"
		#reorder 
		yield b"dlname='libfoo.so.1'\n" + \
			b"library_names='libfoo.so.1.0.2 libfoo.so.1 libfoo.so'\n" + \
			b"old_library='libpdf.a'\n" + \
			b"dependency_libs=' /usr/lib64/liba.la -R/usr/lib64 /usr/lib64/libb.la -lc'\n", \
			b"dlname='libfoo.so.1'\n" + \
			b"library_names='libfoo.so.1.0.2 libfoo.so.1 libfoo.so'\n" + \
			b"old_library='libpdf.a'\n" + \
			b"dependency_libs=' -R/usr/lib64 -L/usr/lib64 -la -lb -lc'\n"
		#remove duplicates from dependency_libs (the original version didn't do it for inherited_linker_flags)
		yield b"dlname='libfoo.so.1'\n" + \
			b"library_names='libfoo.so.1.0.2 libfoo.so.1 libfoo.so'\n" + \
			b"old_library='libpdf.a'\n" + \
			b"dependency_libs=' /usr/lib64/liba.la /usr/lib64/libc.la -pthread -mt" + \
			b" -L/usr/lib -R/usr/lib64 -lc /usr/lib64/libb.la -lc'\n" +\
			b"inherited_linker_flags=' -pthread -pthread'\n", \
			b"dlname='libfoo.so.1'\n" + \
			b"library_names='libfoo.so.1.0.2 libfoo.so.1 libfoo.so'\n" + \
			b"old_library='libpdf.a'\n" + \
			b"dependency_libs=' -R/usr/lib64 -L/usr/lib64 -L/usr/lib -la -lc -lb'\n" +\
			b"inherited_linker_flags=' -pthread -pthread -mt'\n"
		#-L rewriting
		yield b"dependency_libs=' -L/usr/X11R6/lib'\n", \
			b"dependency_libs=' -L/usr/lib'\n"
		yield b"dependency_libs=' -L/usr/local/lib'\n", \
			b"dependency_libs=' -L/usr/lib'\n"
		yield b"dependency_libs=' -L/usr/lib64/pkgconfig/../..'\n", \
			b"dependency_libs=' -L/usr'\n"
		yield b"dependency_libs=' -L/usr/lib/pkgconfig/..'\n", \
			b"dependency_libs=' -L/usr/lib'\n"
		yield b"dependency_libs=' -L/usr/lib/pkgconfig/../.. -L/usr/lib/pkgconfig/..'\n", \
			b"dependency_libs=' -L/usr -L/usr/lib'\n"
		#we once got a backtrace on this one
		yield b"dependency_libs=' /usr/lib64/libMagickCore.la -L/usr/lib64 -llcms2 /usr/lib64/libtiff.la " + \
			b"-ljbig -lc /usr/lib64/libfreetype.la /usr/lib64/libjpeg.la /usr/lib64/libXext.la " + \
			b"/usr/lib64/libXt.la /usr/lib64/libSM.la -lICE -luuid /usr/lib64/libICE.la /usr/lib64/libX11.la " + \
			b"/usr/lib64/libxcb.la /usr/lib64/libXau.la /usr/lib64/libXdmcp.la -lbz2 -lz -lm " + \
			b"/usr/lib/gcc/x86_64-pc-linux-gnu/4.4.4/libgomp.la -lrt -lpthread /usr/lib64/libltdl.la -ldl " + \
			b"/usr/lib64/libfpx.la -lstdc++'", \
			b"dependency_libs=' -L/usr/lib64 -L/usr/lib/gcc/x86_64-pc-linux-gnu/4.4.4 -lMagickCore -llcms2 " + \
			b"-ltiff -ljbig -lc -lfreetype -ljpeg -lXext -lXt -lSM -lICE -luuid -lX11 -lxcb -lXau -lXdmcp " + \
			b"-lbz2 -lz -lm -lgomp -lrt -lpthread -lltdl -ldl -lfpx -lstdc++'"


	def get_test_cases_broken(self):
		yield b""
		#no dependency_libs
		yield b"dlname='libfoo.so.1'\n" + \
			b"current=6\n" + \
			b"age=0\n" + \
			b"revision=2\n"
		#borken dependency_libs
		yield b"dlname='libfoo.so.1'\n" + \
			b"library_names='libfoo.so.1.0.2 libfoo.so.1 libfoo.so'\n" + \
			b"old_library='libpdf.a'\n" + \
			b"dependency_libs=' /usr/lib64/liba.la /usr/lib64/libb.la -lc' \n"
			#borken dependency_libs
		yield b"dlname='libfoo.so.1'\n" + \
			b"library_names='libfoo.so.1.0.2 libfoo.so.1 libfoo.so'\n" + \
			b"old_library='libpdf.a'\n" + \
			b"dependency_libs=' /usr/lib64/liba.la /usr/lib64/libb.la -lc\n"
		#crap in dependency_libs
		yield b"dlname='libfoo.so.1'\n" + \
			b"library_names='libfoo.so.1.0.2 libfoo.so.1 libfoo.so'\n" + \
			b"old_library='libpdf.a'\n" + \
			b"dependency_libs=' /usr/lib64/liba.la /usr/lib64/libb.la -lc /-lstdc++'\n"
		#dependency_libs twice
		yield b"dlname='libfoo.so.1'\n" + \
			b"library_names='libfoo.so.1.0.2 libfoo.so.1 libfoo.so'\n" + \
			b"old_library='libpdf.a'\n" + \
			b"dependency_libs=' /usr/lib64/liba.la /usr/lib64/libb.la -lc /-lstdc++'\n" +\
			b"dependency_libs=' /usr/lib64/liba.la /usr/lib64/libb.la -lc /-lstdc++'\n"
		#inherited_linker_flags twice
		yield b"dlname='libfoo.so.1'\n" + \
			b"library_names='libfoo.so.1.0.2 libfoo.so.1 libfoo.so'\n" + \
			b"old_library='libpdf.a'\n" + \
			b"inherited_linker_flags=''\n" +\
			b"inherited_linker_flags=''\n"

	def testlafilefixer(self):
		from portage.util.lafilefixer import _parse_lafile_contents, rewrite_lafile

		for clean_contents in self.get_test_cases_clean():
			self.assertEqual(rewrite_lafile(clean_contents), (False, None))

		for original_contents, fixed_contents in self.get_test_cases_update():
			self.assertEqual(rewrite_lafile(original_contents), (True, fixed_contents))

		for broken_contents in self.get_test_cases_broken():
			self.assertRaises(InvalidData, rewrite_lafile, broken_contents)
