1 /*
2 * Copyright (c) 2024-2025 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "dfs_error.h"
17 #include <copy/file_copy_manager.h>
18 #include <copy/trans_listener.h>
19 #include <filesystem>
20 #include <fstream>
21 #include <gtest/gtest.h>
22 #include <memory>
23
24 namespace OHOS::Storage::DistributedFile::Test {
25 using namespace OHOS::FileManagement;
26 using namespace testing;
27 using namespace testing::ext;
28 using namespace std;
29
30 class TransListenerTest : public testing::Test {
31 public:
32 static void SetUpTestCase(void);
33 static void TearDownTestCase(void);
34 void SetUp();
35 void TearDown();
36
37 // Variables to track file transfer progress
38 uint64_t process = 0; // Bytes processed so far
39 uint64_t fileSize = 0; // Total file size
40
41 // Callback definition for progress updates
42 using callBack = std::function<void(uint64_t processSize, uint64_t totalFileSize)>;
__anon7298b69d0102(uint64_t processSize, uint64_t totalFileSize) 43 callBack listener = [&](uint64_t processSize, uint64_t totalFileSize) {
44 process = processSize;
45 fileSize = totalFileSize;
46 };
47 callBack nullCallBack;
48 };
49
SetUpTestCase(void)50 void TransListenerTest::SetUpTestCase(void)
51 {
52 GTEST_LOG_(INFO) << "SetUpTestCase";
53 }
54
TearDownTestCase(void)55 void TransListenerTest::TearDownTestCase(void)
56 {
57 GTEST_LOG_(INFO) << "TearDownTestCase";
58 }
59
SetUp(void)60 void TransListenerTest::SetUp(void)
61 {
62 GTEST_LOG_(INFO) << "SetUp";
63 // Reset progress counters before each test
64 process = 0;
65 fileSize = 0;
66 }
67
TearDown(void)68 void TransListenerTest::TearDown(void)
69 {
70 GTEST_LOG_(INFO) << "TearDown";
71 }
72
73 /**
74 * @tc.name: TransListener_CopyToSandBox_0001
75 * @tc.desc: The execution of the CopyTosandbox success.
76 * @tc.type: FUNC
77 * @tc.require: I7TDJK
78 */
79 HWTEST_F(TransListenerTest, TransListener_CopyToSandBox_0001, TestSize.Level0)
80 {
81 GTEST_LOG_(INFO) << "TransListener_CopyToSandBox_0001 Start";
82
83 // Set up source and destination URIs with docs authority
84 string srcuri = "file://docs/storage/media/100/local/files/Docs/aa/";
85 string desturi = "file://docs/storage/media/100/local/files/Docs/aa1/";
86
87 // Create TransListener instance with destination URI and callback
88 auto ptr = std::make_shared<TransListener>(desturi, listener);
89
90 // Execute file copy operation and verify success
91 int32_t ret = ptr->CopyToSandBox(srcuri);
92 EXPECT_EQ(ret, E_OK); // Expect operation to succeed
93
94 GTEST_LOG_(INFO) << "TransListener_CopyToSandBox_0001 End";
95 }
96
97 /**
98 * @tc.name: TransListener_CopyToSandBox_0002
99 * @tc.desc: Test CopyToSandBox with media authority (should skip copy)
100 * @tc.type: FUNC
101 * @tc.require: I7TDJK
102 */
103 HWTEST_F(TransListenerTest, TransListener_CopyToSandBox_0002, TestSize.Level0)
104 {
105 GTEST_LOG_(INFO) << "TransListener_CopyToSandBox_0002 Start";
106
107 string srcuri = "file://media/storage/media/100/local/files/Media/src.jpg";
108 string desturi = "file://media/storage/media/100/local/files/Media/dest.jpg";
109
110 auto ptr = std::make_shared<TransListener>(desturi, listener);
111 int32_t ret = ptr->CopyToSandBox(srcuri);
112 EXPECT_EQ(ret, E_OK); // Should skip copy for media authority
113
114 GTEST_LOG_(INFO) << "TransListener_CopyToSandBox_0002 End";
115 }
116
117 /**
118 * @tc.name: TransListener_CopyToSandBox_0003
119 * @tc.desc: Test CopyToSandBox directory with non-docs/media authority
120 * @tc.type: FUNC
121 * @tc.require: I7TDJK
122 */
123 HWTEST_F(TransListenerTest, TransListener_CopyToSandBox_0003, TestSize.Level0)
124 {
125 GTEST_LOG_(INFO) << "TransListener_CopyToSandBox_0003 Start";
126 // Setup test directory structure first
127 string testDir = "/data/storage/el2/distributedfiles/test_dir_0003";
128 std::filesystem::create_directories(testDir + "/src");
129 std::ofstream(testDir + "/src/file1.txt") << "test content";
130
131 string srcuri = "file://other" + testDir + "/src";
132 string desturi = "file://other" + testDir + "/dest";
133 auto ptr = std::make_shared<TransListener>(desturi, listener);
134
135 // change hmdfsInfo_.sandboxPath
136 ptr->hmdfsInfo_.sandboxPath = testDir + "/src";
137
138 int32_t ret = ptr->CopyToSandBox(srcuri);
139 EXPECT_EQ(ret, E_OK);
140
141 // Cleanup
142 std::filesystem::remove_all(testDir);
143 GTEST_LOG_(INFO) << "TransListener_CopyToSandBox_0003 End";
144 }
145
146 /**
147 * @tc.name: TransListener_CopyToSandBox_0004
148 * @tc.desc: Test CopyToSandBox single file with non-docs/media authority
149 * @tc.type: FUNC
150 * @tc.require: I7TDJK
151 */
152 HWTEST_F(TransListenerTest, TransListener_CopyToSandBox_0004, TestSize.Level0)
153 {
154 GTEST_LOG_(INFO) << "TransListener_CopyToSandBox_0004 Start";
155 // Setup test file first
156 string testDir = "/data/storage/el2/distributedfiles/test_dir_0004";
157 std::filesystem::create_directories(testDir);
158 std::ofstream(testDir + "/src.txt") << "test content";
159
160 string srcuri = "file://other" + testDir + "/src.txt";
161 string desturi = "file://other" + testDir + "/dest.txt";
162 auto ptr = std::make_shared<TransListener>(desturi, listener);
163
164 // change hmdfsInfo_.sandboxPath
165 ptr->hmdfsInfo_.sandboxPath = testDir + "/src";
166
167 int32_t ret = ptr->CopyToSandBox(srcuri);
168 EXPECT_EQ(ret, EIO);
169
170 // Cleanup
171 std::filesystem::remove_all(testDir);
172 GTEST_LOG_(INFO) << "TransListener_CopyToSandBox_0004 End";
173 }
174
175 /**
176 * @tc.name: TransListener_CopyToSandBox_0005
177 * @tc.desc: Test CopyToSandBox with invalid source path
178 * @tc.type: FUNC
179 * @tc.require: I7TDJK
180 */
181 HWTEST_F(TransListenerTest, TransListener_CopyToSandBox_0005, TestSize.Level0)
182 {
183 GTEST_LOG_(INFO) << "TransListener_CopyToSandBox_0005 Start";
184 string srcuri = "file://other/invalid/path/src.txt";
185 string desturi = "file://other/valid/path/dest.txt";
186 auto ptr = std::make_shared<TransListener>(desturi, listener);
187
188 int32_t ret = ptr->CopyToSandBox(srcuri);
189 EXPECT_EQ(ret, EIO); // Should fail with EIO
190
191 GTEST_LOG_(INFO) << "TransListener_CopyToSandBox_0005 End";
192 }
193
194 /**
195 * @tc.name: TransListener_CopyToSandBox_0006
196 * @tc.desc: Test CopyToSandBox with empty source URI
197 * @tc.type: FUNC
198 * @tc.require: I7TDJK
199 */
200 HWTEST_F(TransListenerTest, TransListener_CopyToSandBox_0006, TestSize.Level0)
201 {
202 GTEST_LOG_(INFO) << "TransListener_CopyToSandBox_0006 Start";
203 string srcuri = "";
204 string desturi = "file://other/valid/path/dest.txt";
205 auto ptr = std::make_shared<TransListener>(desturi, listener);
206
207 int32_t ret = ptr->CopyToSandBox(srcuri);
208 EXPECT_NE(ret, E_OK); // Should fail
209
210 GTEST_LOG_(INFO) << "TransListener_CopyToSandBox_0006 End";
211 }
212
213 /**
214 * @tc.name: TransListener_CopyToSandBox_0007
215 * @tc.desc: Test CopyToSandBox with permission denied scenario
216 * @tc.type: FUNC
217 * @tc.require: I7TDJK
218 */
219 HWTEST_F(TransListenerTest, TransListener_CopyToSandBox_0007, TestSize.Level0)
220 {
221 GTEST_LOG_(INFO) << "TransListener_CopyToSandBox_0007 Start";
222 // Setup read-only directory
223 string testDir = "/data/storage/el2/distributedfiles/test_dir_0007";
224 std::filesystem::create_directories(testDir + "/src");
225 std::filesystem::permissions(testDir + "/src", std::filesystem::perms::owner_read,
226 std::filesystem::perm_options::replace);
227
228 string srcuri = "file://other" + testDir + "/src";
229 string desturi = "file://other" + testDir + "/dest";
230 auto ptr = std::make_shared<TransListener>(desturi, listener);
231
232 int32_t ret = ptr->CopyToSandBox(srcuri);
233 EXPECT_EQ(ret, EIO); // Should fail with EIO
234
235 // Cleanup
236 std::filesystem::permissions(testDir + "/src", std::filesystem::perms::owner_all,
237 std::filesystem::perm_options::replace);
238 std::filesystem::remove_all(testDir);
239 GTEST_LOG_(INFO) << "TransListener_CopyToSandBox_0007 End";
240 }
241
242 /**
243 * @tc.name: TransListener_Cancel_0001
244 * @tc.desc: The execution of the Cancel success.
245 * @tc.type: FUNC
246 * @tc.require: I7TDJK
247 */
248 HWTEST_F(TransListenerTest, TransListener_Cancel_0001, TestSize.Level0)
249 {
250 GTEST_LOG_(INFO) << "TransListener_Cancel_0001 Start";
251
252 // Set up test URIs
253 string srcuri = "file://docs/storage/media/100/local/files/Docs/aa/";
254 string desturi = "file://docs/storage/media/100/local/files/Docs/aa1/";
255
256 // Create TransListener instance
257 auto ptr = std::make_shared<TransListener>(desturi, listener);
258
259 // Attempt to cancel operation and verify expected failure
260 // (Expecting failure because test environment lacks real proxy)
261 int32_t ret = ptr->Cancel(srcuri, desturi);
262 EXPECT_EQ(ret, E_SA_LOAD_FAILED);
263
264 GTEST_LOG_(INFO) << "TransListener_Cancel_0001 End";
265 }
266
267 /**
268 * @tc.name: TransListener_OnFileReceive_0001
269 * @tc.desc: The execution of the OnFileReceive success.
270 * @tc.type: FUNC
271 * @tc.require: I7TDJK
272 */
273 HWTEST_F(TransListenerTest, TransListener_OnFileReceive_0001, TestSize.Level0)
274 {
275 GTEST_LOG_(INFO) << "TransListener_OnFileReceive_0001 Start";
276
277 // Set up test URIs
278 string srcuri = "file://docs/storage/media/100/local/files/Docs/aa/";
279 string desturi = "file://docs/storage/media/100/local/files/Docs/aa1/";
280
281 // Create TransListener instance
282 auto ptr = std::make_shared<TransListener>(desturi, listener);
283
284 // Test file receive callback with current progress values
285 int32_t ret = ptr->OnFileReceive(process, fileSize);
286 EXPECT_EQ(ret, E_OK); // Expect callback to succeed
287
288 GTEST_LOG_(INFO) << "TransListener_OnFileReceive_0001 End";
289 }
290
291 /**
292 * @tc.name: TransListener_OnFileReceive_0002
293 * @tc.desc: The execution of the OnFileReceive failed.
294 * @tc.type: FUNC
295 * @tc.require: I7TDJK
296 */
297 HWTEST_F(TransListenerTest, TransListener_OnFileReceive_0002, TestSize.Level0)
298 {
299 GTEST_LOG_(INFO) << "TransListener_OnFileReceive_0002 Start";
300
301 // Set up test URIs
302 string srcuri = "file://docs/storage/media/100/local/files/Docs/aa/";
303 string desturi = "file://docs/storage/media/100/local/files/Docs/aa1/";
304
305 // Create TransListener instance
306 auto ptr = std::make_shared<TransListener>(desturi, nullCallBack);
307
308 // Test file receive callback with current progress values
309 int32_t ret = ptr->OnFileReceive(process, fileSize);
310 EXPECT_EQ(ret, ENOMEM); // Expect callback to failed
311
312 GTEST_LOG_(INFO) << "TransListener_OnFileReceive_0002 End";
313 }
314
315 /**
316 * @tc.name: TransListener_0004
317 * @tc.desc: The execution of the OnFinished success.
318 * @tc.type: FUNC
319 * @tc.require: I7TDJK
320 */
321 HWTEST_F(TransListenerTest, TransListener_0004, TestSize.Level0)
322 {
323 GTEST_LOG_(INFO) << "TransListener_0004 Start";
324
325 // Set up test parameters
326 string sessionName = "test";
327 string desturi = "file://docs/storage/media/100/local/files/Docs/aa1/";
328
329 // Create TransListener instance
330 auto ptr = std::make_shared<TransListener>(desturi, listener);
331
332 // Simulate successful operation completion
333 int32_t ret = ptr->OnFinished(sessionName);
334 EXPECT_EQ(ret, E_OK); // Expect completion handler to succeed
335
336 GTEST_LOG_(INFO) << "TransListener_0004 End";
337 }
338
339 /**
340 * @tc.name: TransListener_0005
341 * @tc.desc: The execution of the OnFailed success.
342 * @tc.type: FUNC
343 * @tc.require: I7TDJK
344 */
345 HWTEST_F(TransListenerTest, TransListener_0005, TestSize.Level0)
346 {
347 GTEST_LOG_(INFO) << "TransListener_0005 Start";
348
349 // Set up test parameters
350 string sessionName = "test";
351 int32_t errorCode = 0; // Using 0 as generic error code for testing
352 string desturi = "file://docs/storage/media/100/local/files/Docs/aa1/";
353
354 // Create TransListener instance
355 auto ptr = std::make_shared<TransListener>(desturi, listener);
356
357 // Simulate operation failure
358 int32_t ret = ptr->OnFailed(sessionName, errorCode);
359 EXPECT_EQ(ret, E_OK); // Expect failure handler to succeed
360
361 GTEST_LOG_(INFO) << "TransListener_0005 End";
362 }
363
364 /**
365 * @tc.name: TransListener_0006
366 * @tc.desc: Test CreateTmpDir with docs authority.
367 * @tc.type: FUNC
368 * @tc.require: I7TDJK
369 */
370 HWTEST_F(TransListenerTest, TransListener_0006, TestSize.Level0)
371 {
372 GTEST_LOG_(INFO) << "TransListener_0006 Start";
373
374 // Set up destination URI with docs authority
375 string desturi = "file://docs/storage/media/100/local/files/Docs/aa1/";
376
377 // Create TransListener instance
378 auto ptr = std::make_shared<TransListener>(desturi, listener);
379
380 // Test temporary directory creation (should skip actual creation for docs)
381 int32_t ret = ptr->CreateTmpDir();
382 EXPECT_EQ(ret, E_OK); // Expect success even though no dir is created
383
384 GTEST_LOG_(INFO) << "TransListener_0006 End";
385 }
386
387 /**
388 * @tc.name: TransListener_0007
389 * @tc.desc: Test CreateTmpDir with media authority.
390 * @tc.type: FUNC
391 * @tc.require: I7TDJK
392 */
393 HWTEST_F(TransListenerTest, TransListener_0007, TestSize.Level0)
394 {
395 GTEST_LOG_(INFO) << "TransListener_0007 Start";
396
397 // Set up destination URI with media authority
398 string desturi = "file://media/storage/media/100/local/files/Media/aa1/";
399
400 // Create TransListener instance
401 auto ptr = std::make_shared<TransListener>(desturi, listener);
402
403 // Test temporary directory creation (should skip actual creation for media)
404 int32_t ret = ptr->CreateTmpDir();
405 EXPECT_EQ(ret, E_OK); // Expect success even though no dir is created
406
407 GTEST_LOG_(INFO) << "TransListener_0007 End";
408 }
409
410 /**
411 * @tc.name: TransListener_0008
412 * @tc.desc: Test CreateTmpDir with invalid path.
413 * @tc.type: FUNC
414 * @tc.require: I7TDJK
415 */
416 HWTEST_F(TransListenerTest, TransListener_0008, TestSize.Level0)
417 {
418 GTEST_LOG_(INFO) << "TransListener_0008 Start";
419
420 // Set up destination URI with invalid authority
421 string desturi = "file://invalid/storage/media/100/local/files/Invalid/aa1/";
422
423 // Create TransListener instance
424 auto ptr = std::make_shared<TransListener>(desturi, listener);
425
426 // Test temporary directory creation with invalid path
427 int32_t ret = ptr->CreateTmpDir();
428 EXPECT_EQ(ret, E_OK); // Expect failure due to invalid authority
429
430 GTEST_LOG_(INFO) << "TransListener_0008 End";
431 }
432
433 /**
434 * @tc.name: TransListener_0009
435 * @tc.desc: Test WaitForCopyResult with success result.
436 * @tc.type: FUNC
437 * @tc.require: I7TDJK
438 */
439 HWTEST_F(TransListenerTest, TransListener_0009, TestSize.Level0)
440 {
441 GTEST_LOG_(INFO) << "TransListener_0009 Start";
442
443 // Set up destination URI
444 string desturi = "file://docs/storage/media/100/local/files/Docs/aa1/";
445 sptr<TransListener> ptr(new (std::nothrow) TransListener(desturi, listener));
446
447 // Simulate successful completion in separate thread
__anon7298b69d0202() 448 std::thread t([ptr]() {
449 ptr->OnFinished("test_session"); // Trigger success callback
450 });
451
452 // Wait for operation result and verify success
453 int32_t ret = ptr->WaitForCopyResult();
454 t.join(); // Ensure thread completes
455 EXPECT_EQ(ret, DFS_SUCCESS); // Expect success status
456
457 GTEST_LOG_(INFO) << "TransListener_0009 End";
458 }
459
460 /**
461 * @tc.name: TransListener_0010
462 * @tc.desc: Test WaitForCopyResult with failed result.
463 * @tc.type: FUNC
464 * @tc.require: I7TDJK
465 */
466 HWTEST_F(TransListenerTest, TransListener_0010, TestSize.Level0)
467 {
468 GTEST_LOG_(INFO) << "TransListener_0010 Start";
469
470 // Set up destination URI
471 string desturi = "file://docs/storage/media/100/local/files/Docs/aa1/";
472 sptr<TransListener> ptr(new (std::nothrow) TransListener(desturi, listener));
473 ASSERT_TRUE(ptr != nullptr) << "ptr is nullptr!";
474
475 // Simulate failure in separate thread
__anon7298b69d0302() 476 std::thread t([ptr]() {
477 ptr->OnFailed("test_session", EIO); // Trigger failure callback
478 });
479
480 // Wait for operation result and verify failure
481 int32_t ret = ptr->WaitForCopyResult();
482 t.join(); // Ensure thread completes
483 EXPECT_EQ(ret, DFS_FAILED); // Expect failure status
484
485 GTEST_LOG_(INFO) << "TransListener_0010 End";
486 }
487
488 /**
489 * @tc.name: TransListener_0011
490 * @tc.desc: Test GetFileName with valid path.
491 * @tc.type: FUNC
492 * @tc.require: I7TDJK
493 */
494 HWTEST_F(TransListenerTest, TransListener_0011, TestSize.Level0)
495 {
496 GTEST_LOG_(INFO) << "TransListener_0011 Start";
497
498 // Set up destination URI
499 string desturi = "file://docs/storage/media/100/local/files/Docs/aa1/";
500 auto ptr = std::make_shared<TransListener>(desturi, listener);
501 ASSERT_TRUE(ptr != nullptr) << "ptr is nullptr!";
502
503 // Test filename extraction from valid path
504 string filename = ptr->GetFileName("/path/to/file.txt");
505 EXPECT_FALSE(filename.empty()); // Expect non-empty filename
506
507 GTEST_LOG_(INFO) << "TransListener_0011 End";
508 }
509
510 /**
511 * @tc.name: TransListener_0012
512 * @tc.desc: Test GetFileName with invalid path.
513 * @tc.type: FUNC
514 * @tc.require: I7TDJK
515 */
516 HWTEST_F(TransListenerTest, TransListener_0012, TestSize.Level0)
517 {
518 GTEST_LOG_(INFO) << "TransListener_0012 Start";
519
520 // Set up destination URI
521 string desturi = "file://docs/storage/media/100/local/files/Docs/aa1/";
522 auto ptr = std::make_shared<TransListener>(desturi, listener);
523
524 // Test filename extraction from invalid path
525 string filename = ptr->GetFileName("invalidpath");
526 EXPECT_TRUE(filename.empty()); // Expect empty result for invalid path
527
528 GTEST_LOG_(INFO) << "TransListener_0012 End";
529 }
530
531 /**
532 * @tc.name: TransListener_0013
533 * @tc.desc: Test GetNetworkIdFromUri with network parameter.
534 * @tc.type: FUNC
535 * @tc.require: I7TDJK
536 */
537 HWTEST_F(TransListenerTest, TransListener_0013, TestSize.Level0)
538 {
539 GTEST_LOG_(INFO) << "TransListener_0013 Start";
540
541 // Set up URI with network ID parameter
542 string desturi = "file://docs/storage/media/100/local/files/Docs/aa1/?networkid=12345";
543 auto ptr = std::make_shared<TransListener>(desturi, listener);
544
545 // Test network ID extraction
546 string networkId = ptr->GetNetworkIdFromUri(desturi);
547 EXPECT_EQ(networkId, "12345"); // Expect correct network ID extraction
548
549 GTEST_LOG_(INFO) << "TransListener_0013 End";
550 }
551
552 /**
553 * @tc.name: TransListener_0014
554 * @tc.desc: Test RmTmpDir with docs authority.
555 * @tc.type: FUNC
556 * @tc.require: I7TDJK
557 */
558 HWTEST_F(TransListenerTest, TransListener_0014, TestSize.Level0)
559 {
560 GTEST_LOG_(INFO) << "TransListener_0014 Start";
561
562 // Set up destination URI with docs authority
563 string desturi = "file://docs/storage/media/100/local/files/Docs/aa1/";
564 auto ptr = std::make_shared<TransListener>(desturi, listener);
565
566 // Test temporary directory removal (should skip for docs)
567 EXPECT_NO_THROW(ptr->RmTmpDir()); // Expect no exception
568
569 GTEST_LOG_(INFO) << "TransListener_0014 End";
570 }
571
572 /**
573 * @tc.name: TransListener_0015
574 * @tc.desc: Test RmTmpDir with non-docs authority.
575 * @tc.type: FUNC
576 * @tc.require: I7TDJK
577 */
578 HWTEST_F(TransListenerTest, TransListener_0015, TestSize.Level0)
579 {
580 GTEST_LOG_(INFO) << "TransListener_0015 Start";
581
582 // Set up destination URI with non-docs authority
583 string desturi = "file://other/storage/media/100/local/files/Other/aa1/";
584 auto ptr = std::make_shared<TransListener>(desturi, listener);
585
586 // Test temporary directory removal
587 EXPECT_NO_THROW(ptr->RmTmpDir()); // Expect no exception
588
589 GTEST_LOG_(INFO) << "TransListener_0015 End";
590 }
591 } // namespace OHOS::Storage::DistributedFile::Test