diff --git a/java_socketio_chatroom_server/.classpath b/java_socketio_chatroom_server/.classpath index 5e8a55f..8e80949 100755 --- a/java_socketio_chatroom_server/.classpath +++ b/java_socketio_chatroom_server/.classpath @@ -23,5 +23,12 @@ + + + + + + + diff --git a/java_socketio_chatroom_server/.settings/org.eclipse.core.resources.prefs b/java_socketio_chatroom_server/.settings/org.eclipse.core.resources.prefs index f9fe345..c293e5d 100755 --- a/java_socketio_chatroom_server/.settings/org.eclipse.core.resources.prefs +++ b/java_socketio_chatroom_server/.settings/org.eclipse.core.resources.prefs @@ -1,4 +1,5 @@ eclipse.preferences.version=1 +encoding//src/it/java=UTF-8 encoding//src/main/java=UTF-8 encoding//src/test/java=UTF-8 encoding/=UTF-8 diff --git a/java_socketio_chatroom_server/pom.xml b/java_socketio_chatroom_server/pom.xml index 8a4bff0..00e3d5e 100755 --- a/java_socketio_chatroom_server/pom.xml +++ b/java_socketio_chatroom_server/pom.xml @@ -22,7 +22,7 @@ 0.8.7 1.6.6 4.3.0 - + 3.12.8 4.0.1 9.4.41.v20210516 9.4.41.v20210516 @@ -59,6 +59,11 @@ import pom + + org.mongodb + mongo-java-driver + ${mongo.driver.version} + javax.servlet javax.servlet-api @@ -118,6 +123,10 @@ org.apache.logging.log4j log4j-core + + org.mongodb + mongo-java-driver + javax.servlet javax.servlet-api @@ -168,6 +177,18 @@ maven-surefire-plugin 2.22.1 + + maven-failsafe-plugin + 2.22.2 + + + + integration-test + verify + + + + maven-jar-plugin 3.0.2 @@ -210,10 +231,60 @@ + + org.codehaus.mojo + build-helper-maven-plugin + 3.2.0 + + + add-test-source + generate-test-sources + + add-test-source + + + + src/it/java + + + + + org.jacoco jacoco-maven-plugin ${jacoco.plugin.version} + + + + + prepare-agent + + report + + + + jacoco-check + + + check + + + + + PACKAGE + + + LINE + COVEREDRATIO + 1 + + + + + + + org.pitest @@ -232,6 +303,11 @@ coveralls-maven-plugin ${coveralls.plugin.version} + + io.fabric8 + docker-maven-plugin + 0.36.0 + @@ -240,18 +316,44 @@ maven-assembly-plugin - org.jacoco - jacoco-maven-plugin - - - **/ServerWrapper.* - **/ServerWrapper$*.* - - + maven-failsafe-plugin + + - org.pitest - pitest-maven + io.fabric8 + docker-maven-plugin + + + + mongo:4.2.14 + + + + 27017:27017 + + + + + + + + docker-start + pre-integration-test + + start + + + + docker-stop + post-integration-test + + stop + + + @@ -274,14 +376,20 @@ org.jacoco jacoco-maven-plugin - - - - prepare-agent - report - - - + + + **/Message.* + **/ServerWrapper.* + **/ServerWrapper$*.* + + + + + org.codehaus.mojo + build-helper-maven-plugin + + + maven-failsafe-plugin @@ -294,9 +402,17 @@ org.pitest pitest-maven + + + io.github.marcodiri.java_socketio_chatroom_server.model.* + + + io.github.marcodiri.java_socketio_chatroom_server.* + + - verify + integration-test mutationCoverage diff --git a/java_socketio_chatroom_server/src/it/java/io/github/marcodiri/java_socketio_chatroom_server/repository/mongo/ServerMongoRepositoryIT.java b/java_socketio_chatroom_server/src/it/java/io/github/marcodiri/java_socketio_chatroom_server/repository/mongo/ServerMongoRepositoryIT.java new file mode 100755 index 0000000..344608b --- /dev/null +++ b/java_socketio_chatroom_server/src/it/java/io/github/marcodiri/java_socketio_chatroom_server/repository/mongo/ServerMongoRepositoryIT.java @@ -0,0 +1,79 @@ +package io.github.marcodiri.java_socketio_chatroom_server.repository.mongo; + +import static io.github.marcodiri.java_socketio_chatroom_server.repository.mongo.ServerMongoRepository.CHATROOM_DB_NAME; +import static io.github.marcodiri.java_socketio_chatroom_server.repository.mongo.ServerMongoRepository.MESSAGES_COLLECTION_NAME; + +import java.sql.Timestamp; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.StreamSupport; + +import static java.util.Arrays.asList; +import static org.assertj.core.api.Assertions.assertThat; +import org.bson.Document; +import org.junit.Before; +import org.junit.Test; + +import com.mongodb.MongoClient; +import com.mongodb.ServerAddress; +import com.mongodb.client.MongoCollection; +import com.mongodb.client.MongoDatabase; + +import io.github.marcodiri.java_socketio_chatroom_server.model.Message; + +public class ServerMongoRepositoryIT { + private static int mongoPort = Integer.parseInt(System.getProperty("mongo.port", "27017")); + private MongoClient client; + private ServerMongoRepository serverRepository; + private MongoCollection messagesCollection; + + @Before + public void setup() { + client = new MongoClient( + new ServerAddress("localhost", mongoPort) + ); + serverRepository = new ServerMongoRepository(client); + MongoDatabase database = client.getDatabase(CHATROOM_DB_NAME); + database.drop(); + messagesCollection = database.getCollection(MESSAGES_COLLECTION_NAME); + } + + @Test + public void testFindAll() { + Timestamp ts1 = new Timestamp(System.currentTimeMillis()); + Timestamp ts2 = new Timestamp(System.currentTimeMillis()); + + messagesCollection.insertMany(asList( + new Document() + .append("timestamp", ts1.getTime()) + .append("user", "user1") + .append("message", "message1"), + new Document() + .append("timestamp", ts2.getTime()) + .append("user", "user2") + .append("message", "message2") + )); + + assertThat(serverRepository.findAll()) + .containsExactly( + new Message(ts1, "user1", "message1"), + new Message(ts2, "user2", "message2") + ); + } + + @Test + public void testSave() { + Message msg = new Message(new Timestamp(System.currentTimeMillis()), "user", "message"); + serverRepository.save(msg); + assertThat(readAllMessages()).containsExactly(msg); + } + + private List readAllMessages() { + return StreamSupport.stream(messagesCollection.find().spliterator(), false) + .map(d -> new Message( + new Timestamp(Long.parseLong(d.get("timestamp").toString())), + "" + d.get("user"), + "" + d.get("message"))) + .collect(Collectors.toList()); + } +} diff --git a/java_socketio_chatroom_server/src/main/java/io/github/marcodiri/java_socketio_chatroom_server/model/Message.java b/java_socketio_chatroom_server/src/main/java/io/github/marcodiri/java_socketio_chatroom_server/model/Message.java new file mode 100755 index 0000000..bf9814e --- /dev/null +++ b/java_socketio_chatroom_server/src/main/java/io/github/marcodiri/java_socketio_chatroom_server/model/Message.java @@ -0,0 +1,53 @@ +package io.github.marcodiri.java_socketio_chatroom_server.model; + +import java.sql.Timestamp; +import java.util.Objects; + +public final class Message { + private final Timestamp timestamp; + private final String user; + private final String message; + + public Message(Timestamp timestamp, String user, String message) { + this.timestamp = new Timestamp(timestamp.getTime()); + this.user = user; + this.message = message; + } + + public Timestamp getTimestamp() { + return new Timestamp(timestamp.getTime()); + } + + public String getUser() { + return user; + } + + public String getMessage() { + return message; + } + + @Override + public String toString() { + final StringBuffer sb = new StringBuffer("Message{"); + sb.append("timestamp=").append(timestamp); + sb.append(", user=").append(user); + sb.append(", message=").append(message); + sb.append('}'); + return sb.toString(); + } + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; + Message msg = (Message) o; + return Objects.equals(timestamp, msg.timestamp) && Objects.equals(user, msg.user) && Objects.equals(message, msg.message); + } + + @Override + public int hashCode() { + return Objects.hash(timestamp, user, message); + } +} diff --git a/java_socketio_chatroom_server/src/main/java/io/github/marcodiri/java_socketio_chatroom_server/repository/ServerRepository.java b/java_socketio_chatroom_server/src/main/java/io/github/marcodiri/java_socketio_chatroom_server/repository/ServerRepository.java new file mode 100755 index 0000000..0fcf804 --- /dev/null +++ b/java_socketio_chatroom_server/src/main/java/io/github/marcodiri/java_socketio_chatroom_server/repository/ServerRepository.java @@ -0,0 +1,11 @@ +package io.github.marcodiri.java_socketio_chatroom_server.repository; + +import java.util.List; + +import io.github.marcodiri.java_socketio_chatroom_server.model.Message; + +public interface ServerRepository { + public List findAll(); + + public void save(Message message); +} diff --git a/java_socketio_chatroom_server/src/main/java/io/github/marcodiri/java_socketio_chatroom_server/repository/mongo/ServerMongoRepository.java b/java_socketio_chatroom_server/src/main/java/io/github/marcodiri/java_socketio_chatroom_server/repository/mongo/ServerMongoRepository.java new file mode 100755 index 0000000..90c81e2 --- /dev/null +++ b/java_socketio_chatroom_server/src/main/java/io/github/marcodiri/java_socketio_chatroom_server/repository/mongo/ServerMongoRepository.java @@ -0,0 +1,50 @@ +package io.github.marcodiri.java_socketio_chatroom_server.repository.mongo; + +import java.sql.Timestamp; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.StreamSupport; + +import org.bson.Document; + +import com.mongodb.MongoClient; +import com.mongodb.client.MongoCollection; +import io.github.marcodiri.java_socketio_chatroom_server.model.Message; +import io.github.marcodiri.java_socketio_chatroom_server.repository.ServerRepository; + +public class ServerMongoRepository implements ServerRepository { + public static final String CHATROOM_DB_NAME = "chatroom"; + public static final String MESSAGES_COLLECTION_NAME = "messages"; + private MongoCollection msgCollection; + + public ServerMongoRepository(MongoClient client) { + msgCollection = client + .getDatabase(CHATROOM_DB_NAME) + .getCollection(MESSAGES_COLLECTION_NAME); + } + + @Override + public List findAll() { + return StreamSupport. + stream(msgCollection.find().spliterator(), false) + .map(this::fromDocumentToMessage) + .collect(Collectors.toList()); + } + + @Override + public void save(Message message) { + msgCollection.insertOne( + new Document() + .append("timestamp", message.getTimestamp().getTime()) + .append("user", message.getUser()) + .append("message", message.getMessage())); + } + + private Message fromDocumentToMessage(Document d) { + return new Message( + new Timestamp(Long.parseLong(d.get("timestamp").toString())), + ""+d.get("user"), + ""+d.get("message")); + } + +}