summaryrefslogtreecommitdiff
path: root/modules/gallery
diff options
context:
space:
mode:
Diffstat (limited to 'modules/gallery')
-rw-r--r--modules/gallery/controllers/quick.php4
-rw-r--r--modules/gallery/helpers/system.php25
-rw-r--r--modules/gallery/tests/Mock_Built_In.php39
-rw-r--r--modules/gallery/tests/System_Helper_Test.php49
4 files changed, 115 insertions, 2 deletions
diff --git a/modules/gallery/controllers/quick.php b/modules/gallery/controllers/quick.php
index da4768fd..ce52cb8d 100644
--- a/modules/gallery/controllers/quick.php
+++ b/modules/gallery/controllers/quick.php
@@ -36,8 +36,8 @@ class Quick_Controller extends Controller {
}
if ($degrees) {
- $tmpfile = tempnam(TMPPATH, "rotate") . "." .
- pathinfo($item->file_path(), PATHINFO_EXTENSION);
+ $tmpfile = system::tempnam(TMPPATH, "rotate",
+ "." . pathinfo($item->file_path(), PATHINFO_EXTENSION));
gallery_graphics::rotate($item->file_path(), $tmpfile, array("degrees" => $degrees), $item);
$item->set_data_file($tmpfile);
$item->save();
diff --git a/modules/gallery/helpers/system.php b/modules/gallery/helpers/system.php
index c39c7227..31ecafa7 100644
--- a/modules/gallery/helpers/system.php
+++ b/modules/gallery/helpers/system.php
@@ -40,4 +40,29 @@ class system_Core {
}
return null;
}
+
+ /**
+ * Create a file with a unique file name.
+ * This helper is similar to the built-in tempnam, except that it supports an optional postfix.
+ */
+ static function tempnam($dir = TMPPATH, $prefix = "", $postfix = "") {
+ return self::_tempnam($dir, $prefix, $postfix, "tempnam");
+ }
+
+ // This helper provides a dependency-injected implementation of tempnam.
+ static function _tempnam($dir, $prefix, $postfix, $builtin) {
+ $success = false;
+ do {
+ $basename = call_user_func($builtin, $dir, $prefix);
+ if (!$basename) {
+ return false;
+ }
+ $filename = $basename . $postfix;
+ $success = !file_exists($filename) && @rename($basename, $filename);
+ if (!$success) {
+ @unlink($basename);
+ }
+ } while (!$success);
+ return $filename;
+ }
} \ No newline at end of file
diff --git a/modules/gallery/tests/Mock_Built_In.php b/modules/gallery/tests/Mock_Built_In.php
new file mode 100644
index 00000000..b02e5ecf
--- /dev/null
+++ b/modules/gallery/tests/Mock_Built_In.php
@@ -0,0 +1,39 @@
+<?php defined("SYSPATH") or die("No direct script access.");
+/**
+ * Gallery - a web based photo album viewer and editor
+ * Copyright (C) 2011 Chad Parry
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+/**
+ * Deterministic replacement for the built-in tempnam function.
+ * This is useful in unit tests where a dependency on tempnam needs to be mocked.
+ */
+class Mock_Built_In {
+ private $nonces;
+
+ function __construct() {
+ $this->nonces = func_get_args();
+ }
+
+ function _tempnam($dir, $prefix) {
+ if (empty($this->nonces))
+ return false;
+ $filename = "$dir/$prefix" . array_shift($this->nonces);
+ if (!touch($filename))
+ return false;
+ return $filename;
+ }
+}
diff --git a/modules/gallery/tests/System_Helper_Test.php b/modules/gallery/tests/System_Helper_Test.php
new file mode 100644
index 00000000..734f98ac
--- /dev/null
+++ b/modules/gallery/tests/System_Helper_Test.php
@@ -0,0 +1,49 @@
+<?php defined("SYSPATH") or die("No direct script access.");
+/**
+ * Gallery - a web based photo album viewer and editor
+ * Copyright (C) 2011 Chad Parry
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+class System_Helper_Test extends Gallery_Unit_Test_Case {
+ public function tempnam_random_test() {
+ $filename = system::tempnam(TMPPATH, "file", ".ext");
+ $this->assert_true(file_exists($filename), "File not created");
+ unlink($filename);
+ }
+
+ public function tempnam_collision_test() {
+ require_once('Mock_Built_In.php');
+ $existing = TMPPATH . "/file1.ext";
+ $available = TMPPATH . "/file2.ext";
+ touch($existing);
+ $filename = system::_tempnam(TMPPATH, "file", ".ext",
+ array(new Mock_Built_In("1", "2"), "_tempnam"));
+ unlink($existing);
+ $this->assert_true(file_exists($filename), "File not created");
+ unlink($filename);
+ $this->assert_equal($available, $filename, "Incorrect filename created");
+ }
+
+ public function tempnam_abort_test() {
+ require_once('Mock_Built_In.php');
+ $filename = system::_tempnam(TMPPATH, "file", ".ext",
+ array(new Mock_Built_In(), "_tempnam"));
+ if ($filename) {
+ @unlink($filename);
+ }
+ $this->assert_false($filename, "Operation not aborted");
+ }
+}