Question: I'm using helm charts to deploy several REST services with into k8s with spring boot inside deployed container.

However, to be able to do final stage testing I need to introduce some sort of smart liveness probe - i.e. that the target application is actually running properly inside given container.

This can be easily justified by successful return code of simple `curl` command, however, here's the trick - command needs to be executed with some delay after particular release deployment to give application time to bootstrap.

Here's what I've figured for a test suite:

```
apiVersion: v1
kind: Pod
metadata:
  name: "{{ include "chart.fullname" . }}-test"
  labels:
  {{- include "chart.fullname" . | nindent 4 }}
  annotations:
    "helm.sh/hook": test-success
spec:
  containers:
    - name: test-curl
      image: curl
      command: ['curl']
      args: [' -X POST -i -H "Accept: application/json" -H "Content-Type:application/json" -d ''{"foo":["bar"]}'' {{ include "chart.fullname" . }}:{{ .Values.service.port }}']
  restartPolicy: Never

```

The key problem is that this test will be executed when service is not really started yet and thus fail anyway.

Is there some mechanism or workaround to introduce delay of execution for this test?

Setting some sleep step in separate test container comes to mind but i'm not sure if this will work properly for this case

Answer: 
In Java 17, you will be able to write this using a `switch` expression. According [issue 8213076](https://bugs.openjdk.java.net/browse/JDK-8213076), the syntax will be:

```
public static boolean isEmpty(Object value) {
    return switch(value) {
      case String s -> s.isEmpty();
      case List l -> l.isEmpty();
      case String[] sa -> ArrayUtils.isEmpty(sa);
      default -> value == null;
    }
}

```

NB: This is a **preview** feature in Java 17. It could change or even be removed entirely in a later release.

---

(The original proposed syntax in [JEP 406](https://openjdk.java.net/jeps/406) was a bit different:

```
public static boolean isEmpty(Object value) {
    return switch(value) {
      case String -> value.isEmpty();
      case List -> value.isEmpty();
      case String[] -> ArrayUtils.isEmpty(value);
      default -> value == null;
    }
}

```

As you can see, the original version did not require a separate binding variable in each `case`.)
Java native utils gives you the abaility to check if `Objects.isNull(value)` which is **not** equivalent to empty. If you want to stick with native Java you are doing it right just beautify your code and that's it.
However this method exists in springFramework `ObjectUtils` class regardless of the type of object :

```
import org.springframework.util.ObjectUtils;

public static boolean isEmpty(Object value) {
    boolean empty = false;
if (ObjectUtils.isEmpty(value)) {
empty= true
}
return empty;
}

```

Spring Framework doc : [Class ObjectUtils](https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/util/ObjectUtils.html)