process_version_test.go 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. package xray
  2. import (
  3. "os"
  4. "path/filepath"
  5. "runtime"
  6. "sync"
  7. "testing"
  8. "time"
  9. )
  10. func TestRefreshVersionTimesOut(t *testing.T) {
  11. if runtime.GOOS == "windows" {
  12. t.Skip("shell fixture is Unix-only")
  13. }
  14. dir := t.TempDir()
  15. t.Setenv("XUI_BIN_FOLDER", dir)
  16. binaryPath := filepath.Join(dir, GetBinaryName())
  17. if err := os.WriteFile(binaryPath, []byte("#!/bin/sh\nexec sleep 1\n"), 0o700); err != nil {
  18. t.Fatalf("write xray fixture: %v", err)
  19. }
  20. previousTimeout := xrayVersionTimeout
  21. xrayVersionTimeout = 20 * time.Millisecond
  22. t.Cleanup(func() { xrayVersionTimeout = previousTimeout })
  23. p := newProcess(&Config{})
  24. started := time.Now()
  25. p.refreshVersion()
  26. elapsed := time.Since(started)
  27. if elapsed < xrayVersionTimeout {
  28. t.Fatalf("refreshVersion duration = %s, want at least %s", elapsed, xrayVersionTimeout)
  29. }
  30. if elapsed > 500*time.Millisecond {
  31. t.Fatalf("refreshVersion duration = %s, want under 500ms", elapsed)
  32. }
  33. if got := p.GetXrayVersion(); got != "Unknown" {
  34. t.Fatalf("version = %q, want Unknown", got)
  35. }
  36. }
  37. func TestProcessConfigSnapshotsAreRaceSafe(t *testing.T) {
  38. p := NewProcess(&Config{})
  39. first := &Config{}
  40. second := &Config{}
  41. var wg sync.WaitGroup
  42. wg.Go(func() {
  43. for range 1000 {
  44. p.SetConfig(first)
  45. p.SetConfig(second)
  46. }
  47. })
  48. for range 4 {
  49. wg.Go(func() {
  50. for range 1000 {
  51. if p.GetConfig() == nil {
  52. t.Error("config = nil")
  53. }
  54. }
  55. })
  56. }
  57. wg.Wait()
  58. }