完成Tracker.java接口开发,update path

Change-Id: I8b1096af3aa3c7ebdf623905c5d47cfe72b86da2
diff --git a/src/test/java/trackertest/TrackerTest.java b/src/test/java/trackertest/TrackerTest.java
index 3c4898b..104f017 100644
--- a/src/test/java/trackertest/TrackerTest.java
+++ b/src/test/java/trackertest/TrackerTest.java
@@ -1,4 +1,6 @@
 package trackertest;
+
+import java.io.File;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.List;
@@ -19,6 +21,7 @@
 import org.junit.jupiter.api.DynamicTest;
 import org.junit.jupiter.api.TestFactory;
 
+import entity.Seed;
 import entity.TransRecord;
 import entity.TransportId;
 import entity.config;
@@ -66,6 +69,19 @@
 
     @AfterAll
     static void teardown() {
+        // 清理:删除测试过程中保存的所有 torrent 文件
+        File storageDir = new File(config.TORRENT_STORAGE_DIR);
+        if (storageDir.exists() && storageDir.isDirectory()) {
+            File[] files = storageDir.listFiles();
+            if (files != null) {
+                for (File f : files) {
+                    if (f.isFile()) {
+                        f.delete();
+                    }
+                }
+            }
+        }
+
         if (em != null && em.isOpen()) em.close();
         if (emf != null && emf.isOpen()) emf.close();
     }
@@ -298,4 +314,80 @@
             }))
             .collect(Collectors.toList());
     }
+
+    @TestFactory
+    Collection<DynamicTest> testSaveTorrent() {
+        List<String> seedIds = em.createQuery(
+            "select s.seedid from Seed s", String.class
+        ).getResultList();
+        return seedIds.stream()
+            .map(sid -> DynamicTest.dynamicTest("SaveTorrent for seed " + sid, () -> {
+                // 准备一个临时空文件
+                File temp = File.createTempFile(sid + "_test", ".torrent");
+                // 调用 SaveTorrent
+                int ret = tracker.SaveTorrent(sid, temp);
+                Assertions.assertEquals(0, ret, "SaveTorrent 应返回 0");
+
+                // 验证文件已按约定存储
+                File stored = new File(config.TORRENT_STORAGE_DIR,
+                                       sid + "_" + temp.getName());
+                Assertions.assertTrue(stored.exists(), "存储文件应存在");
+
+                // 验证数据库中 url 字段已更新
+                em.clear();
+                Seed seed = em.find(Seed.class, sid);
+                // 将 seed.url 转为 File 再取绝对路径进行比较
+                Assertions.assertEquals(
+                    stored.getAbsolutePath(),
+                    new File(seed.url).getAbsolutePath(),
+                    "Seed.url 应更新为存储路径"
+                );
+
+                // 清理测试文件
+                stored.delete();
+                temp.delete();
+            }))
+            .collect(Collectors.toList());
+    }
+
+    @TestFactory
+    Collection<DynamicTest> testGetTTorent() {
+        // 拿到所有 seedid
+        List<String> seedIds = em.createQuery(
+            "select s.seedid from Seed s", String.class
+        ).getResultList();
+        return seedIds.stream()
+            .map(sid -> DynamicTest.dynamicTest("GetTTorent for seed " + sid, () -> {
+                // 准备一个临时空文件并 SaveTorrent
+                File temp = File.createTempFile(sid + "_test", ".torrent");
+                int saveRet = tracker.SaveTorrent(sid, temp);
+                Assertions.assertEquals(0, saveRet, "SaveTorrent 应返回 0");
+
+                // 刷新上下文并取回更新后的 seed 实体
+                em.clear();
+                Seed seed = em.find(Seed.class, sid);
+                Assertions.assertNotNull(seed.url, "Seed.url 应已被更新");
+
+                // 调用 GetTTorent 并断言路径一致
+                String uid = userIds.get(0), ip = "127.0.0.1";
+                File ret = tracker.GetTTorent(sid, uid, ip);
+                File expected = new File(seed.url);
+                Assertions.assertNotNull(ret, "应返回文件对象");
+                Assertions.assertEquals(
+                    expected.getAbsolutePath(),
+                    ret.getAbsolutePath(),
+                    "返回文件路径应与Seed.url一致"
+                );
+
+                // 清理:删掉本地文件,回滚 DB url 字段,删掉 temp
+                expected.delete();
+                EntityTransaction tx = em.getTransaction();
+                tx.begin();
+                seed.url = null;
+                em.merge(seed);
+                tx.commit();
+                temp.delete();
+            }))
+            .collect(Collectors.toList());
+    }
 }