@@ -761,7 +761,8 @@ func TestValidateRuleSetMetadataUpdateAllowsRuleSetThatKeepsNonLegacyDNSMode(t *
761761 require .False (t , router .legacyDNSMode )
762762
763763 err := router .ValidateRuleSetMetadataUpdate ("dynamic-set" , adapter.RuleSetMetadata {
764- ContainsIPCIDRRule : true ,
764+ ContainsIPCIDRRule : true ,
765+ ContainsNonIPCIDRRule : true ,
765766 })
766767 require .NoError (t , err )
767768}
@@ -808,6 +809,163 @@ func TestValidateRuleSetMetadataUpdateAllowsRelaxingLegacyRequirement(t *testing
808809 require .NoError (t , err )
809810}
810811
812+ func TestInitializeRejectsPureIPRuleSetWhenLegacyDNSModeDisabled (t * testing.T ) {
813+ t .Parallel ()
814+
815+ fakeSet := & fakeRuleSet {
816+ metadata : adapter.RuleSetMetadata {
817+ ContainsIPCIDRRule : true ,
818+ },
819+ }
820+ routerService := & fakeRouter {
821+ ruleSets : map [string ]adapter.RuleSet {
822+ "pure-ip" : fakeSet ,
823+ },
824+ }
825+ ctx := service .ContextWith [adapter.Router ](context .Background (), routerService )
826+ router := & Router {
827+ ctx : ctx ,
828+ logger : log .NewNOPFactory ().NewLogger ("dns" ),
829+ transport : & fakeDNSTransportManager {},
830+ client : & fakeDNSClient {},
831+ rawRules : make ([]option.DNSRule , 0 , 2 ),
832+ rules : make ([]adapter.DNSRule , 0 , 2 ),
833+ defaultDomainStrategy : C .DomainStrategyAsIS ,
834+ }
835+ err := router .Initialize ([]option.DNSRule {
836+ {
837+ Type : C .RuleTypeDefault ,
838+ DefaultOptions : option.DefaultDNSRule {
839+ RawDefaultDNSRule : option.RawDefaultDNSRule {
840+ QueryType : badoption.Listable [option.DNSQueryType ]{option .DNSQueryType (mDNS .TypeA )},
841+ },
842+ DNSRuleAction : option.DNSRuleAction {
843+ Action : C .RuleActionTypeRoute ,
844+ RouteOptions : option.DNSRouteActionOptions {Server : "selected" },
845+ },
846+ },
847+ },
848+ {
849+ Type : C .RuleTypeDefault ,
850+ DefaultOptions : option.DefaultDNSRule {
851+ RawDefaultDNSRule : option.RawDefaultDNSRule {
852+ RuleSet : badoption.Listable [string ]{"pure-ip" },
853+ },
854+ DNSRuleAction : option.DNSRuleAction {
855+ Action : C .RuleActionTypeRoute ,
856+ RouteOptions : option.DNSRouteActionOptions {Server : "selected" },
857+ },
858+ },
859+ },
860+ })
861+ require .ErrorContains (t , err , "Address Filter Fields" )
862+ }
863+
864+ func TestInitializeAllowsMixedRuleSetWhenLegacyDNSModeDisabled (t * testing.T ) {
865+ t .Parallel ()
866+
867+ fakeSet := & fakeRuleSet {
868+ metadata : adapter.RuleSetMetadata {
869+ ContainsIPCIDRRule : true ,
870+ ContainsNonIPCIDRRule : true ,
871+ },
872+ }
873+ routerService := & fakeRouter {
874+ ruleSets : map [string ]adapter.RuleSet {
875+ "mixed" : fakeSet ,
876+ },
877+ }
878+ ctx := service .ContextWith [adapter.Router ](context .Background (), routerService )
879+ router := newTestRouterWithContext (t , ctx , []option.DNSRule {
880+ {
881+ Type : C .RuleTypeDefault ,
882+ DefaultOptions : option.DefaultDNSRule {
883+ RawDefaultDNSRule : option.RawDefaultDNSRule {
884+ QueryType : badoption.Listable [option.DNSQueryType ]{option .DNSQueryType (mDNS .TypeA )},
885+ },
886+ DNSRuleAction : option.DNSRuleAction {
887+ Action : C .RuleActionTypeRoute ,
888+ RouteOptions : option.DNSRouteActionOptions {Server : "selected" },
889+ },
890+ },
891+ },
892+ {
893+ Type : C .RuleTypeDefault ,
894+ DefaultOptions : option.DefaultDNSRule {
895+ RawDefaultDNSRule : option.RawDefaultDNSRule {
896+ RuleSet : badoption.Listable [string ]{"mixed" },
897+ },
898+ DNSRuleAction : option.DNSRuleAction {
899+ Action : C .RuleActionTypeRoute ,
900+ RouteOptions : option.DNSRouteActionOptions {Server : "selected" },
901+ },
902+ },
903+ },
904+ }, & fakeDNSTransportManager {
905+ defaultTransport : & fakeDNSTransport {tag : "default" , transportType : C .DNSTypeUDP },
906+ transports : map [string ]adapter.DNSTransport {
907+ "default" : & fakeDNSTransport {tag : "default" , transportType : C .DNSTypeUDP },
908+ "selected" : & fakeDNSTransport {tag : "selected" , transportType : C .DNSTypeUDP },
909+ },
910+ }, & fakeDNSClient {})
911+ require .False (t , router .legacyDNSMode )
912+ }
913+
914+ func TestValidateRuleSetMetadataUpdateRejectsRuleSetFlippingToPureIP (t * testing.T ) {
915+ t .Parallel ()
916+
917+ fakeSet := & fakeRuleSet {
918+ metadata : adapter.RuleSetMetadata {
919+ ContainsIPCIDRRule : true ,
920+ ContainsNonIPCIDRRule : true ,
921+ },
922+ }
923+ routerService := & fakeRouter {
924+ ruleSets : map [string ]adapter.RuleSet {
925+ "mixed" : fakeSet ,
926+ },
927+ }
928+ ctx := service .ContextWith [adapter.Router ](context .Background (), routerService )
929+ router := newTestRouterWithContext (t , ctx , []option.DNSRule {
930+ {
931+ Type : C .RuleTypeDefault ,
932+ DefaultOptions : option.DefaultDNSRule {
933+ RawDefaultDNSRule : option.RawDefaultDNSRule {
934+ QueryType : badoption.Listable [option.DNSQueryType ]{option .DNSQueryType (mDNS .TypeA )},
935+ },
936+ DNSRuleAction : option.DNSRuleAction {
937+ Action : C .RuleActionTypeRoute ,
938+ RouteOptions : option.DNSRouteActionOptions {Server : "selected" },
939+ },
940+ },
941+ },
942+ {
943+ Type : C .RuleTypeDefault ,
944+ DefaultOptions : option.DefaultDNSRule {
945+ RawDefaultDNSRule : option.RawDefaultDNSRule {
946+ RuleSet : badoption.Listable [string ]{"mixed" },
947+ },
948+ DNSRuleAction : option.DNSRuleAction {
949+ Action : C .RuleActionTypeRoute ,
950+ RouteOptions : option.DNSRouteActionOptions {Server : "selected" },
951+ },
952+ },
953+ },
954+ }, & fakeDNSTransportManager {
955+ defaultTransport : & fakeDNSTransport {tag : "default" , transportType : C .DNSTypeUDP },
956+ transports : map [string ]adapter.DNSTransport {
957+ "default" : & fakeDNSTransport {tag : "default" , transportType : C .DNSTypeUDP },
958+ "selected" : & fakeDNSTransport {tag : "selected" , transportType : C .DNSTypeUDP },
959+ },
960+ }, & fakeDNSClient {})
961+ require .False (t , router .legacyDNSMode )
962+
963+ err := router .ValidateRuleSetMetadataUpdate ("mixed" , adapter.RuleSetMetadata {
964+ ContainsIPCIDRRule : true ,
965+ })
966+ require .ErrorContains (t , err , "Address Filter Fields" )
967+ }
968+
811969func TestCloseWaitsForInFlightLookupUntilContextCancellation (t * testing.T ) {
812970 t .Parallel ()
813971
0 commit comments