blob: 07dc979c34b6dbd9780390312222c2727e7da95a [file] [log] [blame]
root0d8b11f2025-05-15 14:10:43 +00001package viptest;
2
root0dbc9812025-05-19 04:41:57 +00003import java.util.Arrays;
4import java.util.Collection;
5import java.util.HashMap;
6import java.util.Random;
7import java.util.UUID;
8import java.util.stream.Collectors;
9import java.util.stream.IntStream;
10
11import javax.persistence.EntityManager;
12import javax.persistence.EntityManagerFactory;
13import javax.persistence.EntityTransaction;
14import javax.persistence.Persistence;
15
16import org.junit.jupiter.api.AfterAll;
17import org.junit.jupiter.api.Assertions;
18import org.junit.jupiter.api.BeforeAll;
19import org.junit.jupiter.api.DynamicTest;
20import org.junit.jupiter.api.TestFactory;
21
22import entity.Seed;
23import entity.VipSeed;
24import vip.Vip;
25
root0d8b11f2025-05-15 14:10:43 +000026public class vipsystest {
root0dbc9812025-05-19 04:41:57 +000027 private static EntityManagerFactory emf;
28 private static EntityManager em;
29 private static Vip vip;
30 private static final int TEST_CASES = 10;
31
32 @BeforeAll
33 public static void setup() throws Exception {
34 Class.forName("com.mysql.cj.jdbc.Driver");
35 java.util.Map<String,Object> props = new HashMap<>();
36 String jdbcUrl = String.format(
37 "jdbc:mysql://%s/%s?useSSL=false&serverTimezone=UTC",
38 entity.config.SqlURL, entity.config.TestDatabase);
39 props.put("javax.persistence.jdbc.url", jdbcUrl);
40 props.put("javax.persistence.jdbc.user", entity.config.SqlUsername);
41 props.put("javax.persistence.jdbc.password", entity.config.SqlPassword);
42 props.put("javax.persistence.jdbc.driver", "com.mysql.cj.jdbc.Driver");
43 emf = Persistence.createEntityManagerFactory("myPersistenceUnit", props);
44 em = emf.createEntityManager();
45 vip = new Vip();
46 java.lang.reflect.Field f = Vip.class.getDeclaredField("entitymanager");
47 f.setAccessible(true);
48 f.set(vip, em);
49 }
50
51 @AfterAll
52 public static void teardown() {
53 if (em != null && em.isOpen()) em.close();
54 if (emf != null && emf.isOpen()) emf.close();
55 }
56
57 @TestFactory
58 Collection<DynamicTest> testAddFarmerNumber() {
59 Random rnd = new Random();
60 return IntStream.range(0, TEST_CASES)
61 .mapToObj(i -> DynamicTest.dynamicTest("AddFarmerNumber test #" + i, () -> {
62 EntityTransaction tx = em.getTransaction();
63 tx.begin();
64 String userId = "testuser-" + UUID.randomUUID();
65 if (userId.length() > 36) userId = userId.substring(0, 36);
66 String seedid = "testseed-" + UUID.randomUUID();
67 try {
68 // 插入User
69 entity.User user = new entity.User();
70 user.userid = userId;
71 user.email = userId + "@example.com";
72 user.username = userId;
73 user.password = "pwd";
74 user.sex = "m";
75 user.school = "school";
76 user.pictureurl = null;
77 user.profile = null;
78 user.accountstate = false;
79 user.invitetimes = 5;
80
81 // 插入UserPT
82 entity.UserPT userPT = new entity.UserPT();
83 userPT.userid = userId;
84 userPT.magic = 0;
85 userPT.upload = 0L;
86 userPT.download = 0L;
87 userPT.share = 0.0;
88 userPT.farmurl = null;
89 userPT.viptime = 0;
90 userPT.user = user;
rhj46f62c42025-06-06 23:24:10 +080091 // user.userPT = userPT;
root0dbc9812025-05-19 04:41:57 +000092 em.persist(user);
93 em.persist(userPT);
94 // 插入Seed
95 entity.Seed seed = new entity.Seed();
96 seed.seedid = seedid;
97 seed.seeduserid = userId;
98 seed.faketime = 0;
99 seed.lastfakecheck = new java.util.Date();
100 seed.outurl = "http://example.com/seed";
101 seed.title = "title";
102 seed.subtitle = "subtitle";
103 seed.seedsize = "100MB";
104 seed.seedtag = "tag";
105 seed.downloadtimes = 0;
106 seed.url = "http://download.com/seed";
107 em.persist(seed);
108 // 插入VipSeed
109 VipSeed vs = new VipSeed();
110 vs.seedid = seedid;
111 vs.farmernumber = rnd.nextInt(10) + 1;
112 vs.seedercount = 0;
113 vs.rewardmagic = 0;
114 vs.stopcaching = 0;
115 vs.bonus = 0;
116 vs.cachestate = false;
117 vs.seed = seed;
118 em.persist(vs);
119 em.flush();
120 int delta = rnd.nextInt(100) + 1;
121 Integer before = em.createQuery(
122 "select v.farmernumber from VipSeed v where v.seedid = :sid", Integer.class)
123 .setParameter("sid", seedid).getSingleResult();
124 int ret = vip.AddFarmerNumber(delta, seedid);
125 Assertions.assertEquals(0, ret, "AddFarmerNumber 应返回0");
126 em.flush();
127 em.clear();
128 Integer after = em.createQuery(
129 "select v.farmernumber from VipSeed v where v.seedid = :sid", Integer.class)
130 .setParameter("sid", seedid).getSingleResult();
131 Assertions.assertEquals(Integer.valueOf(before + delta), after, "farmernumber 应增加");
132 } finally {
133 tx.rollback();
134 }
135 })).collect(Collectors.toList());
136 }
137
138 @TestFactory
139 Collection<DynamicTest> testReduceFarmerNumber() {
140 Random rnd = new Random();
141 return IntStream.range(0, TEST_CASES)
142 .mapToObj(i -> DynamicTest.dynamicTest("ReduceFarmerNumber test #" + i, () -> {
143 EntityTransaction tx = em.getTransaction();
144 tx.begin();
145 String userId = "testuser-" + UUID.randomUUID();
146 if (userId.length() > 36) userId = userId.substring(0, 36);
147 String seedid = "testseed-" + UUID.randomUUID();
148 try {
149 entity.User user = new entity.User();
150 user.userid = userId;
151 user.email = userId + "@example.com";
152 user.username = userId;
153 user.password = "pwd";
154 user.sex = "m";
155 user.school = "school";
156 user.pictureurl = null;
157 user.profile = null;
158 user.accountstate = false;
159 user.invitetimes = 5;
160
161 entity.UserPT userPT = new entity.UserPT();
162 userPT.userid = userId;
163 userPT.magic = 0;
164 userPT.upload = 0L;
165 userPT.download = 0L;
166 userPT.share = 0.0;
167 userPT.farmurl = null;
168 userPT.viptime = 0;
169 userPT.user = user;
rhj46f62c42025-06-06 23:24:10 +0800170 // user.userPT = userPT;
root0dbc9812025-05-19 04:41:57 +0000171 em.persist(user);
172 em.persist(userPT);
173 entity.Seed seed = new entity.Seed();
174 seed.seedid = seedid;
175 seed.seeduserid = userId;
176 seed.faketime = 0;
177 seed.lastfakecheck = new java.util.Date();
178 seed.outurl = "http://example.com/seed";
179 seed.title = "title";
180 seed.subtitle = "subtitle";
181 seed.seedsize = "100MB";
182 seed.seedtag = "tag";
183 seed.downloadtimes = 0;
184 seed.url = "http://download.com/seed";
185 em.persist(seed);
186 VipSeed vs = new VipSeed();
187 vs.seedid = seedid;
188 vs.farmernumber = rnd.nextInt(10) + 5;
189 vs.seedercount = 0;
190 vs.rewardmagic = 0;
191 vs.stopcaching = 0;
192 vs.bonus = 0;
193 vs.cachestate = false;
194 vs.seed = seed;
195 em.persist(vs);
196 em.flush();
197 Integer before = em.createQuery(
198 "select v.farmernumber from VipSeed v where v.seedid = :sid", Integer.class)
199 .setParameter("sid", seedid).getSingleResult();
200 int max = Math.max(before, 0);
201 int delta = max > 0 ? rnd.nextInt(max) + 1 : 0;
202 if (delta == 0) return;
203 int ret = vip.ReduceFarmerNumber(delta, seedid);
204 Assertions.assertEquals(0, ret, "ReduceFarmerNumber 应返回0");
205 em.flush();
206 em.clear();
207 Integer after = em.createQuery(
208 "select v.farmernumber from VipSeed v where v.seedid = :sid", Integer.class)
209 .setParameter("sid", seedid).getSingleResult();
210 Assertions.assertEquals(Integer.valueOf(before - delta), after, "farmernumber 应减少");
211 } finally {
212 tx.rollback();
213 }
214 })).collect(Collectors.toList());
215 }
216
217 @TestFactory
218 Collection<DynamicTest> testRemoveSeed() {
219 return IntStream.range(0, TEST_CASES)
220 .mapToObj(i -> DynamicTest.dynamicTest("RemoveSeed test #" + i, () -> {
221 EntityTransaction tx = em.getTransaction();
222 tx.begin();
223 String userId = "testuser-" + UUID.randomUUID();
224 if (userId.length() > 36) userId = userId.substring(0, 36);
225 String seedid = "testseed-" + UUID.randomUUID();
226 try {
227 entity.User user = new entity.User();
228 user.userid = userId;
229 user.email = userId + "@example.com";
230 user.username = userId;
231 user.password = "pwd";
232 user.sex = "m";
233 user.school = "school";
234 user.pictureurl = null;
235 user.profile = null;
236 user.accountstate = false;
237 user.invitetimes = 5;
238
239 entity.UserPT userPT = new entity.UserPT();
240 userPT.userid = userId;
241 userPT.magic = 0;
242 userPT.upload = 0L;
243 userPT.download = 0L;
244 userPT.share = 0.0;
245 userPT.farmurl = null;
246 userPT.viptime = 0;
247 userPT.user = user;
rhj46f62c42025-06-06 23:24:10 +0800248 // user.userPT = userPT;
root0dbc9812025-05-19 04:41:57 +0000249 em.persist(user);
250 em.persist(userPT);
251 entity.Seed seed = new entity.Seed();
252 seed.seedid = seedid;
253 seed.seeduserid = userId;
254 seed.faketime = 0;
255 seed.lastfakecheck = new java.util.Date();
256 seed.outurl = "http://example.com/seed";
257 seed.title = "title";
258 seed.subtitle = "subtitle";
259 seed.seedsize = "100MB";
260 seed.seedtag = "tag";
261 seed.downloadtimes = 0;
262 seed.url = "http://download.com/seed";
263 em.persist(seed);
264 VipSeed vs = new VipSeed();
265 vs.seedid = seedid;
266 vs.farmernumber = 5;
267 vs.seedercount = 0;
268 vs.rewardmagic = 0;
269 vs.stopcaching = 0;
270 vs.bonus = 0;
271 vs.cachestate = false;
272 vs.seed = seed;
273 em.persist(vs);
274 em.flush();
275 VipSeed before = em.find(VipSeed.class, seedid);
276 Assertions.assertNotNull(before, "VipSeed 应存在");
277 int ret = vip.RemoveSeed(seedid);
278 Assertions.assertEquals(0, ret, "RemoveSeed 应返回0");
279 em.flush();
280 em.clear();
281 VipSeed after = em.find(VipSeed.class, seedid);
282 Assertions.assertNull(after, "VipSeed 应被移除");
283 } finally {
284 tx.rollback();
285 }
286 })).collect(Collectors.toList());
287 }
288
289 @TestFactory
290 Collection<DynamicTest> testCheckSeed() {
291 return IntStream.range(0, TEST_CASES)
292 .mapToObj(i -> DynamicTest.dynamicTest("CheckSeed test #" + i, () -> {
293 EntityTransaction tx = em.getTransaction();
294 tx.begin();
295 String userId = "testuser-" + UUID.randomUUID();
296 if (userId.length() > 36) userId = userId.substring(0, 36);
297 String seedid = "testseed-" + UUID.randomUUID();
298 try {
299 entity.User user = new entity.User();
300 user.userid = userId;
301 user.email = userId + "@example.com";
302 user.username = userId;
303 user.password = "pwd";
304 user.sex = "m";
305 user.school = "school";
306 user.pictureurl = null;
307 user.profile = null;
308 user.accountstate = false;
309 user.invitetimes = 5;
310
311 entity.UserPT userPT = new entity.UserPT();
312 userPT.userid = userId;
313 userPT.magic = 0;
314 userPT.upload = 0L;
315 userPT.download = 0L;
316 userPT.share = 0.0;
317 userPT.farmurl = null;
318 userPT.viptime = 0;
319 userPT.user = user;
rhj46f62c42025-06-06 23:24:10 +0800320 // user.userPT = userPT;
root0dbc9812025-05-19 04:41:57 +0000321 em.persist(user);
322 em.persist(userPT);
323 entity.Seed seed = new entity.Seed();
324 seed.seedid = seedid;
325 seed.seeduserid = userId;
326 seed.faketime = 0;
327 seed.lastfakecheck = new java.util.Date();
328 seed.outurl = "http://example.com/seed";
329 seed.title = "title";
330 seed.subtitle = "subtitle";
331 seed.seedsize = "100MB";
332 seed.seedtag = "tag";
333 seed.downloadtimes = 0;
334 seed.url = "http://download.com/seed";
335 em.persist(seed);
336 VipSeed vs = new VipSeed();
337 vs.seedid = seedid;
338 vs.farmernumber = 1000;
339 vs.seedercount = 0;
340 vs.rewardmagic = 0;
341 vs.stopcaching = 0;
342 vs.bonus = 0;
343 vs.cachestate = false;
344 vs.seed = seed;
345 em.persist(vs);
346 em.flush();
347 VipSeed vipSeed = em.find(VipSeed.class, seedid);
348 Assertions.assertNotNull(vipSeed, "VipSeed 应存在");
349 vip.CheckSeed();
350 em.flush();
351 em.clear();
352 VipSeed after = em.find(VipSeed.class, seedid);
353 Assertions.assertNull(after, "CheckSeed后超限VipSeed应被移除");
354 } finally {
355 tx.rollback();
356 }
357 })).collect(Collectors.toList());
358 }
359
360 @TestFactory
361 Collection<DynamicTest> testGetSeedToPlant() {
362 return IntStream.range(0, TEST_CASES)
363 .mapToObj(i -> DynamicTest.dynamicTest("GetSeedToPlant test #" + i, () -> {
364 EntityTransaction tx = em.getTransaction();
365 tx.begin();
366 String userId = "testuser-" + UUID.randomUUID();
367 if (userId.length() > 36) userId = userId.substring(0, 36);
368 String seedid = "testseed-" + UUID.randomUUID();
369 try {
370 entity.User user = new entity.User();
371 user.userid = userId;
372 user.email = userId + "@example.com";
373 user.username = userId;
374 user.password = "pwd";
375 user.sex = "m";
376 user.school = "school";
377 user.pictureurl = null;
378 user.profile = null;
379 user.accountstate = false;
380 user.invitetimes = 5;
381
382 entity.UserPT userPT = new entity.UserPT();
383 userPT.userid = userId;
384 userPT.magic = 0;
385 userPT.upload = 0L;
386 userPT.download = 0L;
387 userPT.share = 0.0;
388 userPT.farmurl = null;
389 userPT.viptime = 0;
390 userPT.user = user;
rhj46f62c42025-06-06 23:24:10 +0800391 // user.userPT = userPT;
root0dbc9812025-05-19 04:41:57 +0000392 em.persist(user);
393 em.persist(userPT);
394 entity.Seed seed = new entity.Seed();
395 seed.seedid = seedid;
396 seed.seeduserid = userId;
397 seed.faketime = 0;
398 seed.lastfakecheck = new java.util.Date();
399 seed.outurl = "http://example.com/seed";
400 seed.title = "title";
401 seed.subtitle = "subtitle";
402 seed.seedsize = "100MB";
403 seed.seedtag = "tag";
404 seed.downloadtimes = 0;
405 seed.url = "http://download.com/seed";
406 em.persist(seed);
407 VipSeed vs = new VipSeed();
408 vs.seedid = seedid;
409 vs.farmernumber = 5;
410 vs.seedercount = 0;
411 vs.rewardmagic = 0;
412 vs.stopcaching = 0;
413 vs.bonus = 0;
414 vs.cachestate = false;
415 vs.seed = seed;
416 em.persist(vs);
417 em.flush();
418 VipSeed vipSeed = em.find(VipSeed.class, seedid);
419 Assertions.assertNotNull(vipSeed, "VipSeed 应存在");
420 Seed[] seeds = vip.GetSeedToPlant();
421 boolean found = Arrays.stream(seeds).anyMatch(s -> s.seedid.equals(seedid));
422 Assertions.assertTrue(found, "GetSeedToPlant 返回的种子应包含当前seedid");
423 } finally {
424 tx.rollback();
425 }
426 })).collect(Collectors.toList());
427 }
428
429 @TestFactory
430 Collection<DynamicTest> testGetTTorent() {
431 return IntStream.range(0, TEST_CASES)
432 .mapToObj(i -> DynamicTest.dynamicTest("GetTTorent test #" + i, () -> {
433 EntityTransaction tx = em.getTransaction();
434 tx.begin();
435 String userId = "testuser-" + UUID.randomUUID();
436 if (userId.length() > 36) userId = userId.substring(0, 36);
437 String seedid = "testseed-" + UUID.randomUUID();
438 String ip = "127.0.0." + i;
439 java.io.File tempFile = null;
440 try {
441 // 正常情况:用户、种子、文件都存在
442 entity.User user = new entity.User();
443 user.userid = userId;
444 user.email = userId + "@example.com";
445 user.username = userId;
446 user.password = "pwd";
447 user.sex = "m";
448 user.school = "school";
449 user.pictureurl = null;
450 user.profile = null;
451 user.accountstate = false;
452 user.invitetimes = 5;
453 entity.UserPT userPT = new entity.UserPT();
454 userPT.userid = userId;
455 userPT.magic = 0;
456 userPT.upload = 0L;
457 userPT.download = 0L;
458 userPT.share = 0.0;
459 userPT.farmurl = null;
460 userPT.viptime = 0;
461 userPT.user = user;
rhj46f62c42025-06-06 23:24:10 +0800462 // user.userPT = userPT;
root0dbc9812025-05-19 04:41:57 +0000463 em.persist(user);
464 em.persist(userPT);
465 entity.Seed seed = new entity.Seed();
466 seed.seedid = seedid;
467 seed.seeduserid = userId;
468 seed.faketime = 0;
469 seed.lastfakecheck = new java.util.Date();
470 seed.outurl = "http://example.com/seed";
471 seed.title = "title";
472 seed.subtitle = "subtitle";
473 seed.seedsize = "100MB";
474 seed.seedtag = "tag";
475 seed.downloadtimes = 0;
476 em.persist(seed);
477 VipSeed vs = new VipSeed();
478 vs.seedid = seedid;
479 vs.farmernumber = 1;
480 vs.seedercount = 0;
481 vs.rewardmagic = 0;
482 vs.stopcaching = 0;
483 vs.bonus = 0;
484 vs.cachestate = false;
485 vs.seed = seed;
486 em.persist(vs);
487 em.flush();
488 tempFile = java.io.File.createTempFile(seedid + "_test", ".torrent");
489 seed.url = tempFile.getAbsolutePath();
490 em.merge(seed);
491 em.flush();
492 org.apache.commons.lang3.tuple.Pair<java.io.File, Integer> result = vip.GetTTorent(seedid, userId, ip);
493 Assertions.assertNotNull(result, "GetTTorent 返回结果不应为null");
494 Assertions.assertEquals(0, result.getRight().intValue(), "GetTTorent 应返回0");
495 Assertions.assertNotNull(result.getLeft(), "GetTTorent 应返回文件对象");
496 Assertions.assertEquals(tempFile.getAbsolutePath(), result.getLeft().getAbsolutePath(), "文件路径应一致");
497
498 // 情况2:种子不存在
499 org.apache.commons.lang3.tuple.Pair<java.io.File, Integer> result2 = vip.GetTTorent("notexist-seed", userId, ip);
500 Assertions.assertNotNull(result2, "种子不存在时返回不应为null");
501 Assertions.assertNull(result2.getLeft(), "种子不存在时文件应为null");
502 Assertions.assertNotEquals(0, result2.getRight().intValue(), "种子不存在应返回非0");
503
504 // 情况3:用户不存在
505 org.apache.commons.lang3.tuple.Pair<java.io.File, Integer> result3 = vip.GetTTorent(seedid, "notexist-user", ip);
506 Assertions.assertNotNull(result3, "用户不存在时返回不应为null");
507 Assertions.assertNull(result3.getLeft(), "用户不存在时文件应为null");
508 Assertions.assertNotEquals(0, result3.getRight().intValue(), "用户不存在应返回非0");
509
510 // 情况4:文件路径不存在
511 seed.url = null;
512 em.merge(seed);
513 em.flush();
514 org.apache.commons.lang3.tuple.Pair<java.io.File, Integer> result4 = vip.GetTTorent(seedid, userId, ip);
515 Assertions.assertNotNull(result4, "文件不存在时返回不应为null");
516 Assertions.assertNull(result4.getLeft(), "文件不存在时文件应为null");
517 Assertions.assertNotEquals(0, result4.getRight().intValue(), "文件不存在应返回非0");
518
519 // 情况5:参数为空
520 org.apache.commons.lang3.tuple.Pair<java.io.File, Integer> result5 = vip.GetTTorent(null, userId, ip);
521 Assertions.assertNotNull(result5, "参数为空时返回不应为null");
522 Assertions.assertNull(result5.getLeft(), "参数为空时文件应为null");
523 Assertions.assertNotEquals(0, result5.getRight().intValue(), "参数为空应返回非0");
524 } finally {
525 tx.rollback();
526 if (tempFile != null && tempFile.exists()) tempFile.delete();
527 }
528 })).collect(Collectors.toList());
529 }
530
531 @TestFactory
532 Collection<DynamicTest> testKeepSeed() {
533 return IntStream.range(0, TEST_CASES)
534 .mapToObj(i -> DynamicTest.dynamicTest("KeepSeed test #" + i, () -> {
535 EntityTransaction tx = em.getTransaction();
536 tx.begin();
537 String userId = "user-" + UUID.randomUUID();
538 if (userId.length() > 36) userId = userId.substring(0, 36);
539 String seedid = "testseed-" + UUID.randomUUID();
540 try {
541 // 插入User
542 entity.User user = new entity.User();
543 user.userid = userId;
544 user.email = userId + "@example.com";
545 user.username = userId;
546 user.password = "pwd";
547 user.sex = "m";
548 user.school = "school";
549 user.pictureurl = null;
550 user.profile = null;
551 user.accountstate = false;
552 user.invitetimes = 5;
553 // 插入UserPT
554 entity.UserPT userPT = new entity.UserPT();
555 userPT.userid = userId;
556 userPT.magic = 0;
557 userPT.upload = 0L;
558 userPT.download = 0L;
559 userPT.share = 0.0;
560 userPT.farmurl = null;
561 userPT.viptime = 0;
562 userPT.user = user;
rhj46f62c42025-06-06 23:24:10 +0800563 // user.userPT = userPT;
root0dbc9812025-05-19 04:41:57 +0000564 em.persist(user);
565 em.persist(userPT);
566 // 插入Seed
567 entity.Seed seed = new entity.Seed();
568 seed.seedid = seedid;
569 seed.seeduserid = userId;
570 seed.faketime = 0;
571 seed.lastfakecheck = new java.util.Date();
572 seed.outurl = "http://example.com/seed";
573 seed.title = "title";
574 seed.subtitle = "subtitle";
575 seed.seedsize = "100MB";
576 seed.seedtag = "tag";
577 seed.downloadtimes = 0;
578 seed.url = "http://download.com/seed";
579 em.persist(seed);
580 em.flush();
581 int ret = vip.KeepSeed(seedid);
582 Assertions.assertEquals(0, ret, "KeepSeed 正常插入应返回0");
583 VipSeed vs = em.find(VipSeed.class, seedid);
584 Assertions.assertNotNull(vs, "VipSeed 应被插入");
585
586 // 异常情况:种子不存在
587 String notExistSeedId = "notexist-seed-" + UUID.randomUUID();
588 int ret2 = vip.KeepSeed(notExistSeedId);
589 Assertions.assertEquals(1, ret2, "种子不存在应返回1");
590 } finally {
591 tx.rollback();
592 }
593 })).collect(Collectors.toList());
594 }
root0d8b11f2025-05-15 14:10:43 +0000595}