Running Tests for Flux

This document provides a step-by-step guide for running tests for the Flux project.

Prerequisites

  • Go 1.18 or later
  • Make
  • Docker

Running Tests

The Makefile provides several targets for running various tests:

1. Unit Tests:

Unit tests are run with the test target:

make test

This target will run all unit tests in the github.com/fluxcd/flux2/v2 module.

2. End-to-End (E2E) Tests:

E2E tests require a Kubernetes cluster. The e2e target runs all E2E tests:

make e2e

This target will set up a Kubernetes cluster using Kind, run the E2E tests, and then clean up the cluster. The setup-kind target can be used to manually set up the Kind cluster:

make setup-kind

You can then run the E2E tests with:

make test-with-kind

The cleanup-kind target can be used to tear down the Kind cluster:

make cleanup-kind

3. Environment Test (Envtest) Suite:

The envtest target runs a suite of tests using the Kubernetes environment test library.

make envtest

This target will create a Kubernetes cluster with the install-envtest target, run the environment tests and then clean it up with the cleanup-envtest target.

4. Other Targets

The following targets are available in the Makefile:

  • install: Installs the Flux binary to $GOPATH/bin.
  • build: Builds the Flux binary.
  • build-dev: Builds the Flux binary with debug symbols.
  • install-dev: Installs the Flux binary with debug symbols to $GOPATH/bin.
  • vet: Runs Go vet to check for potential code issues.
  • fmt: Runs Go fmt to format the code.
  • tidy: Runs Go mod tidy to remove unused dependencies.
  • all: Runs all tests and builds the Flux binary.

Example Test Cases

Here are examples of unit test cases:

File: cmd/flux/trace_test.go

//go:build unit
// +build unit
func TestTraceNoArgs(t *testing.T) {
    cmd := cmdTestCase{
        args:   "trace",
        assert: assertError("either `/` or ` ` is required as an argument"),
    }
    cmd.runTestCmd(t)
}

File: cmd/flux/main_unit_test.go

func TestMain(m *testing.M) {
    log.SetLogger(logr.New(log.NullLogSink{}))

    // Ensure tests print consistent timestamps regardless of timezone
    os.Setenv("TZ", "UTC")

    // Creating the test env manager sets rootArgs client flags
    km, err := NewTestEnvKubeManager(TestEnvClusterMode)
    if err != nil {
        panic(fmt.Errorf("error creating kube manager: '%w'", err))
    }
    testEnv = km
    // rootArgs.kubeconfig = testEnv.kubeConfigPath
    kubeconfigArgs.KubeConfig = &testEnv.kubeConfigPath

    // Run tests
    code := m.Run()

    km.Stop()

    os.Exit(code)
}

These are just examples, and there are many other test cases within the Flux codebase.

Conclusion

This guide provides a comprehensive overview of running tests for the Flux project. By following these steps, you can ensure the stability and reliability of the Flux codebase.