This commit is contained in:
sujit
2025-10-01 16:05:18 +05:45
parent fce0102027
commit 90ad6aa969
7 changed files with 1748 additions and 382 deletions

View File

@@ -0,0 +1,118 @@
package main
import (
"context"
"fmt"
"log"
"time"
"github.com/oarkflow/mq"
"github.com/oarkflow/mq/logger"
)
func main() {
testFlowControlIntegration()
}
func testFlowControlIntegration() {
// Create a logger
l := logger.NewDefaultLogger()
fmt.Println("Testing Flow Control Factory and Configuration Providers...")
// Test 1: Factory creates different strategies
factory := mq.NewFlowControllerFactory()
strategies := []struct {
name string
createFunc func() *mq.FlowController
}{
{"Token Bucket", func() *mq.FlowController {
return factory.CreateTokenBucketFlowController(100, 10, 100*time.Millisecond, l)
}},
{"Leaky Bucket", func() *mq.FlowController {
return factory.CreateLeakyBucketFlowController(50, 200*time.Millisecond, l)
}},
{"Credit Based", func() *mq.FlowController {
return factory.CreateCreditBasedFlowController(200, 20, 10, 150*time.Millisecond, l)
}},
{"Rate Limiter", func() *mq.FlowController {
return factory.CreateRateLimiterFlowController(50, 100, l)
}},
}
for _, s := range strategies {
fmt.Printf("\n--- Testing %s ---\n", s.name)
fc := s.createFunc()
if fc == nil {
fmt.Printf("✗ Failed to create %s flow controller\n", s.name)
continue
}
fmt.Printf("✓ Created %s flow controller\n", s.name)
stats := fc.GetStats()
fmt.Printf(" Initial stats: %+v\n", stats)
// Test acquiring credits
ctx := context.Background()
err := fc.AcquireCredit(ctx, 5)
if err != nil {
fmt.Printf(" ✗ Failed to acquire credits: %v\n", err)
} else {
fmt.Printf(" ✓ Successfully acquired 5 credits\n")
stats = fc.GetStats()
fmt.Printf(" Stats after acquire: %+v\n", stats)
// Release credits
fc.ReleaseCredit(3)
fmt.Printf(" ✓ Released 3 credits\n")
stats = fc.GetStats()
fmt.Printf(" Stats after release: %+v\n", stats)
}
fc.Shutdown()
}
// Test 2: Configuration providers
fmt.Println("\n--- Testing Configuration Providers ---")
// Test environment provider (will likely fail since no env vars set)
envProvider := mq.NewEnvConfigProvider("TEST_FLOW_")
envConfig, err := envProvider.GetConfig()
if err != nil {
fmt.Printf("✓ Environment config correctly failed (no env vars): %v\n", err)
} else {
fmt.Printf("Environment config: %+v\n", envConfig)
}
// Test composite provider
compositeProvider := mq.NewCompositeConfigProvider(envProvider)
compositeConfig, err := compositeProvider.GetConfig()
if err != nil {
fmt.Printf("✓ Composite config correctly failed: %v\n", err)
} else {
fmt.Printf("Composite config: %+v\n", compositeConfig)
}
// Test 3: Factory with config
fmt.Println("\n--- Testing Factory with Config ---")
config := mq.FlowControlConfig{
Strategy: mq.StrategyTokenBucket,
MaxCredits: 100,
RefillRate: 10,
RefillInterval: 100 * time.Millisecond,
Logger: l,
}
fc, err := factory.CreateFlowController(config)
if err != nil {
log.Printf("Failed to create flow controller with config: %v", err)
} else {
fmt.Printf("✓ Created flow controller with config\n")
stats := fc.GetStats()
fmt.Printf(" Config-based stats: %+v\n", stats)
fc.Shutdown()
}
fmt.Println("\nFlow control integration test completed successfully!")
}