summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndreas Fischer <bantu@owncloud.com>2014-02-15 23:21:23 +0100
committerAndreas Fischer <bantu@owncloud.com>2014-05-29 16:26:01 +0200
commit2c36a4b07a088bca4f20c2f6386765dfc8ad07b7 (patch)
tree16f27fe03c0c6213c7aa5cbcb74c3deca8519cb6
parent82e17155bf11161a4f86a4d23872ebee753d63e2 (diff)
downloadnextcloud-server-2c36a4b07a088bca4f20c2f6386765dfc8ad07b7.tar.gz
nextcloud-server-2c36a4b07a088bca4f20c2f6386765dfc8ad07b7.zip
Add helper method for turning int|float into base-10 unsigned integer string.
-rw-r--r--lib/private/largefilehelper.php24
-rw-r--r--tests/lib/largefilehelper.php46
2 files changed, 70 insertions, 0 deletions
diff --git a/lib/private/largefilehelper.php b/lib/private/largefilehelper.php
index 5f5e14aca35..66626b4a7fe 100644
--- a/lib/private/largefilehelper.php
+++ b/lib/private/largefilehelper.php
@@ -13,6 +13,30 @@ namespace OC;
*/
class LargeFileHelper {
/**
+ * @brief Formats a signed integer or float as an unsigned integer base-10
+ * string. Passed strings will be checked for being base-10.
+ *
+ * @param int|float|string $number Number containing unsigned integer data
+ *
+ * @return string Unsigned integer base-10 string
+ */
+ public function formatUnsignedInteger($number) {
+ if (is_float($number)) {
+ // Undo the effect of the php.ini setting 'precision'.
+ return number_format($number, 0, '', '');
+ } else if (is_string($number) && ctype_digit($number)) {
+ return $number;
+ } else if (is_int($number)) {
+ // Interpret signed integer as unsigned integer.
+ return sprintf('%u', $number);
+ } else {
+ throw new \UnexpectedValueException(
+ 'Expected int, float or base-10 string'
+ );
+ }
+ }
+
+ /**
* @brief Tries to get the filesize of a file via various workarounds that
* even work for large files on 32-bit platforms.
*
diff --git a/tests/lib/largefilehelper.php b/tests/lib/largefilehelper.php
new file mode 100644
index 00000000000..5db1f9c5a74
--- /dev/null
+++ b/tests/lib/largefilehelper.php
@@ -0,0 +1,46 @@
+<?php
+/**
+ * Copyright (c) 2014 Andreas Fischer <bantu@owncloud.com>
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+
+namespace Test;
+
+class LargeFileHelper extends \PHPUnit_Framework_TestCase {
+ protected $helper;
+
+ public function setUp() {
+ parent::setUp();
+ $this->helper = new \OC\LargeFileHelper;
+ }
+
+ public function testFormatUnsignedIntegerFloat() {
+ $this->assertSame(
+ '9007199254740992',
+ $this->helper->formatUnsignedInteger((float) 9007199254740992)
+ );
+ }
+
+ public function testFormatUnsignedIntegerInt() {
+ $this->assertSame(
+ PHP_INT_SIZE === 4 ? '4294967295' : '18446744073709551615',
+ $this->helper->formatUnsignedInteger(-1)
+ );
+ }
+
+ public function testFormatUnsignedIntegerString() {
+ $this->assertSame(
+ '9007199254740993',
+ $this->helper->formatUnsignedInteger('9007199254740993')
+ );
+ }
+
+ /**
+ * @expectedException \UnexpectedValueException
+ */
+ public function testFormatUnsignedIntegerStringException() {
+ $this->helper->formatUnsignedInteger('900ABCD254740993');
+ }
+}