Тестирование Drupal

Главные вкладки

Аватар пользователя andribas@drupal.org andribas@drupal.org 2 декабря 2014 в 14:12

Здравствуйте!
Решил поучаствовать в тестировании Drupal (версия 7)
Подскажите какие у них используются настройки окружения?
Я правильно понимаю, что перед тем как выпустить релиз, сначала он должен пройти https://qa.drupal.org/pifr/status и не быть ни одной ошибки?
Считаются ли Notices ошибками?
у меня много тестов не проходит
например, filter_xss:

sudo -u www-data php scripts/run-tests.sh --php /usr/bin/php --url http://seed.local/ --color --class FilterUnitTestCase

Drupal test run
---------------

Tests to be run:
 - Filter module filters (FilterUnitTestCase)

Test run started:
 Tuesday, December 2, 2014 - 15:49

Test summary
------------

string(20) "<img src="alert(0)">"
string(39) "<img src=" &#14;  javascript:alert(0)">"
Filter module filters 214 passes, 1 fail, and 0 exceptions

Test run duration: 0 sec

//filter_xss('<img src="jav&#x0D;ascript:alert(0)">', array('img'));
//filter_xss('<img src=" &#14;  javascript:alert(0)">', array('img'));

всего

Image
 - Image dimensions (ImageDimensionsTestCase)
        Image dimensions 30 passes, 24 fails, 5 exceptions, and 8 debug messages
- Image field display tests (ImageFieldDisplayTestCase)
        Image field display tests 158 passes, 4 fails, 0 exceptions, and 52 debug messages
OpenID
 - OpenID helper functions (OpenIDTestCase)
        OpenID helper functions 41 passes, 2 fails, and 0 exceptions
Poll
 - User poll vote capability. (PollVoteCheckHostname)
        User poll vote capability. 133 passes, 14 fails, 0 exceptions, and 38 debug messages

Session
 - Session HTTPS handling (SessionHttpsTestCase)
        Session HTTPS handling 76 passes, 7 fails, 0 exceptions, and 25 debug messages
 - Session tests (SessionTestCase)
        Session tests 188 passes, 4 fails, 0 exceptions, and 52 debug messages
System (Web pass)
 - Tablesort (TableSortTest)
        Tablesort 0 passes, 0 fails, and 1 exception
Tracker (2 Notices)
 - Tracker (TrackerTest)
        Tracker 288 passes, 0 fails, 2 exceptions, and 87 debug messages
Upgrade path (SimpleTest - broken)
 - Taxonomy upgrade path (UpgradePathTaxonomyTestCase)
        Taxonomy upgrade path 1282 passes, 24 fails, 24 exceptions, and 46 debug messages

Ошибок довольно много. И это только ядро.
больше всего картинки беспокоят, судя по всему с gd в 5.5 что-то не так.
Выбрал 16 модулей из топ-100 по популярности, тесты почти все проходят. старался выбирать те, у которых есть понятный путь в drupal 8, или которые смержили в ядро.
В модуле Link (d8 core) - вот такое попалось

PHP Fatal error:  Call to undefined function link_validate_url() in /home/andribas/www/seed/sites/all/modules/contrib/link/tests/link.validate.test on line 391

модуль l10n_update (d8 core)

Localization Update
 - Update translations using cron (L10nUpdateCronTest)
        Update translations using cron 61 passes, 5 fails, 0 exceptions, and 27 debug messages
 - Update translations (L10nUpdateTest)
        Update translations 535 passes, 36 fails, 1 exception, and 210 debug messages

все тестируемые версии - не dev, а последние рекомендуемые для семерки.

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

Видел, что некоторые здесь обнаруживают ошибки, некоторые уже после "накатывания" обновлений)
некоторые потом откатывают назад.
Вопрос, кто-нибудь вообще тестирует эти "накатывания" перед обновлением?
Я хочу понять, какое окружение рекомендуется использовать (что у меня не так - и почему все тесты не проходят),
в частности я тестирую PHP 5.5+ (сейчас 5.6)

здесь увидел https://www.drupal.org/project/testbot, что
The testbot is running PHP 5.3.27 (from dotdeb)
дело только в этом?
есть вот такой issue https://www.drupal.org/node/1867192
кстати с пометкой "D8 stable release blocker"
в принципе, все равно должно работать на 5.5, думаю и для семерки вопрос совместимости будут решать.

Комментарии

Аватар пользователя andribas@drupal.org andribas@drupal.org 2 декабря 2014 в 21:25

судя по всему, если у вас на сервере не версия 5.3.27 и тесты вы не делали, то ожидать можно чего угодно
https://www.drupal.org/node/2364647#comment-9291713

сделал downgrade php до 5.5.12 на локальной машине http://hackedbellini.org/linux/downgrade-and-force-some-packages-on-debi...
но тесты все равно не проходит, при этом некоторые высказывают личное мнение https://www.drupal.org/requirements#comment-9312383
что если модуль не проходит тест для 5.3.27+, то это баг поскольку вынуждает вас использовать неподдерживаемую версию php, которая не получает security fixes. а как же тогда само ядро?

Теперь угадайте почему на боте стоит именно эта версия?
http://php.net/releases/5_3_27.php

это был последний регулярный релиз! )
после него только security fixes один год
http://php.net/ChangeLog-5.php#5.3.27
выпущен был 11 Jul 2013
последний релиз 5.3.29 - http://php.net/releases/5_3_29.php
конец жизни ветки.

в свете последних DRUPAL-SA-CORE весело это)

было бы интересно узнать как остальные решают эту проблему на хостинге - какую версию php используете?

когда появится drupal 8 - будете выбирать разный хостинг для разных версий?
или смиритесь с тем, что 7 версия будет глючить?

Аватар пользователя andribas@drupal.org andribas@drupal.org 2 декабря 2014 в 23:20

но это не значит, что проблемы нет
вот xss на чистом друпал 7, php 5.5
да, он работает только на ie6, кажется)
но это только 1 ошибка - и она результат невыполнения теста.
получается, что php без проверки обновлять опасно, проверку за вас никто не делает, а это сильно сокращает время жизни сайта, точнее накладывает на него ограничения - или сидите на старом php, или делайте major upgrade.


Аватар пользователя andribas@drupal.org andribas@drupal.org 4 декабря 2014 в 16:43

Все-таки не удержался и задал неудобный вопрос)
https://www.drupal.org/requirements#comment-9402681

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

UPD:
security team member klausi сказал, что все нормально посоны https://www.drupal.org/node/2387055

Аватар пользователя andribas@drupal.org andribas@drupal.org 6 декабря 2014 в 17:47

Потратил 2 дня чтобы понять что не так с этой ошибкой и почему ее так долго не исправляют.

Вот эти строки из родословной друпала, откуда он вышел, лежат в /includes/commin.inc https://github.com/drupal/drupal/blob/8.0.x/core/lib/Drupal/Component/Ut...

История у kses такая:

The kses code is based on an HTML filter that Ulf wrote on his own back in 2002 for the open-source project Gnuheter ( http://savannah.nongnu.org/projects/ gnuheter ). Gnuheter is a fork from PHP-Nuke. The HTML filter has been improved a lot since then.

To stop people from having sleepless nights, we feel the urgent need to state that kses doesn't have anything to do with the KDE project, despite having a name that starts with a K.

In case someone was wondering, Ulf is available for kses-related consulting.

Finally, the name kses comes from the terms XSS and access. It's also a recursive acronym (every open-source project should have one!) for "kses strips evil scripts".

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

Чтобы понять, почему этот алгоритм неэффективен для php - в ядре php тоже производится синтаксический разбор всех сущностей, но также за один проход и если раньше они конвертировали все, то по новым стандартам это недопустимо - это parse error.

При этом эти символы нельзя (то есть очень не рекомендуется) удалять - http://unicode.org/reports/tr36/#Deletion_of_Noncharacters

чтобы решить проблему sanitize, google использует алгоритм написанный на С и портированный в python, чтобы было немного быстрее.
если посмотрите в код - https://github.com/google/gumbo-parser
то увидите, что там используется конечный автомат FSM
этот алгоритм портирован почти на все языки https://github.com/search?utf8=%E2%9C%93&q=gumbo-parser
в том числе и на PHP (не поддерживаемый). но для php его никто не использует, поскольку требуется компиляция расширения и его подключение.
на node.js порт тоже есть - https://github.com/karlwestin/node-gumbo-parser

при этом он не такой популярный как https://github.com/fb55/htmlparser2
но у того написано forgiving и он жействительно все прощает - поробуйте здесь написать атрибут с двойной и одинарной кавычкой http://demos.forbeslindesay.co.uk/htmlparser2/

есть бенчмарк для тестов с xss. очень легко убедиться

git clone git@github.com:AndreasMadsen/htmlparser-benchmark.git benchmark
cd benchmark
npm install
!>npm test

> htmlparser-benchmark@1.1.1 test /home/andribas/opensource/htmlparser-benchmark
> node execute.js

 
gumbo-parser   : 19.5836 ms/file ± 10.2761
 
high5          : 3.41322 ms/file ± 2.00341
 
html-parser    : 8.18504 ms/file ± 5.26704
 
html5          : 118.467 ms/file ± 154.883
 
htmlparser     : 19.6755 ms/file ± 124.388
 
htmlparser2-dom: 4.34360 ms/file ± 2.39088
 
htmlparser2    : 2.71104 ms/file ± 1.57778
 
hubbub         : 9.36008 ms/file ± 5.04074
 
libxmljs       : 4.14832 ms/file ± 4.81537
 
parse5         : 7.32204 ms/file ± 4.73539

есть вот такой комментарий https://github.com/google/gumbo-parser/issues/53#issuecomment-43395597

это относится к ошибке, которая воспроизводится на новом php, сначала хотел написать на drupal.org, но передумал

bug report - https://bugs.php.net/bug.php?id=52860
commit - https://github.com/php/php-src/commit/91727cb844ecfe55f6dcd2f13ffeec3962...

HTML 5 valid numeric entities for attributes, are http://www.w3.org/html/wg/drafts/html/master/syntax.html#text

если покопать, то там есть ссылки на много стандартов, плюс php team ссылается на стандарты html5.
я их собрал, и вроде бы все понятно, но когда посмотришь на FSM от google, то с трудом верится, что можно просто взять и портировать это на php - с расширением, которое нужно подгружать - использовать его никто не будет, а переписать весь код задача не из простых)
в node в этом плане модули проще собираются.

по этой причине все ноды сохраняются долго, формы обрабатываются, импортируются ленты и т.д. - все поля ссылок, описаний проходят sanitize, который очень медленный.

это такая штука, которую не закешируешь.

Аватар пользователя andribas@drupal.org andribas@drupal.org 12 декабря 2014 в 12:27

Судя по вот этому https://www.drupal.org/node/1333730
прилепят это - https://github.com/Masterminds/html5-php
по крайней мере патч почти готов.
альтернатива есть такая - https://github.com/symfony/DomCrawler
но гумбо https://github.com/google/gumbo-parser все равно лучше, потому что

Полная совместимость со спецификациями HTML5.
Устойчивость к некачественным входным данным.
Простые API, которые могут быть легко обработаны программами на других ЯП.
Поддержка исходных позиций и указателей в оригинальном коде, при навигации по дереву зависимостей.
Проходит все тесты html5lib-0.95.
Проверен на более чем 2,5 млрд страниц в индексе Google.

жаль, что он не на PHP.
без этих изменений html5 в друпал 8 будет глючить.