Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/matomo-org/matomo.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordiosmosis <benakamoorthi@fastmail.fm>2014-02-27 17:21:41 +0400
committerdiosmosis <benakamoorthi@fastmail.fm>2014-02-27 17:21:41 +0400
commit13a08d58897ba2921a037b309e75593c3fbbabcd (patch)
treed0ed9565efaa10a1c6d71d797ddbb319f5a37177
parent4ad2b987467fd57c0ef5a0bbaa8c7f66845d69e1 (diff)
Refs #4189, added expected screenshot for DBStats, added actual & mock data access class to DBStats, fix bug that occurs when deleting merged assets that do not exist and fix diffviewer generation regression (expected URL was incorrect).
-rw-r--r--core/AssetManager/UIAsset/OnDiskUIAsset.php2
-rw-r--r--plugins/DBStats/API.php4
-rw-r--r--plugins/DBStats/DBStats.php11
-rw-r--r--plugins/DBStats/MySQLMetadataDataAccess.php70
-rwxr-xr-xplugins/DBStats/MySQLMetadataProvider.php52
-rw-r--r--plugins/DBStats/tests/Mocks/MockDataAccess.php151
-rw-r--r--plugins/DBStats/tests/UI/expected-ui-screenshots/DBStats_admin_page.pngbin0 -> 312771 bytes
-rw-r--r--tests/PHPUnit/TestingEnvironment.php2
-rw-r--r--tests/lib/screenshot-testing/support/diff-viewer.js2
9 files changed, 254 insertions, 40 deletions
diff --git a/core/AssetManager/UIAsset/OnDiskUIAsset.php b/core/AssetManager/UIAsset/OnDiskUIAsset.php
index f008f8aacd..f724709edf 100644
--- a/core/AssetManager/UIAsset/OnDiskUIAsset.php
+++ b/core/AssetManager/UIAsset/OnDiskUIAsset.php
@@ -103,7 +103,7 @@ class OnDiskUIAsset extends UIAsset
*/
private function assetIsReadable()
{
- return is_readable($this->getAbsoluteLocation());
+ return file_exists($this->getAbsoluteLocation()) && is_readable($this->getAbsoluteLocation());
}
public function getModificationDate()
diff --git a/plugins/DBStats/API.php b/plugins/DBStats/API.php
index 6da5604096..c90f327a7c 100644
--- a/plugins/DBStats/API.php
+++ b/plugins/DBStats/API.php
@@ -34,7 +34,9 @@ class API extends \Piwik\Plugin\API
*/
protected function __construct()
{
- $this->metadataProvider = new MySQLMetadataProvider();
+ if ($this->metadataProvider === null) {
+ $this->metadataProvider = new MySQLMetadataProvider();
+ }
}
/**
diff --git a/plugins/DBStats/DBStats.php b/plugins/DBStats/DBStats.php
index 402f88eb32..3f5a226696 100644
--- a/plugins/DBStats/DBStats.php
+++ b/plugins/DBStats/DBStats.php
@@ -37,7 +37,8 @@ class DBStats extends \Piwik\Plugin
'Menu.Admin.addItems' => 'addMenu',
'TaskScheduler.getScheduledTasks' => 'getScheduledTasks',
'ViewDataTable.configure' => 'configureViewDataTable',
- 'ViewDataTable.getDefaultType' => 'getDefaultTypeViewDataTable'
+ 'ViewDataTable.getDefaultType' => 'getDefaultTypeViewDataTable',
+ "TestingEnvironment.addHooks" => 'setupTestEnvironment'
);
}
@@ -374,4 +375,12 @@ class DBStats extends \Piwik\Plugin
$view->config->show_footer_message = Piwik::translate('Mobile_LastUpdated', $lastGenerated);
}
}
+
+ public function setupTestEnvironment($environment)
+ {
+ Piwik::addAction("MySQLMetadataProvider.createDao", function (&$dao) {
+ require_once dirname(__FILE__) . "/tests/Mocks/MockDataAccess.php";
+ $dao = new Mocks\MockDataAccess();
+ });
+ }
}
diff --git a/plugins/DBStats/MySQLMetadataDataAccess.php b/plugins/DBStats/MySQLMetadataDataAccess.php
new file mode 100644
index 0000000000..e5fee259a1
--- /dev/null
+++ b/plugins/DBStats/MySQLMetadataDataAccess.php
@@ -0,0 +1,70 @@
+<?php
+/**
+ * Piwik - Open source web analytics
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ *
+ */
+namespace Piwik\Plugins\DBStats;
+
+use Piwik\Db;
+use Piwik\Config;
+use \Exception;
+
+/**
+ * Data Access Object that serves MySQL stats.
+ */
+class MySQLMetadataDataAccess
+{
+ public function getDBStatus()
+ {
+ if (function_exists('mysql_connect')) {
+ $configDb = Config::getInstance()->database;
+ $link = mysql_connect($configDb['host'], $configDb['username'], $configDb['password']);
+ $status = mysql_stat($link);
+ mysql_close($link);
+ $status = explode(" ", $status);
+ } else {
+ $fullStatus = Db::fetchAssoc('SHOW STATUS');
+ if (empty($fullStatus)) {
+ throw new Exception('Error, SHOW STATUS failed');
+ }
+
+ $status = array(
+ 'Uptime' => $fullStatus['Uptime']['Value'],
+ 'Threads' => $fullStatus['Threads_running']['Value'],
+ 'Questions' => $fullStatus['Questions']['Value'],
+ 'Slow queries' => $fullStatus['Slow_queries']['Value'],
+ 'Flush tables' => $fullStatus['Flush_commands']['Value'],
+ 'Open tables' => $fullStatus['Open_tables']['Value'],
+ 'Opens' => 'unavailable', // not available via SHOW STATUS
+ 'Queries per second avg' => 'unavailable' // not available via SHOW STATUS
+ );
+ }
+
+ return $status;
+ }
+
+ public function getTableStatus($tableName)
+ {
+ return Db::fetchRow("SHOW TABLE STATUS LIKE ?", array($tableName));
+ }
+
+ public function getAllTablesStatus()
+ {
+ return Db::fetchAll("SHOW TABLE STATUS");
+ }
+
+ public function getRowCountsByArchiveName($tableName, $extraCols)
+ {
+ // otherwise, create data table & cache it
+ $sql = "SELECT name as 'label', COUNT(*) as 'row_count'$extraCols FROM $tableName GROUP BY name";
+ return Db::fetchAll($sql);
+ }
+
+ public function getColumnsFromTable($tableName)
+ {
+ return Db::fetchAll("SHOW COLUMNS FROM " . $tableName);
+ }
+} \ No newline at end of file
diff --git a/plugins/DBStats/MySQLMetadataProvider.php b/plugins/DBStats/MySQLMetadataProvider.php
index 549752fa35..4f3b346fb4 100755
--- a/plugins/DBStats/MySQLMetadataProvider.php
+++ b/plugins/DBStats/MySQLMetadataProvider.php
@@ -15,6 +15,7 @@ use Piwik\DataTable;
use Piwik\Db;
use Piwik\DbHelper;
use Piwik\Option;
+use Piwik\Piwik;
/**
* Utility class that provides general information about databases, including the size of
@@ -32,11 +33,20 @@ class MySQLMetadataProvider
private $tableStatuses = null;
/**
+ * Data access object.
+ */
+ public $dataAccess = null;
+
+ /**
* Constructor.
*/
public function __construct()
{
- // empty
+ Piwik::postTestEvent("MySQLMetadataProvider.createDao", array(&$this->dataAccess));
+
+ if ($this->dataAccess === null) {
+ $this->dataAccess = new MySQLMetadataDataAccess();
+ }
}
/**
@@ -47,31 +57,7 @@ class MySQLMetadataProvider
*/
public function getDBStatus()
{
- if (function_exists('mysql_connect')) {
- $configDb = Config::getInstance()->database;
- $link = mysql_connect($configDb['host'], $configDb['username'], $configDb['password']);
- $status = mysql_stat($link);
- mysql_close($link);
- $status = explode(" ", $status);
- } else {
- $fullStatus = Db::fetchAssoc('SHOW STATUS');
- if (empty($fullStatus)) {
- throw new Exception('Error, SHOW STATUS failed');
- }
-
- $status = array(
- 'Uptime' => $fullStatus['Uptime']['Value'],
- 'Threads' => $fullStatus['Threads_running']['Value'],
- 'Questions' => $fullStatus['Questions']['Value'],
- 'Slow queries' => $fullStatus['Slow_queries']['Value'],
- 'Flush tables' => $fullStatus['Flush_commands']['Value'],
- 'Open tables' => $fullStatus['Open_tables']['Value'],
- 'Opens' => 'unavailable', // not available via SHOW STATUS
- 'Queries per second avg' => 'unavailable' // not available via SHOW STATUS
- );
- }
-
- return $status;
+ return $this->dataAccess->getDBStatus();
}
/**
@@ -89,7 +75,7 @@ class MySQLMetadataProvider
if (!is_null($this->tableStatuses) && isset($this->tableStatuses[$prefixed])) {
return $this->tableStatuses[$prefixed];
} else {
- return Db::fetchRow("SHOW TABLE STATUS LIKE ?", array($prefixed));
+ return $this->dataAccess->getTableStatus($prefixed);
}
}
@@ -108,7 +94,7 @@ class MySQLMetadataProvider
$tablesPiwik = DbHelper::getTablesInstalled();
$this->tableStatuses = array();
- foreach (Db::fetchAll("SHOW TABLE STATUS") as $t) {
+ foreach ($this->dataAccess->getAllTablesStatus() as $t) {
if (in_array($t['Name'], $tablesPiwik)) {
$this->tableStatuses[$t['Name']] = $t;
}
@@ -230,11 +216,8 @@ class MySQLMetadataProvider
if ($cachedData !== false && !$forceCache) {
$table = DataTable::fromSerializedArray($cachedData);
} else {
- // otherwise, create data table & cache it
- $sql = "SELECT name as 'label', COUNT(*) as 'row_count'$extraCols FROM {$status['Name']} GROUP BY name";
-
$table = new DataTable();
- $table->addRowsFromSimpleArray(Db::fetchAll($sql));
+ $table->addRowsFromSimpleArray($this->dataAccess->getRowCountsByArchiveName($status['Name'], $extraCols));
$reduceArchiveRowName = array($this, 'reduceArchiveRowName');
$table->filter('GroupBy', array('label', $reduceArchiveRowName));
@@ -277,7 +260,7 @@ class MySQLMetadataProvider
static $fixedSizeColumnLength = null;
if (is_null($fixedSizeColumnLength)) {
$fixedSizeColumnLength = 0;
- foreach (Db::fetchAll("SHOW COLUMNS FROM " . $status['Name']) as $column) {
+ foreach ($this->dataAccess->getColumnsFromTable($status['Name']) as $column) {
$columnType = $column['Type'];
if (($paren = strpos($columnType, '(')) !== false) {
@@ -362,5 +345,4 @@ class MySQLMetadataProvider
return $name;
}
-}
-
+} \ No newline at end of file
diff --git a/plugins/DBStats/tests/Mocks/MockDataAccess.php b/plugins/DBStats/tests/Mocks/MockDataAccess.php
new file mode 100644
index 0000000000..b394a2d599
--- /dev/null
+++ b/plugins/DBStats/tests/Mocks/MockDataAccess.php
@@ -0,0 +1,151 @@
+<?php
+/**
+ * Piwik - Open source web analytics
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ *
+ */
+namespace Piwik\Plugins\DBStats\Mocks;
+
+use Piwik\Piwik;
+use Piwik\Common;
+
+class MockDataAccess
+{
+ public static $tableStatuses = array(
+ 'user' => array(5, 8192, 8192),
+ 'access' => array(9, 8192, 1024),
+ 'site' => array(10, 32000, 8192),
+ 'site_url' => array(8, 8192, 8192),
+ 'goal' => array(5, 16000, 8192),
+ 'logger_message' => array(100, 48000, 1024),
+ 'log_action' => array(3000, 64000, 32000),
+ 'log_visit' => array(1300, 64000, 16000),
+ 'log_conversion_item' => array(600, 64000, 16000),
+ 'log_conversion' => array(1000, 64000, 16000),
+ 'log_link_visit_action' => array(3000, 64000, 16000),
+ 'log_profiling' => array(0, 8192, 8192),
+ 'option' => array(200, 16000, 8192),
+ 'session' => array(0, 8192, 8192),
+ 'archive_numeric' => array(8000, 16000, 16000),
+ 'archive_blob' => array(8000, 128000, 1024)
+ );
+
+ public static $numericRowCountsByArchiveName = array(
+ array('label' => 'numericName1', 'row_count' => 93),
+ array('label' => 'numericName2', 'row_count' => 203),
+ array('label' => 'done', 'row_count' => 400),
+ array('label' => 'done.plugin', 'row_count' => 150),
+ array('label' => 'numericName3', 'row_count' => 340),
+ array('label' => 'numericName4', 'row_count' => 240),
+ );
+
+ public static $blobRowCountsByArchiveName = array(
+ array('label' => 'blobName1', 'row_count' => 123),
+ array('label' => 'blobName2', 'row_count' => 145),
+ array('label' => 'blobName3', 'row_count' => 83),
+ array('label' => 'blobName4', 'row_count' => 45),
+ );
+
+ public function getDBStatus()
+ {
+ return array(
+ 'Uptime' => 10000,
+ 'Threads' => 10,
+ 'Questions' => 15,
+ 'Slow queries' => 20,
+ 'Flush tables' => 300,
+ 'Open tables' => 2,
+ 'Opens' => 'unavailable',
+ 'Queries per second avg' => 'unavailable'
+ );
+ }
+
+ public function getTableStatus($tableName)
+ {
+ list($rows, $rowLength, $indexRowLength) = self::$tableStatuses[$this->getTableNameKey($tableName)];
+
+ return array(
+ 'Name' => $tableName,
+ 'Engine' => 'InnoDB',
+ 'Version' => 10,
+ 'Row_format' => 'Compact',
+ 'Rows' => $rows,
+ 'Avg_row_length' => $rowLength,
+ 'Data_length' => $rows * $rowLength,
+ 'Max_data_length' => 0,
+ 'Index_length' => $rows * $indexRowLength,
+ 'Data_free' => 236978176,
+ 'Auto_increment' => null,
+ 'Create_time' => '2014-01-01 23:54:56',
+ 'Update_time' => null,
+ 'Check_time' => null,
+ 'Collation' => 'utf8_general_ci',
+ 'Checksum' => null,
+ 'Create_options' => "",
+ 'Comment' => ""
+ );
+ }
+
+ public function getAllTablesStatus()
+ {
+ $result = array();
+ foreach (self::$tableStatuses as $tableName => $ignore) {
+ if ($tableName == "archive_numeric"
+ || $tableName == "archive_blob"
+ ) {
+ continue;
+ }
+
+ $unprefixed = Common::prefixTable($tableName);
+ $result[] = $this->getTableStatus($unprefixed);
+ }
+
+ $result[] = $this->getTableStatus(Common::prefixTable('archive_numeric_2012_01'));
+ $result[] = $this->getTableStatus(Common::prefixTable('archive_blob_2012_01'));
+
+ $result[] = $this->getTableStatus(Common::prefixTable('archive_numeric_2012_02'));
+ $result[] = $this->getTableStatus(Common::prefixTable('archive_blob_2012_02'));
+
+ $result[] = $this->getTableStatus(Common::prefixTable('archive_numeric_2012_03'));
+ $result[] = $this->getTableStatus(Common::prefixTable('archive_blob_2012_03'));
+
+ $result[] = $this->getTableStatus(Common::prefixTable('archive_numeric_2012_04'));
+ $result[] = $this->getTableStatus(Common::prefixTable('archive_blob_2012_04'));
+
+ return $result;
+ }
+
+ public function getTableNameKey($tableName)
+ {
+ $result = Common::unprefixTable($tableName);
+ if (strpos($tableName, "archive_numeric")) {
+ $result = "archive_numeric";
+ } else if (strpos($tableName, "archive_blob")) {
+ $result = "archive_blob";
+ }
+ return $result;
+ }
+
+ public function getRowCountsByArchiveName($tableName, $extraCols)
+ {
+ if (strpos($tableName, "achive_numeric")) {
+ return self::$numericRowCountsByArchiveName;
+ } else {
+ return self::$blobRowCountsByArchiveName;
+ }
+ }
+
+ public function getColumnsFromTable($tableName)
+ {
+ return array(
+ array('Field' => 'field1', 'Type' => 'datetime'),
+ array('Field' => 'field2', 'Type' => 'int(11) unsigned'),
+ array('Field' => 'field3', 'Type' => 'varchar(10)'),
+ array('Field' => 'field4', 'Type' => 'varchar(24)'),
+ array('Field' => 'field5', 'Type' => 'char(32)'),
+ array('Field' => 'field6', 'Type' => 'timestamp'),
+ );
+ }
+} \ No newline at end of file
diff --git a/plugins/DBStats/tests/UI/expected-ui-screenshots/DBStats_admin_page.png b/plugins/DBStats/tests/UI/expected-ui-screenshots/DBStats_admin_page.png
new file mode 100644
index 0000000000..6d1e0ba667
--- /dev/null
+++ b/plugins/DBStats/tests/UI/expected-ui-screenshots/DBStats_admin_page.png
Binary files differ
diff --git a/tests/PHPUnit/TestingEnvironment.php b/tests/PHPUnit/TestingEnvironment.php
index 28c0abf93c..e048f250eb 100644
--- a/tests/PHPUnit/TestingEnvironment.php
+++ b/tests/PHPUnit/TestingEnvironment.php
@@ -115,6 +115,6 @@ class Piwik_TestingEnvironment
file_put_contents($outputFile, Common::json_encode($outputContents));
});
- Piwik::postEvent("TestingEnvironment.addHooks", $testingEnvironment); // for plugins that need to inject special testing logic
+ Piwik::postEvent("TestingEnvironment.addHooks", array($testingEnvironment), $pending = true); // for plugins that need to inject special testing logic
}
} \ No newline at end of file
diff --git a/tests/lib/screenshot-testing/support/diff-viewer.js b/tests/lib/screenshot-testing/support/diff-viewer.js
index 738f428856..3fbbb66912 100644
--- a/tests/lib/screenshot-testing/support/diff-viewer.js
+++ b/tests/lib/screenshot-testing/support/diff-viewer.js
@@ -70,7 +70,7 @@ DiffViewerGenerator.prototype.generate = function (callback) {
var expectedUrlGithub = 'https://raw.github.com/piwik/piwik-ui-tests/master/expected-ui-screenshots/'
+ entry.name + '.png';
- var expectedHtml = '<a href="' + entry.expectedUrl + '">Expected</a>&nbsp;<a href="' + expectedUrlGithub
+ var expectedHtml = '<a href="' + expectedUrl + '">Expected</a>&nbsp;<a href="' + expectedUrlGithub
+ '">[Github]</a>';
} else {
var expectedHtml = '<em>Not found</em>';