@@ -788,6 +788,162 @@ TEST_F(FilterStateMatcher, NoMatchFilterStateAddressMatchIpv6) {
788788 EXPECT_FALSE ((*filter_state_matcher)->match (filter_state));
789789}
790790
791+ TEST_F (FilterStateMatcher, MatchFilterStateAddressMatchIpv4InvertMatch) {
792+ const std::string key = " test.key" ;
793+ envoy::type::matcher::v3::FilterStateMatcher matcher;
794+ matcher.set_key (key);
795+ auto * cidrv4 = matcher.mutable_address_match ()->add_ranges ();
796+ cidrv4->set_address_prefix (" 10.0.0.0" );
797+ cidrv4->mutable_prefix_len ()->set_value (8 );
798+ matcher.mutable_address_match ()->set_invert_match (true );
799+
800+ StreamInfo::FilterStateImpl filter_state (StreamInfo::FilterState::LifeSpan::Connection);
801+ filter_state.setData (
802+ key,
803+ std::make_shared<Network::Address::InstanceAccessor>(
804+ Envoy::Network::Utility::parseInternetAddressNoThrow (" 192.168.1.1" , 456 , false )),
805+ StreamInfo::FilterState::StateType::Mutable);
806+
807+ auto filter_state_matcher = Matchers::FilterStateMatcher::create (matcher, context_);
808+ ASSERT_TRUE (filter_state_matcher.ok ());
809+ EXPECT_TRUE ((*filter_state_matcher)->match (filter_state));
810+ }
811+
812+ TEST_F (FilterStateMatcher, NoMatchFilterStateAddressMatchIpv4InvertMatch) {
813+ const std::string key = " test.key" ;
814+ envoy::type::matcher::v3::FilterStateMatcher matcher;
815+ matcher.set_key (key);
816+ auto * cidrv4 = matcher.mutable_address_match ()->add_ranges ();
817+ cidrv4->set_address_prefix (" 10.0.0.0" );
818+ cidrv4->mutable_prefix_len ()->set_value (8 );
819+ matcher.mutable_address_match ()->set_invert_match (true );
820+
821+ StreamInfo::FilterStateImpl filter_state (StreamInfo::FilterState::LifeSpan::Connection);
822+ filter_state.setData (
823+ key,
824+ std::make_shared<Network::Address::InstanceAccessor>(
825+ Envoy::Network::Utility::parseInternetAddressNoThrow (" 10.0.0.1" , 456 , false )),
826+ StreamInfo::FilterState::StateType::Mutable);
827+
828+ auto filter_state_matcher = Matchers::FilterStateMatcher::create (matcher, context_);
829+ ASSERT_TRUE (filter_state_matcher.ok ());
830+ EXPECT_FALSE ((*filter_state_matcher)->match (filter_state));
831+ }
832+
833+ TEST_F (FilterStateMatcher, MatchFilterStateAddressMatchIpv6InvertMatch) {
834+ const std::string key = " test.key" ;
835+ envoy::type::matcher::v3::FilterStateMatcher matcher;
836+ matcher.set_key (key);
837+ auto * cidrv6 = matcher.mutable_address_match ()->add_ranges ();
838+ cidrv6->set_address_prefix (" 2001:db8::" );
839+ cidrv6->mutable_prefix_len ()->set_value (32 );
840+ matcher.mutable_address_match ()->set_invert_match (true );
841+
842+ StreamInfo::FilterStateImpl filter_state (StreamInfo::FilterState::LifeSpan::Connection);
843+ filter_state.setData (
844+ key,
845+ std::make_shared<Network::Address::InstanceAccessor>(
846+ Envoy::Network::Utility::parseInternetAddressNoThrow (" 2001:db7::1" , 8080 , false )),
847+ StreamInfo::FilterState::StateType::Mutable);
848+
849+ auto filter_state_matcher = Matchers::FilterStateMatcher::create (matcher, context_);
850+ ASSERT_TRUE (filter_state_matcher.ok ());
851+ EXPECT_TRUE ((*filter_state_matcher)->match (filter_state));
852+ }
853+
854+ TEST_F (FilterStateMatcher, NoMatchFilterStateAddressMatchIpv6InvertMatch) {
855+ const std::string key = " test.key" ;
856+ envoy::type::matcher::v3::FilterStateMatcher matcher;
857+ matcher.set_key (key);
858+ auto * cidrv6 = matcher.mutable_address_match ()->add_ranges ();
859+ cidrv6->set_address_prefix (" 2001:db8::" );
860+ cidrv6->mutable_prefix_len ()->set_value (32 );
861+ matcher.mutable_address_match ()->set_invert_match (true );
862+
863+ StreamInfo::FilterStateImpl filter_state (StreamInfo::FilterState::LifeSpan::Connection);
864+ filter_state.setData (
865+ key,
866+ std::make_shared<Network::Address::InstanceAccessor>(
867+ Envoy::Network::Utility::parseInternetAddressNoThrow (" 2001:db8::1" , 8080 , false )),
868+ StreamInfo::FilterState::StateType::Mutable);
869+
870+ auto filter_state_matcher = Matchers::FilterStateMatcher::create (matcher, context_);
871+ ASSERT_TRUE (filter_state_matcher.ok ());
872+ EXPECT_FALSE ((*filter_state_matcher)->match (filter_state));
873+ }
874+
875+ TEST_F (FilterStateMatcher, MatchFilterStateAddressMatchMultipleRangesInvertMatch) {
876+ const std::string key = " test.key" ;
877+ envoy::type::matcher::v3::FilterStateMatcher matcher;
878+ matcher.set_key (key);
879+ auto * cidrv4_1 = matcher.mutable_address_match ()->add_ranges ();
880+ cidrv4_1->set_address_prefix (" 10.0.0.0" );
881+ cidrv4_1->mutable_prefix_len ()->set_value (8 );
882+ auto * cidrv4_2 = matcher.mutable_address_match ()->add_ranges ();
883+ cidrv4_2->set_address_prefix (" 192.168.0.0" );
884+ cidrv4_2->mutable_prefix_len ()->set_value (16 );
885+ matcher.mutable_address_match ()->set_invert_match (true );
886+
887+ StreamInfo::FilterStateImpl filter_state (StreamInfo::FilterState::LifeSpan::Connection);
888+ filter_state.setData (
889+ key,
890+ std::make_shared<Network::Address::InstanceAccessor>(
891+ Envoy::Network::Utility::parseInternetAddressNoThrow (" 172.16.0.1" , 456 , false )),
892+ StreamInfo::FilterState::StateType::Mutable);
893+
894+ auto filter_state_matcher = Matchers::FilterStateMatcher::create (matcher, context_);
895+ ASSERT_TRUE (filter_state_matcher.ok ());
896+ EXPECT_TRUE ((*filter_state_matcher)->match (filter_state));
897+ }
898+
899+ TEST_F (FilterStateMatcher, NoMatchFilterStateAddressMatchMultipleRangesInvertMatchFirstRange) {
900+ const std::string key = " test.key" ;
901+ envoy::type::matcher::v3::FilterStateMatcher matcher;
902+ matcher.set_key (key);
903+ auto * cidrv4_1 = matcher.mutable_address_match ()->add_ranges ();
904+ cidrv4_1->set_address_prefix (" 10.0.0.0" );
905+ cidrv4_1->mutable_prefix_len ()->set_value (8 );
906+ auto * cidrv4_2 = matcher.mutable_address_match ()->add_ranges ();
907+ cidrv4_2->set_address_prefix (" 192.168.0.0" );
908+ cidrv4_2->mutable_prefix_len ()->set_value (16 );
909+ matcher.mutable_address_match ()->set_invert_match (true );
910+
911+ StreamInfo::FilterStateImpl filter_state (StreamInfo::FilterState::LifeSpan::Connection);
912+ filter_state.setData (
913+ key,
914+ std::make_shared<Network::Address::InstanceAccessor>(
915+ Envoy::Network::Utility::parseInternetAddressNoThrow (" 10.0.0.1" , 456 , false )),
916+ StreamInfo::FilterState::StateType::Mutable);
917+
918+ auto filter_state_matcher = Matchers::FilterStateMatcher::create (matcher, context_);
919+ ASSERT_TRUE (filter_state_matcher.ok ());
920+ EXPECT_FALSE ((*filter_state_matcher)->match (filter_state));
921+ }
922+
923+ TEST_F (FilterStateMatcher, NoMatchFilterStateAddressMatchMultipleRangesInvertMatchSecondRange) {
924+ const std::string key = " test.key" ;
925+ envoy::type::matcher::v3::FilterStateMatcher matcher;
926+ matcher.set_key (key);
927+ auto * cidrv4_1 = matcher.mutable_address_match ()->add_ranges ();
928+ cidrv4_1->set_address_prefix (" 10.0.0.0" );
929+ cidrv4_1->mutable_prefix_len ()->set_value (8 );
930+ auto * cidrv4_2 = matcher.mutable_address_match ()->add_ranges ();
931+ cidrv4_2->set_address_prefix (" 192.168.0.0" );
932+ cidrv4_2->mutable_prefix_len ()->set_value (16 );
933+ matcher.mutable_address_match ()->set_invert_match (true );
934+
935+ StreamInfo::FilterStateImpl filter_state (StreamInfo::FilterState::LifeSpan::Connection);
936+ filter_state.setData (
937+ key,
938+ std::make_shared<Network::Address::InstanceAccessor>(
939+ Envoy::Network::Utility::parseInternetAddressNoThrow (" 192.168.1.1" , 456 , false )),
940+ StreamInfo::FilterState::StateType::Mutable);
941+
942+ auto filter_state_matcher = Matchers::FilterStateMatcher::create (matcher, context_);
943+ ASSERT_TRUE (filter_state_matcher.ok ());
944+ EXPECT_FALSE ((*filter_state_matcher)->match (filter_state));
945+ }
946+
791947} // namespace
792948} // namespace Matcher
793949} // namespace Envoy
0 commit comments