#!/usr/bin/env python3 # -*- coding: utf-8 -*- # # This file is part of gns-deb-diff. # # gns-deb-diff is under the Public Domain. See # import os import subprocess import sys from io import StringIO from os import path from shutil import rmtree from unittest import mock from nose.tools import * from gd_diff import * class TestGdDiff(object): def setup(self): """Setup method for this class.""" self.pkgs_file = 'tests/files/parkes-pkgs.list' self.small_pkgs_file = 'tests/files/small-parkes-pkgs.list' self.pkgs_file_ne = 'tests/nonexistent-file.list' self.gns_pkgs_dir = 'tests/gns-pkgs' self.test_home = 'tests/HOME' self.test_w_file = os.path.join(self.test_home, 'w_file') self.stderr_orig = sys.stderr # make test home os.mkdir(self.test_home, mode=0o700) def test_read_file_success(self): f_content = read_file(self.pkgs_file) assert isinstance(f_content, str) assert_equal(len(f_content.split('\n')), 82) @raises(SystemExit) def test_read_file_error(self): with open(os.devnull, 'w') as sys.stderr: f_content = read_file(self.pkgs_file_ne) def test_write_file(self): content = 'One Goodbye\n Stealing Romance' write_file(self.test_w_file, content) assert read_file(self.test_w_file) == content def test_execute_success(self): cmd = 'python --version' cp = execute(cmd, out=subprocess.PIPE) assert cp.returncode == 0 assert cp.stdout.split()[0] == b'Python' assert cp.stdout.split()[1].startswith(b'3.5') def test_execute_cmderror(self): cmd = 'bzr cat bzr://bzr.sv.gnu.org/gnewsense/packages-parkes/nonexistent-packages/debian/README.gNewSense' cp = execute(cmd, err=subprocess.PIPE) assert cp.returncode == 3 assert cp.stderr.startswith(b'bzr: ERROR:') @raises(SystemExit) def test_execute_raise_exception(self): cmd = 'cornhole computers' with open(os.devnull, 'w') as sys.stderr: cp = execute(cmd) def test_read_packages(self): pkgs_iter = read_packages(self.pkgs_file) assert len(list(pkgs_iter)) == 82 def test_read_packages_sanity(self): pkgs_iter = read_packages(self.pkgs_file) for pkg in pkgs_iter: assert not ' ' in pkg @raises(SystemExit) def test_get_packages_error(self): res = get_packages('foo_release') def test_get_packages(self): pkgs = get_packages('parkes') assert_equal(pkgs, ['antlr', 'apt', 'apt-setup', 'autoconf', 'autoconf2.59', 'autoconf2.64', 'bacula', 'base-files', 'base-installer', 'batik', 'cairomm', 'cdebootstrap', 'cfitsio3', 'choose-mirror', 'claws-mail', 'db4.6', 'db4.7', 'db4.8', 'debian-cd', 'debian-edu', 'debian-installer', 'debian-installer-launcher', 'debootstrap', 'desktop-base', 'doc-linux', 'doc-linux-hr', 'doc-linux-it', 'doc-linux-ja', 'doc-linux-pl', 'enscript', 'epiphany-browser', 'fop', 'freetype', 'galaxia', 'gdm3', 'glibmm2.4', 'gnewsense-archive-keyring', 'gnome-desktop', 'gtkmm2.4', 'icedove', 'iceweasel', 'kde4libs', 'kdebase', 'kdebase-workspace', 'kdenetwork', 'kernel-wedge', 'lensfun', 'liferea', 'lintian', 'linux-2.6', 'linux-kernel-di-amd64-2.6', 'linux-kernel-di-i386-2.6', 'linux-latest-2.6', 'live-build', 'live-config', 'meta-gnome2', 'mplayer', 'net-retriever', 'objcryst-fox', 'openbox-themes', 'openjdk-6', 'openoffice.org', 'pangomm', 'perl-tk', 'pkgsel', 'popularity-contest', 'psutils', 'python-apt', 'screenlets', 'sip4-qt3', 'software-center', 'tcl8.4', 'tcl8.5', 'texlive-extra', 'tk8.4', 'tk8.5', 'update-manager', 'vim', 'wmaker', 'xchat', 'xdm', 'xorg-server', 'xserver-xorg-video-siliconmotion', 'yeeloong-base']) def test_save_gns_readme(self): cmd = 'bzr cat bzr://bzr.sv.gnu.org/gnewsense/packages-parkes/antlr/debian/README.gNewSense' cp = execute(cmd, out=subprocess.PIPE) readme_content = cp.stdout.decode() # convert to str # save it save_gns_readme(readme_content, 'parkes', 'antlr', self.gns_pkgs_dir) gns_readme_file = path.join(self.gns_pkgs_dir, 'parkes', 'antlr', 'debian', 'README.gNewSense') with open(gns_readme_file, 'rb') as f: assert f.read() == b'Changed-From-Debian: Removed example with non-free files.\nChange-Type: Modified\n\nFor gNewSense, the non-free unicode.IDENTs files are *actually* removed (see\nalso README.source). See gNewSense bug #34218 for details.\n' def test_save_gns_readme_double(self): cmd = 'bzr cat bzr://bzr.sv.gnu.org/gnewsense/packages-parkes/antlr/debian/README.gNewSense' cp = execute(cmd, out=subprocess.PIPE) readme_content = cp.stdout.decode() # convert to str # save it twice save_gns_readme(readme_content, 'parkes', 'antlr', self.gns_pkgs_dir) save_gns_readme(readme_content, 'parkes', 'antlr', self.gns_pkgs_dir) gns_readme_file = path.join(self.gns_pkgs_dir, 'parkes', 'antlr', 'debian', 'README.gNewSense') with open(gns_readme_file, 'rb') as f: assert f.read() == b'Changed-From-Debian: Removed example with non-free files.\nChange-Type: Modified\n\nFor gNewSense, the non-free unicode.IDENTs files are *actually* removed (see\nalso README.source). See gNewSense bug #34218 for details.\n' @raises(SystemExit) def test_save_gns_readme_error(self): os.mkdir(self.gns_pkgs_dir, mode=0o500) # must error out readme_content = 'lorem ipsum' with open(os.devnull, 'w') as sys.stderr: save_gns_readme(readme_content, 'parkes', 'antlr', self.gns_pkgs_dir) def test_slurp_gns_readme_success(self): saved = slurp_gns_readme('parkes', 'antlr', self.gns_pkgs_dir) assert saved == True gns_readme_file = path.join(self.gns_pkgs_dir, 'parkes', 'antlr', 'debian', 'README.gNewSense') with open(gns_readme_file, 'rb') as f: assert f.read() == b'Changed-From-Debian: Removed example with non-free files.\nChange-Type: Modified\n\nFor gNewSense, the non-free unicode.IDENTs files are *actually* removed (see\nalso README.source). See gNewSense bug #34218 for details.\n' def test_slurp_gns_readme_error(self): saved = slurp_gns_readme('parkes', 'non-existent-pkg', self.gns_pkgs_dir) assert saved == False gns_readme_file = path.join(self.gns_pkgs_dir, 'parkes', 'non-existent-pkg', 'debian', 'README.gNewSense') assert not path.exists(gns_readme_file) def test_slurp_all_gns_readmes(self): pkgs = read_packages(self.small_pkgs_file) # expected packages with no readmes expected_pkgs_noreadmes = [ 'pkg-with-no-readme', 'another-pkgs-no-readme', ] pkgs_noreadmes = slurp_all_gns_readmes('parkes', pkgs, self.gns_pkgs_dir) assert_equal(pkgs_noreadmes, expected_pkgs_noreadmes) def test_read_gns_readme(self): # first download the antlr readme saved = slurp_gns_readme('parkes', 'antlr', self.gns_pkgs_dir) assert saved antlr_readme_content = read_gns_readme('parkes', 'antlr', self.gns_pkgs_dir) expected_antlr_readme_content = 'Changed-From-Debian: Removed example with non-free files.\nChange-Type: Modified\n\nFor gNewSense, the non-free unicode.IDENTs files are *actually* removed (see\nalso README.source). See gNewSense bug #34218 for details.\n' assert_equal(antlr_readme_content, expected_antlr_readme_content) def test_slurp_fields_from_readme(self): readme_content = '' field_values = slurp_fields_from_readme(readme_content) assert_equal(field_values['Change-Type'], None) assert_equal(field_values['Changed-From-Debian'], None) readme_content = 'Changed-From-Debian: \n' field_values = slurp_fields_from_readme(readme_content) assert_equal(field_values['Change-Type'], None) assert_equal(field_values['Changed-From-Debian'], None) readme_content = 'Change-Type: Deblob\n' field_values = slurp_fields_from_readme(readme_content) assert_equal(field_values['Change-Type'], 'Deblob') assert_equal(field_values['Changed-From-Debian'], None) readme_content = 'Changed-From-Debian: \nChange-Type: \n' field_values = slurp_fields_from_readme(readme_content) assert_equal(field_values['Change-Type'], None) assert_equal(field_values['Changed-From-Debian'], None) readme_content = 'Changed-From-Debian: Branding. \nChange-Type: \n' field_values = slurp_fields_from_readme(readme_content) assert_equal(field_values['Change-Type'], None) assert_equal(field_values['Changed-From-Debian'], 'Branding.') readme_content = 'Changed-From-Debian: \nChange-Type: Modified' field_values = slurp_fields_from_readme(readme_content) assert_equal(field_values['Change-Type'], 'Modified') assert_equal(field_values['Changed-From-Debian'], None) readme_content = 'Changed-From-Debian:Fixed ambiguous use of the word free.\n\n\nChange-Type:Deblob\n' field_values = slurp_fields_from_readme(readme_content) assert_equal(field_values['Change-Type'], 'Deblob') assert_equal(field_values['Changed-From-Debian'], 'Fixed ambiguous use of the word free.') readme_content = 'Changed-From-Debian: Removed example with non-free files.\nChange-Type: Modified\n\nFor gNewSense, the non-free unicode.IDENTs files are *actually* removed (see\nalso README.source). See gNewSense bug #34218 for details.\n' field_values = slurp_fields_from_readme(readme_content) assert_equal(field_values['Change-Type'], 'Modified') assert_equal(field_values['Changed-From-Debian'], 'Removed example with non-free files.') def test_config_dir(self): def env(e): return self.test_home with mock.patch('os.getenv', new=env): c_dir = config_dir() assert_equal(c_dir, os.path.join(self.test_home, '.config', 'gns-deb-diff')) assert_equal(os.path.isdir(c_dir), True) def test_config_file(self): def env(e): return self.test_home with mock.patch('os.getenv', new=env): c_file = config_file() assert_equal(c_file, os.path.join(self.test_home, '.config', 'gns-deb-diff', 'config')) def test_pkgs_dir(self): def env(e): return self.test_home with mock.patch('os.getenv', new=env): pd = pkgs_dir() assert_equal(pd, os.path.join(self.test_home, '.config', 'gns-deb-diff', 'pkgs')) assert_equal(os.path.isdir(pd), True) def test_configured_p_no(self): def env(e): return self.test_home with mock.patch('os.getenv', new=env): configured = configured_p() assert_equal(configured, False) def test_configured_p_yes(self): def env(e): return self.test_home with mock.patch('os.getenv', new=env): c_path = config_dir() c_file = config_file() open(c_file, 'w').close() configured = configured_p() assert_equal(configured, True) def teardown(self): """Teardown method for this class.""" if(path.exists(self.gns_pkgs_dir)): os.chmod(self.gns_pkgs_dir, mode=0o700) rmtree(self.gns_pkgs_dir) if(path.exists(self.test_home)): rmtree(self.test_home) # restore sys.stderr sys.stderr = self.stderr_orig