Zhen Ye bb913dd837
fix: simplify go ut (#46606)
issue: #46500

- simplify the run_go_codecov.sh to make sure the set -e to protect any
sub command failure.
- remove all embed etcd in test to make full test can be run at local.

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## PR Summary: Simplify Go Unit Tests by Removing Embedded etcd and
Async Startup Scaffolding

**Core Invariant:**
This PR assumes that unit tests can be simplified by running without
embedded etcd servers (delegating to environment-based or external etcd
instances via `kvfactory.GetEtcdAndPath()` or `ETCD_ENDPOINTS`) and by
removing goroutine-based async startup scaffolding in favor of
synchronous component initialization. Tests remain functionally
equivalent while becoming simpler to run and debug locally.

**What is Removed or Simplified:**

1. **Embedded etcd test infrastructure deleted**: Removes
`EmbedEtcdUtil` type and its public methods (SetupEtcd,
TearDownEmbedEtcd) from `pkg/util/testutils/embed_etcd.go`, removes the
`StartTestEmbedEtcdServer()` helper from `pkg/util/etcd/etcd_util.go`,
and removes etcd embedding from test suites (e.g., `TaskSuite`,
`EtcdSourceSuite`, `mixcoord/client_test.go`). Tests now either skip
etcd-dependent tests (via `MILVUS_UT_WITHOUT_KAFKA=1` environment flag
in `kafka_test.go`) or source etcd from external configuration (via
`kvfactory.GetEtcdAndPath()` in `task_test.go`, or `ETCD_ENDPOINTS`
environment variable in `etcd_source_test.go`). This eliminates the
overhead of spinning up temporary etcd servers for unit tests.

2. **Async startup scaffolding replaced with synchronous
initialization**: In `internal/proxy/proxy_test.go` and
`proxy_rpc_test.go`, the `startGrpc()` method signature removes the
`sync.WaitGroup` parameter; components are now created, prepared, and
run synchronously in-place rather than in goroutines (e.g., `go
testServer.startGrpc(ctx, &p)` becomes `testServer.startGrpc(ctx, &p)`
running synchronously). Readiness checks (e.g., `waitForGrpcReady()`)
remain in place to ensure startup safety without concurrency constructs.
This simplifies control flow and reduces debugging complexity.

3. **Shell script orchestration unified with proper error handling**: In
`scripts/run_go_codecov.sh` and `scripts/run_intergration_test.sh`,
per-package inline test invocations are consolidated into a single
`test_cmd()` function with unified `TEST_CMD_WITH_ARGS` array containing
race, coverage, verbose, and other flags. The problematic `set -ex` is
replaced with `set -e` alone (removing debug output noise while
preserving strict error semantics), ensuring the scripts fail fast on
any command failure.

**Why No Regression:**
- Test assertions and code paths remain unchanged; only deployment
source of etcd (embedded → external) and startup orchestration (async →
sync) change.
- Readiness verification (e.g., `waitForGrpcReady()`) is retained,
ensuring components are initialized before test execution.
- Test flags (race detection, coverage, verbosity) are uniformly applied
across all packages via unified `TEST_CMD_WITH_ARGS`, preserving test
coverage and quality.
- `set -e` alone is sufficient for strict failure detection without the
`-x` flag's verbose output.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Signed-off-by: chyezh <chyezh@outlook.com>
2025-12-31 16:07:22 +08:00

59 lines
2.0 KiB
Go

package kafka
import (
"os"
"testing"
"github.com/stretchr/testify/assert"
"github.com/milvus-io/milvus-proto/go-api/v2/commonpb"
"github.com/milvus-io/milvus/pkg/v2/streaming/util/message"
"github.com/milvus-io/milvus/pkg/v2/streaming/walimpls"
"github.com/milvus-io/milvus/pkg/v2/streaming/walimpls/registry"
"github.com/milvus-io/milvus/pkg/v2/util/paramtable"
)
func TestMain(m *testing.M) {
paramtable.Init()
m.Run()
}
func TestRegistry(t *testing.T) {
registeredB := registry.MustGetBuilder(message.WALNameKafka)
assert.NotNil(t, registeredB)
assert.Equal(t, message.WALNameKafka, registeredB.Name())
id, err := message.UnmarshalMessageID(&commonpb.MessageID{WALName: commonpb.WALName(message.WALNameKafka), Id: kafkaID(123).Marshal()})
assert.NoError(t, err)
assert.True(t, id.EQ(kafkaID(123)))
}
func TestKafka(t *testing.T) {
if os.Getenv("MILVUS_UT_WITHOUT_KAFKA") != "" {
t.Skip("there's no kafka broker available, skipping kafka test")
}
walimpls.NewWALImplsTestFramework(t, 100, &builderImpl{}).Run()
}
func TestGetBasicConfig(t *testing.T) {
config := &paramtable.Get().KafkaCfg
oldSecurityProtocol := config.SecurityProtocol.SwapTempValue("test")
oldSaslUsername := config.SaslUsername.SwapTempValue("test")
oldSaslPassword := config.SaslPassword.SwapTempValue("test")
oldkafkaUseSSL := config.KafkaUseSSL.SwapTempValue("true")
oldKafkaTLSKeyPassword := config.KafkaTLSKeyPassword.SwapTempValue("test")
defer func() {
config.SecurityProtocol.SwapTempValue(oldSecurityProtocol)
config.SaslUsername.SwapTempValue(oldSaslUsername)
config.SaslPassword.SwapTempValue(oldSaslPassword)
config.KafkaUseSSL.SwapTempValue(oldkafkaUseSSL)
config.KafkaTLSKeyPassword.SwapTempValue(oldKafkaTLSKeyPassword)
}()
basicConfig := getBasicConfig(config)
assert.NotNil(t, basicConfig["ssl.key.password"])
assert.NotNil(t, basicConfig["ssl.certificate.location"])
assert.NotNil(t, basicConfig["sasl.username"])
assert.NotNil(t, basicConfig["security.protocol"])
}