| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 |
- //go:build !e2e_testing
- // +build !e2e_testing
- package overlay
- import (
- "testing"
- )
- func Test_parseNetworkCategory(t *testing.T) {
- cases := []struct {
- in string
- wantCat networkCategory
- wantApply bool
- wantErr bool
- }{
- {"", 0, false, false},
- {"unset", 0, false, false},
- {" UNSET ", 0, false, false},
- {"private", networkCategoryPrivate, true, false},
- {"Private", networkCategoryPrivate, true, false},
- {" PRIVATE ", networkCategoryPrivate, true, false},
- {"public", networkCategoryPublic, true, false},
- {"PUBLIC", networkCategoryPublic, true, false},
- {"domain", networkCategoryDomainAuthenticated, true, false},
- {"DomainAuthenticated", networkCategoryDomainAuthenticated, true, false},
- {"garbage", 0, false, true},
- {"privates", 0, false, true},
- }
- for _, tc := range cases {
- cat, apply, err := parseNetworkCategory(tc.in)
- if (err != nil) != tc.wantErr {
- t.Errorf("parseNetworkCategory(%q) err=%v, wantErr=%v", tc.in, err, tc.wantErr)
- continue
- }
- if cat != tc.wantCat || apply != tc.wantApply {
- t.Errorf("parseNetworkCategory(%q) = (%v, %v), want (%v, %v)", tc.in, cat, apply, tc.wantCat, tc.wantApply)
- }
- }
- }
- // Test_NLM_round_trip exercises every COM call path used by setNetworkCategory
- // without mutating the host's network state. It validates the CLSID/IID
- // constants and every vtable index by enumerating connections, fetching the
- // adapter id and parent network, reading the current category, and writing it
- // back unchanged.
- //
- // Requires Windows but does not require admin or the wintun driver. Skips if
- // no network connections are available (unlikely outside of an isolated
- // container).
- func Test_NLM_round_trip(t *testing.T) {
- deinit, err := coInit()
- if err != nil {
- t.Fatalf("coInit: %v", err)
- }
- defer deinit()
- nlm, err := createNetworkListManager()
- if err != nil {
- t.Fatalf("createNetworkListManager: %v", err)
- }
- defer nlm.Release()
- enum, err := nlm.GetNetworkConnections()
- if err != nil {
- t.Fatalf("GetNetworkConnections: %v", err)
- }
- defer enum.Release()
- saw := 0
- for {
- conn, err := enum.Next()
- if err != nil {
- t.Fatalf("EnumNetworkConnections.Next: %v", err)
- }
- if conn == nil {
- break
- }
- saw++
- if _, err := conn.GetAdapterId(); err != nil {
- conn.Release()
- t.Fatalf("INetworkConnection.GetAdapterId: %v", err)
- }
- net, err := conn.GetNetwork()
- conn.Release()
- if err != nil {
- t.Fatalf("INetworkConnection.GetNetwork: %v", err)
- }
- cat, err := net.GetCategory()
- if err != nil {
- net.Release()
- t.Fatalf("INetwork.GetCategory: %v", err)
- }
- // Set to the current value so the host's NLM state is unchanged but
- // SetCategory's vtable slot is still validated end-to-end.
- if err := net.SetCategory(cat); err != nil {
- net.Release()
- t.Fatalf("INetwork.SetCategory(%v): %v", cat, err)
- }
- net.Release()
- }
- if saw == 0 {
- t.Skip("no NLM network connections available; skipping round-trip")
- }
- }
|