Blame view

sources/apps/files_sharing/tests/watcher.php 5.68 KB
31b7f2792   Kload   Upgrade to ownclo...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
  <?php
  /**
   * ownCloud
   *
   * @author Vincent Petry
   * @copyright 2013 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/>.
   *
   */
  require_once __DIR__ . '/base.php';
  
  class Test_Files_Sharing_Watcher extends Test_Files_Sharing_Base {
  
  	function setUp() {
  		parent::setUp();
  
  		self::loginHelper(self::TEST_FILES_SHARING_API_USER1);
  
  		// prepare user1's dir structure
  		$textData = "dummy file data
  ";
  		$this->view->mkdir('container');
  		$this->view->mkdir('container/shareddir');
  		$this->view->mkdir('container/shareddir/subdir');
  
  		list($this->ownerStorage, $internalPath) = $this->view->resolvePath('');
  		$this->ownerCache = $this->ownerStorage->getCache();
  		$this->ownerStorage->getScanner()->scan('');
  
  		// share "shareddir" with user2
  		$fileinfo = $this->view->getFileInfo('container/shareddir');
  		\OCP\Share::shareItem('folder', $fileinfo['fileid'], \OCP\Share::SHARE_TYPE_USER,
  			self::TEST_FILES_SHARING_API_USER2, 31);
  
  		// login as user2
  		self::loginHelper(self::TEST_FILES_SHARING_API_USER2);
  
  		// retrieve the shared storage
  		$secondView = new \OC\Files\View('/' . self::TEST_FILES_SHARING_API_USER2);
6d9380f96   Cédric Dupont   Update sources OC...
52
  		list($this->sharedStorage, $internalPath) = $secondView->resolvePath('files/shareddir');
31b7f2792   Kload   Upgrade to ownclo...
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
  		$this->sharedCache = $this->sharedStorage->getCache();
  	}
  
  	function tearDown() {
  		$this->sharedCache->clear();
  
  		self::loginHelper(self::TEST_FILES_SHARING_API_USER1);
  
  		$fileinfo = $this->view->getFileInfo('container/shareddir');
  		\OCP\Share::unshare('folder', $fileinfo['fileid'], \OCP\Share::SHARE_TYPE_USER,
  			self::TEST_FILES_SHARING_API_USER2);
  
  		$this->view->deleteAll('container');
  
  		$this->ownerCache->clear();
  
  		parent::tearDown();
  	}
  
  	/**
  	 * Tests that writing a file using the shared storage will propagate the file
  	 * size to the owner's parent folders.
  	 */
  	function testFolderSizePropagationToOwnerStorage() {
  		$initialSizes = self::getOwnerDirSizes('files/container/shareddir');
  
  		$textData = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
  		$dataLen = strlen($textData);
6d9380f96   Cédric Dupont   Update sources OC...
81
82
83
  		$this->sharedCache->put('bar.txt', array('mtime' => 10, 'storage_mtime' => 10, 'size' => $dataLen, 'mimetype' => 'text/plain'));
  		$this->sharedStorage->file_put_contents('bar.txt', $textData);
  		$this->sharedCache->put('', array('mtime' => 10, 'storage_mtime' => 10, 'size' => '-1', 'mimetype' => 'httpd/unix-directory'));
31b7f2792   Kload   Upgrade to ownclo...
84
85
  
  		// run the propagation code
6d9380f96   Cédric Dupont   Update sources OC...
86
  		$result = $this->sharedStorage->getWatcher()->checkUpdate('');
31b7f2792   Kload   Upgrade to ownclo...
87
88
89
90
91
92
93
94
95
96
97
  
  		$this->assertTrue($result);
  
  		// the owner's parent dirs must have increase size
  		$newSizes = self::getOwnerDirSizes('files/container/shareddir');
  		$this->assertEquals($initialSizes[''] + $dataLen, $newSizes['']);
  		$this->assertEquals($initialSizes['files'] + $dataLen, $newSizes['files']);
  		$this->assertEquals($initialSizes['files/container'] + $dataLen, $newSizes['files/container']);
  		$this->assertEquals($initialSizes['files/container/shareddir'] + $dataLen, $newSizes['files/container/shareddir']);
  
  		// no more updates
6d9380f96   Cédric Dupont   Update sources OC...
98
  		$result = $this->sharedStorage->getWatcher()->checkUpdate('');
31b7f2792   Kload   Upgrade to ownclo...
99
100
101
102
103
104
105
106
107
108
109
110
111
  
  		$this->assertFalse($result);
  	}
  
  	/**
  	 * Tests that writing a file using the shared storage will propagate the file
  	 * size to the owner's parent folders.
  	 */
  	function testSubFolderSizePropagationToOwnerStorage() {
  		$initialSizes = self::getOwnerDirSizes('files/container/shareddir/subdir');
  
  		$textData = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
  		$dataLen = strlen($textData);
6d9380f96   Cédric Dupont   Update sources OC...
112
113
114
  		$this->sharedCache->put('subdir/bar.txt', array('mtime' => 10, 'storage_mtime' => 10, 'size' => $dataLen, 'mimetype' => 'text/plain'));
  		$this->sharedStorage->file_put_contents('subdir/bar.txt', $textData);
  		$this->sharedCache->put('subdir', array('mtime' => 10, 'storage_mtime' => 10, 'size' => $dataLen, 'mimetype' => 'text/plain'));
31b7f2792   Kload   Upgrade to ownclo...
115
116
  
  		// run the propagation code
6d9380f96   Cédric Dupont   Update sources OC...
117
  		$result = $this->sharedStorage->getWatcher()->checkUpdate('subdir');
31b7f2792   Kload   Upgrade to ownclo...
118
119
120
121
122
123
124
125
126
127
128
129
  
  		$this->assertTrue($result);
  
  		// the owner's parent dirs must have increase size
  		$newSizes = self::getOwnerDirSizes('files/container/shareddir/subdir');
  		$this->assertEquals($initialSizes[''] + $dataLen, $newSizes['']);
  		$this->assertEquals($initialSizes['files'] + $dataLen, $newSizes['files']);
  		$this->assertEquals($initialSizes['files/container'] + $dataLen, $newSizes['files/container']);
  		$this->assertEquals($initialSizes['files/container/shareddir'] + $dataLen, $newSizes['files/container/shareddir']);
  		$this->assertEquals($initialSizes['files/container/shareddir/subdir'] + $dataLen, $newSizes['files/container/shareddir/subdir']);
  
  		// no more updates
6d9380f96   Cédric Dupont   Update sources OC...
130
  		$result = $this->sharedStorage->getWatcher()->checkUpdate('subdir');
31b7f2792   Kload   Upgrade to ownclo...
131
132
  
  		$this->assertFalse($result);
31b7f2792   Kload   Upgrade to ownclo...
133
134
135
136
137
  	}
  
  	/**
  	 * Returns the sizes of the path and its parent dirs in a hash
  	 * where the key is the path and the value is the size.
6d9380f96   Cédric Dupont   Update sources OC...
138
  	 * @param string $path
31b7f2792   Kload   Upgrade to ownclo...
139
140
141
142
143
144
145
146
147
148
149
150
151
152
  	 */
  	function getOwnerDirSizes($path) {
  		$result = array();
  
  		while ($path != '' && $path != '' && $path != '.') {
  			$cachedData = $this->ownerCache->get($path);
  			$result[$path] = $cachedData['size'];
  			$path = dirname($path);
  		}
  		$cachedData = $this->ownerCache->get('');
  		$result[''] = $cachedData['size'];
  		return $result;
  	}
  }