add trackServiceTest
Change-Id: I53960283c01fed90efcbb5a9bdef817fd4624d4a
diff --git a/src/test/java/com/example/g8backend/service/TrackerServiceTest.java b/src/test/java/com/example/g8backend/service/TrackerServiceTest.java
new file mode 100644
index 0000000..829fe15
--- /dev/null
+++ b/src/test/java/com/example/g8backend/service/TrackerServiceTest.java
@@ -0,0 +1,138 @@
+package com.example.g8backend.service;
+
+import com.example.g8backend.dto.AnnounceRequestDTO;
+import com.example.g8backend.dto.AnnounceResponseDTO;
+import com.example.g8backend.entity.Peer;
+import com.example.g8backend.mapper.PeerMapper;
+import com.example.g8backend.service.impl.TrackerServiceImpl;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.*;
+import org.mockito.junit.jupiter.MockitoExtension;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.core.SetOperations;
+
+import java.util.*;
+
+import static org.junit.jupiter.api.Assertions.*;
+import static org.mockito.ArgumentMatchers.*;
+import static org.mockito.Mockito.*;
+
+@ExtendWith(MockitoExtension.class)
+public class TrackerServiceTest {
+
+ @InjectMocks
+ private TrackerServiceImpl trackerService;
+
+ @Mock
+ private PeerMapper peerMapper;
+
+ @Mock
+ private RedisTemplate<String, Object> redisTemplate;
+
+ @Mock
+ private SetOperations<String, Object> setOperations;
+
+ @BeforeEach
+ public void setUp() {
+ when(redisTemplate.opsForSet()).thenReturn(setOperations);
+ }
+
+ @Test
+ public void testHandleAnnounceStoppedEvent() {
+ AnnounceRequestDTO requestDTO = new AnnounceRequestDTO();
+ requestDTO.setEvent("stopped");
+ requestDTO.setInfoHash("infohash");
+ requestDTO.setPeerId("peer1");
+
+ AnnounceResponseDTO response = trackerService.handleAnnounce(requestDTO);
+
+ verify(setOperations).remove("peers:infohash", "peer1");
+ assertEquals(30, response.getInterval());
+ assertTrue(response.getPeers().isEmpty());
+ }
+
+ @Test
+ public void testHandleAnnounceWithNewPeer() {
+ AnnounceRequestDTO requestDTO = new AnnounceRequestDTO();
+ requestDTO.setPasskey("key123");
+ requestDTO.setInfoHash("infohash");
+ requestDTO.setPeerId("peer1");
+ requestDTO.setIp("192.168.0.1");
+ requestDTO.setPort(6881);
+ requestDTO.setUploaded(1000);
+ requestDTO.setDownloaded(500);
+ requestDTO.setEvent("started");
+
+ when(peerMapper.getPeerByPK("peer1", "infohash", "key123")).thenReturn(null);
+ when(setOperations.members("peers:infohash")).thenReturn(Set.of("peer1"));
+ when(peerMapper.getPeerByInfoHashAndPeerId("infohash", "peer1")).thenReturn(List.of(new Peer() {{
+ setIpAddress("192.168.0.1");
+ setPort(6881);
+ }}));
+
+ AnnounceResponseDTO response = trackerService.handleAnnounce(requestDTO);
+
+ verify(peerMapper).insert(any(Peer.class));
+ verify(setOperations).add("peers:infohash", "peer1");
+ assertEquals(30, response.getInterval());
+ assertEquals(1, response.getPeers().size());
+ assertEquals("192.168.0.1", response.getPeers().get(0).get("ip"));
+ }
+
+ @Test
+ public void testHandleAnnounceWithExistingPeer() {
+ AnnounceRequestDTO requestDTO = new AnnounceRequestDTO();
+ requestDTO.setPasskey("key123");
+ requestDTO.setInfoHash("infohash");
+ requestDTO.setPeerId("peer2");
+ requestDTO.setIp("192.168.1.1");
+ requestDTO.setPort(6882);
+ requestDTO.setUploaded(2000);
+ requestDTO.setDownloaded(1000);
+ requestDTO.setEvent("update");
+
+ Peer existing = new Peer();
+ existing.setPeerId("peer2");
+ existing.setPasskey("key123");
+ existing.setInfo_hash("infohash");
+ existing.setUploaded(1000.0);
+ existing.setDownloaded(500.0);
+
+ when(peerMapper.getPeerByPK("peer2", "infohash", "key123")).thenReturn(existing);
+ when(setOperations.members("peers:infohash")).thenReturn(Set.of("peer2"));
+ when(peerMapper.getPeerByInfoHashAndPeerId("infohash", "peer2")).thenReturn(List.of(new Peer() {{
+ setIpAddress("192.168.1.1");
+ setPort(6882);
+ }}));
+
+ AnnounceResponseDTO response = trackerService.handleAnnounce(requestDTO);
+
+ verify(peerMapper).updatePeer(eq("key123"), eq("peer2"), eq("infohash"), eq(2000.0), eq(1000.0));
+ verify(setOperations).add("peers:infohash", "peer2");
+ assertEquals(1, response.getPeers().size());
+ assertEquals("192.168.1.1", response.getPeers().get(0).get("ip"));
+ }
+
+ @Test
+ public void testHandleAnnounceExceptionInRedis() {
+ AnnounceRequestDTO requestDTO = new AnnounceRequestDTO();
+ requestDTO.setPasskey("keyX");
+ requestDTO.setInfoHash("hashX");
+ requestDTO.setPeerId("peerX");
+ requestDTO.setIp("10.0.0.1");
+ requestDTO.setPort(6883);
+ requestDTO.setUploaded(100);
+ requestDTO.setDownloaded(200);
+ requestDTO.setEvent("started");
+
+ when(peerMapper.getPeerByPK(any(), any(), any())).thenReturn(null);
+ when(setOperations.members(anyString())).thenReturn(new HashSet<>() );
+
+ AnnounceResponseDTO response = trackerService.handleAnnounce(requestDTO);
+
+ assertEquals(30, response.getInterval());
+ assertTrue(response.getPeers().isEmpty());
+ }
+}