Самый простой способ симулировать отсутствие свободного места на диске? - PullRequest
31 голосов
/ 11 января 2010

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

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

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

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

Ответы [ 13 ]

28 голосов
/ 11 января 2010

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

13 голосов
/ 11 января 2010

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

5 голосов
/ 11 января 2010

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

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

Чтобы смоделировать, просто оберните функцию в класс FileSystem. Затем внедрите его в свой класс, выполняя сохранение в качестве зависимости, и проверьте, не заполнен ли накопитель, прежде чем выполнять фактическое сохранение. В вашем 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.

4 голосов
/ 11 января 2010

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

3 голосов
/ 11 января 2010

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

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

2 голосов
/ 11 января 2010

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

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

2 голосов
/ 11 января 2010

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

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

1 голос
/ 11 января 2010

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

0 голосов
/ 03 ноября 2010

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

0 голосов
/ 18 января 2010

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

...