github.com/prebid/prebid-server@v0.275.0/gdpr/purpose_enforcer_test.go (about) 1 package gdpr 2 3 import ( 4 "testing" 5 6 "github.com/prebid/go-gdpr/consentconstants" 7 "github.com/prebid/prebid-server/config" 8 "github.com/prebid/prebid-server/openrtb_ext" 9 10 "github.com/stretchr/testify/assert" 11 ) 12 13 func TestNewPurposeEnforcerBuilder(t *testing.T) { 14 tests := []struct { 15 description string 16 enforceAlgo config.TCF2EnforcementAlgo 17 enforcePurpose bool 18 enforceVendors bool 19 basicVendorsMap map[string]struct{} 20 vendorExceptionMap map[openrtb_ext.BidderName]struct{} 21 purpose consentconstants.Purpose 22 bidder openrtb_ext.BidderName 23 wantType PurposeEnforcer 24 }{ 25 { 26 description: "purpose 1 full algo -- full enforcer returned", 27 enforceAlgo: config.TCF2FullEnforcement, 28 enforcePurpose: true, 29 enforceVendors: true, 30 basicVendorsMap: map[string]struct{}{}, 31 vendorExceptionMap: map[openrtb_ext.BidderName]struct{}{}, 32 purpose: consentconstants.Purpose(1), 33 bidder: openrtb_ext.BidderAppnexus, 34 wantType: &FullEnforcement{}, 35 }, 36 { 37 description: "purpose 1 full algo, basic enforcement vendor -- full enforcer returned", 38 enforceAlgo: config.TCF2FullEnforcement, 39 enforcePurpose: true, 40 enforceVendors: true, 41 basicVendorsMap: map[string]struct{}{string(openrtb_ext.BidderAppnexus): {}}, 42 vendorExceptionMap: map[openrtb_ext.BidderName]struct{}{}, 43 purpose: consentconstants.Purpose(1), 44 bidder: openrtb_ext.BidderAppnexus, 45 wantType: &FullEnforcement{}, 46 }, 47 { 48 description: "purpose 1 basic algo -- basic enforcer returned", 49 enforceAlgo: config.TCF2BasicEnforcement, 50 enforcePurpose: true, 51 enforceVendors: true, 52 basicVendorsMap: map[string]struct{}{}, 53 vendorExceptionMap: map[openrtb_ext.BidderName]struct{}{}, 54 purpose: consentconstants.Purpose(1), 55 bidder: openrtb_ext.BidderAppnexus, 56 wantType: &BasicEnforcement{}, 57 }, 58 { 59 description: "purpose 2 full algo -- full enforcer returned", 60 enforceAlgo: config.TCF2FullEnforcement, 61 enforcePurpose: true, 62 enforceVendors: true, 63 basicVendorsMap: map[string]struct{}{}, 64 vendorExceptionMap: map[openrtb_ext.BidderName]struct{}{}, 65 purpose: consentconstants.Purpose(2), 66 bidder: openrtb_ext.BidderAppnexus, 67 wantType: &FullEnforcement{}, 68 }, 69 { 70 description: "purpose 2 full algo, basic enforcement vendor -- basic enforcer returned", 71 enforceAlgo: config.TCF2FullEnforcement, 72 enforcePurpose: true, 73 enforceVendors: true, 74 basicVendorsMap: map[string]struct{}{string(openrtb_ext.BidderAppnexus): {}}, 75 vendorExceptionMap: map[openrtb_ext.BidderName]struct{}{}, 76 purpose: consentconstants.Purpose(2), 77 bidder: openrtb_ext.BidderAppnexus, 78 wantType: &BasicEnforcement{}, 79 }, 80 { 81 description: "purpose 2 basic algo -- basic enforcer returned", 82 enforceAlgo: config.TCF2BasicEnforcement, 83 enforcePurpose: true, 84 enforceVendors: true, 85 basicVendorsMap: map[string]struct{}{}, 86 vendorExceptionMap: map[openrtb_ext.BidderName]struct{}{}, 87 purpose: consentconstants.Purpose(2), 88 bidder: openrtb_ext.BidderAppnexus, 89 wantType: &BasicEnforcement{}, 90 }, 91 } 92 93 for _, tt := range tests { 94 cfg := fakeTCF2ConfigReader{ 95 enforceAlgo: tt.enforceAlgo, 96 enforcePurpose: tt.enforcePurpose, 97 enforceVendors: tt.enforceVendors, 98 basicEnforcementVendorsMap: tt.basicVendorsMap, 99 vendorExceptionMap: tt.vendorExceptionMap, 100 } 101 102 builder := NewPurposeEnforcerBuilder(&cfg) 103 104 enforcer1 := builder(tt.purpose, tt.bidder) 105 enforcer2 := builder(tt.purpose, tt.bidder) 106 107 // assert that enforcer1 and enforcer2 are same objects; enforcer2 pulled from cache 108 assert.Same(t, enforcer1, enforcer2, tt.description) 109 assert.IsType(t, tt.wantType, enforcer1, tt.description) 110 111 // assert enforcer 1 config values are properly set 112 switch enforcer1.(type) { 113 case *FullEnforcement: 114 { 115 fullEnforcer := enforcer1.(*FullEnforcement) 116 assert.Equal(t, fullEnforcer.cfg.PurposeID, tt.purpose, tt.description) 117 assert.Equal(t, fullEnforcer.cfg.EnforceAlgo, tt.enforceAlgo, tt.description) 118 assert.Equal(t, fullEnforcer.cfg.EnforcePurpose, tt.enforcePurpose, tt.description) 119 assert.Equal(t, fullEnforcer.cfg.EnforceVendors, tt.enforceVendors, tt.description) 120 assert.Equal(t, fullEnforcer.cfg.BasicEnforcementVendorsMap, tt.basicVendorsMap, tt.description) 121 assert.Equal(t, fullEnforcer.cfg.VendorExceptionMap, tt.vendorExceptionMap, tt.description) 122 } 123 case PurposeEnforcer: 124 { 125 basicEnforcer := enforcer1.(*BasicEnforcement) 126 assert.Equal(t, basicEnforcer.cfg.PurposeID, tt.purpose, tt.description) 127 assert.Equal(t, basicEnforcer.cfg.EnforceAlgo, tt.enforceAlgo, tt.description) 128 assert.Equal(t, basicEnforcer.cfg.EnforcePurpose, tt.enforcePurpose, tt.description) 129 assert.Equal(t, basicEnforcer.cfg.EnforceVendors, tt.enforceVendors, tt.description) 130 assert.Equal(t, basicEnforcer.cfg.BasicEnforcementVendorsMap, tt.basicVendorsMap, tt.description) 131 assert.Equal(t, basicEnforcer.cfg.VendorExceptionMap, tt.vendorExceptionMap, tt.description) 132 } 133 } 134 } 135 } 136 137 func TestNewPurposeEnforcerBuilderCaching(t *testing.T) { 138 139 bidder1 := openrtb_ext.BidderAppnexus 140 bidder1Enforcers := make([]PurposeEnforcer, 11) 141 bidder2 := openrtb_ext.BidderIx 142 bidder2Enforcers := make([]PurposeEnforcer, 11) 143 bidder3 := openrtb_ext.BidderPubmatic 144 bidder3Enforcers := make([]PurposeEnforcer, 11) 145 bidder4 := openrtb_ext.BidderRubicon 146 bidder4Enforcers := make([]PurposeEnforcer, 11) 147 148 cfg := fakeTCF2ConfigReader{ 149 enforceAlgo: config.TCF2FullEnforcement, 150 basicEnforcementVendorsMap: map[string]struct{}{ 151 string(bidder3): {}, 152 string(bidder4): {}, 153 }, 154 } 155 builder := NewPurposeEnforcerBuilder(&cfg) 156 157 for i := 1; i <= 10; i++ { 158 bidder1Enforcers[i] = builder(consentconstants.Purpose(i), bidder1) 159 bidder2Enforcers[i] = builder(consentconstants.Purpose(i), bidder2) 160 bidder3Enforcers[i] = builder(consentconstants.Purpose(i), bidder3) 161 bidder4Enforcers[i] = builder(consentconstants.Purpose(i), bidder4) 162 } 163 164 for i := 1; i <= 10; i++ { 165 if i == 1 { 166 assert.IsType(t, bidder1Enforcers[i], &FullEnforcement{}, "purpose 1 bidder 1 enforcer is full") 167 assert.IsType(t, bidder3Enforcers[i], &FullEnforcement{}, "purpose 1 bidder 3 enforcer is full") 168 169 // verify cross-bidder enforcer objects for a given purpose are the same 170 assert.Same(t, bidder1Enforcers[i], bidder2Enforcers[i], "purpose 1 compare bidder 1 & 2 enforcers") 171 assert.Same(t, bidder2Enforcers[i], bidder3Enforcers[i], "purpose 1 compare bidder 2 & 3 enforcers") 172 assert.Same(t, bidder3Enforcers[i], bidder4Enforcers[i], "purpose 1 compare bidder 3 & 4 enforcers") 173 174 // verify cross-purpose enforcer objects are different 175 assert.Equal(t, bidder1Enforcers[i].(*FullEnforcement).cfg.PurposeID, consentconstants.Purpose(i), "purpose 1 bidder 1 enforcer purpose check") 176 assert.Equal(t, bidder2Enforcers[i].(*FullEnforcement).cfg.PurposeID, consentconstants.Purpose(i), "purpose 1 bidder 2 enforcer purpose check") 177 assert.Equal(t, bidder3Enforcers[i].(*FullEnforcement).cfg.PurposeID, consentconstants.Purpose(i), "purpose 1 bidder 3 enforcer purpose check") 178 assert.Equal(t, bidder4Enforcers[i].(*FullEnforcement).cfg.PurposeID, consentconstants.Purpose(i), "purpose 1 bidder 4 enforcer purpose check") 179 } else { 180 assert.IsType(t, bidder1Enforcers[i], &FullEnforcement{}, "purpose %d bidder 1 enforcer is full", i) 181 assert.IsType(t, bidder3Enforcers[i], &BasicEnforcement{}, "purpose %d bidder 3 enforcer is basic", i) 182 183 // verify some cross-bidder enforcer objects for a given purpose are the same and some are different 184 assert.Same(t, bidder1Enforcers[i], bidder2Enforcers[i], "purpose %d compare bidder 1 & 2 enforcers", i) 185 assert.NotSame(t, bidder2Enforcers[i], bidder3Enforcers[i], "purpose %d compare bidder 2 & 3 enforcers", i) 186 assert.Same(t, bidder3Enforcers[i], bidder4Enforcers[i], "purpose %d compare bidder 3 & 4 enforcers", i) 187 188 // verify cross-purpose enforcer objects are different 189 assert.Equal(t, bidder1Enforcers[i].(*FullEnforcement).cfg.PurposeID, consentconstants.Purpose(i), "purpose %d bidder 1 enforcer purpose check", i) 190 assert.Equal(t, bidder2Enforcers[i].(*FullEnforcement).cfg.PurposeID, consentconstants.Purpose(i), "purpose %d bidder 2 enforcer purpose check", i) 191 assert.Equal(t, bidder3Enforcers[i].(*BasicEnforcement).cfg.PurposeID, consentconstants.Purpose(i), "purpose %d bidder 3 enforcer purpose check", i) 192 assert.Equal(t, bidder4Enforcers[i].(*BasicEnforcement).cfg.PurposeID, consentconstants.Purpose(i), "purpose %d bidder 4 enforcer purpose check", i) 193 } 194 } 195 } 196 197 type fakeTCF2ConfigReader struct { 198 enforceAlgo config.TCF2EnforcementAlgo 199 enforcePurpose bool 200 enforceVendors bool 201 vendorExceptionMap map[openrtb_ext.BidderName]struct{} 202 basicEnforcementVendorsMap map[string]struct{} 203 } 204 205 func (fcr *fakeTCF2ConfigReader) BasicEnforcementVendors() map[string]struct{} { 206 return fcr.basicEnforcementVendorsMap 207 } 208 func (fcr *fakeTCF2ConfigReader) FeatureOneEnforced() bool { 209 return false 210 } 211 func (fcr *fakeTCF2ConfigReader) FeatureOneVendorException(openrtb_ext.BidderName) bool { 212 return false 213 } 214 func (fcr *fakeTCF2ConfigReader) ChannelEnabled(config.ChannelType) bool { 215 return false 216 } 217 func (fcr *fakeTCF2ConfigReader) IsEnabled() bool { 218 return false 219 } 220 func (fcr *fakeTCF2ConfigReader) PurposeEnforced(purpose consentconstants.Purpose) bool { 221 return fcr.enforcePurpose 222 } 223 func (fcr *fakeTCF2ConfigReader) PurposeEnforcementAlgo(purpose consentconstants.Purpose) config.TCF2EnforcementAlgo { 224 return fcr.enforceAlgo 225 } 226 func (fcr *fakeTCF2ConfigReader) PurposeEnforcingVendors(purpose consentconstants.Purpose) bool { 227 return fcr.enforceVendors 228 } 229 func (fcr *fakeTCF2ConfigReader) PurposeVendorExceptions(purpose consentconstants.Purpose) map[openrtb_ext.BidderName]struct{} { 230 return fcr.vendorExceptionMap 231 } 232 func (fcr *fakeTCF2ConfigReader) PurposeOneTreatmentEnabled() bool { 233 return false 234 } 235 func (fcr *fakeTCF2ConfigReader) PurposeOneTreatmentAccessAllowed() bool { 236 return false 237 }