class TestFuncSystem(unittest.TestCase):


    def createTempDir(self):
        """ Создаёт временную директорию во временной папке и возсращает путь к ней.

        Возвращает:
            (string) - путь к временной папке.

        """
        tmpPathName = os.getenv("TEMP")
        tmpDirName = ''.join([random.choice(string.ascii_letters + string.digits) for i in range(10)])  # Временная директория для тестирования.        tmpPathName = os.getenv("TEMP")  # Путь к временной директории.
        tmpDir = "%s\\!_%s" % (tmpPathName, tmpDirName)
        os.mkdir(tmpDir)
        return tmpDir


    def createTempDirAndFiles(self):
        """ Создайт временные директории во временной папке Windows, создаёт в ней несколько файлов (0.txt, 1.txt, 2.txt) и возвращает путь к ней.

        Возвращает:
            (string) - путь к временной папке.

        """
        # Создаём файлы в выбранной диретори
        tmpDir = self.createTempDir()
        for x in range(3):
            f = open("%s\\%s.txt" % (tmpDir, x), "w")
            f.close()
        return tmpDir


    def setUp(self):
        self.s = FuncSystem()


    def testGetProcent(self):
        self.assertEquals(self.s.getProcent(0, 0), 0)
        self.assertEquals(self.s.getProcent(100, 0), 0)
        self.assertEquals(self.s.getProcent(100, 100), 100)
        self.assertRaises(ValueError, self.s.getProcent, 0, 100)
        self.assertRaises(ValueError, self.s.getProcent, 100, -1)
        self.assertRaises(ValueError, self.s.getProcent, -1, 100)
        self.assertRaises(TypeError, self.s.getProcent, "xxxx", "cccc")


    def testConvertBytes(self):
        self.assertEquals(self.s.convertBytes(0), "0.0b")
        self.assertEquals(self.s.convertBytes(1), "1.0b")
        self.assertEquals(self.s.convertBytes(10000), "9.8Kb")
        self.assertEquals(self.s.convertBytes(20000000), "19.1Mb")
        self.assertEquals(self.s.convertBytes(2000000000), "1.9Gb")
        self.assertEquals(self.s.convertBytes(2000000000000), "1.8Tb")
        self.assertEquals(self.s.convertBytes(100000000), "95.4Mb")
        self.assertRaises(TypeError, self.s.convertBytes, "cccc")


    def testGetWindowsVersion(self):
        self.assertRegexpMatches(self.s.getWindowsVersion(), r"^\d+\.\d+$")


    def testGetFilePath(self):
        self.assertEquals(self.s.getFilePath("HsjHDJej.exe"), None)
        self.assertEquals(self.s.getFilePath("explorer.exe"), "C:\\Windows\\explorer.exe")


    def testGetFoldersFromPath(self):
        self.assertEquals(self.s.getFoldersFromPath("c:\\fJDJjbdKDjf"), [])


    def testDeleteFolder(self):
        tmpDir = self.createTempDirAndFiles()
        self.assertEqual(self.s.deleteFolder(tmpDir), True)
        self.assertEqual(self.s.deleteFolder(tmpDir), False)
Beispiel #2
0
class Menu():


    def __init__(self):
        self.funcSystem = FuncSystem()
        self.workSystemInfo = WorkSystemInfo()
        self.workArchiveDelete = WorkArchivDelete()


    def checkWindowsVersion(self):
        """ Определение версии ОС Windows.

        Возвращает:
            (string) абревиатура версии операционной системы (5.1, 6.1).

        """
        return self.funcSystem.getWindowsVersion()


    def checkFilePath(self, fileName):
        """ Проверяет наличие указанного файла.

        Аргументы:
            fileName - (string) имя искомого файла.

        Вовзращает:
            (string) - абсолютный путь к искомогу файлу.
            None - если файл не найден.

        """
        return self.funcSystem.getFilePath(fileName)


    def checkSystemEnvironment(self):
        """ Проведение проверки на наличие всех необходимых инструметов и условий для работы программы.

        Возвращает:
            True/False - результат проверки на совместимость. При ошибке, на консоль выводятся сообщения об недостатках.

        """
        # Проверка версии ОС.
        try:
            ("5.1", "5.2", "6.0", "6.1").index(self.checkWindowsVersion())
        except Exception:
            cprint(u"ОШИБКА: ", "red", newline=False)
            print(u"неподдерживаемая операционная система версии %s" % self.checkWindowsVersion())
            return False
        # Проверка наличия утилиты taskkill.exe.
        fileNames = ("taskkill.exe",)
        for item in fileNames:
            if not self.checkFilePath(item):
                cprint(u"ОШИБКА: ", "red", newline=False)
                print(u"не найден необходимый для работы программы файл %s" % item)
                return False
        return True


    def help(self):
        """ Пункт меню "помощь". """
        cprint(u"\n\n____----******* ПОМОЩЬ ********----____\n", "magenta")
        print u"В процессе оформления..."
        print u"В процессе оформления..."
        print u"В процессе оформления..."
        print u"В процессе оформления..."
        print u"В процессе оформления..."
        cprint(u"\n****----_______________________----****\n", "magenta")
        raw_input(u"[ENTER для продолжения]")
        print "\n"


    def writeInfoLine(self, type_, text, title=""):
        """ Оформление вывода сообщение о текущем действиии рабочего класса (описывает загрушку метода writeInfoLine)

        Аргументы:
            type_ - (string) тип сообщения (ok, warning, error, fatal, info)
            text - текст сообщения
            title - заголовок сообщения (пишется перед текстом цвета, указанного в type_)

        """
        # Проверка входящих данных:
        try:
            ("ok", "warning", "error", "fatal", "info").index(type_)
        except Exception:
            raise ValueError(u"Передано некорректное значение параметра type_ - %s" % type_)
        # Вывод информации на консоль:
        color = {
            "ok": "green",
            "warning": "yellow",
            "error": "red",
            "fatal": "red",
            "info": ""
            }
        about = {
            "ok": u"ОК",
            "warning": u"ВНИМАНИЕ",
            "error": u"ОШИБКА",
            "fatal": u"ФАТАЛЬНАЯ ОШИБКА",
            "info": ""
        }
        if title:
            cprint(u"  " + title + ": ", f=color[type_], newline=False)
            print text
        elif type_ == "info":
            cprint(u"  " + text, f=color[type_])
        else:
            cprint(u"  " + about[type_] + ": ", f=color[type_], newline=False)
            print text
        return None


    def syncComp(self):
        """ Пункт меню "указать компьютер синхроинзации"  """
        pass


    def test(self):
        """ Пункт меню "тестирование комьютера"

        Возвращает:
            True/False - результат сбора информации.

        """

        workList = (
            {
                "name": u"СБОР ИНФОРМАЦИИ О КОМПЬЮТЕРЕ:\n",  # Описание процесса.
                "print": True,  # Выводить информацию о ходе работы на консоль.
                "process": self.workSystemInfo,  # Класс, обрабатывающий задание.
                "critical": False,  # Завершать-ли обработку при некорректном завершении обработки задания.
            },
            {
                "name": u"ИНФОРМАЦИЯ ОБ АРХИВЕ:\n",
                "print": True,
                "process": self.workArchiveDelete,
                "critical": True,
            },

        )

        # Запуск процесса сбора информации:
        resultAll = True
        for workProcess in workList:
            workProcess["process"].writeInfoLine = self.writeInfoLine
            cprint(u"\n%s\n" % workProcess["name"], "blue", newline=False)
            if workProcess["print"]:
                workProcess["process"].print_ = True
            result = workProcess["process"].readInfo()  # Чтение рабочей информации.
            if not workProcess["print"]:
                if result:
                    cprint(u"ОК", "green")
                else:
                    cprint(u"ОШИБКА: ", "red", newline=False)
                    if workProcess["process"].errorMessage:
                        print workProcess["process"].errorMessage
                    else:
                        print u"неописанная ошибка."
            if not result and workProcess["critical"]:  # Если сбой в сборе информации критический - вернуть False.
                resultAll = False
                break

        return resultAll


    def reglament(self):
        """ Пункт меню "регламентные работы" """
        # Сначала производим сбор информации через метод self.test и если сбор произошол успешный,
        # продолжаем работу. Иначе завершаем работу с сообщеинем об невозможности проветси регламент.
        testResult = self.test()
        if not testResult:
            cprint(u"\nОШИБКА ПРОВЕДЕНИЯ ТЕСТИРОВАНИЯ: ", "red", newline=False)
            print u"проведение регламентных работ невозможно\nдо устранения неисправностей, проявившихся при тестировании.\n"
        else:

            workList = (
                    {
                    "name": u"ОЧИСТКА АРХИВА:\n",
                    "print": True,
                    "process": self.workArchiveDelete,
                    "critical": True,
                    },

                )

            # Запуск процесса регламента:
            for workProcess in workList:
                workProcess["process"].writeInfoLine = self.writeInfoLine
                cprint(u"\n%s\n" % workProcess["name"], "blue", newline=False)
                if workProcess["print"]:
                    workProcess["process"].print_ = True
                result = workProcess["process"].execReglament()  # Проведение регламента.

                if not workProcess["print"]:
                    if result:
                        cprint(u"ОК", "green")
                    else:
                        cprint(u"ОШИБКА: ", "red", newline=False)
                        if workProcess["process"].errorMessage:
                            print workProcess["process"].errorMessage
                        else:
                            print u"неописанная ошибка."
                if not result and workProcess["critical"]:
                    break

            exit(1)



    def mainMenu(self):
        """ Основное меню программы """
        while True:
            cprint(u"\n\n____----**** ОСНОВНОЕ МЕНЮ ****----____", "magenta")
            cprint(u"1. ТЕСТИРОВАНИЕ компьютера (без обработки);", "yellow")
            cprint(u"2. провести РЕГЛАМЕНТНЫЕ работы на компьютере;", "yellow")
            cprint(u"3. указать компьютера СИНХРОНИЗАЦИИ;", "yellow")
            cprint(u"4. ПОМОЩЬ;", "yellow")
            cprint(u"0. ВЫХОД;", "red")
            cprint(u"****----_______________________----****\n", "magenta")
            # Обработка ошибок ввода:
            try:
                input_ = input(u"ВВОД: ")
                try:
                    (0, 1, 2, 3).index(input_)
                except Exception:
                    cprint(u"\nОШИБКА: ", "red", newline=False)
                    print u"необходимо ввести цифру иеню 1-3, или 0 для выхода из программы."
                    time.sleep(1)
                    continue
            except Exception:
                cprint(u"\nОШИБКА: ", "red", newline=False)
                print u"необходимо вводить только цифры номеров элементов меню."
                time.sleep(1)
                continue
            # Обработка элементов меню.
            if not input_:  # Выход из программы.
                return
            elif input_ == 1:  # Тестирование комьпютера.
                cprint(u"\n\n____----**** ТЕСТИРОВАНИЕ КОМПЬЮТЕРА ****----____\n", "magenta")
                self.test()
                cprint(u"\n****----_________________________________----****\n", "magenta")
                raw_input(u"[ENTER для продолжения]")
            elif input_ == 2:  # Регламентные работы.
                cprint(u"\n\n____----**** РЕГЛАМЕНТНЫЕ РАБОТЫ ****----____\n", "magenta")
                self.reglament()
                cprint(u"\n****----_________________________________----****\n", "magenta")
                raw_input(u"[ENTER для продолжения]")
            elif input_ == 3:  # Указать компьютер синхронизации.
                pass
            elif input_ == 4:  # Помощь.
                self.help()