Как проверить, правильно ли приложение обрабатывает медленные / нестабильные файловые системы?
Я хочу убедиться, что в моем приложении нет зависаний пользовательского интерфейса при работе с файлами в медленной файловой системе (например, в сети, на CD/DVD или на жестком диске).
Я использую операции с файловой системой Какао напрямую. Боюсь, что было бы слишком много усилий, чтобы высмеивать или абстрагировать все это только для тестирования, и кроме того, могут быть неочевидные способы, которыми моя программа касается файловой системы.
Я пытался использовать сетевые диски для тестирования, но кэширование ОС делает тесты неповторяющимися и... слишком быстрыми:)
Есть ли что-то вроде намеренно медленной файловой системы MacFuse? Какой-нибудь другой метод, который позволил бы мне найти все сбои пользовательского интерфейса и условия гонки, вызванные неожиданными задержками?
5 ответов
Самый простой ответ - MacFUSE, как отмечено в другом месте; это довольно легко симулировать. Вы также можете попробовать смонтировать общий ресурс через NFS, а затем использовать его с помощью встроенного ipfw
, лайк:
ipfw pipe 1 config 1KByte / s ipfw add 1 pipe 1 src-port 2049
или если вы используете WebDAV
ipfw add 1 pipe 1 src-port 80
Затем он будет передавать запросы на любом уровне канала, который вы определили. После этого вы сможете снова избавиться от него:
ipfw удалить 1
Может быть, купить медленный флэш-накопитель? Я нашел некоторые в Best Buy, которые были ледниковыми. Подключите их через несколько USB-концентраторов и, возможно, к клавиатуре, чтобы они были подключены к сети.
-W
Написание файловой системы MacFUSE с их каркасом Cocoa очень просто. На самом деле, я думаю, что есть даже пример системы, которая просто отражает локальную файловую систему. Почему бы не адаптировать этот код так, чтобы он вызывал sleep() на мгновение во время каждой операции?
В зависимости от того, где вы беспокоитесь о проблемах, моей первой мыслью было бы просто включить дополнительный уровень вызовов функций между приложением и файловым вводом-выводом, и в этом уровне встроить некоторые вызовы sleep(). То есть, на каком бы языке вы ни использовали, замените вызов read на readDelegate и дайте readDelegate спать в течение некоторого определенного промежутка времени, затем выполните реальное чтение и верните значение. Когда вы будете готовы к производству, вам даже не придется вытягивать дополнительный слой, просто снимите сон.
Как насчет дисковода? Там должны быть внешние, которые вы можете просто подключить через USB или около того...