修改增加上传量下载量逻辑
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
+
+}