Skip to content

Commit

Permalink
Feature/data generator tests (#3)
Browse files Browse the repository at this point in the history
* CI updated

- build renamed as build-dev
- redundant dep submission removed

* IDEA plugin configured for all

* kafka consumer starter module created

* tests added for util class

* ci update

* sonar and jacoco config

* sonar and jacoco config

* ci config enhanced
  • Loading branch information
maemresen committed May 4, 2024
1 parent 1d10183 commit 859948d
Show file tree
Hide file tree
Showing 32 changed files with 233 additions and 74 deletions.
21 changes: 16 additions & 5 deletions .github/workflows/build.yaml → .github/workflows/build-dev.yaml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
name: Build
name: Build DEV

on:
push:
Expand All @@ -17,6 +17,9 @@ jobs:
name: Configuring Build Number
run: |
echo "BUILD_NUMBER=$(git rev-parse --short=8 HEAD)" >> $GITHUB_OUTPUT
- name: Get current branch name
id: get_branch
run: echo "CURRENT_BRANCH_NAME=$(git rev-parse --abbrev-ref HEAD)" >> $GITHUB_ENV
- name: Test Build Number
run: echo "${{ steps.build-number.outputs.BUILD_NUMBER }}"
- name: Set up JDK 21
Expand All @@ -27,11 +30,19 @@ jobs:
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v3.1.0
- name: Build
run: ./gradlew clean assemble -Pversion=${{ steps.build-number.outputs.BUILD_NUMBER }}
run: CI=true ./gradlew clean assemble -Pversion=${{ steps.build-number.outputs.BUILD_NUMBER }}
- name: Test
run: ./gradlew test
run: CI=true ./gradlew test
- name: Integration Test
run: ./gradlew integrationTest
run: CI=true ./gradlew integrationTest
- name: Sonar Scan
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Needed to get PR information, if any
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
BRANCH_NAME: ${{ env.CURRENT_BRANCH_NAME }}
run: |
echo "Branch name $BRANCH_NAME"
CI=true ./gradlew sonar --info -Dsonar.branch.name=$BRANCH_NAME
- name: Uploading DataGenerator Jars
uses: actions/upload-artifact@master
with:
Expand Down Expand Up @@ -61,4 +72,4 @@ jobs:
with:
context: module/app/data-generator
push: true
tags: ghcr.io/maeworkshop/data-generator:${{ needs.build-jar.outputs.BUILD_NUMBER }}
tags: ghcr.io/maeworkshop/data-generator:dev-${{ needs.build-jar.outputs.BUILD_NUMBER }}
37 changes: 18 additions & 19 deletions .github/workflows/check.yaml
Original file line number Diff line number Diff line change
@@ -1,42 +1,41 @@
name: Feature/Bugfix Check
name: Check Branch

on:
push:
branches:
- feature/**
- bugfix/**

workflow_dispatch:
jobs:
build:
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Set up JDK 21
uses: actions/setup-java@v4
with:
java-version: '21'
distribution: 'temurin'
- name: Get current branch name
id: get_branch
run: echo "CURRENT_BRANCH_NAME=$(git rev-parse --abbrev-ref HEAD)" >> $GITHUB_ENV
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v3.1.0
- name: Build
run: ./gradlew clean assemble
run: CI=true ./gradlew clean assemble
- name: Test
run: ./gradlew test
run: CI=true ./gradlew test
- name: Integration Test
run: ./gradlew integrationTest

dependency-submission:
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- uses: actions/checkout@v4
- name: Set up JDK 21
uses: actions/setup-java@v4
with:
java-version: '21'
distribution: 'temurin'
- name: Generate and submit dependency graph
uses: gradle/actions/dependency-submission@v3.1.0
run: CI=true ./gradlew integrationTest
- name: Sonar Scan
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Needed to get PR information, if any
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
BRANCH_NAME: ${{ env.CURRENT_BRANCH_NAME }}
run: |
echo "Branch name $BRANCH_NAME"
CI=true ./gradlew sonar --info -Dsonar.branch.name=$BRANCH_NAME
2 changes: 1 addition & 1 deletion .run/Data Generator.run.xml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
</option>
<option name="taskNames">
<list>
<option value=":module:app:data-generator:bootRun" />
<option value=":module:app:k8s-workshop-data-generator:bootRun" />
</list>
</option>
<option name="vmOptions" />
Expand Down
2 changes: 1 addition & 1 deletion .run/Listener.run.xml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
</option>
<option name="taskNames">
<list>
<option value=":module:app:listener:bootRun" />
<option value=":module:app:k8s-workshop-listener:bootRun" />
</list>
</option>
<option name="vmOptions" />
Expand Down
46 changes: 46 additions & 0 deletions build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,5 +1,18 @@
import org.gradle.plugins.ide.idea.model.IdeaModel

plugins {
id("org.sonarqube") version "4.4.1.3373"
}

sonar {
properties {
property("sonar.projectKey", "maeworkshop_k8s-workshop")
property("sonar.organization", "maeworkshop")
property("sonar.host.url", "https://sonarcloud.io")
property("sonar.coverage.jacoco.xmlReportPaths", "**/build/reports/jacoco/test/jacocoTestReport.xml")
}
}

subprojects {
pluginManager.withPlugin("java") {
val integrationTestSrcPath = "src/integrationTest"
Expand Down Expand Up @@ -53,6 +66,39 @@ subprojects {
}
}

pluginManager.withPlugin("jacoco") {
tasks {
named("test") {
finalizedBy(named("jacocoTestReport"))
}

named("jacocoTestReport") {
dependsOn("test")
}
}


}

pluginManager.withPlugin("jacoco") {
tasks {
named("test") {
finalizedBy(named("jacocoTestReport"))
}


named("jacocoTestReport") {
dependsOn("test")
}

withType<JacocoReport> {
reports {
xml.required = true
}
}
}
}

pluginManager.withPlugin("idea") {
extensions.configure<IdeaModel> {
module {
Expand Down

This file was deleted.

File renamed without changes.
42 changes: 42 additions & 0 deletions module/app/k8s-workshop-data-generator/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
plugins {
idea
java
jacoco
id("org.springframework.boot") version "3.2.1"
id("io.spring.dependency-management") version "1.1.4"
}

val avroVersion = "1.11.3"
val confluentVersion = "7.6.1"
val springCloudVersion = "2023.0.0"
val lombokVersion = "1.18.30"

repositories {
maven {
setUrl("https://packages.confluent.io/maven/")
}
}

dependencyManagement {
imports {
mavenBom("org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}")
}
}

dependencies {
implementation("org.springframework.boot:spring-boot-starter")
implementation("org.springframework.cloud:spring-cloud-starter-stream-kafka")
implementation("org.apache.avro:avro:$avroVersion")
implementation("io.confluent:kafka-avro-serializer:$confluentVersion")
implementation("io.confluent:kafka-schema-registry-client:$confluentVersion")
implementation(project(":module:lib:k8s-workshop-avro-schemes"))
implementation(project(":module:lib:k8s-workshop-messaging-spring-boot-starter"))

testImplementation("org.springframework.boot:spring-boot-starter-test")
testImplementation("org.assertj:assertj-core")

compileOnly("org.projectlombok:lombok:$lombokVersion")
annotationProcessor("org.projectlombok:lombok:$lombokVersion")
testCompileOnly("org.projectlombok:lombok:$lombokVersion")
testAnnotationProcessor("org.projectlombok:lombok:$lombokVersion")
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
package com.maemresen.data.generator;
package com.maemresen.k8s.workshop.data.generator;

import org.springframework.boot.WebApplicationType;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.context.annotation.ComponentScan;

@ComponentScan("com.maemresen")
@SpringBootApplication
public class DataGeneratorApp {

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.maemresen.data.generator.config;
package com.maemresen.k8s.workshop.data.generator.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.maemresen.data.generator.config.props;
package com.maemresen.k8s.workshop.data.generator.config.props;

import java.util.List;
import com.maemresen.lib.message.dto.SensorType;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
package com.maemresen.data.generator.messaging;
package com.maemresen.k8s.workshop.data.generator.messaging;

import com.maemresen.data.generator.config.props.MessagingProps;
import com.maemresen.data.generator.util.Topic;
import com.maemresen.lib.message.dto.SensorData;
import com.maemresen.k8s.workshop.messaging.starter.BaseMessageProducer;
import com.maemresen.k8s.workshop.messaging.starter.MessagingProps;
import com.maemresen.k8s.workshop.messaging.starter.Topic;
import org.springframework.cloud.function.cloudevent.CloudEventMessageBuilder;
import org.springframework.cloud.stream.function.StreamBridge;
import org.springframework.stereotype.Component;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package com.maemresen.data.generator.task;
package com.maemresen.k8s.workshop.data.generator.task;

import com.maemresen.data.generator.config.props.SensorDataGeneratorProps;
import com.maemresen.data.generator.messaging.SensorDataProducer;
import com.maemresen.data.generator.util.SensorDataGeneratorUtil;
import com.maemresen.k8s.workshop.data.generator.config.props.SensorDataGeneratorProps;
import com.maemresen.k8s.workshop.data.generator.messaging.SensorDataProducer;
import com.maemresen.k8s.workshop.data.generator.util.SensorDataGeneratorUtil;
import com.maemresen.lib.message.dto.SensorData;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,18 +1,23 @@
package com.maemresen.data.generator.util;
package com.maemresen.k8s.workshop.data.generator.util;

import java.security.SecureRandom;
import java.util.Random;
import com.maemresen.lib.message.dto.Device;
import com.maemresen.lib.message.dto.Sensor;
import com.maemresen.lib.message.dto.SensorData;
import com.maemresen.lib.message.dto.SensorType;
import java.security.SecureRandom;
import java.util.Random;
import lombok.experimental.UtilityClass;

@UtilityClass
public class SensorDataGeneratorUtil {

private static final Random random = new SecureRandom();

public static final double TEMP_MIN_VALUE = 20.0;
public static final double TEMP_MAX_VALUE = 35.0;
public static final double HUMIDITY_MIN_VALUE = 30.0;
public static final double HUMIDITY_MAX_VALUE = 100.0;

public static SensorData generateRandomSensorData(
final String locationName,
final String deviceName,
Expand All @@ -38,8 +43,9 @@ public static SensorData generateRandomSensorData(

private static double generateRandomValue(String sensorType) {
return switch (sensorType) {
case "TEMP" -> 20 + 15 * random.nextDouble(); // Temperature from 20 to 35
case "HUMIDITY" -> 30 + 70 * random.nextDouble(); // Humidity from 30% to 100%
case "TEMP" -> TEMP_MIN_VALUE + (TEMP_MAX_VALUE - TEMP_MIN_VALUE) * random.nextDouble();
case "HUMIDITY" ->
HUMIDITY_MIN_VALUE + (HUMIDITY_MAX_VALUE - HUMIDITY_MIN_VALUE) * random.nextDouble();
default -> 0;
};
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package com.maemresen.k8s.workshop.data.generator.util;

import com.maemresen.lib.message.dto.SensorData;
import com.maemresen.lib.message.dto.SensorType;
import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.*;

class SensorDataGeneratorUtilTest {

private static final String LOCATION_NAME = "Location";
private static final String DEVICE_NAME = "Device";
private static final String SENSOR_NAME = "Sensor";
private static final SensorType TEMPERATURE_SENSOR_TYPE = SensorType.TEMP;
private static final SensorType HUMIDITY_SENSOR_TYPE = SensorType.HUMIDITY;

@Test
void generateRandomSensorData_shouldReturnNonNullSensorData() {
final SensorData sensorData = SensorDataGeneratorUtil.generateRandomSensorData(LOCATION_NAME, DEVICE_NAME, SENSOR_NAME, TEMPERATURE_SENSOR_TYPE);
assertThat(sensorData).isNotNull();
}

@Test
void generateRandomSensorData_shouldGenerateTemperatureWithinRange() {
SensorData sensorData = SensorDataGeneratorUtil.generateRandomSensorData(LOCATION_NAME, DEVICE_NAME, SENSOR_NAME, TEMPERATURE_SENSOR_TYPE);
assertThat(sensorData.getValue()).isBetween(SensorDataGeneratorUtil.TEMP_MIN_VALUE, SensorDataGeneratorUtil.TEMP_MAX_VALUE);
}

@Test
void generateRandomSensorData_shouldGenerateHumidityWithinRange() {
final SensorData sensorData = SensorDataGeneratorUtil.generateRandomSensorData(LOCATION_NAME, DEVICE_NAME, SENSOR_NAME, HUMIDITY_SENSOR_TYPE);
assertThat(sensorData.getValue()).isBetween(SensorDataGeneratorUtil.HUMIDITY_MIN_VALUE, SensorDataGeneratorUtil.HUMIDITY_MAX_VALUE);
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
plugins {
idea
java
jacoco
id("org.springframework.boot") version "3.2.1"
id("io.spring.dependency-management") version "1.1.4"
}
Expand Down Expand Up @@ -27,7 +29,7 @@ dependencies {
implementation("org.apache.avro:avro:$avroVersion")
implementation("io.confluent:kafka-avro-serializer:$confluentVersion")
implementation("io.confluent:kafka-schema-registry-client:$confluentVersion")
implementation(project(":module:lib:message-dto"))
implementation(project(":module:lib:k8s-workshop-avro-schemes"))

compileOnly("org.projectlombok:lombok:$lombokVersion")
annotationProcessor("org.projectlombok:lombok:$lombokVersion")
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.maemresen.listener;
package com.maemresen.k8s.workshop.listener;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.maemresen.listener.messaging;
package com.maemresen.k8s.workshop.listener.messaging;

import com.maemresen.lib.message.dto.SensorData;
import java.util.function.Consumer;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.maemresen.listener.props;
package com.maemresen.k8s.workshop.listener.props;

import com.maemresen.listener.util.Topic;
import com.maemresen.k8s.workshop.listener.util.Topic;
import java.util.EnumMap;
import java.util.Map;
import lombok.AllArgsConstructor;
Expand Down
Loading

0 comments on commit 859948d

Please sign in to comment.