Back to Repositories

Validating Cron Expression Handling in Spring Cloud Alibaba

This test suite validates the CronExpression utility class in Spring Cloud Alibaba’s SchedulerX component, focusing on cron expression validation and time calculation functionality. The tests ensure proper handling of various cron patterns and time-based operations.

Test Coverage Overview

The test suite provides comprehensive coverage of CronExpression functionality:
  • Validation of various cron expression patterns including standard time formats and special characters
  • Testing of time calculation methods for both future and past dates
  • Edge cases including invalid month names, day patterns, and numeric ranges
  • Verification of specific scheduling patterns like interval-based and day-of-week expressions

Implementation Analysis

The testing approach utilizes JUnit Jupiter with AssertJ assertions for clean and expressive test cases.
  • Structured test methods for distinct functionality validation
  • Boolean assertions for expression validation tests
  • Date manipulation testing for time calculation features
  • Systematic validation of both valid and invalid cron patterns

Technical Details

Testing infrastructure includes:
  • JUnit Jupiter test framework
  • AssertJ assertion library for enhanced validation
  • Native Java Date API integration
  • ParseException handling for invalid expressions
  • System output verification for debugging purposes

Best Practices Demonstrated

The test suite exemplifies several testing best practices:
  • Clear test method naming reflecting functionality under test
  • Comprehensive positive and negative test cases
  • Proper exception handling and validation
  • Isolated test methods for specific functionality
  • Consistent assertion patterns across test cases

alibaba/spring-cloud-alibaba

spring-cloud-alibaba-starters/spring-cloud-starter-alibaba-schedulerx/src/test/java/com/alibaba/cloud/scheduling/schedulerx/util/CronExpressionTest.java

            
/*
 * Copyright 2024-2025 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.alibaba.cloud.scheduling.schedulerx.util;

import java.text.ParseException;
import java.util.Date;

import org.junit.jupiter.api.Test;

import static org.assertj.core.api.Assertions.assertThat;

/**
 * @author yaohui
 */
class CronExpressionTest {

	@Test
	void isValidExpression() {
		assertThat(CronExpression.isValidExpression("0 0 0 * * ?")).isEqualTo(true);
		assertThat(CronExpression.isValidExpression("0 */5 * * * ?")).isEqualTo(true);
		assertThat(CronExpression.isValidExpression("0 0 8 1 JAN ?")).isEqualTo(true);
		assertThat(CronExpression.isValidExpression("0 0 8 ? 10 THU")).isEqualTo(true);
		assertThat(CronExpression.isValidExpression("0 0 8 ? 10 THU-SAT")).isEqualTo(true);
		assertThat(CronExpression.isValidExpression("0 0 8 ? 10 FRI#1")).isEqualTo(true);
		assertThat(CronExpression.isValidExpression("0 0 8 ? 10 FRI#5")).isEqualTo(true);
		// false
		assertThat(CronExpression.isValidExpression("0 0 8 1 JAW ?")).isEqualTo(false);
		assertThat(CronExpression.isValidExpression("0 0 8 ? 10 THP-SAT")).isEqualTo(false);
		assertThat(CronExpression.isValidExpression("0 0 8 ? 10 FRI#0")).isEqualTo(false);
		assertThat(CronExpression.isValidExpression("0 0 8 ? 10 FRI#6")).isEqualTo(false);
	}

	@Test
	void getTimeAfter() throws ParseException {
		CronExpression cronExpression = new CronExpression("0 0 8 1 JAN ?");
		Date nextDate = cronExpression.getTimeAfter(new Date());
		System.out.println(nextDate);
		assertThat(nextDate).isNotNull();

		cronExpression = new CronExpression("0 */5 * * * ?");
		nextDate = cronExpression.getTimeAfter(new Date());
		System.out.println(nextDate);
		assertThat(nextDate).isNotNull();
	}

	@Test
	void getTimeBefore() throws ParseException {
		CronExpression cronExpression = new CronExpression("0 0 8 1 JAN ?");
		Date beforeDate = cronExpression.getTimeBefore(new Date());
		System.out.println(beforeDate);
		assertThat(beforeDate).isNotNull();

		cronExpression = new CronExpression("0 */5 * * * ?");
		beforeDate = cronExpression.getTimeBefore(new Date());
		System.out.println(beforeDate);
		assertThat(beforeDate).isNotNull();
	}

}