Home / Class/ SoftReferenceConfigurationPropertyCacheTests Class — spring-boot Architecture

SoftReferenceConfigurationPropertyCacheTests Class — spring-boot Architecture

Architecture documentation for the SoftReferenceConfigurationPropertyCacheTests class in SoftReferenceConfigurationPropertyCacheTests.java from the spring-boot codebase.

Entity Profile

Source Code

core/spring-boot/src/test/java/org/springframework/boot/context/properties/source/SoftReferenceConfigurationPropertyCacheTests.java lines 37–234

class SoftReferenceConfigurationPropertyCacheTests {

	private static final Clock FIXED_CLOCK = Clock.fixed(Instant.parse("2020-01-02T09:00:00Z"), ZoneOffset.UTC);

	private Clock clock = FIXED_CLOCK;

	private final AtomicInteger createCount = new AtomicInteger();

	private TestSoftReferenceConfigurationPropertyCache cache = new TestSoftReferenceConfigurationPropertyCache(false);

	@Test
	void getReturnsValueWithCorrectCounts() {
		get(this.cache).assertCounts(0, 0);
		get(this.cache).assertCounts(0, 1);
		get(this.cache).assertCounts(0, 2);
	}

	@Test
	void getWhenNeverExpireReturnsValueWithCorrectCounts() {
		this.cache = new TestSoftReferenceConfigurationPropertyCache(true);
		get(this.cache).assertCounts(0, 0);
		get(this.cache).assertCounts(0, 0);
		get(this.cache).assertCounts(0, 0);
	}

	@Test
	void enableEnablesCachingWithUnlimitedTimeToLive() {
		this.cache.enable();
		get(this.cache).assertCounts(0, 0);
		tick(Duration.ofDays(300));
		get(this.cache).assertCounts(0, 0);
	}

	@Test
	void setTimeToLiveEnablesCachingWithTimeToLive() {
		this.cache.setTimeToLive(Duration.ofDays(1));
		get(this.cache).assertCounts(0, 0);
		tick(Duration.ofHours(2));
		get(this.cache).assertCounts(0, 0);
		tick(Duration.ofDays(2));
		get(this.cache).assertCounts(0, 1);
	}

	@Test
	void setTimeToLiveWhenZeroDisablesCaching() {
		this.cache.setTimeToLive(Duration.ZERO);
		get(this.cache).assertCounts(0, 0);
		get(this.cache).assertCounts(0, 1);
		get(this.cache).assertCounts(0, 2);
	}

	@Test
	void setTimeToLiveWhenNullDisablesCaching() {
		this.cache.setTimeToLive(null);
		get(this.cache).assertCounts(0, 0);
		get(this.cache).assertCounts(0, 1);
		get(this.cache).assertCounts(0, 2);
	}

	@Test
	void clearExpiresCache() {
		this.cache.enable();
		get(this.cache).assertCounts(0, 0);
		get(this.cache).assertCounts(0, 0);
		this.cache.clear();
		get(this.cache).assertCounts(0, 1);
	}

	@Test
	void overrideWhenNeverExpiresReturnsNoOpOverride() {
		TestSoftReferenceConfigurationPropertyCache cache = new TestSoftReferenceConfigurationPropertyCache(true);
		assertThat(cache.override()).isSameAs(SoftReferenceConfigurationPropertyCache.NO_OP_OVERRIDE);
	}

	@Test
	void overrideEnablesCaching() {
		get(this.cache).assertCounts(0, 0);
		get(this.cache).assertCounts(0, 1);
		try (CacheOverride override = this.cache.override()) {
			get(this.cache).assertCounts(0, 2);
			get(this.cache).assertCounts(0, 2);
			get(this.cache).assertCounts(0, 2);
		}
		get(this.cache).assertCounts(0, 3);
	}

	@Test
	void overrideWhenHasExistingTimeToLiveEnablesCaching() {
		this.cache.setTimeToLive(Duration.ofHours(1));
		get(this.cache).assertCounts(0, 0);
		get(this.cache).assertCounts(0, 0);
		tick(Duration.ofHours(2));
		get(this.cache).assertCounts(0, 1);
		try (CacheOverride override = this.cache.override()) {
			get(this.cache).assertCounts(0, 1);
			tick(Duration.ofHours(2));
			get(this.cache).assertCounts(0, 1);
		}
		get(this.cache).assertCounts(0, 2);
		get(this.cache).assertCounts(0, 2);
		tick(Duration.ofHours(2));
		get(this.cache).assertCounts(0, 3);
	}

	@Test
	void overrideWhenDisabledDoesNotReturnStaleData() {
		get(this.cache).assertCounts(0, 0);
		get(this.cache).assertCounts(0, 1);
		this.cache.disable();
		try (CacheOverride override = this.cache.override()) {
			get(this.cache).assertCounts(0, 2);
			get(this.cache).assertCounts(0, 2);
		}
		get(this.cache).assertCounts(0, 3);
	}

	@Test
	void overrideCanBeClosedTwiceWithoutIssue() {
		get(this.cache).assertCounts(0, 0);
		get(this.cache).assertCounts(0, 1);
		this.cache.disable();
		try (CacheOverride override = this.cache.override()) {
			get(this.cache).assertCounts(0, 2);
			get(this.cache).assertCounts(0, 2);
			override.close();
			get(this.cache).assertCounts(0, 3);
		}
		get(this.cache).assertCounts(0, 4);

	}

	private Value get(SoftReferenceConfigurationPropertyCache<Value> cache) {
		return cache.get(this::createValue, this::updateValue);
	}

	private Value createValue() {
		return new Value(this.createCount.getAndIncrement(), -1);
	}

	private Value updateValue(Value value) {
		return new Value(value.createCount, value.refreshCount + 1);
	}

	private void tick(Duration duration) {
		this.clock = Clock.offset(this.clock, duration);
	}

	/**
	 * Testable {@link SoftReferenceConfigurationPropertyCache} that actually uses real
	 * references.
	 */
	class TestSoftReferenceConfigurationPropertyCache extends SoftReferenceConfigurationPropertyCache<Value> {

		private @Nullable Value value;

		TestSoftReferenceConfigurationPropertyCache(boolean neverExpire) {
			super(neverExpire);
		}

		@Override
		protected @Nullable Value getValue() {
			return this.value;
		}

		@Override
		protected void setValue(Value value) {
			this.value = value;
		}

		@Override
		protected Instant now() {
			return SoftReferenceConfigurationPropertyCacheTests.this.clock.instant();
		}

	}

	/**
	 * Value used for testing.
	 */
	static class Value {

		private final int createCount;

		private final int refreshCount;

		Value(int createCount, int refreshCount) {
			this.createCount = createCount;
			this.refreshCount = refreshCount;
		}

		void assertCounts(int expectedCreateCount, int expectedRefreshCount) {
			assertThat(this.createCount).as("created").isEqualTo(expectedCreateCount);
			assertThat(this.refreshCount).as("refreshed").isEqualTo(expectedRefreshCount);
		}

	}

}

Analyze Your Own Codebase

Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.

Try Supermodel Free