From a85c10584e7d2068774f48e1bcbb4da300bd09cf Mon Sep 17 00:00:00 2001
From: Matthieu Napoli <matthieu@mnapoli.fr>
Date: Thu, 8 Jan 2015 11:42:35 +1300
Subject: [PATCH] Moved the ini component to a separate repository

---
 composer.json                            |   3 +-
 composer.lock                            |  92 +++++---
 core/Ini/IniReader.php                   | 262 -----------------------
 core/Ini/IniReadingException.php         |  16 --
 core/Ini/IniWriter.php                   | 120 -----------
 core/Ini/IniWritingException.php         |  16 --
 tests/PHPUnit/Unit/Ini/IniReaderTest.php | 105 ---------
 tests/PHPUnit/Unit/Ini/IniWriterTest.php |  90 --------
 8 files changed, 64 insertions(+), 640 deletions(-)
 delete mode 100644 core/Ini/IniReader.php
 delete mode 100644 core/Ini/IniReadingException.php
 delete mode 100644 core/Ini/IniWriter.php
 delete mode 100644 core/Ini/IniWritingException.php
 delete mode 100644 tests/PHPUnit/Unit/Ini/IniReaderTest.php
 delete mode 100644 tests/PHPUnit/Unit/Ini/IniWriterTest.php

diff --git a/composer.json b/composer.json
index 42e9d67c1a..87a6b2b0d7 100644
--- a/composer.json
+++ b/composer.json
@@ -45,8 +45,9 @@
         "piwik/device-detector": "~2.0",
         "piwik/decompress": "~0.1.1",
         "piwik/network": "~0.1.0",
-        "mnapoli/php-di": "5.0.x-dev",
         "piwik/cache": "~0.2",
+        "piwik/ini": "~1.0",
+        "mnapoli/php-di": "5.0.x-dev",
         "doctrine/cache": "dev-filecache-race-condition-fix as 1.3.1",
         "psr/log": "~1.0",
         "monolog/monolog": "~1.11",
diff --git a/composer.lock b/composer.lock
index 34d220b432..a3883ab660 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,7 +4,7 @@
         "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
         "This file is @generated automatically"
     ],
-    "hash": "eaa7dcd4b0c89c35cff039cd259a38c3",
+    "hash": "09ced245f00415f5fe13703565767884",
     "packages": [
         {
             "name": "container-interop/container-interop",
@@ -629,6 +629,38 @@
             ],
             "time": "2015-01-01 16:13:46"
         },
+        {
+            "name": "piwik/ini",
+            "version": "1.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/piwik/component-ini.git",
+                "reference": "6c95b8886871bec86e7d648e913b4dc88b4166a6"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/piwik/component-ini/zipball/6c95b8886871bec86e7d648e913b4dc88b4166a6",
+                "reference": "6c95b8886871bec86e7d648e913b4dc88b4166a6",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "~4.0"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Piwik\\Ini\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "LGPL-3.0"
+            ],
+            "time": "2015-01-07 22:10:24"
+        },
         {
             "name": "piwik/network",
             "version": "0.1.0",
@@ -701,17 +733,17 @@
         },
         {
             "name": "symfony/console",
-            "version": "v2.6.1",
+            "version": "v2.6.3",
             "target-dir": "Symfony/Component/Console",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/Console.git",
-                "reference": "ef825fd9f809d275926547c9e57cbf14968793e8"
+                "reference": "6ac6491ff60c0e5a941db3ccdc75a07adbb61476"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/Console/zipball/ef825fd9f809d275926547c9e57cbf14968793e8",
-                "reference": "ef825fd9f809d275926547c9e57cbf14968793e8",
+                "url": "https://api.github.com/repos/symfony/Console/zipball/6ac6491ff60c0e5a941db3ccdc75a07adbb61476",
+                "reference": "6ac6491ff60c0e5a941db3ccdc75a07adbb61476",
                 "shasum": ""
             },
             "require": {
@@ -754,21 +786,21 @@
             ],
             "description": "Symfony Console Component",
             "homepage": "http://symfony.com",
-            "time": "2014-12-02 20:19:20"
+            "time": "2015-01-06 17:50:02"
         },
         {
             "name": "symfony/event-dispatcher",
-            "version": "v2.6.1",
+            "version": "v2.6.3",
             "target-dir": "Symfony/Component/EventDispatcher",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/EventDispatcher.git",
-                "reference": "720fe9bca893df7ad1b4546649473b5afddf0216"
+                "reference": "40ff70cadea3785d83cac1c8309514b36113064e"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/EventDispatcher/zipball/720fe9bca893df7ad1b4546649473b5afddf0216",
-                "reference": "720fe9bca893df7ad1b4546649473b5afddf0216",
+                "url": "https://api.github.com/repos/symfony/EventDispatcher/zipball/40ff70cadea3785d83cac1c8309514b36113064e",
+                "reference": "40ff70cadea3785d83cac1c8309514b36113064e",
                 "shasum": ""
             },
             "require": {
@@ -776,10 +808,10 @@
             },
             "require-dev": {
                 "psr/log": "~1.0",
-                "symfony/config": "~2.0",
+                "symfony/config": "~2.0,>=2.0.5",
                 "symfony/dependency-injection": "~2.6",
                 "symfony/expression-language": "~2.6",
-                "symfony/stopwatch": "~2.2"
+                "symfony/stopwatch": "~2.3"
             },
             "suggest": {
                 "symfony/dependency-injection": "",
@@ -812,21 +844,21 @@
             ],
             "description": "Symfony EventDispatcher Component",
             "homepage": "http://symfony.com",
-            "time": "2014-12-02 20:19:20"
+            "time": "2015-01-05 14:28:40"
         },
         {
             "name": "symfony/monolog-bridge",
-            "version": "v2.6.1",
+            "version": "v2.6.3",
             "target-dir": "Symfony/Bridge/Monolog",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/MonologBridge.git",
-                "reference": "98a8debb952b8a7e0fff31fbce0f5e965dc1f499"
+                "reference": "83a451b5a2e16a14ffd07a42746c4b9db1a48c1d"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/MonologBridge/zipball/98a8debb952b8a7e0fff31fbce0f5e965dc1f499",
-                "reference": "98a8debb952b8a7e0fff31fbce0f5e965dc1f499",
+                "url": "https://api.github.com/repos/symfony/MonologBridge/zipball/83a451b5a2e16a14ffd07a42746c4b9db1a48c1d",
+                "reference": "83a451b5a2e16a14ffd07a42746c4b9db1a48c1d",
                 "shasum": ""
             },
             "require": {
@@ -834,9 +866,9 @@
                 "php": ">=5.3.3"
             },
             "require-dev": {
-                "symfony/console": "~2.3",
+                "symfony/console": "~2.4",
                 "symfony/event-dispatcher": "~2.2",
-                "symfony/http-kernel": "~2.2"
+                "symfony/http-kernel": "~2.4"
             },
             "suggest": {
                 "symfony/console": "For the possibility to show log messages in console commands depending on verbosity settings. You need version ~2.3 of the console for it.",
@@ -870,7 +902,7 @@
             ],
             "description": "Symfony Monolog Bridge",
             "homepage": "http://symfony.com",
-            "time": "2014-12-02 20:19:20"
+            "time": "2015-01-03 08:01:59"
         },
         {
             "name": "tedivm/jshrink",
@@ -2004,17 +2036,17 @@
         },
         {
             "name": "symfony/var-dumper",
-            "version": "v2.6.1",
+            "version": "v2.6.3",
             "target-dir": "Symfony/Component/VarDumper",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/var-dumper.git",
-                "reference": "8f3ee04faeca3b8418229b2efbfc8b2b8625b8aa"
+                "reference": "36af986811340fd4c1bc39cf848da388bbdd8473"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/var-dumper/zipball/8f3ee04faeca3b8418229b2efbfc8b2b8625b8aa",
-                "reference": "8f3ee04faeca3b8418229b2efbfc8b2b8625b8aa",
+                "url": "https://api.github.com/repos/symfony/var-dumper/zipball/36af986811340fd4c1bc39cf848da388bbdd8473",
+                "reference": "36af986811340fd4c1bc39cf848da388bbdd8473",
                 "shasum": ""
             },
             "require": {
@@ -2053,21 +2085,21 @@
                 "debug",
                 "dump"
             ],
-            "time": "2014-11-18 10:08:24"
+            "time": "2015-01-01 13:28:01"
         },
         {
             "name": "symfony/yaml",
-            "version": "v2.6.1",
+            "version": "v2.6.3",
             "target-dir": "Symfony/Component/Yaml",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/Yaml.git",
-                "reference": "3346fc090a3eb6b53d408db2903b241af51dcb20"
+                "reference": "82462a90848a52c2533aa6b598b107d68076b018"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/Yaml/zipball/3346fc090a3eb6b53d408db2903b241af51dcb20",
-                "reference": "3346fc090a3eb6b53d408db2903b241af51dcb20",
+                "url": "https://api.github.com/repos/symfony/Yaml/zipball/82462a90848a52c2533aa6b598b107d68076b018",
+                "reference": "82462a90848a52c2533aa6b598b107d68076b018",
                 "shasum": ""
             },
             "require": {
@@ -2100,7 +2132,7 @@
             ],
             "description": "Symfony Yaml Component",
             "homepage": "http://symfony.com",
-            "time": "2014-12-02 20:19:20"
+            "time": "2015-01-03 15:33:07"
         }
     ],
     "aliases": [
diff --git a/core/Ini/IniReader.php b/core/Ini/IniReader.php
deleted file mode 100644
index e50d797202..0000000000
--- a/core/Ini/IniReader.php
+++ /dev/null
@@ -1,262 +0,0 @@
-<?php
-/**
- * Piwik - free/libre analytics platform
- *
- * @link http://piwik.org
- * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
- */
-
-namespace Piwik\Ini;
-
-/**
- * Reads INI configuration.
- */
-class IniReader
-{
-    /**
-     * Reads a INI configuration file and returns it as an array.
-     *
-     * The array returned is multidimensional, indexed by section names:
-     *
-     * ```
-     * array(
-     *     'Section 1' => array(
-     *         'value1' => 'hello',
-     *         'value2' => 'world',
-     *     ),
-     *     'Section 2' => array(
-     *         'value3' => 'foo',
-     *     )
-     * );
-     * ```
-     *
-     * @param string $filename The file to read.
-     * @throws IniReadingException
-     * @return array
-     */
-    public function readFile($filename)
-    {
-        if (!file_exists($filename) || !is_readable($filename)) {
-            throw new IniReadingException(sprintf("The file %s doesn't exist or is not readable", $filename));
-        }
-
-        $ini = $this->getFileContent($filename);
-
-        if ($ini === false) {
-            throw new IniReadingException(sprintf('Impossible to read the file %s', $filename));
-        }
-
-        return $this->readString($ini);
-    }
-
-    /**
-     * Reads a INI configuration string and returns it as an array.
-     *
-     * The array returned is multidimensional, indexed by section names:
-     *
-     * ```
-     * array(
-     *     'Section 1' => array(
-     *         'value1' => 'hello',
-     *         'value2' => 'world',
-     *     ),
-     *     'Section 2' => array(
-     *         'value3' => 'foo',
-     *     )
-     * );
-     * ```
-     *
-     * @param string $ini String containing INI configuration.
-     * @throws IniReadingException
-     * @return array
-     */
-    public function readString($ini)
-    {
-        if (!function_exists('parse_ini_file')) {
-            return $this->readIni($ini, true);
-        }
-
-        $array = @parse_ini_string($ini, true, INI_SCANNER_RAW);
-
-        if ($array === false) {
-            $e = error_get_last();
-            throw new IniReadingException('Syntax error in INI configuration: ' . $e['message']);
-        }
-
-        $array = $this->decodeValues($array);
-
-        return $array;
-    }
-
-    /**
-     * Reimplementation in case `parse_ini_file()` is disabled.
-     *
-     * @author Andrew Sohn <asohn (at) aircanopy (dot) net>
-     * @author anthon (dot) pang (at) gmail (dot) com
-     *
-     * @param string $ini
-     * @param bool $processSections
-     * @return array
-     */
-    private function readIni($ini, $processSections)
-    {
-        if (is_string($ini)) {
-            $ini = explode("\n", str_replace("\r", "\n", $ini));
-        }
-        if (count($ini) == 0) {
-            return array();
-        }
-
-        $sections = array();
-        $values = array();
-        $result = array();
-        $globals = array();
-        $i = 0;
-        foreach ($ini as $line) {
-            $line = trim($line);
-            $line = str_replace("\t", " ", $line);
-
-            // Comments
-            if (!preg_match('/^[a-zA-Z0-9[]/', $line)) {
-                continue;
-            }
-
-            // Sections
-            if ($line{0} == '[') {
-                $tmp = explode(']', $line);
-                $sections[] = trim(substr($tmp[0], 1));
-                $i++;
-                continue;
-            }
-
-            // Key-value pair
-            list($key, $value) = explode('=', $line, 2);
-            $key = trim($key);
-            $value = trim($value);
-            if (strstr($value, ";")) {
-                $tmp = explode(';', $value);
-                if (count($tmp) == 2) {
-                    if ((($value{0} != '"') && ($value{0} != "'")) ||
-                        preg_match('/^".*"\s*;/', $value) || preg_match('/^".*;[^"]*$/', $value) ||
-                        preg_match("/^'.*'\s*;/", $value) || preg_match("/^'.*;[^']*$/", $value)
-                    ) {
-                        $value = $tmp[0];
-                    }
-                } else {
-                    if ($value{0} == '"') {
-                        $value = preg_replace('/^"(.*)".*/', '$1', $value);
-                    } elseif ($value{0} == "'") {
-                        $value = preg_replace("/^'(.*)'.*/", '$1', $value);
-                    } else {
-                        $value = $tmp[0];
-                    }
-                }
-            }
-
-            $value = trim($value);
-            $value = trim($value, "'\"");
-
-            if ($i == 0) {
-                if (substr($key, -2) == '[]') {
-                    $globals[substr($key, 0, -2)][] = $value;
-                } else {
-                    $globals[$key] = $value;
-                }
-            } else {
-                if (substr($key, -2) == '[]') {
-                    $values[$i - 1][substr($key, 0, -2)][] = $value;
-                } else {
-                    $values[$i - 1][$key] = $value;
-                }
-            }
-        }
-
-        for ($j = 0; $j < $i; $j++) {
-            if (isset($values[$j])) {
-                if ($processSections === true) {
-                    $result[$sections[$j]] = $values[$j];
-                } else {
-                    $result[] = $values[$j];
-                }
-            } else {
-                if ($processSections === true) {
-                    $result[$sections[$j]] = array();
-                }
-            }
-        }
-
-        return $result + $globals;
-    }
-
-    /**
-     * @param string $filename
-     * @return bool|string Returns false if failure.
-     */
-    private function getFileContent($filename)
-    {
-        if (function_exists('file_get_contents')) {
-            return file_get_contents($filename);
-        } elseif (function_exists('file')) {
-            $ini = file($filename);
-            if ($ini !== false) {
-                return implode("\n", $ini);
-            }
-        } elseif (function_exists('fopen') && function_exists('fread')) {
-            $handle = fopen($filename, 'r');
-            if (!$handle) {
-                return false;
-            }
-            $ini = fread($handle, filesize($filename));
-            fclose($handle);
-            return $ini;
-        }
-
-        return false;
-    }
-
-    private function decodeValues($config)
-    {
-        foreach ($config as &$section) {
-            foreach ($section as $option => $value) {
-                $section[$option] = $this->decodeValue($value);
-            }
-        }
-        return $config;
-    }
-
-    /**
-     * We have to decode values manually because parse_ini_file() has a poor implementation.
-     *
-     * @param mixed $value
-     * @return mixed
-     */
-    private function decodeValue($value)
-    {
-        if (is_array($value)) {
-            foreach ($value as &$subValue) {
-                $subValue = $this->decodeValue($subValue);
-            }
-            return $value;
-        }
-
-        if (is_numeric($value)) {
-            return $value + 0;
-        }
-
-        switch (strtolower($value)) {
-            case '':
-            case 'null' :
-                return null;
-            case 'true' :
-            case 'yes' :
-            case 'on' :
-                return true;
-            case 'false':
-            case 'no':
-            case 'off':
-                return false;
-        }
-
-        return $value;
-    }
-}
diff --git a/core/Ini/IniReadingException.php b/core/Ini/IniReadingException.php
deleted file mode 100644
index 227305fd11..0000000000
--- a/core/Ini/IniReadingException.php
+++ /dev/null
@@ -1,16 +0,0 @@
-<?php
-/**
- * Piwik - free/libre analytics platform
- *
- * @link http://piwik.org
- * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
- */
-
-namespace Piwik\Ini;
-
-/**
- * Exception when reading a INI configuration.
- */
-class IniReadingException extends \Exception
-{
-}
diff --git a/core/Ini/IniWriter.php b/core/Ini/IniWriter.php
deleted file mode 100644
index b18af460f4..0000000000
--- a/core/Ini/IniWriter.php
+++ /dev/null
@@ -1,120 +0,0 @@
-<?php
-/**
- * Piwik - free/libre analytics platform
- *
- * @link http://piwik.org
- * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
- */
-
-namespace Piwik\Ini;
-
-/**
- * Writes INI configuration.
- */
-class IniWriter
-{
-    /**
-     * Writes an array configuration to a INI file.
-     *
-     * The array provided must be multidimensional, indexed by section names:
-     *
-     * ```
-     * array(
-     *     'Section 1' => array(
-     *         'value1' => 'hello',
-     *         'value2' => 'world',
-     *     ),
-     *     'Section 2' => array(
-     *         'value3' => 'foo',
-     *     )
-     * );
-     * ```
-     *
-     * @param string $filename
-     * @param array $config
-     * @param string $header Optional header to insert at the top of the file.
-     * @throws IniWritingException
-     */
-    public function writeToFile($filename, array $config, $header = '')
-    {
-        $ini = $this->writeToString($config, $header);
-
-        if (!file_put_contents($filename, $ini)) {
-            throw new IniWritingException(sprintf('Impossible to write to file %s', $filename));
-        }
-    }
-
-    /**
-     * Writes an array configuration to a INI string and returns it.
-     *
-     * The array provided must be multidimensional, indexed by section names:
-     *
-     * ```
-     * array(
-     *     'Section 1' => array(
-     *         'value1' => 'hello',
-     *         'value2' => 'world',
-     *     ),
-     *     'Section 2' => array(
-     *         'value3' => 'foo',
-     *     )
-     * );
-     * ```
-     *
-     * @param array $config
-     * @param string $header Optional header to insert at the top of the file.
-     * @return string
-     * @throws IniWritingException
-     */
-    public function writeToString(array $config, $header = '')
-    {
-        $ini = $header;
-
-        $sectionNames = array_keys($config);
-
-        foreach ($sectionNames as $sectionName) {
-            $section = $config[$sectionName];
-
-            // no point in writing empty sections
-            if (empty($section)) {
-                continue;
-            }
-
-            if (! is_array($section)) {
-                throw new IniWritingException(sprintf("Section \"%s\" doesn't contain an array of values", $sectionName));
-            }
-
-            $ini .= "[$sectionName]\n";
-
-            foreach ($section as $option => $value) {
-                if (is_numeric($option)) {
-                    $option = $sectionName;
-                    $value = array($value);
-                }
-
-                if (is_array($value)) {
-                    foreach ($value as $currentValue) {
-                        $ini .= $option . '[] = ' . $this->encodeValue($currentValue) . "\n";
-                    }
-                } else {
-                    $ini .= $option . ' = ' . $this->encodeValue($value) . "\n";
-                }
-            }
-
-            $ini .= "\n";
-        }
-
-        return $ini;
-    }
-
-    private function encodeValue($value)
-    {
-        if (is_bool($value)) {
-            return (int) $value;
-        }
-        if (is_string($value)) {
-            return "\"$value\"";
-        }
-        return $value;
-    }
-}
diff --git a/core/Ini/IniWritingException.php b/core/Ini/IniWritingException.php
deleted file mode 100644
index 10982fa64d..0000000000
--- a/core/Ini/IniWritingException.php
+++ /dev/null
@@ -1,16 +0,0 @@
-<?php
-/**
- * Piwik - free/libre analytics platform
- *
- * @link http://piwik.org
- * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
- */
-
-namespace Piwik\Ini;
-
-/**
- * Exception when writing a INI configuration.
- */
-class IniWritingException extends \Exception
-{
-}
diff --git a/tests/PHPUnit/Unit/Ini/IniReaderTest.php b/tests/PHPUnit/Unit/Ini/IniReaderTest.php
deleted file mode 100644
index 190853377c..0000000000
--- a/tests/PHPUnit/Unit/Ini/IniReaderTest.php
+++ /dev/null
@@ -1,105 +0,0 @@
-<?php
-/**
- * Piwik - free/libre analytics platform
- *
- * @link http://piwik.org
- * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
- */
-
-namespace Piwik\Tests\Unit\Ini;
-
-use Piwik\Ini\IniReader;
-
-class IniReaderTest extends \PHPUnit_Framework_TestCase
-{
-    public function test_readString()
-    {
-        $ini = <<<INI
-[Section 1]
-foo = "bar"
-bool_true_1 = 1
-bool_false_1 = 0
-bool_true_2 = true
-bool_false_2 = false
-bool_true_3 = yes
-bool_false_3 = no
-bool_true_4 = on
-bool_false_4 = off
-empty =
-explicit_null = null
-int = 10
-float = 10.3
-array[] = "string"
-array[] = 10.3
-array[] = 1
-array[] = 0
-array[] = true
-array[] = false
-
-[Section 2]
-foo = "bar"
-INI;
-        $expected = array(
-            'Section 1' => array(
-                'foo' => 'bar',
-                'bool_true_1' => 1,
-                'bool_false_1' => 0,
-                'bool_true_2' => true,
-                'bool_false_2' => false,
-                'bool_true_3' => true,
-                'bool_false_3' => false,
-                'bool_true_4' => true,
-                'bool_false_4' => false,
-                'empty' => null,
-                'explicit_null' => null,
-                'int' => 10,
-                'float' => 10.3,
-                'array' => array(
-                    'string',
-                    10.3,
-                    1,
-                    0,
-                    true,
-                    false,
-                ),
-            ),
-            'Section 2' => array(
-                'foo' => 'bar',
-            ),
-        );
-        $reader = new IniReader();
-        $this->assertSame($expected, $reader->readString($ini));
-    }
-
-    public function test_readString_withEmptyString()
-    {
-        $reader = new IniReader();
-        $this->assertSame(array(), $reader->readString(''));
-    }
-
-    /**
-     * @expectedException \Piwik\Ini\IniReadingException
-     * @expectedExceptionMessage Syntax error in INI configuration
-     */
-    public function test_readString_shouldThrowException_ifInvalidIni()
-    {
-        $reader = new IniReader();
-        $reader->readString('[ test = foo');
-    }
-
-    public function test_readString_shouldIgnoreComments()
-    {
-        $expected = array(
-            'Section 1' => array(
-                'foo' => 'bar',
-            ),
-        );
-        $ini = <<<INI
-; <?php exit; ?> DO NOT REMOVE THIS LINE
-[Section 1]
-foo = "bar"
-INI;
-        $reader = new IniReader();
-        $this->assertSame($expected, $reader->readString($ini));
-    }
-}
diff --git a/tests/PHPUnit/Unit/Ini/IniWriterTest.php b/tests/PHPUnit/Unit/Ini/IniWriterTest.php
deleted file mode 100644
index 3ff22076d9..0000000000
--- a/tests/PHPUnit/Unit/Ini/IniWriterTest.php
+++ /dev/null
@@ -1,90 +0,0 @@
-<?php
-/**
- * Piwik - free/libre analytics platform
- *
- * @link http://piwik.org
- * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
- */
-
-namespace Piwik\Tests\Unit\Ini;
-
-use Piwik\Ini\IniWriter;
-
-class IniWriterTest extends \PHPUnit_Framework_TestCase
-{
-    public function test_writeToString()
-    {
-        $config = array(
-            'Section 1' => array(
-                'foo' => 'bar',
-                'bool_true' => true,
-                'bool_false' => false,
-                'int' => 10,
-                'float' => 10.3,
-                'array' => array(
-                    'string',
-                    10.3,
-                    true,
-                    false,
-                ),
-            ),
-            'Section 2' => array(
-                'foo' => 'bar',
-            ),
-        );
-        $expected = <<<INI
-[Section 1]
-foo = "bar"
-bool_true = 1
-bool_false = 0
-int = 10
-float = 10.3
-array[] = "string"
-array[] = 10.3
-array[] = 1
-array[] = 0
-
-[Section 2]
-foo = "bar"
-
-
-INI;
-        $writer = new IniWriter();
-        $this->assertEquals($expected, $writer->writeToString($config));
-    }
-
-    public function test_writeToString_withEmptyConfig()
-    {
-        $writer = new IniWriter();
-        $this->assertEquals('', $writer->writeToString(array()));
-    }
-
-    /**
-     * @expectedException \Piwik\Ini\IniWritingException
-     * @expectedExceptionMessage Section "Section 1" doesn't contain an array of values
-     */
-    public function test_writeToString_shouldThrowException_withInvalidConfig()
-    {
-        $writer = new IniWriter();
-        $writer->writeToString(array('Section 1' => 123));
-    }
-
-    public function test_writeToString_shouldAddHeader()
-    {
-        $header = "; <?php exit; ?> DO NOT REMOVE THIS LINE\n";
-        $config = array(
-            'Section 1' => array(
-                'foo' => 'bar',
-            ),
-        );
-        $expected = <<<INI
-; <?php exit; ?> DO NOT REMOVE THIS LINE
-[Section 1]
-foo = "bar"
-
-
-INI;
-        $writer = new IniWriter();
-        $this->assertEquals($expected, $writer->writeToString($config, $header));
-    }
-}
-- 
GitLab