From 4a9d6b92c12ded3bf13f0039e947910bc7f45f88 Mon Sep 17 00:00:00 2001
From: Peter Rotich <peter@enhancesoft.com>
Date: Sat, 24 Mar 2018 07:47:21 +0000
Subject: [PATCH] Lint Test: Add var_dump checks

This commit adds var_dump test along with a few enhancements on the test
script.
---
 include/class.export.php                   |  2 +-
 include/class.pdf.php                      |  4 ++
 include/class.task.php                     |  2 +-
 include/class.ticket.php                   |  2 +-
 setup/test/run-tests.php                   |  2 +-
 setup/test/tests/class.test.php            | 27 +++++++------
 setup/test/tests/stubs.php                 | 45 ++++++++++++++++++++++
 setup/test/tests/test.extra-whitespace.php |  7 ++--
 setup/test/tests/test.jslint.php           |  3 +-
 setup/test/tests/test.shortopentags.php    |  5 ++-
 setup/test/tests/test.signals.php          | 15 ++------
 setup/test/tests/test.syntax.php           |  6 ++-
 setup/test/tests/test.undefinedmethods.php |  8 +++-
 setup/test/tests/test.var-dump.php         | 27 +++++++++++++
 14 files changed, 118 insertions(+), 37 deletions(-)
 create mode 100644 setup/test/tests/test.var-dump.php

diff --git a/include/class.export.php b/include/class.export.php
index 6a25afc4f..3a47bcc94 100644
--- a/include/class.export.php
+++ b/include/class.export.php
@@ -390,7 +390,7 @@ class ResultSetExporter {
     function dump() {
         # Useful for debug output
         while ($row=$this->nextArray()) {
-            var_dump($row);
+            var_dump($row); //nolint
         }
     }
 }
diff --git a/include/class.pdf.php b/include/class.pdf.php
index c12d071e8..cc395f388 100644
--- a/include/class.pdf.php
+++ b/include/class.pdf.php
@@ -45,6 +45,10 @@ class mPDFWithLocalImages extends mPDF {
         );
         return call_user_func_array(array('parent', 'WriteHtml'), $args);
     }
+
+    function output($name, $dest) {
+        return parent::Output($name, $dest);
+    }
 }
 
 class Ticket2PDF extends mPDFWithLocalImages
diff --git a/include/class.task.php b/include/class.task.php
index 145627245..367fa6062 100644
--- a/include/class.task.php
+++ b/include/class.task.php
@@ -995,7 +995,7 @@ class Task extends TaskModel implements RestrictedAccess, Threadable {
 
         $pdf = new Task2PDF($this, $options);
         $name = 'Task-'.$this->getNumber().'.pdf';
-        Http::download($name, 'application/pdf', $pdf->Output($name, 'S'));
+        Http::download($name, 'application/pdf', $pdf->output($name, 'S'));
         //Remember what the user selected - for autoselect on the next print.
         $_SESSION['PAPER_SIZE'] = $options['psize'];
         exit;
diff --git a/include/class.ticket.php b/include/class.ticket.php
index cbfa76580..3d7e148ca 100644
--- a/include/class.ticket.php
+++ b/include/class.ticket.php
@@ -3089,7 +3089,7 @@ implements RestrictedAccess, Threadable, Searchable {
 
         $pdf = new Ticket2PDF($this, $psize, $notes);
         $name = 'Ticket-'.$this->getNumber().'.pdf';
-        Http::download($name, 'application/pdf', $pdf->Output($name, 'S'));
+        Http::download($name, 'application/pdf', $pdf->output($name, 'S'));
         //Remember what the user selected - for autoselect on the next print.
         $_SESSION['PAPER_SIZE'] = $psize;
         exit;
diff --git a/setup/test/run-tests.php b/setup/test/run-tests.php
index fe55e681e..9834aa90a 100644
--- a/setup/test/run-tests.php
+++ b/setup/test/run-tests.php
@@ -43,7 +43,7 @@ if (function_exists('pcntl_signal')) {
 foreach (glob_recursive(dirname(__file__)."/tests/test.*.php") as $t) {
     if (strpos($t,"class.") !== false)
         continue;
-    $class = (include $t);
+    $class = @(include $t);
     if (!is_string($class))
         continue;
     if($selected_test && ($class != $selected_test))
diff --git a/setup/test/tests/class.test.php b/setup/test/tests/class.test.php
index 5dd6097dc..db05c2c16 100644
--- a/setup/test/tests/class.test.php
+++ b/setup/test/tests/class.test.php
@@ -31,10 +31,15 @@ class Test {
     function teardown() {
     }
 
-    static function getAllScripts($excludes=true, $root=false) {
+    function ignore3rdparty() {
+        return true;
+    }
+
+    function getAllScripts($pattern='*.php', $root=false, $excludes=true) {
         $root = $root ?: get_osticket_root_path();
+        $excludes = $excludes ?: $this->ignore3rdparty();
         $scripts = array();
-        foreach (glob_recursive("$root/*.php") as $s) {
+        foreach (glob_recursive("$root/$pattern") as $s) {
             $found = false;
             if ($excludes) {
                 foreach (self::$third_party_paths as $p) {
@@ -88,20 +93,20 @@ class Test {
         foreach ($rc->getMethods() as $m) {
             if (stripos($m->name, 'test') === 0) {
                 $this->setup();
-                call_user_func(array($this, $m->name));
+                @call_user_func(array($this, $m->name));
                 $this->teardown();
             }
         }
     }
 
-    function line_number_for_offset($filename, $offset) {
-        $lines = file($filename);
-        $bytes = $line = 0;
-        while ($bytes < $offset) {
-            $bytes += strlen(array_shift($lines));
-            $line += 1;
-        }
-        return $line;
+    function line_number_for_offset($file, $offset) {
+
+        if (is_file($file))
+            $content = file_get_contents($file, false, null, 0, $offset);
+        else
+            $content = @substr($file, 0, $offset);
+
+        return count(explode("\n", $content));
     }
 }
 
diff --git a/setup/test/tests/stubs.php b/setup/test/tests/stubs.php
index 0ad233926..6a7b0d285 100644
--- a/setup/test/tests/stubs.php
+++ b/setup/test/tests/stubs.php
@@ -104,6 +104,7 @@ class Phar {
     function startBuffering() {}
     function stopBuffering() {}
     function setSignatureAlgorithm() {}
+    function compress() {}
 }
 
 class ZipArchive {
@@ -114,6 +115,10 @@ class ZipArchive {
     function setExternalAttributesName() {}
 }
 
+class Spyc {
+    function YAMLLoad() {}
+}
+
 class finfo {
     function file() {}
     function buffer() {}
@@ -176,6 +181,7 @@ class NumberFormatter {
 
 class Collator {
     function setStrength() {}
+    function compare() {}
 }
 
 class Aws_Route53_Client {
@@ -189,4 +195,43 @@ class Memcache {
     function set() {}
     function get() {}
 }
+
+class Crypt_Hash {
+    function setKey() {}
+    function setIV() {}
+}
+
+class Crypt_AES {
+    function setKey() {}
+    function setIV() {}
+    function enableContinuousBuffer() {}
+}
+
+class PEAR {
+    function isError() {}
+    function mail() {}
+}
+
+class mail {
+    function factory() {}
+    function connect() {}
+    function disconnect() {}
+}
+
+class Mail_mime {
+    function headers() {}
+    function setTXTBody() {}
+    function setHTMLBody() {}
+    function addCc() {}
+}
+
+class mPDF {
+    function Output() {}
+}
+
+class HashPassword {
+    function CheckPassword() {}
+    function HashPassword() {}
+}
+
 ?>
diff --git a/setup/test/tests/test.extra-whitespace.php b/setup/test/tests/test.extra-whitespace.php
index 96d31ac84..ff3fc7be0 100644
--- a/setup/test/tests/test.extra-whitespace.php
+++ b/setup/test/tests/test.extra-whitespace.php
@@ -3,16 +3,17 @@ require_once "class.test.php";
 
 class ExtraWhitespace extends Test {
     var $name = "PHP Leading and Trailing Whitespace";
-    
+
     function testFindWhitespace() {
         foreach ($this->getAllScripts() as $s) {
             $matches = array();
+            $content = file_get_contents($s);
             if (preg_match_all('/^\s+<\?php|\?>\n\s+$/s',
-                    file_get_contents($s), $matches,
+                    $content, $matches,
                     PREG_OFFSET_CAPTURE) > 0) {
                 foreach ($matches[0] as $match)
                     $this->fail(
-                        $s, $this->line_number_for_offset($s, $match[1]),
+                        $s, $this->line_number_for_offset($content, $match[1]),
                         (strpos('?>', $match[0]) !== false)
                             ? 'Leading whitespace'
                             : 'Trailing whitespace');
diff --git a/setup/test/tests/test.jslint.php b/setup/test/tests/test.jslint.php
index 5f8fcfca9..e916715c6 100644
--- a/setup/test/tests/test.jslint.php
+++ b/setup/test/tests/test.jslint.php
@@ -6,8 +6,7 @@ class JsSyntaxTest extends Test {
 
     function testLintErrors() {
         $exit = 0;
-        $root = get_osticket_root_path();
-        foreach (glob_recursive("$root/*.js") as $s) {
+        foreach ($this->getAllScripts('*.js') as $s) {
             ob_start();
             system("jsl -process $s", $exit);
             $line = ob_get_contents();
diff --git a/setup/test/tests/test.shortopentags.php b/setup/test/tests/test.shortopentags.php
index 571fc08e1..ec5b8669e 100644
--- a/setup/test/tests/test.shortopentags.php
+++ b/setup/test/tests/test.shortopentags.php
@@ -7,13 +7,14 @@ class ShortOpenTag extends Test {
     function testFindShortOpens() {
         foreach ($this->getAllScripts() as $s) {
             $matches = array();
+            $content = file_get_contents($s);
             if (preg_match_all('/<\?\s*(?!php|xml).*$/m',
-                    file_get_contents($s), $matches,
+                    $content, $matches,
                     PREG_OFFSET_CAPTURE) > 0) {
                 foreach ($matches[0] as $match)
                     $this->fail(
                         $s,
-                        $this->line_number_for_offset($s, $match[1]),
+                        $this->line_number_for_offset($content, $match[1]),
                         $match[0]);
             }
             else $this->pass();
diff --git a/setup/test/tests/test.signals.php b/setup/test/tests/test.signals.php
index 7ce888383..0f6287a0a 100644
--- a/setup/test/tests/test.signals.php
+++ b/setup/test/tests/test.signals.php
@@ -16,14 +16,15 @@ class SignalsTest extends Test {
                 foreach ($matches as $match)
                     $published_signals[] = $match[1];
         foreach ($scripts as $s) {
+            $content = file_get_contents($s);
             if (preg_match_all("/^ *Signal::connect\('([^']+)'/m",
-                    file_get_contents($s), $matches,
+                    $content, $matches,
                     PREG_OFFSET_CAPTURE|PREG_SET_ORDER) > 0) {
                 foreach ($matches as $match) {
                     $match = $match[1];
                     if (!in_array($match[0], $published_signals))
                         $this->fail(
-                            $s, self::line_number_for_offset($s, $match[1]),
+                            $s, $this->line_number_for_offset($content, $match[1]),
                             "Signal '{$match[0]}' is never sent");
                     else
                         $this->pass();
@@ -31,16 +32,6 @@ class SignalsTest extends Test {
             }
         }
     }
-
-    function line_number_for_offset($filename, $offset) {
-        $lines = file($filename);
-        $bytes = $line = 0;
-        while ($bytes < $offset) {
-            $bytes += strlen(array_shift($lines));
-            $line += 1;
-        }
-        return $line;
-    }
 }
 
 return 'SignalsTest';
diff --git a/setup/test/tests/test.syntax.php b/setup/test/tests/test.syntax.php
index 0adf1465a..cc528f52f 100644
--- a/setup/test/tests/test.syntax.php
+++ b/setup/test/tests/test.syntax.php
@@ -4,9 +4,13 @@ require_once "class.test.php";
 class SyntaxTest extends Test {
     var $name = "PHP Syntax Checks";
 
+    function ignore3rdparty() {
+        return false;
+    }
+
     function testCompileErrors() {
         $exit = 0;
-        foreach ($this->getAllScripts(false) as $s) {
+        foreach ($this->getAllScripts() as $s) {
             ob_start();
             system("php -l $s", $exit);
             $line = ob_get_contents();
diff --git a/setup/test/tests/test.undefinedmethods.php b/setup/test/tests/test.undefinedmethods.php
index 83a227eee..16f4e76e1 100644
--- a/setup/test/tests/test.undefinedmethods.php
+++ b/setup/test/tests/test.undefinedmethods.php
@@ -4,8 +4,12 @@ require_once "class.test.php";
 class UndefinedMethods extends Test {
     var $name = "Access to undefined object methods";
 
-    function testFindShortOpen() {
-        $scripts = $this->getAllScripts(false);
+    function ignore3rdparty() {
+        return false;
+    }
+
+    function testUndefinedMethods() {
+        $scripts = $this->getAllScripts();
         $function_defs = array();
         foreach ($scripts as $s) {
             $matches = array();
diff --git a/setup/test/tests/test.var-dump.php b/setup/test/tests/test.var-dump.php
new file mode 100644
index 000000000..1244ec7b5
--- /dev/null
+++ b/setup/test/tests/test.var-dump.php
@@ -0,0 +1,27 @@
+<?php
+require_once "class.test.php";
+
+class VarDump extends Test {
+    var $name = "var_dump Checks";
+
+    function testFindShortOpens() {
+        $re = '/^(([\t ]*?)var_dump\(.*[\)|,|;])((?!nolint).)*$/m';
+        foreach ($this->getAllScripts() as $s) {
+            $matches = array();
+            $content = file_get_contents($s);
+            if (preg_match_all($re,
+                    $content, $matches,
+                    PREG_OFFSET_CAPTURE) > 0) {
+                foreach ($matches[0] as $match) {
+                    $this->fail(
+                        $s,
+                        $this->line_number_for_offset($content, $match[1]),
+                        trim($match[0]));
+                }
+            }
+            else $this->pass();
+        }
+    }
+}
+return 'VarDump';
+?>
-- 
GitLab