Browse Source

Add tests for Share API, all tests passing :)

tags/v4.5.0beta1
Michael Gapczynski 12 years ago
parent
commit
137e4cb342
4 changed files with 267 additions and 142 deletions
  1. 4
    4
      lib/filestorage/commontest.php
  2. 5
    5
      tests/lib/filestorage.php
  3. 37
    36
      tests/lib/share/backend.php
  4. 221
    97
      tests/lib/share/share.php

+ 4
- 4
lib/filestorage/commontest.php View File

@@ -51,11 +51,11 @@ class OC_Filestorage_CommonTest extends OC_Filestorage_Common{
public function filetype($path){
return $this->storage->filetype($path);
}
public function is_readable($path){
return $this->storage->is_readable($path);
public function isReadable($path){
return $this->storage->isReadable($path);
}
public function is_writable($path){
return $this->storage->is_writable($path);
public function isUpdatable($path){
return $this->storage->isUpdatable($path);
}
public function file_exists($path){
return $this->storage->file_exists($path);

+ 5
- 5
tests/lib/filestorage.php View File

@@ -31,13 +31,13 @@ abstract class Test_FileStorage extends UnitTestCase {
*/
public function testRoot(){
$this->assertTrue($this->instance->file_exists('/'),'Root folder does not exist');
$this->assertTrue($this->instance->is_readable('/'),'Root folder is not readable');
$this->assertTrue($this->instance->isReadable('/'),'Root folder is not readable');
$this->assertTrue($this->instance->is_dir('/'),'Root folder is not a directory');
$this->assertFalse($this->instance->is_file('/'),'Root folder is a file');
$this->assertEqual('dir',$this->instance->filetype('/'));
//without this, any further testing would be useless, not an acutal requirement for filestorage though
$this->assertTrue($this->instance->is_writable('/'),'Root folder is not writable');
$this->assertTrue($this->instance->isUpdatable('/'),'Root folder is not writable');
}
public function testDirectories(){
@@ -50,8 +50,8 @@ abstract class Test_FileStorage extends UnitTestCase {
$this->assertFalse($this->instance->is_file('/folder'));
$this->assertEqual('dir',$this->instance->filetype('/folder'));
$this->assertEqual(0,$this->instance->filesize('/folder'));
$this->assertTrue($this->instance->is_readable('/folder'));
$this->assertTrue($this->instance->is_writable('/folder'));
$this->assertTrue($this->instance->isReadable('/folder'));
$this->assertTrue($this->instance->isUpdatable('/folder'));
$dh=$this->instance->opendir('/');
$content=array();
@@ -141,7 +141,7 @@ abstract class Test_FileStorage extends UnitTestCase {
$textFile=OC::$SERVERROOT.'/tests/data/lorem.txt';
$ctimeStart=time();
$this->instance->file_put_contents('/lorem.txt',file_get_contents($textFile));
$this->assertTrue($this->instance->is_readable('/lorem.txt'));
$this->assertTrue($this->instance->isReadable('/lorem.txt'));
$ctimeEnd=time();
$cTime=$this->instance->filectime('/lorem.txt');
$mTime=$this->instance->filemtime('/lorem.txt');

+ 37
- 36
tests/lib/share/backend.php View File

@@ -19,48 +19,49 @@
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*/

abstract class Test_Share_Backend extends UnitTestCase {
class Test_Share_Backend implements OCP\Share_Backend {

protected $userBackend;
protected $user1;
protected $user2;
protected $groupBackend;
protected $group;
protected $itemType;
protected $item;
const FORMAT_SOURCE = 0;
const FORMAT_TARGET = 1;
const FORMAT_PERMISSIONS = 2;
private $testItem = 'test.txt';

public function setUp() {
OC_User::clearBackends();
OC_User::useBackend('dummy');
$this->user1 = uniqid('user_');
$this->user2 = uniqid('user_');
OC_User::createUser($this->user1, 'pass1');
OC_User::createUser($this->user2, 'pass2');
OC_Group::clearBackends();
OC_Group::useBackend(new OC_Group_Dummy);
$this->group = uniqid('group_');
OC_Group::createGroup($this->group);
public function isValidSource($itemSource, $uidOwner) {
if ($itemSource == $this->testItem) {
return true;
}
}

public function testShareWithUserNonExistentItem() {
$this->assertFalse(OCP\Share::share($this->itemType, uniqid('foobar_'), OCP\Share::SHARETYPE_USER, $this->user2, OCP\Share::PERMISSION_READ));
public function generateTarget($itemSource, $shareWith, $exclude = null) {
$target = $itemSource;
if (isset($exclude)) {
$pos = strrpos($target, '.');
$name = substr($target, 0, $pos);
$ext = substr($target, $pos);
$append = '';
$i = 1;
while (in_array($name.$append.$ext, $exclude)) {
$append = $i;
$i++;
}
$target = $name.$append.$ext;
}
return $target;
}

public function testShareWithUserItem() {
$this->assertTrue(OCP\Share::share($this->itemType, $this->item, OCP\Share::SHARETYPE_USER, $this->user2, OCP\Share::PERMISSION_READ));
}

public function testShareWithGroupNonExistentItem() {
$this->assertFalse(OCP\Share::share($this->itemType, uniqid('foobar_'), OCP\Share::SHARETYPE_GROUP, $this->group, OCP\Share::PERMISSION_READ));
}

public function testShareWithGroupItem() {
$this->assertTrue(OCP\Share::share($this->itemType, $this->item, OCP\Share::SHARETYPE_GROUP, $this->group, OCP\Share::PERMISSION_READ));
}

public function testShareWithUserAlreadySharedWith() {
$this->assertTrue(OCP\Share::share($this->itemType, $this->item, OCP\Share::SHARETYPE_USER, $this->user2, OCP\Share::PERMISSION_READ));
$this->assertFalse(OCP\Share::share($this->itemType, $this->item, OCP\Share::SHARETYPE_USER, $this->user2, OCP\Share::PERMISSION_READ));
public function formatItems($items, $format, $parameters = null) {
$testItems = array();
foreach ($items as $item) {
if ($format == self::FORMAT_SOURCE) {
$testItems[] = $item['item_source'];
} else if ($format == self::FORMAT_TARGET) {
$testItems[] = $item['item_target'];
} else if ($format == self::FORMAT_PERMISSIONS) {
$testItems[] = $item['permissions'];
}
}
return $testItems;
}

}

+ 221
- 97
tests/lib/share/share.php View File

@@ -19,7 +19,7 @@
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*/

class Test_Share_Base extends UnitTestCase {
class Test_Share extends UnitTestCase {

protected $itemType;
protected $userBackend;
@@ -35,127 +35,251 @@ class Test_Share_Base extends UnitTestCase {
OC_User::useBackend('dummy');
$this->user1 = uniqid('user_');
$this->user2 = uniqid('user_');
OC_User::createUser($this->user1, 'pass1');
OC_User::createUser($this->user2, 'pass2');
$this->user3 = uniqid('user_');
OC_User::createUser($this->user1, 'pass');
OC_User::createUser($this->user2, 'pass');
OC_User::createUser($this->user3, 'pass');
OC_User::setUserId($this->user1);
OC_Group::clearBackends();
OC_Group::useBackend(new OC_Group_Dummy);
$this->group1 = uniqid('group_');
$this->group2 = uniqid('group_');
OC_Group::createGroup($this->group1);
OC_Group::createGroup($this->group2);
OC_Group::addToGroup($this->user1, $this->group1);
OC_Group::addToGroup($this->user2, $this->group1);
OC_Group::addToGroup($this->user3, $this->group1);
OCP\Share::registerBackend('test', 'Test_Share_Backend');
}

public function testShareInvalidShareType() {
$this->assertFalse(OCP\Share::share('file', 'test.txt', 'foobar', $this->user1, OCP\Share::PERMISSION_READ));
public function tearDown() {
$query = OC_DB::prepare('DELETE FROM *PREFIX*share WHERE item_type = ?');
$query->execute(array('test'));
}

public function testShareInvalidItemType() {
$this->assertFalse(OCP\Share::share('foobar', 'test.txt', OCP\Share::SHARETYPE_USER, $this->user1, OCP\Share::PERMISSION_READ));
}

public function testShareWithSelf() {
OC_User::setUserId($this->user1);
$this->assertFalse(OCP\Share::share('file', 'test.txt', OCP\Share::SHARETYPE_USER, $this->user1, OCP\Share::PERMISSION_READ));
public function testShareInvalidShareType() {
$this->expectException(new Exception('Share type foobar is not valid for test.txt'));
OCP\Share::shareItem('test', 'test.txt', 'foobar', $this->user2, OCP\Share::PERMISSION_READ);
}

public function testShareWithNonExistentUser() {
$this->assertFalse(OCP\Share::share('file', 'test.txt', OCP\Share::SHARETYPE_USER, 'foobar', OCP\Share::PERMISSION_READ));
public function testInvalidItemType() {
$message = 'Sharing backend for foobar not found';
try {
OCP\Share::shareItem('foobar', 'test.txt', OCP\Share::SHARE_TYPE_USER, $this->user2, OCP\Share::PERMISSION_READ);
$this->fail('Exception was expected: '.$message);
} catch (Exception $exception) {
$this->assertEqual($exception->getMessage(), $message);
}
try {
OCP\Share::shareItem('foobar', 'test.txt', OCP\Share::SHARE_TYPE_USER, $this->user2, OCP\Share::PERMISSION_READ);
$this->fail('Exception was expected: '.$message);
} catch (Exception $exception) {
$this->assertEqual($exception->getMessage(), $message);
}
try {
OCP\Share::getItemsSharedWith('foobar');
$this->fail('Exception was expected: '.$message);
} catch (Exception $exception) {
$this->assertEqual($exception->getMessage(), $message);
}
try {
OCP\Share::getItemSharedWith('foobar', 'test.txt');
$this->fail('Exception was expected: '.$message);
} catch (Exception $exception) {
$this->assertEqual($exception->getMessage(), $message);
}
try {
OCP\Share::getItemSharedWithBySource('foobar', 'test.txt');
$this->fail('Exception was expected: '.$message);
} catch (Exception $exception) {
$this->assertEqual($exception->getMessage(), $message);
}
try {
OCP\Share::getItemShared('foobar', 'test.txt');
$this->fail('Exception was expected: '.$message);
} catch (Exception $exception) {
$this->assertEqual($exception->getMessage(), $message);
}
try {
OCP\Share::unshare('foobar', 'test.txt', OCP\Share::SHARE_TYPE_USER, $this->user2);
$this->fail('Exception was expected: '.$message);
} catch (Exception $exception) {
$this->assertEqual($exception->getMessage(), $message);
}
try {
OCP\Share::setPermissions('foobar', 'test.txt', OCP\Share::SHARE_TYPE_USER, $this->user2, OCP\Share::PERMISSION_UPDATE);
$this->fail('Exception was expected: '.$message);
} catch (Exception $exception) {
$this->assertEqual($exception->getMessage(), $message);
}
}

public function testShareWithUserOwnerNotPartOfGroup() {
public function testShareWithUser() {
// Invalid shares
$message = 'Sharing test.txt failed, because the user '.$this->user1.' is the item owner';
try {
OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_USER, $this->user1, OCP\Share::PERMISSION_READ);
$this->fail('Exception was expected: '.$message);
} catch (Exception $exception) {
$this->assertEqual($exception->getMessage(), $message);
}
$message = 'Sharing test.txt failed, because the user foobar does not exist';
try {
OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_USER, 'foobar', OCP\Share::PERMISSION_READ);
$this->fail('Exception was expected: '.$message);
} catch (Exception $exception) {
$this->assertEqual($exception->getMessage(), $message);
}
}

public function testShareWithUserAlreadySharedWith() {
// Valid share
$this->assertTrue(OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_USER, $this->user2, OCP\Share::PERMISSION_READ));
$this->assertEqual(OCP\Share::getItemShared('test', 'test.txt', Test_Share_Backend::FORMAT_SOURCE), array('test.txt'));
OC_User::setUserId($this->user2);
$this->assertEqual(OCP\Share::getItemSharedWith('test', 'test.txt', Test_Share_Backend::FORMAT_SOURCE), array('test.txt'));
}

public function testShareWithNonExistentGroup() {
$this->assertFalse(OCP\Share::share('file', 'test.txt', OCP\Share::SHARETYPE_GROUP, 'foobar', OCP\Share::PERMISSION_READ));
}

public function testShareWithGroupOwnerNotPartOfGroup() {

}


public function testShareWithGroupItem() {

}

public function testUnshareInvalidShareType() {

}

public function testUnshareNonExistentItem() {

}

public function testUnshareFromUserItem() {

}

public function testUnshareFromGroupItem() {

}



// Test owner not in same group (false)

// Attempt to share again
OC_User::setUserId($this->user1);
$message = 'Sharing test.txt failed, because this item is already shared with '.$this->user2;
try {
OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_USER, $this->user2, OCP\Share::PERMISSION_READ);
$this->fail('Exception was expected: '.$message);
} catch (Exception $exception) {
$this->assertEqual($exception->getMessage(), $message);
}

// Test non-existant item type

// Test valid item

// Test existing shared item (false)
// Invalid item
$message = 'Sharing foobar failed, because the sharing backend for test could not find its source';
try {
OCP\Share::shareItem('test', 'foobar', OCP\Share::SHARE_TYPE_USER, $this->user2, OCP\Share::PERMISSION_READ);
$this->fail('Exception was expected: '.$message);
} catch (Exception $exception) {
$this->assertEqual($exception->getMessage(), $message);
}
// Test unsharing item
// Test setting permissions
// Test setting permissions not as owner (false)
// Test setting target
// Test setting target as owner (false)
// Attempt reshare without share permission
OC_User::setUserId($this->user2);
$message = 'Sharing test.txt failed, because resharing is not allowed';
try {
OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_USER, $this->user3, OCP\Share::PERMISSION_READ);
$this->fail('Exception was expected: '.$message);
} catch (Exception $exception) {
$this->assertEqual($exception->getMessage(), $message);
}
// Spam reshares

// Owner grants share and update permission
OC_User::setUserId($this->user1);
$this->assertTrue(OCP\Share::setPermissions('test', 'test.txt', OCP\Share::SHARE_TYPE_USER, $this->user2, OCP\Share::PERMISSION_READ | OCP\Share::PERMISSION_UPDATE | OCP\Share::PERMISSION_SHARE));

// Test non-existant group
// Attempt reshare with escalated permissions
OC_User::setUserId($this->user2);
$message = 'Sharing test.txt failed, because the permissions exceed permissions granted to '.$this->user2;
try {
OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_USER, $this->user3, OCP\Share::PERMISSION_READ | OCP\Share::PERMISSION_DELETE);
$this->fail('Exception was expected: '.$message);
} catch (Exception $exception) {
$this->assertEqual($exception->getMessage(), $message);
}

// Test owner not part of group

// Test existing shared item with group

// Test valid item, valid name for all users

// Test unsharing item

// Test item with name conflicts

// Test unsharing item

// Test setting permissions

// Test setting target no name conflicts

// Test setting target with conflicts

// Spam reshares

// Valid reshare
$this->assertTrue(OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_USER, $this->user3, OCP\Share::PERMISSION_READ | OCP\Share::PERMISSION_UPDATE));
$this->assertEqual(OCP\Share::getItemShared('test', 'test.txt', Test_Share_Backend::FORMAT_SOURCE), array('test.txt'));
OC_User::setUserId($this->user3);
$this->assertEqual(OCP\Share::getItemSharedWith('test', 'test.txt', Test_Share_Backend::FORMAT_SOURCE), array('test.txt'));
$this->assertEqual(OCP\Share::getItemSharedWith('test', 'test.txt', Test_Share_Backend::FORMAT_PERMISSIONS), array(OCP\Share::PERMISSION_READ | OCP\Share::PERMISSION_UPDATE));

// Attempt to escalate permissions
OC_User::setUserId($this->user2);
$message = 'Setting permissions for test.txt failed, because the permissions exceed permissions granted to '.$this->user2;
try {
OCP\Share::setPermissions('test', 'test.txt', OCP\Share::SHARE_TYPE_USER, $this->user3, OCP\Share::PERMISSION_READ | OCP\Share::PERMISSION_DELETE);
$this->fail('Exception was expected: '.$message);
} catch (Exception $exception) {
$this->assertEqual($exception->getMessage(), $message);
}
// Remove update permission
OC_User::setUserId($this->user1);
$this->assertTrue(OCP\Share::setPermissions('test', 'test.txt', OCP\Share::SHARE_TYPE_USER, $this->user2, OCP\Share::PERMISSION_READ | OCP\Share::PERMISSION_SHARE));
OC_User::setUserId($this->user2);
$this->assertEqual(OCP\Share::getItemSharedWith('test', 'test.txt', Test_Share_Backend::FORMAT_PERMISSIONS), array(OCP\Share::PERMISSION_READ | OCP\Share::PERMISSION_SHARE));
OC_User::setUserId($this->user3);
$this->assertEqual(OCP\Share::getItemSharedWith('test', 'test.txt', Test_Share_Backend::FORMAT_PERMISSIONS), array(OCP\Share::PERMISSION_READ));
// Remove share permission
OC_User::setUserId($this->user1);
$this->assertTrue(OCP\Share::setPermissions('test', 'test.txt', OCP\Share::SHARE_TYPE_USER, $this->user2, OCP\Share::PERMISSION_READ));
OC_User::setUserId($this->user2);
$this->assertEqual(OCP\Share::getItemSharedWith('test', 'test.txt', Test_Share_Backend::FORMAT_PERMISSIONS), array(OCP\Share::PERMISSION_READ));
OC_User::setUserId($this->user3);
$this->assertFalse(OCP\Share::getItemSharedWith('test', 'test.txt'));
// Reshare again, and then have owner unshare
OC_User::setUserId($this->user1);
$this->assertTrue(OCP\Share::setPermissions('test', 'test.txt', OCP\Share::SHARE_TYPE_USER, $this->user2, OCP\Share::PERMISSION_READ | OCP\Share::PERMISSION_SHARE));
OC_User::setUserId($this->user2);
$this->assertTrue(OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_USER, $this->user3, OCP\Share::PERMISSION_READ));
OC_User::setUserId($this->user1);
$this->assertTrue(OCP\Share::unshare('test', 'test.txt', OCP\Share::SHARE_TYPE_USER, $this->user2));
OC_User::setUserId($this->user2);
$this->assertFalse(OCP\Share::getItemSharedWith('test', 'test.txt'));
OC_User::setUserId($this->user3);
$this->assertFalse(OCP\Share::getItemSharedWith('test', 'test.txt'));
// Attempt target conflict
OC_User::setUserId($this->user1);
$this->assertTrue(OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_USER, $this->user2, OCP\Share::PERMISSION_READ));
OC_User::setUserId($this->user3);
$this->assertTrue(OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_USER, $this->user2, OCP\Share::PERMISSION_READ));
OC_User::setUserId($this->user2);
$this->assertEqual(OCP\Share::getItemsSharedWith('test', Test_Share_Backend::FORMAT_TARGET), array('test.txt', 'test1.txt'));
}

public function testPrivateLink() {
public function testShareWithGroup() {
// Invalid shares
$message = 'Sharing test.txt failed, because the group foobar does not exist';
try {
OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_GROUP, 'foobar', OCP\Share::PERMISSION_READ);
$this->fail('Exception was expected: '.$message);
} catch (Exception $exception) {
$this->assertEqual($exception->getMessage(), $message);
}
$message = 'Sharing test.txt failed, because '.$this->user1.' is not a member of the group '.$this->group2;
try {
OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_GROUP, $this->group2, OCP\Share::PERMISSION_READ);
$this->fail('Exception was expected: '.$message);
} catch (Exception $exception) {
$this->assertEqual($exception->getMessage(), $message);
}
// Valid share
$this->assertTrue(OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_GROUP, $this->group1, OCP\Share::PERMISSION_READ));
$this->assertEqual(OCP\Share::getItemShared('test', 'test.txt', Test_Share_Backend::FORMAT_SOURCE), array('test.txt'));
OC_User::setUserId($this->user2);
$this->assertEqual(OCP\Share::getItemSharedWith('test', 'test.txt', Test_Share_Backend::FORMAT_SOURCE), array('test.txt'));
OC_User::setUserId($this->user3);
$this->assertEqual(OCP\Share::getItemSharedWith('test', 'test.txt', Test_Share_Backend::FORMAT_SOURCE), array('test.txt'));
// Attempt to share again
OC_User::setUserId($this->user1);
$message = 'Sharing test.txt failed, because this item is already shared with '.$this->group1;
try {
OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_GROUP, $this->group1, OCP\Share::PERMISSION_READ);
$this->fail('Exception was expected: '.$message);
} catch (Exception $exception) {
$this->assertEqual($exception->getMessage(), $message);
}
// Unshare
$this->assertTrue(OCP\Share::unshare('test', 'test.txt', OCP\Share::SHARE_TYPE_GROUP, $this->group1));
// Attempt user specific target conflict
$this->assertTrue(OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_USER, $this->user2, OCP\Share::PERMISSION_READ));
$this->assertTrue(OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_GROUP, $this->group1, OCP\Share::PERMISSION_READ));
OC_User::setUserId($this->user2);
$this->assertEqual(OCP\Share::getItemsSharedWith('test', Test_Share_Backend::FORMAT_TARGET), array('test.txt', 'test1.txt'));
OC_User::setUserId($this->user3);
$this->assertEqual(OCP\Share::getItemsSharedWith('test', Test_Share_Backend::FORMAT_TARGET), array('test.txt'));
}

}

Loading…
Cancel
Save