Compare commits

..

2 Commits

Author SHA1 Message Date
Noan07 5a825b8de9 bug
continuous-integration/drone/push Build is failing Details
2 years ago
Noan07 46d5239998 🔨 tests database
continuous-integration/drone/push Build is failing Details
2 years ago

@ -31,7 +31,7 @@ steps:
- cd code/server
- dotnet workload restore
- dotnet restore Server.sln
- dotnet sonarscanner begin /k:PongSrv /d:sonar.host.url=$${PLUGIN_SONAR_HOST} /d:sonar.coverageReportPaths="coveragereport/SonarQube.xml" /d:sonar.coverage.exclusions="Tests/**,DataBase/Program.cs,DataBase/Migrations/**,DataBase/DataManager/**,DataBase/Context/PongDbContextWithStub.cs" /d:sonar.login=$${PLUGIN_SONAR_TOKEN}
- dotnet sonarscanner begin /k:PongSrv /d:sonar.host.url=$${PLUGIN_SONAR_HOST} /d:sonar.coverageReportPaths="coveragereport/SonarQube.xml" /d:sonar.coverage.exclusions="Tests/**" /d:sonar.login=$${PLUGIN_SONAR_TOKEN}
- dotnet build Server.sln -c Release --no-restore
- dotnet test Server.sln --logger trx --no-restore /p:CollectCoverage=true /p:CoverletOutputFormat=cobertura --collect "XPlat Code Coverage"
- reportgenerator -reports:"**/coverage.cobertura.xml" -reporttypes:SonarQube -targetdir:"coveragereport"
@ -57,7 +57,6 @@ steps:
from_secret: SECRET_REGISTRY_USERNAME
password:
from_secret: SECRET_REGISTRY_PASSWORD
depends_on: [tests]
# container deployment
- name: deploy-server

@ -1 +1 @@
# LeapHitServer
# LeapHitServer

@ -34,7 +34,7 @@ namespace ApiLeapHit.Controllers
do
{
// Générer un id unique avec des chiffres et des lettres
id = Guid.NewGuid().ToString("N").Substring(0, 6);
id = Guid.NewGuid().ToString("N");
}
while (await _dataManager.GetPlayer(id) != null);
player.playerId = id;

@ -15,15 +15,7 @@ namespace DataBase.Context
public PongDbContext() { }
public PongDbContext(DbContextOptions<PongDbContext> options) : base(options) { }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Player>().ToTable("Players");
modelBuilder.Entity<Game>().ToTable("Games");
modelBuilder.Entity<Message>().ToTable("Messages");
modelBuilder.Entity<Chat>().ToTable("Chats");
}
protected override async void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
base.OnConfiguring(optionsBuilder);
@ -43,5 +35,13 @@ namespace DataBase.Context
}
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Player>().ToTable("Players");
modelBuilder.Entity<Game>().ToTable("Games");
modelBuilder.Entity<Message>().ToTable("Messages");
modelBuilder.Entity<Chat>().ToTable("Chats");
}
}
}

@ -19,7 +19,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ClientConsole", "ClientCons
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Shared", "Shared\Shared.csproj", "{CA1465F2-A006-4AF6-8231-59DB00963BD0}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestsDatabase", "TestsDatabase\TestsDatabase.csproj", "{EDAC56C7-0AC9-465A-A361-63347F435327}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestsDataBase", "TestsDataBase\TestsDataBase.csproj", "{BE7D3D6B-1CA1-47F9-93BE-0415708571AA}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@ -55,17 +55,17 @@ Global
{CA1465F2-A006-4AF6-8231-59DB00963BD0}.Debug|Any CPU.Build.0 = Debug|Any CPU
{CA1465F2-A006-4AF6-8231-59DB00963BD0}.Release|Any CPU.ActiveCfg = Release|Any CPU
{CA1465F2-A006-4AF6-8231-59DB00963BD0}.Release|Any CPU.Build.0 = Release|Any CPU
{EDAC56C7-0AC9-465A-A361-63347F435327}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{EDAC56C7-0AC9-465A-A361-63347F435327}.Debug|Any CPU.Build.0 = Debug|Any CPU
{EDAC56C7-0AC9-465A-A361-63347F435327}.Release|Any CPU.ActiveCfg = Release|Any CPU
{EDAC56C7-0AC9-465A-A361-63347F435327}.Release|Any CPU.Build.0 = Release|Any CPU
{BE7D3D6B-1CA1-47F9-93BE-0415708571AA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{BE7D3D6B-1CA1-47F9-93BE-0415708571AA}.Debug|Any CPU.Build.0 = Debug|Any CPU
{BE7D3D6B-1CA1-47F9-93BE-0415708571AA}.Release|Any CPU.ActiveCfg = Release|Any CPU
{BE7D3D6B-1CA1-47F9-93BE-0415708571AA}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{A9DFF203-7F27-44BA-A460-F65C01D0EDFD} = {12A97D16-34BB-4D4F-9F76-D74061A9BA77}
{EDAC56C7-0AC9-465A-A361-63347F435327} = {12A97D16-34BB-4D4F-9F76-D74061A9BA77}
{BE7D3D6B-1CA1-47F9-93BE-0415708571AA} = {12A97D16-34BB-4D4F-9F76-D74061A9BA77}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {4BE2DC93-D511-4DA9-9C47-F286E71354BA}

@ -38,10 +38,9 @@ public class PongServer
byte[] receivedData = serverSocket.Receive(ref remoteEndPoint);
string fileJson = Encoding.UTF8.GetString(receivedData);
ObjectTransfert<Player> data = JsonSerializer.Deserialize<ObjectTransfert<Player>>(fileJson);
if (data.Informations.Action == Shared.DTO.Action.Host)
{
Host(data, remoteEndPoint, serverSocket, false);
}
@ -49,7 +48,7 @@ public class PongServer
if (data.Informations.Action == Shared.DTO.Action.Join)
{
var choisenRoom = rooms.FirstOrDefault(room => room.Key == data.Informations.IdRoom);
if(choisenRoom.Value != default)
if(choisenRoom.Value != default && choisenRoom.Value.Availaible)
{
Join(data, remoteEndPoint, serverSocket, choisenRoom.Value);
}
@ -62,8 +61,7 @@ public class PongServer
Console.WriteLine("Connection " + choisenRoom.Key);
if (choisenRoom.Value != default )
{
Join(data, remoteEndPoint, serverSocket, choisenRoom.Value);
Join(data, remoteEndPoint, serverSocket, choisenRoom.Value);
}
else
{
@ -71,7 +69,6 @@ public class PongServer
}
}
Console.WriteLine("");
}
@ -79,20 +76,11 @@ public class PongServer
private void Host(ObjectTransfert<Player> data, IPEndPoint remoteEndPoint, UdpClient serverSocket, bool availaible)
{
var choisenRoom = rooms.FirstOrDefault(room => room.Value.Free);
var chosenPort = nextPort;
if (choisenRoom.Value != default)
{
chosenPort= choisenRoom.Value.Port;
rooms.Remove(choisenRoom.Key);
choisenRoom = default;
}
Room room = new Room(data.Data.playerId, availaible);
// Assign a unique port to the client
IPEndPoint clientEndPoint = new IPEndPoint(IPAddress.Any, chosenPort);
IPEndPoint clientEndPoint = new IPEndPoint(IPAddress.Any, nextPort);
UdpClient clientSocket = new UdpClient(clientEndPoint);
room.playerHost = new KeyValuePair<Player,UdpClient>(data.Data,clientSocket);
@ -103,47 +91,37 @@ public class PongServer
Console.WriteLine("New connection Host From " + remoteEndPoint.ToString());
room.Port = chosenPort;
if(chosenPort==nextPort)
{
nextPort++;
}
room.Port = nextPort;
nextPort++;
Tuple<int, bool> dataToSend = new Tuple<int, bool>(room.Port, true);
Console.WriteLine(JsonSerializer.Serialize(dataToSend));
// Send port message to client
byte[] connectionData = Encoding.ASCII.GetBytes(JsonSerializer.Serialize(dataToSend));
byte[] connectionData = Encoding.ASCII.GetBytes(room.Port.ToString());
serverSocket.Send(connectionData, connectionData.Length, remoteEndPoint);
rooms[data.Data.playerId] = room;
Console.WriteLine("FIN HOST...............");
room.PropertyChanged += room.OnReadyChanged;
}
private void Join(ObjectTransfert<Player> data, IPEndPoint remoteEndPoint, UdpClient serverSocket, Room room)
{
room.playerJoin = new KeyValuePair<Player, UdpClient>(data.Data, room.playerHost.Value);
Console.WriteLine("New connection Client from " + remoteEndPoint.ToString());
Tuple<int, bool> dataToSend = new Tuple<int, bool>(room.Port, false);
Console.WriteLine(JsonSerializer.Serialize(dataToSend));
Console.WriteLine("New connection Client from " + remoteEndPoint.ToString());
// Send port message to client
byte[] connectionData = Encoding.ASCII.GetBytes(JsonSerializer.Serialize(dataToSend));
byte[] connectionData = Encoding.ASCII.GetBytes(room.Port.ToString());
serverSocket.Send(connectionData, connectionData.Length, remoteEndPoint);
room.PropertyChanged += room.OnReadyChanged;
room.NbPlayer++;
Console.WriteLine("FIN JOIN...............");
}
}

@ -5,7 +5,6 @@ using System.Net.Sockets;
using System.Text;
using System.Threading;
using DataBase.Entity;
using Shared.DTO;
using System.Text.Json;
using Server;

@ -9,7 +9,6 @@ using System.Threading.Tasks;
using Shared.DTO;
using System.ComponentModel;
using System.Text.Json;
using static System.Formats.Asn1.AsnWriter;
namespace Server
{
@ -21,14 +20,9 @@ namespace Server
Id = id;
Availaible = availaible;
}
Tuple<int, int> ScoreImp = new(0, 0);
ObjectTransfert<Tuple<GameEntities, Tuple<int, int>>> data ;
public bool Availaible { get; set; }
public bool Free { get; set; }=false;
public event PropertyChangedEventHandler? PropertyChanged;
public string Id { get; set; }
@ -36,7 +30,6 @@ namespace Server
public KeyValuePair <Player, UdpClient> playerHost;
public KeyValuePair <Player, UdpClient> playerJoin;
public int Port { get; set; }
public bool gameRunning=true ;
public int NbPlayer
@ -64,131 +57,69 @@ namespace Server
public void ReceiveMessages(UdpClient clientSocket1, UdpClient clientSocket2, IPEndPoint endpoint2, Semaphore semaphore,bool isHost)
public void ReceiveMessages(UdpClient clientSocket1, UdpClient clientSocket2, IPEndPoint endpoint2, SemaphoreSlim semaphore)
{
IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0);
Thread secondsCount = new Thread(() => CountSeconds() );
bool isDisconected=false;
secondsCount.Start();
while ((ScoreImp.Item1<6 && ScoreImp.Item2 < 6) && gameRunning)
{
try
{
byte[] receivedData = clientSocket1.Receive(ref remoteEndPoint);
if (isHost) {
string fileJson = Encoding.UTF8.GetString(receivedData);
try
{
data = JsonSerializer.Deserialize<ObjectTransfert<Tuple<GameEntities, Tuple<int, int>>>>(fileJson);
ScoreImp = data.Data.Item2 != null ? data.Data.Item2 : ScoreImp;
}
catch (Exception ex) { }
}
semaphore.WaitOne();
clientSocket2.Send(receivedData, receivedData.Length, endpoint2);
semaphore.Release();
} catch (SocketException){
try
{
semaphore.Release();
}catch { }
isDisconected = true;
break;
}
}
//Tuple<GameEntities, Tuple<int, int>> game = new Tuple<GameEntities, Tuple<int, int>>(new GameEntities(new Tuple<float,float>(0,0),0), ScoreImp);
/* ObjectTransfert<Tuple<GameEntities, Tuple<int, int>>> data2 = new ObjectTransfert<Tuple<GameEntities, Tuple<int, int>>>() {
Informations = new Informations(Shared.DTO.Action.End, 0, typeof(Tuple<GameEntities, Tuple<int, int>>).ToString()),
Data = game
};*/
if (!isDisconected)
while (true)
{
data.Informations.Action = Shared.DTO.Action.End;
string sendFinish = JsonSerializer.Serialize(data);
byte[] sendFinishByt = Encoding.ASCII.GetBytes(sendFinish);
try
{
clientSocket2.Send(sendFinishByt, sendFinishByt.Length, endpoint2);
}
catch (Exception ex) { }
}
if (isHost)
{
try
{
semaphore.Release();
byte[] receivedData = clientSocket1.Receive(ref remoteEndPoint);
semaphore.Wait();
clientSocket2.Send(receivedData, receivedData.Length, endpoint2);
semaphore.Release();
}
catch { }
playerJoin.Value.Close();
}
else
{
playerHost.Value.Close();
}
Free = true;
Console.WriteLine("Game Finished Am i host " + isHost);
}
private void CountSeconds()
{
int seconds = 0;
while (seconds<=122)
{
seconds++;
Thread.Sleep(1000);
}
gameRunning = false;
}
async public void OnReadyChanged(object sender, PropertyChangedEventArgs e)
public void OnReadyChanged(object sender, PropertyChangedEventArgs e)
{
await Task.Run(() =>
{
Room room = sender as Room;
int maxPlayer = room.nbPlayer;
Room room = sender as Room;
int maxPlayer = room.nbPlayer;
if (maxPlayer == 2)
{
room.Availaible = false;
IPEndPoint remoteEndPointHost = new IPEndPoint(IPAddress.Any, room.Port);
IPEndPoint remoteEndPointJoin = new IPEndPoint(IPAddress.Any, room.Port);
//IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Any, Port);
//UdpClient serverSocket = new UdpClient(serverEndPoint);
byte[] receivedDataHost = playerHost.Value.Receive(ref remoteEndPointHost);
byte[] receivedDataJoin = playerJoin.Value.Receive(ref remoteEndPointJoin);
if (maxPlayer == 2)
{
IPEndPoint remoteEndPointHost = new IPEndPoint(IPAddress.Any, room.Port);
IPEndPoint remoteEndPointJoin = new IPEndPoint(IPAddress.Any, room.Port);
playerJoin.Value.Send(receivedDataHost, receivedDataHost.Length, remoteEndPointHost);
playerHost.Value.Send(receivedDataJoin, receivedDataJoin.Length, remoteEndPointJoin);
Semaphore semaphore = new Semaphore(2, 2);
byte[] receivedDataHost = playerHost.Value.Receive(ref remoteEndPointHost);
byte[] receivedDataJoin = playerJoin.Value.Receive(ref remoteEndPointJoin);
playerJoin.Value.Send(receivedDataHost, receivedDataHost.Length, remoteEndPointHost);
playerHost.Value.Send(receivedDataJoin, receivedDataJoin.Length, remoteEndPointJoin);
SemaphoreSlim semaphore = new SemaphoreSlim(0);
Thread receiveThread1 = new Thread(() => ReceiveMessages(playerHost.Value, playerJoin.Value, remoteEndPointJoin, semaphore,true));
Thread receiveThread1 = new Thread(() => ReceiveMessages(playerHost.Value, playerJoin.Value, remoteEndPointJoin, semaphore));
Thread receiveThread2 = new Thread(() =>
{
ReceiveMessages(playerJoin.Value, playerHost.Value, remoteEndPointHost, semaphore,false);
});
receiveThread1.Start();
receiveThread2.Start();
Thread receiveThread2 = new Thread(() => {
// Attente pour que le joueur 1 ait envoyé ses données avant de démarrer la réception des données du joueur 2
semaphore.Wait();
ReceiveMessages(playerJoin.Value, playerHost.Value, remoteEndPointHost, semaphore);
});
receiveThread1.Start();
receiveThread2.Start();
receiveThread1.Join();
receiveThread2.Join();
}
semaphore.Release();
receiveThread1.Join();
receiveThread2.Join();
}
});
}
}
}

@ -15,7 +15,6 @@ namespace Shared.DTO
SendPlayer,
RecivePlayer,
SendEntities,
SendScore
SendEntities
}
}

@ -1,20 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Shared.DTO
{
public class GameEntities
{
public Tuple<float, float> Ball { get; set; }
public float Paddle { get; set; }
public GameEntities(Tuple<float, float> ball, float paddle)
{
Ball = ball;
Paddle = paddle;
}
}
}

@ -4,12 +4,13 @@ using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
namespace TestsDatabase
namespace TestsDataBase
{
public class TestsChat
public class TestChat
{
[Fact]
public void Add_Test()

@ -4,13 +4,13 @@ using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Numerics;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
namespace TestsDatabase
namespace TestsDataBase
{
public class TestsGame
public class TestGame
{
[Fact]
public void Add_Test()
@ -147,4 +147,4 @@ namespace TestsDatabase
}
}
}
}
}

@ -6,10 +6,11 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using xunit;
namespace TestsDatabase
namespace TestsDataBase
{
public class TestsMessage
public class TestMessage
{
[Fact]
public void Add_Test()
@ -24,7 +25,7 @@ namespace TestsDatabase
Player player2 = new Player { playerId = "Rami12345", name = "The Lady", nbBallTouchTotal = 8, timePlayed = 2 };
Chat chat = new Chat { chatId = 1, player1 = "Loris12345", player2 = "Rami12345", PlayerId1 = player, PlayerId2 = player2 };
Message message = new Message { messageId = 1, ChatId = chat, message = "message", chat = 1, player = "Loris12345", PlayerId = player, timestamp = new DateTime(2023, 3, 10, 14, 30, 0, DateTimeKind.Utc) };
context.Messages.Add(message);
context.SaveChanges();
}
@ -141,3 +142,4 @@ namespace TestsDatabase
}
}
}

@ -1,15 +1,10 @@
using DataBase.Context;
using DataBase.Context;
using DataBase.Entity;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TestsDatabase
namespace TestsDataBase
{
public class TestsPlayer
public class TestPlayer
{
[Fact]
public void Add_Test()
@ -131,4 +126,4 @@ namespace TestsDatabase
}
}
}
}
}

@ -1,4 +1,4 @@
<Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
@ -10,7 +10,7 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="7.0.4" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.4" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.3.2" />
<PackageReference Include="xunit" Version="2.4.2" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.5">
Loading…
Cancel
Save