# Download BookStack & install PHP deps
RUN mkdir -p /var/www && \
git clone https://github.com/bookstackapp/bookstack.git --branch "$BRANCH" --single-branch /var/www/bookstack && \
- cd /var/www/bookstack && \
- wget https://raw.githubusercontent.com/composer/getcomposer.org/f3108f64b4e1c1ce6eb462b159956461592b3e3e/web/installer -O - -q | php -- --quiet --filename=composer && \
+ cd /var/www/bookstack && \
+ wget https://raw.githubusercontent.com/composer/getcomposer.org/f3108f64b4e1c1ce6eb462b159956461592b3e3e/web/installer -O - -q | php -- --quiet --filename=composer && \
php composer install
# Set the BookStack dir as the default working dir
--- /dev/null
+# Database Testing Suite
+
+This docker setup is designed to run BookStack's test suite against each major database version we support
+across MySQL and MariaDB to ensure compatibility and highlight any potential issues before a release.
+This is a fairly slow and heavy process, so is designed to just be run manually before a release which
+makes changes to the database schema, or a release which makes significant changes to database queries.
+
+### Running
+
+Everything is ran via the `run.sh` script. This will:
+
+- Optionally, accept a branch of BookStack to use for testing.
+- Build the docker image from the `Dockerfile`.
+ - This will include a built-in copy of the chosen BookStack branch.
+- Cycle through each major supported database version:
+ - Migrate and seed the database.
+ - Run the full PHP test suite.
+
+If there's a failure for a database version, the script will prompt if you'd like to continue or stop testing.
+
+This script should be ran from this `db-testing` directory:
+
+```bash
+# Enter this directory
+cd dev/docker/db-testing
+
+# Runs for the 'development' branch by default
+./run.sh
+
+# Run for a specific branch
+./run.sh v25-11
+```
# List of database containers to test against
containers=(
- "mysql:5.7"
"mysql:8.0"
"mysql:8.4"
"mysql:9.5"
- "mariadb:10.2"
"mariadb:10.6"
"mariadb:10.11"
"mariadb:11.4"
$galleryFileSize = filesize($galleryThumbPath);
// Basic scan of GIF content to check frame count
- $originalFrameCount = count(explode("\x00\x21\xF9", file_get_contents($originalFile)));
- $galleryFrameCount = count(explode("\x00\x21\xF9", file_get_contents($galleryThumbPath)));
+ $originalFrameCount = count(explode("\x00\x21\xF9", file_get_contents($originalFile))) - 1;
+ $galleryFrameCount = count(explode("\x00\x21\xF9", file_get_contents($galleryThumbPath))) - 1;
$this->files->deleteAtRelativePath($relPath);
$this->files->deleteAtRelativePath($galleryThumbRelPath);
$this->assertNotEquals($originalFileSize, $galleryFileSize);
- $this->assertEquals(3, $originalFrameCount);
- $this->assertEquals(1, $galleryFrameCount);
+ $this->assertEquals(2, $originalFrameCount);
+ $this->assertLessThan(2, $galleryFrameCount);
}
protected function getTestProfileImage()