Home / Class/ ApplicationPidFileWriterTests Class — spring-boot Architecture

ApplicationPidFileWriterTests Class — spring-boot Architecture

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

Entity Profile

Relationship Graph

Source Code

core/spring-boot/src/test/java/org/springframework/boot/context/ApplicationPidFileWriterTests.java lines 54–207

class ApplicationPidFileWriterTests {

	private static final ApplicationPreparedEvent EVENT = new ApplicationPreparedEvent(new SpringApplication(),
			new String[] {}, mock(ConfigurableApplicationContext.class));

	@TempDir
	@SuppressWarnings("NullAway.Init")
	File tempDir;

	@BeforeEach
	@AfterEach
	void resetListener() {
		System.clearProperty("PIDFILE");
		System.clearProperty("PID_FAIL_ON_WRITE_ERROR");
		ApplicationPidFileWriter.reset();
	}

	@Test
	void createPidFile() {
		File file = new File(this.tempDir, "pid");
		ApplicationPidFileWriter listener = new ApplicationPidFileWriter(file);
		listener.onApplicationEvent(EVENT);
		assertThat(contentOf(file)).isNotEmpty();
	}

	@Test
	void overridePidFile() {
		File file = new File(this.tempDir, "pid");
		System.setProperty("PIDFILE", new File(this.tempDir, "override").getAbsolutePath());
		ApplicationPidFileWriter listener = new ApplicationPidFileWriter(file);
		listener.onApplicationEvent(EVENT);
		assertThat(contentOf(new File(System.getProperty("PIDFILE")))).isNotEmpty();
	}

	@Test
	void overridePidFileWithSpring() {
		File file = new File(this.tempDir, "pid");
		SpringApplicationEvent event = createPreparedEvent("spring.pid.file", file.getAbsolutePath());
		ApplicationPidFileWriter listener = new ApplicationPidFileWriter();
		listener.onApplicationEvent(event);
		assertThat(contentOf(file)).isNotEmpty();
	}

	@Test
	void tryEnvironmentPreparedEvent() throws Exception {
		File file = new File(this.tempDir, "pid");
		file.createNewFile();
		SpringApplicationEvent event = createEnvironmentPreparedEvent("spring.pid.file", file.getAbsolutePath());
		ApplicationPidFileWriter listener = new ApplicationPidFileWriter();
		listener.onApplicationEvent(event);
		assertThat(contentOf(file)).isEmpty();
		listener.setTriggerEventType(ApplicationEnvironmentPreparedEvent.class);
		listener.onApplicationEvent(event);
		assertThat(contentOf(file)).isNotEmpty();
	}

	@Test
	void tryReadyEvent() throws Exception {
		File file = new File(this.tempDir, "pid");
		file.createNewFile();
		SpringApplicationEvent event = createReadyEvent("spring.pid.file", file.getAbsolutePath());
		ApplicationPidFileWriter listener = new ApplicationPidFileWriter();
		listener.onApplicationEvent(event);
		assertThat(contentOf(file)).isEmpty();
		listener.setTriggerEventType(ApplicationReadyEvent.class);
		listener.onApplicationEvent(event);
		assertThat(contentOf(file)).isNotEmpty();
	}

	@Test
	void withNoEnvironment() {
		File file = new File(this.tempDir, "pid");
		ApplicationPidFileWriter listener = new ApplicationPidFileWriter(file);
		listener.setTriggerEventType(ApplicationStartingEvent.class);
		listener.onApplicationEvent(
				new ApplicationStartingEvent(new DefaultBootstrapContext(), new SpringApplication(), new String[] {}));
		assertThat(contentOf(file)).isNotEmpty();
	}

	@Test
	void continueWhenPidFileIsReadOnly() throws Exception {
		withReadOnlyPidFile((file) -> {
			ApplicationPidFileWriter listener = new ApplicationPidFileWriter(file);
			listener.onApplicationEvent(EVENT);
			assertThat(contentOf(file)).isEmpty();
		});
	}

	@Test
	void throwWhenPidFileIsReadOnly() throws Exception {
		withReadOnlyPidFile((file) -> {
			System.setProperty("PID_FAIL_ON_WRITE_ERROR", "true");
			ApplicationPidFileWriter listener = new ApplicationPidFileWriter(file);
			assertThatIllegalStateException().isThrownBy(() -> listener.onApplicationEvent(EVENT))
				.withMessageContaining("Cannot create pid file");
		});
	}

	@Test
	void throwWhenPidFileIsReadOnlyWithSpring() throws Exception {
		withReadOnlyPidFile((file) -> {
			SpringApplicationEvent event = createPreparedEvent("spring.pid.fail-on-write-error", "true");
			ApplicationPidFileWriter listener = new ApplicationPidFileWriter(file);
			assertThatIllegalStateException().isThrownBy(() -> listener.onApplicationEvent(event))
				.withMessageContaining("Cannot create pid file");
		});
	}

	private void withReadOnlyPidFile(Consumer<File> consumer) throws IOException {
		File file = new File(this.tempDir, "pid");
		file.createNewFile();
		file.setReadOnly();
		try {
			consumer.accept(file);
		}
		finally {
			file.setWritable(true);
		}
	}

	private SpringApplicationEvent createEnvironmentPreparedEvent(String propName, String propValue) {
		ConfigurableEnvironment environment = createEnvironment(propName, propValue);
		return new ApplicationEnvironmentPreparedEvent(new DefaultBootstrapContext(), new SpringApplication(),
				new String[] {}, environment);
	}

	private SpringApplicationEvent createPreparedEvent(String propName, String propValue) {
		ConfigurableEnvironment environment = createEnvironment(propName, propValue);
		ConfigurableApplicationContext context = mock(ConfigurableApplicationContext.class);
		given(context.getEnvironment()).willReturn(environment);
		return new ApplicationPreparedEvent(new SpringApplication(), new String[] {}, context);
	}

	private SpringApplicationEvent createReadyEvent(String propName, String propValue) {
		ConfigurableEnvironment environment = createEnvironment(propName, propValue);
		ConfigurableApplicationContext context = mock(ConfigurableApplicationContext.class);
		given(context.getEnvironment()).willReturn(environment);
		return new ApplicationReadyEvent(new SpringApplication(), new String[] {}, context, null);
	}

	private ConfigurableEnvironment createEnvironment(String propName, String propValue) {
		MockPropertySource propertySource = mockPropertySource(propName, propValue);
		ConfigurableEnvironment environment = new StandardEnvironment();
		environment.getPropertySources().addLast(propertySource);
		return environment;
	}

	private MockPropertySource mockPropertySource(String name, String value) {
		MockPropertySource propertySource = new MockPropertySource();
		propertySource.setProperty(name, value);
		return propertySource;
	}

}

Domain

Analyze Your Own Codebase

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

Try Supermodel Free