summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorRobin Appelman <icewind@owncloud.com>2014-02-07 13:42:18 +0100
committerRobin Appelman <icewind@owncloud.com>2014-02-07 13:45:59 +0100
commitb537d90e58913be203fd96f31b624559be00abeb (patch)
tree9af6c432b3b503303f1315f82f602844664f837d /tests
parentb35b22977cfc9412278ae70b49c402a95efca19e (diff)
parentb9e724d4ae7635435b3cc7793237c3ab9fe2a1c0 (diff)
downloadnextcloud-server-b537d90e58913be203fd96f31b624559be00abeb.tar.gz
nextcloud-server-b537d90e58913be203fd96f31b624559be00abeb.zip
use the 'new' server container for appconfig
Diffstat (limited to 'tests')
-rw-r--r--tests/data/db_structure.xml24
-rw-r--r--tests/data/db_structure2.xml23
-rw-r--r--tests/data/l10n/cs.php2
-rw-r--r--tests/data/l10n/de.php2
-rw-r--r--tests/data/l10n/ru.php2
-rw-r--r--tests/data/openssl.cnf350
-rw-r--r--tests/enable_all.php23
-rw-r--r--tests/karma.config.js189
-rw-r--r--tests/lib/api.php141
-rw-r--r--tests/lib/app.php13
-rw-r--r--tests/lib/appconfig.php2
-rw-r--r--tests/lib/appframework/AppTest.php7
-rw-r--r--tests/lib/appframework/controller/ControllerTest.php33
-rw-r--r--tests/lib/appframework/dependencyinjection/DIContainerTest.php21
-rw-r--r--tests/lib/appframework/http/DispatcherTest.php12
-rw-r--r--tests/lib/appframework/http/HttpTest.php1
-rw-r--r--tests/lib/appframework/http/RedirectResponseTest.php1
-rw-r--r--tests/lib/appframework/http/RequestTest.php134
-rw-r--r--tests/lib/appframework/http/ResponseTest.php3
-rw-r--r--tests/lib/appframework/http/TemplateResponseTest.php114
-rw-r--r--tests/lib/appframework/http/requeststream.php107
-rw-r--r--tests/lib/appframework/middleware/MiddlewareDispatcherTest.php12
-rw-r--r--tests/lib/appframework/middleware/MiddlewareTest.php6
-rw-r--r--tests/lib/appframework/middleware/security/SecurityMiddlewareTest.php68
-rw-r--r--tests/lib/autoloader.php6
-rw-r--r--tests/lib/avatar.php30
-rw-r--r--tests/lib/backgroundjob/dummyjoblist.php3
-rw-r--r--tests/lib/backgroundjob/job.php59
-rw-r--r--tests/lib/backgroundjob/queuedjob.php30
-rw-r--r--tests/lib/backgroundjob/timedjob.php51
-rw-r--r--tests/lib/connector/sabre/aborteduploaddetectionplugin.php22
-rw-r--r--tests/lib/connector/sabre/directory.php34
-rw-r--r--tests/lib/connector/sabre/file.php45
-rw-r--r--tests/lib/connector/sabre/objecttree.php32
-rw-r--r--tests/lib/db.php105
-rw-r--r--tests/lib/db/mdb2schemareader.php9
-rw-r--r--tests/lib/db/testschema.xml6
-rw-r--r--tests/lib/dbschema.php2
-rw-r--r--tests/lib/errorHandler.php62
-rw-r--r--tests/lib/files/cache/cache.php101
-rw-r--r--tests/lib/files/cache/homecache.php127
-rw-r--r--tests/lib/files/cache/scanner.php2
-rw-r--r--tests/lib/files/cache/updater.php62
-rw-r--r--tests/lib/files/cache/watcher.php3
-rw-r--r--tests/lib/files/etagtest.php79
-rw-r--r--tests/lib/files/filesystem.php167
-rw-r--r--tests/lib/files/storage/home.php96
-rw-r--r--tests/lib/files/storage/storage.php91
-rw-r--r--tests/lib/files/storage/wrapper/quota.php41
-rw-r--r--tests/lib/files/stream/quota.php72
-rw-r--r--tests/lib/files/view.php173
-rw-r--r--tests/lib/group.php18
-rw-r--r--tests/lib/helper.php35
-rw-r--r--tests/lib/l10n.php41
-rw-r--r--tests/lib/memcache/memcached.php12
-rw-r--r--tests/lib/ocs/privatedata.php141
-rw-r--r--tests/lib/preferences.php8
-rw-r--r--tests/lib/preview.php12
-rw-r--r--tests/lib/request.php138
-rw-r--r--tests/lib/share/share.php135
-rw-r--r--tests/lib/template.php190
-rw-r--r--tests/lib/user.php52
-rw-r--r--tests/lib/user/avataruserdummy.php27
-rw-r--r--tests/lib/user/backend.php8
-rw-r--r--tests/lib/user/database.php9
-rw-r--r--tests/lib/user/manager.php72
-rw-r--r--tests/lib/user/session.php15
-rw-r--r--tests/lib/user/user.php74
-rw-r--r--tests/lib/util.php58
-rw-r--r--tests/phpunit-autotest.xml7
-rw-r--r--tests/preseed-config.php5
-rw-r--r--tests/testcleanuplistener.php139
-rw-r--r--tests/win32-phpunit.php347
73 files changed, 3582 insertions, 761 deletions
diff --git a/tests/data/db_structure.xml b/tests/data/db_structure.xml
index 2e83bbb78c7..d98066c4b7e 100644
--- a/tests/data/db_structure.xml
+++ b/tests/data/db_structure.xml
@@ -21,6 +21,7 @@
<autoincrement>1</autoincrement>
<unsigned>true</unsigned>
<length>4</length>
+ <comments>This is the id</comments>
</field>
<field>
@@ -199,4 +200,27 @@
</declaration>
</table>
+ <table>
+ <name>*dbprefix*decimal</name>
+ <declaration>
+ <field>
+ <name>id</name>
+ <autoincrement>1</autoincrement>
+ <type>integer</type>
+ <default>0</default>
+ <notnull>true</notnull>
+ <length>4</length>
+ </field>
+
+ <field>
+ <name>decimaltest</name>
+ <type>decimal</type>
+ <default/>
+ <notnull>true</notnull>
+ <precision>12</precision>
+ <scale>2</scale>
+ </field>
+ </declaration>
+ </table>
+
</database>
diff --git a/tests/data/db_structure2.xml b/tests/data/db_structure2.xml
index bbfb24985cb..ae5f22e9573 100644
--- a/tests/data/db_structure2.xml
+++ b/tests/data/db_structure2.xml
@@ -96,4 +96,27 @@
</declaration>
</table>
+ <table>
+ <name>*dbprefix*decimal</name>
+ <declaration>
+ <field>
+ <name>id</name>
+ <autoincrement>1</autoincrement>
+ <type>integer</type>
+ <default>0</default>
+ <notnull>true</notnull>
+ <length>4</length>
+ </field>
+
+ <field>
+ <name>decimaltest</name>
+ <type>decimal</type>
+ <default/>
+ <notnull>true</notnull>
+ <precision>12</precision>
+ <scale>2</scale>
+ </field>
+ </declaration>
+ </table>
+
</database>
diff --git a/tests/data/l10n/cs.php b/tests/data/l10n/cs.php
index 1c5907bc148..de106ede026 100644
--- a/tests/data/l10n/cs.php
+++ b/tests/data/l10n/cs.php
@@ -1,5 +1,5 @@
<?php
$TRANSLATIONS = array(
- "_%n window__%n windows_" => array("%n okno", "%n okna", "%n oken")
+ "_%n window_::_%n windows_" => array("%n okno", "%n okna", "%n oken")
);
$PLURAL_FORMS = "nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;";
diff --git a/tests/data/l10n/de.php b/tests/data/l10n/de.php
index 858ec8af49c..93c9ab4209e 100644
--- a/tests/data/l10n/de.php
+++ b/tests/data/l10n/de.php
@@ -1,5 +1,5 @@
<?php
$TRANSLATIONS = array(
- "_%n file__%n files_" => array("%n Datei", "%n Dateien")
+ "_%n file_::_%n files_" => array("%n Datei", "%n Dateien")
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/tests/data/l10n/ru.php b/tests/data/l10n/ru.php
index dd46293db6c..b778e8d79af 100644
--- a/tests/data/l10n/ru.php
+++ b/tests/data/l10n/ru.php
@@ -1,5 +1,5 @@
<?php
$TRANSLATIONS = array(
- "_%n file__%n files_" => array("%n файл", "%n файла", "%n файлов")
+ "_%n file_::_%n files_" => array("%n файл", "%n файла", "%n файлов")
);
$PLURAL_FORMS = "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);";
diff --git a/tests/data/openssl.cnf b/tests/data/openssl.cnf
new file mode 100644
index 00000000000..1eb86c40126
--- /dev/null
+++ b/tests/data/openssl.cnf
@@ -0,0 +1,350 @@
+#
+# OpenSSL example configuration file.
+# This is mostly being used for generation of certificate requests.
+#
+
+# This definition stops the following lines choking if HOME isn't
+# defined.
+HOME = .
+RANDFILE = $ENV::HOME/.rnd
+
+# Extra OBJECT IDENTIFIER info:
+#oid_file = $ENV::HOME/.oid
+oid_section = new_oids
+
+# To use this configuration file with the "-extfile" option of the
+# "openssl x509" utility, name here the section containing the
+# X.509v3 extensions to use:
+# extensions =
+# (Alternatively, use a configuration file that has only
+# X.509v3 extensions in its main [= default] section.)
+
+[ new_oids ]
+
+# We can add new OIDs in here for use by 'ca', 'req' and 'ts'.
+# Add a simple OID like this:
+# testoid1=1.2.3.4
+# Or use config file substitution like this:
+# testoid2=${testoid1}.5.6
+
+# Policies used by the TSA examples.
+tsa_policy1 = 1.2.3.4.1
+tsa_policy2 = 1.2.3.4.5.6
+tsa_policy3 = 1.2.3.4.5.7
+
+####################################################################
+[ ca ]
+default_ca = CA_default # The default ca section
+
+####################################################################
+[ CA_default ]
+
+dir = ./demoCA # Where everything is kept
+certs = $dir/certs # Where the issued certs are kept
+crl_dir = $dir/crl # Where the issued crl are kept
+database = $dir/index.txt # database index file.
+#unique_subject = no # Set to 'no' to allow creation of
+ # several ctificates with same subject.
+new_certs_dir = $dir/newcerts # default place for new certs.
+
+certificate = $dir/cacert.pem # The CA certificate
+serial = $dir/serial # The current serial number
+crlnumber = $dir/crlnumber # the current crl number
+ # must be commented out to leave a V1 CRL
+crl = $dir/crl.pem # The current CRL
+private_key = $dir/private/cakey.pem# The private key
+RANDFILE = $dir/private/.rand # private random number file
+
+x509_extensions = usr_cert # The extentions to add to the cert
+
+# Comment out the following two lines for the "traditional"
+# (and highly broken) format.
+name_opt = ca_default # Subject Name options
+cert_opt = ca_default # Certificate field options
+
+# Extension copying option: use with caution.
+# copy_extensions = copy
+
+# Extensions to add to a CRL. Note: Netscape communicator chokes on V2 CRLs
+# so this is commented out by default to leave a V1 CRL.
+# crlnumber must also be commented out to leave a V1 CRL.
+# crl_extensions = crl_ext
+
+default_days = 365 # how long to certify for
+default_crl_days= 30 # how long before next CRL
+default_md = default # use public key default MD
+preserve = no # keep passed DN ordering
+
+# A few difference way of specifying how similar the request should look
+# For type CA, the listed attributes must be the same, and the optional
+# and supplied fields are just that :-)
+policy = policy_match
+
+# For the CA policy
+[ policy_match ]
+countryName = match
+stateOrProvinceName = match
+organizationName = match
+organizationalUnitName = optional
+commonName = supplied
+emailAddress = optional
+
+# For the 'anything' policy
+# At this point in time, you must list all acceptable 'object'
+# types.
+[ policy_anything ]
+countryName = optional
+stateOrProvinceName = optional
+localityName = optional
+organizationName = optional
+organizationalUnitName = optional
+commonName = supplied
+emailAddress = optional
+
+####################################################################
+[ req ]
+default_bits = 2048
+default_keyfile = privkey.pem
+distinguished_name = req_distinguished_name
+attributes = req_attributes
+x509_extensions = v3_ca # The extentions to add to the self signed cert
+
+# Passwords for private keys if not present they will be prompted for
+# input_password = secret
+# output_password = secret
+
+# This sets a mask for permitted string types. There are several options.
+# default: PrintableString, T61String, BMPString.
+# pkix : PrintableString, BMPString (PKIX recommendation before 2004)
+# utf8only: only UTF8Strings (PKIX recommendation after 2004).
+# nombstr : PrintableString, T61String (no BMPStrings or UTF8Strings).
+# MASK:XXXX a literal mask value.
+# WARNING: ancient versions of Netscape crash on BMPStrings or UTF8Strings.
+string_mask = utf8only
+
+# req_extensions = v3_req # The extensions to add to a certificate request
+
+[ req_distinguished_name ]
+countryName = Country Name (2 letter code)
+countryName_default = AU
+countryName_min = 2
+countryName_max = 2
+
+stateOrProvinceName = State or Province Name (full name)
+stateOrProvinceName_default = Some-State
+
+localityName = Locality Name (eg, city)
+
+0.organizationName = Organization Name (eg, company)
+0.organizationName_default = Internet Widgits Pty Ltd
+
+# we can do this but it is not needed normally :-)
+#1.organizationName = Second Organization Name (eg, company)
+#1.organizationName_default = World Wide Web Pty Ltd
+
+organizationalUnitName = Organizational Unit Name (eg, section)
+#organizationalUnitName_default =
+
+commonName = Common Name (e.g. server FQDN or YOUR name)
+commonName_max = 64
+
+emailAddress = Email Address
+emailAddress_max = 64
+
+# SET-ex3 = SET extension number 3
+
+[ req_attributes ]
+challengePassword = A challenge password
+challengePassword_min = 4
+challengePassword_max = 20
+
+unstructuredName = An optional company name
+
+[ usr_cert ]
+
+# These extensions are added when 'ca' signs a request.
+
+# This goes against PKIX guidelines but some CAs do it and some software
+# requires this to avoid interpreting an end user certificate as a CA.
+
+basicConstraints=CA:FALSE
+
+# Here are some examples of the usage of nsCertType. If it is omitted
+# the certificate can be used for anything *except* object signing.
+
+# This is OK for an SSL server.
+# nsCertType = server
+
+# For an object signing certificate this would be used.
+# nsCertType = objsign
+
+# For normal client use this is typical
+# nsCertType = client, email
+
+# and for everything including object signing:
+# nsCertType = client, email, objsign
+
+# This is typical in keyUsage for a client certificate.
+# keyUsage = nonRepudiation, digitalSignature, keyEncipherment
+
+# This will be displayed in Netscape's comment listbox.
+nsComment = "OpenSSL Generated Certificate"
+
+# PKIX recommendations harmless if included in all certificates.
+subjectKeyIdentifier=hash
+authorityKeyIdentifier=keyid,issuer
+
+# This stuff is for subjectAltName and issuerAltname.
+# Import the email address.
+# subjectAltName=email:copy
+# An alternative to produce certificates that aren't
+# deprecated according to PKIX.
+# subjectAltName=email:move
+
+# Copy subject details
+# issuerAltName=issuer:copy
+
+#nsCaRevocationUrl = http://www.domain.dom/ca-crl.pem
+#nsBaseUrl
+#nsRevocationUrl
+#nsRenewalUrl
+#nsCaPolicyUrl
+#nsSslServerName
+
+# This is required for TSA certificates.
+# extendedKeyUsage = critical,timeStamping
+
+[ v3_req ]
+
+# Extensions to add to a certificate request
+
+basicConstraints = CA:FALSE
+keyUsage = nonRepudiation, digitalSignature, keyEncipherment
+
+[ v3_ca ]
+
+
+# Extensions for a typical CA
+
+
+# PKIX recommendation.
+
+subjectKeyIdentifier=hash
+
+authorityKeyIdentifier=keyid:always,issuer
+
+# This is what PKIX recommends but some broken software chokes on critical
+# extensions.
+#basicConstraints = critical,CA:true
+# So we do this instead.
+basicConstraints = CA:true
+
+# Key usage: this is typical for a CA certificate. However since it will
+# prevent it being used as an test self-signed certificate it is best
+# left out by default.
+# keyUsage = cRLSign, keyCertSign
+
+# Some might want this also
+# nsCertType = sslCA, emailCA
+
+# Include email address in subject alt name: another PKIX recommendation
+# subjectAltName=email:copy
+# Copy issuer details
+# issuerAltName=issuer:copy
+
+# DER hex encoding of an extension: beware experts only!
+# obj=DER:02:03
+# Where 'obj' is a standard or added object
+# You can even override a supported extension:
+# basicConstraints= critical, DER:30:03:01:01:FF
+
+[ crl_ext ]
+
+# CRL extensions.
+# Only issuerAltName and authorityKeyIdentifier make any sense in a CRL.
+
+# issuerAltName=issuer:copy
+authorityKeyIdentifier=keyid:always
+
+[ proxy_cert_ext ]
+# These extensions should be added when creating a proxy certificate
+
+# This goes against PKIX guidelines but some CAs do it and some software
+# requires this to avoid interpreting an end user certificate as a CA.
+
+basicConstraints=CA:FALSE
+
+# Here are some examples of the usage of nsCertType. If it is omitted
+# the certificate can be used for anything *except* object signing.
+
+# This is OK for an SSL server.
+# nsCertType = server
+
+# For an object signing certificate this would be used.
+# nsCertType = objsign
+
+# For normal client use this is typical
+# nsCertType = client, email
+
+# and for everything including object signing:
+# nsCertType = client, email, objsign
+
+# This is typical in keyUsage for a client certificate.
+# keyUsage = nonRepudiation, digitalSignature, keyEncipherment
+
+# This will be displayed in Netscape's comment listbox.
+nsComment = "OpenSSL Generated Certificate"
+
+# PKIX recommendations harmless if included in all certificates.
+subjectKeyIdentifier=hash
+authorityKeyIdentifier=keyid,issuer
+
+# This stuff is for subjectAltName and issuerAltname.
+# Import the email address.
+# subjectAltName=email:copy
+# An alternative to produce certificates that aren't
+# deprecated according to PKIX.
+# subjectAltName=email:move
+
+# Copy subject details
+# issuerAltName=issuer:copy
+
+#nsCaRevocationUrl = http://www.domain.dom/ca-crl.pem
+#nsBaseUrl
+#nsRevocationUrl
+#nsRenewalUrl
+#nsCaPolicyUrl
+#nsSslServerName
+
+# This really needs to be in place for it to be a proxy certificate.
+proxyCertInfo=critical,language:id-ppl-anyLanguage,pathlen:3,policy:foo
+
+####################################################################
+[ tsa ]
+
+default_tsa = tsa_config1 # the default TSA section
+
+[ tsa_config1 ]
+
+# These are used by the TSA reply generation only.
+dir = ./demoCA # TSA root directory
+serial = $dir/tsaserial # The current serial number (mandatory)
+crypto_device = builtin # OpenSSL engine to use for signing
+signer_cert = $dir/tsacert.pem # The TSA signing certificate
+ # (optional)
+certs = $dir/cacert.pem # Certificate chain to include in reply
+ # (optional)
+signer_key = $dir/private/tsakey.pem # The TSA private key (optional)
+
+default_policy = tsa_policy1 # Policy if request did not specify it
+ # (optional)
+other_policies = tsa_policy2, tsa_policy3 # acceptable policies (optional)
+digests = md5, sha1 # Acceptable message digests (mandatory)
+accuracy = secs:1, millisecs:500, microsecs:100 # (optional)
+clock_precision_digits = 0 # number of digits after dot. (optional)
+ordering = yes # Is ordering defined for timestamps?
+ # (optional, default: no)
+tsa_name = yes # Must the TSA name be included in the reply?
+ # (optional, default: no)
+ess_cert_id_chain = no # Must the ESS cert id chain be included?
+ # (optional, default: no)
diff --git a/tests/enable_all.php b/tests/enable_all.php
index 111ed0e1357..efb43cae508 100644
--- a/tests/enable_all.php
+++ b/tests/enable_all.php
@@ -8,14 +8,17 @@
require_once __DIR__.'/../lib/base.php';
-OC_App::enable('files_encryption');
-OC_App::enable('calendar');
-OC_App::enable('contacts');
-OC_App::enable('apptemplateadvanced');
-OC_App::enable('appframework');
-#OC_App::enable('files_archive');
-#OC_App::enable('mozilla_sync');
-#OC_App::enable('news');
-#OC_App::enable('provisioning_api');
-#OC_App::enable('user_external');
+function enableApp($app) {
+ try {
+ OC_App::enable($app);
+ } catch (Exception $e) {
+ echo $e;
+ }
+}
+
+enableApp('files_sharing');
+enableApp('files_encryption');
+//enableApp('files_external');
+enableApp('user_ldap');
+enableApp('files_versions');
diff --git a/tests/karma.config.js b/tests/karma.config.js
new file mode 100644
index 00000000000..529bd31338f
--- /dev/null
+++ b/tests/karma.config.js
@@ -0,0 +1,189 @@
+/**
+* ownCloud
+*
+* @author Vincent Petry
+* @copyright 2014 Vincent Petry <pvince81@owncloud.com>
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+* License as published by the Free Software Foundation; either
+* version 3 of the License, or any later version.
+*
+* This library 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 AFFERO GENERAL PUBLIC LICENSE for more details.
+*
+* You should have received a copy of the GNU Affero General Public
+* License along with this library. If not, see <http://www.gnu.org/licenses/>.
+*
+*/
+
+/**
+ * This node module is run by the karma executable to specify its configuration.
+ *
+ * The list of files from all needed JavaScript files including the ones from the
+ * apps to test, and the test specs will be passed as configuration object.
+ *
+ * Note that it is possible to test a single app by setting the KARMA_TESTSUITE
+ * environment variable to the apps name, for example "core" or "files_encryption".
+ * Multiple apps can be specified by separating them with space.
+ *
+ * Setting the environment variable NOCOVERAGE to 1 will disable the coverage
+ * preprocessor, which is needed to be able to debug tests properly in a browser.
+ */
+
+/* jshint node: true */
+module.exports = function(config) {
+
+ function findApps() {
+ /*
+ var fs = require('fs');
+ var apps = fs.readdirSync('apps');
+ return apps;
+ */
+ // other apps tests don't run yet... needs further research / clean up
+ return ['files'];
+ }
+
+ // respect NOCOVERAGE env variable
+ // it is useful to disable coverage for debugging
+ // because the coverage preprocessor will wrap the JS files somehow
+ var enableCoverage = !parseInt(process.env.NOCOVERAGE, 10);
+ console.log('Coverage preprocessor: ', enableCoverage?'enabled':'disabled');
+
+ // default apps to test when none is specified (TODO: read from filesystem ?)
+ var appsToTest = process.env.KARMA_TESTSUITE;
+ if (appsToTest) {
+ appsToTest = appsToTest.split(' ');
+ }
+ else {
+ appsToTest = ['core'].concat(findApps());
+ }
+
+ console.log('Apps to test: ', appsToTest);
+
+ // read core files from core.json,
+ // these are required by all apps so always need to be loaded
+ // note that the loading order is important that's why they
+ // are specified in a separate file
+ var corePath = 'core/js/';
+ var coreModule = require('../' + corePath + 'core.json');
+ var testCore = false;
+ var files = [];
+ var index;
+ var preprocessors = {};
+
+ // find out what apps to test from appsToTest
+ index = appsToTest.indexOf('core');
+ if (index > -1) {
+ appsToTest.splice(index, 1);
+ testCore = true;
+ }
+
+ // extra test libs
+ files.push(corePath + 'tests/lib/sinon-1.7.3.js');
+
+ // core mocks
+ files.push(corePath + 'tests/specHelper.js');
+
+ // add core library files
+ for ( var i = 0; i < coreModule.libraries.length; i++ ) {
+ var srcFile = corePath + coreModule.libraries[i];
+ files.push(srcFile);
+ }
+
+ // add core modules files
+ for ( var i = 0; i < coreModule.modules.length; i++ ) {
+ var srcFile = corePath + coreModule.modules[i];
+ files.push(srcFile);
+ if (enableCoverage) {
+ preprocessors[srcFile] = 'coverage';
+ }
+ }
+
+ // TODO: settings pages
+
+ // need to test the core app as well ?
+ if (testCore) {
+ // core tests
+ files.push(corePath + 'tests/specs/*.js');
+ }
+
+ for ( var i = 0; i < appsToTest.length; i++ ) {
+ // add app JS
+ var srcFile = 'apps/' + appsToTest[i] + '/js/*.js';
+ files.push(srcFile);
+ if (enableCoverage) {
+ preprocessors[srcFile] = 'coverage';
+ }
+ // add test specs
+ files.push('apps/' + appsToTest[i] + '/tests/js/*.js');
+ }
+
+ config.set({
+
+ // base path, that will be used to resolve files and exclude
+ basePath: '..',
+
+ // frameworks to use
+ frameworks: ['jasmine'],
+
+ // list of files / patterns to load in the browser
+ files: files,
+
+ // list of files to exclude
+ exclude: [
+
+ ],
+
+ // test results reporter to use
+ // possible values: 'dots', 'progress', 'junit', 'growl', 'coverage'
+ reporters: ['dots', 'junit', 'coverage'],
+
+ junitReporter: {
+ outputFile: 'tests/autotest-results-js.xml'
+ },
+
+ // web server port
+ port: 9876,
+
+ preprocessors: preprocessors,
+
+ coverageReporter: {
+ dir:'tests/karma-coverage',
+ reporters: [
+ { type: 'html' },
+ { type: 'cobertura' }
+ ]
+ },
+
+ // enable / disable colors in the output (reporters and logs)
+ colors: true,
+
+
+ // level of logging
+ // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
+ logLevel: config.LOG_INFO,
+
+ // enable / disable watching file and executing tests whenever any file changes
+ autoWatch: false,
+
+ // Start these browsers, currently available:
+ // - Chrome
+ // - ChromeCanary
+ // - Firefox
+ // - Opera (has to be installed with `npm install karma-opera-launcher`)
+ // - Safari (only Mac; has to be installed with `npm install karma-safari-launcher`)
+ // - PhantomJS
+ // - IE (only Windows; has to be installed with `npm install karma-ie-launcher`)
+ browsers: ['PhantomJS'],
+
+ // If browser does not capture in given timeout [ms], kill it
+ captureTimeout: 60000,
+
+ // Continuous Integration mode
+ // if true, it capture browsers, run tests and exit
+ singleRun: false
+ });
+};
diff --git a/tests/lib/api.php b/tests/lib/api.php
new file mode 100644
index 00000000000..9c4324e63e0
--- /dev/null
+++ b/tests/lib/api.php
@@ -0,0 +1,141 @@
+<?php
+/**
+ * Copyright (c) 2013 Tom Needham <tom@owncloud.com>
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+
+class Test_API extends PHPUnit_Framework_TestCase {
+
+ // Helps build a response variable
+ function buildResponse($shipped, $data, $code, $message=null) {
+ return array(
+ 'shipped' => $shipped,
+ 'response' => new OC_OCS_Result($data, $code, $message),
+ 'app' => uniqid('testapp_', true),
+ );
+ }
+
+ // Validate details of the result
+ function checkResult($result, $success) {
+ // Check response is of correct type
+ $this->assertInstanceOf('OC_OCS_Result', $result);
+ // Check if it succeeded
+ /** @var $result OC_OCS_Result */
+ $this->assertEquals($success, $result->succeeded());
+ }
+
+ function dataProviderTestOneResult() {
+ return array(
+ array(100, true),
+ array(101, true),
+ array(997, false),
+ );
+ }
+
+ /**
+ * @dataProvider dataProviderTestOneResult
+ *
+ * @param $statusCode
+ * @param $succeeded
+ */
+ public function testOneResult($statusCode, $succeeded) {
+ // Setup some data arrays
+ $data1 = array(
+ 'users' => array(
+ 'tom' => array(
+ 'key' => 'value',
+ ),
+ 'frank' => array(
+ 'key' => 'value',
+ ),
+ ));
+
+ // Test merging one success result
+ $response = $this->buildResponse(true, $data1, $statusCode);
+ $result = OC_API::mergeResponses(array($response));
+ $this->assertEquals($response['response'], $result);
+ $this->checkResult($result, $succeeded);
+ }
+
+ function dataProviderTestMergeResponses() {
+ return array(
+ // Two shipped success results
+ array(true, 100, true, 100, true),
+ // Two shipped results, one success and one failure
+ array(true, 100, true, 998, false),
+ // Two shipped results, both failure
+ array(true, 997, true, 998, false),
+ // Two third party success results
+ array(false, 100, false, 100, true),
+ // Two third party results, one success and one failure
+ array(false, 100, false, 998, false),
+ // Two third party results, both failure
+ array(false, 997, false, 998, false),
+ // One of each, both success
+ array(false, 100, true, 100, true),
+ array(true, 100, false, 100, true),
+ // One of each, both failure
+ array(false, 997, true, 998, false),
+ // One of each, shipped success
+ array(false, 997, true, 100, true),
+ // One of each, third party success
+ array(false, 100, true, 998, false),
+ );
+ }
+ /**
+ * @dataProvider dataProviderTestMergeResponses
+ *
+ * Test the merging of multiple responses
+ * @param $statusCode1
+ * @param $statusCode2
+ * @param $succeeded
+ */
+ public function testMultipleMergeResponses($shipped1, $statusCode1, $shipped2, $statusCode2, $succeeded){
+ // Tests that app responses are merged correctly
+ // Setup some data arrays
+ $data1 = array(
+ 'users' => array(
+ 'tom' => array(
+ 'key' => 'value',
+ ),
+ 'frank' => array(
+ 'key' => 'value',
+ ),
+ ));
+
+ $data2 = array(
+ 'users' => array(
+ 'tom' => array(
+ 'key' => 'newvalue',
+ ),
+ 'jan' => array(
+ 'key' => 'value',
+ ),
+ ));
+
+ // Two shipped success results
+ $result = OC_API::mergeResponses(array(
+ $this->buildResponse($shipped1, $data1, $statusCode1, "message1"),
+ $this->buildResponse($shipped2, $data2, $statusCode2, "message2"),
+ ));
+ $this->checkResult($result, $succeeded);
+ $resultData = $result->getData();
+ $resultMeta = $result->getMeta();
+ $resultStatusCode = $result->getStatusCode();
+
+ $this->assertArrayHasKey('jan', $resultData['users']);
+
+ // check if the returned status message matches the selected status code
+ if ($resultStatusCode === 997) {
+ $this->assertEquals('message1', $resultMeta['message']);
+ } elseif ($resultStatusCode === 998) {
+ $this->assertEquals('message2', $resultMeta['message']);
+ } elseif ($resultStatusCode === 100) {
+ $this->assertEquals(null, $resultMeta['message']);
+ }
+
+ }
+
+}
diff --git a/tests/lib/app.php b/tests/lib/app.php
index 52eade90a6e..49f40f089bb 100644
--- a/tests/lib/app.php
+++ b/tests/lib/app.php
@@ -79,4 +79,17 @@ class Test_App extends PHPUnit_Framework_TestCase {
$this->assertFalse(OC_App::isAppVersionCompatible($oc, $app));
}
+ /**
+ * Tests that the app order is correct
+ */
+ public function testGetEnabledAppsIsSorted() {
+ $apps = \OC_App::getEnabledApps(true);
+ // copy array
+ $sortedApps = $apps;
+ sort($sortedApps);
+ // 'files' is always on top
+ unset($sortedApps[array_search('files', $sortedApps)]);
+ array_unshift($sortedApps, 'files');
+ $this->assertEquals($sortedApps, $apps);
+ }
}
diff --git a/tests/lib/appconfig.php b/tests/lib/appconfig.php
index 1f605263560..29b29778fd2 100644
--- a/tests/lib/appconfig.php
+++ b/tests/lib/appconfig.php
@@ -36,7 +36,7 @@ class Test_Appconfig extends PHPUnit_Framework_TestCase {
}
public function testGetApps() {
- $query = \OC_DB::prepare('SELECT DISTINCT `appid` FROM `*PREFIX*appconfig`');
+ $query = \OC_DB::prepare('SELECT DISTINCT `appid` FROM `*PREFIX*appconfig` ORDER BY `appid`');
$result = $query->execute();
$expected = array();
while ($row = $result->fetchRow()) {
diff --git a/tests/lib/appframework/AppTest.php b/tests/lib/appframework/AppTest.php
index 80abaefc43b..3628e4ceab2 100644
--- a/tests/lib/appframework/AppTest.php
+++ b/tests/lib/appframework/AppTest.php
@@ -38,9 +38,9 @@ class AppTest extends \PHPUnit_Framework_TestCase {
private $controllerMethod;
protected function setUp() {
- $this->container = new \OC\AppFramework\DependencyInjection\DIContainer('test');
+ $this->container = new \OC\AppFramework\DependencyInjection\DIContainer('test', array());
$this->controller = $this->getMockBuilder(
- 'OC\AppFramework\Controller\Controller')
+ 'OCP\AppFramework\Controller')
->disableOriginalConstructor()
->getMock();
$this->dispatcher = $this->getMockBuilder(
@@ -56,6 +56,7 @@ class AppTest extends \PHPUnit_Framework_TestCase {
$this->container[$this->controllerName] = $this->controller;
$this->container['Dispatcher'] = $this->dispatcher;
+ $this->container['urlParams'] = array();
}
@@ -69,7 +70,7 @@ class AppTest extends \PHPUnit_Framework_TestCase {
$this->expectOutputString('');
- App::main($this->controllerName, $this->controllerMethod, array(),
+ App::main($this->controllerName, $this->controllerMethod,
$this->container);
}
diff --git a/tests/lib/appframework/controller/ControllerTest.php b/tests/lib/appframework/controller/ControllerTest.php
index 4441bddfca9..f17d5f24aa5 100644
--- a/tests/lib/appframework/controller/ControllerTest.php
+++ b/tests/lib/appframework/controller/ControllerTest.php
@@ -25,13 +25,10 @@
namespace Test\AppFramework\Controller;
use OC\AppFramework\Http\Request;
-use OC\AppFramework\Controller\Controller;
+use OCP\AppFramework\Controller;
use OCP\AppFramework\Http\TemplateResponse;
-//require_once __DIR__ . "/../classloader.php";
-
-
class ChildController extends Controller {};
class ControllerTest extends \PHPUnit_Framework_TestCase {
@@ -40,7 +37,7 @@ class ControllerTest extends \PHPUnit_Framework_TestCase {
* @var Controller
*/
private $controller;
- private $api;
+ private $app;
protected function setUp(){
$request = new Request(
@@ -55,13 +52,13 @@ class ControllerTest extends \PHPUnit_Framework_TestCase {
)
);
- $this->api = $this->getMock('OC\AppFramework\Core\API',
+ $this->app = $this->getMock('OC\AppFramework\DependencyInjection\DIContainer',
array('getAppName'), array('test'));
- $this->api->expects($this->any())
+ $this->app->expects($this->any())
->method('getAppName')
->will($this->returnValue('apptemplate_advanced'));
- $this->controller = new ChildController($this->api, $request);
+ $this->controller = new ChildController($this->app, $request);
}
@@ -114,26 +111,6 @@ class ControllerTest extends \PHPUnit_Framework_TestCase {
}
- public function testRenderRenderAs(){
- $ocTpl = $this->getMock('Template', array('fetchPage'));
- $ocTpl->expects($this->once())
- ->method('fetchPage');
-
- $api = $this->getMock('OC\AppFramework\Core\API',
- array('getAppName', 'getTemplate'), array('app'));
- $api->expects($this->any())
- ->method('getAppName')
- ->will($this->returnValue('app'));
- $api->expects($this->once())
- ->method('getTemplate')
- ->with($this->equalTo('home'), $this->equalTo('admin'), $this->equalTo('app'))
- ->will($this->returnValue($ocTpl));
-
- $this->controller = new ChildController($api, new Request());
- $this->controller->render('home', array(), 'admin')->render();
- }
-
-
public function testRenderHeaders(){
$headers = array('one', 'two');
$response = $this->controller->render('', array(), '', $headers);
diff --git a/tests/lib/appframework/dependencyinjection/DIContainerTest.php b/tests/lib/appframework/dependencyinjection/DIContainerTest.php
index 25fdd202839..f3ebff0207f 100644
--- a/tests/lib/appframework/dependencyinjection/DIContainerTest.php
+++ b/tests/lib/appframework/dependencyinjection/DIContainerTest.php
@@ -29,23 +29,14 @@ namespace OC\AppFramework\DependencyInjection;
use \OC\AppFramework\Http\Request;
-//require_once(__DIR__ . "/../classloader.php");
-
-
class DIContainerTest extends \PHPUnit_Framework_TestCase {
private $container;
+ private $api;
protected function setUp(){
$this->container = new DIContainer('name');
- $this->api = $this->getMock('OC\AppFramework\Core\API', array('getTrans'), array('hi'));
- }
-
- private function exchangeAPI(){
- $this->api->expects($this->any())
- ->method('getTrans')
- ->will($this->returnValue('yo'));
- $this->container['API'] = $this->api;
+ $this->api = $this->getMock('OC\AppFramework\Core\API', array(), array('hi'));
}
public function testProvidesAPI(){
@@ -87,12 +78,4 @@ class DIContainerTest extends \PHPUnit_Framework_TestCase {
}
- public function testMiddlewareDispatcherDoesNotIncludeTwigWhenTplDirectoryNotSet(){
- $this->container['Request'] = new Request();
- $this->exchangeAPI();
- $dispatcher = $this->container['MiddlewareDispatcher'];
-
- $this->assertEquals(1, count($dispatcher->getMiddlewares()));
- }
-
}
diff --git a/tests/lib/appframework/http/DispatcherTest.php b/tests/lib/appframework/http/DispatcherTest.php
index 849b0ca97a6..6cf0da879ff 100644
--- a/tests/lib/appframework/http/DispatcherTest.php
+++ b/tests/lib/appframework/http/DispatcherTest.php
@@ -26,7 +26,7 @@ namespace OC\AppFramework\Http;
use OC\AppFramework\Core\API;
use OC\AppFramework\Middleware\MiddlewareDispatcher;
-
+use OCP\AppFramework\Http;
//require_once(__DIR__ . "/../classloader.php");
@@ -44,8 +44,8 @@ class DispatcherTest extends \PHPUnit_Framework_TestCase {
protected function setUp() {
$this->controllerMethod = 'test';
- $api = $this->getMockBuilder(
- '\OC\AppFramework\Core\API')
+ $app = $this->getMockBuilder(
+ 'OC\AppFramework\DependencyInjection\DIContainer')
->disableOriginalConstructor()
->getMock();
$request = $this->getMockBuilder(
@@ -53,7 +53,7 @@ class DispatcherTest extends \PHPUnit_Framework_TestCase {
->disableOriginalConstructor()
->getMock();
$this->http = $this->getMockBuilder(
- '\OC\AppFramework\Http\Http')
+ '\OC\AppFramework\Http')
->disableOriginalConstructor()
->getMock();
@@ -62,8 +62,8 @@ class DispatcherTest extends \PHPUnit_Framework_TestCase {
->disableOriginalConstructor()
->getMock();
$this->controller = $this->getMock(
- '\OC\AppFramework\Controller\Controller',
- array($this->controllerMethod), array($api, $request));
+ '\OCP\AppFramework\Controller',
+ array($this->controllerMethod), array($app, $request));
$this->dispatcher = new Dispatcher(
$this->http, $this->middlewareDispatcher);
diff --git a/tests/lib/appframework/http/HttpTest.php b/tests/lib/appframework/http/HttpTest.php
index 382d511b116..0bdcee24c99 100644
--- a/tests/lib/appframework/http/HttpTest.php
+++ b/tests/lib/appframework/http/HttpTest.php
@@ -24,6 +24,7 @@
namespace OC\AppFramework\Http;
+use OC\AppFramework\Http;
//require_once(__DIR__ . "/../classloader.php");
diff --git a/tests/lib/appframework/http/RedirectResponseTest.php b/tests/lib/appframework/http/RedirectResponseTest.php
index 1946655b0fa..f82d0c3a675 100644
--- a/tests/lib/appframework/http/RedirectResponseTest.php
+++ b/tests/lib/appframework/http/RedirectResponseTest.php
@@ -24,6 +24,7 @@
namespace OC\AppFramework\Http;
+use OCP\AppFramework\Http;
//require_once(__DIR__ . "/../classloader.php");
diff --git a/tests/lib/appframework/http/RequestTest.php b/tests/lib/appframework/http/RequestTest.php
index 0371c870cf2..00473a8c44f 100644
--- a/tests/lib/appframework/http/RequestTest.php
+++ b/tests/lib/appframework/http/RequestTest.php
@@ -8,12 +8,26 @@
namespace OC\AppFramework\Http;
+global $data;
class RequestTest extends \PHPUnit_Framework_TestCase {
+ public function setUp() {
+ require_once __DIR__ . '/requeststream.php';
+ if (in_array('fakeinput', stream_get_wrappers())) {
+ stream_wrapper_unregister('fakeinput');
+ }
+ stream_wrapper_register('fakeinput', 'RequestStream');
+ }
+
+ public function tearDown() {
+ stream_wrapper_unregister('fakeinput');
+ }
+
public function testRequestAccessors() {
$vars = array(
'get' => array('name' => 'John Q. Public', 'nickname' => 'Joey'),
+ 'method' => 'GET',
);
$request = new Request($vars);
@@ -31,6 +45,7 @@ class RequestTest extends \PHPUnit_Framework_TestCase {
$this->assertEquals('Joey', $request->get['nickname']);
// Always returns null if variable not set.
$this->assertEquals(null, $request->{'flickname'});
+
}
// urlParams has precedence over POST which has precedence over GET
@@ -73,4 +88,123 @@ class RequestTest extends \PHPUnit_Framework_TestCase {
$request->{'nickname'} = 'Janey';
}
+ /**
+ * @expectedException LogicException
+ */
+ public function testGetTheMethodRight() {
+ $vars = array(
+ 'get' => array('name' => 'John Q. Public', 'nickname' => 'Joey'),
+ 'method' => 'GET',
+ );
+
+ $request = new Request($vars);
+ $result = $request->post;
+ }
+
+ public function testTheMethodIsRight() {
+ $vars = array(
+ 'get' => array('name' => 'John Q. Public', 'nickname' => 'Joey'),
+ 'method' => 'GET',
+ );
+
+ $request = new Request($vars);
+ $this->assertEquals('GET', $request->method);
+ $result = $request->get;
+ $this->assertEquals('John Q. Public', $result['name']);
+ $this->assertEquals('Joey', $result['nickname']);
+ }
+
+ public function testJsonPost() {
+ global $data;
+ $data = '{"name": "John Q. Public", "nickname": "Joey"}';
+ $vars = array(
+ 'method' => 'POST',
+ 'server' => array('CONTENT_TYPE' => 'application/json; utf-8'),
+ );
+
+ $request = new Request($vars);
+ $this->assertEquals('POST', $request->method);
+ $result = $request->post;
+ $this->assertEquals('John Q. Public', $result['name']);
+ $this->assertEquals('Joey', $result['nickname']);
+ $this->assertEquals('Joey', $request->params['nickname']);
+ $this->assertEquals('Joey', $request['nickname']);
+ }
+
+ public function testPatch() {
+ global $data;
+ $data = http_build_query(array('name' => 'John Q. Public', 'nickname' => 'Joey'), '', '&');
+
+ $vars = array(
+ 'method' => 'PATCH',
+ 'server' => array('CONTENT_TYPE' => 'application/x-www-form-urlencoded'),
+ );
+
+ $request = new Request($vars);
+
+ $this->assertEquals('PATCH', $request->method);
+ $result = $request->patch;
+
+ $this->assertEquals('John Q. Public', $result['name']);
+ $this->assertEquals('Joey', $result['nickname']);
+ }
+
+ public function testJsonPatchAndPut() {
+ global $data;
+
+ // PUT content
+ $data = '{"name": "John Q. Public", "nickname": "Joey"}';
+ $vars = array(
+ 'method' => 'PUT',
+ 'server' => array('CONTENT_TYPE' => 'application/json; utf-8'),
+ );
+
+ $request = new Request($vars);
+
+ $this->assertEquals('PUT', $request->method);
+ $result = $request->put;
+
+ $this->assertEquals('John Q. Public', $result['name']);
+ $this->assertEquals('Joey', $result['nickname']);
+
+ // PATCH content
+ $data = '{"name": "John Q. Public", "nickname": null}';
+ $vars = array(
+ 'method' => 'PATCH',
+ 'server' => array('CONTENT_TYPE' => 'application/json; utf-8'),
+ );
+
+ $request = new Request($vars);
+
+ $this->assertEquals('PATCH', $request->method);
+ $result = $request->patch;
+
+ $this->assertEquals('John Q. Public', $result['name']);
+ $this->assertEquals(null, $result['nickname']);
+ }
+
+ public function testPutStream() {
+ global $data;
+ $data = file_get_contents(__DIR__ . '/../../../data/testimage.png');
+
+ $vars = array(
+ 'put' => $data,
+ 'method' => 'PUT',
+ 'server' => array('CONTENT_TYPE' => 'image/png'),
+ );
+
+ $request = new Request($vars);
+ $this->assertEquals('PUT', $request->method);
+ $resource = $request->put;
+ $contents = stream_get_contents($resource);
+ $this->assertEquals($data, $contents);
+
+ try {
+ $resource = $request->put;
+ } catch(\LogicException $e) {
+ return;
+ }
+ $this->fail('Expected LogicException.');
+
+ }
}
diff --git a/tests/lib/appframework/http/ResponseTest.php b/tests/lib/appframework/http/ResponseTest.php
index 7e09086f801..1a38c38c1e7 100644
--- a/tests/lib/appframework/http/ResponseTest.php
+++ b/tests/lib/appframework/http/ResponseTest.php
@@ -25,7 +25,8 @@
namespace OC\AppFramework\Http;
-use OCP\AppFramework\Http\Response;
+use OCP\AppFramework\Http\Response,
+ OCP\AppFramework\Http;
class ResponseTest extends \PHPUnit_Framework_TestCase {
diff --git a/tests/lib/appframework/http/TemplateResponseTest.php b/tests/lib/appframework/http/TemplateResponseTest.php
index 3c6d29cd339..a583d9da14f 100644
--- a/tests/lib/appframework/http/TemplateResponseTest.php
+++ b/tests/lib/appframework/http/TemplateResponseTest.php
@@ -63,93 +63,33 @@ class TemplateResponseTest extends \PHPUnit_Framework_TestCase {
}
- public function testRender(){
- $ocTpl = $this->getMock('Template', array('fetchPage'));
- $ocTpl->expects($this->once())
- ->method('fetchPage');
-
- $api = $this->getMock('OC\AppFramework\Core\API',
- array('getAppName', 'getTemplate'), array('app'));
- $api->expects($this->any())
- ->method('getAppName')
- ->will($this->returnValue('app'));
- $api->expects($this->once())
- ->method('getTemplate')
- ->with($this->equalTo('home'), $this->equalTo('user'), $this->equalTo('app'))
- ->will($this->returnValue($ocTpl));
-
- $tpl = new TemplateResponse($api, 'home');
-
- $tpl->render();
- }
-
-
- public function testRenderAssignsParams(){
- $params = array('john' => 'doe');
-
- $ocTpl = $this->getMock('Template', array('assign', 'fetchPage'));
- $ocTpl->expects($this->once())
- ->method('assign')
- ->with($this->equalTo('john'), $this->equalTo('doe'));
-
- $api = $this->getMock('OC\AppFramework\Core\API',
- array('getAppName', 'getTemplate'), array('app'));
- $api->expects($this->any())
- ->method('getAppName')
- ->will($this->returnValue('app'));
- $api->expects($this->once())
- ->method('getTemplate')
- ->with($this->equalTo('home'), $this->equalTo('user'), $this->equalTo('app'))
- ->will($this->returnValue($ocTpl));
-
- $tpl = new TemplateResponse($api, 'home');
- $tpl->setParams($params);
-
- $tpl->render();
- }
-
-
- public function testRenderDifferentApp(){
- $ocTpl = $this->getMock('Template', array('fetchPage'));
- $ocTpl->expects($this->once())
- ->method('fetchPage');
-
- $api = $this->getMock('OC\AppFramework\Core\API',
- array('getAppName', 'getTemplate'), array('app'));
- $api->expects($this->any())
- ->method('getAppName')
- ->will($this->returnValue('app'));
- $api->expects($this->once())
- ->method('getTemplate')
- ->with($this->equalTo('home'), $this->equalTo('user'), $this->equalTo('app2'))
- ->will($this->returnValue($ocTpl));
-
- $tpl = new TemplateResponse($api, 'home', 'app2');
-
- $tpl->render();
- }
-
-
- public function testRenderDifferentRenderAs(){
- $ocTpl = $this->getMock('Template', array('fetchPage'));
- $ocTpl->expects($this->once())
- ->method('fetchPage');
-
- $api = $this->getMock('OC\AppFramework\Core\API',
- array('getAppName', 'getTemplate'), array('app'));
- $api->expects($this->any())
- ->method('getAppName')
- ->will($this->returnValue('app'));
- $api->expects($this->once())
- ->method('getTemplate')
- ->with($this->equalTo('home'), $this->equalTo('admin'), $this->equalTo('app'))
- ->will($this->returnValue($ocTpl));
-
- $tpl = new TemplateResponse($api, 'home');
- $tpl->renderAs('admin');
-
- $tpl->render();
- }
+// public function testRender(){
+// $ocTpl = $this->getMock('Template', array('fetchPage'));
+// $ocTpl->expects($this->once())
+// ->method('fetchPage');
+//
+// $tpl = new TemplateResponse('core', 'error');
+//
+// $tpl->render();
+// }
+//
+//
+// public function testRenderAssignsParams(){
+// $params = array('john' => 'doe');
+//
+// $tpl = new TemplateResponse('app', 'home');
+// $tpl->setParams($params);
+//
+// $tpl->render();
+// }
+//
+//
+// public function testRenderDifferentApp(){
+//
+// $tpl = new TemplateResponse('app', 'home', 'app2');
+//
+// $tpl->render();
+// }
public function testGetRenderAs(){
diff --git a/tests/lib/appframework/http/requeststream.php b/tests/lib/appframework/http/requeststream.php
new file mode 100644
index 00000000000..e1bf5c2c6bb
--- /dev/null
+++ b/tests/lib/appframework/http/requeststream.php
@@ -0,0 +1,107 @@
+<?php
+/**
+ * Copy of http://dk1.php.net/manual/en/stream.streamwrapper.example-1.php
+ * Used to simulate php://input for Request tests
+ */
+class RequestStream {
+ protected $position;
+ protected $varname;
+
+ function stream_open($path, $mode, $options, &$opened_path) {
+ $url = parse_url($path);
+ $this->varname = $url["host"];
+ $this->position = 0;
+
+ return true;
+ }
+
+ function stream_read($count) {
+ $ret = substr($GLOBALS[$this->varname], $this->position, $count);
+ $this->position += strlen($ret);
+ return $ret;
+ }
+
+ function stream_write($data) {
+ $left = substr($GLOBALS[$this->varname], 0, $this->position);
+ $right = substr($GLOBALS[$this->varname], $this->position + strlen($data));
+ $GLOBALS[$this->varname] = $left . $data . $right;
+ $this->position += strlen($data);
+ return strlen($data);
+ }
+
+ function stream_tell() {
+ return $this->position;
+ }
+
+ function stream_eof() {
+ return $this->position >= strlen($GLOBALS[$this->varname]);
+ }
+
+ function stream_seek($offset, $whence) {
+ switch ($whence) {
+ case SEEK_SET:
+ if ($offset < strlen($GLOBALS[$this->varname]) && $offset >= 0) {
+ $this->position = $offset;
+ return true;
+ } else {
+ return false;
+ }
+ break;
+
+ case SEEK_CUR:
+ if ($offset >= 0) {
+ $this->position += $offset;
+ return true;
+ } else {
+ return false;
+ }
+ break;
+
+ case SEEK_END:
+ if (strlen($GLOBALS[$this->varname]) + $offset >= 0) {
+ $this->position = strlen($GLOBALS[$this->varname]) + $offset;
+ return true;
+ } else {
+ return false;
+ }
+ break;
+
+ default:
+ return false;
+ }
+ }
+
+ public function stream_stat() {
+ $size = strlen($GLOBALS[$this->varname]);
+ $time = time();
+ $data = array(
+ 'dev' => 0,
+ 'ino' => 0,
+ 'mode' => 0777,
+ 'nlink' => 1,
+ 'uid' => 0,
+ 'gid' => 0,
+ 'rdev' => '',
+ 'size' => $size,
+ 'atime' => $time,
+ 'mtime' => $time,
+ 'ctime' => $time,
+ 'blksize' => -1,
+ 'blocks' => -1,
+ );
+ return array_values($data) + $data;
+ //return false;
+ }
+
+ function stream_metadata($path, $option, $var) {
+ if($option == STREAM_META_TOUCH) {
+ $url = parse_url($path);
+ $varname = $url["host"];
+ if(!isset($GLOBALS[$varname])) {
+ $GLOBALS[$varname] = '';
+ }
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/tests/lib/appframework/middleware/MiddlewareDispatcherTest.php b/tests/lib/appframework/middleware/MiddlewareDispatcherTest.php
index 43727846dcf..95d42e4eb8e 100644
--- a/tests/lib/appframework/middleware/MiddlewareDispatcherTest.php
+++ b/tests/lib/appframework/middleware/MiddlewareDispatcherTest.php
@@ -25,8 +25,8 @@
namespace OC\AppFramework;
use OC\AppFramework\Http\Request;
-use OC\AppFramework\Middleware\Middleware;
use OC\AppFramework\Middleware\MiddlewareDispatcher;
+use OCP\AppFramework\Middleware;
use OCP\AppFramework\Http\Response;
@@ -122,13 +122,13 @@ class MiddlewareDispatcherTest extends \PHPUnit_Framework_TestCase {
private function getAPIMock(){
- return $this->getMock('OC\AppFramework\Core\API',
+ return $this->getMock('OC\AppFramework\DependencyInjection\DIContainer',
array('getAppName'), array('app'));
}
private function getControllerMock(){
- return $this->getMock('OC\AppFramework\Controller\Controller', array('method'),
+ return $this->getMock('OCP\AppFramework\Controller', array('method'),
array($this->getAPIMock(), new Request()));
}
@@ -142,12 +142,12 @@ class MiddlewareDispatcherTest extends \PHPUnit_Framework_TestCase {
public function testAfterExceptionShouldReturnResponseOfMiddleware(){
$response = new Response();
- $m1 = $this->getMock('\OC\AppFramework\Middleware\Middleware',
+ $m1 = $this->getMock('\OCP\AppFramework\Middleware',
array('afterException', 'beforeController'));
$m1->expects($this->never())
->method('afterException');
- $m2 = $this->getMock('OC\AppFramework\Middleware\Middleware',
+ $m2 = $this->getMock('OCP\AppFramework\Middleware',
array('afterException', 'beforeController'));
$m2->expects($this->once())
->method('afterException')
@@ -267,7 +267,7 @@ class MiddlewareDispatcherTest extends \PHPUnit_Framework_TestCase {
public function testExceptionShouldRunAfterExceptionOfOnlyPreviouslyExecutedMiddlewares(){
$m1 = $this->getMiddleware();
$m2 = $this->getMiddleware(true);
- $m3 = $this->getMock('\OC\AppFramework\Middleware\Middleware');
+ $m3 = $this->getMock('\OCP\AppFramework\Middleware');
$m3->expects($this->never())
->method('afterException');
$m3->expects($this->never())
diff --git a/tests/lib/appframework/middleware/MiddlewareTest.php b/tests/lib/appframework/middleware/MiddlewareTest.php
index 5e2930ac6a3..7a93c0d4dda 100644
--- a/tests/lib/appframework/middleware/MiddlewareTest.php
+++ b/tests/lib/appframework/middleware/MiddlewareTest.php
@@ -25,7 +25,7 @@
namespace OC\AppFramework;
use OC\AppFramework\Http\Request;
-use OC\AppFramework\Middleware\Middleware;
+use OCP\AppFramework\Middleware;
class ChildMiddleware extends Middleware {};
@@ -44,10 +44,10 @@ class MiddlewareTest extends \PHPUnit_Framework_TestCase {
protected function setUp(){
$this->middleware = new ChildMiddleware();
- $this->api = $this->getMock('OC\AppFramework\Core\API',
+ $this->api = $this->getMock('OC\AppFramework\DependencyInjection\DIContainer',
array(), array('test'));
- $this->controller = $this->getMock('OC\AppFramework\Controller\Controller',
+ $this->controller = $this->getMock('OCP\AppFramework\Controller',
array(), array($this->api, new Request()));
$this->exception = new \Exception();
$this->response = $this->getMock('OCP\AppFramework\Http\Response');
diff --git a/tests/lib/appframework/middleware/security/SecurityMiddlewareTest.php b/tests/lib/appframework/middleware/security/SecurityMiddlewareTest.php
index 3ed44282a7b..dae6135dc54 100644
--- a/tests/lib/appframework/middleware/security/SecurityMiddlewareTest.php
+++ b/tests/lib/appframework/middleware/security/SecurityMiddlewareTest.php
@@ -24,7 +24,7 @@
namespace OC\AppFramework\Middleware\Security;
-use OC\AppFramework\Http\Http;
+use OC\AppFramework\Http;
use OC\AppFramework\Http\Request;
use OC\AppFramework\Http\RedirectResponse;
use OCP\AppFramework\Http\JSONResponse;
@@ -39,8 +39,8 @@ class SecurityMiddlewareTest extends \PHPUnit_Framework_TestCase {
private $request;
public function setUp() {
- $api = $this->getMock('OC\AppFramework\Core\API', array(), array('test'));
- $this->controller = $this->getMock('OC\AppFramework\Controller\Controller',
+ $api = $this->getMock('OC\AppFramework\DependencyInjection\DIContainer', array(), array('test'));
+ $this->controller = $this->getMock('OCP\AppFramework\Controller',
array(), array($api, new Request()));
$this->request = new Request();
@@ -51,24 +51,19 @@ class SecurityMiddlewareTest extends \PHPUnit_Framework_TestCase {
private function getAPI(){
- return $this->getMock('OC\AppFramework\Core\API',
+ return $this->getMock('OC\AppFramework\DependencyInjection\DIContainer',
array('isLoggedIn', 'passesCSRFCheck', 'isAdminUser',
- 'isSubAdminUser', 'activateNavigationEntry',
- 'getUserId'),
+ 'isSubAdminUser', 'getUserId'),
array('app'));
}
- private function checkNavEntry($method, $shouldBeActivated=false){
+ private function checkNavEntry($method){
$api = $this->getAPI();
- if($shouldBeActivated){
- $api->expects($this->once())
- ->method('activateNavigationEntry');
- } else {
- $api->expects($this->never())
- ->method('activateNavigationEntry');
- }
+ $serverMock = $this->getMock('\OC\Server', array());
+ $api->expects($this->any())->method('getServer')
+ ->will($this->returnValue($serverMock));
$sec = new SecurityMiddleware($api, $this->request);
$sec->beforeController('\OC\AppFramework\Middleware\Security\SecurityMiddlewareTest', $method);
@@ -80,7 +75,7 @@ class SecurityMiddlewareTest extends \PHPUnit_Framework_TestCase {
* @NoCSRFRequired
*/
public function testSetNavigationEntry(){
- $this->checkNavEntry('testSetNavigationEntry', true);
+ $this->checkNavEntry('testSetNavigationEntry');
}
@@ -215,9 +210,33 @@ class SecurityMiddlewareTest extends \PHPUnit_Framework_TestCase {
/**
* @PublicPage
+ * @expectedException \OC\AppFramework\Middleware\Security\SecurityException
*/
public function testCsrfCheck(){
- $this->securityCheck('testCsrfCheck', 'passesCSRFCheck');
+ $api = $this->getAPI();
+ $request = $this->getMock('OC\AppFramework\Http\Request', array('passesCSRFCheck'));
+ $request->expects($this->once())
+ ->method('passesCSRFCheck')
+ ->will($this->returnValue(false));
+
+ $sec = new SecurityMiddleware($api, $request);
+ $sec->beforeController('\OC\AppFramework\Middleware\Security\SecurityMiddlewareTest', 'testCsrfCheck');
+ }
+
+
+ /**
+ * @PublicPage
+ * @NoCSRFRequired
+ */
+ public function testNoCsrfCheck(){
+ $api = $this->getAPI();
+ $request = $this->getMock('OC\AppFramework\Http\Request', array('passesCSRFCheck'));
+ $request->expects($this->never())
+ ->method('passesCSRFCheck')
+ ->will($this->returnValue(false));
+
+ $sec = new SecurityMiddleware($api, $request);
+ $sec->beforeController('\OC\AppFramework\Middleware\Security\SecurityMiddlewareTest', 'testNoCsrfCheck');
}
@@ -225,7 +244,14 @@ class SecurityMiddlewareTest extends \PHPUnit_Framework_TestCase {
* @PublicPage
*/
public function testFailCsrfCheck(){
- $this->securityCheck('testFailCsrfCheck', 'passesCSRFCheck', true);
+ $api = $this->getAPI();
+ $request = $this->getMock('OC\AppFramework\Http\Request', array('passesCSRFCheck'));
+ $request->expects($this->once())
+ ->method('passesCSRFCheck')
+ ->will($this->returnValue(true));
+
+ $sec = new SecurityMiddleware($api, $request);
+ $sec->beforeController('\OC\AppFramework\Middleware\Security\SecurityMiddlewareTest', 'testFailCsrfCheck');
}
@@ -271,8 +297,12 @@ class SecurityMiddlewareTest extends \PHPUnit_Framework_TestCase {
public function testAfterExceptionReturnsRedirect(){
- $api = $this->getMock('OC\AppFramework\Core\API', array(), array('test'));
- $this->controller = $this->getMock('OC\AppFramework\Controller\Controller',
+ $api = $this->getMock('OC\AppFramework\DependencyInjection\DIContainer', array(), array('test'));
+ $serverMock = $this->getMock('\OC\Server', array('getNavigationManager'));
+ $api->expects($this->once())->method('getServer')
+ ->will($this->returnValue($serverMock));
+
+ $this->controller = $this->getMock('OCP\AppFramework\Controller',
array(), array($api, new Request()));
$this->request = new Request(
diff --git a/tests/lib/autoloader.php b/tests/lib/autoloader.php
index b182dc87477..314a8ebee8d 100644
--- a/tests/lib/autoloader.php
+++ b/tests/lib/autoloader.php
@@ -19,11 +19,11 @@ class AutoLoader extends \PHPUnit_Framework_TestCase {
}
public function testLeadingSlashOnClassName() {
- $this->assertEquals(array('private/files/storage/local.php'), $this->loader->findClass('\OC\Files\Storage\Local'));
+ $this->assertEquals(array('private/files/storage/local.php', 'files/storage/local.php'), $this->loader->findClass('\OC\Files\Storage\Local'));
}
public function testNoLeadingSlashOnClassName() {
- $this->assertEquals(array('private/files/storage/local.php'), $this->loader->findClass('OC\Files\Storage\Local'));
+ $this->assertEquals(array('private/files/storage/local.php', 'files/storage/local.php'), $this->loader->findClass('OC\Files\Storage\Local'));
}
public function testLegacyPath() {
@@ -54,7 +54,7 @@ class AutoLoader extends \PHPUnit_Framework_TestCase {
}
public function testLoadCoreNamespace() {
- $this->assertEquals(array('private/foo/bar.php'), $this->loader->findClass('OC\Foo\Bar'));
+ $this->assertEquals(array('private/foo/bar.php', 'foo/bar.php'), $this->loader->findClass('OC\Foo\Bar'));
}
public function testLoadCore() {
diff --git a/tests/lib/avatar.php b/tests/lib/avatar.php
index 1c5195f8eb1..0334639afa8 100644
--- a/tests/lib/avatar.php
+++ b/tests/lib/avatar.php
@@ -1,23 +1,45 @@
<?php
+
/**
* Copyright (c) 2013 Christopher Schäpers <christopher@schaepers.it>
* This file is licensed under the Affero General Public License version 3 or
* later.
* See the COPYING-README file.
*/
-
class Test_Avatar extends PHPUnit_Framework_TestCase {
+ private $user;
+
+ public function setUp() {
+ $this->user = uniqid();
+ $storage = new \OC\Files\Storage\Temporary(array());
+ \OC\Files\Filesystem::mount($storage, array(), '/' . $this->user . '/');
+ }
+
public function testAvatar() {
- $this->markTestSkipped("Setting custom avatars with encryption doesn't work yet");
- $avatar = new \OC_Avatar(\OC_User::getUser());
+ $avatar = new \OC_Avatar($this->user);
$this->assertEquals(false, $avatar->get());
- $expected = new OC_Image(\OC::$SERVERROOT.'/tests/data/testavatar.png');
+ $expected = new OC_Image(\OC::$SERVERROOT . '/tests/data/testavatar.png');
+ $expected->resize(64);
$avatar->set($expected->data());
+ $this->assertEquals($expected->data(), $avatar->get()->data());
+
+ $avatar->remove();
+ $this->assertEquals(false, $avatar->get());
+ }
+
+ public function testAvatarApi() {
+ $avatarManager = \OC::$server->getAvatarManager();
+ $avatar = $avatarManager->getAvatar($this->user);
+
+ $this->assertEquals(false, $avatar->get());
+
+ $expected = new OC_Image(\OC::$SERVERROOT . '/tests/data/testavatar.png');
$expected->resize(64);
+ $avatar->set($expected->data());
$this->assertEquals($expected->data(), $avatar->get()->data());
$avatar->remove();
diff --git a/tests/lib/backgroundjob/dummyjoblist.php b/tests/lib/backgroundjob/dummyjoblist.php
index d91d6b344b5..e1579c273bb 100644
--- a/tests/lib/backgroundjob/dummyjoblist.php
+++ b/tests/lib/backgroundjob/dummyjoblist.php
@@ -8,9 +8,6 @@
namespace Test\BackgroundJob;
-class JobRun extends \Exception {
-}
-
/**
* Class DummyJobList
*
diff --git a/tests/lib/backgroundjob/job.php b/tests/lib/backgroundjob/job.php
new file mode 100644
index 00000000000..7d66fa772d2
--- /dev/null
+++ b/tests/lib/backgroundjob/job.php
@@ -0,0 +1,59 @@
+<?php
+/**
+ * Copyright (c) 2013 Robin Appelman <icewind@owncloud.com>
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+
+namespace Test\BackgroundJob;
+
+
+class TestJob extends \OC\BackgroundJob\Job {
+ private $testCase;
+
+ /**
+ * @var callable $callback
+ */
+ private $callback;
+
+ /**
+ * @param Job $testCase
+ * @param callable $callback
+ */
+ public function __construct($testCase, $callback) {
+ $this->testCase = $testCase;
+ $this->callback = $callback;
+ }
+
+ public function run($argument) {
+ $this->testCase->markRun();
+ $callback = $this->callback;
+ $callback($argument);
+ }
+}
+
+class Job extends \PHPUnit_Framework_TestCase {
+ private $run = false;
+
+ public function setUp() {
+ $this->run = false;
+ }
+
+ public function testRemoveAfterException() {
+ $jobList = new DummyJobList();
+ $job = new TestJob($this, function () {
+ throw new \Exception();
+ });
+ $jobList->add($job);
+
+ $this->assertCount(1, $jobList->getAll());
+ $job->execute($jobList);
+ $this->assertTrue($this->run);
+ $this->assertCount(0, $jobList->getAll());
+ }
+
+ public function markRun() {
+ $this->run = true;
+ }
+}
diff --git a/tests/lib/backgroundjob/queuedjob.php b/tests/lib/backgroundjob/queuedjob.php
index 1d373473cd7..19c1b28a507 100644
--- a/tests/lib/backgroundjob/queuedjob.php
+++ b/tests/lib/backgroundjob/queuedjob.php
@@ -9,8 +9,17 @@
namespace Test\BackgroundJob;
class TestQueuedJob extends \OC\BackgroundJob\QueuedJob {
+ private $testCase;
+
+ /**
+ * @param QueuedJob $testCase
+ */
+ public function __construct($testCase) {
+ $this->testCase = $testCase;
+ }
+
public function run($argument) {
- throw new JobRun(); //throw an exception so we can detect if this function is called
+ $this->testCase->markRun();
}
}
@@ -24,19 +33,22 @@ class QueuedJob extends \PHPUnit_Framework_TestCase {
*/
private $job;
+ private $jobRun = false;
+
+ public function markRun() {
+ $this->jobRun = true;
+ }
+
public function setup() {
$this->jobList = new DummyJobList();
- $this->job = new TestQueuedJob();
+ $this->job = new TestQueuedJob($this);
$this->jobList->add($this->job);
+ $this->jobRun = false;
}
public function testJobShouldBeRemoved() {
- try {
- $this->assertTrue($this->jobList->has($this->job, null));
- $this->job->execute($this->jobList);
- $this->fail("job should have been run");
- } catch (JobRun $e) {
- $this->assertFalse($this->jobList->has($this->job, null));
- }
+ $this->assertTrue($this->jobList->has($this->job, null));
+ $this->job->execute($this->jobList);
+ $this->assertTrue($this->jobRun);
}
}
diff --git a/tests/lib/backgroundjob/timedjob.php b/tests/lib/backgroundjob/timedjob.php
index f3c3eb4d0dd..646a2607ef3 100644
--- a/tests/lib/backgroundjob/timedjob.php
+++ b/tests/lib/backgroundjob/timedjob.php
@@ -9,12 +9,18 @@
namespace Test\BackgroundJob;
class TestTimedJob extends \OC\BackgroundJob\TimedJob {
- public function __construct() {
+ private $testCase;
+
+ /**
+ * @param TimedJob $testCase
+ */
+ public function __construct($testCase) {
$this->setInterval(10);
+ $this->testCase = $testCase;
}
public function run($argument) {
- throw new JobRun(); //throw an exception so we can detect if this function is called
+ $this->testCase->markRun();
}
}
@@ -28,44 +34,37 @@ class TimedJob extends \PHPUnit_Framework_TestCase {
*/
private $job;
+ private $jobRun = false;
+
+ public function markRun() {
+ $this->jobRun = true;
+ }
+
public function setup() {
$this->jobList = new DummyJobList();
- $this->job = new TestTimedJob();
+ $this->job = new TestTimedJob($this);
$this->jobList->add($this->job);
+ $this->jobRun = false;
}
public function testShouldRunAfterInterval() {
$this->job->setLastRun(time() - 12);
- try {
- $this->job->execute($this->jobList);
- $this->fail("job should have run");
- } catch (JobRun $e) {
- }
- $this->assertTrue(true);
+ $this->job->execute($this->jobList);
+ $this->assertTrue($this->jobRun);
}
public function testShouldNotRunWithinInterval() {
$this->job->setLastRun(time() - 5);
- try {
- $this->job->execute($this->jobList);
- } catch (JobRun $e) {
- $this->fail("job should not have run");
- }
- $this->assertTrue(true);
+ $this->job->execute($this->jobList);
+ $this->assertFalse($this->jobRun);
}
public function testShouldNotTwice() {
$this->job->setLastRun(time() - 15);
- try {
- $this->job->execute($this->jobList);
- $this->fail("job should have run the first time");
- } catch (JobRun $e) {
- try {
- $this->job->execute($this->jobList);
- } catch (JobRun $e) {
- $this->fail("job should not have run the second time");
- }
- }
- $this->assertTrue(true);
+ $this->job->execute($this->jobList);
+ $this->assertTrue($this->jobRun);
+ $this->jobRun = false;
+ $this->job->execute($this->jobList);
+ $this->assertFalse($this->jobRun);
}
}
diff --git a/tests/lib/connector/sabre/aborteduploaddetectionplugin.php b/tests/lib/connector/sabre/aborteduploaddetectionplugin.php
index bef0e4c4d7d..201f1263867 100644
--- a/tests/lib/connector/sabre/aborteduploaddetectionplugin.php
+++ b/tests/lib/connector/sabre/aborteduploaddetectionplugin.php
@@ -37,10 +37,11 @@ class Test_OC_Connector_Sabre_AbortedUploadDetectionPlugin extends PHPUnit_Frame
/**
* @dataProvider verifyContentLengthProvider
*/
- public function testVerifyContentLength($fileSize, $headers)
+ public function testVerifyContentLength($method, $fileSize, $headers)
{
$this->plugin->fileView = $this->buildFileViewMock($fileSize);
+ $headers['REQUEST_METHOD'] = $method;
$this->server->httpRequest = new Sabre_HTTP_Request($headers);
$this->plugin->verifyContentLength('foo.txt');
$this->assertTrue(true);
@@ -50,30 +51,33 @@ class Test_OC_Connector_Sabre_AbortedUploadDetectionPlugin extends PHPUnit_Frame
* @dataProvider verifyContentLengthFailedProvider
* @expectedException Sabre_DAV_Exception_BadRequest
*/
- public function testVerifyContentLengthFailed($fileSize, $headers)
+ public function testVerifyContentLengthFailed($method, $fileSize, $headers)
{
$this->plugin->fileView = $this->buildFileViewMock($fileSize);
// we expect unlink to be called
$this->plugin->fileView->expects($this->once())->method('unlink');
-
+ $headers['REQUEST_METHOD'] = $method;
$this->server->httpRequest = new Sabre_HTTP_Request($headers);
$this->plugin->verifyContentLength('foo.txt');
}
public function verifyContentLengthProvider() {
return array(
- array(1024, array()),
- array(1024, array('HTTP_X_EXPECTED_ENTITY_LENGTH' => '1024')),
- array(512, array('HTTP_CONTENT_LENGTH' => '512')),
+ array('PUT', 1024, array()),
+ array('PUT', 1024, array('HTTP_X_EXPECTED_ENTITY_LENGTH' => '1024')),
+ array('PUT', 512, array('HTTP_CONTENT_LENGTH' => '512')),
+ array('LOCK', 1024, array()),
+ array('LOCK', 1024, array('HTTP_X_EXPECTED_ENTITY_LENGTH' => '1024')),
+ array('LOCK', 512, array('HTTP_CONTENT_LENGTH' => '512')),
);
}
public function verifyContentLengthFailedProvider() {
return array(
- array(1025, array('HTTP_X_EXPECTED_ENTITY_LENGTH' => '1024')),
- array(525, array('HTTP_CONTENT_LENGTH' => '512')),
+ array('PUT', 1025, array('HTTP_X_EXPECTED_ENTITY_LENGTH' => '1024')),
+ array('PUT', 525, array('HTTP_CONTENT_LENGTH' => '512')),
);
}
@@ -87,7 +91,7 @@ class Test_OC_Connector_Sabre_AbortedUploadDetectionPlugin extends PHPUnit_Frame
}
private function buildFileViewMock($fileSize) {
- // mock filesysten
+ // mock filesystem
$view = $this->getMock('\OC\Files\View', array('filesize', 'unlink'), array(), '', FALSE);
$view->expects($this->any())->method('filesize')->withAnyParameters()->will($this->returnValue($fileSize));
diff --git a/tests/lib/connector/sabre/directory.php b/tests/lib/connector/sabre/directory.php
new file mode 100644
index 00000000000..c501521b601
--- /dev/null
+++ b/tests/lib/connector/sabre/directory.php
@@ -0,0 +1,34 @@
+<?php
+/**
+ * Copyright (c) 2013 Thomas Müller <thomas.mueller@tmit.eu>
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+
+class Test_OC_Connector_Sabre_Directory extends PHPUnit_Framework_TestCase {
+
+ /**
+ * @expectedException Sabre_DAV_Exception_Forbidden
+ */
+ public function testCreateSharedFileFails() {
+ $dir = new OC_Connector_Sabre_Directory('');
+ $dir->createFile('Shared');
+ }
+
+ /**
+ * @expectedException Sabre_DAV_Exception_Forbidden
+ */
+ public function testCreateSharedFolderFails() {
+ $dir = new OC_Connector_Sabre_Directory('');
+ $dir->createDirectory('Shared');
+ }
+
+ /**
+ * @expectedException Sabre_DAV_Exception_Forbidden
+ */
+ public function testDeleteSharedFolderFails() {
+ $dir = new OC_Connector_Sabre_Directory('Shared');
+ $dir->delete();
+ }
+}
diff --git a/tests/lib/connector/sabre/file.php b/tests/lib/connector/sabre/file.php
new file mode 100644
index 00000000000..e1fed0384c6
--- /dev/null
+++ b/tests/lib/connector/sabre/file.php
@@ -0,0 +1,45 @@
+<?php
+/**
+ * Copyright (c) 2013 Thomas Müller <thomas.mueller@tmit.eu>
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+
+class Test_OC_Connector_Sabre_File extends PHPUnit_Framework_TestCase {
+
+ /**
+ * @expectedException Sabre_DAV_Exception
+ */
+ public function testSimplePutFails() {
+ // setup
+ $file = new OC_Connector_Sabre_File('/test.txt');
+ $file->fileView = $this->getMock('\OC\Files\View', array('file_put_contents'), array(), '', FALSE);
+ $file->fileView->expects($this->any())->method('file_put_contents')->withAnyParameters()->will($this->returnValue(false));
+
+ // action
+ $etag = $file->put('test data');
+ }
+
+ /**
+ * @expectedException Sabre_DAV_Exception
+ */
+ public function testSimplePutFailsOnRename() {
+ // setup
+ $file = new OC_Connector_Sabre_File('/test.txt');
+ $file->fileView = $this->getMock('\OC\Files\View', array('file_put_contents', 'rename'), array(), '', FALSE);
+ $file->fileView->expects($this->any())->method('file_put_contents')->withAnyParameters()->will($this->returnValue(true));
+ $file->fileView->expects($this->any())->method('rename')->withAnyParameters()->will($this->returnValue(false));
+
+ // action
+ $etag = $file->put('test data');
+ }
+
+ /**
+ * @expectedException Sabre_DAV_Exception_Forbidden
+ */
+ public function testDeleteSharedFails() {
+ $file = new OC_Connector_Sabre_File('Shared');
+ $file->delete();
+ }
+}
diff --git a/tests/lib/connector/sabre/objecttree.php b/tests/lib/connector/sabre/objecttree.php
index 1d76bb59676..e32f2365f95 100644
--- a/tests/lib/connector/sabre/objecttree.php
+++ b/tests/lib/connector/sabre/objecttree.php
@@ -15,8 +15,9 @@ use Sabre_DAV_Exception_Forbidden;
class TestDoubleFileView extends \OC\Files\View{
- public function __construct($updatables, $canRename = true) {
+ public function __construct($updatables, $deletables, $canRename = true) {
$this->updatables = $updatables;
+ $this->deletables = $deletables;
$this->canRename = $canRename;
}
@@ -24,6 +25,10 @@ class TestDoubleFileView extends \OC\Files\View{
return $this->updatables[$path];
}
+ public function isDeletable($path) {
+ return $this->deletables[$path];
+ }
+
public function rename($path1, $path2) {
return $this->canRename;
}
@@ -35,31 +40,32 @@ class ObjectTree extends PHPUnit_Framework_TestCase {
* @dataProvider moveFailedProvider
* @expectedException Sabre_DAV_Exception_Forbidden
*/
- public function testMoveFailed($source, $dest, $updatables) {
- $this->moveTest($source, $dest, $updatables);
+ public function testMoveFailed($source, $dest, $updatables, $deletables) {
+ $this->moveTest($source, $dest, $updatables, $deletables);
}
/**
* @dataProvider moveSuccessProvider
*/
- public function testMoveSuccess($source, $dest, $updatables) {
- $this->moveTest($source, $dest, $updatables);
+ public function testMoveSuccess($source, $dest, $updatables, $deletables) {
+ $this->moveTest($source, $dest, $updatables, $deletables);
$this->assertTrue(true);
}
function moveFailedProvider() {
return array(
- array('a/b', 'a/c', array('a' => false, 'a/b' => false, 'a/c' => false)),
- array('a/b', 'b/b', array('a' => false, 'a/b' => false, 'b' => false, 'b/b' => false)),
- array('a/b', 'b/b', array('a' => false, 'a/b' => true, 'b' => false, 'b/b' => false)),
- array('a/b', 'b/b', array('a' => true, 'a/b' => true, 'b' => false, 'b/b' => false)),
+ array('a/b', 'a/c', array('a' => false, 'a/b' => false, 'a/c' => false), array()),
+ array('a/b', 'b/b', array('a' => false, 'a/b' => false, 'b' => false, 'b/b' => false), array()),
+ array('a/b', 'b/b', array('a' => false, 'a/b' => true, 'b' => false, 'b/b' => false), array()),
+ array('a/b', 'b/b', array('a' => true, 'a/b' => true, 'b' => false, 'b/b' => false), array()),
+ array('a/b', 'b/b', array('a' => true, 'a/b' => true, 'b' => true, 'b/b' => false), array('a/b' => false)),
);
}
function moveSuccessProvider() {
return array(
- array('a/b', 'a/c', array('a' => false, 'a/b' => true, 'a/c' => false)),
- array('a/b', 'b/b', array('a' => true, 'a/b' => true, 'b' => true, 'b/b' => false)),
+ array('a/b', 'a/c', array('a' => false, 'a/b' => true, 'a/c' => false), array()),
+ array('a/b', 'b/b', array('a' => true, 'a/b' => true, 'b' => true, 'b/b' => false), array('a/b' => true)),
);
}
@@ -68,7 +74,7 @@ class ObjectTree extends PHPUnit_Framework_TestCase {
* @param $dest
* @param $updatables
*/
- private function moveTest($source, $dest, $updatables) {
+ private function moveTest($source, $dest, $updatables, $deletables) {
$rootDir = new OC_Connector_Sabre_Directory('');
$objectTree = $this->getMock('\OC\Connector\Sabre\ObjectTree',
array('nodeExists', 'getNodeForPath'),
@@ -80,7 +86,7 @@ class ObjectTree extends PHPUnit_Framework_TestCase {
->will($this->returnValue(false));
/** @var $objectTree \OC\Connector\Sabre\ObjectTree */
- $objectTree->fileView = new TestDoubleFileView($updatables);
+ $objectTree->fileView = new TestDoubleFileView($updatables, $deletables);
$objectTree->move($source, $dest);
}
diff --git a/tests/lib/db.php b/tests/lib/db.php
index c87bee4ab99..f0b271a36f1 100644
--- a/tests/lib/db.php
+++ b/tests/lib/db.php
@@ -12,6 +12,21 @@ class Test_DB extends PHPUnit_Framework_TestCase {
protected static $schema_file = 'static://test_db_scheme';
protected $test_prefix;
+ /**
+ * @var string
+ */
+ private $table1;
+
+ /**
+ * @var string
+ */
+ private $table2;
+
+ /**
+ * @var string
+ */
+ private $table3;
+
public function setUp() {
$dbfile = OC::$SERVERROOT.'/tests/data/db_structure.xml';
@@ -25,6 +40,7 @@ class Test_DB extends PHPUnit_Framework_TestCase {
$this->table1 = $this->test_prefix.'cntcts_addrsbks';
$this->table2 = $this->test_prefix.'cntcts_cards';
$this->table3 = $this->test_prefix.'vcategory';
+ $this->table4 = $this->test_prefix.'decimal';
}
public function tearDown() {
@@ -121,10 +137,10 @@ class Test_DB extends PHPUnit_Framework_TestCase {
$query = OC_DB::prepare('SELECT `fullname`, `uri`, `carddata` FROM `*PREFIX*'.$this->table2.'` WHERE `uri` = ?');
$result = $query->execute(array($uri));
$this->assertTrue((bool)$result);
- $row = $result->fetchRow();
- $this->assertArrayHasKey('carddata', $row);
- $this->assertEquals($carddata, $row['carddata']);
- $this->assertEquals(1, $result->numRows());
+ $rowset = $result->fetchAll();
+ $this->assertEquals(1, count($rowset));
+ $this->assertArrayHasKey('carddata', $rowset[0]);
+ $this->assertEquals($carddata, $rowset[0]['carddata']);
// Try to insert a new row
$result = OC_DB::insertIfNotExist('*PREFIX*'.$this->table2,
@@ -137,50 +153,51 @@ class Test_DB extends PHPUnit_Framework_TestCase {
$query = OC_DB::prepare('SELECT `fullname`, `uri`, `carddata` FROM `*PREFIX*'.$this->table2.'` WHERE `uri` = ?');
$result = $query->execute(array($uri));
$this->assertTrue((bool)$result);
- $row = $result->fetchRow();
- $this->assertArrayHasKey('carddata', $row);
// Test that previously inserted data isn't overwritten
- $this->assertEquals($carddata, $row['carddata']);
// And that a new row hasn't been inserted.
- $this->assertEquals(1, $result->numRows());
-
+ $rowset = $result->fetchAll();
+ $this->assertEquals(1, count($rowset));
+ $this->assertArrayHasKey('carddata', $rowset[0]);
+ $this->assertEquals($carddata, $rowset[0]['carddata']);
}
- /**
- * Tests whether the database is configured so it accepts and returns dates
- * in the expected format.
- */
- public function testTimestampDateFormat() {
- $table = '*PREFIX*'.$this->test_prefix.'timestamp';
- $column = 'timestamptest';
-
- $expectedFormat = 'Y-m-d H:i:s';
- $expected = new \DateTime;
-
- $query = OC_DB::prepare("INSERT INTO `$table` (`$column`) VALUES (?)");
- $result = $query->execute(array($expected->format($expectedFormat)));
- $this->assertEquals(
- 1,
- $result,
- "Database failed to accept dates in the format '$expectedFormat'."
- );
-
- $id = OC_DB::insertid($table);
- $query = OC_DB::prepare("SELECT * FROM `$table` WHERE `id` = ?");
- $result = $query->execute(array($id));
- $row = $result->fetchRow();
+ public function testUtf8Data() {
+ $table = "*PREFIX*{$this->table2}";
+ $expected = "Ћö雙喜\xE2\x80\xA2";
+
+ $query = OC_DB::prepare("INSERT INTO `$table` (`fullname`, `uri`, `carddata`) VALUES (?, ?, ?)");
+ $result = $query->execute(array($expected, 'uri_1', 'This is a vCard'));
+ $this->assertEquals(1, $result);
- $actual = \DateTime::createFromFormat($expectedFormat, $row[$column]);
- $this->assertInstanceOf(
- '\DateTime',
- $actual,
- "Database failed to return dates in the format '$expectedFormat'."
- );
-
- $this->assertEquals(
- $expected,
- $actual,
- 'Failed asserting that the returned date is the same as the inserted.'
- );
+ $actual = OC_DB::prepare("SELECT `fullname` FROM `$table`")->execute()->fetchOne();
+ $this->assertSame($expected, $actual);
}
+
+ public function testDecimal() {
+ $table = "*PREFIX*" . $this->table4;
+ $rowname = 'decimaltest';
+
+ // Insert, select and delete decimal(12,2) values
+ $inserts = array('1337133713.37', '1234567890');
+ $expects = array('1337133713.37', '1234567890.00');
+
+ for ($i = 0; $i < count($inserts); $i++) {
+ $insert = $inserts[$i];
+ $expect = $expects[$i];
+
+ $query = OC_DB::prepare('INSERT INTO `' . $table . '` (`' . $rowname . '`) VALUES (?)');
+ $result = $query->execute(array($insert));
+ $this->assertEquals(1, $result);
+ $query = OC_DB::prepare('SELECT `' . $rowname . '` FROM `' . $table . '`');
+ $result = $query->execute();
+ $this->assertTrue((bool)$result);
+ $row = $result->fetchRow();
+ $this->assertArrayHasKey($rowname, $row);
+ $this->assertEquals($expect, $row[$rowname]);
+ $query = OC_DB::prepare('DELETE FROM `' . $table . '`');
+ $result = $query->execute();
+ $this->assertTrue((bool)$result);
+ }
+ }
+
}
diff --git a/tests/lib/db/mdb2schemareader.php b/tests/lib/db/mdb2schemareader.php
index b9b241194fd..f08996cbeaf 100644
--- a/tests/lib/db/mdb2schemareader.php
+++ b/tests/lib/db/mdb2schemareader.php
@@ -39,7 +39,7 @@ class MDB2SchemaReader extends \PHPUnit_Framework_TestCase {
$this->assertCount(1, $schema->getTables());
$table = $schema->getTable('test_table');
- $this->assertCount(7, $table->getColumns());
+ $this->assertCount(8, $table->getColumns());
$this->assertEquals(4, $table->getColumn('integerfield')->getLength());
$this->assertTrue($table->getColumn('integerfield')->getAutoincrement());
@@ -57,18 +57,21 @@ class MDB2SchemaReader extends \PHPUnit_Framework_TestCase {
$this->assertNull($table->getColumn('clobfield')->getLength());
$this->assertFalse($table->getColumn('clobfield')->getAutoincrement());
- $this->assertSame('', $table->getColumn('clobfield')->getDefault());
+ $this->assertNull($table->getColumn('clobfield')->getDefault());
$this->assertTrue($table->getColumn('clobfield')->getNotnull());
$this->assertInstanceOf('Doctrine\DBAL\Types\TextType', $table->getColumn('clobfield')->getType());
$this->assertNull($table->getColumn('booleanfield')->getLength());
$this->assertFalse($table->getColumn('booleanfield')->getAutoincrement());
- $this->assertFalse($table->getColumn('booleanfield')->getDefault());
+ $this->assertNull($table->getColumn('booleanfield')->getDefault());
$this->assertInstanceOf('Doctrine\DBAL\Types\BooleanType', $table->getColumn('booleanfield')->getType());
$this->assertTrue($table->getColumn('booleanfield_true')->getDefault());
$this->assertFalse($table->getColumn('booleanfield_false')->getDefault());
+ $this->assertEquals(12, $table->getColumn('decimalfield_precision_scale')->getPrecision());
+ $this->assertEquals(2, $table->getColumn('decimalfield_precision_scale')->getScale());
+
$this->assertCount(2, $table->getIndexes());
$this->assertEquals(array('integerfield'), $table->getIndex('primary')->getUnquotedColumns());
$this->assertTrue($table->getIndex('primary')->isPrimary());
diff --git a/tests/lib/db/testschema.xml b/tests/lib/db/testschema.xml
index 509b55ee81f..dfca920a0ef 100644
--- a/tests/lib/db/testschema.xml
+++ b/tests/lib/db/testschema.xml
@@ -53,6 +53,12 @@
<type>boolean</type>
<default>false</default>
</field>
+ <field>
+ <name>decimalfield_precision_scale</name>
+ <type>decimal</type>
+ <precision>12</precision>
+ <scale>2</scale>
+ </field>
<index>
<name>index_primary</name>
diff --git a/tests/lib/dbschema.php b/tests/lib/dbschema.php
index 7de90c047ca..4a7b7f7aac0 100644
--- a/tests/lib/dbschema.php
+++ b/tests/lib/dbschema.php
@@ -103,7 +103,7 @@ class Test_DBSchema extends PHPUnit_Framework_TestCase {
break;
}
- $name = $result->fetchOne(); //FIXME checking with '$result->numRows() === 1' does not seem to work?
+ $name = $result->fetchOne();
if ($name === $table) {
return true;
} else {
diff --git a/tests/lib/errorHandler.php b/tests/lib/errorHandler.php
new file mode 100644
index 00000000000..68b87deccb6
--- /dev/null
+++ b/tests/lib/errorHandler.php
@@ -0,0 +1,62 @@
+<?php
+/**
+ * ownCloud
+ *
+ * @author Bjoern Schiessle
+ * @copyright 2014 Bjoern Schiessle <schiessle@owncloud.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library 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 AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+class Test_ErrorHandler extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * @brief provide username, password combinations for testRemovePassword
+ * @return array
+ */
+ function passwordProvider() {
+ return array(
+ array('user', 'password'),
+ array('user@owncloud.org', 'password'),
+ array('user', 'pass@word'),
+ array('us:er', 'password'),
+ array('user', 'pass:word'),
+ );
+
+ }
+
+ /**
+ * @dataProvider passwordProvider
+ * @param string $username
+ * @param string $password
+ */
+ function testRemovePassword($username, $password) {
+ $url = 'http://'.$username.':'.$password.'@owncloud.org';
+ $expectedResult = 'http://xxx:xxx@owncloud.org';
+ $result = TestableErrorHandler::testRemovePassword($url);
+
+ $this->assertEquals($expectedResult, $result);
+ }
+
+}
+
+/**
+ * @brief dummy class to access protected methods of \OC\Log\ErrorHandler
+ */
+class TestableErrorHandler extends \OC\Log\ErrorHandler {
+ public static function testRemovePassword($msg) {
+ return self::removePassword($msg);
+ }
+}
diff --git a/tests/lib/files/cache/cache.php b/tests/lib/files/cache/cache.php
index 247373a5cb9..5d876932479 100644
--- a/tests/lib/files/cache/cache.php
+++ b/tests/lib/files/cache/cache.php
@@ -18,11 +18,11 @@ class LongId extends \OC\Files\Storage\Temporary {
class Cache extends \PHPUnit_Framework_TestCase {
/**
- * @var \OC\Files\Storage\Temporary $storage;
+ * @var \OC\Files\Storage\Temporary $storage ;
*/
private $storage;
/**
- * @var \OC\Files\Storage\Temporary $storage2;
+ * @var \OC\Files\Storage\Temporary $storage2 ;
*/
private $storage2;
@@ -137,6 +137,79 @@ class Cache extends \PHPUnit_Framework_TestCase {
$this->assertFalse($this->cache->inCache('folder/bar'));
}
+ public function testEncryptedFolder() {
+ $file1 = 'folder';
+ $file2 = 'folder/bar';
+ $file3 = 'folder/foo';
+ $data1 = array('size' => 100, 'mtime' => 50, 'mimetype' => 'httpd/unix-directory');
+ $fileData = array();
+ $fileData['bar'] = array('size' => 1000, 'unencrypted_size' => 900, 'encrypted' => 1, 'mtime' => 20, 'mimetype' => 'foo/file');
+ $fileData['foo'] = array('size' => 20, 'unencrypted_size' => 16, 'encrypted' => 1, 'mtime' => 25, 'mimetype' => 'foo/file');
+
+ $this->cache->put($file1, $data1);
+ $this->cache->put($file2, $fileData['bar']);
+ $this->cache->put($file3, $fileData['foo']);
+
+ $content = $this->cache->getFolderContents($file1);
+ $this->assertEquals(count($content), 2);
+ foreach ($content as $cachedData) {
+ $data = $fileData[$cachedData['name']];
+ // indirect retrieval swaps unencrypted_size and size
+ $this->assertEquals($data['unencrypted_size'], $cachedData['size']);
+ }
+
+ $file4 = 'folder/unkownSize';
+ $fileData['unkownSize'] = array('size' => -1, 'mtime' => 25, 'mimetype' => 'foo/file');
+ $this->cache->put($file4, $fileData['unkownSize']);
+
+ $this->assertEquals(-1, $this->cache->calculateFolderSize($file1));
+
+ $fileData['unkownSize'] = array('size' => 5, 'mtime' => 25, 'mimetype' => 'foo/file');
+ $this->cache->put($file4, $fileData['unkownSize']);
+
+ $this->assertEquals(916, $this->cache->calculateFolderSize($file1));
+ // direct cache entry retrieval returns the original values
+ $entry = $this->cache->get($file1);
+ $this->assertEquals(1025, $entry['size']);
+ $this->assertEquals(916, $entry['unencrypted_size']);
+
+ $this->cache->remove($file2);
+ $this->cache->remove($file3);
+ $this->cache->remove($file4);
+ $this->assertEquals(0, $this->cache->calculateFolderSize($file1));
+
+ $this->cache->remove('folder');
+ $this->assertFalse($this->cache->inCache('folder/foo'));
+ $this->assertFalse($this->cache->inCache('folder/bar'));
+ }
+
+ public function testRootFolderSizeForNonHomeStorage() {
+ $dir1 = 'knownsize';
+ $dir2 = 'unknownsize';
+ $fileData = array();
+ $fileData[''] = array('size' => -1, 'mtime' => 20, 'mimetype' => 'httpd/unix-directory');
+ $fileData[$dir1] = array('size' => 1000, 'mtime' => 20, 'mimetype' => 'httpd/unix-directory');
+ $fileData[$dir2] = array('size' => -1, 'mtime' => 25, 'mimetype' => 'httpd/unix-directory');
+
+ $this->cache->put('', $fileData['']);
+ $this->cache->put($dir1, $fileData[$dir1]);
+ $this->cache->put($dir2, $fileData[$dir2]);
+
+ $this->assertTrue($this->cache->inCache($dir1));
+ $this->assertTrue($this->cache->inCache($dir2));
+
+ // check that root size ignored the unknown sizes
+ $this->assertEquals(-1, $this->cache->calculateFolderSize(''));
+
+ // clean up
+ $this->cache->remove('');
+ $this->cache->remove($dir1);
+ $this->cache->remove($dir2);
+
+ $this->assertFalse($this->cache->inCache($dir1));
+ $this->assertFalse($this->cache->inCache($dir2));
+ }
+
function testStatus() {
$this->assertEquals(\OC\Files\Cache\Cache::NOT_FOUND, $this->cache->getStatus('foo'));
$this->cache->put('foo', array('size' => -1));
@@ -247,14 +320,14 @@ class Cache extends \PHPUnit_Framework_TestCase {
$data = array('size' => 1000, 'mtime' => 20, 'mimetype' => 'foo/file');
$this->cache->put('foo', $data);
$cachedData = $this->cache->get('foo');
- $this->assertEquals($data['mtime'], $cachedData['storage_mtime']);//if no storage_mtime is saved, mtime should be used
+ $this->assertEquals($data['mtime'], $cachedData['storage_mtime']); //if no storage_mtime is saved, mtime should be used
- $this->cache->put('foo', array('storage_mtime' => 30));//when setting storage_mtime, mtime is also set
+ $this->cache->put('foo', array('storage_mtime' => 30)); //when setting storage_mtime, mtime is also set
$cachedData = $this->cache->get('foo');
$this->assertEquals(30, $cachedData['storage_mtime']);
$this->assertEquals(30, $cachedData['mtime']);
- $this->cache->put('foo', array('mtime' => 25));//setting mtime does not change storage_mtime
+ $this->cache->put('foo', array('mtime' => 25)); //setting mtime does not change storage_mtime
$cachedData = $this->cache->get('foo');
$this->assertEquals(30, $cachedData['storage_mtime']);
$this->assertEquals(25, $cachedData['mtime']);
@@ -295,18 +368,18 @@ class Cache extends \PHPUnit_Framework_TestCase {
$this->assertGreaterThan(0, $cacheMock->put('folder', $data));
// put un-normalized folder
- $this->assertFalse($cacheMock->get('folder/' .$folderWith0308));
- $this->assertGreaterThan(0, $cacheMock->put('folder/' .$folderWith0308, $data));
+ $this->assertFalse($cacheMock->get('folder/' . $folderWith0308));
+ $this->assertGreaterThan(0, $cacheMock->put('folder/' . $folderWith0308, $data));
// get un-normalized folder by name
- $unNormalizedFolderName = $cacheMock->get('folder/' .$folderWith0308);
+ $unNormalizedFolderName = $cacheMock->get('folder/' . $folderWith0308);
// check if database layer normalized the folder name (this should not happen)
$this->assertEquals($folderWith0308, $unNormalizedFolderName['name']);
// put normalized folder
$this->assertFalse($cacheMock->get('folder/' . $folderWith00F6));
- $this->assertGreaterThan(0, $cacheMock->put('folder/' .$folderWith00F6, $data));
+ $this->assertGreaterThan(0, $cacheMock->put('folder/' . $folderWith00F6, $data));
// this is our bug, we have two different hashes with the same name (Schön)
$this->assertEquals(2, count($cacheMock->getFolderContents('folder')));
@@ -317,7 +390,7 @@ class Cache extends \PHPUnit_Framework_TestCase {
*/
public function testWithNormalizer() {
- if(!class_exists('Patchwork\PHP\Shim\Normalizer')) {
+ if (!class_exists('Patchwork\PHP\Shim\Normalizer')) {
$this->markTestSkipped('The 3rdparty Normalizer extension is not available.');
return;
}
@@ -335,18 +408,18 @@ class Cache extends \PHPUnit_Framework_TestCase {
$this->assertGreaterThan(0, $this->cache->put('folder', $data));
// put un-normalized folder
- $this->assertFalse($this->cache->get('folder/' .$folderWith0308));
- $this->assertGreaterThan(0, $this->cache->put('folder/' .$folderWith0308, $data));
+ $this->assertFalse($this->cache->get('folder/' . $folderWith0308));
+ $this->assertGreaterThan(0, $this->cache->put('folder/' . $folderWith0308, $data));
// get un-normalized folder by name
- $unNormalizedFolderName = $this->cache->get('folder/' .$folderWith0308);
+ $unNormalizedFolderName = $this->cache->get('folder/' . $folderWith0308);
// check if folder name was normalized
$this->assertEquals($folderWith00F6, $unNormalizedFolderName['name']);
// put normalized folder
$this->assertTrue(is_array($this->cache->get('folder/' . $folderWith00F6)));
- $this->assertGreaterThan(0, $this->cache->put('folder/' .$folderWith00F6, $data));
+ $this->assertGreaterThan(0, $this->cache->put('folder/' . $folderWith00F6, $data));
// at this point we should have only one folder named "Schön"
$this->assertEquals(1, count($this->cache->getFolderContents('folder')));
diff --git a/tests/lib/files/cache/homecache.php b/tests/lib/files/cache/homecache.php
new file mode 100644
index 00000000000..87fd0dba4c6
--- /dev/null
+++ b/tests/lib/files/cache/homecache.php
@@ -0,0 +1,127 @@
+<?php
+/**
+ * Copyright (c) 2012 Robin Appelman <icewind@owncloud.com>
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+
+namespace Test\Files\Cache;
+
+class DummyUser extends \OC\User\User {
+ /**
+ * @var string $home
+ */
+ private $home;
+
+ /**
+ * @var string $uid
+ */
+ private $uid;
+
+ public function __construct($uid, $home) {
+ $this->home = $home;
+ $this->uid = $uid;
+ }
+
+ /**
+ * @return string
+ */
+ public function getHome() {
+ return $this->home;
+ }
+
+ /**
+ * @return string
+ */
+ public function getUID() {
+ return $this->uid;
+ }
+}
+
+class HomeCache extends \PHPUnit_Framework_TestCase {
+ /**
+ * @var \OC\Files\Storage\Home $storage
+ */
+ private $storage;
+
+ /**
+ * @var \OC\Files\Cache\HomeCache $cache
+ */
+ private $cache;
+
+ /**
+ * @var \OC\User\User $user
+ */
+ private $user;
+
+ public function setUp() {
+ $this->user = new DummyUser('foo', \OC_Helper::tmpFolder());
+ $this->storage = new \OC\Files\Storage\Home(array('user' => $this->user));
+ $this->cache = $this->storage->getCache();
+ }
+
+ /**
+ * Tests that the root and files folder size calculation ignores the subdirs
+ * that have an unknown size. This makes sure that quota calculation still
+ * works as it's based on the "files" folder size.
+ */
+ public function testRootFolderSizeIgnoresUnknownUpdate() {
+ $dir1 = 'files/knownsize';
+ $dir2 = 'files/unknownsize';
+ $fileData = array();
+ $fileData[''] = array('size' => -1, 'mtime' => 20, 'mimetype' => 'httpd/unix-directory');
+ $fileData['files'] = array('size' => -1, 'mtime' => 20, 'mimetype' => 'httpd/unix-directory');
+ $fileData[$dir1] = array('size' => 1000, 'mtime' => 20, 'mimetype' => 'httpd/unix-directory');
+ $fileData[$dir2] = array('size' => -1, 'mtime' => 25, 'mimetype' => 'httpd/unix-directory');
+
+ $this->cache->put('', $fileData['']);
+ $this->cache->put('files', $fileData['files']);
+ $this->cache->put($dir1, $fileData[$dir1]);
+ $this->cache->put($dir2, $fileData[$dir2]);
+
+ $this->assertTrue($this->cache->inCache('files'));
+ $this->assertTrue($this->cache->inCache($dir1));
+ $this->assertTrue($this->cache->inCache($dir2));
+
+ // check that files and root size ignored the unknown sizes
+ $this->assertEquals(1000, $this->cache->calculateFolderSize('files'));
+ $this->assertEquals(1000, $this->cache->calculateFolderSize(''));
+
+ // clean up
+ $this->cache->remove('');
+ $this->cache->remove('files');
+ $this->cache->remove($dir1);
+ $this->cache->remove($dir2);
+
+ $this->assertFalse($this->cache->inCache('files'));
+ $this->assertFalse($this->cache->inCache($dir1));
+ $this->assertFalse($this->cache->inCache($dir2));
+ }
+
+ public function testRootFolderSizeIsFilesSize() {
+ $dir1 = 'files';
+ $afile = 'test.txt';
+ $fileData = array();
+ $fileData[''] = array('size' => 1500, 'mtime' => 20, 'mimetype' => 'httpd/unix-directory');
+ $fileData[$dir1] = array('size' => 1000, 'mtime' => 20, 'mimetype' => 'httpd/unix-directory');
+ $fileData[$afile] = array('size' => 500, 'mtime' => 20);
+
+ $this->cache->put('', $fileData['']);
+ $this->cache->put($dir1, $fileData[$dir1]);
+
+ $this->assertTrue($this->cache->inCache($dir1));
+
+ // check that root size ignored the unknown sizes
+ $data = $this->cache->get('files');
+ $this->assertEquals(1000, $data['size']);
+ $data = $this->cache->get('');
+ $this->assertEquals(1000, $data['size']);
+
+ // clean up
+ $this->cache->remove('');
+ $this->cache->remove($dir1);
+
+ $this->assertFalse($this->cache->inCache($dir1));
+ }
+}
diff --git a/tests/lib/files/cache/scanner.php b/tests/lib/files/cache/scanner.php
index 3f3a045377a..3f5604b4d45 100644
--- a/tests/lib/files/cache/scanner.php
+++ b/tests/lib/files/cache/scanner.php
@@ -147,7 +147,7 @@ class Scanner extends \PHPUnit_Framework_TestCase {
$this->scanner->scan('');
$oldData = $this->cache->get('');
$this->storage->unlink('folder/bar.txt');
- $this->cache->put('folder', array('mtime' => $this->storage->filemtime('folder')));
+ $this->cache->put('folder', array('mtime' => $this->storage->filemtime('folder'), 'storage_mtime' => $this->storage->filemtime('folder')));
$this->scanner->scan('', \OC\Files\Cache\Scanner::SCAN_SHALLOW, \OC\Files\Cache\Scanner::REUSE_SIZE);
$newData = $this->cache->get('');
$this->assertNotEquals($oldData['etag'], $newData['etag']);
diff --git a/tests/lib/files/cache/updater.php b/tests/lib/files/cache/updater.php
index 5d7997b0544..48986149a73 100644
--- a/tests/lib/files/cache/updater.php
+++ b/tests/lib/files/cache/updater.php
@@ -9,6 +9,7 @@
namespace Test\Files\Cache;
use \OC\Files\Filesystem as Filesystem;
+use OC\Files\Storage\Temporary;
class Updater extends \PHPUnit_Framework_TestCase {
/**
@@ -21,6 +22,8 @@ class Updater extends \PHPUnit_Framework_TestCase {
*/
private $scanner;
+ private $stateFilesEncryption;
+
/**
* @var \OC\Files\Cache\Cache $cache
*/
@@ -29,6 +32,12 @@ class Updater extends \PHPUnit_Framework_TestCase {
private static $user;
public function setUp() {
+
+ // remember files_encryption state
+ $this->stateFilesEncryption = \OC_App::isEnabled('files_encryption');
+ // we want to tests with the encryption app disabled
+ \OC_App::disable('files_encryption');
+
$this->storage = new \OC\Files\Storage\Temporary(array());
$textData = "dummy file data\n";
$imgData = file_get_contents(\OC::$SERVERROOT . '/core/img/logo.png');
@@ -46,6 +55,10 @@ class Updater extends \PHPUnit_Framework_TestCase {
if (!self::$user) {
self::$user = uniqid();
}
+
+ \OC_User::createUser(self::$user, 'password');
+ \OC_User::setUserId(self::$user);
+
\OC\Files\Filesystem::init(self::$user, '/' . self::$user . '/files');
Filesystem::clearMounts();
@@ -63,13 +76,19 @@ class Updater extends \PHPUnit_Framework_TestCase {
if ($this->cache) {
$this->cache->clear();
}
+ $result = \OC_User::deleteUser(self::$user);
+ $this->assertTrue($result);
Filesystem::tearDown();
+ // reset app files_encryption
+ if ($this->stateFilesEncryption) {
+ \OC_App::enable('files_encryption');
+ }
}
public function testWrite() {
$textSize = strlen("dummy file data\n");
$imageSize = filesize(\OC::$SERVERROOT . '/core/img/logo.png');
- $this->cache->put('foo.txt', array('mtime' => 100));
+ $this->cache->put('foo.txt', array('mtime' => 100, 'storage_mtime' => 150));
$rootCachedData = $this->cache->get('');
$this->assertEquals(3 * $textSize + $imageSize, $rootCachedData['size']);
@@ -183,6 +202,14 @@ class Updater extends \PHPUnit_Framework_TestCase {
$this->assertNotEquals($rootCachedData['etag'], $cachedData['etag']);
}
+ public function testRenameExtension() {
+ $fooCachedData = $this->cache->get('foo.txt');
+ $this->assertEquals('text/plain', $fooCachedData['mimetype']);
+ Filesystem::rename('foo.txt', 'foo.abcd');
+ $fooCachedData = $this->cache->get('foo.abcd');
+ $this->assertEquals('application/octet-stream', $fooCachedData['mimetype']);
+ }
+
public function testRenameWithMountPoints() {
$storage2 = new \OC\Files\Storage\Temporary(array());
$cache2 = $storage2->getCache();
@@ -233,7 +260,6 @@ class Updater extends \PHPUnit_Framework_TestCase {
$cachedData = $this->cache->get('folder');
$this->assertNotEquals($folderCachedData['etag'], $cachedData['etag']);
- $this->assertEquals($time, $cachedData['mtime']);
$cachedData = $this->cache->get('');
$this->assertNotEquals($rootCachedData['etag'], $cachedData['etag']);
@@ -258,11 +284,41 @@ class Updater extends \PHPUnit_Framework_TestCase {
$cachedData = $cache2->get('');
$this->assertNotEquals($substorageCachedData['etag'], $cachedData['etag']);
- $this->assertEquals($time, $cachedData['mtime']);
$cachedData = $this->cache->get('folder');
$this->assertNotEquals($folderCachedData['etag'], $cachedData['etag']);
$this->assertEquals($time, $cachedData['mtime']);
}
+ public function testUpdatePermissionsOnRescanOnlyForUpdatedFile() {
+ $permissionsCache = $this->storage->getPermissionsCache();
+ $scanner = $this->storage->getScanner();
+ $scanner->scan('');
+ $cache = $this->storage->getCache();
+ $loggedInUser = \OC_User::getUser();
+ \OC_User::setUserId(self::$user);
+ FileSystem::getDirectoryContent('/');
+ $past = time() - 600;
+ $cache->put('', array('storage_mtime' => $past));
+
+ $this->assertNotEquals(-1, $permissionsCache->get($cache->getId('foo.txt'), self::$user));
+ $this->assertNotEquals(-1, $permissionsCache->get($cache->getId('foo.png'), self::$user));
+
+ $permissionsCache->set($cache->getId('foo.png'), self::$user, 15);
+ FileSystem::file_put_contents('/foo.txt', 'asd');
+
+ $this->assertEquals(-1, $permissionsCache->get($cache->getId('foo.txt'), self::$user));
+ $this->assertEquals(15, $permissionsCache->get($cache->getId('foo.png'), self::$user));
+
+ FileSystem::getDirectoryContent('/');
+
+ $this->assertEquals(15, $permissionsCache->get($cache->getId('foo.png'), self::$user));
+
+ FileSystem::file_put_contents('/qwerty.txt', 'asd');
+ FileSystem::getDirectoryContent('/');
+
+ $this->assertEquals(15, $permissionsCache->get($cache->getId('foo.png'), self::$user));
+
+ \OC_User::setUserId($loggedInUser);
+ }
}
diff --git a/tests/lib/files/cache/watcher.php b/tests/lib/files/cache/watcher.php
index 749b1ab75a3..1920c276907 100644
--- a/tests/lib/files/cache/watcher.php
+++ b/tests/lib/files/cache/watcher.php
@@ -53,6 +53,9 @@ class Watcher extends \PHPUnit_Framework_TestCase {
$cache->put('bar.test', array('storage_mtime' => 10));
$storage->file_put_contents('bar.test', 'test data');
+ // make sure that PHP can read the new size correctly
+ clearstatcache();
+
$updater->checkUpdate('bar.test');
$cachedData = $cache->get('bar.test');
$this->assertEquals(9, $cachedData['size']);
diff --git a/tests/lib/files/etagtest.php b/tests/lib/files/etagtest.php
new file mode 100644
index 00000000000..6c41413c4df
--- /dev/null
+++ b/tests/lib/files/etagtest.php
@@ -0,0 +1,79 @@
+<?php
+/**
+ * Copyright (c) 2012 Robin Appelman <icewind@owncloud.com>
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+
+namespace Test\Files;
+
+use OC\Files\Filesystem;
+use OCP\Share;
+
+class EtagTest extends \PHPUnit_Framework_TestCase {
+ private $datadir;
+
+ private $tmpDir;
+
+ private $uid;
+
+ /**
+ * @var \OC_User_Dummy $userBackend
+ */
+ private $userBackend;
+
+ public function setUp() {
+ \OC_Hook::clear('OC_Filesystem', 'setup');
+ \OCP\Util::connectHook('OC_Filesystem', 'setup', '\OC\Files\Storage\Shared', 'setup');
+ \OCP\Share::registerBackend('file', 'OC_Share_Backend_File');
+ \OCP\Share::registerBackend('folder', 'OC_Share_Backend_Folder', 'file');
+
+ $this->datadir = \OC_Config::getValue('datadirectory');
+ $this->tmpDir = \OC_Helper::tmpFolder();
+ \OC_Config::setValue('datadirectory', $this->tmpDir);
+ $this->uid = \OC_User::getUser();
+ \OC_User::setUserId(null);
+
+ $this->userBackend = new \OC_User_Dummy();
+ \OC_User::useBackend($this->userBackend);
+ \OC_Util::tearDownFS();
+ }
+
+ public function tearDown() {
+ \OC_Config::setValue('datadirectory', $this->datadir);
+ \OC_User::setUserId($this->uid);
+ \OC_Util::setupFS($this->uid);
+ }
+
+ public function testNewUser() {
+ $user1 = uniqid('user_');
+ $this->userBackend->createUser($user1, '');
+
+ \OC_Util::tearDownFS();
+ \OC_User::setUserId($user1);
+ \OC_Util::setupFS($user1);
+ Filesystem::mkdir('/folder');
+ Filesystem::mkdir('/folder/subfolder');
+ Filesystem::file_put_contents('/foo.txt', 'asd');
+ Filesystem::file_put_contents('/folder/bar.txt', 'fgh');
+ Filesystem::file_put_contents('/folder/subfolder/qwerty.txt', 'jkl');
+
+ $files = array('/foo.txt', '/folder/bar.txt', '/folder/subfolder', '/folder/subfolder/qwerty.txt');
+ $originalEtags = $this->getEtags($files);
+
+ $scanner = new \OC\Files\Utils\Scanner($user1);
+ $scanner->backgroundScan('/');
+
+ $this->assertEquals($originalEtags, $this->getEtags($files));
+ }
+
+ private function getEtags($files) {
+ $etags = array();
+ foreach ($files as $file) {
+ $info = Filesystem::getFileInfo($file);
+ $etags[$file] = $info['etag'];
+ }
+ return $etags;
+ }
+}
diff --git a/tests/lib/files/filesystem.php b/tests/lib/files/filesystem.php
index bef70cc725b..90f1dfe581b 100644
--- a/tests/lib/files/filesystem.php
+++ b/tests/lib/files/filesystem.php
@@ -26,7 +26,7 @@ class Filesystem extends \PHPUnit_Framework_TestCase {
/**
* @var array tmpDirs
*/
- private $tmpDirs=array();
+ private $tmpDirs = array();
/**
* @return array
@@ -41,57 +41,115 @@ class Filesystem extends \PHPUnit_Framework_TestCase {
foreach ($this->tmpDirs as $dir) {
\OC_Helper::rmdirr($dir);
}
+ \OC\Files\Filesystem::clearMounts();
+ \OC_User::setUserId('');
}
public function setUp() {
+ \OC_User::setUserId('');
\OC\Files\Filesystem::clearMounts();
}
public function testMount() {
- \OC\Files\Filesystem::mount('\OC\Files\Storage\Local',self::getStorageData(),'/');
- $this->assertEquals('/',\OC\Files\Filesystem::getMountPoint('/'));
- $this->assertEquals('/',\OC\Files\Filesystem::getMountPoint('/some/folder'));
- list( , $internalPath)=\OC\Files\Filesystem::resolvePath('/');
- $this->assertEquals('',$internalPath);
- list( , $internalPath)=\OC\Files\Filesystem::resolvePath('/some/folder');
- $this->assertEquals('some/folder',$internalPath);
-
- \OC\Files\Filesystem::mount('\OC\Files\Storage\Local',self::getStorageData(),'/some');
- $this->assertEquals('/',\OC\Files\Filesystem::getMountPoint('/'));
- $this->assertEquals('/some/',\OC\Files\Filesystem::getMountPoint('/some/folder'));
- $this->assertEquals('/some/',\OC\Files\Filesystem::getMountPoint('/some/'));
- $this->assertEquals('/some/',\OC\Files\Filesystem::getMountPoint('/some'));
- list( , $internalPath)=\OC\Files\Filesystem::resolvePath('/some/folder');
- $this->assertEquals('folder',$internalPath);
+ \OC\Files\Filesystem::mount('\OC\Files\Storage\Local', self::getStorageData(), '/');
+ $this->assertEquals('/', \OC\Files\Filesystem::getMountPoint('/'));
+ $this->assertEquals('/', \OC\Files\Filesystem::getMountPoint('/some/folder'));
+ list(, $internalPath) = \OC\Files\Filesystem::resolvePath('/');
+ $this->assertEquals('', $internalPath);
+ list(, $internalPath) = \OC\Files\Filesystem::resolvePath('/some/folder');
+ $this->assertEquals('some/folder', $internalPath);
+
+ \OC\Files\Filesystem::mount('\OC\Files\Storage\Local', self::getStorageData(), '/some');
+ $this->assertEquals('/', \OC\Files\Filesystem::getMountPoint('/'));
+ $this->assertEquals('/some/', \OC\Files\Filesystem::getMountPoint('/some/folder'));
+ $this->assertEquals('/some/', \OC\Files\Filesystem::getMountPoint('/some/'));
+ $this->assertEquals('/some/', \OC\Files\Filesystem::getMountPoint('/some'));
+ list(, $internalPath) = \OC\Files\Filesystem::resolvePath('/some/folder');
+ $this->assertEquals('folder', $internalPath);
}
public function testNormalize() {
+ $this->assertEquals('/', \OC\Files\Filesystem::normalizePath(''));
+ $this->assertEquals('/', \OC\Files\Filesystem::normalizePath('/'));
+ $this->assertEquals('/', \OC\Files\Filesystem::normalizePath('/', false));
+ $this->assertEquals('/', \OC\Files\Filesystem::normalizePath('//'));
+ $this->assertEquals('/', \OC\Files\Filesystem::normalizePath('//', false));
$this->assertEquals('/path', \OC\Files\Filesystem::normalizePath('/path/'));
$this->assertEquals('/path/', \OC\Files\Filesystem::normalizePath('/path/', false));
$this->assertEquals('/path', \OC\Files\Filesystem::normalizePath('path'));
- $this->assertEquals('/path', \OC\Files\Filesystem::normalizePath('\path'));
$this->assertEquals('/foo/bar', \OC\Files\Filesystem::normalizePath('/foo//bar/'));
+ $this->assertEquals('/foo/bar/', \OC\Files\Filesystem::normalizePath('/foo//bar/', false));
$this->assertEquals('/foo/bar', \OC\Files\Filesystem::normalizePath('/foo////bar'));
+ $this->assertEquals('/foo/bar', \OC\Files\Filesystem::normalizePath('/foo/////bar'));
+ $this->assertEquals('/foo/bar', \OC\Files\Filesystem::normalizePath('/foo/bar/.'));
+ $this->assertEquals('/foo/bar', \OC\Files\Filesystem::normalizePath('/foo/bar/./'));
+ $this->assertEquals('/foo/bar/', \OC\Files\Filesystem::normalizePath('/foo/bar/./', false));
+ $this->assertEquals('/foo/bar', \OC\Files\Filesystem::normalizePath('/foo/bar/./.'));
+ $this->assertEquals('/foo/bar', \OC\Files\Filesystem::normalizePath('/foo/bar/././'));
+ $this->assertEquals('/foo/bar/', \OC\Files\Filesystem::normalizePath('/foo/bar/././', false));
+ $this->assertEquals('/foo/bar', \OC\Files\Filesystem::normalizePath('/foo/./bar/'));
+ $this->assertEquals('/foo/bar/', \OC\Files\Filesystem::normalizePath('/foo/./bar/', false));
+ $this->assertEquals('/foo/.bar', \OC\Files\Filesystem::normalizePath('/foo/.bar/'));
+ $this->assertEquals('/foo/.bar/', \OC\Files\Filesystem::normalizePath('/foo/.bar/', false));
+ $this->assertEquals('/foo/.bar/tee', \OC\Files\Filesystem::normalizePath('/foo/.bar/tee'));
+
+ // normalize does not resolve '..' (by design)
+ $this->assertEquals('/foo/..', \OC\Files\Filesystem::normalizePath('/foo/../'));
+
if (class_exists('Patchwork\PHP\Shim\Normalizer')) {
$this->assertEquals("/foo/bar\xC3\xBC", \OC\Files\Filesystem::normalizePath("/foo/baru\xCC\x88"));
}
}
+ public function testNormalizeWindowsPaths() {
+ $this->assertEquals('/', \OC\Files\Filesystem::normalizePath(''));
+ $this->assertEquals('/', \OC\Files\Filesystem::normalizePath('\\'));
+ $this->assertEquals('/', \OC\Files\Filesystem::normalizePath('\\', false));
+ $this->assertEquals('/', \OC\Files\Filesystem::normalizePath('\\\\'));
+ $this->assertEquals('/', \OC\Files\Filesystem::normalizePath('\\\\', false));
+ $this->assertEquals('/path', \OC\Files\Filesystem::normalizePath('\\path'));
+ $this->assertEquals('/path', \OC\Files\Filesystem::normalizePath('\\path', false));
+ $this->assertEquals('/path', \OC\Files\Filesystem::normalizePath('\\path\\'));
+ $this->assertEquals('/path/', \OC\Files\Filesystem::normalizePath('\\path\\', false));
+ $this->assertEquals('/foo/bar', \OC\Files\Filesystem::normalizePath('\\foo\\\\bar\\'));
+ $this->assertEquals('/foo/bar/', \OC\Files\Filesystem::normalizePath('\\foo\\\\bar\\', false));
+ $this->assertEquals('/foo/bar', \OC\Files\Filesystem::normalizePath('\\foo\\\\\\\\bar'));
+ $this->assertEquals('/foo/bar', \OC\Files\Filesystem::normalizePath('\\foo\\\\\\\\\\bar'));
+ $this->assertEquals('/foo/bar', \OC\Files\Filesystem::normalizePath('\\foo\\bar\\.'));
+ $this->assertEquals('/foo/bar', \OC\Files\Filesystem::normalizePath('\\foo\\bar\\.\\'));
+ $this->assertEquals('/foo/bar/', \OC\Files\Filesystem::normalizePath('\\foo\\bar\\.\\', false));
+ $this->assertEquals('/foo/bar', \OC\Files\Filesystem::normalizePath('\\foo\\bar\\.\\.'));
+ $this->assertEquals('/foo/bar', \OC\Files\Filesystem::normalizePath('\\foo\\bar\\.\\.\\'));
+ $this->assertEquals('/foo/bar/', \OC\Files\Filesystem::normalizePath('\\foo\\bar\\.\\.\\', false));
+ $this->assertEquals('/foo/bar', \OC\Files\Filesystem::normalizePath('\\foo\\.\\bar\\'));
+ $this->assertEquals('/foo/bar/', \OC\Files\Filesystem::normalizePath('\\foo\\.\\bar\\', false));
+ $this->assertEquals('/foo/.bar', \OC\Files\Filesystem::normalizePath('\\foo\\.bar\\'));
+ $this->assertEquals('/foo/.bar/', \OC\Files\Filesystem::normalizePath('\\foo\\.bar\\', false));
+ $this->assertEquals('/foo/.bar/tee', \OC\Files\Filesystem::normalizePath('\\foo\\.bar\\tee'));
+
+ // normalize does not resolve '..' (by design)
+ $this->assertEquals('/foo/..', \OC\Files\Filesystem::normalizePath('\\foo\\..\\'));
+
+ if (class_exists('Patchwork\PHP\Shim\Normalizer')) {
+ $this->assertEquals("/foo/bar\xC3\xBC", \OC\Files\Filesystem::normalizePath("\\foo\\baru\xCC\x88"));
+ }
+ }
+
public function testHooks() {
- if(\OC\Files\Filesystem::getView()){
+ if (\OC\Files\Filesystem::getView()) {
$user = \OC_User::getUser();
- }else{
- $user=uniqid();
- \OC\Files\Filesystem::init($user, '/'.$user.'/files');
+ } else {
+ $user = uniqid();
+ \OC\Files\Filesystem::init($user, '/' . $user . '/files');
}
\OC_Hook::clear('OC_Filesystem');
\OC_Hook::connect('OC_Filesystem', 'post_write', $this, 'dummyHook');
\OC\Files\Filesystem::mount('OC\Files\Storage\Temporary', array(), '/');
- $rootView=new \OC\Files\View('');
- $rootView->mkdir('/'.$user);
- $rootView->mkdir('/'.$user.'/files');
+ $rootView = new \OC\Files\View('');
+ $rootView->mkdir('/' . $user);
+ $rootView->mkdir('/' . $user . '/files');
// \OC\Files\Filesystem::file_put_contents('/foo', 'foo');
\OC\Files\Filesystem::mkdir('/bar');
@@ -103,6 +161,67 @@ class Filesystem extends \PHPUnit_Framework_TestCase {
// \OC\Files\Filesystem::file_put_contents('/bar//foo', $fh);
}
+ /**
+ * Tests that a local storage mount is used when passed user
+ * does not exist.
+ */
+ public function testLocalMountWhenUserDoesNotExist() {
+ $datadir = \OC_Config::getValue("datadirectory", \OC::$SERVERROOT . "/data");
+ $userId = uniqid('user_');
+
+ \OC\Files\Filesystem::initMountPoints($userId);
+
+ $homeMount = \OC\Files\Filesystem::getStorage('/' . $userId . '/');
+
+ $this->assertInstanceOf('\OC\Files\Storage\Local', $homeMount);
+ $this->assertEquals('local::' . $datadir . '/' . $userId . '/', $homeMount->getId());
+ }
+
+ /**
+ * Tests that the home storage is used for the user's mount point
+ */
+ public function testHomeMount() {
+ $userId = uniqid('user_');
+
+ \OC_User::createUser($userId, $userId);
+
+ \OC\Files\Filesystem::initMountPoints($userId);
+
+ $homeMount = \OC\Files\Filesystem::getStorage('/' . $userId . '/');
+
+ $this->assertInstanceOf('\OC\Files\Storage\Home', $homeMount);
+ $this->assertEquals('home::' . $userId, $homeMount->getId());
+
+ \OC_User::deleteUser($userId);
+ }
+
+ /**
+ * Tests that the home storage is used in legacy mode
+ * for the user's mount point
+ */
+ public function testLegacyHomeMount() {
+ $datadir = \OC_Config::getValue("datadirectory", \OC::$SERVERROOT . "/data");
+ $userId = uniqid('user_');
+
+ // insert storage into DB by constructing it
+ // to make initMountsPoint find its existence
+ $localStorage = new \OC\Files\Storage\Local(array('datadir' => $datadir . '/' . $userId . '/'));
+ // this will trigger the insert
+ $cache = $localStorage->getCache();
+
+ \OC_User::createUser($userId, $userId);
+ \OC\Files\Filesystem::initMountPoints($userId);
+
+ $homeMount = \OC\Files\Filesystem::getStorage('/' . $userId . '/');
+
+ $this->assertInstanceOf('\OC\Files\Storage\Home', $homeMount);
+ $this->assertEquals('local::' . $datadir . '/' . $userId . '/', $homeMount->getId());
+
+ \OC_User::deleteUser($userId);
+ // delete storage entry
+ $cache->clear();
+ }
+
public function dummyHook($arguments) {
$path = $arguments['path'];
$this->assertEquals($path, \OC\Files\Filesystem::normalizePath($path)); //the path passed to the hook should already be normalized
diff --git a/tests/lib/files/storage/home.php b/tests/lib/files/storage/home.php
new file mode 100644
index 00000000000..885291e4404
--- /dev/null
+++ b/tests/lib/files/storage/home.php
@@ -0,0 +1,96 @@
+<?php
+/**
+ * ownCloud
+ *
+ * @author Robin Appelman
+ * @copyright 2012 Robin Appelman icewind@owncloud.com
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library 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 AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace Test\Files\Storage;
+
+use OC\User\User;
+
+class DummyUser extends User {
+ private $home;
+
+ private $uid;
+
+ public function __construct($uid, $home) {
+ $this->uid = $uid;
+ $this->home = $home;
+ }
+
+ public function getHome() {
+ return $this->home;
+ }
+
+ public function getUID() {
+ return $this->uid;
+ }
+}
+
+class Home extends Storage {
+ /**
+ * @var string tmpDir
+ */
+ private $tmpDir;
+
+ /**
+ * @var \OC\User\User $user
+ */
+ private $user;
+
+ public function setUp() {
+ $this->tmpDir = \OC_Helper::tmpFolder();
+ $this->userId = uniqid('user_');
+ $this->user = new DummyUser($this->userId, $this->tmpDir);
+ $this->instance = new \OC\Files\Storage\Home(array('user' => $this->user));
+ }
+
+ public function tearDown() {
+ \OC_Helper::rmdirr($this->tmpDir);
+ }
+
+ /**
+ * Tests that the root path matches the data dir
+ */
+ public function testRoot() {
+ $this->assertEquals($this->tmpDir, $this->instance->getLocalFolder(''));
+ }
+
+ /**
+ * Tests that the home id is in the format home::user1
+ */
+ public function testId() {
+ $this->assertEquals('home::' . $this->userId, $this->instance->getId());
+ }
+
+ /**
+ * Tests that the legacy home id is in the format local::/path/to/datadir/user1/
+ */
+ public function testLegacyId() {
+ $this->instance = new \OC\Files\Storage\Home(array('user' => $this->user, 'legacy' => true));
+ $this->assertEquals('local::' . $this->tmpDir . '/', $this->instance->getId());
+ }
+
+ /**
+ * Tests that getCache() returns an instance of HomeCache
+ */
+ public function testGetCacheReturnsHomeCache() {
+ $this->assertInstanceOf('\OC\Files\Cache\HomeCache', $this->instance->getCache());
+ }
+}
diff --git a/tests/lib/files/storage/storage.php b/tests/lib/files/storage/storage.php
index 3f339a10016..182c014d999 100644
--- a/tests/lib/files/storage/storage.php
+++ b/tests/lib/files/storage/storage.php
@@ -42,18 +42,28 @@ abstract class Storage extends \PHPUnit_Framework_TestCase {
$this->assertTrue($this->instance->isUpdatable('/'), 'Root folder is not writable');
}
- public function testDirectories() {
- $this->assertFalse($this->instance->file_exists('/folder'));
+ /**
+ * Check that the test() function works
+ */
+ public function testTestFunction() {
+ $this->assertTrue($this->instance->test());
+ }
+
+ /**
+ * @dataProvider directoryProvider
+ */
+ public function testDirectories($directory) {
+ $this->assertFalse($this->instance->file_exists('/'.$directory));
- $this->assertTrue($this->instance->mkdir('/folder'));
+ $this->assertTrue($this->instance->mkdir('/'.$directory));
- $this->assertTrue($this->instance->file_exists('/folder'));
- $this->assertTrue($this->instance->is_dir('/folder'));
- $this->assertFalse($this->instance->is_file('/folder'));
- $this->assertEquals('dir', $this->instance->filetype('/folder'));
- $this->assertEquals(0, $this->instance->filesize('/folder'));
- $this->assertTrue($this->instance->isReadable('/folder'));
- $this->assertTrue($this->instance->isUpdatable('/folder'));
+ $this->assertTrue($this->instance->file_exists('/'.$directory));
+ $this->assertTrue($this->instance->is_dir('/'.$directory));
+ $this->assertFalse($this->instance->is_file('/'.$directory));
+ $this->assertEquals('dir', $this->instance->filetype('/'.$directory));
+ $this->assertEquals(0, $this->instance->filesize('/'.$directory));
+ $this->assertTrue($this->instance->isReadable('/'.$directory));
+ $this->assertTrue($this->instance->isUpdatable('/'.$directory));
$dh = $this->instance->opendir('/');
$content = array();
@@ -62,14 +72,14 @@ abstract class Storage extends \PHPUnit_Framework_TestCase {
$content[] = $file;
}
}
- $this->assertEquals(array('folder'), $content);
+ $this->assertEquals(array($directory), $content);
- $this->assertFalse($this->instance->mkdir('/folder')); //cant create existing folders
- $this->assertTrue($this->instance->rmdir('/folder'));
+ $this->assertFalse($this->instance->mkdir('/'.$directory)); //cant create existing folders
+ $this->assertTrue($this->instance->rmdir('/'.$directory));
- $this->assertFalse($this->instance->file_exists('/folder'));
+ $this->assertFalse($this->instance->file_exists('/'.$directory));
- $this->assertFalse($this->instance->rmdir('/folder')); //cant remove non existing folders
+ $this->assertFalse($this->instance->rmdir('/'.$directory)); //cant remove non existing folders
$dh = $this->instance->opendir('/');
$content = array();
@@ -81,6 +91,14 @@ abstract class Storage extends \PHPUnit_Framework_TestCase {
$this->assertEquals(array(), $content);
}
+ public function directoryProvider()
+ {
+ return array(
+ array('folder'),
+ array(' folder'),
+ array('folder '),
+ );
+ }
/**
* test the various uses of file_get_contents and file_put_contents
*/
@@ -128,7 +146,15 @@ abstract class Storage extends \PHPUnit_Framework_TestCase {
$this->instance->rename('/source.txt', '/target2.txt');
$this->assertTrue($this->instance->file_exists('/target2.txt'));
$this->assertFalse($this->instance->file_exists('/source.txt'));
- $this->assertEquals(file_get_contents($textFile), $this->instance->file_get_contents('/target.txt'));
+ $this->assertEquals(file_get_contents($textFile), $this->instance->file_get_contents('/target2.txt'));
+
+ // move to overwrite
+ $testContents = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
+ $this->instance->file_put_contents('/target3.txt', $testContents);
+ $this->instance->rename('/target2.txt', '/target3.txt');
+ $this->assertTrue($this->instance->file_exists('/target3.txt'));
+ $this->assertFalse($this->instance->file_exists('/target2.txt'));
+ $this->assertEquals(file_get_contents($textFile), $this->instance->file_get_contents('/target3.txt'));
}
public function testLocal() {
@@ -171,8 +197,9 @@ abstract class Storage extends \PHPUnit_Framework_TestCase {
$this->assertTrue($this->instance->hasUpdated('/lorem.txt', $ctimeStart - 5));
$this->assertTrue($this->instance->hasUpdated('/', $ctimeStart - 5));
- $this->assertTrue(($ctimeStart - 5) <= $mTime);
- $this->assertTrue($mTime <= ($ctimeEnd + 1));
+ // check that ($ctimeStart - 5) <= $mTime <= ($ctimeEnd + 1)
+ $this->assertGreaterThanOrEqual(($ctimeStart - 5), $mTime);
+ $this->assertLessThanOrEqual(($ctimeEnd + 1), $mTime);
$this->assertEquals(filesize($textFile), $this->instance->filesize('/lorem.txt'));
$stat = $this->instance->stat('/lorem.txt');
@@ -191,6 +218,17 @@ abstract class Storage extends \PHPUnit_Framework_TestCase {
$this->assertTrue($this->instance->hasUpdated('/', $mtimeStart - 5));
}
+ public function testUnlink() {
+ $textFile = \OC::$SERVERROOT . '/tests/data/lorem.txt';
+ $this->instance->file_put_contents('/lorem.txt', file_get_contents($textFile));
+
+ $this->assertTrue($this->instance->file_exists('/lorem.txt'));
+
+ $this->assertTrue($this->instance->unlink('/lorem.txt'));
+
+ $this->assertFalse($this->instance->file_exists('/lorem.txt'));
+ }
+
public function testFOpen() {
$textFile = \OC::$SERVERROOT . '/tests/data/lorem.txt';
@@ -213,7 +251,8 @@ abstract class Storage extends \PHPUnit_Framework_TestCase {
public function testTouchCreateFile() {
$this->assertFalse($this->instance->file_exists('foo'));
- $this->instance->touch('foo');
+ // returns true on success
+ $this->assertTrue($this->instance->touch('foo'));
$this->assertTrue($this->instance->file_exists('foo'));
}
@@ -222,7 +261,19 @@ abstract class Storage extends \PHPUnit_Framework_TestCase {
$this->instance->mkdir('folder/bar');
$this->instance->file_put_contents('folder/asd.txt', 'foobar');
$this->instance->file_put_contents('folder/bar/foo.txt', 'asd');
- $this->instance->rmdir('folder');
+ $this->assertTrue($this->instance->rmdir('folder'));
+ $this->assertFalse($this->instance->file_exists('folder/asd.txt'));
+ $this->assertFalse($this->instance->file_exists('folder/bar/foo.txt'));
+ $this->assertFalse($this->instance->file_exists('folder/bar'));
+ $this->assertFalse($this->instance->file_exists('folder'));
+ }
+
+ public function testRecursiveUnlink() {
+ $this->instance->mkdir('folder');
+ $this->instance->mkdir('folder/bar');
+ $this->instance->file_put_contents('folder/asd.txt', 'foobar');
+ $this->instance->file_put_contents('folder/bar/foo.txt', 'asd');
+ $this->assertTrue($this->instance->unlink('folder'));
$this->assertFalse($this->instance->file_exists('folder/asd.txt'));
$this->assertFalse($this->instance->file_exists('folder/bar/foo.txt'));
$this->assertFalse($this->instance->file_exists('folder/bar'));
diff --git a/tests/lib/files/storage/wrapper/quota.php b/tests/lib/files/storage/wrapper/quota.php
index 3702f8154f5..87bafb64d41 100644
--- a/tests/lib/files/storage/wrapper/quota.php
+++ b/tests/lib/files/storage/wrapper/quota.php
@@ -58,4 +58,45 @@ class Quota extends \Test\Files\Storage\Storage {
fclose($stream);
$this->assertEquals('foobarqwe', $instance->file_get_contents('foo'));
}
+
+ public function testReturnFalseWhenFopenFailed(){
+ $failStorage = $this->getMock(
+ '\OC\Files\Storage\Local',
+ array('fopen'),
+ array(array('datadir' => $this->tmpDir)));
+ $failStorage->expects($this->any())
+ ->method('fopen')
+ ->will($this->returnValue(false));
+
+ $instance = new \OC\Files\Storage\Wrapper\Quota(array('storage' => $failStorage, 'quota' => 1000));
+
+ $this->assertFalse($instance->fopen('failedfopen', 'r'));
+ }
+
+ public function testReturnRegularStreamOnRead(){
+ $instance = $this->getLimitedStorage(9);
+
+ // create test file first
+ $stream = $instance->fopen('foo', 'w+');
+ fwrite($stream, 'blablacontent');
+ fclose($stream);
+
+ $stream = $instance->fopen('foo', 'r');
+ $meta = stream_get_meta_data($stream);
+ $this->assertEquals('plainfile', $meta['wrapper_type']);
+ fclose($stream);
+
+ $stream = $instance->fopen('foo', 'rb');
+ $meta = stream_get_meta_data($stream);
+ $this->assertEquals('plainfile', $meta['wrapper_type']);
+ fclose($stream);
+ }
+
+ public function testReturnQuotaStreamOnWrite(){
+ $instance = $this->getLimitedStorage(9);
+ $stream = $instance->fopen('foo', 'w+');
+ $meta = stream_get_meta_data($stream);
+ $this->assertEquals('user-space', $meta['wrapper_type']);
+ fclose($stream);
+ }
}
diff --git a/tests/lib/files/stream/quota.php b/tests/lib/files/stream/quota.php
index 22d3e93592c..b11f0ac74c0 100644
--- a/tests/lib/files/stream/quota.php
+++ b/tests/lib/files/stream/quota.php
@@ -75,4 +75,76 @@ class Quota extends \PHPUnit_Framework_TestCase {
rewind($stream);
$this->assertEquals('qwerty', fread($stream, 100));
}
+
+ public function testFseekReturnsSuccess() {
+ $stream = $this->getStream('w+', 100);
+ fwrite($stream, '0123456789');
+ $this->assertEquals(0, fseek($stream, 3, SEEK_SET));
+ $this->assertEquals(0, fseek($stream, -1, SEEK_CUR));
+ $this->assertEquals(0, fseek($stream, -4, SEEK_END));
+ }
+
+ public function testWriteAfterSeekEndWithEnoughSpace() {
+ $stream = $this->getStream('w+', 100);
+ fwrite($stream, '0123456789');
+ fseek($stream, -3, SEEK_END);
+ $this->assertEquals(11, fwrite($stream, 'abcdefghijk'));
+ rewind($stream);
+ $this->assertEquals('0123456abcdefghijk', fread($stream, 100));
+ }
+
+ public function testWriteAfterSeekEndWithNotEnoughSpace() {
+ $stream = $this->getStream('w+', 13);
+ fwrite($stream, '0123456789');
+ // seek forward first to potentially week out
+ // potential limit calculation errors
+ fseek($stream, 4, SEEK_SET);
+ // seek to the end
+ fseek($stream, -3, SEEK_END);
+ $this->assertEquals(6, fwrite($stream, 'abcdefghijk'));
+ rewind($stream);
+ $this->assertEquals('0123456abcdef', fread($stream, 100));
+ }
+
+ public function testWriteAfterSeekSetWithEnoughSpace() {
+ $stream = $this->getStream('w+', 100);
+ fwrite($stream, '0123456789');
+ fseek($stream, 7, SEEK_SET);
+ $this->assertEquals(11, fwrite($stream, 'abcdefghijk'));
+ rewind($stream);
+ $this->assertEquals('0123456abcdefghijk', fread($stream, 100));
+ }
+
+ public function testWriteAfterSeekSetWithNotEnoughSpace() {
+ $stream = $this->getStream('w+', 13);
+ fwrite($stream, '0123456789');
+ fseek($stream, 7, SEEK_SET);
+ $this->assertEquals(6, fwrite($stream, 'abcdefghijk'));
+ rewind($stream);
+ $this->assertEquals('0123456abcdef', fread($stream, 100));
+ }
+
+ public function testWriteAfterSeekCurWithEnoughSpace() {
+ $stream = $this->getStream('w+', 100);
+ fwrite($stream, '0123456789');
+ rewind($stream);
+ fseek($stream, 3, SEEK_CUR);
+ fseek($stream, 5, SEEK_CUR);
+ fseek($stream, -1, SEEK_CUR);
+ $this->assertEquals(11, fwrite($stream, 'abcdefghijk'));
+ rewind($stream);
+ $this->assertEquals('0123456abcdefghijk', fread($stream, 100));
+ }
+
+ public function testWriteAfterSeekCurWithNotEnoughSpace() {
+ $stream = $this->getStream('w+', 13);
+ fwrite($stream, '0123456789');
+ rewind($stream);
+ fseek($stream, 3, SEEK_CUR);
+ fseek($stream, 5, SEEK_CUR);
+ fseek($stream, -1, SEEK_CUR);
+ $this->assertEquals(6, fwrite($stream, 'abcdefghijk'));
+ rewind($stream);
+ $this->assertEquals('0123456abcdef', fread($stream, 100));
+ }
}
diff --git a/tests/lib/files/view.php b/tests/lib/files/view.php
index 3043f132b73..72a2f854cb2 100644
--- a/tests/lib/files/view.php
+++ b/tests/lib/files/view.php
@@ -15,7 +15,7 @@ class TemporaryNoTouch extends \OC\Files\Storage\Temporary {
class View extends \PHPUnit_Framework_TestCase {
/**
- * @var \OC\Files\Storage\Storage[] $storages;
+ * @var \OC\Files\Storage\Storage[] $storages
*/
private $storages = array();
@@ -67,6 +67,11 @@ class View extends \PHPUnit_Framework_TestCase {
$this->assertEquals($storageSize * 3, $cachedData['size']);
$this->assertEquals('httpd/unix-directory', $cachedData['mimetype']);
+ // get cached data excluding mount points
+ $cachedData = $rootView->getFileInfo('/', false);
+ $this->assertEquals($storageSize, $cachedData['size']);
+ $this->assertEquals('httpd/unix-directory', $cachedData['mimetype']);
+
$cachedData = $rootView->getFileInfo('/folder');
$this->assertEquals($storageSize + $textSize, $cachedData['size']);
$this->assertEquals('httpd/unix-directory', $cachedData['mimetype']);
@@ -304,6 +309,48 @@ class View extends \PHPUnit_Framework_TestCase {
/**
* @medium
*/
+ function testUnlink() {
+ $storage1 = $this->getTestStorage();
+ $storage2 = $this->getTestStorage();
+ \OC\Files\Filesystem::mount($storage1, array(), '/');
+ \OC\Files\Filesystem::mount($storage2, array(), '/substorage');
+
+ $rootView = new \OC\Files\View('');
+ $rootView->file_put_contents('/foo.txt', 'asd');
+ $rootView->file_put_contents('/substorage/bar.txt', 'asd');
+
+ $this->assertTrue($rootView->file_exists('foo.txt'));
+ $this->assertTrue($rootView->file_exists('substorage/bar.txt'));
+
+ $this->assertTrue($rootView->unlink('foo.txt'));
+ $this->assertTrue($rootView->unlink('substorage/bar.txt'));
+
+ $this->assertFalse($rootView->file_exists('foo.txt'));
+ $this->assertFalse($rootView->file_exists('substorage/bar.txt'));
+ }
+
+ /**
+ * @medium
+ */
+ function testUnlinkRootMustFail() {
+ $storage1 = $this->getTestStorage();
+ $storage2 = $this->getTestStorage();
+ \OC\Files\Filesystem::mount($storage1, array(), '/');
+ \OC\Files\Filesystem::mount($storage2, array(), '/substorage');
+
+ $rootView = new \OC\Files\View('');
+ $rootView->file_put_contents('/foo.txt', 'asd');
+ $rootView->file_put_contents('/substorage/bar.txt', 'asd');
+
+ $this->assertFalse($rootView->unlink(''));
+ $this->assertFalse($rootView->unlink('/'));
+ $this->assertFalse($rootView->unlink('substorage'));
+ $this->assertFalse($rootView->unlink('/substorage'));
+ }
+
+ /**
+ * @medium
+ */
function testTouch() {
$storage = $this->getTestStorage(true, '\Test\Files\TemporaryNoTouch');
@@ -391,4 +438,128 @@ class View extends \PHPUnit_Framework_TestCase {
$this->storages[] = $storage;
return $storage;
}
+
+ private $createHookPath;
+
+ function dummyCreateHook($params) {
+ $this->createHookPath = $params['path'];
+ }
+
+ /**
+ * @medium
+ */
+ function testViewHooksIfRootStartsTheSame() {
+ $storage1 = $this->getTestStorage();
+ $storage2 = $this->getTestStorage();
+ $defaultRoot = \OC\Files\Filesystem::getRoot();
+ \OC\Files\Filesystem::mount($storage1, array(), '/');
+ \OC\Files\Filesystem::mount($storage2, array(), $defaultRoot . '_substorage');
+ \OC_Hook::connect('OC_Filesystem', 'post_write', $this, 'dummyHook');
+
+ $subView = new \OC\Files\View($defaultRoot . '_substorage');
+ $this->hookPath = null;
+
+ $subView->file_put_contents('/foo.txt', 'asd');
+ $this->assertNull($this->hookPath);
+ }
+
+ public function testEditNoCreateHook() {
+ $storage1 = $this->getTestStorage();
+ $storage2 = $this->getTestStorage();
+ $defaultRoot = \OC\Files\Filesystem::getRoot();
+ \OC\Files\Filesystem::mount($storage1, array(), '/');
+ \OC\Files\Filesystem::mount($storage2, array(), $defaultRoot);
+ \OC_Hook::connect('OC_Filesystem', 'post_create', $this, 'dummyCreateHook');
+
+ $view = new \OC\Files\View($defaultRoot);
+ $this->hookPath = null;
+
+ $view->file_put_contents('/asd.txt', 'foo');
+ $this->assertEquals('/asd.txt', $this->createHookPath);
+ $this->createHookPath = null;
+
+ $view->file_put_contents('/asd.txt', 'foo');
+ $this->assertNull($this->createHookPath);
+ }
+
+ /**
+ * @dataProvider resolvePathTestProvider
+ */
+ public function testResolvePath($expected, $pathToTest) {
+ $storage1 = $this->getTestStorage();
+ \OC\Files\Filesystem::mount($storage1, array(), '/');
+
+ $view = new \OC\Files\View('');
+
+ $result = $view->resolvePath($pathToTest);
+ $this->assertEquals($expected, $result[1]);
+
+ $exists = $view->file_exists($pathToTest);
+ $this->assertTrue($exists);
+
+ $exists = $view->file_exists($result[1]);
+ $this->assertTrue($exists);
+ }
+
+ function resolvePathTestProvider() {
+ return array(
+ array('foo.txt', 'foo.txt'),
+ array('foo.txt', '/foo.txt'),
+ array('folder', 'folder'),
+ array('folder', '/folder'),
+ array('folder', 'folder/'),
+ array('folder', '/folder/'),
+ array('folder/bar.txt', 'folder/bar.txt'),
+ array('folder/bar.txt', '/folder/bar.txt'),
+ array('', ''),
+ array('', '/'),
+ );
+ }
+
+ public function testUTF8Names() {
+ $names = array('虚', '和知しゃ和で', 'regular ascii', 'sɨˈrɪlɪk', 'ѨѬ', 'أنا أحب القراءة كثيرا');
+
+ $storage = new \OC\Files\Storage\Temporary(array());
+ \OC\Files\Filesystem::mount($storage, array(), '/');
+
+ $rootView = new \OC\Files\View('');
+ foreach ($names as $name) {
+ $rootView->file_put_contents('/' . $name, 'dummy content');
+ }
+
+ $list = $rootView->getDirectoryContent('/');
+
+ $this->assertCount(count($names), $list);
+ foreach ($list as $item) {
+ $this->assertContains($item['name'], $names);
+ }
+
+ $cache = $storage->getCache();
+ $scanner = $storage->getScanner();
+ $scanner->scan('');
+
+ $list = $cache->getFolderContents('');
+
+ $this->assertCount(count($names), $list);
+ foreach ($list as $item) {
+ $this->assertContains($item['name'], $names);
+ }
+ }
+
+ public function testTouchNotSupported() {
+ $storage = new TemporaryNoTouch(array());
+ $scanner = $storage->getScanner();
+ \OC\Files\Filesystem::mount($storage, array(), '/test/');
+ $past = time() - 100;
+ $storage->file_put_contents('test', 'foobar');
+ $scanner->scan('');
+ $view = new \OC\Files\View('');
+ $info = $view->getFileInfo('/test/test');
+
+ $view->touch('/test/test', $past);
+ $scanner->scanFile('test', \OC\Files\Cache\Scanner::REUSE_ETAG);
+
+ $info2 = $view->getFileInfo('/test/test');
+ $this->assertEquals($info['etag'], $info2['etag']);
+ }
}
diff --git a/tests/lib/group.php b/tests/lib/group.php
index d2c9ce46148..8de8d033e19 100644
--- a/tests/lib/group.php
+++ b/tests/lib/group.php
@@ -109,6 +109,24 @@ class Test_Group extends PHPUnit_Framework_TestCase {
$this->assertEquals(array(), OC_Group::getGroups());
}
+ public function testDisplayNamesInGroup() {
+ OC_Group::useBackend(new OC_Group_Dummy());
+ $userBackend = new \OC_User_Dummy();
+ \OC_User::getManager()->registerBackend($userBackend);
+
+ $group1 = uniqid();
+ $user1 = 'uid1';
+ $user2 = 'uid2';
+ OC_Group::createGroup($group1);
+ $userBackend->createUser($user1, '');
+ $userBackend->createUser($user2, '');
+ OC_Group::addToGroup($user1, $group1);
+ OC_Group::addToGroup($user2, $group1);
+ //Dummy backend does not support setting displaynames, uid will always
+ //be returned. This checks primarily, that the return format is okay.
+ $expected = array($user1 => $user1, $user2 => $user2);
+ $this->assertEquals($expected, OC_Group::displayNamesInGroup($group1));
+ }
public function testUsersInGroup() {
OC_Group::useBackend(new OC_Group_Dummy());
diff --git a/tests/lib/helper.php b/tests/lib/helper.php
index b4d896e5196..4311215795c 100644
--- a/tests/lib/helper.php
+++ b/tests/lib/helper.php
@@ -208,4 +208,39 @@ class Test_Helper extends PHPUnit_Framework_TestCase {
->will($this->returnValue(true)); // filename(1) (2) (3).ext exists
$this->assertEquals('dir/filename(1) (2) (4).ext', OC_Helper::buildNotExistingFileNameForView('dir', 'filename(1) (2) (3).ext', $viewMock));
}
+
+ /**
+ * @dataProvider streamCopyDataProvider
+ */
+ public function testStreamCopy($expectedCount, $expectedResult, $source, $target) {
+
+ if (is_string($source)) {
+ $source = fopen($source, 'r');
+ }
+ if (is_string($target)) {
+ $target = fopen($target, 'w');
+ }
+
+ list($count, $result) = \OC_Helper::streamCopy($source, $target);
+
+ if (is_resource($source)) {
+ fclose($source);
+ }
+ if (is_resource($target)) {
+ fclose($target);
+ }
+
+ $this->assertSame($expectedCount, $count);
+ $this->assertSame($expectedResult, $result);
+ }
+
+
+ function streamCopyDataProvider() {
+ return array(
+ array(0, false, false, false),
+ array(0, false, \OC::$SERVERROOT . '/tests/data/lorem.txt', false),
+ array(filesize(\OC::$SERVERROOT . '/tests/data/lorem.txt'), true, \OC::$SERVERROOT . '/tests/data/lorem.txt', \OC::$SERVERROOT . '/tests/data/lorem-copy.txt'),
+ array(3670, true, \OC::$SERVERROOT . '/tests/data/testimage.png', \OC::$SERVERROOT . '/tests/data/testimage-copy.png'),
+ );
+ }
}
diff --git a/tests/lib/l10n.php b/tests/lib/l10n.php
index 12eac818f84..5ddf2290c35 100644
--- a/tests/lib/l10n.php
+++ b/tests/lib/l10n.php
@@ -64,4 +64,45 @@ class Test_L10n extends PHPUnit_Framework_TestCase {
$l = new OC_L10N('test');
$this->assertSame('February 13, 2009 23:31', $l->l('datetime', 1234567890));
}
+
+ /**
+ * @dataProvider findLanguageData
+ */
+ public function testFindLanguage($default, $preference, $expected) {
+ OC_User::setUserId(null);
+ if (is_null($default)) {
+ OC_Config::deleteKey('default_language');
+ } else {
+ OC_Config::setValue('default_language', $default);
+ }
+ $_SERVER['HTTP_ACCEPT_LANGUAGE'] = $preference;
+
+ $reflection = new \ReflectionClass('OC_L10N');
+ $prop = $reflection->getProperty('language');
+ $prop->setAccessible(1);
+ $prop->setValue('');
+ $prop->setAccessible(0);
+
+ $this->assertSame($expected, OC_L10N::findLanguage());
+ }
+
+ public function findLanguageData() {
+ return array(
+ // Exact match
+ array(null, 'de-DE,en;q=0.5', 'de_DE'),
+ array(null, 'de-DE,en-US;q=0.8,en;q=0.6', 'de_DE'),
+
+ // Best match
+ array(null, 'de-US,en;q=0.5', 'de'),
+ array(null, 'de-US,en-US;q=0.8,en;q=0.6', 'de'),
+
+ // The default_language config setting overrides browser preferences.
+ array('es_AR', 'de-DE,en;q=0.5', 'es_AR'),
+ array('es_AR', 'de-DE,en-US;q=0.8,en;q=0.6', 'es_AR'),
+
+ // Worst case default to english
+ array(null, '', 'en'),
+ array(null, null, 'en'),
+ );
+ }
}
diff --git a/tests/lib/memcache/memcached.php b/tests/lib/memcache/memcached.php
index 4b38ae8ef3c..fdab32693ff 100644
--- a/tests/lib/memcache/memcached.php
+++ b/tests/lib/memcache/memcached.php
@@ -10,11 +10,17 @@
namespace Test\Memcache;
class Memcached extends Cache {
- public function setUp() {
+ static public function setUpBeforeClass() {
if (!\OC\Memcache\Memcached::isAvailable()) {
- $this->markTestSkipped('The memcached extension is not available.');
- return;
+ self::markTestSkipped('The memcached extension is not available.');
+ }
+ $instance = new \OC\Memcache\Memcached(uniqid());
+ if ($instance->set(uniqid(), uniqid()) === false) {
+ self::markTestSkipped('memcached server seems to be down.');
}
+ }
+
+ public function setUp() {
$this->instance = new \OC\Memcache\Memcached(uniqid());
}
}
diff --git a/tests/lib/ocs/privatedata.php b/tests/lib/ocs/privatedata.php
new file mode 100644
index 00000000000..ea8413734f1
--- /dev/null
+++ b/tests/lib/ocs/privatedata.php
@@ -0,0 +1,141 @@
+<?php
+ /**
+ * ownCloud
+ *
+ * @author Thomas Müller
+ * @copyright 2013 Thomas Müller deepdiver@owncloud.com
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library 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 AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+class Test_OC_OCS_Privatedata extends PHPUnit_Framework_TestCase
+{
+
+ private $appKey;
+
+ public function setUp() {
+ \OC::$session->set('user_id', 'user1');
+ $this->appKey = uniqid('app');
+ }
+
+ public function tearDown() {
+ }
+
+ public function testGetEmptyOne() {
+ $params = array('app' => $this->appKey, 'key' => '123');
+ $result = OC_OCS_Privatedata::get($params);
+ $this->assertOcsResult(0, $result);
+ }
+
+ public function testGetEmptyAll() {
+ $params = array('app' => $this->appKey);
+ $result = OC_OCS_Privatedata::get($params);
+ $this->assertOcsResult(0, $result);
+ }
+
+ public function testSetOne() {
+ $_POST = array('value' => 123456789);
+ $params = array('app' => $this->appKey, 'key' => 'k-1');
+ $result = OC_OCS_Privatedata::set($params);
+ $this->assertEquals(100, $result->getStatusCode());
+
+ $result = OC_OCS_Privatedata::get($params);
+ $this->assertOcsResult(1, $result);
+ }
+
+ public function testSetExisting() {
+ $_POST = array('value' => 123456789);
+ $params = array('app' => $this->appKey, 'key' => 'k-10');
+ $result = OC_OCS_Privatedata::set($params);
+ $this->assertEquals(100, $result->getStatusCode());
+
+ $result = OC_OCS_Privatedata::get($params);
+ $this->assertOcsResult(1, $result);
+ $data = $result->getData();
+ $data = $data[0];
+ $this->assertEquals('123456789', $data['value']);
+
+ $_POST = array('value' => 'updated');
+ $params = array('app' => $this->appKey, 'key' => 'k-10');
+ $result = OC_OCS_Privatedata::set($params);
+ $this->assertEquals(100, $result->getStatusCode());
+
+ $result = OC_OCS_Privatedata::get($params);
+ $this->assertOcsResult(1, $result);
+ $data = $result->getData();
+ $data = $data[0];
+ $this->assertEquals('updated', $data['value']);
+ }
+
+ public function testSetMany() {
+ $_POST = array('value' => 123456789);
+
+ // set key 'k-1'
+ $params = array('app' => $this->appKey, 'key' => 'k-1');
+ $result = OC_OCS_Privatedata::set($params);
+ $this->assertEquals(100, $result->getStatusCode());
+
+ // set key 'k-2'
+ $params = array('app' => $this->appKey, 'key' => 'k-2');
+ $result = OC_OCS_Privatedata::set($params);
+ $this->assertEquals(100, $result->getStatusCode());
+
+ // query for all
+ $params = array('app' => $this->appKey);
+ $result = OC_OCS_Privatedata::get($params);
+ $this->assertOcsResult(2, $result);
+ }
+
+ public function testDelete() {
+ $_POST = array('value' => 123456789);
+
+ // set key 'k-1'
+ $params = array('app' => $this->appKey, 'key' => 'k-3');
+ $result = OC_OCS_Privatedata::set($params);
+ $this->assertEquals(100, $result->getStatusCode());
+
+ $result = OC_OCS_Privatedata::delete($params);
+ $this->assertEquals(100, $result->getStatusCode());
+
+ $result = OC_OCS_Privatedata::get($params);
+ $this->assertOcsResult(0, $result);
+ }
+
+ /**
+ * @dataProvider deleteWithEmptyKeysProvider
+ */
+ public function testDeleteWithEmptyKeys($params) {
+ $result = OC_OCS_Privatedata::delete($params);
+ $this->assertEquals(101, $result->getStatusCode());
+ }
+
+ public function deleteWithEmptyKeysProvider() {
+ return array(
+ array(array()),
+ array(array('app' => '123')),
+ array(array('key' => '123')),
+ );
+ }
+
+ /**
+ * @param \OC_OCS_Result $result
+ */
+ public function assertOcsResult($expectedArraySize, $result) {
+ $this->assertEquals(100, $result->getStatusCode());
+ $data = $result->getData();
+ $this->assertTrue(is_array($data));
+ $this->assertEquals($expectedArraySize, sizeof($data));
+ }
+}
diff --git a/tests/lib/preferences.php b/tests/lib/preferences.php
index 68b794e9ea9..a8236909ded 100644
--- a/tests/lib/preferences.php
+++ b/tests/lib/preferences.php
@@ -101,28 +101,28 @@ class Test_Preferences extends PHPUnit_Framework_TestCase {
$this->assertTrue(\OC_Preferences::deleteKey('Deleteuser', 'deleteapp', 'deletekey'));
$query = \OC_DB::prepare('SELECT `configvalue` FROM `*PREFIX*preferences` WHERE `userid` = ? AND `appid` = ? AND `configkey` = ?');
$result = $query->execute(array('Deleteuser', 'deleteapp', 'deletekey'));
- $this->assertEquals(0, $result->numRows());
+ $this->assertEquals(0, count($result->fetchAll()));
}
public function testDeleteApp() {
$this->assertTrue(\OC_Preferences::deleteApp('Deleteuser', 'deleteapp'));
$query = \OC_DB::prepare('SELECT `configvalue` FROM `*PREFIX*preferences` WHERE `userid` = ? AND `appid` = ?');
$result = $query->execute(array('Deleteuser', 'deleteapp'));
- $this->assertEquals(0, $result->numRows());
+ $this->assertEquals(0, count($result->fetchAll()));
}
public function testDeleteUser() {
$this->assertTrue(\OC_Preferences::deleteUser('Deleteuser'));
$query = \OC_DB::prepare('SELECT `configvalue` FROM `*PREFIX*preferences` WHERE `userid` = ?');
$result = $query->execute(array('Deleteuser'));
- $this->assertEquals(0, $result->numRows());
+ $this->assertEquals(0, count($result->fetchAll()));
}
public function testDeleteAppFromAllUsers() {
$this->assertTrue(\OC_Preferences::deleteAppFromAllUsers('someapp'));
$query = \OC_DB::prepare('SELECT `configvalue` FROM `*PREFIX*preferences` WHERE `appid` = ?');
$result = $query->execute(array('someapp'));
- $this->assertEquals(0, $result->numRows());
+ $this->assertEquals(0, count($result->fetchAll()));
}
}
diff --git a/tests/lib/preview.php b/tests/lib/preview.php
index d0cdd2c44fb..353b66fd6d6 100644
--- a/tests/lib/preview.php
+++ b/tests/lib/preview.php
@@ -134,13 +134,11 @@ class Preview extends \PHPUnit_Framework_TestCase {
}
private function initFS() {
- if(\OC\Files\Filesystem::getView()){
- $user = \OC_User::getUser();
- }else{
- $user=uniqid();
- \OC_User::setUserId($user);
- \OC\Files\Filesystem::init($user, '/'.$user.'/files');
- }
+ // create a new user with his own filesystem view
+ // this gets called by each test in this test class
+ $user=uniqid();
+ \OC_User::setUserId($user);
+ \OC\Files\Filesystem::init($user, '/'.$user.'/files');
\OC\Files\Filesystem::mount('OC\Files\Storage\Temporary', array(), '/');
diff --git a/tests/lib/request.php b/tests/lib/request.php
new file mode 100644
index 00000000000..1d77acc70ae
--- /dev/null
+++ b/tests/lib/request.php
@@ -0,0 +1,138 @@
+<?php
+/**
+ * Copyright (c) 2013 Thomas Müller <thomas.mueller@tmit.eu>
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+
+class Test_Request extends PHPUnit_Framework_TestCase {
+
+ public function setUp() {
+ OC_Config::setValue('overwritewebroot', '/domain.tld/ownCloud');
+ }
+
+ public function tearDown() {
+ OC_Config::setValue('overwritewebroot', '');
+ }
+
+ public function testScriptNameOverWrite() {
+ $_SERVER['REMOTE_ADDR'] = '10.0.0.1';
+ $_SERVER["SCRIPT_FILENAME"] = __FILE__;
+
+ $scriptName = OC_Request::scriptName();
+ $this->assertEquals('/domain.tld/ownCloud/tests/lib/request.php', $scriptName);
+ }
+
+ /**
+ * @dataProvider rawPathInfoProvider
+ * @param $expected
+ * @param $requestUri
+ * @param $scriptName
+ */
+ public function testRawPathInfo($expected, $requestUri, $scriptName) {
+ $_SERVER['REQUEST_URI'] = $requestUri;
+ $_SERVER['SCRIPT_NAME'] = $scriptName;
+ $rawPathInfo = OC_Request::getRawPathInfo();
+ $this->assertEquals($expected, $rawPathInfo);
+ }
+
+ function rawPathInfoProvider() {
+ return array(
+ array('/core/ajax/translations.php', 'index.php/core/ajax/translations.php', 'index.php'),
+ array('/core/ajax/translations.php', '/index.php/core/ajax/translations.php', '/index.php'),
+ array('/core/ajax/translations.php', '//index.php/core/ajax/translations.php', '/index.php'),
+ array('', '/oc/core', '/oc/core/index.php'),
+ array('', '/oc/core/', '/oc/core/index.php'),
+ array('', '/oc/core/index.php', '/oc/core/index.php'),
+ array('/core/ajax/translations.php', '/core/ajax/translations.php', 'index.php'),
+ array('/core/ajax/translations.php', '//core/ajax/translations.php', '/index.php'),
+ array('/core/ajax/translations.php', '/oc/core/ajax/translations.php', '/oc/index.php'),
+ array('/1', '/oc/core/1', '/oc/core/index.php'),
+ );
+ }
+
+ /**
+ * @dataProvider rawPathInfoThrowsExceptionProvider
+ * @expectedException Exception
+ *
+ * @param $requestUri
+ * @param $scriptName
+ */
+ public function testRawPathInfoThrowsException($requestUri, $scriptName) {
+ $_SERVER['REQUEST_URI'] = $requestUri;
+ $_SERVER['SCRIPT_NAME'] = $scriptName;
+ OC_Request::getRawPathInfo();
+ }
+
+ function rawPathInfoThrowsExceptionProvider() {
+ return array(
+ array('/oc/core1', '/oc/core/index.php'),
+ );
+ }
+
+ /**
+ * @dataProvider userAgentProvider
+ */
+ public function testUserAgent($testAgent, $userAgent, $matches) {
+ $_SERVER['HTTP_USER_AGENT'] = $testAgent;
+ $this->assertEquals($matches, OC_Request::isUserAgent($userAgent));
+ }
+
+ function userAgentProvider() {
+ return array(
+ array(
+ 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)',
+ OC_Request::USER_AGENT_IE,
+ true
+ ),
+ array(
+ 'Mozilla/5.0 (X11; Linux i686; rv:24.0) Gecko/20100101 Firefox/24.0',
+ OC_Request::USER_AGENT_IE,
+ false
+ ),
+ array(
+ 'Mozilla/5.0 (Linux; Android 4.4; Nexus 4 Build/KRT16S) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.59 Mobile Safari/537.36',
+ OC_Request::USER_AGENT_ANDROID_MOBILE_CHROME,
+ true
+ ),
+ array(
+ 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)',
+ OC_Request::USER_AGENT_ANDROID_MOBILE_CHROME,
+ false
+ ),
+ // test two values
+ array(
+ 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)',
+ array(
+ OC_Request::USER_AGENT_IE,
+ OC_Request::USER_AGENT_ANDROID_MOBILE_CHROME,
+ ),
+ true
+ ),
+ array(
+ 'Mozilla/5.0 (Linux; Android 4.4; Nexus 4 Build/KRT16S) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.59 Mobile Safari/537.36',
+ array(
+ OC_Request::USER_AGENT_IE,
+ OC_Request::USER_AGENT_ANDROID_MOBILE_CHROME,
+ ),
+ true
+ ),
+ array(
+ 'Mozilla/5.0 (X11; Linux i686; rv:24.0) Gecko/20100101 Firefox/24.0',
+ OC_Request::USER_AGENT_FREEBOX,
+ false
+ ),
+ array(
+ 'Mozilla/5.0',
+ OC_Request::USER_AGENT_FREEBOX,
+ true
+ ),
+ array(
+ 'Fake Mozilla/5.0',
+ OC_Request::USER_AGENT_FREEBOX,
+ false
+ ),
+ );
+ }
+}
diff --git a/tests/lib/share/share.php b/tests/lib/share/share.php
index 8e9eef65d32..d6acee6c924 100644
--- a/tests/lib/share/share.php
+++ b/tests/lib/share/share.php
@@ -25,6 +25,8 @@ class Test_Share extends PHPUnit_Framework_TestCase {
protected $userBackend;
protected $user1;
protected $user2;
+ protected $user3;
+ protected $user4;
protected $groupBackend;
protected $group1;
protected $group2;
@@ -135,20 +137,40 @@ class Test_Share extends PHPUnit_Framework_TestCase {
OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_USER, $this->user2, OCP\PERMISSION_READ),
'Failed asserting that user 1 successfully shared text.txt with user 2.'
);
- $this->assertEquals(
- array('test.txt'),
+ $this->assertContains(
+ 'test.txt',
OCP\Share::getItemShared('test', 'test.txt', Test_Share_Backend::FORMAT_SOURCE),
'Failed asserting that test.txt is a shared file of user 1.'
);
OC_User::setUserId($this->user2);
- $this->assertEquals(
- array('test.txt'),
+ $this->assertContains(
+ 'test.txt',
OCP\Share::getItemSharedWith('test', 'test.txt', Test_Share_Backend::FORMAT_SOURCE),
'Failed asserting that user 2 has access to test.txt after initial sharing.'
);
}
+ protected function shareUserTestFileWithUser($sharer, $receiver) {
+ OC_User::setUserId($sharer);
+ $this->assertTrue(
+ OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_USER, $receiver, OCP\PERMISSION_READ | OCP\PERMISSION_SHARE),
+ 'Failed asserting that ' . $sharer . ' successfully shared text.txt with ' . $receiver . '.'
+ );
+ $this->assertContains(
+ 'test.txt',
+ OCP\Share::getItemShared('test', 'test.txt', Test_Share_Backend::FORMAT_SOURCE),
+ 'Failed asserting that test.txt is a shared file of ' . $sharer . '.'
+ );
+
+ OC_User::setUserId($receiver);
+ $this->assertContains(
+ 'test.txt',
+ OCP\Share::getItemSharedWith('test', 'test.txt', Test_Share_Backend::FORMAT_SOURCE),
+ 'Failed asserting that ' . $receiver . ' has access to test.txt after initial sharing.'
+ );
+ }
+
public function testShareWithUser() {
// Invalid shares
$message = 'Sharing test.txt failed, because the user '.$this->user1.' is the item owner';
@@ -328,22 +350,22 @@ class Test_Share extends PHPUnit_Framework_TestCase {
OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_GROUP, $this->group1, OCP\PERMISSION_READ),
'Failed asserting that user 1 successfully shared text.txt with group 1.'
);
- $this->assertEquals(
- array('test.txt'),
+ $this->assertContains(
+ 'test.txt',
OCP\Share::getItemShared('test', 'test.txt', Test_Share_Backend::FORMAT_SOURCE),
'Failed asserting that test.txt is a shared file of user 1.'
);
OC_User::setUserId($this->user2);
- $this->assertEquals(
- array('test.txt'),
+ $this->assertContains(
+ 'test.txt',
OCP\Share::getItemSharedWith('test', 'test.txt', Test_Share_Backend::FORMAT_SOURCE),
'Failed asserting that user 2 has access to test.txt after initial sharing.'
);
OC_User::setUserId($this->user3);
- $this->assertEquals(
- array('test.txt'),
+ $this->assertContains(
+ 'test.txt',
OCP\Share::getItemSharedWith('test', 'test.txt', Test_Share_Backend::FORMAT_SOURCE),
'Failed asserting that user 3 has access to test.txt after initial sharing.'
);
@@ -583,4 +605,97 @@ class Test_Share extends PHPUnit_Framework_TestCase {
'Failed asserting that an expired share could not be found.'
);
}
+
+ public function testUnshareAll() {
+ $this->shareUserTestFileWithUser($this->user1, $this->user2);
+ $this->shareUserTestFileWithUser($this->user2, $this->user3);
+ $this->shareUserTestFileWithUser($this->user3, $this->user4);
+ $this->shareUserOneTestFileWithGroupOne();
+
+ OC_User::setUserId($this->user1);
+ $this->assertEquals(
+ array('test.txt', 'test.txt'),
+ OCP\Share::getItemsShared('test', 'test.txt'),
+ 'Failed asserting that the test.txt file is shared exactly two times by user1.'
+ );
+
+ OC_User::setUserId($this->user2);
+ $this->assertEquals(
+ array('test.txt'),
+ OCP\Share::getItemsShared('test', 'test.txt'),
+ 'Failed asserting that the test.txt file is shared exactly once by user2.'
+ );
+
+ OC_User::setUserId($this->user3);
+ $this->assertEquals(
+ array('test.txt'),
+ OCP\Share::getItemsShared('test', 'test.txt'),
+ 'Failed asserting that the test.txt file is shared exactly once by user3.'
+ );
+
+ $this->assertTrue(
+ OCP\Share::unshareAll('test', 'test.txt'),
+ 'Failed asserting that user 3 successfully unshared all shares of the test.txt share.'
+ );
+
+ $this->assertEquals(
+ array(),
+ OCP\Share::getItemsShared('test'),
+ 'Failed asserting that the share of the test.txt file by user 3 has been removed.'
+ );
+
+ OC_User::setUserId($this->user1);
+ $this->assertEquals(
+ array(),
+ OCP\Share::getItemsShared('test'),
+ 'Failed asserting that both shares of the test.txt file by user 1 have been removed.'
+ );
+
+ OC_User::setUserId($this->user2);
+ $this->assertEquals(
+ array(),
+ OCP\Share::getItemsShared('test'),
+ 'Failed asserting that the share of the test.txt file by user 2 has been removed.'
+ );
+ }
+
+ /**
+ * @dataProvider checkPasswordProtectedShareDataProvider
+ * @param $expected
+ * @param $item
+ */
+ public function testCheckPasswordProtectedShare($expected, $item) {
+ \OC::$session->set('public_link_authenticated', 100);
+ $result = \OCP\Share::checkPasswordProtectedShare($item);
+ $this->assertEquals($expected, $result);
+ }
+
+ function checkPasswordProtectedShareDataProvider() {
+ return array(
+ array(true, array()),
+ array(true, array('share_with' => null)),
+ array(true, array('share_with' => '')),
+ array(true, array('share_with' => '1234567890', 'share_type' => '1')),
+ array(true, array('share_with' => '1234567890', 'share_type' => 1)),
+ array(true, array('share_with' => '1234567890', 'share_type' => '3', 'id' => 100)),
+ array(true, array('share_with' => '1234567890', 'share_type' => 3, 'id' => 100)),
+ array(false, array('share_with' => '1234567890', 'share_type' => '3', 'id' => 101)),
+ array(false, array('share_with' => '1234567890', 'share_type' => 3, 'id' => 101)),
+ );
+
+ /*
+ if (!isset($linkItem['share_with'])) {
+ return true;
+ }
+
+ if ($linkItem['share_type'] != \OCP\Share::SHARE_TYPE_LINK) {
+ return true;
+ }
+
+ if ( \OC::$session->exists('public_link_authenticated')
+ && \OC::$session->get('public_link_authenticated') === $linkItem['id'] ) {
+ return true;
+ }
+ * */
+ }
}
diff --git a/tests/lib/template.php b/tests/lib/template.php
index fd12119da58..b4f1a4c4053 100644
--- a/tests/lib/template.php
+++ b/tests/lib/template.php
@@ -46,7 +46,6 @@ class Test_TemplateFunctions extends PHPUnit_Framework_TestCase {
$this->assertEquals("This is a good string!", $result);
}
-
public function testPrintUnescaped() {
$htmlString = "<script>alert('xss');</script>";
@@ -66,5 +65,194 @@ class Test_TemplateFunctions extends PHPUnit_Framework_TestCase {
$this->assertEquals("This is a good string!", $result);
}
+ // ---------------------------------------------------------------------------
+ // Test relative_modified_date with dates only
+ // ---------------------------------------------------------------------------
+ public function testRelativeDateToday(){
+ $currentTime = 1380703592;
+ $elementTime = $currentTime;
+ $result = (string)relative_modified_date($elementTime, $currentTime, true);
+
+ $this->assertEquals('today', $result);
+
+ // 2 hours ago is still today
+ $elementTime = $currentTime - 2 * 3600;
+ $result = (string)relative_modified_date($elementTime, $currentTime, true);
+
+ $this->assertEquals('today', $result);
+ }
+
+ public function testRelativeDateYesterday(){
+ $currentTime = 1380703592;
+ $elementTime = $currentTime - 24 * 3600;
+ $result = (string)relative_modified_date($elementTime, $currentTime, true);
+
+ $this->assertEquals('yesterday', $result);
+
+ // yesterday - 2 hours is still yesterday
+ $elementTime = $currentTime - 26 * 3600;
+ $result = (string)relative_modified_date($elementTime, $currentTime, true);
+
+ $this->assertEquals('yesterday', $result);
+ }
+
+ public function testRelativeDate2DaysAgo(){
+ $currentTime = 1380703592;
+ $elementTime = $currentTime - 48 * 3600;
+ $result = (string)relative_modified_date($elementTime, $currentTime, true);
+
+ $this->assertEquals('2 days ago', $result);
+
+ // 2 days ago minus 4 hours is still 2 days ago
+ $elementTime = $currentTime - 52 * 3600;
+ $result = (string)relative_modified_date($elementTime, $currentTime, true);
+
+ $this->assertEquals('2 days ago', $result);
+ }
+
+ public function testRelativeDateLastMonth(){
+ $currentTime = 1380703592;
+ $elementTime = $currentTime - 86400 * 31;
+ $result = (string)relative_modified_date($elementTime, $currentTime, true);
+
+ $this->assertEquals('last month', $result);
+
+ $elementTime = $currentTime - 86400 * 35;
+ $result = (string)relative_modified_date($elementTime, $currentTime, true);
+
+ $this->assertEquals('last month', $result);
+ }
+
+ public function testRelativeDateMonthsAgo(){
+ $currentTime = 1380703592;
+ $elementTime = $currentTime - 86400 * 60;
+ $result = (string)relative_modified_date($elementTime, $currentTime, true);
+
+ $this->assertEquals('2 months ago', $result);
+
+ $elementTime = $currentTime - 86400 * 65;
+ $result = (string)relative_modified_date($elementTime, $currentTime, true);
+
+ $this->assertEquals('2 months ago', $result);
+ }
+
+ public function testRelativeDateLastYear(){
+ $currentTime = 1380703592;
+ $elementTime = $currentTime - 86400 * 365;
+ $result = (string)relative_modified_date($elementTime, $currentTime, true);
+
+ $this->assertEquals('last year', $result);
+
+ $elementTime = $currentTime - 86400 * 450;
+ $result = (string)relative_modified_date($elementTime, $currentTime, true);
+
+ $this->assertEquals('last year', $result);
+ }
+
+ public function testRelativeDateYearsAgo(){
+ $currentTime = 1380703592;
+ $elementTime = $currentTime - 86400 * 365.25 * 2;
+ $result = (string)relative_modified_date($elementTime, $currentTime, true);
+
+ $this->assertEquals('years ago', $result);
+
+ $elementTime = $currentTime - 86400 * 365.25 * 3;
+ $result = (string)relative_modified_date($elementTime, $currentTime, true);
+
+ $this->assertEquals('years ago', $result);
+ }
+ // ---------------------------------------------------------------------------
+ // Test relative_modified_date with timestamps only (date + time value)
+ // ---------------------------------------------------------------------------
+
+ public function testRelativeTimeSecondsAgo(){
+ $currentTime = 1380703592;
+ $elementTime = $currentTime - 5;
+ $result = (string)relative_modified_date($elementTime, $currentTime, false);
+
+ $this->assertEquals('seconds ago', $result);
+ }
+
+ public function testRelativeTimeMinutesAgo(){
+ $currentTime = 1380703592;
+ $elementTime = $currentTime - 190;
+ $result = (string)relative_modified_date($elementTime, $currentTime, false);
+
+ $this->assertEquals('3 minutes ago', $result);
+ }
+
+ public function testRelativeTimeHoursAgo(){
+ $currentTime = 1380703592;
+ $elementTime = $currentTime - 7500;
+ $result = (string)relative_modified_date($elementTime, $currentTime, false);
+
+ $this->assertEquals('2 hours ago', $result);
+ }
+
+ public function testRelativeTime2DaysAgo(){
+ $currentTime = 1380703592;
+ $elementTime = $currentTime - 48 * 3600;
+ $result = (string)relative_modified_date($elementTime, $currentTime, false);
+
+ $this->assertEquals('2 days ago', $result);
+
+ // 2 days ago minus 4 hours is still 2 days ago
+ $elementTime = $currentTime - 52 * 3600;
+ $result = (string)relative_modified_date($elementTime, $currentTime, false);
+
+ $this->assertEquals('2 days ago', $result);
+ }
+
+ public function testRelativeTimeLastMonth(){
+ $currentTime = 1380703592;
+ $elementTime = $currentTime - 86400 * 31;
+ $result = (string)relative_modified_date($elementTime, $currentTime, false);
+
+ $this->assertEquals('last month', $result);
+
+ $elementTime = $currentTime - 86400 * 35;
+ $result = (string)relative_modified_date($elementTime, $currentTime, false);
+
+ $this->assertEquals('last month', $result);
+ }
+
+ public function testRelativeTimeMonthsAgo(){
+ $currentTime = 1380703592;
+ $elementTime = $currentTime - 86400 * 60;
+ $result = (string)relative_modified_date($elementTime, $currentTime, false);
+
+ $this->assertEquals('2 months ago', $result);
+
+ $elementTime = $currentTime - 86400 * 65;
+ $result = (string)relative_modified_date($elementTime, $currentTime, false);
+
+ $this->assertEquals('2 months ago', $result);
+ }
+
+ public function testRelativeTimeLastYear(){
+ $currentTime = 1380703592;
+ $elementTime = $currentTime - 86400 * 365;
+ $result = (string)relative_modified_date($elementTime, $currentTime, false);
+
+ $this->assertEquals('last year', $result);
+
+ $elementTime = $currentTime - 86400 * 450;
+ $result = (string)relative_modified_date($elementTime, $currentTime, false);
+
+ $this->assertEquals('last year', $result);
+ }
+
+ public function testRelativeTimeYearsAgo(){
+ $currentTime = 1380703592;
+ $elementTime = $currentTime - 86400 * 365.25 * 2;
+ $result = (string)relative_modified_date($elementTime, $currentTime, false);
+
+ $this->assertEquals('years ago', $result);
+
+ $elementTime = $currentTime - 86400 * 365.25 * 3;
+ $result = (string)relative_modified_date($elementTime, $currentTime, false);
+
+ $this->assertEquals('years ago', $result);
+ }
}
diff --git a/tests/lib/user.php b/tests/lib/user.php
index 66c7f3f0d74..fdf9e7a08e0 100644
--- a/tests/lib/user.php
+++ b/tests/lib/user.php
@@ -12,18 +12,26 @@ namespace Test;
use OC\Hooks\PublicEmitter;
class User extends \PHPUnit_Framework_TestCase {
-
+ /**
+ * @var \OC_User_Backend | \PHPUnit_Framework_MockObject_MockObject $backend
+ */
+ private $backend;
+
+ protected function setUp(){
+ $this->backend = $this->getMock('\OC_User_Dummy');
+ $manager = \OC_User::getManager();
+ $manager->registerBackend($this->backend);
+ }
+
public function testCheckPassword() {
- /**
- * @var \OC_User_Backend | \PHPUnit_Framework_MockObject_MockObject $backend
- */
- $backend = $this->getMock('\OC_User_Dummy');
- $backend->expects($this->once())
+
+ $this->backend->expects($this->once())
->method('checkPassword')
->with($this->equalTo('foo'), $this->equalTo('bar'))
- ->will($this->returnValue('foo'));
+ ->will($this->returnValue('foo'))
+ ;
- $backend->expects($this->any())
+ $this->backend->expects($this->any())
->method('implementsActions')
->will($this->returnCallback(function ($actions) {
if ($actions === \OC_USER_BACKEND_CHECK_PASSWORD) {
@@ -33,11 +41,33 @@ class User extends \PHPUnit_Framework_TestCase {
}
}));
- $manager = \OC_User::getManager();
- $manager->registerBackend($backend);
-
$uid = \OC_User::checkPassword('foo', 'bar');
$this->assertEquals($uid, 'foo');
}
+
+ public function testDeleteUser() {
+ $fail = \OC_User::deleteUser('victim');
+ $this->assertFalse($fail);
+
+ $success = \OC_User::createUser('victim', 'password');
+
+ $success = \OC_User::deleteUser('victim');
+ $this->assertTrue($success);
+ }
+
+ public function testCreateUser(){
+ $this->backend->expects($this->any())
+ ->method('implementsActions')
+ ->will($this->returnCallback(function ($actions) {
+ if ($actions === \OC_USER_BACKEND_CREATE_USER) {
+ return true;
+ } else {
+ return false;
+ }
+ }));
+
+ $user = \OC_User::createUser('newuser', 'newpassword');
+ $this->assertEquals('newuser', $user->getUid());
+ }
} \ No newline at end of file
diff --git a/tests/lib/user/avataruserdummy.php b/tests/lib/user/avataruserdummy.php
new file mode 100644
index 00000000000..738b10492ea
--- /dev/null
+++ b/tests/lib/user/avataruserdummy.php
@@ -0,0 +1,27 @@
+<?php
+/**
+* ownCloud
+*
+* @author Arthur Schiwon
+* @copyright 2013 Arthur Schiwon blizzz@owncloud.com
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+* License as published by the Free Software Foundation; either
+* version 3 of the License, or any later version.
+*
+* This library 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 AFFERO GENERAL PUBLIC LICENSE for more details.
+*
+* You should have received a copy of the GNU Affero General Public
+* License along with this library. If not, see <http://www.gnu.org/licenses/>.
+*
+*/
+
+class Avatar_User_Dummy extends \OC_User_Dummy {
+ public function canChangeAvatar($uid) {
+ return true;
+ }
+} \ No newline at end of file
diff --git a/tests/lib/user/backend.php b/tests/lib/user/backend.php
index 40674424c96..1384c54a921 100644
--- a/tests/lib/user/backend.php
+++ b/tests/lib/user/backend.php
@@ -39,7 +39,7 @@ abstract class Test_User_Backend extends PHPUnit_Framework_TestCase {
/**
* get a new unique user name
* test cases can override this in order to clean up created user
- * @return array
+ * @return string
*/
public function getUser() {
return uniqid('test_');
@@ -82,8 +82,8 @@ abstract class Test_User_Backend extends PHPUnit_Framework_TestCase {
$this->assertTrue($this->backend->userExists($name1));
$this->assertTrue($this->backend->userExists($name2));
- $this->assertTrue($this->backend->checkPassword($name1, 'pass1'));
- $this->assertTrue($this->backend->checkPassword($name2, 'pass2'));
+ $this->assertSame($name1, $this->backend->checkPassword($name1, 'pass1'));
+ $this->assertSame($name2, $this->backend->checkPassword($name2, 'pass2'));
$this->assertFalse($this->backend->checkPassword($name1, 'pass2'));
$this->assertFalse($this->backend->checkPassword($name2, 'pass1'));
@@ -93,7 +93,7 @@ abstract class Test_User_Backend extends PHPUnit_Framework_TestCase {
$this->backend->setPassword($name1, 'newpass1');
$this->assertFalse($this->backend->checkPassword($name1, 'pass1'));
- $this->assertTrue($this->backend->checkPassword($name1, 'newpass1'));
+ $this->assertSame($name1, $this->backend->checkPassword($name1, 'newpass1'));
$this->assertFalse($this->backend->checkPassword($name2, 'newpass1'));
}
}
diff --git a/tests/lib/user/database.php b/tests/lib/user/database.php
index fe7d87c44de..d7cc39ae387 100644
--- a/tests/lib/user/database.php
+++ b/tests/lib/user/database.php
@@ -21,19 +21,14 @@
*/
class Test_User_Database extends Test_User_Backend {
- /**
- * get a new unique user name
- * test cases can override this in order to clean up created user
- * @return array
- */
public function getUser() {
- $user=uniqid('test_');
+ $user = parent::getUser();
$this->users[]=$user;
return $user;
}
public function setUp() {
- $this->backend=new OC_User_Dummy();
+ $this->backend=new OC_User_Database();
}
public function tearDown() {
diff --git a/tests/lib/user/manager.php b/tests/lib/user/manager.php
index 00901dd4115..ad1ac9e12f2 100644
--- a/tests/lib/user/manager.php
+++ b/tests/lib/user/manager.php
@@ -346,4 +346,76 @@ class Manager extends \PHPUnit_Framework_TestCase {
$manager->createUser('foo', 'bar');
}
+
+ public function testCountUsersNoBackend() {
+ $manager = new \OC\User\Manager();
+
+ $result = $manager->countUsers();
+ $this->assertTrue(is_array($result));
+ $this->assertTrue(empty($result));
+ }
+
+ public function testCountUsersOneBackend() {
+ /**
+ * @var \OC_User_Dummy | \PHPUnit_Framework_MockObject_MockObject $backend
+ */
+ $backend = $this->getMock('\OC_User_Dummy');
+ $backend->expects($this->once())
+ ->method('countUsers')
+ ->will($this->returnValue(7));
+
+ $backend->expects($this->once())
+ ->method('implementsActions')
+ ->with(\OC_USER_BACKEND_COUNT_USERS)
+ ->will($this->returnValue(true));
+
+ $manager = new \OC\User\Manager();
+ $manager->registerBackend($backend);
+
+ $result = $manager->countUsers();
+ $keys = array_keys($result);
+ $this->assertTrue(strpos($keys[0], 'Mock_OC_User_Dummy') !== false);
+
+ $users = array_shift($result);
+ $this->assertEquals(7, $users);
+ }
+
+ public function testCountUsersTwoBackends() {
+ /**
+ * @var \OC_User_Dummy | \PHPUnit_Framework_MockObject_MockObject $backend
+ */
+ $backend1 = $this->getMock('\OC_User_Dummy');
+ $backend1->expects($this->once())
+ ->method('countUsers')
+ ->will($this->returnValue(7));
+
+ $backend1->expects($this->once())
+ ->method('implementsActions')
+ ->with(\OC_USER_BACKEND_COUNT_USERS)
+ ->will($this->returnValue(true));
+
+ $backend2 = $this->getMock('\OC_User_Dummy');
+ $backend2->expects($this->once())
+ ->method('countUsers')
+ ->will($this->returnValue(16));
+
+ $backend2->expects($this->once())
+ ->method('implementsActions')
+ ->with(\OC_USER_BACKEND_COUNT_USERS)
+ ->will($this->returnValue(true));
+
+ $manager = new \OC\User\Manager();
+ $manager->registerBackend($backend1);
+ $manager->registerBackend($backend2);
+
+ $result = $manager->countUsers();
+ //because the backends have the same class name, only one value expected
+ $this->assertEquals(1, count($result));
+ $keys = array_keys($result);
+ $this->assertTrue(strpos($keys[0], 'Mock_OC_User_Dummy') !== false);
+
+ $users = array_shift($result);
+ //users from backends shall be summed up
+ $this->assertEquals(7+16, $users);
+ }
}
diff --git a/tests/lib/user/session.php b/tests/lib/user/session.php
index e457a7bda30..46b268b3624 100644
--- a/tests/lib/user/session.php
+++ b/tests/lib/user/session.php
@@ -52,9 +52,20 @@ class Session extends \PHPUnit_Framework_TestCase {
public function testLoginValidPasswordEnabled() {
$session = $this->getMock('\OC\Session\Memory', array(), array(''));
- $session->expects($this->once())
+ $session->expects($this->exactly(2))
->method('set')
- ->with('user_id', 'foo');
+ ->with($this->callback(function($key) {
+ switch($key) {
+ case 'user_id':
+ case 'loginname':
+ return true;
+ break;
+ default:
+ return false;
+ break;
+ }
+ },
+ 'foo'));
$manager = $this->getMock('\OC\User\Manager');
diff --git a/tests/lib/user/user.php b/tests/lib/user/user.php
index de5ccbf38c1..3f90432c6b0 100644
--- a/tests/lib/user/user.php
+++ b/tests/lib/user/user.php
@@ -9,6 +9,7 @@
namespace Test\User;
+use OC\AllConfig;
use OC\Hooks\PublicEmitter;
class User extends \PHPUnit_Framework_TestCase {
@@ -87,6 +88,75 @@ class User extends \PHPUnit_Framework_TestCase {
$this->assertFalse($user->setPassword('bar',''));
}
+ public function testChangeAvatarSupportedYes() {
+ /**
+ * @var \OC_User_Backend | \PHPUnit_Framework_MockObject_MockObject $backend
+ */
+ require_once 'avataruserdummy.php';
+ $backend = $this->getMock('Avatar_User_Dummy');
+ $backend->expects($this->once())
+ ->method('canChangeAvatar')
+ ->with($this->equalTo('foo'))
+ ->will($this->returnValue(true));
+
+ $backend->expects($this->any())
+ ->method('implementsActions')
+ ->will($this->returnCallback(function ($actions) {
+ if ($actions === \OC_USER_BACKEND_PROVIDE_AVATAR) {
+ return true;
+ } else {
+ return false;
+ }
+ }));
+
+ $user = new \OC\User\User('foo', $backend);
+ $this->assertTrue($user->canChangeAvatar());
+ }
+
+ public function testChangeAvatarSupportedNo() {
+ /**
+ * @var \OC_User_Backend | \PHPUnit_Framework_MockObject_MockObject $backend
+ */
+ require_once 'avataruserdummy.php';
+ $backend = $this->getMock('Avatar_User_Dummy');
+ $backend->expects($this->once())
+ ->method('canChangeAvatar')
+ ->with($this->equalTo('foo'))
+ ->will($this->returnValue(false));
+
+ $backend->expects($this->any())
+ ->method('implementsActions')
+ ->will($this->returnCallback(function ($actions) {
+ if ($actions === \OC_USER_BACKEND_PROVIDE_AVATAR) {
+ return true;
+ } else {
+ return false;
+ }
+ }));
+
+ $user = new \OC\User\User('foo', $backend);
+ $this->assertFalse($user->canChangeAvatar());
+ }
+
+ public function testChangeAvatarNotSupported() {
+ /**
+ * @var \OC_User_Backend | \PHPUnit_Framework_MockObject_MockObject $backend
+ */
+ require_once 'avataruserdummy.php';
+ $backend = $this->getMock('Avatar_User_Dummy');
+ $backend->expects($this->never())
+ ->method('canChangeAvatar');
+
+ $backend->expects($this->any())
+ ->method('implementsActions')
+ ->will($this->returnCallback(function ($actions) {
+ return false;
+ }));
+
+ $user = new \OC\User\User('foo', $backend);
+ $this->assertTrue($user->canChangeAvatar());
+ }
+
public function testDelete() {
/**
* @var \OC_User_Backend | \PHPUnit_Framework_MockObject_MockObject $backend
@@ -136,7 +206,9 @@ class User extends \PHPUnit_Framework_TestCase {
->method('implementsActions')
->will($this->returnValue(false));
- $user = new \OC\User\User('foo', $backend);
+ $allConfig = new AllConfig();
+
+ $user = new \OC\User\User('foo', $backend, null, $allConfig);
$this->assertEquals(\OC_Config::getValue("datadirectory", \OC::$SERVERROOT . "/data") . '/foo', $user->getHome());
}
diff --git a/tests/lib/util.php b/tests/lib/util.php
index d607a3e7725..bfe68f5f680 100644
--- a/tests/lib/util.php
+++ b/tests/lib/util.php
@@ -88,12 +88,70 @@ class Test_Util extends PHPUnit_Framework_TestCase {
OC_Config::deleteKey('mail_domain');
}
+ function testGetConfiguredEmailAddressFromConfig() {
+ OC_Config::setValue('mail_domain', 'example.com');
+ OC_Config::setValue('mail_from_address', 'owncloud');
+ $email = \OCP\Util::getDefaultEmailAddress("no-reply");
+ $this->assertEquals('owncloud@example.com', $email);
+ OC_Config::deleteKey('mail_domain');
+ OC_Config::deleteKey('mail_from_address');
+ }
+
function testGetInstanceIdGeneratesValidId() {
OC_Config::deleteKey('instanceid');
$this->assertStringStartsWith('oc', OC_Util::getInstanceId());
}
/**
+ * Tests that the home storage is not wrapped when no quota exists.
+ */
+ function testHomeStorageWrapperWithoutQuota() {
+ $user1 = uniqid();
+ \OC_User::createUser($user1, 'test');
+ OC_Preferences::setValue($user1, 'files', 'quota', 'none');
+ \OC_User::setUserId($user1);
+
+ \OC_Util::setupFS($user1);
+
+ $userMount = \OC\Files\Filesystem::getMountManager()->find('/' . $user1 . '/');
+ $this->assertNotNull($userMount);
+ $this->assertNotInstanceOf('\OC\Files\Storage\Wrapper\Quota', $userMount->getStorage());
+
+ // clean up
+ \OC_User::setUserId('');
+ \OC_User::deleteUser($user1);
+ OC_Preferences::deleteUser($user1);
+ \OC_Util::tearDownFS();
+ }
+
+ /**
+ * Tests that the home storage is not wrapped when no quota exists.
+ */
+ function testHomeStorageWrapperWithQuota() {
+ $user1 = uniqid();
+ \OC_User::createUser($user1, 'test');
+ OC_Preferences::setValue($user1, 'files', 'quota', '1024');
+ \OC_User::setUserId($user1);
+
+ \OC_Util::setupFS($user1);
+
+ $userMount = \OC\Files\Filesystem::getMountManager()->find('/' . $user1 . '/');
+ $this->assertNotNull($userMount);
+ $this->assertInstanceOf('\OC\Files\Storage\Wrapper\Quota', $userMount->getStorage());
+
+ // ensure that root wasn't wrapped
+ $rootMount = \OC\Files\Filesystem::getMountManager()->find('/');
+ $this->assertNotNull($rootMount);
+ $this->assertNotInstanceOf('\OC\Files\Storage\Wrapper\Quota', $rootMount->getStorage());
+
+ // clean up
+ \OC_User::setUserId('');
+ \OC_User::deleteUser($user1);
+ OC_Preferences::deleteUser($user1);
+ \OC_Util::tearDownFS();
+ }
+
+ /**
* @dataProvider baseNameProvider
*/
public function testBaseName($expected, $file)
diff --git a/tests/phpunit-autotest.xml b/tests/phpunit-autotest.xml
index a893e96ad97..1a2ab35491b 100644
--- a/tests/phpunit-autotest.xml
+++ b/tests/phpunit-autotest.xml
@@ -35,5 +35,12 @@
</exclude>
</whitelist>
</filter>
+ <listeners>
+ <listener class="TestCleanupListener" file="testcleanuplistener.php">
+ <arguments>
+ <string>detail</string>
+ </arguments>
+ </listener>
+ </listeners>
</phpunit>
diff --git a/tests/preseed-config.php b/tests/preseed-config.php
index 9791e713dac..95ffb4514bf 100644
--- a/tests/preseed-config.php
+++ b/tests/preseed-config.php
@@ -16,4 +16,9 @@ $CONFIG = array (
'writable' => false,
)
),
+
);
+
+if(substr(strtolower(PHP_OS), 0, 3) == "win") {
+ $CONFIG['openssl'] = array( 'config' => OC::$SERVERROOT.'/tests/data/openssl.cnf');
+}
diff --git a/tests/testcleanuplistener.php b/tests/testcleanuplistener.php
new file mode 100644
index 00000000000..a969ece6dd5
--- /dev/null
+++ b/tests/testcleanuplistener.php
@@ -0,0 +1,139 @@
+<?php
+/**
+ * Copyright (c) 2013 Vincent Petry <pvince81@owncloud.com>
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+
+/**
+ * Detects tests that didn't clean up properly, show a warning, then clean up after them.
+ */
+class TestCleanupListener implements PHPUnit_Framework_TestListener {
+ private $verbosity;
+
+ public function __construct($verbosity = 'verbose') {
+ $this->verbosity = $verbosity;
+ }
+
+ public function addError(PHPUnit_Framework_Test $test, Exception $e, $time) {
+ }
+
+ public function addFailure(PHPUnit_Framework_Test $test, PHPUnit_Framework_AssertionFailedError $e, $time) {
+ }
+
+ public function addIncompleteTest(PHPUnit_Framework_Test $test, Exception $e, $time) {
+ }
+
+ public function addSkippedTest(PHPUnit_Framework_Test $test, Exception $e, $time) {
+ }
+
+ public function startTest(PHPUnit_Framework_Test $test) {
+ }
+
+ public function endTest(PHPUnit_Framework_Test $test, $time) {
+ }
+
+ public function startTestSuite(PHPUnit_Framework_TestSuite $suite) {
+ }
+
+ public function endTestSuite(PHPUnit_Framework_TestSuite $suite) {
+ if ($this->cleanStrayDataFiles() && $this->isShowSuiteWarning()) {
+ printf("TestSuite '%s': Did not clean up data dir\n", $suite->getName());
+ }
+ if ($this->cleanStrayHooks() && $this->isShowSuiteWarning()) {
+ printf("TestSuite '%s': Did not clean up hooks\n", $suite->getName());
+ }
+ if ($this->cleanProxies() && $this->isShowSuiteWarning()) {
+ printf("TestSuite '%s': Did not clean up proxies\n", $suite->getName());
+ }
+ }
+
+ private function isShowSuiteWarning() {
+ return $this->verbosity === 'suite' || $this->verbosity === 'detail';
+ }
+
+ private function isShowDetail() {
+ return $this->verbosity === 'detail';
+ }
+
+ private function unlinkDir($dir) {
+ if ($dh = @opendir($dir)) {
+ while (($file = readdir($dh)) !== false) {
+ if ($file === '..' || $file === '.') {
+ continue;
+ }
+ $path = $dir . '/' . $file;
+ if (is_dir($path)) {
+ $this->unlinkDir($path);
+ }
+ else {
+ @unlink($path);
+ }
+ }
+ closedir($dh);
+ }
+ @rmdir($dir);
+ }
+
+ private function cleanStrayDataFiles() {
+ $knownEntries = array(
+ 'owncloud.log' => true,
+ 'owncloud.db' => true,
+ '..' => true,
+ '.' => true
+ );
+ $datadir = \OC_Config::getValue('datadirectory', \OC::$SERVERROOT . '/data');
+ $entries = array();
+ if ($dh = opendir($datadir)) {
+ while (($file = readdir($dh)) !== false) {
+ if (!isset($knownEntries[$file])) {
+ $entries[] = $file;
+ }
+ }
+ closedir($dh);
+ }
+
+ if (count($entries) > 0) {
+ foreach ($entries as $entry) {
+ $this->unlinkDir($datadir . '/' . $entry);
+ if ($this->isShowDetail()) {
+ printf("Stray datadir entry: %s\n", $entry);
+ }
+ }
+ return true;
+ }
+
+ return false;
+ }
+
+ private function cleanStrayHooks() {
+ $hasHooks = false;
+ $hooks = OC_Hook::getHooks();
+ if (!$hooks || sizeof($hooks) === 0) {
+ return false;
+ }
+
+ foreach ($hooks as $signalClass => $signals) {
+ if (sizeof($signals)) {
+ foreach ($signals as $signalName => $handlers ) {
+ if (sizeof($handlers) > 0) {
+ $hasHooks = true;
+ OC_Hook::clear($signalClass, $signalName);
+ if ($this->isShowDetail()) {
+ printf("Stray hook: \"%s\" \"%s\"\n", $signalClass, $signalName);
+ }
+ }
+ }
+ }
+ }
+ return $hasHooks;
+ }
+
+ private function cleanProxies() {
+ $proxies = OC_FileProxy::getProxies();
+ OC_FileProxy::clearProxies();
+ return count($proxies) > 0;
+ }
+}
+?>
diff --git a/tests/win32-phpunit.php b/tests/win32-phpunit.php
deleted file mode 100644
index ac8f95efcbf..00000000000
--- a/tests/win32-phpunit.php
+++ /dev/null
@@ -1,347 +0,0 @@
-<?php
-OC_PHPUnit_Loader::checkIncludePath();
-OC_PHPUnit_Loader::detectPHPUnitVersionId();
-
-//load PHPUnit
-switch (OC_PHPUnit_Loader::$PHPUnitVersionId) {
- case "36": {
- OC_PHPUnit_Loader::load36();
- break;
- }
- case "37": {
- OC_PHPUnit_Loader::load37();
- break;
- }
-}
-
-//load custom implementation of the PHPUnit_TextUI_ResultPrinter
-switch (OC_PHPUnit_Loader::$PHPUnitVersionId) {
- case "36":
- case "37": {
- class OC_PHPUnit_TextUI_ResultPrinter extends PHPUnit_TextUI_ResultPrinter
- {
- function __construct()
- {
- parent::__construct('php://stderr');
- }
-
- public function printResult(PHPUnit_Framework_TestResult $result)
- {
- $this->printHeader();
- $this->printFooter($result);
- }
-
- protected function writeProgress($progress)
- {
- //ignore
- }
- }
- break;
- }
-}
-
-//loading of OC_PHPUnit_TextUI_Command
-switch (OC_PHPUnit_Loader::$PHPUnitVersionId) {
- case "36":
- case "37": {
- class OC_PHPUnit_TextUI_Command extends PHPUnit_TextUI_Command
- {
-
- public static function main($exit = TRUE)
- {
- $command = new OC_PHPUnit_TextUI_Command();
- $command->run($_SERVER['argv'], $exit);
- }
-
- protected function handleArguments(array $argv)
- {
- parent::handleArguments($argv);
- $this->arguments['listeners'][] = new OC_PHPUnit_Framework_TestListener();
- $this->arguments['printer'] = new OC_PHPUnit_TextUI_ResultPrinter();
- }
-
- protected function createRunner()
- {
- $coverage_Filter = new PHP_CodeCoverage_Filter();
- $coverage_Filter->addFileToBlacklist(__FILE__);
- $runner = new PHPUnit_TextUI_TestRunner($this->arguments['loader'], $coverage_Filter);
- return $runner;
- }
- }
- break;
- }
-}
-
-class OC_PHPUnit_Loader
-{
-
- const SUCCESS_EXIT = 0;
- const FAILURE_EXIT = 1;
- const EXCEPTION_EXIT = 2;
-
- public static $PHPUnitVersionId;
-
- /**
- * @return void
- */
- public static function checkIncludePath()
- {
- //check include path
- $PHPUnitParentDirectory = self::getPHPUnitParentDirectory();
- if (is_null($PHPUnitParentDirectory)) {
- echo "Cannot find PHPUnit in include path (" . ini_get('include_path') . ")";
- exit(OC_PHPUnit_Loader::FAILURE_EXIT);
- }
- }
-
- /**
- * @return null | string
- */
- private static function getPHPUnitParentDirectory()
- {
- $pathArray = explode(PATH_SEPARATOR, ini_get('include_path'));
- foreach ($pathArray as $path)
- {
- if (file_exists($path . DIRECTORY_SEPARATOR . 'PHPUnit/')) {
- return $path;
- }
- }
- return null;
- }
-
- /**
- * @return void
- */
- public static function detectPHPUnitVersionId()
- {
- require_once 'PHPUnit/Runner/Version.php';
-
- $PHPUnitVersion = PHPUnit_Runner_Version::id();
-
- if ($PHPUnitVersion === "@package_version@") {
-
- self::$PHPUnitVersionId = "37";
- }
- else if (version_compare($PHPUnitVersion, '3.7.0') >= 0) {
-
- self::$PHPUnitVersionId = "37";
- }
- else if (version_compare($PHPUnitVersion, '3.6.0') >= 0) {
-
- self::$PHPUnitVersionId = "36";
- }
- else if (version_compare($PHPUnitVersion, '3.6.0') >= 0) {
-
- echo "unsupported PHPUnit version: $PHPUnitVersion";
- exit(OC_PHPUnit_Loader::FAILURE_EXIT);
- }
- }
-
- /**
- * @return void
- */
- public static function load37()
- {
-
- require 'PHPUnit/Autoload.php';
-
- }
-
-
- /**
- * @return void
- */
- public static function load36()
- {
- define('PHPUnit_MAIN_METHOD', 'OC_PHPUnit_TextUI_Command::main');
-
- require 'PHPUnit/Autoload.php';
-
- }
-}
-
-class OC_PHPUnit_Framework_TestListener implements PHPUnit_Framework_TestListener
-{
-
- private $isSummaryTestCountPrinted = false;
-
- public static function printEvent($eventName, $params = array())
- {
- self::printText("\n[$eventName");
- foreach ($params as $key => $value) {
- self::printText(" $key='$value'");
- }
- self::printText("]\n");
- }
-
- public static function printText($text)
- {
- file_put_contents('php://stderr', $text);
- }
-
- private static function getMessage(Exception $e)
- {
- $message = "";
- if (strlen(get_class($e)) != 0) {
- $message = $message . get_class($e);
- }
- if (strlen($message) != 0 && strlen($e->getMessage()) != 0) {
- $message = $message . " : ";
- }
- $message = $message . $e->getMessage();
- return self::escapeValue($message);
- }
-
- private static function getDetails(Exception $e)
- {
- return self::escapeValue($e->getTraceAsString());
- }
-
- public static function getValueAsString($value)
- {
- if (is_null($value)) {
- return "null";
- }
- else if (is_bool($value)) {
- return $value == true ? "true" : "false";
- }
- else if (is_array($value) || is_string($value)) {
- $valueAsString = print_r($value, true);
- if (strlen($valueAsString) > 10000) {
- return null;
- }
- return $valueAsString;
- }
- else if (is_scalar($value)){
- return print_r($value, true);
- }
- return null;
- }
-
- private static function escapeValue($text) {
- $text = str_replace("|", "||", $text);
- $text = str_replace("'", "|'", $text);
- $text = str_replace("\n", "|n", $text);
- $text = str_replace("\r", "|r", $text);
- $text = str_replace("]", "|]", $text);
- return $text;
- }
-
- public static function getFileName($className)
- {
- $reflectionClass = new ReflectionClass($className);
- $fileName = $reflectionClass->getFileName();
- return $fileName;
- }
-
- public function addError(PHPUnit_Framework_Test $test, Exception $e, $time)
- {
- self::printEvent("testFailed", array(
- "name" => $test->getName(),
- "message" => self::getMessage($e),
- "details" => self::getDetails($e)
- ));
- }
-
- public function addFailure(PHPUnit_Framework_Test $test, PHPUnit_Framework_AssertionFailedError $e, $time)
- {
- $params = array(
- "name" => $test->getName(),
- "message" => self::getMessage($e),
- "details" => self::getDetails($e)
- );
- if ($e instanceof PHPUnit_Framework_ExpectationFailedException) {
- $comparisonFailure = $e->getComparisonFailure();
- if ($comparisonFailure instanceof PHPUnit_Framework_ComparisonFailure) {
- $actualResult = $comparisonFailure->getActual();
- $expectedResult = $comparisonFailure->getExpected();
- $actualString = self::getValueAsString($actualResult);
- $expectedString = self::getValueAsString($expectedResult);
- if (!is_null($actualString) && !is_null($expectedString)) {
- $params['actual'] = self::escapeValue($actualString);
- $params['expected'] = self::escapeValue($expectedString);
- }
- }
- }
- self::printEvent("testFailed", $params);
- }
-
- public function addIncompleteTest(PHPUnit_Framework_Test $test, Exception $e, $time)
- {
- self::printEvent("testIgnored", array(
- "name" => $test->getName(),
- "message" => self::getMessage($e),
- "details" => self::getDetails($e)
- ));
- }
-
- public function addSkippedTest(PHPUnit_Framework_Test $test, Exception $e, $time)
- {
- self::printEvent("testIgnored", array(
- "name" => $test->getName(),
- "message" => self::getMessage($e),
- "details" => self::getDetails($e)
- ));
- }
-
- public function startTest(PHPUnit_Framework_Test $test)
- {
- $testName = $test->getName();
- $params = array(
- "name" => $testName
- );
- if ($test instanceof PHPUnit_Framework_TestCase) {
- $className = get_class($test);
- $fileName = self::getFileName($className);
- $params['locationHint'] = "php_qn://$fileName::\\$className::$testName";
- }
- self::printEvent("testStarted", $params);
- }
-
- public function endTest(PHPUnit_Framework_Test $test, $time)
- {
- self::printEvent("testFinished", array(
- "name" => $test->getName(),
- "duration" => (int)(round($time, 2) * 1000)
- ));
- }
-
- public function startTestSuite(PHPUnit_Framework_TestSuite $suite)
- {
- if (!$this->isSummaryTestCountPrinted) {
- $this->isSummaryTestCountPrinted = true;
- //print tests count
- self::printEvent("testCount", array(
- "count" => count($suite)
- ));
- }
-
- $suiteName = $suite->getName();
- if (empty($suiteName)) {
- return;
- }
- $params = array(
- "name" => $suiteName,
- );
- if (class_exists($suiteName, false)) {
- $fileName = self::getFileName($suiteName);
- $params['locationHint'] = "php_qn://$fileName::\\$suiteName";
- }
- self::printEvent("testSuiteStarted", $params);
- }
-
- public function endTestSuite(PHPUnit_Framework_TestSuite $suite)
- {
- $suiteName = $suite->getName();
- if (empty($suiteName)) {
- return;
- }
- self::printEvent("testSuiteFinished",
- array(
- "name" => $suite->getName()
- ));
- }
-
-}
-
-OC_PHPUnit_TextUI_Command::main();