blob: e2bd4c9b5388432d1d08b4415f702ae044dba3a7 [file] [log] [blame]
wuchimedes0c183a02025-04-22 19:39:53 +08001package com.example.g8backend.service;
2
3import com.example.g8backend.dto.AnnounceRequestDTO;
4import com.example.g8backend.dto.AnnounceResponseDTO;
5import com.example.g8backend.entity.Peer;
6import com.example.g8backend.mapper.PeerMapper;
wuchimedes22ee83c2025-04-25 00:17:47 +08007import com.example.g8backend.mapper.UserStatsMapper;
wuchimedes0c183a02025-04-22 19:39:53 +08008import com.example.g8backend.service.impl.TrackerServiceImpl;
9import org.junit.jupiter.api.BeforeEach;
10import org.junit.jupiter.api.Test;
11import org.junit.jupiter.api.extension.ExtendWith;
12import org.mockito.*;
13import org.mockito.junit.jupiter.MockitoExtension;
wuchimedes22ee83c2025-04-25 00:17:47 +080014import org.springframework.data.redis.core.HashOperations;
wuchimedes0c183a02025-04-22 19:39:53 +080015import org.springframework.data.redis.core.RedisTemplate;
16import org.springframework.data.redis.core.SetOperations;
17
18import java.util.*;
19
20import static org.junit.jupiter.api.Assertions.*;
21import static org.mockito.ArgumentMatchers.*;
22import static org.mockito.Mockito.*;
23
24@ExtendWith(MockitoExtension.class)
25public class TrackerServiceTest {
26
27 @InjectMocks
28 private TrackerServiceImpl trackerService;
29
30 @Mock
31 private PeerMapper peerMapper;
32
33 @Mock
wuchimedes22ee83c2025-04-25 00:17:47 +080034 private UserStatsMapper userStatsMapper;
35
36 @Mock
wuchimedes0c183a02025-04-22 19:39:53 +080037 private RedisTemplate<String, Object> redisTemplate;
38
39 @Mock
wuchimedes22ee83c2025-04-25 00:17:47 +080040 private HashOperations<String, Object, Object> hashOperations;
41
42 @Mock
wuchimedes0c183a02025-04-22 19:39:53 +080043 private SetOperations<String, Object> setOperations;
44
45 @BeforeEach
46 public void setUp() {
47 when(redisTemplate.opsForSet()).thenReturn(setOperations);
48 }
49
50 @Test
51 public void testHandleAnnounceStoppedEvent() {
52 AnnounceRequestDTO requestDTO = new AnnounceRequestDTO();
53 requestDTO.setEvent("stopped");
54 requestDTO.setInfoHash("infohash");
55 requestDTO.setPeerId("peer1");
56
57 AnnounceResponseDTO response = trackerService.handleAnnounce(requestDTO);
58
59 verify(setOperations).remove("peers:infohash", "peer1");
60 assertEquals(30, response.getInterval());
61 assertTrue(response.getPeers().isEmpty());
62 }
63
64 @Test
65 public void testHandleAnnounceWithNewPeer() {
66 AnnounceRequestDTO requestDTO = new AnnounceRequestDTO();
67 requestDTO.setPasskey("key123");
68 requestDTO.setInfoHash("infohash");
69 requestDTO.setPeerId("peer1");
70 requestDTO.setIp("192.168.0.1");
71 requestDTO.setPort(6881);
72 requestDTO.setUploaded(1000);
73 requestDTO.setDownloaded(500);
74 requestDTO.setEvent("started");
75
76 when(peerMapper.getPeerByPK("peer1", "infohash", "key123")).thenReturn(null);
77 when(setOperations.members("peers:infohash")).thenReturn(Set.of("peer1"));
78 when(peerMapper.getPeerByInfoHashAndPeerId("infohash", "peer1")).thenReturn(List.of(new Peer() {{
79 setIpAddress("192.168.0.1");
80 setPort(6881);
81 }}));
82
83 AnnounceResponseDTO response = trackerService.handleAnnounce(requestDTO);
84
85 verify(peerMapper).insert(any(Peer.class));
86 verify(setOperations).add("peers:infohash", "peer1");
87 assertEquals(30, response.getInterval());
88 assertEquals(1, response.getPeers().size());
89 assertEquals("192.168.0.1", response.getPeers().get(0).get("ip"));
90 }
91
92 @Test
93 public void testHandleAnnounceWithExistingPeer() {
94 AnnounceRequestDTO requestDTO = new AnnounceRequestDTO();
95 requestDTO.setPasskey("key123");
96 requestDTO.setInfoHash("infohash");
97 requestDTO.setPeerId("peer2");
98 requestDTO.setIp("192.168.1.1");
99 requestDTO.setPort(6882);
100 requestDTO.setUploaded(2000);
101 requestDTO.setDownloaded(1000);
102 requestDTO.setEvent("update");
103
104 Peer existing = new Peer();
105 existing.setPeerId("peer2");
106 existing.setPasskey("key123");
107 existing.setInfo_hash("infohash");
108 existing.setUploaded(1000.0);
109 existing.setDownloaded(500.0);
110
wuchimedes22ee83c2025-04-25 00:17:47 +0800111 Map<Object, Object> redisData = new HashMap<>();
112 redisData.put("uploaded", 1000.0);
113 redisData.put("downloaded", 500.0);
114
wuchimedes0c183a02025-04-22 19:39:53 +0800115 when(peerMapper.getPeerByPK("peer2", "infohash", "key123")).thenReturn(existing);
wuchimedes0c183a02025-04-22 19:39:53 +0800116 when(peerMapper.getPeerByInfoHashAndPeerId("infohash", "peer2")).thenReturn(List.of(new Peer() {{
117 setIpAddress("192.168.1.1");
118 setPort(6882);
119 }}));
wuchimedes22ee83c2025-04-25 00:17:47 +0800120 when(redisTemplate.opsForHash()).thenReturn(hashOperations);
121 when(hashOperations.entries("user:peer:key123:infohash:peer2")).thenReturn(redisData);
122 when(redisTemplate.opsForSet()).thenReturn(setOperations);
123 when(setOperations.members("peers:infohash")).thenReturn(Set.of("peer2"));
wuchimedes0c183a02025-04-22 19:39:53 +0800124
125 AnnounceResponseDTO response = trackerService.handleAnnounce(requestDTO);
126
127 verify(peerMapper).updatePeer(eq("key123"), eq("peer2"), eq("infohash"), eq(2000.0), eq(1000.0));
128 verify(setOperations).add("peers:infohash", "peer2");
129 assertEquals(1, response.getPeers().size());
130 assertEquals("192.168.1.1", response.getPeers().get(0).get("ip"));
131 }
132
133 @Test
134 public void testHandleAnnounceExceptionInRedis() {
135 AnnounceRequestDTO requestDTO = new AnnounceRequestDTO();
136 requestDTO.setPasskey("keyX");
137 requestDTO.setInfoHash("hashX");
138 requestDTO.setPeerId("peerX");
139 requestDTO.setIp("10.0.0.1");
140 requestDTO.setPort(6883);
141 requestDTO.setUploaded(100);
142 requestDTO.setDownloaded(200);
143 requestDTO.setEvent("started");
144
145 when(peerMapper.getPeerByPK(any(), any(), any())).thenReturn(null);
146 when(setOperations.members(anyString())).thenReturn(new HashSet<>() );
147
148 AnnounceResponseDTO response = trackerService.handleAnnounce(requestDTO);
149
150 assertEquals(30, response.getInterval());
151 assertTrue(response.getPeers().isEmpty());
152 }
153}