network_category_windows_test.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. //go:build !e2e_testing
  2. package overlay
  3. import (
  4. "testing"
  5. )
  6. func Test_parseNetworkCategory(t *testing.T) {
  7. cases := []struct {
  8. in string
  9. wantCat networkCategory
  10. wantApply bool
  11. wantErr bool
  12. }{
  13. {"", 0, false, false},
  14. {"unset", 0, false, false},
  15. {" UNSET ", 0, false, false},
  16. {"private", networkCategoryPrivate, true, false},
  17. {"Private", networkCategoryPrivate, true, false},
  18. {" PRIVATE ", networkCategoryPrivate, true, false},
  19. {"public", networkCategoryPublic, true, false},
  20. {"PUBLIC", networkCategoryPublic, true, false},
  21. {"domain", networkCategoryDomainAuthenticated, true, false},
  22. {"DomainAuthenticated", networkCategoryDomainAuthenticated, true, false},
  23. {"garbage", 0, false, true},
  24. {"privates", 0, false, true},
  25. }
  26. for _, tc := range cases {
  27. cat, apply, err := parseNetworkCategory(tc.in)
  28. if (err != nil) != tc.wantErr {
  29. t.Errorf("parseNetworkCategory(%q) err=%v, wantErr=%v", tc.in, err, tc.wantErr)
  30. continue
  31. }
  32. if cat != tc.wantCat || apply != tc.wantApply {
  33. t.Errorf("parseNetworkCategory(%q) = (%v, %v), want (%v, %v)", tc.in, cat, apply, tc.wantCat, tc.wantApply)
  34. }
  35. }
  36. }
  37. // Test_NLM_round_trip exercises every COM call path used by setNetworkCategory
  38. // without mutating the host's network state. It validates the CLSID/IID
  39. // constants and every vtable index by enumerating connections, fetching the
  40. // adapter id and parent network, reading the current category, and writing it
  41. // back unchanged.
  42. //
  43. // Requires Windows but does not require admin or the wintun driver. Skips if
  44. // no network connections are available (unlikely outside of an isolated
  45. // container).
  46. func Test_NLM_round_trip(t *testing.T) {
  47. deinit, err := coInit()
  48. if err != nil {
  49. t.Fatalf("coInit: %v", err)
  50. }
  51. defer deinit()
  52. nlm, err := createNetworkListManager()
  53. if err != nil {
  54. t.Fatalf("createNetworkListManager: %v", err)
  55. }
  56. defer nlm.Release()
  57. enum, err := nlm.GetNetworkConnections()
  58. if err != nil {
  59. t.Fatalf("GetNetworkConnections: %v", err)
  60. }
  61. defer enum.Release()
  62. saw := 0
  63. for {
  64. conn, err := enum.Next()
  65. if err != nil {
  66. t.Fatalf("EnumNetworkConnections.Next: %v", err)
  67. }
  68. if conn == nil {
  69. break
  70. }
  71. saw++
  72. if _, err := conn.GetAdapterId(); err != nil {
  73. conn.Release()
  74. t.Fatalf("INetworkConnection.GetAdapterId: %v", err)
  75. }
  76. net, err := conn.GetNetwork()
  77. conn.Release()
  78. if err != nil {
  79. t.Fatalf("INetworkConnection.GetNetwork: %v", err)
  80. }
  81. cat, err := net.GetCategory()
  82. if err != nil {
  83. net.Release()
  84. t.Fatalf("INetwork.GetCategory: %v", err)
  85. }
  86. // Set to the current value so the host's NLM state is unchanged but
  87. // SetCategory's vtable slot is still validated end-to-end.
  88. if err := net.SetCategory(cat); err != nil {
  89. net.Release()
  90. t.Fatalf("INetwork.SetCategory(%v): %v", cat, err)
  91. }
  92. net.Release()
  93. }
  94. if saw == 0 {
  95. t.Skip("no NLM network connections available; skipping round-trip")
  96. }
  97. }