diff --git a/cache-caffeine/README.adoc b/cache-caffeine/README.adoc new file mode 100644 index 00000000..4dcbc05f --- /dev/null +++ b/cache-caffeine/README.adoc @@ -0,0 +1 @@ +Tests if caching with Caffeine works diff --git a/cache-caffeine/build.gradle b/cache-caffeine/build.gradle new file mode 100644 index 00000000..d91b3020 --- /dev/null +++ b/cache-caffeine/build.gradle @@ -0,0 +1,17 @@ +plugins { + id 'java' + id 'org.springframework.boot' + id 'org.springframework.aot.smoke-test' + id 'org.graalvm.buildtools.native' +} + +dependencies { + implementation(platform(org.springframework.boot.gradle.plugin.SpringBootPlugin.BOM_COORDINATES)) + implementation("org.springframework.boot:spring-boot-starter-cache") + implementation("com.github.ben-manes.caffeine:caffeine") + + testImplementation("org.springframework.boot:spring-boot-starter-test") + + aotTestImplementation(project(":aot-smoke-test-support")) + aotTestImplementation("org.awaitility:awaitility:4.2.0") +} diff --git a/cache-caffeine/src/aotTest/java/com/example/cache/caffeine/CacheCaffeineApplicationAotTests.java b/cache-caffeine/src/aotTest/java/com/example/cache/caffeine/CacheCaffeineApplicationAotTests.java new file mode 100644 index 00000000..bb703723 --- /dev/null +++ b/cache-caffeine/src/aotTest/java/com/example/cache/caffeine/CacheCaffeineApplicationAotTests.java @@ -0,0 +1,31 @@ +package com.example.cache.caffeine; + +import java.time.Duration; + +import org.awaitility.Awaitility; +import org.junit.jupiter.api.Test; + +import org.springframework.aot.smoketest.support.assertj.AssertableOutput; +import org.springframework.aot.smoketest.support.junit.AotSmokeTest; + +import static org.assertj.core.api.Assertions.assertThat; + +@AotSmokeTest +class CacheCaffeineApplicationAotTests { + + @Test + void methodIsCachedOnClasses(AssertableOutput output) { + Awaitility.await().atMost(Duration.ofSeconds(10)).untilAsserted(() -> { + assertThat(output).hasSingleLineContaining("class.invoke: 1").hasNoLinesContaining("class.invoke: 2"); + }); + } + + @Test + void methodIsCachedOnInterfaces(AssertableOutput output) { + Awaitility.await().atMost(Duration.ofSeconds(10)).untilAsserted(() -> { + assertThat(output).hasSingleLineContaining("interface.invoke: 1") + .hasNoLinesContaining("interface.invoke: 2"); + }); + } + +} diff --git a/cache-caffeine/src/main/java/com/example/cache/caffeine/CLR.java b/cache-caffeine/src/main/java/com/example/cache/caffeine/CLR.java new file mode 100644 index 00000000..77ddf72e --- /dev/null +++ b/cache-caffeine/src/main/java/com/example/cache/caffeine/CLR.java @@ -0,0 +1,30 @@ +package com.example.cache.caffeine; + +import com.example.cache.caffeine.clazz.TestServiceClass; +import com.example.cache.caffeine.iface.TestServiceInterface; + +import org.springframework.boot.CommandLineRunner; +import org.springframework.stereotype.Component; + +@Component +class CLR implements CommandLineRunner { + + private final TestServiceClass testServiceClass; + + private final TestServiceInterface testServiceInterface; + + public CLR(TestServiceClass testServiceClass, TestServiceInterface testServiceInterface) { + this.testServiceClass = testServiceClass; + this.testServiceInterface = testServiceInterface; + } + + @Override + public void run(String... args) { + this.testServiceClass.invoke(); + this.testServiceClass.invoke(); + + this.testServiceInterface.invoke(); + this.testServiceInterface.invoke(); + } + +} diff --git a/cache-caffeine/src/main/java/com/example/cache/caffeine/CacheCaffeineApplication.java b/cache-caffeine/src/main/java/com/example/cache/caffeine/CacheCaffeineApplication.java new file mode 100644 index 00000000..b75a4f9f --- /dev/null +++ b/cache-caffeine/src/main/java/com/example/cache/caffeine/CacheCaffeineApplication.java @@ -0,0 +1,14 @@ +package com.example.cache.caffeine; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class CacheCaffeineApplication { + + public static void main(String[] args) throws InterruptedException { + SpringApplication.run(CacheCaffeineApplication.class, args); + Thread.currentThread().join(); // To be able to measure memory consumption + } + +} diff --git a/cache-caffeine/src/main/java/com/example/cache/caffeine/CacheConfiguration.java b/cache-caffeine/src/main/java/com/example/cache/caffeine/CacheConfiguration.java new file mode 100644 index 00000000..e80e1f89 --- /dev/null +++ b/cache-caffeine/src/main/java/com/example/cache/caffeine/CacheConfiguration.java @@ -0,0 +1,10 @@ +package com.example.cache.caffeine; + +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.context.annotation.Configuration; + +@Configuration(proxyBeanMethods = false) +@EnableCaching +class CacheConfiguration { + +} diff --git a/cache-caffeine/src/main/java/com/example/cache/caffeine/clazz/TestServiceClass.java b/cache-caffeine/src/main/java/com/example/cache/caffeine/clazz/TestServiceClass.java new file mode 100644 index 00000000..7f9d67f1 --- /dev/null +++ b/cache-caffeine/src/main/java/com/example/cache/caffeine/clazz/TestServiceClass.java @@ -0,0 +1,17 @@ +package com.example.cache.caffeine.clazz; + +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; + +@Service +public class TestServiceClass { + + private int counter = 1; + + @Cacheable(cacheNames = "class.invoke") + public void invoke() { + System.out.printf("class.invoke: %d%n", this.counter); + this.counter++; + } + +} diff --git a/cache-caffeine/src/main/java/com/example/cache/caffeine/iface/TestServiceInterface.java b/cache-caffeine/src/main/java/com/example/cache/caffeine/iface/TestServiceInterface.java new file mode 100644 index 00000000..2f4ea154 --- /dev/null +++ b/cache-caffeine/src/main/java/com/example/cache/caffeine/iface/TestServiceInterface.java @@ -0,0 +1,7 @@ +package com.example.cache.caffeine.iface; + +public interface TestServiceInterface { + + void invoke(); + +} diff --git a/cache-caffeine/src/main/java/com/example/cache/caffeine/iface/TestServiceWithInterface.java b/cache-caffeine/src/main/java/com/example/cache/caffeine/iface/TestServiceWithInterface.java new file mode 100644 index 00000000..55638fd4 --- /dev/null +++ b/cache-caffeine/src/main/java/com/example/cache/caffeine/iface/TestServiceWithInterface.java @@ -0,0 +1,18 @@ +package com.example.cache.caffeine.iface; + +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; + +@Service +class TestServiceWithInterface implements TestServiceInterface { + + private int counter = 1; + + @Override + @Cacheable(cacheNames = "interface.invoke") + public void invoke() { + System.out.printf("interface.invoke: %d%n", this.counter); + this.counter++; + } + +} diff --git a/cache-caffeine/src/main/resources/application.properties b/cache-caffeine/src/main/resources/application.properties new file mode 100644 index 00000000..b500c035 --- /dev/null +++ b/cache-caffeine/src/main/resources/application.properties @@ -0,0 +1 @@ +spring.cache.type=caffeine diff --git a/cache-caffeine/src/test/java/com/example/cache/caffeine/CacheCaffeineApplicationTests.java b/cache-caffeine/src/test/java/com/example/cache/caffeine/CacheCaffeineApplicationTests.java new file mode 100644 index 00000000..d014756c --- /dev/null +++ b/cache-caffeine/src/test/java/com/example/cache/caffeine/CacheCaffeineApplicationTests.java @@ -0,0 +1,14 @@ +package com.example.cache.caffeine; + +import org.junit.jupiter.api.Test; + +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class CacheCaffeineApplicationTests { + + @Test + void contextLoads() { + } + +} diff --git a/ci/smoke-tests.yml b/ci/smoke-tests.yml index 485798c7..e5950367 100644 --- a/ci/smoke-tests.yml +++ b/ci/smoke-tests.yml @@ -6,6 +6,7 @@ smoke_tests: - aspect - async - batch + - cache-caffeine - cache-hazelcast - cloud-function-web - cloud-function-webflux diff --git a/settings.gradle b/settings.gradle index d1eac0cb..547c0d5b 100644 --- a/settings.gradle +++ b/settings.gradle @@ -34,6 +34,7 @@ include "actuator-webmvc-mgmt-port" include "aspect" include "async" include "batch" +include "cache-caffeine" include "cache-hazelcast" include "cloud-function-web" include "cloud-function-webflux"