Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 3

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

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

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

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

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

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

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

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

Как альтернативный взгляд на vfsStream:

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

Ответ 4

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

Ответ 5

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

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

Ответ 6

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

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

Ответ 7

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

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

Ответ 8

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

Ответ 9

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

Ответ 10

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

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

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

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

Ответ 11

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

Ответ 12

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

Ответ 13

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