Самый простой способ смоделировать ситуацию с отсутствием свободного места на диске?

Мне нужно протестировать мое веб-приложение в ситуации, когда на диске не осталось свободного места, т. е. я не могу больше записывать файлы. Но я не хочу забивать свой жесткий диск хламом только для того, чтобы убедиться, что места действительно не осталось. Я хочу смоделировать эту ситуацию с помощью определенного процесса (на самом деле, приложения PHP).

В самом деле, временного запрета записи на диск в процесс должно быть достаточно.

Как проще всего это сделать? Я использую Mac OS X 10.6.2 со встроенным пакетом Apache/PHP. Спасибо.

Изменить: проверка свободного места на диске не будет надежной, поскольку она может измениться в любой момент. Многие страницы обслуживаются одновременно. При проверке свободного места может быть достаточно, но к моменту, когда вы действительно что-то пишете, его нет. Кроме того, проверка свободного места на диске потребует изменения кода везде, где я пишу файл, а это не то, чего я хочу :-) Наконец, это решение прямо противоположно тому, что я пытаюсь проверить: как мое приложение будет вести себя, когда он не может больше писать.


person Ilya Birman    schedule 11.01.2010    source источник


Ответы (13)


Бьюсь об заклад, вы также можете создать свой собственный файл .dmg с файловой системой размером ... скажем, 2 МБ и записать в него. Если это работает, то это очень просто для тестирования — вы просто монтируете его и переключаете путь для тестирования. Если dmg достаточно мал, вы, вероятно, даже можете загрузить его в исходный контроль.

person Hamish Grubijan    schedule 11.01.2010

Когда мне нужно было это сделать, я создал виртуальную машину с ограниченным пространством, выделенным для виртуального диска.

person ryeguy    schedule 11.01.2010

Нет необходимости использовать предварительно заполненную фиктивную файловую систему.
Используйте disk_free_space() для издеваться над файловой системой

disk_free_space() - Учитывая строку, содержащую каталог, эта функция вернет количество байтов, доступных в соответствующей файловой системе или разделе диска.

Для имитации просто оберните функцию в класс файловой системы. Затем введите его в свой класс, выполняющий сохранение в качестве зависимости, и проверьте, заполнен ли диск, прежде чем выполнять фактическое сохранение. В вашем UnitTest просто замените обычный класс классом, имитирующим полную файловую систему, и все готово. Таким образом, вам не нужно воссоздавать полный диск или постоянно хранить диск с файлами вашего проекта всякий раз, когда вы хотите повторно запустить тест, например.

class MyFileSystem
{
    public static function df($drive)
    {
        return disk_free_space($drive);
    }
}

и для имитации полной файловой системы выполните

class MyFileSystemFull
{
    public static function df($drive)
    {
        return 0;
    }
}

Если вы хотите перегрузить функцию, чтобы она всегда возвращала 0, вы можете использовать расширение RunKit Pecl и сделать:

runkit_function_redefine('disk_free_space','string','return 0;');

В качестве альтернативы загляните в vfsStream:

vfsStream — это оболочка потока для виртуальной файловой системы, которая может быть полезна в модульных тестах для имитации реальной файловой системы. Его можно использовать с любой инфраструктурой модульного тестирования, такой как PHPUnit или SimpleTest.

person Gordon    schedule 11.01.2010
comment
Я абсолютно некомпетентен в части php, но это звучит как издевательство над вашей зависимостью, и это именно то, что я попытался бы сделать. - person Mathias; 12.01.2010
comment
@Mathias: да, так и должно быть. Возможно, потребуется некоторая настройка, чтобы вписаться в код OP, но это макет. Я обновил ответ, чтобы сделать его более понятным. - person Gordon; 12.01.2010
comment
Звучит как кандидат на состояние гонки. - person Georg Schölly; 12.01.2010
comment
@gs ты имеешь в виду когда два процесса пытаются сохранить файлы и оба проходят проверку, но потом первый файл пишется а потом места для другого не хватает. да. Истинный. Но это не то, что должен решить приведенный выше код. Это просто для имитации отсутствия свободного места на диске. - person Gordon; 12.01.2010
comment
иметь собственную функцию diskfull - это хорошо, но я бы не рекомендовал это для проверки на полный диск, есть другие случайные ошибки, которые могут быть вызваны полным диском, который это пропускает. Например, если вы вызываете библиотеку, и у нее есть полный диск. - person ideasman42; 14.07.2012

Я использовал флэш-накопитель в качестве тома для процесса.

person Cheeso    schedule 11.01.2010

Я не уверен, как это сделать в OSX, но в Linux я бы, вероятно, установил дисковую квоту для своего тестового пользователя, а затем запустил приложение.

Или, может быть, создайте пустой файл (небольшой), отформатируйте его как раздел ext3, смонтируйте его с помощью петлевого устройства и запустите внутри него приложение PHP. Это было бы ближе к физическому диску, на котором не хватает места.

person Noufal Ibrahim    schedule 11.01.2010

Быстрым и простым решением будет установка квоты для специальной учетной записи пользователя. Поддержка квот в Mac OS X

Если вы не возражаете против хлопот с ее настройкой и того факта, что вам, вероятно, понадобится вторая лицензия для вашей операционной системы, виртуальная машина, вероятно, является лучшей идеей с наиболее долгосрочными возможностями.

person Pekka    schedule 11.01.2010

Создайте образ диска/файловой системы в обычном файле (ограниченного размера) и смонтируйте его в цикле.

Но если вы будете делать это часто, я бы создал виртуальную машину, и вы найдете возможность использовать ее повторно.

person Norman Ramsey    schedule 11.01.2010

Разве вы не можете использовать Mock и заменить часть вашего кода, которая фактически записывает на диск, поддельной тестовой заменой, которая вызовет исключения, которые вы ожидаете увидеть?

person Mathias    schedule 11.01.2010

рекурсивно удалите все разрешения на запись из вашей веб-папки, папок и файлов, в которые ваше приложение будет писать.

person knittl    schedule 12.01.2010

Нижняя линия; не делай этого. Серьезно, есть так много вещей, которые идут ужасно неправильно, когда в томе заканчивается место. Если целевой том не является не загрузочным томом и на него не записывает ни одно другое приложение, поведение при заполнении диска в любом случае будет вне вашего контроля.

Если это загрузочный диск, система, скорее всего, паникует или падает при полном диске. Или, если нет, он будет вести себя беспорядочно.

Если вы говорите об объеме данных, ваше приложение единственное записывает в него данные? Если пишет какое-либо другое приложение, вы знаете наверняка, как оно может выйти из строя?

В наши дни дисковое пространство настолько дешево, что гораздо лучше позаботиться о том, чтобы нехватка места на диске просто никогда не случилась. Вставьте диск емкостью 2 ТБ и включите сигнал тревоги, когда он достигнет 50% емкости. Гораздо дешевле реализовать (если только у вас нет свободного времени) и намного надежнее.

person bbum    schedule 14.01.2010
comment
Это не похоже на решение, а скорее на временное исправление. - person AussieJoe; 30.04.2018

Вы пробовали монтировать с -f -r ? Это не совсем мало места на диске, но оно должно выдавать ошибку того же уровня.

person Justin Granger    schedule 18.01.2010

Я думаю, что идея с фиктивным классом — правильное направление. Я обычно тестирую свой код таким же образом. Если возможно, я использую для этого фреймворк вместо того, чтобы писать эти классы самостоятельно. Я не очень хорошо знаю PHP (больше программирования на C# и Java), но это кажется хорошим. https://github.com/padraic/mockery

person treze    schedule 03.11.2010

Где бы вы ни получили оставшееся место на диске, просто закомментируйте его и запустите приложение с заменяющими значениями, такими как 0,1, 0, -1.

person AlastairDewar    schedule 11.01.2010
comment
Это не сработало бы, если бы вы полагались на возникновение какого-либо исключения NoFreeDiskSpace. - person Noufal Ibrahim; 11.01.2010