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  }