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)
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()