修改增加上传量下载量逻辑

Change-Id: I5dc30fd08feabca1e2acffb647966e4060d76bd3
diff --git a/src/test/java/trackertest/TrackerTest.java b/src/test/java/trackertest/TrackerTest.java
index c307ba6..2aeffdb 100644
--- a/src/test/java/trackertest/TrackerTest.java
+++ b/src/test/java/trackertest/TrackerTest.java
@@ -22,7 +22,6 @@
 
 import entity.Seed;
 import entity.TransRecord;
-import entity.TransportId;
 import entity.config;
 import tracker.Tracker;
 public class TrackerTest {
@@ -31,6 +30,7 @@
     private static List<String> userIds;
     private static Map<String, Long> originalUploads;
     private static Tracker tracker;
+    private static List<String> infoHashes;
     @BeforeAll
     static void setup() throws Exception {
         // 强制加载 MySQL 驱动,否则无法建立连接
@@ -60,6 +60,10 @@
              .getSingleResult();
             originalUploads.put(uid, up != null ? up : 0L);
         }
+        // fetch real infoHash values
+        infoHashes = em.createQuery(
+            "select s.infoHash from SeedHash s", String.class
+        ).getResultList();
         tracker = new Tracker(emf);
     }
     @AfterAll
@@ -79,116 +83,176 @@
         if (em != null && em.isOpen()) em.close();
         if (emf != null && emf.isOpen()) emf.close();
     }
+    /*
     @TestFactory
     Collection<DynamicTest> testAddUpLoad() {
         Random rnd = new Random();
+        String ih = infoHashes.get(0);
         return userIds.stream()
             .map(uid -> DynamicTest.dynamicTest("AddUpLoad for user " + uid, () -> {
-                int delta = rnd.nextInt(1000) + 1; // Ensure non-zero value
-                long before = originalUploads.get(uid);
-                
-                // AddUpLoad 前打印
-                System.out.println("Running AddUpLoad assert for user=" + uid + ", delta=" + delta);
-                Assertions.assertFalse(tracker.AddUpLoad(uid, delta), 
-                    "AddUpLoad should return false on successful operation");
-                System.out.println("AddUpLoad assert passed for user=" + uid);
-                // Clear the persistence context to ensure fresh data is fetched
-                em.clear();
-                
-                // Fetch updated value
-                Long after = em.createQuery(
-                    "select u.upload from UserPT u where u.userid = :uid", Long.class
-                ).setParameter("uid", uid)
-                 .getSingleResult();
-                // upload 值断言前打印
-                System.out.println("Running upload-value assert for user=" + uid);
-                Assertions.assertEquals(before + delta, after, 
-                    "Upload value should be increased by " + delta);
-                System.out.println("Upload-value assert passed for user=" + uid);
-                
-                // ReduceUpLoad 前打印
-                System.out.println("Running ReduceUpLoad assert for user=" + uid + ", delta=" + delta);
-                Assertions.assertFalse(tracker.ReduceUpLoad(uid, delta),
-                    "ReduceUpLoad should return false on successful operation");
-                System.out.println("ReduceUpLoad assert passed for user=" + uid);
+                EntityTransaction tx = em.getTransaction();
+                tx.begin();
+                try {
+                    // 获取该用户当前的总上传量
+                    Long currentUserUpload = em.createQuery(
+                        "SELECT COALESCE(u.upload,0) FROM UserPT u WHERE u.userid = :uid", Long.class
+                    ).setParameter("uid", uid).getSingleResult();
+                    
+                    // 获取该用户在该种子上的当前上传量
+                    Long currentSeedUpload = em.createQuery(
+                        "SELECT COALESCE(SUM(t.upload),0) FROM TransRecord t WHERE t.uploaduserid = :uid AND t.seedid = " +
+                        "(SELECT s.seedId FROM SeedHash s WHERE s.infoHash = :ih)", Long.class
+                    ).setParameter("uid", uid).setParameter("ih", ih).getSingleResult();
+                    
+                    int delta = rnd.nextInt(1000) + 1;
+                    long newSeedTotal = currentSeedUpload + delta;
+                    
+                    Assertions.assertFalse(tracker.AddUpLoad(uid, (int)newSeedTotal, ih),
+                        "AddUpLoad should return false on successful operation");
+                    em.clear();
+
+                    // commit & restart test TX so we see the data that tracker committed
+                    tx.commit();
+                    em.clear();
+                    tx.begin();
+
+                    // 验证 UserPT.upload 是否等于 TransRecord 表中该用户的实际总和
+                    Long actualTransRecordSum = em.createQuery(
+                        "SELECT COALESCE(SUM(t.upload),0) FROM TransRecord t WHERE t.uploaduserid = :uid", Long.class
+                    ).setParameter("uid", uid).getSingleResult();
+                    
+                    Long userPTUpload = em.createQuery(
+                        "SELECT u.upload FROM UserPT u WHERE u.userid = :uid", Long.class
+                    ).setParameter("uid", uid).getSingleResult();
+                    
+                    Assertions.assertEquals(actualTransRecordSum, userPTUpload, 
+                        "UserPT.upload should equal sum of TransRecord.upload for this user");
+                    Assertions.assertEquals(currentUserUpload + delta, userPTUpload.longValue(),
+                        "User total upload should increase by delta");
+                } finally {
+                    tx.rollback();
+                    em.clear();
+                }
             }))
             .collect(Collectors.toList());
     }
-    @TestFactory
-    Collection<DynamicTest> testReduceUpLoad() {
-        Random rnd = new Random();
-        return userIds.stream()
-            .map(uid -> DynamicTest.dynamicTest("ReduceUpLoad for user " + uid, () -> {
-                long before = originalUploads.get(uid);
-                int max = (int)Math.min(before, 1000);
-                int delta = max > 0 ? rnd.nextInt(max) + 1 : 0;
-                if (delta == 0) return;  // 无可减量时跳过
-                // ReduceUpLoad 前打印
-                System.out.println("Running ReduceUpLoad assert for user=" + uid + ", delta=" + delta);
-                Assertions.assertFalse(tracker.ReduceUpLoad(uid, delta));
-                System.out.println("ReduceUpLoad assert passed for user=" + uid);
-                Long after = em.createQuery(
-                    "select u.upload from UserPT u where u.userid = :uid", Long.class
-                ).setParameter("uid", uid)
-                 .getSingleResult();
-                // 减少后值断言前打印
-                System.out.println("Running post-reduce-value assert for user=" + uid);
-                Assertions.assertEquals(before - delta, after);
-                System.out.println("Post-reduce-value assert passed for user=" + uid);
-                // 回滚 AddUpLoad 前打印
-                System.out.println("Running rollback AddUpLoad assert for user=" + uid + ", delta=" + delta);
-                Assertions.assertFalse(tracker.AddUpLoad(uid, delta));
-                System.out.println("Rollback AddUpLoad assert passed for user=" + uid);
-            }))
-            .collect(Collectors.toList());
-    }
+    */
+   
+   
+    // @TestFactory
+    // Collection<DynamicTest> testReduceUpLoad() {
+    //     Random rnd = new Random();
+    //     String ih = infoHashes.get(0);  // use same infoHash as other tests
+    //     return userIds.stream()
+    //         .map(uid -> DynamicTest.dynamicTest("ReduceUpLoad for user " + uid, () -> {
+    //             long before = originalUploads.get(uid);
+    //             int max = (int)Math.min(before, 1000);
+    //             int delta = max > 0 ? rnd.nextInt(max) + 1 : 0;
+    //             if (delta == 0) return;  // 无可减量时跳过
+    //             // ReduceUpLoad 前打印
+    //             System.out.println("Running ReduceUpLoad assert for user=" + uid + ", delta=" + delta);
+    //             Assertions.assertFalse(tracker.ReduceUpLoad(uid, delta));
+    //             System.out.println("ReduceUpLoad assert passed for user=" + uid);
+    //             Long after = em.createQuery(
+    //                 "select u.upload from UserPT u where u.userid = :uid", Long.class
+    //             ).setParameter("uid", uid)
+    //              .getSingleResult();
+    //             // 减少后值断言前打印
+    //             System.out.println("Running post-reduce-value assert for user=" + uid);
+    //             Assertions.assertEquals(before - delta, after);
+    //             System.out.println("Post-reduce-value assert passed for user=" + uid);
+    //             // 回滚 AddUpLoad 前打印
+    //             System.out.println("Running rollback AddUpLoad assert for user=" + uid + ", delta=" + delta);
+    //             Assertions.assertFalse(tracker.AddUpLoad(uid, (int)before, ih));
+    //             System.out.println("Rollback AddUpLoad assert passed for user=" + uid);
+    //         }))
+    //         .collect(Collectors.toList());
+    // }
+    
+    /*
     @TestFactory
     Collection<DynamicTest> testAddDownload() {
         Random rnd = new Random();
+        String ih = infoHashes.get(0);
         return userIds.stream()
             .map(uid -> DynamicTest.dynamicTest("AddDownload for user " + uid, () -> {
-                int delta = rnd.nextInt(1000) + 1;
-                Long before = em.createQuery(
-                    "select u.download from UserPT u where u.userid = :uid", Long.class
-                ).setParameter("uid", uid).getSingleResult();
-                before = before != null ? before : 0L;
-                System.out.println("Running AddDownload assert for user=" + uid + ", delta=" + delta);
-                Assertions.assertFalse(tracker.AddDownload(uid, delta),
-                    "AddDownload should return false on successful operation");
-                em.clear();
-                Long after = em.createQuery(
-                    "select u.download from UserPT u where u.userid = :uid", Long.class
-                ).setParameter("uid", uid).getSingleResult();
-                System.out.println("Running download-value assert for user=" + uid);
-                Assertions.assertEquals(before + delta, after,
-                    "Download value should be increased by " + delta);
-                System.out.println("Running rollback ReduceDownload assert for user=" + uid + ", delta=" + delta);
-                Assertions.assertFalse(tracker.ReduceDownload(uid, delta),
-                    "Rollback ReduceDownload should return false");
+                EntityTransaction tx = em.getTransaction();
+                tx.begin();
+                try {
+                    // 获取该用户当前的总下载量
+                    Long currentUserDownload = em.createQuery(
+                        "SELECT COALESCE(u.download,0) FROM UserPT u WHERE u.userid = :uid", Long.class
+                    ).setParameter("uid", uid).getSingleResult();
+                    
+                    // 获取该用户在该种子上的当前下载量
+                    Long currentSeedDownload = em.createQuery(
+                        "SELECT COALESCE(SUM(t.download),0) FROM TransRecord t WHERE t.downloaduserid = :uid AND t.seedid = " +
+                        "(SELECT s.seedId FROM SeedHash s WHERE s.infoHash = :ih)", Long.class
+                    ).setParameter("uid", uid).setParameter("ih", ih).getSingleResult();
+                    
+                    int delta = rnd.nextInt(1000) + 1;
+                    long newSeedTotal = currentSeedDownload + delta;
+                    
+                    Assertions.assertFalse(tracker.AddDownload(uid, (int)newSeedTotal, ih),
+                        "AddDownload should return false on successful operation");
+                    em.clear();
+
+                    // commit & restart test TX so we see the data that tracker committed
+                    tx.commit();
+                    em.clear();
+                    tx.begin();
+
+                    // 验证 UserPT.download 是否等于 TransRecord 表中该用户的实际总和
+                    Long actualTransRecordSum = em.createQuery(
+                        "SELECT COALESCE(SUM(t.download),0) FROM TransRecord t WHERE t.downloaduserid = :uid", Long.class
+                    ).setParameter("uid", uid).getSingleResult();
+                    
+                    Long userPTDownload = em.createQuery(
+                        "SELECT u.download FROM UserPT u WHERE u.userid = :uid", Long.class
+                    ).setParameter("uid", uid).getSingleResult();
+                    
+                    Assertions.assertEquals(actualTransRecordSum, userPTDownload,
+                        "UserPT.download should equal sum of TransRecord.download for this user");
+                    
+                    // 验证用户总下载量增加了预期的delta
+                    Assertions.assertEquals(currentUserDownload + delta, userPTDownload.longValue(),
+                        "User total download should increase by delta");
+                } finally {
+                    tx.rollback();
+                    em.clear();
+                }
             }))
             .collect(Collectors.toList());
     }
+    */
     @TestFactory
     Collection<DynamicTest> testReduceDownload() {
         Random rnd = new Random();
         return userIds.stream()
             .map(uid -> DynamicTest.dynamicTest("ReduceDownload for user " + uid, () -> {
                 Long before = em.createQuery(
-                    "select u.download from UserPT u where u.userid = :uid", Long.class
+                    "SELECT u.download FROM UserPT u WHERE u.userid = :uid", Long.class
                 ).setParameter("uid", uid).getSingleResult();
                 before = before != null ? before : 0L;
                 int max = before.intValue();
                 int delta = max > 0 ? rnd.nextInt(max) + 1 : 0;
                 if (delta == 0) return;
+                
                 System.out.println("Running ReduceDownload assert for user=" + uid + ", delta=" + delta);
                 Assertions.assertFalse(tracker.ReduceDownload(uid, delta));
+                em.clear();
+                
                 Long after = em.createQuery(
-                    "select u.download from UserPT u where u.userid = :uid", Long.class
+                    "SELECT u.download FROM UserPT u WHERE u.userid = :uid", Long.class
                 ).setParameter("uid", uid).getSingleResult();
                 System.out.println("Running post-reduce-download-value assert for user=" + uid);
-                Assertions.assertEquals(before - delta, after);
+                Assertions.assertEquals(before - delta, after.longValue());
+                
                 System.out.println("Running rollback AddDownload assert for user=" + uid + ", delta=" + delta);
-                Assertions.assertFalse(tracker.AddDownload(uid, delta));
+                // 使用有效的 infoHash
+                Assertions.assertFalse(
+                    tracker.AddDownload(uid, before.intValue(), infoHashes.get(0))
+                );
             }))
             .collect(Collectors.toList());
     }
@@ -209,7 +273,7 @@
                     "select u.magic from UserPT u where u.userid = :uid", Integer.class
                 ).setParameter("uid", uid).getSingleResult();
                 System.out.println("Running magic-value assert for user=" + uid);
-                Assertions.assertEquals(before + delta, after.intValue());
+                Assertions.assertEquals((Integer)(before + delta), after);
                 System.out.println("Running rollback ReduceMagic assert for user=" + uid + ", delta=" + delta);
                 Assertions.assertFalse(tracker.ReduceMagic(uid, delta));
             }))
@@ -229,11 +293,12 @@
                 if (delta == 0) return;
                 System.out.println("Running ReduceMagic assert for user=" + uid + ", delta=" + delta);
                 Assertions.assertFalse(tracker.ReduceMagic(uid, delta));
+                em.clear();
                 Integer after = em.createQuery(
                     "select u.magic from UserPT u where u.userid = :uid", Integer.class
                 ).setParameter("uid", uid).getSingleResult();
                 System.out.println("Running post-reduce-magic-value assert for user=" + uid);
-                Assertions.assertEquals(before - delta, after.intValue());
+                Assertions.assertEquals((Integer)(before - delta), after);
                 System.out.println("Running rollback AddMagic assert for user=" + uid + ", delta=" + delta);
                 Assertions.assertFalse(tracker.AddMagic(uid, delta));
             }))
@@ -262,22 +327,21 @@
                 rd.uploaduserid = uploaderId;
                 rd.downloaduserid = downloaderId;
                 rd.seedid = seedId;
-                rd.upload = rnd.nextInt(10000);
-                rd.download = rnd.nextInt(10000);
-                rd.maxupload = rd.upload + rnd.nextInt(10000);
-                rd.maxdownload = rd.download + rnd.nextInt(10000);
+                rd.upload = (long) rnd.nextInt(10000);
+                rd.download = (long) rnd.nextInt(10000);
+                rd.maxupload = rd.upload + (long) rnd.nextInt(10000);
+                rd.maxdownload = rd.download + (long) rnd.nextInt(10000);
                 // 调用待测方法
                 int ret = tracker.AddRecord(rd);
                 Assertions.assertTrue(ret > 0, "返回值应为新记录主键");
                 // 验证已插入
-                TransportId pk = new TransportId(taskId, uploaderId, downloaderId);
-                TransRecord fetched = em.find(TransRecord.class, pk);
-                Assertions.assertNotNull(fetched, "应查询到新增的 TransRecord");
-                // 清理:删除测试记录
-                EntityTransaction tx = em.getTransaction();
-                tx.begin();
-                em.remove(fetched);
-                tx.commit();
+                TransRecord fetched = em.find(TransRecord.class, rd.taskid);
+
+                Assertions.assertNotNull(fetched, "查询应返回非空实体");
+                Assertions.assertEquals(rd.upload, fetched.upload);
+                Assertions.assertEquals(rd.download, fetched.download);
+                Assertions.assertEquals(rd.maxupload, fetched.maxupload);
+                Assertions.assertEquals(rd.maxdownload, fetched.maxdownload);
             }))
             .collect(Collectors.toList());
     }
@@ -349,4 +413,5 @@
             }))
             .collect(Collectors.toList());
     }
-}
\ No newline at end of file
+    
+}