blob: 829fe159f1b3e77abae80122a06d2e62585c4273 [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;
7import com.example.g8backend.service.impl.TrackerServiceImpl;
8import org.junit.jupiter.api.BeforeEach;
9import org.junit.jupiter.api.Test;
10import org.junit.jupiter.api.extension.ExtendWith;
11import org.mockito.*;
12import org.mockito.junit.jupiter.MockitoExtension;
13import org.springframework.data.redis.core.RedisTemplate;
14import org.springframework.data.redis.core.SetOperations;
15
16import java.util.*;
17
18import static org.junit.jupiter.api.Assertions.*;
19import static org.mockito.ArgumentMatchers.*;
20import static org.mockito.Mockito.*;
21
22@ExtendWith(MockitoExtension.class)
23public class TrackerServiceTest {
24
25 @InjectMocks
26 private TrackerServiceImpl trackerService;
27
28 @Mock
29 private PeerMapper peerMapper;
30
31 @Mock
32 private RedisTemplate<String, Object> redisTemplate;
33
34 @Mock
35 private SetOperations<String, Object> setOperations;
36
37 @BeforeEach
38 public void setUp() {
39 when(redisTemplate.opsForSet()).thenReturn(setOperations);
40 }
41
42 @Test
43 public void testHandleAnnounceStoppedEvent() {
44 AnnounceRequestDTO requestDTO = new AnnounceRequestDTO();
45 requestDTO.setEvent("stopped");
46 requestDTO.setInfoHash("infohash");
47 requestDTO.setPeerId("peer1");
48
49 AnnounceResponseDTO response = trackerService.handleAnnounce(requestDTO);
50
51 verify(setOperations).remove("peers:infohash", "peer1");
52 assertEquals(30, response.getInterval());
53 assertTrue(response.getPeers().isEmpty());
54 }
55
56 @Test
57 public void testHandleAnnounceWithNewPeer() {
58 AnnounceRequestDTO requestDTO = new AnnounceRequestDTO();
59 requestDTO.setPasskey("key123");
60 requestDTO.setInfoHash("infohash");
61 requestDTO.setPeerId("peer1");
62 requestDTO.setIp("192.168.0.1");
63 requestDTO.setPort(6881);
64 requestDTO.setUploaded(1000);
65 requestDTO.setDownloaded(500);
66 requestDTO.setEvent("started");
67
68 when(peerMapper.getPeerByPK("peer1", "infohash", "key123")).thenReturn(null);
69 when(setOperations.members("peers:infohash")).thenReturn(Set.of("peer1"));
70 when(peerMapper.getPeerByInfoHashAndPeerId("infohash", "peer1")).thenReturn(List.of(new Peer() {{
71 setIpAddress("192.168.0.1");
72 setPort(6881);
73 }}));
74
75 AnnounceResponseDTO response = trackerService.handleAnnounce(requestDTO);
76
77 verify(peerMapper).insert(any(Peer.class));
78 verify(setOperations).add("peers:infohash", "peer1");
79 assertEquals(30, response.getInterval());
80 assertEquals(1, response.getPeers().size());
81 assertEquals("192.168.0.1", response.getPeers().get(0).get("ip"));
82 }
83
84 @Test
85 public void testHandleAnnounceWithExistingPeer() {
86 AnnounceRequestDTO requestDTO = new AnnounceRequestDTO();
87 requestDTO.setPasskey("key123");
88 requestDTO.setInfoHash("infohash");
89 requestDTO.setPeerId("peer2");
90 requestDTO.setIp("192.168.1.1");
91 requestDTO.setPort(6882);
92 requestDTO.setUploaded(2000);
93 requestDTO.setDownloaded(1000);
94 requestDTO.setEvent("update");
95
96 Peer existing = new Peer();
97 existing.setPeerId("peer2");
98 existing.setPasskey("key123");
99 existing.setInfo_hash("infohash");
100 existing.setUploaded(1000.0);
101 existing.setDownloaded(500.0);
102
103 when(peerMapper.getPeerByPK("peer2", "infohash", "key123")).thenReturn(existing);
104 when(setOperations.members("peers:infohash")).thenReturn(Set.of("peer2"));
105 when(peerMapper.getPeerByInfoHashAndPeerId("infohash", "peer2")).thenReturn(List.of(new Peer() {{
106 setIpAddress("192.168.1.1");
107 setPort(6882);
108 }}));
109
110 AnnounceResponseDTO response = trackerService.handleAnnounce(requestDTO);
111
112 verify(peerMapper).updatePeer(eq("key123"), eq("peer2"), eq("infohash"), eq(2000.0), eq(1000.0));
113 verify(setOperations).add("peers:infohash", "peer2");
114 assertEquals(1, response.getPeers().size());
115 assertEquals("192.168.1.1", response.getPeers().get(0).get("ip"));
116 }
117
118 @Test
119 public void testHandleAnnounceExceptionInRedis() {
120 AnnounceRequestDTO requestDTO = new AnnounceRequestDTO();
121 requestDTO.setPasskey("keyX");
122 requestDTO.setInfoHash("hashX");
123 requestDTO.setPeerId("peerX");
124 requestDTO.setIp("10.0.0.1");
125 requestDTO.setPort(6883);
126 requestDTO.setUploaded(100);
127 requestDTO.setDownloaded(200);
128 requestDTO.setEvent("started");
129
130 when(peerMapper.getPeerByPK(any(), any(), any())).thenReturn(null);
131 when(setOperations.members(anyString())).thenReturn(new HashSet<>() );
132
133 AnnounceResponseDTO response = trackerService.handleAnnounce(requestDTO);
134
135 assertEquals(30, response.getInterval());
136 assertTrue(response.getPeers().isEmpty());
137 }
138}