Update Composer, update everything
This commit is contained in:
parent
ea3e94409f
commit
dda5c284b6
19527 changed files with 1135420 additions and 351004 deletions
|
@ -1,6 +0,0 @@
|
|||
name: 'AAA Update test'
|
||||
type: module
|
||||
description: 'Support module for update module testing.'
|
||||
package: Testing
|
||||
version: VERSION
|
||||
core: 8.x
|
|
@ -0,0 +1,72 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<project xmlns:dc="http://purl.org/dc/elements/1.1/">
|
||||
<title>AAA Update test</title>
|
||||
<short_name>aaa_update_test</short_name>
|
||||
<dc:creator>Drupal</dc:creator>
|
||||
<api_version>8.x</api_version>
|
||||
<recommended_major>1</recommended_major>
|
||||
<supported_majors>1</supported_majors>
|
||||
<default_major>1</default_major>
|
||||
<project_status>published</project_status>
|
||||
<link>http://example.com/project/aaa_update_test</link>
|
||||
<terms>
|
||||
<term><name>Projects</name><value>Modules</value></term>
|
||||
</terms>
|
||||
<releases>
|
||||
<release>
|
||||
<name>aaa_update_test 8.x-1.2</name>
|
||||
<version>8.x-1.2</version>
|
||||
<tag>DRUPAL-8--1-2</tag>
|
||||
<version_major>1</version_major>
|
||||
<version_patch>2</version_patch>
|
||||
<status>published</status>
|
||||
<release_link>http://example.com/aaa_update_test-8-x-1-2-release</release_link>
|
||||
<download_link>http://example.com/aaa_update_test-8-x-1-2.tar.gz</download_link>
|
||||
<date>1250424521</date>
|
||||
<mdhash>b966255555d9c9b86d480ca08cfaa98e</mdhash>
|
||||
<filesize>1073741824</filesize>
|
||||
<terms>
|
||||
<term><name>Release type</name><value>New features</value></term>
|
||||
<term><name>Release type</name><value>Bug fixes</value></term>
|
||||
<term><name>Release type</name><value>Security update</value></term>
|
||||
</terms>
|
||||
</release>
|
||||
<release>
|
||||
<name>aaa_update_test 8.x-1.1</name>
|
||||
<version>8.x-1.1</version>
|
||||
<tag>DRUPAL-8--1-1</tag>
|
||||
<version_major>1</version_major>
|
||||
<version_patch>1</version_patch>
|
||||
<status>published</status>
|
||||
<release_link>http://example.com/aaa_update_test-8-x-1-1-release</release_link>
|
||||
<download_link>http://example.com/aaa_update_test-8-x-1-1.tar.gz</download_link>
|
||||
<date>1250424521</date>
|
||||
<mdhash>b966255555d9c9b86d480ca08cfaa98e</mdhash>
|
||||
<filesize>1073741824</filesize>
|
||||
<terms>
|
||||
<term><name>Release type</name><value>New features</value></term>
|
||||
<term><name>Release type</name><value>Bug fixes</value></term>
|
||||
<term><name>Release type</name><value>Security update</value></term>
|
||||
<term><name>Release type</name><value>Insecure</value></term>
|
||||
</terms>
|
||||
</release>
|
||||
<release>
|
||||
<name>aaa_update_test 8.x-1.0</name>
|
||||
<version>8.x-1.0</version>
|
||||
<tag>DRUPAL-8--1-0</tag>
|
||||
<version_major>1</version_major>
|
||||
<version_patch>0</version_patch>
|
||||
<status>published</status>
|
||||
<release_link>http://example.com/aaa_update_test-8-x-1-0-release</release_link>
|
||||
<download_link>http://example.com/aaa_update_test-8-x-1-0.tar.gz</download_link>
|
||||
<date>1250424521</date>
|
||||
<mdhash>b966255555d9c9b86d480ca08cfaa98e</mdhash>
|
||||
<filesize>1073741824</filesize>
|
||||
<terms>
|
||||
<term><name>Release type</name><value>New features</value></term>
|
||||
<term><name>Release type</name><value>Bug fixes</value></term>
|
||||
<term><name>Release type</name><value>Insecure</value></term>
|
||||
</terms>
|
||||
</release>
|
||||
</releases>
|
||||
</project>
|
|
@ -0,0 +1,71 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<project xmlns:dc="http://purl.org/dc/elements/1.1/">
|
||||
<title>AAA Update test</title>
|
||||
<short_name>aaa_update_test</short_name>
|
||||
<dc:creator>Drupal</dc:creator>
|
||||
<api_version>8.x</api_version>
|
||||
<recommended_major>1</recommended_major>
|
||||
<supported_majors>1</supported_majors>
|
||||
<default_major>1</default_major>
|
||||
<project_status>published</project_status>
|
||||
<link>http://example.com/project/aaa_update_test</link>
|
||||
<terms>
|
||||
<term><name>Projects</name><value>Modules</value></term>
|
||||
</terms>
|
||||
<releases>
|
||||
<release>
|
||||
<name>aaa_update_test 8.x-1.2</name>
|
||||
<version>8.x-1.2</version>
|
||||
<tag>DRUPAL-8--1-2</tag>
|
||||
<version_major>1</version_major>
|
||||
<version_patch>2</version_patch>
|
||||
<status>published</status>
|
||||
<release_link>http://example.com/aaa_update_test-8-x-1-2-release</release_link>
|
||||
<download_link>http://example.com/aaa_update_test-8-x-1-2.tar.gz</download_link>
|
||||
<date>1250424521</date>
|
||||
<mdhash>b966255555d9c9b86d480ca08cfaa98e</mdhash>
|
||||
<filesize>1073741824</filesize>
|
||||
<terms>
|
||||
<term><name>Release type</name><value>New features</value></term>
|
||||
<term><name>Release type</name><value>Bug fixes</value></term>
|
||||
<term><name>Release type</name><value>Security update</value></term>
|
||||
</terms>
|
||||
</release>
|
||||
<release>
|
||||
<name>aaa_update_test 8.x-1.1</name>
|
||||
<version>8.x-1.1</version>
|
||||
<tag>DRUPAL-8--1-1</tag>
|
||||
<version_major>1</version_major>
|
||||
<version_patch>1</version_patch>
|
||||
<status>published</status>
|
||||
<release_link>http://example.com/aaa_update_test-8-x-1-1-release</release_link>
|
||||
<download_link>http://example.com/aaa_update_test-8-x-1-1.tar.gz</download_link>
|
||||
<date>1250424521</date>
|
||||
<mdhash>b966255555d9c9b86d480ca08cfaa98e</mdhash>
|
||||
<filesize>1073741824</filesize>
|
||||
<terms>
|
||||
<term><name>Release type</name><value>New features</value></term>
|
||||
<term><name>Release type</name><value>Bug fixes</value></term>
|
||||
<term><name>Release type</name><value>Insecure</value></term>
|
||||
</terms>
|
||||
</release>
|
||||
<release>
|
||||
<name>aaa_update_test 8.x-1.0</name>
|
||||
<version>8.x-1.0</version>
|
||||
<tag>DRUPAL-8--1-0</tag>
|
||||
<version_major>1</version_major>
|
||||
<version_patch>0</version_patch>
|
||||
<status>published</status>
|
||||
<release_link>http://example.com/aaa_update_test-8-x-1-0-release</release_link>
|
||||
<download_link>http://example.com/aaa_update_test-8-x-1-0.tar.gz</download_link>
|
||||
<date>1250424521</date>
|
||||
<mdhash>b966255555d9c9b86d480ca08cfaa98e</mdhash>
|
||||
<filesize>1073741824</filesize>
|
||||
<terms>
|
||||
<term><name>Release type</name><value>New features</value></term>
|
||||
<term><name>Release type</name><value>Bug fixes</value></term>
|
||||
<term><name>Release type</name><value>Insecure</value></term>
|
||||
</terms>
|
||||
</release>
|
||||
</releases>
|
||||
</project>
|
|
@ -0,0 +1,169 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<project xmlns:dc="http://purl.org/dc/elements/1.1/">
|
||||
<title>AAA Update test</title>
|
||||
<short_name>aaa_update_test</short_name>
|
||||
<dc:creator>Drupal</dc:creator>
|
||||
<api_version>8.x</api_version>
|
||||
<recommended_major>2</recommended_major>
|
||||
<supported_majors>1,2</supported_majors>
|
||||
<default_major>2</default_major>
|
||||
<project_status>published</project_status>
|
||||
<link>http://example.com/project/aaa_update_test</link>
|
||||
<terms>
|
||||
<term><name>Projects</name><value>Modules</value></term>
|
||||
</terms>
|
||||
<releases>
|
||||
<release>
|
||||
<name>aaa_update_test 8.x-3.0-beta2</name>
|
||||
<version>8.x-3.0-beta2</version>
|
||||
<tag>8.x-3.0-beta2</tag>
|
||||
<version_major>3</version_major>
|
||||
<version_patch>0</version_patch>
|
||||
<version_extra>beta2</version_extra>
|
||||
<status>published</status>
|
||||
<release_link>http://example.com/aaa_update_test-8-x-3-0-beta2-release</release_link>
|
||||
<download_link>http://example.com/aaa_update_test-8-x-3-0-beta2.tar.gz</download_link>
|
||||
<date>1533298080</date>
|
||||
<mdhash>2387284145e34a19fc45e03c258a2831</mdhash>
|
||||
<filesize>16209911</filesize>
|
||||
<terms>
|
||||
<term><name>Release type</name><value>Bug fixes</value></term>
|
||||
<term><name>Release type</name><value>New features</value></term>
|
||||
</terms>
|
||||
<security>
|
||||
Beta releases are not covered by Drupal security advisories.
|
||||
</security>
|
||||
</release>
|
||||
<release>
|
||||
<name>aaa_update_test 8.x-3.0-beta1</name>
|
||||
<version>8.x-3.0-beta1</version>
|
||||
<tag>8.x-3.0-beta1</tag>
|
||||
<version_major>3</version_major>
|
||||
<version_patch>0</version_patch>
|
||||
<version_extra>beta1</version_extra>
|
||||
<status>published</status>
|
||||
<release_link>http://example.com/aaa_update_test-8-x-3-0-beta1</release_link>
|
||||
<download_link>http://example.com/aaa_update_test--8-x-3-0-beta1.tar.gz</download_link>
|
||||
<date>1533270485</date>
|
||||
<mdhash>3d70ae568dd8f7100082b8c58bc8d1fe</mdhash>
|
||||
<filesize>16209123</filesize>
|
||||
<terms>
|
||||
<term><name>Release type</name><value>Insecure</value></term>
|
||||
<term><name>Release type</name><value>Bug fixes</value></term>
|
||||
<term><name>Release type</name><value>New features</value></term>
|
||||
</terms>
|
||||
<security>
|
||||
Beta releases are not covered by Drupal security advisories.
|
||||
</security>
|
||||
</release>
|
||||
<release>
|
||||
<name>aaa_update_test 8.x-2.2</name>
|
||||
<version>8.x-2.2</version>
|
||||
<tag>DRUPAL-8--2-2</tag>
|
||||
<version_major>2</version_major>
|
||||
<version_patch>2</version_patch>
|
||||
<status>published</status>
|
||||
<release_link>http://example.com/aaa_update_test-8-x-2-2-release</release_link>
|
||||
<download_link>http://example.com/aaa_update_test-8-x-2-2.tar.gz</download_link>
|
||||
<date>1250424521</date>
|
||||
<mdhash>b966255555d9c9b86d480ca08cfaa98e</mdhash>
|
||||
<filesize>1073741824</filesize>
|
||||
<terms>
|
||||
<term><name>Release type</name><value>New features</value></term>
|
||||
<term><name>Release type</name><value>Bug fixes</value></term>
|
||||
<term><name>Release type</name><value>Security update</value></term>
|
||||
</terms>
|
||||
</release>
|
||||
<release>
|
||||
<name>aaa_update_test 8.x-2.1</name>
|
||||
<version>8.x-2.1</version>
|
||||
<tag>DRUPAL-8--2-1</tag>
|
||||
<version_major>2</version_major>
|
||||
<version_patch>1</version_patch>
|
||||
<status>published</status>
|
||||
<release_link>http://example.com/aaa_update_test-8-x-2-1-release</release_link>
|
||||
<download_link>http://example.com/aaa_update_test-8-x-2-1.tar.gz</download_link>
|
||||
<date>1250424521</date>
|
||||
<mdhash>b966255555d9c9b86d480ca08cfaa98e</mdhash>
|
||||
<filesize>1073741824</filesize>
|
||||
<terms>
|
||||
<term><name>Release type</name><value>New features</value></term>
|
||||
<term><name>Release type</name><value>Bug fixes</value></term>
|
||||
<term><name>Release type</name><value>Security update</value></term>
|
||||
<term><name>Release type</name><value>Insecure</value></term>
|
||||
</terms>
|
||||
</release>
|
||||
<release>
|
||||
<name>aaa_update_test 8.x-2.0</name>
|
||||
<version>8.x-2.0</version>
|
||||
<tag>DRUPAL-8--2-0</tag>
|
||||
<version_major>2</version_major>
|
||||
<version_patch>0</version_patch>
|
||||
<status>published</status>
|
||||
<release_link>http://example.com/aaa_update_test-8-x-2-0-release</release_link>
|
||||
<download_link>http://example.com/aaa_update_test-8-x-2-0.tar.gz</download_link>
|
||||
<date>1250424521</date>
|
||||
<mdhash>b966255555d9c9b86d480ca08cfaa98e</mdhash>
|
||||
<filesize>1073741824</filesize>
|
||||
<terms>
|
||||
<term><name>Release type</name><value>New features</value></term>
|
||||
<term><name>Release type</name><value>Bug fixes</value></term>
|
||||
<term><name>Release type</name><value>Insecure</value></term>
|
||||
</terms>
|
||||
</release>
|
||||
<release>
|
||||
<name>aaa_update_test 8.x-1.2</name>
|
||||
<version>8.x-1.2</version>
|
||||
<tag>DRUPAL-8--1-2</tag>
|
||||
<version_major>1</version_major>
|
||||
<version_patch>2</version_patch>
|
||||
<status>published</status>
|
||||
<release_link>http://example.com/aaa_update_test-8-x-1-2-release</release_link>
|
||||
<download_link>http://example.com/aaa_update_test-8-x-1-2.tar.gz</download_link>
|
||||
<date>1250424521</date>
|
||||
<mdhash>b966255555d9c9b86d480ca08cfaa98e</mdhash>
|
||||
<filesize>1073741824</filesize>
|
||||
<terms>
|
||||
<term><name>Release type</name><value>New features</value></term>
|
||||
<term><name>Release type</name><value>Bug fixes</value></term>
|
||||
<term><name>Release type</name><value>Security update</value></term>
|
||||
</terms>
|
||||
</release>
|
||||
<release>
|
||||
<name>aaa_update_test 8.x-1.1</name>
|
||||
<version>8.x-1.1</version>
|
||||
<tag>DRUPAL-8--1-1</tag>
|
||||
<version_major>1</version_major>
|
||||
<version_patch>1</version_patch>
|
||||
<status>published</status>
|
||||
<release_link>http://example.com/aaa_update_test-8-x-1-1-release</release_link>
|
||||
<download_link>http://example.com/aaa_update_test-8-x-1-1.tar.gz</download_link>
|
||||
<date>1250424521</date>
|
||||
<mdhash>b966255555d9c9b86d480ca08cfaa98e</mdhash>
|
||||
<filesize>1073741824</filesize>
|
||||
<terms>
|
||||
<term><name>Release type</name><value>New features</value></term>
|
||||
<term><name>Release type</name><value>Bug fixes</value></term>
|
||||
<term><name>Release type</name><value>Insecure</value></term>
|
||||
</terms>
|
||||
</release>
|
||||
<release>
|
||||
<name>aaa_update_test 8.x-1.0</name>
|
||||
<version>8.x-1.0</version>
|
||||
<tag>DRUPAL-8--1-0</tag>
|
||||
<version_major>1</version_major>
|
||||
<version_patch>0</version_patch>
|
||||
<status>published</status>
|
||||
<release_link>http://example.com/aaa_update_test-8-x-1-0-release</release_link>
|
||||
<download_link>http://example.com/aaa_update_test-8-x-1-0.tar.gz</download_link>
|
||||
<date>1250424521</date>
|
||||
<mdhash>b966255555d9c9b86d480ca08cfaa98e</mdhash>
|
||||
<filesize>1073741824</filesize>
|
||||
<terms>
|
||||
<term><name>Release type</name><value>New features</value></term>
|
||||
<term><name>Release type</name><value>Bug fixes</value></term>
|
||||
<term><name>Release type</name><value>Insecure</value></term>
|
||||
</terms>
|
||||
</release>
|
||||
</releases>
|
||||
</project>
|
|
@ -0,0 +1,123 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<project xmlns:dc="http://purl.org/dc/elements/1.1/">
|
||||
<title>AAA Update test</title>
|
||||
<short_name>aaa_update_test</short_name>
|
||||
<dc:creator>Drupal</dc:creator>
|
||||
<api_version>8.x</api_version>
|
||||
<recommended_major>2</recommended_major>
|
||||
<supported_majors>1,2</supported_majors>
|
||||
<default_major>2</default_major>
|
||||
<project_status>published</project_status>
|
||||
<link>http://example.com/project/aaa_update_test</link>
|
||||
<terms>
|
||||
<term><name>Projects</name><value>Modules</value></term>
|
||||
</terms>
|
||||
<releases>
|
||||
<release>
|
||||
<name>aaa_update_test 8.x-2.2</name>
|
||||
<version>8.x-2.2</version>
|
||||
<tag>DRUPAL-8--2-2</tag>
|
||||
<version_major>2</version_major>
|
||||
<version_patch>2</version_patch>
|
||||
<status>published</status>
|
||||
<release_link>http://example.com/aaa_update_test-8-x-2-2-release</release_link>
|
||||
<download_link>http://example.com/aaa_update_test-8-x-2-2.tar.gz</download_link>
|
||||
<date>1250424521</date>
|
||||
<mdhash>b966255555d9c9b86d480ca08cfaa98e</mdhash>
|
||||
<filesize>1073741824</filesize>
|
||||
<terms>
|
||||
<term><name>Release type</name><value>New features</value></term>
|
||||
<term><name>Release type</name><value>Bug fixes</value></term>
|
||||
<term><name>Release type</name><value>Security update</value></term>
|
||||
</terms>
|
||||
</release>
|
||||
<release>
|
||||
<name>aaa_update_test 8.x-2.1</name>
|
||||
<version>8.x-2.1</version>
|
||||
<tag>DRUPAL-8--2-1</tag>
|
||||
<version_major>2</version_major>
|
||||
<version_patch>1</version_patch>
|
||||
<status>published</status>
|
||||
<release_link>http://example.com/aaa_update_test-8-x-2-1-release</release_link>
|
||||
<download_link>http://example.com/aaa_update_test-8-x-2-1.tar.gz</download_link>
|
||||
<date>1250424521</date>
|
||||
<mdhash>b966255555d9c9b86d480ca08cfaa98e</mdhash>
|
||||
<filesize>1073741824</filesize>
|
||||
<terms>
|
||||
<term><name>Release type</name><value>New features</value></term>
|
||||
<term><name>Release type</name><value>Bug fixes</value></term>
|
||||
<term><name>Release type</name><value>Security update</value></term>
|
||||
<term><name>Release type</name><value>Insecure</value></term>
|
||||
</terms>
|
||||
</release>
|
||||
<release>
|
||||
<name>aaa_update_test 8.x-2.0</name>
|
||||
<version>8.x-2.0</version>
|
||||
<tag>DRUPAL-8--2-0</tag>
|
||||
<version_major>2</version_major>
|
||||
<version_patch>0</version_patch>
|
||||
<status>published</status>
|
||||
<release_link>http://example.com/aaa_update_test-8-x-2-0-release</release_link>
|
||||
<download_link>http://example.com/aaa_update_test-8-x-2-0.tar.gz</download_link>
|
||||
<date>1250424521</date>
|
||||
<mdhash>b966255555d9c9b86d480ca08cfaa98e</mdhash>
|
||||
<filesize>1073741824</filesize>
|
||||
<terms>
|
||||
<term><name>Release type</name><value>New features</value></term>
|
||||
<term><name>Release type</name><value>Bug fixes</value></term>
|
||||
<term><name>Release type</name><value>Insecure</value></term>
|
||||
</terms>
|
||||
</release>
|
||||
<release>
|
||||
<name>aaa_update_test 8.x-1.2</name>
|
||||
<version>8.x-1.2</version>
|
||||
<tag>DRUPAL-8--1-2</tag>
|
||||
<version_major>1</version_major>
|
||||
<version_patch>2</version_patch>
|
||||
<status>published</status>
|
||||
<release_link>http://example.com/aaa_update_test-8-x-1-2-release</release_link>
|
||||
<download_link>http://example.com/aaa_update_test-8-x-1-2.tar.gz</download_link>
|
||||
<date>1250424521</date>
|
||||
<mdhash>b966255555d9c9b86d480ca08cfaa98e</mdhash>
|
||||
<filesize>1073741824</filesize>
|
||||
<terms>
|
||||
<term><name>Release type</name><value>New features</value></term>
|
||||
<term><name>Release type</name><value>Bug fixes</value></term>
|
||||
</terms>
|
||||
</release>
|
||||
<release>
|
||||
<name>aaa_update_test 8.x-1.1</name>
|
||||
<version>8.x-1.1</version>
|
||||
<tag>DRUPAL-8--1-1</tag>
|
||||
<version_major>1</version_major>
|
||||
<version_patch>1</version_patch>
|
||||
<status>published</status>
|
||||
<release_link>http://example.com/aaa_update_test-8-x-1-1-release</release_link>
|
||||
<download_link>http://example.com/aaa_update_test-8-x-1-1.tar.gz</download_link>
|
||||
<date>1250424521</date>
|
||||
<mdhash>b966255555d9c9b86d480ca08cfaa98e</mdhash>
|
||||
<filesize>1073741824</filesize>
|
||||
<terms>
|
||||
<term><name>Release type</name><value>New features</value></term>
|
||||
<term><name>Release type</name><value>Bug fixes</value></term>
|
||||
</terms>
|
||||
</release>
|
||||
<release>
|
||||
<name>aaa_update_test 8.x-1.0</name>
|
||||
<version>8.x-1.0</version>
|
||||
<tag>DRUPAL-8--1-0</tag>
|
||||
<version_major>1</version_major>
|
||||
<version_patch>0</version_patch>
|
||||
<status>published</status>
|
||||
<release_link>http://example.com/aaa_update_test-8-x-1-0-release</release_link>
|
||||
<download_link>http://example.com/aaa_update_test-8-x-1-0.tar.gz</download_link>
|
||||
<date>1250424521</date>
|
||||
<mdhash>b966255555d9c9b86d480ca08cfaa98e</mdhash>
|
||||
<filesize>1073741824</filesize>
|
||||
<terms>
|
||||
<term><name>Release type</name><value>New features</value></term>
|
||||
<term><name>Release type</name><value>Bug fixes</value></term>
|
||||
</terms>
|
||||
</release>
|
||||
</releases>
|
||||
</project>
|
|
@ -14,15 +14,15 @@
|
|||
</terms>
|
||||
<releases>
|
||||
<release>
|
||||
<name>Drupal 8.1.2</name>
|
||||
<version>8.1.2</version>
|
||||
<tag>DRUPAL-8-1-2</tag>
|
||||
<name>Drupal 8.0.2</name>
|
||||
<version>8.0.2</version>
|
||||
<tag>DRUPAL-8-0-2</tag>
|
||||
<version_major>8</version_major>
|
||||
<version_minor>1</version_minor>
|
||||
<version_minor>0</version_minor>
|
||||
<version_patch>2</version_patch>
|
||||
<status>published</status>
|
||||
<release_link>http://example.com/drupal-8-1-2-release</release_link>
|
||||
<download_link>http://example.com/drupal-8-1-2.tar.gz</download_link>
|
||||
<release_link>http://example.com/drupal-8-0-2-release</release_link>
|
||||
<download_link>http://example.com/drupal-8-0-2.tar.gz</download_link>
|
||||
<date>1250424641</date>
|
||||
<mdhash>b966255555d9c9b86d480ca08cfaa98e</mdhash>
|
||||
<filesize>4294967296</filesize>
|
||||
|
@ -33,39 +33,42 @@
|
|||
</terms>
|
||||
</release>
|
||||
<release>
|
||||
<name>Drupal 8.1.1</name>
|
||||
<version>8.1.1</version>
|
||||
<tag>DRUPAL-8-1-1</tag>
|
||||
<name>Drupal 8.0.1</name>
|
||||
<version>8.0.1</version>
|
||||
<tag>DRUPAL-8-0-1</tag>
|
||||
<version_major>8</version_major>
|
||||
<version_minor>1</version_minor>
|
||||
<version_minor>0</version_minor>
|
||||
<version_patch>1</version_patch>
|
||||
<status>published</status>
|
||||
<release_link>http://example.com/drupal-8-1-1-release</release_link>
|
||||
<download_link>http://example.com/drupal-8-1-1.tar.gz</download_link>
|
||||
<release_link>http://example.com/drupal-8-0-1-release</release_link>
|
||||
<download_link>http://example.com/drupal-8-0-1.tar.gz</download_link>
|
||||
<date>1250424581</date>
|
||||
<mdhash>b966255555d9c9b86d480ca08cfaa98e</mdhash>
|
||||
<filesize>2147483648</filesize>
|
||||
<terms>
|
||||
<term><name>Release type</name><value>New features</value></term>
|
||||
<term><name>Release type</name><value>Bug fixes</value></term>
|
||||
<term><name>Release type</name><value>Security update</value></term>
|
||||
<term><name>Release type</name><value>Insecure</value></term>
|
||||
</terms>
|
||||
</release>
|
||||
<release>
|
||||
<name>Drupal 8.1.0</name>
|
||||
<version>8.1.0</version>
|
||||
<tag>DRUPAL-8-1-0</tag>
|
||||
<name>Drupal 8.0.0</name>
|
||||
<version>8.0.0</version>
|
||||
<tag>DRUPAL-8-0-0</tag>
|
||||
<version_major>8</version_major>
|
||||
<version_minor>1</version_minor>
|
||||
<version_minor>0</version_minor>
|
||||
<version_patch>0</version_patch>
|
||||
<status>published</status>
|
||||
<release_link>http://example.com/drupal-8-1-0-release</release_link>
|
||||
<download_link>http://example.com/drupal-8-1-0.tar.gz</download_link>
|
||||
<release_link>http://example.com/drupal-8-0-0-release</release_link>
|
||||
<download_link>http://example.com/drupal-8-0-0.tar.gz</download_link>
|
||||
<date>1250424521</date>
|
||||
<mdhash>b966255555d9c9b86d480ca08cfaa98e</mdhash>
|
||||
<filesize>1073741824</filesize>
|
||||
<terms>
|
||||
<term><name>Release type</name><value>New features</value></term>
|
||||
<term><name>Release type</name><value>Bug fixes</value></term>
|
||||
<term><name>Release type</name><value>Insecure</value></term>
|
||||
</terms>
|
||||
</release>
|
||||
</releases>
|
|
@ -0,0 +1,263 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<project xmlns:dc="http://purl.org/dc/elements/1.1/">
|
||||
<title>Drupal</title>
|
||||
<short_name>drupal</short_name>
|
||||
<dc:creator>Drupal</dc:creator>
|
||||
<api_version>8.x</api_version>
|
||||
<recommended_major>8</recommended_major>
|
||||
<supported_majors>8</supported_majors>
|
||||
<default_major>8</default_major>
|
||||
<project_status>published</project_status>
|
||||
<link>http://example.com/project/drupal</link>
|
||||
<terms>
|
||||
<term><name>Projects</name><value>Drupal project</value></term>
|
||||
</terms>
|
||||
<releases>
|
||||
<release>
|
||||
<name>drupal 8.2.0-rc2</name>
|
||||
<version>8.2.0-rc2</version>
|
||||
<tag>8.2.0-rc2</tag>
|
||||
<version_major>8</version_major>
|
||||
<version_minor>2</version_minor>
|
||||
<version_patch>0</version_patch>
|
||||
<version_extra>rc2</version_extra>
|
||||
<status>published</status>
|
||||
<release_link>http://example.com/drupal-8-2-0-rc2-release</release_link>
|
||||
<download_link>http://example.com/drupal-8-2-0-rc2.tar.gz</download_link>
|
||||
<date>1533298080</date>
|
||||
<mdhash>2387284145e34a19fc45e03c258a2831</mdhash>
|
||||
<filesize>16209911</filesize>
|
||||
<terms>
|
||||
<term><name>Release type</name><value>Bug fixes</value></term>
|
||||
<term><name>Release type</name><value>New features</value></term>
|
||||
</terms>
|
||||
<security>
|
||||
RC releases are not covered by Drupal security advisories.
|
||||
</security>
|
||||
</release>
|
||||
<release>
|
||||
<name>drupal 8.2.0-rc1</name>
|
||||
<version>8.2.0-rc1</version>
|
||||
<tag>8.2.0-rc1</tag>
|
||||
<version_major>8</version_major>
|
||||
<version_minor>2</version_minor>
|
||||
<version_patch>0</version_patch>
|
||||
<version_extra>rc1</version_extra>
|
||||
<status>published</status>
|
||||
<release_link>http://example.com/drupal-8-2-0-rc1-release</release_link>
|
||||
<download_link>http://example.com/drupal-8-2-0-rc1.tar.gz</download_link>
|
||||
<date>1533270485</date>
|
||||
<mdhash>3d70ae568dd8f7100082b8c58bc8d1fe</mdhash>
|
||||
<filesize>16209123</filesize>
|
||||
<terms>
|
||||
<term><name>Release type</name><value>Bug fixes</value></term>
|
||||
<term><name>Release type</name><value>New features</value></term>
|
||||
</terms>
|
||||
<security>
|
||||
RC releases are not covered by Drupal security advisories.
|
||||
</security>
|
||||
</release>
|
||||
<release>
|
||||
<name>drupal 8.2.0-beta2</name>
|
||||
<version>8.2.0-beta2</version>
|
||||
<tag>8.2.0-beta2</tag>
|
||||
<version_major>8</version_major>
|
||||
<version_minor>2</version_minor>
|
||||
<version_patch>0</version_patch>
|
||||
<version_extra>beta2</version_extra>
|
||||
<status>published</status>
|
||||
<release_link>http://example.com/drupal-8-2-0-beta2-release</release_link>
|
||||
<download_link>http://example.com/drupal-8-2-0-beta2.tar.gz</download_link>
|
||||
<date>1533298080</date>
|
||||
<mdhash>2387284145e34a19fc45e03c258a2831</mdhash>
|
||||
<filesize>16209911</filesize>
|
||||
<terms>
|
||||
<term><name>Release type</name><value>Bug fixes</value></term>
|
||||
<term><name>Release type</name><value>New features</value></term>
|
||||
</terms>
|
||||
<security>
|
||||
Beta releases are not covered by Drupal security advisories.
|
||||
</security>
|
||||
</release>
|
||||
<release>
|
||||
<name>drupal 8.2.0-beta1</name>
|
||||
<version>8.2.0-beta1</version>
|
||||
<tag>8.2.0-beta1</tag>
|
||||
<version_major>8</version_major>
|
||||
<version_minor>2</version_minor>
|
||||
<version_patch>0</version_patch>
|
||||
<version_extra>beta1</version_extra>
|
||||
<status>published</status>
|
||||
<release_link>http://example.com/drupal-8-2-0-beta1-release</release_link>
|
||||
<download_link>http://example.com/drupal-8-2-0-beta1.tar.gz</download_link>
|
||||
<date>1533270485</date>
|
||||
<mdhash>3d70ae568dd8f7100082b8c58bc8d1fe</mdhash>
|
||||
<filesize>16209123</filesize>
|
||||
<terms>
|
||||
<term><name>Release type</name><value>Bug fixes</value></term>
|
||||
<term><name>Release type</name><value>New features</value></term>
|
||||
</terms>
|
||||
<security>
|
||||
Beta releases are not covered by Drupal security advisories.
|
||||
</security>
|
||||
</release>
|
||||
<release>
|
||||
<name>drupal 8.2.0-alpha2</name>
|
||||
<version>8.2.0-alpha2</version>
|
||||
<tag>8.2.0-alpha2</tag>
|
||||
<version_major>8</version_major>
|
||||
<version_minor>2</version_minor>
|
||||
<version_patch>0</version_patch>
|
||||
<version_extra>alpha2</version_extra>
|
||||
<status>published</status>
|
||||
<release_link>http://example.com/drupal-8-2-0-alpha2-release</release_link>
|
||||
<download_link>http://example.com/drupal-8-2-0-alpha2.tar.gz</download_link>
|
||||
<date>1533298080</date>
|
||||
<mdhash>2387284145e34a19fc45e03c258a2831</mdhash>
|
||||
<filesize>16209911</filesize>
|
||||
<terms>
|
||||
<term><name>Release type</name><value>Bug fixes</value></term>
|
||||
<term><name>Release type</name><value>New features</value></term>
|
||||
</terms>
|
||||
<security>
|
||||
Alpha releases are not covered by Drupal security advisories.
|
||||
</security>
|
||||
</release>
|
||||
<release>
|
||||
<name>drupal 8.2.0-alpha1</name>
|
||||
<version>8.2.0-alpha1</version>
|
||||
<tag>8.2.0-alpha1</tag>
|
||||
<version_major>8</version_major>
|
||||
<version_minor>2</version_minor>
|
||||
<version_patch>0</version_patch>
|
||||
<version_extra>alpha1</version_extra>
|
||||
<status>published</status>
|
||||
<release_link>http://example.com/drupal-8.2.0-alpha1</release_link>
|
||||
<download_link>http://example.com/drupal-8-2-0-alpha1.tar.gz</download_link>
|
||||
<date>1533270485</date>
|
||||
<mdhash>3d70ae568dd8f7100082b8c58bc8d1fe</mdhash>
|
||||
<filesize>16209123</filesize>
|
||||
<terms>
|
||||
<term><name>Release type</name><value>Bug fixes</value></term>
|
||||
<term><name>Release type</name><value>New features</value></term>
|
||||
</terms>
|
||||
<security>
|
||||
Alpha releases are not covered by Drupal security advisories.
|
||||
</security>
|
||||
</release>
|
||||
<release>
|
||||
<name>Drupal 8.1.2</name>
|
||||
<version>8.1.2</version>
|
||||
<tag>DRUPAL-8-1-2</tag>
|
||||
<version_major>8</version_major>
|
||||
<version_minor>1</version_minor>
|
||||
<version_patch>2</version_patch>
|
||||
<status>published</status>
|
||||
<release_link>http://example.com/drupal-8-1-2-release</release_link>
|
||||
<download_link>http://example.com/drupal-8-1-2.tar.gz</download_link>
|
||||
<date>1250424526</date>
|
||||
<mdhash>b966255555d9c9b86d480ca08cfaa98e</mdhash>
|
||||
<filesize>4294967296</filesize>
|
||||
<terms>
|
||||
<term><name>Release type</name><value>New features</value></term>
|
||||
<term><name>Release type</name><value>Bug fixes</value></term>
|
||||
<term><name>Release type</name><value>Security update</value></term>
|
||||
</terms>
|
||||
</release>
|
||||
<release>
|
||||
<name>Drupal 8.1.1</name>
|
||||
<version>8.1.1</version>
|
||||
<tag>DRUPAL-8-1-1</tag>
|
||||
<version_major>8</version_major>
|
||||
<version_minor>1</version_minor>
|
||||
<version_patch>1</version_patch>
|
||||
<status>published</status>
|
||||
<release_link>http://example.com/drupal-8-1-1-release</release_link>
|
||||
<download_link>http://example.com/drupal-8-1-1.tar.gz</download_link>
|
||||
<date>1250424525</date>
|
||||
<mdhash>b966255555d9c9b86d480ca08cfaa98e</mdhash>
|
||||
<filesize>2147483648</filesize>
|
||||
<terms>
|
||||
<term><name>Release type</name><value>New features</value></term>
|
||||
<term><name>Release type</name><value>Bug fixes</value></term>
|
||||
<term><name>Release type</name><value>Insecure</value></term>
|
||||
</terms>
|
||||
</release>
|
||||
<release>
|
||||
<name>Drupal 8.1.0</name>
|
||||
<version>8.1.0</version>
|
||||
<tag>DRUPAL-8-1-0</tag>
|
||||
<version_major>8</version_major>
|
||||
<version_minor>1</version_minor>
|
||||
<version_patch>0</version_patch>
|
||||
<status>published</status>
|
||||
<release_link>http://example.com/drupal-8-1-0-release</release_link>
|
||||
<download_link>http://example.com/drupal-8-1-0.tar.gz</download_link>
|
||||
<date>1250424524</date>
|
||||
<mdhash>b966255555d9c9b86d480ca08cfaa98e</mdhash>
|
||||
<filesize>1073741824</filesize>
|
||||
<terms>
|
||||
<term><name>Release type</name><value>New features</value></term>
|
||||
<term><name>Release type</name><value>Bug fixes</value></term>
|
||||
<term><name>Release type</name><value>Insecure</value></term>
|
||||
</terms>
|
||||
</release>
|
||||
<release>
|
||||
<name>Drupal 8.0.2</name>
|
||||
<version>8.0.2</version>
|
||||
<tag>DRUPAL-8-0-2</tag>
|
||||
<version_major>8</version_major>
|
||||
<version_minor>0</version_minor>
|
||||
<version_patch>2</version_patch>
|
||||
<status>published</status>
|
||||
<release_link>http://example.com/drupal-8-0-2-release</release_link>
|
||||
<download_link>http://example.com/drupal-8-0-2.tar.gz</download_link>
|
||||
<date>1250424523</date>
|
||||
<mdhash>b966255555d9c9b86d480ca08cfaa98e</mdhash>
|
||||
<filesize>4294967296</filesize>
|
||||
<terms>
|
||||
<term><name>Release type</name><value>New features</value></term>
|
||||
<term><name>Release type</name><value>Bug fixes</value></term>
|
||||
<term><name>Release type</name><value>Security update</value></term>
|
||||
</terms>
|
||||
</release>
|
||||
<release>
|
||||
<name>Drupal 8.0.1</name>
|
||||
<version>8.0.1</version>
|
||||
<tag>DRUPAL-8-0-1</tag>
|
||||
<version_major>8</version_major>
|
||||
<version_minor>0</version_minor>
|
||||
<version_patch>1</version_patch>
|
||||
<status>published</status>
|
||||
<release_link>http://example.com/drupal-8-0-1-release</release_link>
|
||||
<download_link>http://example.com/drupal-8-0-1.tar.gz</download_link>
|
||||
<date>1250424522</date>
|
||||
<mdhash>b966255555d9c9b86d480ca08cfaa98e</mdhash>
|
||||
<filesize>2147483648</filesize>
|
||||
<terms>
|
||||
<term><name>Release type</name><value>New features</value></term>
|
||||
<term><name>Release type</name><value>Bug fixes</value></term>
|
||||
<term><name>Release type</name><value>Insecure</value></term>
|
||||
</terms>
|
||||
</release>
|
||||
<release>
|
||||
<name>Drupal 8.0.0</name>
|
||||
<version>8.0.0</version>
|
||||
<tag>DRUPAL-8-0-0</tag>
|
||||
<version_major>8</version_major>
|
||||
<version_minor>0</version_minor>
|
||||
<version_patch>0</version_patch>
|
||||
<status>published</status>
|
||||
<release_link>http://example.com/drupal-8-0-0-release</release_link>
|
||||
<download_link>http://example.com/drupal-8-0-0.tar.gz</download_link>
|
||||
<date>1250424521</date>
|
||||
<mdhash>b966255555d9c9b86d480ca08cfaa98e</mdhash>
|
||||
<filesize>1073741824</filesize>
|
||||
<terms>
|
||||
<term><name>Release type</name><value>New features</value></term>
|
||||
<term><name>Release type</name><value>Bug fixes</value></term>
|
||||
<term><name>Release type</name><value>Insecure</value></term>
|
||||
</terms>
|
||||
</release>
|
||||
</releases>
|
||||
</project>
|
|
@ -0,0 +1,269 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<project xmlns:dc="http://purl.org/dc/elements/1.1/">
|
||||
<title>Drupal</title>
|
||||
<short_name>drupal</short_name>
|
||||
<dc:creator>Drupal</dc:creator>
|
||||
<api_version>8.x</api_version>
|
||||
<recommended_major>8</recommended_major>
|
||||
<supported_majors>8</supported_majors>
|
||||
<default_major>8</default_major>
|
||||
<project_status>published</project_status>
|
||||
<link>http://example.com/project/drupal</link>
|
||||
<terms>
|
||||
<term><name>Projects</name><value>Drupal project</value></term>
|
||||
</terms>
|
||||
<releases>
|
||||
<release>
|
||||
<name>drupal 8.2.0-rc2</name>
|
||||
<version>8.2.0-rc2</version>
|
||||
<tag>8.2.0-rc2</tag>
|
||||
<version_major>8</version_major>
|
||||
<version_minor>2</version_minor>
|
||||
<version_patch>0</version_patch>
|
||||
<version_extra>rc2</version_extra>
|
||||
<status>published</status>
|
||||
<release_link>http://example.com/drupal-8-2-0-rc2-release</release_link>
|
||||
<download_link>http://example.com/drupal-8-2-0-rc2.tar.gz</download_link>
|
||||
<date>1533298080</date>
|
||||
<mdhash>2387284145e34a19fc45e03c258a2831</mdhash>
|
||||
<filesize>16209911</filesize>
|
||||
<terms>
|
||||
<term><name>Release type</name><value>Bug fixes</value></term>
|
||||
<term><name>Release type</name><value>New features</value></term>
|
||||
<term><name>Release type</name><value>Security update</value></term>
|
||||
</terms>
|
||||
<security>
|
||||
RC releases are not covered by Drupal security advisories.
|
||||
</security>
|
||||
</release>
|
||||
<release>
|
||||
<name>drupal 8.2.0-rc1</name>
|
||||
<version>8.2.0-rc1</version>
|
||||
<tag>8.2.0-rc1</tag>
|
||||
<version_major>8</version_major>
|
||||
<version_minor>2</version_minor>
|
||||
<version_patch>0</version_patch>
|
||||
<version_extra>rc1</version_extra>
|
||||
<status>published</status>
|
||||
<release_link>http://example.com/drupal-8-2-0-rc1-release</release_link>
|
||||
<download_link>http://example.com/drupal-8-2-0-rc1.tar.gz</download_link>
|
||||
<date>1533270485</date>
|
||||
<mdhash>3d70ae568dd8f7100082b8c58bc8d1fe</mdhash>
|
||||
<filesize>16209123</filesize>
|
||||
<terms>
|
||||
<term><name>Release type</name><value>Insecure</value></term>
|
||||
<term><name>Release type</name><value>Bug fixes</value></term>
|
||||
<term><name>Release type</name><value>New features</value></term>
|
||||
</terms>
|
||||
<security>
|
||||
RC releases are not covered by Drupal security advisories.
|
||||
</security>
|
||||
</release>
|
||||
<release>
|
||||
<name>drupal 8.2.0-beta2</name>
|
||||
<version>8.2.0-beta2</version>
|
||||
<tag>8.2.0-beta2</tag>
|
||||
<version_major>8</version_major>
|
||||
<version_minor>2</version_minor>
|
||||
<version_patch>0</version_patch>
|
||||
<version_extra>beta2</version_extra>
|
||||
<status>published</status>
|
||||
<release_link>http://example.com/drupal-8-2-0-beta2-release</release_link>
|
||||
<download_link>http://example.com/drupal-8-2-0-beta2.tar.gz</download_link>
|
||||
<date>1533298080</date>
|
||||
<mdhash>2387284145e34a19fc45e03c258a2831</mdhash>
|
||||
<filesize>16209911</filesize>
|
||||
<terms>
|
||||
<term><name>Release type</name><value>Bug fixes</value></term>
|
||||
<term><name>Release type</name><value>New features</value></term>
|
||||
<term><name>Release type</name><value>Insecure</value></term>
|
||||
</terms>
|
||||
<security>
|
||||
Beta releases are not covered by Drupal security advisories.
|
||||
</security>
|
||||
</release>
|
||||
<release>
|
||||
<name>drupal 8.2.0-beta1</name>
|
||||
<version>8.2.0-beta1</version>
|
||||
<tag>8.2.0-beta1</tag>
|
||||
<version_major>8</version_major>
|
||||
<version_minor>2</version_minor>
|
||||
<version_patch>0</version_patch>
|
||||
<version_extra>beta1</version_extra>
|
||||
<status>published</status>
|
||||
<release_link>http://example.com/drupal-8-2-0-beta1-release</release_link>
|
||||
<download_link>http://example.com/drupal-8-2-0-beta1.tar.gz</download_link>
|
||||
<date>1533270485</date>
|
||||
<mdhash>3d70ae568dd8f7100082b8c58bc8d1fe</mdhash>
|
||||
<filesize>16209123</filesize>
|
||||
<terms>
|
||||
<term><name>Release type</name><value>Insecure</value></term>
|
||||
<term><name>Release type</name><value>Bug fixes</value></term>
|
||||
<term><name>Release type</name><value>New features</value></term>
|
||||
</terms>
|
||||
<security>
|
||||
Beta releases are not covered by Drupal security advisories.
|
||||
</security>
|
||||
</release>
|
||||
<release>
|
||||
<name>drupal 8.2.0-alpha2</name>
|
||||
<version>8.2.0-alpha2</version>
|
||||
<tag>8.2.0-alpha2</tag>
|
||||
<version_major>8</version_major>
|
||||
<version_minor>2</version_minor>
|
||||
<version_patch>0</version_patch>
|
||||
<version_extra>alpha2</version_extra>
|
||||
<status>published</status>
|
||||
<release_link>http://example.com/drupal-8-2-0-alpha2-release</release_link>
|
||||
<download_link>http://example.com/drupal-8-2-0-alpha2.tar.gz</download_link>
|
||||
<date>1533298080</date>
|
||||
<mdhash>2387284145e34a19fc45e03c258a2831</mdhash>
|
||||
<filesize>16209911</filesize>
|
||||
<terms>
|
||||
<term><name>Release type</name><value>Bug fixes</value></term>
|
||||
<term><name>Release type</name><value>New features</value></term>
|
||||
<term><name>Release type</name><value>Insecure</value></term>
|
||||
</terms>
|
||||
<security>
|
||||
Alpha releases are not covered by Drupal security advisories.
|
||||
</security>
|
||||
</release>
|
||||
<release>
|
||||
<name>drupal 8.2.0-alpha1</name>
|
||||
<version>8.2.0-alpha1</version>
|
||||
<tag>8.2.0-alpha1</tag>
|
||||
<version_major>8</version_major>
|
||||
<version_minor>2</version_minor>
|
||||
<version_patch>0</version_patch>
|
||||
<version_extra>alpha1</version_extra>
|
||||
<status>published</status>
|
||||
<release_link>http://example.com/drupal-8.2.0-alpha1</release_link>
|
||||
<download_link>http://example.com/drupal-8-2-0-alpha1.tar.gz</download_link>
|
||||
<date>1533270485</date>
|
||||
<mdhash>3d70ae568dd8f7100082b8c58bc8d1fe</mdhash>
|
||||
<filesize>16209123</filesize>
|
||||
<terms>
|
||||
<term><name>Release type</name><value>Insecure</value></term>
|
||||
<term><name>Release type</name><value>Bug fixes</value></term>
|
||||
<term><name>Release type</name><value>New features</value></term>
|
||||
</terms>
|
||||
<security>
|
||||
Alpha releases are not covered by Drupal security advisories.
|
||||
</security>
|
||||
</release>
|
||||
<release>
|
||||
<name>Drupal 8.1.2</name>
|
||||
<version>8.1.2</version>
|
||||
<tag>DRUPAL-8-1-2</tag>
|
||||
<version_major>8</version_major>
|
||||
<version_minor>1</version_minor>
|
||||
<version_patch>2</version_patch>
|
||||
<status>published</status>
|
||||
<release_link>http://example.com/drupal-8-1-2-release</release_link>
|
||||
<download_link>http://example.com/drupal-8-1-2.tar.gz</download_link>
|
||||
<date>1250424641</date>
|
||||
<mdhash>b966255555d9c9b86d480ca08cfaa98e</mdhash>
|
||||
<filesize>4294967296</filesize>
|
||||
<terms>
|
||||
<term><name>Release type</name><value>New features</value></term>
|
||||
<term><name>Release type</name><value>Bug fixes</value></term>
|
||||
<term><name>Release type</name><value>Security update</value></term>
|
||||
</terms>
|
||||
</release>
|
||||
<release>
|
||||
<name>Drupal 8.1.1</name>
|
||||
<version>8.1.1</version>
|
||||
<tag>DRUPAL-8-1-1</tag>
|
||||
<version_major>8</version_major>
|
||||
<version_minor>1</version_minor>
|
||||
<version_patch>1</version_patch>
|
||||
<status>published</status>
|
||||
<release_link>http://example.com/drupal-8-1-1-release</release_link>
|
||||
<download_link>http://example.com/drupal-8-1-1.tar.gz</download_link>
|
||||
<date>1250424581</date>
|
||||
<mdhash>b966255555d9c9b86d480ca08cfaa98e</mdhash>
|
||||
<filesize>2147483648</filesize>
|
||||
<terms>
|
||||
<term><name>Release type</name><value>New features</value></term>
|
||||
<term><name>Release type</name><value>Bug fixes</value></term>
|
||||
<term><name>Release type</name><value>Insecure</value></term>
|
||||
</terms>
|
||||
</release>
|
||||
<release>
|
||||
<name>Drupal 8.1.0</name>
|
||||
<version>8.1.0</version>
|
||||
<tag>DRUPAL-8-1-0</tag>
|
||||
<version_major>8</version_major>
|
||||
<version_minor>1</version_minor>
|
||||
<version_patch>0</version_patch>
|
||||
<status>published</status>
|
||||
<release_link>http://example.com/drupal-8-1-0-release</release_link>
|
||||
<download_link>http://example.com/drupal-8-1-0.tar.gz</download_link>
|
||||
<date>1250424521</date>
|
||||
<mdhash>b966255555d9c9b86d480ca08cfaa98e</mdhash>
|
||||
<filesize>1073741824</filesize>
|
||||
<terms>
|
||||
<term><name>Release type</name><value>New features</value></term>
|
||||
<term><name>Release type</name><value>Bug fixes</value></term>
|
||||
<term><name>Release type</name><value>Insecure</value></term>
|
||||
</terms>
|
||||
</release>
|
||||
<release>
|
||||
<name>Drupal 8.0.2</name>
|
||||
<version>8.0.2</version>
|
||||
<tag>DRUPAL-8-0-2</tag>
|
||||
<version_major>8</version_major>
|
||||
<version_minor>0</version_minor>
|
||||
<version_patch>2</version_patch>
|
||||
<status>published</status>
|
||||
<release_link>http://example.com/drupal-8-0-2-release</release_link>
|
||||
<download_link>http://example.com/drupal-8-0-2.tar.gz</download_link>
|
||||
<date>1250424641</date>
|
||||
<mdhash>b966255555d9c9b86d480ca08cfaa98e</mdhash>
|
||||
<filesize>4294967296</filesize>
|
||||
<terms>
|
||||
<term><name>Release type</name><value>New features</value></term>
|
||||
<term><name>Release type</name><value>Bug fixes</value></term>
|
||||
<term><name>Release type</name><value>Security update</value></term>
|
||||
</terms>
|
||||
</release>
|
||||
<release>
|
||||
<name>Drupal 8.0.1</name>
|
||||
<version>8.0.1</version>
|
||||
<tag>DRUPAL-8-0-1</tag>
|
||||
<version_major>8</version_major>
|
||||
<version_minor>0</version_minor>
|
||||
<version_patch>1</version_patch>
|
||||
<status>published</status>
|
||||
<release_link>http://example.com/drupal-8-0-1-release</release_link>
|
||||
<download_link>http://example.com/drupal-8-0-1.tar.gz</download_link>
|
||||
<date>1250424581</date>
|
||||
<mdhash>b966255555d9c9b86d480ca08cfaa98e</mdhash>
|
||||
<filesize>2147483648</filesize>
|
||||
<terms>
|
||||
<term><name>Release type</name><value>New features</value></term>
|
||||
<term><name>Release type</name><value>Bug fixes</value></term>
|
||||
<term><name>Release type</name><value>Insecure</value></term>
|
||||
</terms>
|
||||
</release>
|
||||
<release>
|
||||
<name>Drupal 8.0.0</name>
|
||||
<version>8.0.0</version>
|
||||
<tag>DRUPAL-8-0-0</tag>
|
||||
<version_major>8</version_major>
|
||||
<version_minor>0</version_minor>
|
||||
<version_patch>0</version_patch>
|
||||
<status>published</status>
|
||||
<release_link>http://example.com/drupal-8-0-0-release</release_link>
|
||||
<download_link>http://example.com/drupal-8-0-0.tar.gz</download_link>
|
||||
<date>1250424521</date>
|
||||
<mdhash>b966255555d9c9b86d480ca08cfaa98e</mdhash>
|
||||
<filesize>1073741824</filesize>
|
||||
<terms>
|
||||
<term><name>Release type</name><value>New features</value></term>
|
||||
<term><name>Release type</name><value>Bug fixes</value></term>
|
||||
<term><name>Release type</name><value>Insecure</value></term>
|
||||
</terms>
|
||||
</release>
|
||||
</releases>
|
||||
</project>
|
|
@ -48,6 +48,7 @@
|
|||
<terms>
|
||||
<term><name>Release type</name><value>New features</value></term>
|
||||
<term><name>Release type</name><value>Bug fixes</value></term>
|
||||
<term><name>Release type</name><value>Insecure</value></term>
|
||||
</terms>
|
||||
</release>
|
||||
<release>
|
||||
|
@ -66,6 +67,7 @@
|
|||
<terms>
|
||||
<term><name>Release type</name><value>New features</value></term>
|
||||
<term><name>Release type</name><value>Bug fixes</value></term>
|
||||
<term><name>Release type</name><value>Insecure</value></term>
|
||||
</terms>
|
||||
</release>
|
||||
</releases>
|
|
@ -0,0 +1,128 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<project xmlns:dc="http://purl.org/dc/elements/1.1/">
|
||||
<title>Drupal</title>
|
||||
<short_name>drupal</short_name>
|
||||
<dc:creator>Drupal</dc:creator>
|
||||
<api_version>8.x</api_version>
|
||||
<recommended_major>8</recommended_major>
|
||||
<supported_majors>8</supported_majors>
|
||||
<default_major>8</default_major>
|
||||
<project_status>published</project_status>
|
||||
<link>http://example.com/project/drupal</link>
|
||||
<terms>
|
||||
<term><name>Projects</name><value>Drupal project</value></term>
|
||||
</terms>
|
||||
<releases>
|
||||
<release>
|
||||
<name>Drupal 8.1.2</name>
|
||||
<version>8.1.2</version>
|
||||
<tag>DRUPAL-8-1-2</tag>
|
||||
<version_major>8</version_major>
|
||||
<version_minor>1</version_minor>
|
||||
<version_patch>2</version_patch>
|
||||
<status>published</status>
|
||||
<release_link>http://example.com/drupal-8-1-2-release</release_link>
|
||||
<download_link>http://example.com/drupal-8-1-2.tar.gz</download_link>
|
||||
<date>1250424641</date>
|
||||
<mdhash>b966255555d9c9b86d480ca08cfaa98e</mdhash>
|
||||
<filesize>4294967296</filesize>
|
||||
<terms>
|
||||
<term><name>Release type</name><value>New features</value></term>
|
||||
<term><name>Release type</name><value>Bug fixes</value></term>
|
||||
<term><name>Release type</name><value>Security update</value></term>
|
||||
</terms>
|
||||
</release>
|
||||
<release>
|
||||
<name>Drupal 8.1.1</name>
|
||||
<version>8.1.1</version>
|
||||
<tag>DRUPAL-8-1-1</tag>
|
||||
<version_major>8</version_major>
|
||||
<version_minor>1</version_minor>
|
||||
<version_patch>1</version_patch>
|
||||
<status>published</status>
|
||||
<release_link>http://example.com/drupal-8-1-1-release</release_link>
|
||||
<download_link>http://example.com/drupal-8-1-1.tar.gz</download_link>
|
||||
<date>1250424581</date>
|
||||
<mdhash>b966255555d9c9b86d480ca08cfaa98e</mdhash>
|
||||
<filesize>2147483648</filesize>
|
||||
<terms>
|
||||
<term><name>Release type</name><value>New features</value></term>
|
||||
<term><name>Release type</name><value>Bug fixes</value></term>
|
||||
<term><name>Release type</name><value>Insecure</value></term>
|
||||
</terms>
|
||||
</release>
|
||||
<release>
|
||||
<name>Drupal 8.1.0</name>
|
||||
<version>8.1.0</version>
|
||||
<tag>DRUPAL-8-1-0</tag>
|
||||
<version_major>8</version_major>
|
||||
<version_minor>1</version_minor>
|
||||
<version_patch>0</version_patch>
|
||||
<status>published</status>
|
||||
<release_link>http://example.com/drupal-8-1-0-release</release_link>
|
||||
<download_link>http://example.com/drupal-8-1-0.tar.gz</download_link>
|
||||
<date>1250424521</date>
|
||||
<mdhash>b966255555d9c9b86d480ca08cfaa98e</mdhash>
|
||||
<filesize>1073741824</filesize>
|
||||
<terms>
|
||||
<term><name>Release type</name><value>New features</value></term>
|
||||
<term><name>Release type</name><value>Bug fixes</value></term>
|
||||
<term><name>Release type</name><value>Insecure</value></term>
|
||||
</terms>
|
||||
</release>
|
||||
<release>
|
||||
<name>Drupal 8.0.2</name>
|
||||
<version>8.0.2</version>
|
||||
<tag>DRUPAL-8-0-2</tag>
|
||||
<version_major>8</version_major>
|
||||
<version_minor>0</version_minor>
|
||||
<version_patch>2</version_patch>
|
||||
<status>published</status>
|
||||
<release_link>http://example.com/drupal-8-0-2-release</release_link>
|
||||
<download_link>http://example.com/drupal-8-0-2.tar.gz</download_link>
|
||||
<date>1250424641</date>
|
||||
<mdhash>b966255555d9c9b86d480ca08cfaa98e</mdhash>
|
||||
<filesize>4294967296</filesize>
|
||||
<terms>
|
||||
<term><name>Release type</name><value>New features</value></term>
|
||||
<term><name>Release type</name><value>Bug fixes</value></term>
|
||||
</terms>
|
||||
</release>
|
||||
<release>
|
||||
<name>Drupal 8.0.1</name>
|
||||
<version>8.0.1</version>
|
||||
<tag>DRUPAL-8-0-1</tag>
|
||||
<version_major>8</version_major>
|
||||
<version_minor>0</version_minor>
|
||||
<version_patch>1</version_patch>
|
||||
<status>published</status>
|
||||
<release_link>http://example.com/drupal-8-0-1-release</release_link>
|
||||
<download_link>http://example.com/drupal-8-0-1.tar.gz</download_link>
|
||||
<date>1250424581</date>
|
||||
<mdhash>b966255555d9c9b86d480ca08cfaa98e</mdhash>
|
||||
<filesize>2147483648</filesize>
|
||||
<terms>
|
||||
<term><name>Release type</name><value>New features</value></term>
|
||||
<term><name>Release type</name><value>Bug fixes</value></term>
|
||||
</terms>
|
||||
</release>
|
||||
<release>
|
||||
<name>Drupal 8.0.0</name>
|
||||
<version>8.0.0</version>
|
||||
<tag>DRUPAL-8-0-0</tag>
|
||||
<version_major>8</version_major>
|
||||
<version_minor>0</version_minor>
|
||||
<version_patch>0</version_patch>
|
||||
<status>published</status>
|
||||
<release_link>http://example.com/drupal-8-0-0-release</release_link>
|
||||
<download_link>http://example.com/drupal-8-0-0.tar.gz</download_link>
|
||||
<date>1250424521</date>
|
||||
<mdhash>b966255555d9c9b86d480ca08cfaa98e</mdhash>
|
||||
<filesize>1073741824</filesize>
|
||||
<terms>
|
||||
<term><name>Release type</name><value>New features</value></term>
|
||||
<term><name>Release type</name><value>Bug fixes</value></term>
|
||||
</terms>
|
||||
</release>
|
||||
</releases>
|
||||
</project>
|
|
@ -0,0 +1,131 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<project xmlns:dc="http://purl.org/dc/elements/1.1/">
|
||||
<title>Drupal</title>
|
||||
<short_name>drupal</short_name>
|
||||
<dc:creator>Drupal</dc:creator>
|
||||
<api_version>8.x</api_version>
|
||||
<recommended_major>8</recommended_major>
|
||||
<supported_majors>8</supported_majors>
|
||||
<default_major>8</default_major>
|
||||
<project_status>published</project_status>
|
||||
<link>http://example.com/project/drupal</link>
|
||||
<terms>
|
||||
<term><name>Projects</name><value>Drupal project</value></term>
|
||||
</terms>
|
||||
<releases>
|
||||
<release>
|
||||
<name>Drupal 8.1.2</name>
|
||||
<version>8.1.2</version>
|
||||
<tag>DRUPAL-8-1-2</tag>
|
||||
<version_major>8</version_major>
|
||||
<version_minor>1</version_minor>
|
||||
<version_patch>2</version_patch>
|
||||
<status>published</status>
|
||||
<release_link>http://example.com/drupal-8-1-2-release</release_link>
|
||||
<download_link>http://example.com/drupal-8-1-2.tar.gz</download_link>
|
||||
<date>1250424641</date>
|
||||
<mdhash>b966255555d9c9b86d480ca08cfaa98e</mdhash>
|
||||
<filesize>4294967296</filesize>
|
||||
<terms>
|
||||
<term><name>Release type</name><value>New features</value></term>
|
||||
<term><name>Release type</name><value>Bug fixes</value></term>
|
||||
<term><name>Release type</name><value>Security update</value></term>
|
||||
</terms>
|
||||
</release>
|
||||
<release>
|
||||
<name>Drupal 8.1.1</name>
|
||||
<version>8.1.1</version>
|
||||
<tag>DRUPAL-8-1-1</tag>
|
||||
<version_major>8</version_major>
|
||||
<version_minor>1</version_minor>
|
||||
<version_patch>1</version_patch>
|
||||
<status>published</status>
|
||||
<release_link>http://example.com/drupal-8-1-1-release</release_link>
|
||||
<download_link>http://example.com/drupal-8-1-1.tar.gz</download_link>
|
||||
<date>1250424581</date>
|
||||
<mdhash>b966255555d9c9b86d480ca08cfaa98e</mdhash>
|
||||
<filesize>2147483648</filesize>
|
||||
<terms>
|
||||
<term><name>Release type</name><value>New features</value></term>
|
||||
<term><name>Release type</name><value>Bug fixes</value></term>
|
||||
<term><name>Release type</name><value>Insecure</value></term>
|
||||
</terms>
|
||||
</release>
|
||||
<release>
|
||||
<name>Drupal 8.1.0</name>
|
||||
<version>8.1.0</version>
|
||||
<tag>DRUPAL-8-1-0</tag>
|
||||
<version_major>8</version_major>
|
||||
<version_minor>1</version_minor>
|
||||
<version_patch>0</version_patch>
|
||||
<status>published</status>
|
||||
<release_link>http://example.com/drupal-8-1-0-release</release_link>
|
||||
<download_link>http://example.com/drupal-8-1-0.tar.gz</download_link>
|
||||
<date>1250424521</date>
|
||||
<mdhash>b966255555d9c9b86d480ca08cfaa98e</mdhash>
|
||||
<filesize>1073741824</filesize>
|
||||
<terms>
|
||||
<term><name>Release type</name><value>New features</value></term>
|
||||
<term><name>Release type</name><value>Bug fixes</value></term>
|
||||
<term><name>Release type</name><value>Insecure</value></term>
|
||||
</terms>
|
||||
</release>
|
||||
<release>
|
||||
<name>Drupal 8.0.2</name>
|
||||
<version>8.0.2</version>
|
||||
<tag>DRUPAL-8-0-2</tag>
|
||||
<version_major>8</version_major>
|
||||
<version_minor>0</version_minor>
|
||||
<version_patch>2</version_patch>
|
||||
<status>published</status>
|
||||
<release_link>http://example.com/drupal-8-0-2-release</release_link>
|
||||
<download_link>http://example.com/drupal-8-0-2.tar.gz</download_link>
|
||||
<date>1250424641</date>
|
||||
<mdhash>b966255555d9c9b86d480ca08cfaa98e</mdhash>
|
||||
<filesize>4294967296</filesize>
|
||||
<terms>
|
||||
<term><name>Release type</name><value>New features</value></term>
|
||||
<term><name>Release type</name><value>Bug fixes</value></term>
|
||||
<term><name>Release type</name><value>Insecure</value></term>
|
||||
</terms>
|
||||
</release>
|
||||
<release>
|
||||
<name>Drupal 8.0.1</name>
|
||||
<version>8.0.1</version>
|
||||
<tag>DRUPAL-8-0-1</tag>
|
||||
<version_major>8</version_major>
|
||||
<version_minor>0</version_minor>
|
||||
<version_patch>1</version_patch>
|
||||
<status>published</status>
|
||||
<release_link>http://example.com/drupal-8-0-1-release</release_link>
|
||||
<download_link>http://example.com/drupal-8-0-1.tar.gz</download_link>
|
||||
<date>1250424581</date>
|
||||
<mdhash>b966255555d9c9b86d480ca08cfaa98e</mdhash>
|
||||
<filesize>2147483648</filesize>
|
||||
<terms>
|
||||
<term><name>Release type</name><value>New features</value></term>
|
||||
<term><name>Release type</name><value>Bug fixes</value></term>
|
||||
<term><name>Release type</name><value>Insecure</value></term>
|
||||
</terms>
|
||||
</release>
|
||||
<release>
|
||||
<name>Drupal 8.0.0</name>
|
||||
<version>8.0.0</version>
|
||||
<tag>DRUPAL-8-0-0</tag>
|
||||
<version_major>8</version_major>
|
||||
<version_minor>0</version_minor>
|
||||
<version_patch>0</version_patch>
|
||||
<status>published</status>
|
||||
<release_link>http://example.com/drupal-8-0-0-release</release_link>
|
||||
<download_link>http://example.com/drupal-8-0-0.tar.gz</download_link>
|
||||
<date>1250424521</date>
|
||||
<mdhash>b966255555d9c9b86d480ca08cfaa98e</mdhash>
|
||||
<filesize>1073741824</filesize>
|
||||
<terms>
|
||||
<term><name>Release type</name><value>New features</value></term>
|
||||
<term><name>Release type</name><value>Bug fixes</value></term>
|
||||
<term><name>Release type</name><value>Insecure</value></term>
|
||||
</terms>
|
||||
</release>
|
||||
</releases>
|
||||
</project>
|
|
@ -41,7 +41,7 @@ class UpdateTestController extends ControllerBase {
|
|||
* @param string $version
|
||||
* The version of Drupal core.
|
||||
*
|
||||
* @return BinaryFileResponse|Response
|
||||
* @return \Symfony\Component\HttpFoundation\BinaryFileResponse|Response
|
||||
* A BinaryFileResponse object containing the content of the XML release file
|
||||
* for the specified project if one is available; a Response object with no
|
||||
* content otherwise.
|
||||
|
|
|
@ -46,6 +46,7 @@
|
|||
<terms>
|
||||
<term><name>Release type</name><value>New features</value></term>
|
||||
<term><name>Release type</name><value>Bug fixes</value></term>
|
||||
<term><name>Release type</name><value>Insecure</value></term>
|
||||
</terms>
|
||||
</release>
|
||||
</releases>
|
||||
|
|
|
@ -0,0 +1,58 @@
|
|||
<?php
|
||||
|
||||
namespace Drupal\Tests\update\Functional;
|
||||
|
||||
/**
|
||||
* Tests the Update Manager module upload via authorize.php functionality.
|
||||
*
|
||||
* @group update
|
||||
*/
|
||||
class FileTransferAuthorizeFormTest extends UpdateTestBase {
|
||||
|
||||
/**
|
||||
* Modules to enable.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public static $modules = ['update', 'update_test'];
|
||||
|
||||
protected function setUp() {
|
||||
parent::setUp();
|
||||
$admin_user = $this->drupalCreateUser(['administer modules', 'administer software updates', 'administer site configuration']);
|
||||
$this->drupalLogin($admin_user);
|
||||
|
||||
// Create a local cache so the module is not downloaded from drupal.org.
|
||||
$cache_directory = _update_manager_cache_directory(TRUE);
|
||||
$validArchiveFile = __DIR__ . '/../../update_test_new_module/8.x-1.0/update_test_new_module.tar.gz';
|
||||
copy($validArchiveFile, $cache_directory . '/update_test_new_module.tar.gz');
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests the Update Manager module upload via authorize.php functionality.
|
||||
*/
|
||||
public function testViaAuthorize() {
|
||||
// Ensure the that we can select which file transfer backend to use.
|
||||
\Drupal::state()->set('test_uploaders_via_prompt', TRUE);
|
||||
|
||||
// Ensure the module does not already exist.
|
||||
$this->drupalGet('admin/modules');
|
||||
$this->assertNoText('Update test new module');
|
||||
|
||||
$edit = [
|
||||
// This project has been cached in the test's setUp() method.
|
||||
'project_url' => 'https://ftp.drupal.org/files/projects/update_test_new_module.tar.gz',
|
||||
];
|
||||
$this->drupalPostForm('admin/modules/install', $edit, t('Install'));
|
||||
$edit = [
|
||||
'connection_settings[authorize_filetransfer_default]' => 'system_test',
|
||||
'connection_settings[system_test][update_test_username]' => $this->randomMachineName(),
|
||||
];
|
||||
$this->drupalPostForm(NULL, $edit, t('Continue'));
|
||||
$this->assertText(t('Installation was completed successfully.'));
|
||||
|
||||
// Ensure the module is available to install.
|
||||
$this->drupalGet('admin/modules');
|
||||
$this->assertText('Update test new module');
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,567 @@
|
|||
<?php
|
||||
|
||||
namespace Drupal\Tests\update\Functional;
|
||||
|
||||
use Drupal\Core\Url;
|
||||
use Drupal\Core\Utility\ProjectInfo;
|
||||
|
||||
/**
|
||||
* Tests how the Update Manager module handles contributed modules and themes in
|
||||
* a series of functional tests using mock XML data.
|
||||
*
|
||||
* @group update
|
||||
*/
|
||||
class UpdateContribTest extends UpdateTestBase {
|
||||
|
||||
/**
|
||||
* Modules to enable.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public static $modules = ['update_test', 'update', 'aaa_update_test', 'bbb_update_test', 'ccc_update_test'];
|
||||
|
||||
protected function setUp() {
|
||||
parent::setUp();
|
||||
$admin_user = $this->drupalCreateUser(['administer site configuration']);
|
||||
$this->drupalLogin($admin_user);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests when there is no available release data for a contrib module.
|
||||
*/
|
||||
public function testNoReleasesAvailable() {
|
||||
$system_info = [
|
||||
'#all' => [
|
||||
'version' => '8.0.0',
|
||||
],
|
||||
'aaa_update_test' => [
|
||||
'project' => 'aaa_update_test',
|
||||
'version' => '8.x-1.0',
|
||||
'hidden' => FALSE,
|
||||
],
|
||||
];
|
||||
$this->config('update_test.settings')->set('system_info', $system_info)->save();
|
||||
$this->refreshUpdateStatus(['drupal' => '0.0', 'aaa_update_test' => 'no-releases']);
|
||||
$this->drupalGet('admin/reports/updates');
|
||||
// Cannot use $this->standardTests() because we need to check for the
|
||||
// 'No available releases found' string.
|
||||
$this->assertRaw('<h3>' . t('Drupal core') . '</h3>');
|
||||
$this->assertRaw(\Drupal::l(t('Drupal'), Url::fromUri('http://example.com/project/drupal')));
|
||||
$this->assertText(t('Up to date'));
|
||||
$this->assertRaw('<h3>' . t('Modules') . '</h3>');
|
||||
$this->assertNoText(t('Update available'));
|
||||
$this->assertText(t('No available releases found'));
|
||||
$this->assertNoRaw(\Drupal::l(t('AAA Update test'), Url::fromUri('http://example.com/project/aaa_update_test')));
|
||||
|
||||
$available = update_get_available();
|
||||
$this->assertFalse(isset($available['aaa_update_test']['fetch_status']), 'Results are cached even if no releases are available.');
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests the basic functionality of a contrib module on the status report.
|
||||
*/
|
||||
public function testUpdateContribBasic() {
|
||||
$project_link = \Drupal::l(t('AAA Update test'), Url::fromUri('http://example.com/project/aaa_update_test'));
|
||||
$system_info = [
|
||||
'#all' => [
|
||||
'version' => '8.0.0',
|
||||
],
|
||||
'aaa_update_test' => [
|
||||
'project' => 'aaa_update_test',
|
||||
'version' => '8.x-1.0',
|
||||
'hidden' => FALSE,
|
||||
],
|
||||
];
|
||||
$this->config('update_test.settings')->set('system_info', $system_info)->save();
|
||||
$this->refreshUpdateStatus(
|
||||
[
|
||||
'drupal' => '0.0',
|
||||
'aaa_update_test' => '1_0',
|
||||
]
|
||||
);
|
||||
$this->standardTests();
|
||||
$this->assertText(t('Up to date'));
|
||||
$this->assertRaw('<h3>' . t('Modules') . '</h3>');
|
||||
$this->assertNoText(t('Update available'));
|
||||
$this->assertRaw($project_link, 'Link to aaa_update_test project appears.');
|
||||
|
||||
// Since aaa_update_test is installed the fact it is hidden and in the
|
||||
// Testing package means it should not appear.
|
||||
$system_info['aaa_update_test']['hidden'] = TRUE;
|
||||
$this->config('update_test.settings')->set('system_info', $system_info)->save();
|
||||
$this->refreshUpdateStatus(
|
||||
[
|
||||
'drupal' => '0.0',
|
||||
'aaa_update_test' => '1_0',
|
||||
]
|
||||
);
|
||||
$this->assertNoRaw($project_link, 'Link to aaa_update_test project does not appear.');
|
||||
|
||||
// A hidden and installed project not in the Testing package should appear.
|
||||
$system_info['aaa_update_test']['package'] = 'aaa_update_test';
|
||||
$this->config('update_test.settings')->set('system_info', $system_info)->save();
|
||||
$this->refreshUpdateStatus(
|
||||
[
|
||||
'drupal' => '0.0',
|
||||
'aaa_update_test' => '1_0',
|
||||
]
|
||||
);
|
||||
$this->assertRaw($project_link, 'Link to aaa_update_test project appears.');
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests that contrib projects are ordered by project name.
|
||||
*
|
||||
* If a project contains multiple modules, we want to make sure that the
|
||||
* available updates report is sorted by the parent project names, not by the
|
||||
* names of the modules included in each project. In this test case, we have
|
||||
* two contrib projects, "BBB Update test" and "CCC Update test". However, we
|
||||
* have a module called "aaa_update_test" that's part of the "CCC Update test"
|
||||
* project. We need to make sure that we see the "BBB" project before the
|
||||
* "CCC" project, even though "CCC" includes a module that's processed first
|
||||
* if you sort alphabetically by module name (which is the order we see things
|
||||
* inside system_rebuild_module_data() for example).
|
||||
*/
|
||||
public function testUpdateContribOrder() {
|
||||
// We want core to be version 8.0.0.
|
||||
$system_info = [
|
||||
'#all' => [
|
||||
'version' => '8.0.0',
|
||||
],
|
||||
// All the rest should be visible as contrib modules at version 8.x-1.0.
|
||||
|
||||
// aaa_update_test needs to be part of the "CCC Update test" project,
|
||||
// which would throw off the report if we weren't properly sorting by
|
||||
// the project names.
|
||||
'aaa_update_test' => [
|
||||
'project' => 'ccc_update_test',
|
||||
'version' => '8.x-1.0',
|
||||
'hidden' => FALSE,
|
||||
],
|
||||
|
||||
// This should be its own project, and listed first on the report.
|
||||
'bbb_update_test' => [
|
||||
'project' => 'bbb_update_test',
|
||||
'version' => '8.x-1.0',
|
||||
'hidden' => FALSE,
|
||||
],
|
||||
|
||||
// This will contain both aaa_update_test and ccc_update_test, and
|
||||
// should come after the bbb_update_test project.
|
||||
'ccc_update_test' => [
|
||||
'project' => 'ccc_update_test',
|
||||
'version' => '8.x-1.0',
|
||||
'hidden' => FALSE,
|
||||
],
|
||||
];
|
||||
$this->config('update_test.settings')->set('system_info', $system_info)->save();
|
||||
$this->refreshUpdateStatus(['drupal' => '0.0', '#all' => '1_0']);
|
||||
$this->standardTests();
|
||||
// We're expecting the report to say all projects are up to date.
|
||||
$this->assertText(t('Up to date'));
|
||||
$this->assertNoText(t('Update available'));
|
||||
// We want to see all 3 module names listed, since they'll show up either
|
||||
// as project names or as modules under the "Includes" listing.
|
||||
$this->assertText(t('AAA Update test'));
|
||||
$this->assertText(t('BBB Update test'));
|
||||
$this->assertText(t('CCC Update test'));
|
||||
// We want aaa_update_test included in the ccc_update_test project, not as
|
||||
// its own project on the report.
|
||||
$this->assertNoRaw(\Drupal::l(t('AAA Update test'), Url::fromUri('http://example.com/project/aaa_update_test')), 'Link to aaa_update_test project does not appear.');
|
||||
// The other two should be listed as projects.
|
||||
$this->assertRaw(\Drupal::l(t('BBB Update test'), Url::fromUri('http://example.com/project/bbb_update_test')), 'Link to bbb_update_test project appears.');
|
||||
$this->assertRaw(\Drupal::l(t('CCC Update test'), Url::fromUri('http://example.com/project/ccc_update_test')), 'Link to bbb_update_test project appears.');
|
||||
|
||||
// We want to make sure we see the BBB project before the CCC project.
|
||||
// Instead of just searching for 'BBB Update test' or something, we want
|
||||
// to use the full markup that starts the project entry itself, so that
|
||||
// we're really testing that the project listings are in the right order.
|
||||
$bbb_project_link = '<div class="project-update__title"><a href="http://example.com/project/bbb_update_test">BBB Update test</a>';
|
||||
$ccc_project_link = '<div class="project-update__title"><a href="http://example.com/project/ccc_update_test">CCC Update test</a>';
|
||||
$this->assertTrue(strpos($this->getSession()->getPage()->getContent(), $bbb_project_link) < strpos($this->getSession()->getPage()->getContent(), $ccc_project_link), "'BBB Update test' project is listed before the 'CCC Update test' project");
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests that subthemes are notified about security updates for base themes.
|
||||
*/
|
||||
public function testUpdateBaseThemeSecurityUpdate() {
|
||||
// @todo https://www.drupal.org/node/2338175 base themes have to be
|
||||
// installed.
|
||||
// Only install the subtheme, not the base theme.
|
||||
\Drupal::service('theme_handler')->install(['update_test_subtheme']);
|
||||
|
||||
// Define the initial state for core and the subtheme.
|
||||
$system_info = [
|
||||
// We want core to be version 8.0.0.
|
||||
'#all' => [
|
||||
'version' => '8.0.0',
|
||||
],
|
||||
// Show the update_test_basetheme
|
||||
'update_test_basetheme' => [
|
||||
'project' => 'update_test_basetheme',
|
||||
'version' => '8.x-1.0',
|
||||
'hidden' => FALSE,
|
||||
],
|
||||
// Show the update_test_subtheme
|
||||
'update_test_subtheme' => [
|
||||
'project' => 'update_test_subtheme',
|
||||
'version' => '8.x-1.0',
|
||||
'hidden' => FALSE,
|
||||
],
|
||||
];
|
||||
$this->config('update_test.settings')->set('system_info', $system_info)->save();
|
||||
$xml_mapping = [
|
||||
'drupal' => '0.0',
|
||||
'update_test_subtheme' => '1_0',
|
||||
'update_test_basetheme' => '1_1-sec',
|
||||
];
|
||||
$this->refreshUpdateStatus($xml_mapping);
|
||||
$this->assertText(t('Security update required!'));
|
||||
$this->assertRaw(\Drupal::l(t('Update test base theme'), Url::fromUri('http://example.com/project/update_test_basetheme')), 'Link to the Update test base theme project appears.');
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests that disabled themes are only shown when desired.
|
||||
*
|
||||
* @todo https://www.drupal.org/node/2338175 extensions can not be hidden and
|
||||
* base themes have to be installed.
|
||||
*/
|
||||
public function testUpdateShowDisabledThemes() {
|
||||
$update_settings = $this->config('update.settings');
|
||||
// Make sure all the update_test_* themes are disabled.
|
||||
$extension_config = $this->config('core.extension');
|
||||
foreach ($extension_config->get('theme') as $theme => $weight) {
|
||||
if (preg_match('/^update_test_/', $theme)) {
|
||||
$extension_config->clear("theme.$theme");
|
||||
}
|
||||
}
|
||||
$extension_config->save();
|
||||
|
||||
// Define the initial state for core and the test contrib themes.
|
||||
$system_info = [
|
||||
// We want core to be version 8.0.0.
|
||||
'#all' => [
|
||||
'version' => '8.0.0',
|
||||
],
|
||||
// The update_test_basetheme should be visible and up to date.
|
||||
'update_test_basetheme' => [
|
||||
'project' => 'update_test_basetheme',
|
||||
'version' => '8.x-1.1',
|
||||
'hidden' => FALSE,
|
||||
],
|
||||
// The update_test_subtheme should be visible and up to date.
|
||||
'update_test_subtheme' => [
|
||||
'project' => 'update_test_subtheme',
|
||||
'version' => '8.x-1.0',
|
||||
'hidden' => FALSE,
|
||||
],
|
||||
];
|
||||
// When there are contributed modules in the site's file system, the
|
||||
// total number of attempts made in the test may exceed the default value
|
||||
// of update_max_fetch_attempts. Therefore this variable is set very high
|
||||
// to avoid test failures in those cases.
|
||||
$update_settings->set('fetch.max_attempts', 99999)->save();
|
||||
$this->config('update_test.settings')->set('system_info', $system_info)->save();
|
||||
$xml_mapping = [
|
||||
'drupal' => '0.0',
|
||||
'update_test_subtheme' => '1_0',
|
||||
'update_test_basetheme' => '1_1-sec',
|
||||
];
|
||||
$base_theme_project_link = \Drupal::l(t('Update test base theme'), Url::fromUri('http://example.com/project/update_test_basetheme'));
|
||||
$sub_theme_project_link = \Drupal::l(t('Update test subtheme'), Url::fromUri('http://example.com/project/update_test_subtheme'));
|
||||
foreach ([TRUE, FALSE] as $check_disabled) {
|
||||
$update_settings->set('check.disabled_extensions', $check_disabled)->save();
|
||||
$this->refreshUpdateStatus($xml_mapping);
|
||||
// In neither case should we see the "Themes" heading for installed
|
||||
// themes.
|
||||
$this->assertNoText(t('Themes'));
|
||||
if ($check_disabled) {
|
||||
$this->assertText(t('Uninstalled themes'));
|
||||
$this->assertRaw($base_theme_project_link, 'Link to the Update test base theme project appears.');
|
||||
$this->assertRaw($sub_theme_project_link, 'Link to the Update test subtheme project appears.');
|
||||
}
|
||||
else {
|
||||
$this->assertNoText(t('Uninstalled themes'));
|
||||
$this->assertNoRaw($base_theme_project_link, 'Link to the Update test base theme project does not appear.');
|
||||
$this->assertNoRaw($sub_theme_project_link, 'Link to the Update test subtheme project does not appear.');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests updates with a hidden base theme.
|
||||
*/
|
||||
public function testUpdateHiddenBaseTheme() {
|
||||
module_load_include('compare.inc', 'update');
|
||||
|
||||
// Install the subtheme.
|
||||
\Drupal::service('theme_handler')->install(['update_test_subtheme']);
|
||||
|
||||
// Add a project and initial state for base theme and subtheme.
|
||||
$system_info = [
|
||||
// Hide the update_test_basetheme.
|
||||
'update_test_basetheme' => [
|
||||
'project' => 'update_test_basetheme',
|
||||
'hidden' => TRUE,
|
||||
],
|
||||
// Show the update_test_subtheme.
|
||||
'update_test_subtheme' => [
|
||||
'project' => 'update_test_subtheme',
|
||||
'hidden' => FALSE,
|
||||
],
|
||||
];
|
||||
$this->config('update_test.settings')->set('system_info', $system_info)->save();
|
||||
$projects = \Drupal::service('update.manager')->getProjects();
|
||||
$theme_data = \Drupal::service('theme_handler')->rebuildThemeData();
|
||||
$project_info = new ProjectInfo();
|
||||
$project_info->processInfoList($projects, $theme_data, 'theme', TRUE);
|
||||
|
||||
$this->assertTrue(!empty($projects['update_test_basetheme']), 'Valid base theme (update_test_basetheme) was found.');
|
||||
}
|
||||
|
||||
/**
|
||||
* Makes sure that if we fetch from a broken URL, sane things happen.
|
||||
*/
|
||||
public function testUpdateBrokenFetchURL() {
|
||||
$system_info = [
|
||||
'#all' => [
|
||||
'version' => '8.0.0',
|
||||
],
|
||||
'aaa_update_test' => [
|
||||
'project' => 'aaa_update_test',
|
||||
'version' => '8.x-1.0',
|
||||
'hidden' => FALSE,
|
||||
],
|
||||
'bbb_update_test' => [
|
||||
'project' => 'bbb_update_test',
|
||||
'version' => '8.x-1.0',
|
||||
'hidden' => FALSE,
|
||||
],
|
||||
'ccc_update_test' => [
|
||||
'project' => 'ccc_update_test',
|
||||
'version' => '8.x-1.0',
|
||||
'hidden' => FALSE,
|
||||
],
|
||||
];
|
||||
$this->config('update_test.settings')->set('system_info', $system_info)->save();
|
||||
|
||||
// Ensure that the update information is correct before testing.
|
||||
$this->drupalGet('admin/reports/updates');
|
||||
|
||||
$xml_mapping = [
|
||||
'drupal' => '0.0',
|
||||
'aaa_update_test' => '1_0',
|
||||
'bbb_update_test' => 'does-not-exist',
|
||||
'ccc_update_test' => '1_0',
|
||||
];
|
||||
$this->refreshUpdateStatus($xml_mapping);
|
||||
|
||||
$this->assertText(t('Up to date'));
|
||||
// We're expecting the report to say most projects are up to date, so we
|
||||
// hope that 'Up to date' is not unique.
|
||||
$this->assertNoUniqueText(t('Up to date'));
|
||||
// It should say we failed to get data, not that we're missing an update.
|
||||
$this->assertNoText(t('Update available'));
|
||||
|
||||
// We need to check that this string is found as part of a project row, not
|
||||
// just in the "Failed to get available update data" message at the top of
|
||||
// the page.
|
||||
$this->assertRaw('<div class="project-update__status">' . t('Failed to get available update data'));
|
||||
|
||||
// We should see the output messages from fetching manually.
|
||||
$this->assertUniqueText(t('Checked available update data for 3 projects.'));
|
||||
$this->assertUniqueText(t('Failed to get available update data for one project.'));
|
||||
|
||||
// The other two should be listed as projects.
|
||||
$this->assertRaw(\Drupal::l(t('AAA Update test'), Url::fromUri('http://example.com/project/aaa_update_test')), 'Link to aaa_update_test project appears.');
|
||||
$this->assertNoRaw(\Drupal::l(t('BBB Update test'), Url::fromUri('http://example.com/project/bbb_update_test')), 'Link to bbb_update_test project does not appear.');
|
||||
$this->assertRaw(\Drupal::l(t('CCC Update test'), Url::fromUri('http://example.com/project/ccc_update_test')), 'Link to bbb_update_test project appears.');
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks that hook_update_status_alter() works to change a status.
|
||||
*
|
||||
* We provide the same external data as if aaa_update_test 8.x-1.0 were
|
||||
* installed and that was the latest release. Then we use
|
||||
* hook_update_status_alter() to try to mark this as missing a security
|
||||
* update, then assert if we see the appropriate warnings on the right pages.
|
||||
*/
|
||||
public function testHookUpdateStatusAlter() {
|
||||
$update_test_config = $this->config('update_test.settings');
|
||||
$update_admin_user = $this->drupalCreateUser(['administer site configuration', 'administer software updates']);
|
||||
$this->drupalLogin($update_admin_user);
|
||||
|
||||
$system_info = [
|
||||
'#all' => [
|
||||
'version' => '8.0.0',
|
||||
],
|
||||
'aaa_update_test' => [
|
||||
'project' => 'aaa_update_test',
|
||||
'version' => '8.x-1.0',
|
||||
'hidden' => FALSE,
|
||||
],
|
||||
];
|
||||
$update_test_config->set('system_info', $system_info)->save();
|
||||
$update_status = [
|
||||
'aaa_update_test' => [
|
||||
'status' => UPDATE_NOT_SECURE,
|
||||
],
|
||||
];
|
||||
$update_test_config->set('update_status', $update_status)->save();
|
||||
$this->refreshUpdateStatus(
|
||||
[
|
||||
'drupal' => '0.0',
|
||||
'aaa_update_test' => '1_0',
|
||||
]
|
||||
);
|
||||
$this->drupalGet('admin/reports/updates');
|
||||
$this->assertRaw('<h3>' . t('Modules') . '</h3>');
|
||||
$this->assertText(t('Security update required!'));
|
||||
$this->assertRaw(\Drupal::l(t('AAA Update test'), Url::fromUri('http://example.com/project/aaa_update_test')), 'Link to aaa_update_test project appears.');
|
||||
|
||||
// Visit the reports page again without the altering and make sure the
|
||||
// status is back to normal.
|
||||
$update_test_config->set('update_status', [])->save();
|
||||
$this->drupalGet('admin/reports/updates');
|
||||
$this->assertRaw('<h3>' . t('Modules') . '</h3>');
|
||||
$this->assertNoText(t('Security update required!'));
|
||||
$this->assertRaw(\Drupal::l(t('AAA Update test'), Url::fromUri('http://example.com/project/aaa_update_test')), 'Link to aaa_update_test project appears.');
|
||||
|
||||
// Turn the altering back on and visit the Update manager UI.
|
||||
$update_test_config->set('update_status', $update_status)->save();
|
||||
$this->drupalGet('admin/modules/update');
|
||||
$this->assertText(t('Security update'));
|
||||
|
||||
// Turn the altering back off and visit the Update manager UI.
|
||||
$update_test_config->set('update_status', [])->save();
|
||||
$this->drupalGet('admin/modules/update');
|
||||
$this->assertNoText(t('Security update'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests update status of security releases.
|
||||
*
|
||||
* @param string $module_version
|
||||
* The module version the site is using.
|
||||
* @param string[] $expected_security_releases
|
||||
* The security releases, if any, that the status report should recommend.
|
||||
* @param string $expected_update_message_type
|
||||
* The type of update message expected.
|
||||
* @param string $fixture
|
||||
* The fixture file to use.
|
||||
*
|
||||
* @dataProvider securityUpdateAvailabilityProvider
|
||||
*/
|
||||
public function testSecurityUpdateAvailability($module_version, array $expected_security_releases, $expected_update_message_type, $fixture) {
|
||||
$system_info = [
|
||||
'#all' => [
|
||||
'version' => '8.0.0',
|
||||
],
|
||||
'aaa_update_test' => [
|
||||
'project' => 'aaa_update_test',
|
||||
'version' => $module_version,
|
||||
'hidden' => FALSE,
|
||||
],
|
||||
];
|
||||
$this->config('update_test.settings')->set('system_info', $system_info)->save();
|
||||
$this->refreshUpdateStatus(['drupal' => '0.0', 'aaa_update_test' => $fixture]);
|
||||
$this->assertSecurityUpdates('aaa_update_test', $expected_security_releases, $expected_update_message_type, 'table.update:nth-of-type(2)');
|
||||
}
|
||||
|
||||
/**
|
||||
* Data provider method for testSecurityUpdateAvailability().
|
||||
*
|
||||
* These test cases rely on the following fixtures containing the following
|
||||
* releases:
|
||||
* - aaa_update_test.sec.8.x-1.2.xml
|
||||
* - 8.x-1.2 Security update
|
||||
* - 8.x-1.1 Insecure
|
||||
* - 8.x-1.0 Insecure
|
||||
* - aaa_update_test.sec.8.x-1.1_8.x-1.2.xml
|
||||
* - 8.x-1.2 Security update
|
||||
* - 8.x-1.1 Security update, Insecure
|
||||
* - 8.x-1.0 Insecure
|
||||
* - aaa_update_test.sec.8.x-1.2_8.x-2.2.xml
|
||||
* - 8.x-3.0-beta2
|
||||
* - 8.x-3.0-beta1 Insecure
|
||||
* - 8.x-2.2 Security update
|
||||
* - 8.x-2.1 Security update, Insecure
|
||||
* - 8.x-2.0 Insecure
|
||||
* - 8.x-1.2 Security update
|
||||
* - 8.x-1.1 Insecure
|
||||
* - 8.x-1.0 Insecure
|
||||
* - aaa_update_test.sec.8.x-2.2_1.x_secure.xml
|
||||
* - 8.x-2.2 Security update
|
||||
* - 8.x-2.1 Security update, Insecure
|
||||
* - 8.x-2.0 Insecure
|
||||
* - 8.x-1.2
|
||||
* - 8.x-1.1
|
||||
* - 8.x-1.0
|
||||
*/
|
||||
public function securityUpdateAvailabilityProvider() {
|
||||
return [
|
||||
// Security releases available for module major release 1.
|
||||
// No releases for next major.
|
||||
'8.x-1.0, 8.x-1.2' => [
|
||||
'module_patch_version' => '8.x-1.0',
|
||||
'expected_security_releases' => ['8.x-1.2'],
|
||||
'expected_update_message_type' => static::SECURITY_UPDATE_REQUIRED,
|
||||
'fixture' => 'sec.8.x-1.2',
|
||||
],
|
||||
// Two security releases available for module major release 1.
|
||||
// 8.x-1.1 security release marked as insecure.
|
||||
// No releases for next major.
|
||||
'8.x-1.0, 8.x-1.1 8.x-1.2' => [
|
||||
'module_patch_version' => '8.x-1.0',
|
||||
'expected_security_releases' => ['8.x-1.2'],
|
||||
'expected_update_message_type' => static::SECURITY_UPDATE_REQUIRED,
|
||||
'fixture' => 'sec.8.x-1.1_8.x-1.2',
|
||||
],
|
||||
// Security release available for module major release 2.
|
||||
// No releases for next major.
|
||||
'8.x-2.0, 8.x-2.2' => [
|
||||
'module_patch_version' => '8.x-2.0',
|
||||
'expected_security_releases' => ['8.x-2.2'],
|
||||
'expected_update_message_type' => static::SECURITY_UPDATE_REQUIRED,
|
||||
'fixture' => 'sec.8.x-2.2_1.x_secure',
|
||||
],
|
||||
'8.x-2.2, 8.x-1.2 8.x-2.2' => [
|
||||
'module_patch_version' => '8.x-2.2',
|
||||
'expected_security_releases' => [],
|
||||
'expected_update_message_type' => static::UPDATE_NONE,
|
||||
'fixture' => 'sec.8.x-1.2_8.x-2.2',
|
||||
],
|
||||
// Security release available for module major release 1.
|
||||
// Security release also available for next major.
|
||||
'8.x-1.0, 8.x-1.2 8.x-2.2' => [
|
||||
'module_patch_version' => '8.x-1.0',
|
||||
'expected_security_releases' => ['8.x-1.2'],
|
||||
'expected_update_message_type' => static::SECURITY_UPDATE_REQUIRED,
|
||||
'fixture' => 'sec.8.x-1.2_8.x-2.2',
|
||||
],
|
||||
// No security release available for module major release 1 but 1.x
|
||||
// releases are not marked as insecure.
|
||||
// Security release available for next major.
|
||||
'8.x-1.0, 8.x-2.2, not insecure' => [
|
||||
'module_patch_version' => '8.x-1.0',
|
||||
'expected_security_releases' => [],
|
||||
'expected_update_message_type' => static::UPDATE_AVAILABLE,
|
||||
'fixture' => 'sec.8.x-2.2_1.x_secure',
|
||||
],
|
||||
// On latest security release for module major release 1.
|
||||
// Security release also available for next major.
|
||||
'8.x-1.2, 8.x-1.2 8.x-2.2' => [
|
||||
'module_patch_version' => '8.x-1.2',
|
||||
'expected_security_release' => [],
|
||||
'expected_update_message_type' => static::UPDATE_NONE,
|
||||
'fixture' => 'sec.8.x-1.2_8.x-2.2',
|
||||
],
|
||||
// @todo In https://www.drupal.org/node/2865920 add test cases:
|
||||
// - 8.x-2.0 using fixture 'sec.8.x-1.2_8.x-2.2' to ensure that 8.x-2.2
|
||||
// is the only security update.
|
||||
// - 8.x-3.0-beta1 using fixture 'sec.8.x-1.2_8.x-2.2' to ensure that
|
||||
// 8.x-2.2 is the only security update.
|
||||
];
|
||||
}
|
||||
|
||||
}
|
545
web/core/modules/update/tests/src/Functional/UpdateCoreTest.php
Normal file
545
web/core/modules/update/tests/src/Functional/UpdateCoreTest.php
Normal file
|
@ -0,0 +1,545 @@
|
|||
<?php
|
||||
|
||||
namespace Drupal\Tests\update\Functional;
|
||||
|
||||
use Drupal\Core\Url;
|
||||
use Drupal\Tests\Traits\Core\CronRunTrait;
|
||||
|
||||
/**
|
||||
* Tests the Update Manager module through a series of functional tests using
|
||||
* mock XML data.
|
||||
*
|
||||
* @group update
|
||||
*/
|
||||
class UpdateCoreTest extends UpdateTestBase {
|
||||
|
||||
use CronRunTrait;
|
||||
|
||||
/**
|
||||
* Modules to enable.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public static $modules = ['update_test', 'update', 'language', 'block'];
|
||||
|
||||
protected function setUp() {
|
||||
parent::setUp();
|
||||
$admin_user = $this->drupalCreateUser(['administer site configuration', 'administer modules', 'administer themes']);
|
||||
$this->drupalLogin($admin_user);
|
||||
$this->drupalPlaceBlock('local_actions_block');
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the version to x.x.x when no project-specific mapping is defined.
|
||||
*
|
||||
* @param string $version
|
||||
* The version.
|
||||
*/
|
||||
protected function setSystemInfo($version) {
|
||||
$setting = [
|
||||
'#all' => [
|
||||
'version' => $version,
|
||||
],
|
||||
];
|
||||
$this->config('update_test.settings')->set('system_info', $setting)->save();
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests the Update Manager module when no updates are available.
|
||||
*/
|
||||
public function testNoUpdatesAvailable() {
|
||||
foreach ([0, 1] as $minor_version) {
|
||||
foreach ([0, 1] as $patch_version) {
|
||||
foreach (['-alpha1', '-beta1', ''] as $extra_version) {
|
||||
$this->setSystemInfo("8.$minor_version.$patch_version" . $extra_version);
|
||||
$this->refreshUpdateStatus(['drupal' => "$minor_version.$patch_version" . $extra_version]);
|
||||
$this->standardTests();
|
||||
$this->assertText(t('Up to date'));
|
||||
$this->assertNoText(t('Update available'));
|
||||
$this->assertNoText(t('Security update required!'));
|
||||
$this->assertRaw('check.svg', 'Check icon was found.');
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests the Update Manager module when one normal update is available.
|
||||
*/
|
||||
public function testNormalUpdateAvailable() {
|
||||
$this->setSystemInfo('8.0.0');
|
||||
|
||||
// Ensure that the update check requires a token.
|
||||
$this->drupalGet('admin/reports/updates/check');
|
||||
$this->assertResponse(403, 'Accessing admin/reports/updates/check without a CSRF token results in access denied.');
|
||||
|
||||
foreach ([0, 1] as $minor_version) {
|
||||
foreach (['-alpha1', '-beta1', ''] as $extra_version) {
|
||||
$this->refreshUpdateStatus(['drupal' => "$minor_version.1" . $extra_version]);
|
||||
$this->standardTests();
|
||||
$this->drupalGet('admin/reports/updates');
|
||||
$this->clickLink(t('Check manually'));
|
||||
$this->checkForMetaRefresh();
|
||||
$this->assertNoText(t('Security update required!'));
|
||||
$this->assertRaw(\Drupal::l("8.$minor_version.1" . $extra_version, Url::fromUri("http://example.com/drupal-8-$minor_version-1$extra_version-release")), 'Link to release appears.');
|
||||
$this->assertRaw(\Drupal::l(t('Download'), Url::fromUri("http://example.com/drupal-8-$minor_version-1$extra_version.tar.gz")), 'Link to download appears.');
|
||||
$this->assertRaw(\Drupal::l(t('Release notes'), Url::fromUri("http://example.com/drupal-8-$minor_version-1$extra_version-release")), 'Link to release notes appears.');
|
||||
|
||||
switch ($minor_version) {
|
||||
case 0:
|
||||
// Both stable and unstable releases are available.
|
||||
// A stable release is the latest.
|
||||
if ($extra_version == '') {
|
||||
$this->assertNoText(t('Up to date'));
|
||||
$this->assertText(t('Update available'));
|
||||
$this->assertText(t('Recommended version:'));
|
||||
$this->assertNoText(t('Latest version:'));
|
||||
$this->assertRaw('warning.svg', 'Warning icon was found.');
|
||||
}
|
||||
// Only unstable releases are available.
|
||||
// An unstable release is the latest.
|
||||
else {
|
||||
$this->assertText(t('Up to date'));
|
||||
$this->assertNoText(t('Update available'));
|
||||
$this->assertNoText(t('Recommended version:'));
|
||||
$this->assertText(t('Latest version:'));
|
||||
$this->assertRaw('check.svg', 'Check icon was found.');
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
// Both stable and unstable releases are available.
|
||||
// A stable release is the latest.
|
||||
if ($extra_version == '') {
|
||||
$this->assertNoText(t('Up to date'));
|
||||
$this->assertText(t('Update available'));
|
||||
$this->assertText(t('Recommended version:'));
|
||||
$this->assertNoText(t('Latest version:'));
|
||||
$this->assertRaw('warning.svg', 'Warning icon was found.');
|
||||
}
|
||||
// Both stable and unstable releases are available.
|
||||
// An unstable release is the latest.
|
||||
else {
|
||||
$this->assertNoText(t('Up to date'));
|
||||
$this->assertText(t('Update available'));
|
||||
$this->assertText(t('Recommended version:'));
|
||||
$this->assertText(t('Latest version:'));
|
||||
$this->assertRaw('warning.svg', 'Warning icon was found.');
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests the Update Manager module when a major update is available.
|
||||
*/
|
||||
public function testMajorUpdateAvailable() {
|
||||
foreach ([0, 1] as $minor_version) {
|
||||
foreach ([0, 1] as $patch_version) {
|
||||
foreach (['-alpha1', '-beta1', ''] as $extra_version) {
|
||||
$this->setSystemInfo("8.$minor_version.$patch_version" . $extra_version);
|
||||
$this->refreshUpdateStatus(['drupal' => '9']);
|
||||
$this->standardTests();
|
||||
$this->drupalGet('admin/reports/updates');
|
||||
$this->clickLink(t('Check manually'));
|
||||
$this->checkForMetaRefresh();
|
||||
$this->assertNoText(t('Security update required!'));
|
||||
$this->assertRaw(\Drupal::l('9.0.0', Url::fromUri("http://example.com/drupal-9-0-0-release")), 'Link to release appears.');
|
||||
$this->assertRaw(\Drupal::l(t('Download'), Url::fromUri("http://example.com/drupal-9-0-0.tar.gz")), 'Link to download appears.');
|
||||
$this->assertRaw(\Drupal::l(t('Release notes'), Url::fromUri("http://example.com/drupal-9-0-0-release")), 'Link to release notes appears.');
|
||||
$this->assertNoText(t('Up to date'));
|
||||
$this->assertText(t('Not supported!'));
|
||||
$this->assertText(t('Recommended version:'));
|
||||
$this->assertNoText(t('Latest version:'));
|
||||
$this->assertRaw('error.svg', 'Error icon was found.');
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests the Update Manager module when a security update is available.
|
||||
*
|
||||
* @param string $site_patch_version
|
||||
* The patch version to set the site to for testing.
|
||||
* @param string[] $expected_security_releases
|
||||
* The security releases, if any, that the status report should recommend.
|
||||
* @param string $expected_update_message_type
|
||||
* The type of update message expected.
|
||||
* @param string $fixture
|
||||
* The test fixture that contains the test XML.
|
||||
*
|
||||
* @dataProvider securityUpdateAvailabilityProvider
|
||||
*/
|
||||
public function testSecurityUpdateAvailability($site_patch_version, array $expected_security_releases, $expected_update_message_type, $fixture) {
|
||||
$this->setSystemInfo("8.$site_patch_version");
|
||||
$this->refreshUpdateStatus(['drupal' => $fixture]);
|
||||
$this->assertSecurityUpdates('drupal-8', $expected_security_releases, $expected_update_message_type, 'table.update');
|
||||
}
|
||||
|
||||
/**
|
||||
* Data provider method for testSecurityUpdateAvailability().
|
||||
*
|
||||
* These test cases rely on the following fixtures containing the following
|
||||
* releases:
|
||||
* - drupal.sec.0.1_0.2.xml
|
||||
* - 8.0.2 Security update
|
||||
* - 8.0.1 Security update, Insecure
|
||||
* - 8.0.0 Insecure
|
||||
* - drupal.sec.0.2.xml
|
||||
* - 8.0.2 Security update
|
||||
* - 8.0.1 Insecure
|
||||
* - 8.0.0 Insecure
|
||||
* - drupal.sec.0.2-rc2.xml
|
||||
* - 8.2.0-rc2 Security update
|
||||
* - 8.2.0-rc1 Insecure
|
||||
* - 8.2.0-beta2 Insecure
|
||||
* - 8.2.0-beta1 Insecure
|
||||
* - 8.2.0-alpha2 Insecure
|
||||
* - 8.2.0-alpha1 Insecure
|
||||
* - 8.1.2 Security update
|
||||
* - 8.1.1 Insecure
|
||||
* - 8.1.0 Insecure
|
||||
* - 8.0.2 Security update
|
||||
* - 8.0.1 Insecure
|
||||
* - 8.0.0 Insecure
|
||||
* - drupal.sec.1.2.xml
|
||||
* - 8.1.2 Security update
|
||||
* - 8.1.1 Insecure
|
||||
* - 8.1.0 Insecure
|
||||
* - 8.0.2
|
||||
* - 8.0.1
|
||||
* - 8.0.0
|
||||
* - drupal.sec.1.2_insecure.xml
|
||||
* - 8.1.2 Security update
|
||||
* - 8.1.1 Insecure
|
||||
* - 8.1.0 Insecure
|
||||
* - 8.0.2 Insecure
|
||||
* - 8.0.1 Insecure
|
||||
* - 8.0.0 Insecure
|
||||
* - drupal.sec.0.2-rc2-b.xml
|
||||
* - 8.2.0-rc2
|
||||
* - 8.2.0-rc1
|
||||
* - 8.2.0-beta2
|
||||
* - 8.2.0-beta1
|
||||
* - 8.2.0-alpha2
|
||||
* - 8.2.0-alpha1
|
||||
* - 8.1.2 Security update
|
||||
* - 8.1.1 Insecure
|
||||
* - 8.1.0 Insecure
|
||||
* - 8.0.2 Security update
|
||||
* - 8.0.1 Insecure
|
||||
* - 8.0.0 Insecure
|
||||
*/
|
||||
public function securityUpdateAvailabilityProvider() {
|
||||
$test_cases = [
|
||||
// Security release available for site minor release 0.
|
||||
// No releases for next minor.
|
||||
'0.0, 0.2' => [
|
||||
'site_patch_version' => '0.0',
|
||||
'expected_security_releases' => ['0.2'],
|
||||
'expected_update_message_type' => static::SECURITY_UPDATE_REQUIRED,
|
||||
'fixture' => 'sec.0.2',
|
||||
],
|
||||
// Site on latest security release available for site minor release 0.
|
||||
// Minor release 1 also has a security release, and the current release
|
||||
// is marked as insecure.
|
||||
'0.2, 0.2' => [
|
||||
'site_patch_version' => '0.2',
|
||||
'expected_security_release' => ['1.2', '2.0-rc2'],
|
||||
'expected_update_message_type' => static::UPDATE_AVAILABLE,
|
||||
'fixture' => 'sec.0.2-rc2',
|
||||
],
|
||||
// Two security releases available for site minor release 0.
|
||||
// 0.1 security release marked as insecure.
|
||||
// No releases for next minor.
|
||||
'0.0, 0.1 0.2' => [
|
||||
'site_patch_version' => '0.0',
|
||||
'expected_security_releases' => ['0.2'],
|
||||
'expected_update_message_type' => static::SECURITY_UPDATE_REQUIRED,
|
||||
'fixture' => 'sec.0.1_0.2',
|
||||
],
|
||||
// Security release available for site minor release 1.
|
||||
// No releases for next minor.
|
||||
'1.0, 1.2' => [
|
||||
'site_patch_version' => '1.0',
|
||||
'expected_security_releases' => ['1.2'],
|
||||
'expected_update_message_type' => static::SECURITY_UPDATE_REQUIRED,
|
||||
'fixture' => 'sec.1.2',
|
||||
],
|
||||
// Security release available for site minor release 0.
|
||||
// Security release also available for next minor.
|
||||
'0.0, 0.2 1.2' => [
|
||||
'site_patch_version' => '0.0',
|
||||
'expected_security_releases' => ['0.2', '1.2', '2.0-rc2'],
|
||||
'expected_update_message_type' => static::SECURITY_UPDATE_REQUIRED,
|
||||
'fixture' => 'sec.0.2-rc2',
|
||||
],
|
||||
// No newer security release for site minor 1.
|
||||
// Previous minor has security release.
|
||||
'1.2, 0.2 1.2' => [
|
||||
'site_patch_version' => '1.2',
|
||||
'expected_security_releases' => [],
|
||||
'expected_update_message_type' => static::UPDATE_NONE,
|
||||
'fixture' => 'sec.0.2-rc2',
|
||||
],
|
||||
// No security release available for site minor release 0.
|
||||
// Security release available for next minor.
|
||||
'0.0, 1.2, insecure' => [
|
||||
'site_patch_version' => '0.0',
|
||||
'expected_security_releases' => ['1.2'],
|
||||
'expected_update_message_type' => static::SECURITY_UPDATE_REQUIRED,
|
||||
'fixture' => 'sec.1.2_insecure',
|
||||
],
|
||||
// All releases for minor 0 are secure.
|
||||
// Security release available for next minor.
|
||||
'0.0, 1.2, secure' => [
|
||||
'site_patch_version' => '0.0',
|
||||
'expected_security_release' => ['1.2'],
|
||||
'expected_update_message_type' => static::UPDATE_AVAILABLE,
|
||||
'fixture' => 'sec.1.2',
|
||||
],
|
||||
'0.2, 1.2, secure' => [
|
||||
'site_patch_version' => '0.2',
|
||||
'expected_security_release' => ['1.2'],
|
||||
'expected_update_message_type' => static::UPDATE_AVAILABLE,
|
||||
'fixture' => 'sec.1.2',
|
||||
],
|
||||
// Site on 2.0-rc2 which is a security release.
|
||||
'2.0-rc2, 0.2 1.2' => [
|
||||
'site_patch_version' => '2.0-rc2',
|
||||
'expected_security_releases' => [],
|
||||
'expected_update_message_type' => static::UPDATE_NONE,
|
||||
'fixture' => 'sec.0.2-rc2',
|
||||
],
|
||||
];
|
||||
$pre_releases = [
|
||||
'2.0-alpha1',
|
||||
'2.0-alpha2',
|
||||
'2.0-beta1',
|
||||
'2.0-beta2',
|
||||
'2.0-rc1',
|
||||
'2.0-rc2',
|
||||
];
|
||||
|
||||
// If the site is on an alpha/beta/RC of an upcoming minor and none of the
|
||||
// alpha/beta/RC versions are marked insecure, no security update should be
|
||||
// required.
|
||||
foreach ($pre_releases as $pre_release) {
|
||||
$test_cases["Pre-release:$pre_release, no security update"] = [
|
||||
'site_patch_version' => $pre_release,
|
||||
'expected_security_releases' => [],
|
||||
'expected_update_message_type' => $pre_release === '2.0-rc2' ? static::UPDATE_NONE : static::UPDATE_AVAILABLE,
|
||||
'fixture' => 'sec.0.2-rc2-b',
|
||||
];
|
||||
}
|
||||
|
||||
// @todo In https://www.drupal.org/node/2865920 add test cases:
|
||||
// - For all pre-releases for 8.2.0 except 8.2.0-rc2 using the
|
||||
// 'sec.0.2-rc2' fixture to ensure that 8.2.0-rc2 is the only security
|
||||
// update.
|
||||
// - For 8.1.0 using fixture 'sec.0.2-rc2' to ensure that only security
|
||||
// updates are 8.1.2 and 8.2.0-rc2.
|
||||
return $test_cases;
|
||||
}
|
||||
|
||||
/**
|
||||
* Ensures proper results where there are date mismatches among modules.
|
||||
*/
|
||||
public function testDatestampMismatch() {
|
||||
$system_info = [
|
||||
'#all' => [
|
||||
// We need to think we're running a -dev snapshot to see dates.
|
||||
'version' => '8.1.0-dev',
|
||||
'datestamp' => time(),
|
||||
],
|
||||
'block' => [
|
||||
// This is 2001-09-09 01:46:40 GMT, so test for "2001-Sep-".
|
||||
'datestamp' => '1000000000',
|
||||
],
|
||||
];
|
||||
$this->config('update_test.settings')->set('system_info', $system_info)->save();
|
||||
$this->refreshUpdateStatus(['drupal' => 'dev']);
|
||||
$this->assertNoText(t('2001-Sep-'));
|
||||
$this->assertText(t('Up to date'));
|
||||
$this->assertNoText(t('Update available'));
|
||||
$this->assertNoText(t('Security update required!'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks that running cron updates the list of available updates.
|
||||
*/
|
||||
public function testModulePageRunCron() {
|
||||
$this->setSystemInfo('8.0.0');
|
||||
$this->config('update.settings')
|
||||
->set('fetch.url', Url::fromRoute('update_test.update_test')->setAbsolute()->toString())
|
||||
->save();
|
||||
$this->config('update_test.settings')
|
||||
->set('xml_map', ['drupal' => '0.0'])
|
||||
->save();
|
||||
|
||||
$this->cronRun();
|
||||
$this->drupalGet('admin/modules');
|
||||
$this->assertNoText(t('No update information available.'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks the messages at admin/modules when the site is up to date.
|
||||
*/
|
||||
public function testModulePageUpToDate() {
|
||||
$this->setSystemInfo('8.0.0');
|
||||
// Instead of using refreshUpdateStatus(), set these manually.
|
||||
$this->config('update.settings')
|
||||
->set('fetch.url', Url::fromRoute('update_test.update_test')->setAbsolute()->toString())
|
||||
->save();
|
||||
$this->config('update_test.settings')
|
||||
->set('xml_map', ['drupal' => '0.0'])
|
||||
->save();
|
||||
|
||||
$this->drupalGet('admin/reports/updates');
|
||||
$this->clickLink(t('Check manually'));
|
||||
$this->checkForMetaRefresh();
|
||||
$this->assertText(t('Checked available update data for one project.'));
|
||||
$this->drupalGet('admin/modules');
|
||||
$this->assertNoText(t('There are updates available for your version of Drupal.'));
|
||||
$this->assertNoText(t('There is a security update available for your version of Drupal.'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks the messages at admin/modules when an update is missing.
|
||||
*/
|
||||
public function testModulePageRegularUpdate() {
|
||||
$this->setSystemInfo('8.0.0');
|
||||
// Instead of using refreshUpdateStatus(), set these manually.
|
||||
$this->config('update.settings')
|
||||
->set('fetch.url', Url::fromRoute('update_test.update_test')->setAbsolute()->toString())
|
||||
->save();
|
||||
$this->config('update_test.settings')
|
||||
->set('xml_map', ['drupal' => '0.1'])
|
||||
->save();
|
||||
|
||||
$this->drupalGet('admin/reports/updates');
|
||||
$this->clickLink(t('Check manually'));
|
||||
$this->checkForMetaRefresh();
|
||||
$this->assertText(t('Checked available update data for one project.'));
|
||||
$this->drupalGet('admin/modules');
|
||||
$this->assertText(t('There are updates available for your version of Drupal.'));
|
||||
$this->assertNoText(t('There is a security update available for your version of Drupal.'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks the messages at admin/modules when a security update is missing.
|
||||
*/
|
||||
public function testModulePageSecurityUpdate() {
|
||||
$this->setSystemInfo('8.0.0');
|
||||
// Instead of using refreshUpdateStatus(), set these manually.
|
||||
$this->config('update.settings')
|
||||
->set('fetch.url', Url::fromRoute('update_test.update_test')->setAbsolute()->toString())
|
||||
->save();
|
||||
$this->config('update_test.settings')
|
||||
->set('xml_map', ['drupal' => 'sec.0.2'])
|
||||
->save();
|
||||
|
||||
$this->drupalGet('admin/reports/updates');
|
||||
$this->clickLink(t('Check manually'));
|
||||
$this->checkForMetaRefresh();
|
||||
$this->assertText(t('Checked available update data for one project.'));
|
||||
$this->drupalGet('admin/modules');
|
||||
$this->assertNoText(t('There are updates available for your version of Drupal.'));
|
||||
$this->assertText(t('There is a security update available for your version of Drupal.'));
|
||||
|
||||
// Make sure admin/appearance warns you you're missing a security update.
|
||||
$this->drupalGet('admin/appearance');
|
||||
$this->assertNoText(t('There are updates available for your version of Drupal.'));
|
||||
$this->assertText(t('There is a security update available for your version of Drupal.'));
|
||||
|
||||
// Make sure duplicate messages don't appear on Update status pages.
|
||||
$this->drupalGet('admin/reports/status');
|
||||
// We're expecting "There is a security update..." inside the status report
|
||||
// itself, but the message from
|
||||
// \Drupal\Core\Messenger\MessengerInterface::addStatus() appears as an li
|
||||
// so we can prefix with that and search for the raw HTML.
|
||||
$this->assertNoRaw('<li>' . t('There is a security update available for your version of Drupal.'));
|
||||
|
||||
$this->drupalGet('admin/reports/updates');
|
||||
$this->assertNoText(t('There is a security update available for your version of Drupal.'));
|
||||
|
||||
$this->drupalGet('admin/reports/updates/settings');
|
||||
$this->assertNoText(t('There is a security update available for your version of Drupal.'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests the Update Manager module when the update server returns 503 errors.
|
||||
*/
|
||||
public function testServiceUnavailable() {
|
||||
$this->refreshUpdateStatus([], '503-error');
|
||||
// Ensure that no "Warning: SimpleXMLElement..." parse errors are found.
|
||||
$this->assertNoText('SimpleXMLElement');
|
||||
$this->assertUniqueText(t('Failed to get available update data for one project.'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests that exactly one fetch task per project is created and not more.
|
||||
*/
|
||||
public function testFetchTasks() {
|
||||
$projecta = [
|
||||
'name' => 'aaa_update_test',
|
||||
];
|
||||
$projectb = [
|
||||
'name' => 'bbb_update_test',
|
||||
];
|
||||
$queue = \Drupal::queue('update_fetch_tasks');
|
||||
$this->assertEqual($queue->numberOfItems(), 0, 'Queue is empty');
|
||||
update_create_fetch_task($projecta);
|
||||
$this->assertEqual($queue->numberOfItems(), 1, 'Queue contains one item');
|
||||
update_create_fetch_task($projectb);
|
||||
$this->assertEqual($queue->numberOfItems(), 2, 'Queue contains two items');
|
||||
// Try to add project a again.
|
||||
update_create_fetch_task($projecta);
|
||||
$this->assertEqual($queue->numberOfItems(), 2, 'Queue still contains two items');
|
||||
|
||||
// Clear storage and try again.
|
||||
update_storage_clear();
|
||||
update_create_fetch_task($projecta);
|
||||
$this->assertEqual($queue->numberOfItems(), 2, 'Queue contains two items');
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks language module in core package at admin/reports/updates.
|
||||
*/
|
||||
public function testLanguageModuleUpdate() {
|
||||
$this->setSystemInfo('8.0.0');
|
||||
// Instead of using refreshUpdateStatus(), set these manually.
|
||||
$this->config('update.settings')
|
||||
->set('fetch.url', Url::fromRoute('update_test.update_test')->setAbsolute()->toString())
|
||||
->save();
|
||||
$this->config('update_test.settings')
|
||||
->set('xml_map', ['drupal' => '0.1'])
|
||||
->save();
|
||||
|
||||
$this->drupalGet('admin/reports/updates');
|
||||
$this->assertText(t('Language'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Ensures that the local actions appear.
|
||||
*/
|
||||
public function testLocalActions() {
|
||||
$admin_user = $this->drupalCreateUser(['administer site configuration', 'administer modules', 'administer software updates', 'administer themes']);
|
||||
$this->drupalLogin($admin_user);
|
||||
|
||||
$this->drupalGet('admin/modules');
|
||||
$this->clickLink(t('Install new module'));
|
||||
$this->assertUrl('admin/modules/install');
|
||||
|
||||
$this->drupalGet('admin/appearance');
|
||||
$this->clickLink(t('Install new theme'));
|
||||
$this->assertUrl('admin/theme/install');
|
||||
|
||||
$this->drupalGet('admin/reports/updates');
|
||||
$this->clickLink(t('Install new module or theme'));
|
||||
$this->assertUrl('admin/reports/updates/install');
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,47 @@
|
|||
<?php
|
||||
|
||||
namespace Drupal\Tests\update\Functional;
|
||||
|
||||
/**
|
||||
* Tests the update_delete_file_if_stale() function.
|
||||
*
|
||||
* @group update
|
||||
*/
|
||||
class UpdateDeleteFileIfStaleTest extends UpdateTestBase {
|
||||
|
||||
/**
|
||||
* Modules to enable.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public static $modules = ['update'];
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function setUp() {
|
||||
parent::setUp();
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests the deletion of stale files.
|
||||
*/
|
||||
public function testUpdateDeleteFileIfStale() {
|
||||
$file_name = file_unmanaged_save_data($this->randomMachineName());
|
||||
$this->assertNotNull($file_name);
|
||||
|
||||
// During testing the file change and the stale checking occurs in the same
|
||||
// request, so the beginning of request will be before the file changes and
|
||||
// REQUEST_TIME - $filectime is negative. Set the maximum age to a number
|
||||
// even smaller than that.
|
||||
$this->config('system.file')
|
||||
->set('temporary_maximum_age', -100000)
|
||||
->save();
|
||||
|
||||
$file_path = \Drupal::service('file_system')->realpath($file_name);
|
||||
update_delete_file_if_stale($file_path);
|
||||
|
||||
$this->assertFalse(is_file($file_path));
|
||||
}
|
||||
|
||||
}
|
170
web/core/modules/update/tests/src/Functional/UpdateTestBase.php
Normal file
170
web/core/modules/update/tests/src/Functional/UpdateTestBase.php
Normal file
|
@ -0,0 +1,170 @@
|
|||
<?php
|
||||
|
||||
namespace Drupal\Tests\update\Functional;
|
||||
|
||||
use Drupal\Core\DrupalKernel;
|
||||
use Drupal\Core\Url;
|
||||
use Drupal\Tests\BrowserTestBase;
|
||||
|
||||
/**
|
||||
* Defines some shared functions used by all update tests.
|
||||
*
|
||||
* The overarching methodology of these tests is we need to compare a given
|
||||
* state of installed modules and themes (e.g., version, project grouping,
|
||||
* timestamps, etc) against a current state of what the release history XML
|
||||
* files we fetch say is available. We have dummy XML files (in the
|
||||
* core/modules/update/tests directory) that describe various scenarios of
|
||||
* what's available for different test projects, and we have dummy .info file
|
||||
* data (specified via hook_system_info_alter() in the update_test helper
|
||||
* module) describing what's currently installed. Each test case defines a set
|
||||
* of projects to install, their current state (via the
|
||||
* 'update_test_system_info' variable) and the desired available update data
|
||||
* (via the 'update_test_xml_map' variable), and then performs a series of
|
||||
* assertions that the report matches our expectations given the specific
|
||||
* initial state and availability scenario.
|
||||
*/
|
||||
abstract class UpdateTestBase extends BrowserTestBase {
|
||||
|
||||
/**
|
||||
* Denotes a security update will be required in the test case.
|
||||
*/
|
||||
const SECURITY_UPDATE_REQUIRED = 'SECURITY_UPDATE_REQUIRED';
|
||||
|
||||
/**
|
||||
* Denotes an update will be available in the test case.
|
||||
*/
|
||||
const UPDATE_AVAILABLE = 'UPDATE_AVAILABLE';
|
||||
|
||||
/**
|
||||
* Denotes no update will be available in the test case.
|
||||
*/
|
||||
const UPDATE_NONE = 'UPDATE_NONE';
|
||||
|
||||
protected function setUp() {
|
||||
parent::setUp();
|
||||
|
||||
// Change the root path which Update Manager uses to install and update
|
||||
// projects to be inside the testing site directory. See
|
||||
// \Drupal\update\UpdateRootFactory::get() for equivalent changes to the
|
||||
// test child site.
|
||||
$request = \Drupal::request();
|
||||
$update_root = $this->container->get('update.root') . '/' . DrupalKernel::findSitePath($request);
|
||||
$this->container->set('update.root', $update_root);
|
||||
\Drupal::setContainer($this->container);
|
||||
|
||||
// Create the directories within the root path within which the Update
|
||||
// Manager will install projects.
|
||||
foreach (drupal_get_updaters() as $updater_info) {
|
||||
$updater = $updater_info['class'];
|
||||
$install_directory = $update_root . '/' . $updater::getRootDirectoryRelativePath();
|
||||
if (!is_dir($install_directory)) {
|
||||
mkdir($install_directory);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Refreshes the update status based on the desired available update scenario.
|
||||
*
|
||||
* @param $xml_map
|
||||
* Array that maps project names to availability scenarios to fetch. The key
|
||||
* '#all' is used if a project-specific mapping is not defined.
|
||||
* @param $url
|
||||
* (optional) A string containing the URL to fetch update data from.
|
||||
* Defaults to 'update-test'.
|
||||
*
|
||||
* @see \Drupal\update_test\Controller\UpdateTestController::updateTest()
|
||||
*/
|
||||
protected function refreshUpdateStatus($xml_map, $url = 'update-test') {
|
||||
// Tell the Update Manager module to fetch from the URL provided by
|
||||
// update_test module.
|
||||
$this->config('update.settings')->set('fetch.url', Url::fromUri('base:' . $url, ['absolute' => TRUE])->toString())->save();
|
||||
// Save the map for UpdateTestController::updateTest() to use.
|
||||
$this->config('update_test.settings')->set('xml_map', $xml_map)->save();
|
||||
// Manually check the update status.
|
||||
$this->drupalGet('admin/reports/updates');
|
||||
$this->clickLink(t('Check manually'));
|
||||
$this->checkForMetaRefresh();
|
||||
}
|
||||
|
||||
/**
|
||||
* Runs a series of assertions that are applicable to all update statuses.
|
||||
*/
|
||||
protected function standardTests() {
|
||||
$this->assertRaw('<h3>' . t('Drupal core') . '</h3>');
|
||||
$this->assertRaw(\Drupal::l(t('Drupal'), Url::fromUri('http://example.com/project/drupal')), 'Link to the Drupal project appears.');
|
||||
$this->assertNoText(t('No available releases found'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Asserts the expected security updates are displayed correctly on the page.
|
||||
*
|
||||
* @param string $project_path_part
|
||||
* The project path part needed for the download and release links.
|
||||
* @param string[] $expected_security_releases
|
||||
* The security releases, if any, that the status report should recommend.
|
||||
* @param string $expected_update_message_type
|
||||
* The type of update message expected.
|
||||
* @param string $update_element_css_locator
|
||||
* The CSS locator for the page element that contains the security updates.
|
||||
*/
|
||||
protected function assertSecurityUpdates($project_path_part, array $expected_security_releases, $expected_update_message_type, $update_element_css_locator) {
|
||||
$assert_session = $this->assertSession();
|
||||
$page = $this->getSession()->getPage();
|
||||
$this->standardTests();
|
||||
$assert_session->elementTextNotContains('css', $update_element_css_locator, 'Not supported');
|
||||
$all_security_release_urls = array_map(function ($link) {
|
||||
return $link->getAttribute('href');
|
||||
}, $page->findAll('css', "$update_element_css_locator .version-security a[href$='-release']"));
|
||||
$all_security_download_urls = array_map(function ($link) {
|
||||
return $link->getAttribute('href');
|
||||
}, $page->findAll('css', "$update_element_css_locator .version-security a[href$='.tar.gz']"));
|
||||
if ($expected_security_releases) {
|
||||
$expected_download_urls = [];
|
||||
$expected_release_urls = [];
|
||||
if ($expected_update_message_type === static::SECURITY_UPDATE_REQUIRED) {
|
||||
$assert_session->elementTextNotContains('css', $update_element_css_locator, 'Update available');
|
||||
$assert_session->elementTextContains('css', $update_element_css_locator, 'Security update required!');
|
||||
$assert_session->responseContains('error.svg', 'Error icon was found.');
|
||||
}
|
||||
else {
|
||||
$assert_session->elementTextContains('css', $update_element_css_locator, 'Update available');
|
||||
$assert_session->elementTextNotContains('css', $update_element_css_locator, 'Security update required!');
|
||||
}
|
||||
$assert_session->elementTextNotContains('css', $update_element_css_locator, 'Up to date');
|
||||
foreach ($expected_security_releases as $expected_security_release) {
|
||||
$expected_url_version = str_replace('.', '-', $expected_security_release);
|
||||
$release_url = "http://example.com/$project_path_part-$expected_url_version-release";
|
||||
$download_url = "http://example.com/$project_path_part-$expected_url_version.tar.gz";
|
||||
$expected_release_urls[] = $release_url;
|
||||
$expected_download_urls[] = $download_url;
|
||||
// Ensure the expected links are security links.
|
||||
$this->assertTrue(in_array($release_url, $all_security_release_urls), "Release $release_url is a security release link.");
|
||||
$this->assertTrue(in_array($download_url, $all_security_download_urls), "Release $download_url is a security download link.");
|
||||
$assert_session->linkByHrefExists($release_url);
|
||||
$assert_session->linkByHrefExists($download_url);
|
||||
}
|
||||
// Ensure no other links are shown as security releases.
|
||||
$this->assertEquals([], array_diff($all_security_release_urls, $expected_release_urls));
|
||||
$this->assertEquals([], array_diff($all_security_download_urls, $expected_download_urls));
|
||||
}
|
||||
else {
|
||||
// Ensure there were no security links.
|
||||
$this->assertEquals([], $all_security_release_urls);
|
||||
$this->assertEquals([], $all_security_download_urls);
|
||||
$assert_session->pageTextNotContains('Security update required!');
|
||||
if ($expected_update_message_type === static::UPDATE_AVAILABLE) {
|
||||
$assert_session->elementTextContains('css', $update_element_css_locator, 'Update available');
|
||||
$assert_session->elementTextNotContains('css', $update_element_css_locator, 'Up to date');
|
||||
}
|
||||
elseif ($expected_update_message_type === static::UPDATE_NONE) {
|
||||
$assert_session->elementTextNotContains('css', $update_element_css_locator, 'Update available');
|
||||
$assert_session->elementTextContains('css', $update_element_css_locator, 'Up to date');
|
||||
}
|
||||
else {
|
||||
$this->fail('Unexpected value for $expected_update_message_type: ' . $expected_update_message_type);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,200 @@
|
|||
<?php
|
||||
|
||||
namespace Drupal\Tests\update\Functional;
|
||||
|
||||
use Drupal\Core\Extension\InfoParserDynamic;
|
||||
use Drupal\Core\Updater\Updater;
|
||||
use Drupal\Core\Url;
|
||||
use Drupal\Tests\TestFileCreationTrait;
|
||||
|
||||
/**
|
||||
* Tests the Update Manager module's upload and extraction functionality.
|
||||
*
|
||||
* @group update
|
||||
*/
|
||||
class UpdateUploadTest extends UpdateTestBase {
|
||||
|
||||
use TestFileCreationTrait {
|
||||
getTestFiles as drupalGetTestFiles;
|
||||
}
|
||||
|
||||
/**
|
||||
* Modules to enable.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public static $modules = ['update', 'update_test'];
|
||||
|
||||
protected function setUp() {
|
||||
parent::setUp();
|
||||
$admin_user = $this->drupalCreateUser(['administer modules', 'administer software updates', 'administer site configuration']);
|
||||
$this->drupalLogin($admin_user);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests upload, extraction, and update of a module.
|
||||
*/
|
||||
public function testUploadModule() {
|
||||
// Ensure that the update information is correct before testing.
|
||||
update_get_available(TRUE);
|
||||
|
||||
// Images are not valid archives, so get one and try to install it. We
|
||||
// need an extra variable to store the result of drupalGetTestFiles()
|
||||
// since reset() takes an argument by reference and passing in a constant
|
||||
// emits a notice in strict mode.
|
||||
$imageTestFiles = $this->drupalGetTestFiles('image');
|
||||
$invalidArchiveFile = reset($imageTestFiles);
|
||||
$edit = [
|
||||
'files[project_upload]' => $invalidArchiveFile->uri,
|
||||
];
|
||||
// This also checks that the correct archive extensions are allowed.
|
||||
$this->drupalPostForm('admin/modules/install', $edit, t('Install'));
|
||||
$this->assertText(t('Only files with the following extensions are allowed: @archive_extensions.', ['@archive_extensions' => archiver_get_extensions()]), 'Only valid archives can be uploaded.');
|
||||
$this->assertUrl('admin/modules/install');
|
||||
|
||||
// Check to ensure an existing module can't be reinstalled. Also checks that
|
||||
// the archive was extracted since we can't know if the module is already
|
||||
// installed until after extraction.
|
||||
$validArchiveFile = __DIR__ . '/../../aaa_update_test.tar.gz';
|
||||
$edit = [
|
||||
'files[project_upload]' => $validArchiveFile,
|
||||
];
|
||||
$this->drupalPostForm('admin/modules/install', $edit, t('Install'));
|
||||
$this->assertText(t('@module_name is already installed.', ['@module_name' => 'AAA Update test']), 'Existing module was extracted and not reinstalled.');
|
||||
$this->assertUrl('admin/modules/install');
|
||||
|
||||
// Ensure that a new module can be extracted and installed.
|
||||
$updaters = drupal_get_updaters();
|
||||
$moduleUpdater = $updaters['module']['class'];
|
||||
$installedInfoFilePath = $this->container->get('update.root') . '/' . $moduleUpdater::getRootDirectoryRelativePath() . '/update_test_new_module/update_test_new_module.info.yml';
|
||||
$this->assertFalse(file_exists($installedInfoFilePath), 'The new module does not exist in the filesystem before it is installed with the Update Manager.');
|
||||
$validArchiveFile = __DIR__ . '/../../update_test_new_module/8.x-1.0/update_test_new_module.tar.gz';
|
||||
$edit = [
|
||||
'files[project_upload]' => $validArchiveFile,
|
||||
];
|
||||
$this->drupalPostForm('admin/modules/install', $edit, t('Install'));
|
||||
// Check that submitting the form takes the user to authorize.php.
|
||||
$this->assertUrl('core/authorize.php');
|
||||
$this->assertTitle('Update manager | Drupal');
|
||||
// Check for a success message on the page, and check that the installed
|
||||
// module now exists in the expected place in the filesystem.
|
||||
$this->assertRaw(t('Installed %project_name successfully', ['%project_name' => 'update_test_new_module']));
|
||||
$this->assertTrue(file_exists($installedInfoFilePath), 'The new module exists in the filesystem after it is installed with the Update Manager.');
|
||||
// Ensure the links are relative to the site root and not
|
||||
// core/authorize.php.
|
||||
$this->assertLink(t('Install another module'));
|
||||
$this->assertLinkByHref(Url::fromRoute('update.module_install')->toString());
|
||||
$this->assertLink(t('Enable newly added modules'));
|
||||
$this->assertLinkByHref(Url::fromRoute('system.modules_list')->toString());
|
||||
$this->assertLink(t('Administration pages'));
|
||||
$this->assertLinkByHref(Url::fromRoute('system.admin')->toString());
|
||||
// Ensure we can reach the "Install another module" link.
|
||||
$this->clickLink(t('Install another module'));
|
||||
$this->assertResponse(200);
|
||||
$this->assertUrl('admin/modules/install');
|
||||
|
||||
// Check that the module has the correct version before trying to update
|
||||
// it. Since the module is installed in sites/simpletest, which only the
|
||||
// child site has access to, standard module API functions won't find it
|
||||
// when called here. To get the version, the info file must be parsed
|
||||
// directly instead.
|
||||
$info_parser = new InfoParserDynamic();
|
||||
$info = $info_parser->parse($installedInfoFilePath);
|
||||
$this->assertEqual($info['version'], '8.x-1.0');
|
||||
|
||||
// Enable the module.
|
||||
$this->drupalPostForm('admin/modules', ['modules[update_test_new_module][enable]' => TRUE], t('Install'));
|
||||
|
||||
// Define the update XML such that the new module downloaded above needs an
|
||||
// update from 8.x-1.0 to 8.x-1.1.
|
||||
$update_test_config = $this->config('update_test.settings');
|
||||
$system_info = [
|
||||
'update_test_new_module' => [
|
||||
'project' => 'update_test_new_module',
|
||||
],
|
||||
];
|
||||
$update_test_config->set('system_info', $system_info)->save();
|
||||
$xml_mapping = [
|
||||
'update_test_new_module' => '1_1',
|
||||
];
|
||||
$this->refreshUpdateStatus($xml_mapping);
|
||||
|
||||
// Run the updates for the new module.
|
||||
$this->drupalPostForm('admin/reports/updates/update', ['projects[update_test_new_module]' => TRUE], t('Download these updates'));
|
||||
$this->drupalPostForm(NULL, ['maintenance_mode' => FALSE], t('Continue'));
|
||||
$this->assertText(t('Update was completed successfully.'));
|
||||
$this->assertRaw(t('Installed %project_name successfully', ['%project_name' => 'update_test_new_module']));
|
||||
|
||||
// Parse the info file again to check that the module has been updated to
|
||||
// 8.x-1.1.
|
||||
$info = $info_parser->parse($installedInfoFilePath);
|
||||
$this->assertEqual($info['version'], '8.x-1.1');
|
||||
}
|
||||
|
||||
/**
|
||||
* Ensures that archiver extensions are properly merged in the UI.
|
||||
*/
|
||||
public function testFileNameExtensionMerging() {
|
||||
$this->drupalGet('admin/modules/install');
|
||||
// Make sure the bogus extension supported by update_test.module is there.
|
||||
$this->assertPattern('/file extensions are supported:.*update-test-extension/', "Found 'update-test-extension' extension.");
|
||||
// Make sure it didn't clobber the first option from core.
|
||||
$this->assertPattern('/file extensions are supported:.*tar/', "Found 'tar' extension.");
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks the messages on update manager pages when missing a security update.
|
||||
*/
|
||||
public function testUpdateManagerCoreSecurityUpdateMessages() {
|
||||
$setting = [
|
||||
'#all' => [
|
||||
'version' => '8.0.0',
|
||||
],
|
||||
];
|
||||
$this->config('update_test.settings')
|
||||
->set('system_info', $setting)
|
||||
->set('xml_map', ['drupal' => '0.2-sec'])
|
||||
->save();
|
||||
$this->config('update.settings')
|
||||
->set('fetch.url', Url::fromRoute('update_test.update_test')->setAbsolute()->toString())
|
||||
->save();
|
||||
// Initialize the update status.
|
||||
$this->drupalGet('admin/reports/updates');
|
||||
|
||||
// Now, make sure none of the Update manager pages have duplicate messages
|
||||
// about core missing a security update.
|
||||
|
||||
$this->drupalGet('admin/modules/install');
|
||||
$this->assertNoText(t('There is a security update available for your version of Drupal.'));
|
||||
|
||||
$this->drupalGet('admin/modules/update');
|
||||
$this->assertNoText(t('There is a security update available for your version of Drupal.'));
|
||||
|
||||
$this->drupalGet('admin/appearance/install');
|
||||
$this->assertNoText(t('There is a security update available for your version of Drupal.'));
|
||||
|
||||
$this->drupalGet('admin/appearance/update');
|
||||
$this->assertNoText(t('There is a security update available for your version of Drupal.'));
|
||||
|
||||
$this->drupalGet('admin/reports/updates/install');
|
||||
$this->assertNoText(t('There is a security update available for your version of Drupal.'));
|
||||
|
||||
$this->drupalGet('admin/reports/updates/update');
|
||||
$this->assertNoText(t('There is a security update available for your version of Drupal.'));
|
||||
|
||||
$this->drupalGet('admin/update/ready');
|
||||
$this->assertNoText(t('There is a security update available for your version of Drupal.'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests only an *.info.yml file are detected without supporting files.
|
||||
*/
|
||||
public function testUpdateDirectory() {
|
||||
$type = Updater::getUpdaterFromDirectory($this->root . '/core/modules/update/tests/modules/aaa_update_test');
|
||||
$this->assertEqual($type, 'Drupal\\Core\\Updater\\Module', 'Detected a Module');
|
||||
|
||||
$type = Updater::getUpdaterFromDirectory($this->root . '/core/modules/update/tests/themes/update_test_basetheme');
|
||||
$this->assertEqual($type, 'Drupal\\Core\\Updater\\Theme', 'Detected a Theme.');
|
||||
}
|
||||
|
||||
}
|
|
@ -28,7 +28,7 @@ class UpdateFetcherTest extends UnitTestCase {
|
|||
*/
|
||||
protected function setUp() {
|
||||
$config_factory = $this->getConfigFactoryStub(['update.settings' => ['fetch_url' => 'http://www.example.com']]);
|
||||
$http_client_mock = $this->getMock('\GuzzleHttp\ClientInterface');
|
||||
$http_client_mock = $this->createMock('\GuzzleHttp\ClientInterface');
|
||||
$this->updateFetcher = new UpdateFetcher($config_factory, $http_client_mock);
|
||||
}
|
||||
|
||||
|
|
Reference in a new issue