Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/workflows/pr-module-functional-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ jobs:
use-actions-summary: 'true'
list-suites: 'failed'
list-tests: 'failed'
list-files: 'failed'
fail-on-error: true
fail-on-empty: true
token: ${{ secrets.GITHUB_TOKEN }}
1 change: 1 addition & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -615,6 +615,7 @@
<systemPropertyVariables>
<pbs.version>${project.version}</pbs.version>
<tests.max-container-count>5</tests.max-container-count>
<tests.debug.enable>false</tests.debug.enable>
<tests.fixed-container-ports>false</tests.fixed-container-ports>
</systemPropertyVariables>
</configuration>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ enum BidderName {
ALIAS_UPPER_CASE("ALIAS"),
GENERIC_CAMEL_CASE("GeNerIc"),
GENERIC("generic"),
GENER_X("gener_x"),
GENER_X("gener-x"),
MAGNITE("magnite"),
APPNEXUS("appnexus"),
MAGNITE_ALIAS("magniteAlias"),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,6 @@ class GeneralBidderAdapter extends Generic {
String demandSource
@JsonProperty("bc")
BidderName bidderCode
@JsonProperty("placement_id")
String placementId
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import com.fasterxml.jackson.annotation.JsonValue
import groovy.transform.ToString

@ToString
enum FetchStatus {
enum AnalyticTagStatus {

NONE, SUCCESS, TIMEOUT, INPROGRESS, ERROR, SUCCESS_ALLOW, SUCCESS_BLOCK, SKIPPED, RUN

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ class Bidder {
@JsonProperty("ALIAS")
Generic aliasUpperCase
Generic generic
@JsonProperty("gener_x")
@JsonProperty("gener-x")
Generic generX
@JsonProperty("GeNerIc")
Generic genericCamelCase
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ class ExtPrebidFloors {

Boolean enabled
Location location
FetchStatus fetchStatus
AnalyticTagStatus fetchStatus
Boolean skipped
Currency floorMinCur
BigDecimal floorMin
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,19 +4,19 @@ import com.fasterxml.jackson.databind.PropertyNamingStrategies
import com.fasterxml.jackson.databind.annotation.JsonNaming
import groovy.transform.EqualsAndHashCode
import groovy.transform.ToString
import org.prebid.server.functional.model.request.auction.FetchStatus
import org.prebid.server.functional.model.request.auction.AnalyticTagStatus
import org.prebid.server.functional.model.request.auction.Imp

import static org.prebid.server.functional.model.request.auction.FetchStatus.SUCCESS
import static org.prebid.server.functional.model.request.auction.FetchStatus.SUCCESS_BLOCK
import static org.prebid.server.functional.model.request.auction.AnalyticTagStatus.SUCCESS
import static org.prebid.server.functional.model.request.auction.AnalyticTagStatus.SUCCESS_BLOCK

@ToString(includeNames = true, ignoreNulls = true)
@JsonNaming(PropertyNamingStrategies.LowerCaseStrategy)
@EqualsAndHashCode
class AnalyticResult {

String name
FetchStatus status
AnalyticTagStatus status
List<ImpResult> results

static AnalyticResult buildFromImp(Imp imp) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package org.prebid.server.functional.model.response.auction

import com.fasterxml.jackson.annotation.JsonValue

enum AnalyticTagStatus {

NONE, LOOKUP, CONTROL, SUCCESS, ERROR, SUCCESS_ALLOW, SUCCESS_BLOCK, SKIPPED, RUN

@JsonValue
String getValue() {
name().toLowerCase().replace('_', '-')
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,13 @@ package org.prebid.server.functional.model.response.auction
import com.fasterxml.jackson.databind.PropertyNamingStrategies
import com.fasterxml.jackson.databind.annotation.JsonNaming
import groovy.transform.ToString
import org.prebid.server.functional.model.request.auction.FetchStatus
import org.prebid.server.functional.model.request.auction.AnalyticTagStatus

@ToString(includeNames = true, ignoreNulls = true)
@JsonNaming(PropertyNamingStrategies.LowerCaseStrategy)
class AnalyticsTagActivity {

ModuleActivityName name
FetchStatus status
AnalyticTagStatus status
List<AnalyticsTagActivityResult> results
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,13 @@ package org.prebid.server.functional.model.response.auction
import com.fasterxml.jackson.databind.PropertyNamingStrategies
import com.fasterxml.jackson.databind.annotation.JsonNaming
import groovy.transform.ToString
import org.prebid.server.functional.model.request.auction.FetchStatus
import org.prebid.server.functional.model.request.auction.AnalyticTagStatus

@ToString(includeNames = true, ignoreNulls = true)
@JsonNaming(PropertyNamingStrategies.LowerCaseStrategy)
class AnalyticsTagActivityResult {

FetchStatus status
AnalyticTagStatus status
AnalyticsTagActivityValue values
AppliedTo appliedTo
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ enum ErrorType {

GENERAL("general"),
GENERIC("generic"),
GENER_X("gener-x"),
GENERIC_CAMEL_CASE("GeNerIc"),
MAGNITE("magnite"),
APPNEXUS("appnexus"),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,14 @@ import com.fasterxml.jackson.databind.PropertyNamingStrategies
import com.fasterxml.jackson.databind.annotation.JsonNaming
import groovy.transform.EqualsAndHashCode
import groovy.transform.ToString
import org.prebid.server.functional.model.request.auction.FetchStatus
import org.prebid.server.functional.model.request.auction.AnalyticTagStatus

@ToString(includeNames = true, ignoreNulls = true)
@JsonNaming(PropertyNamingStrategies.LowerCaseStrategy)
@EqualsAndHashCode
class ImpResult {

FetchStatus status
AnalyticTagStatus status
ModuleValue values
AppliedTo appliedTo
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import com.fasterxml.jackson.annotation.JsonValue

enum ModuleActivityName {

ORTB2_BLOCKING('enforce-blocking'),
PB_ORTB2_BLOCKING('enforce-blocking'),
REJECT_RICHMEDIA('reject-richmedia'),
AB_TESTING('core-module-abtests')

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package org.prebid.server.functional.testcontainers


import org.prebid.server.functional.testcontainers.container.PbsContainerConfig
import org.testcontainers.containers.MySQLContainer
import org.testcontainers.containers.PostgreSQLContainer

Expand Down
Original file line number Diff line number Diff line change
@@ -1,73 +1,104 @@
package org.prebid.server.functional.testcontainers

import org.prebid.server.functional.service.PrebidServerService
import org.prebid.server.functional.testcontainers.container.NetworkServiceContainer
import org.prebid.server.functional.testcontainers.container.PbsContainerConfig
import org.prebid.server.functional.testcontainers.container.PrebidServerContainer
import org.prebid.server.functional.util.SystemProperties
import org.testcontainers.images.builder.Transferable

import static org.prebid.server.functional.testcontainers.PbsServiceFactory.ContainerPolicy.LRU
import static org.prebid.server.functional.testcontainers.PbsServiceFactory.ContainerPolicy.PERSISTENT
import static org.prebid.server.functional.util.SystemProperties.DEBUG_ENABLED
import static org.prebid.server.functional.util.SystemProperties.MAX_CONTAINER
import static org.prebid.server.functional.util.SystemProperties.USE_FIXED_CONTAINER_PORTS

// TODO make container instance into a POGO and add the ability for any given container to live through stopContainers()
class PbsServiceFactory {

private static final Map<Map<String, String>, PrebidServerContainer> containers = [:]
private static final int MAX_CONTAINER_COUNT = maxContainerCount

private final NetworkServiceContainer networkServiceContainer
private static final Map<PbsContainerConfig, CachedContainer> containers =
new LinkedHashMap<>(16, 0.75f, true)

PbsServiceFactory(NetworkServiceContainer networkServiceContainer) {
this.networkServiceContainer = networkServiceContainer
// Will be removed in 5.0
@Deprecated(forRemoval = true)
static PrebidServerService getService(Map<String, String> config,
Map<String, Transferable> additionalFiles = [:],
ContainerPolicy policy = LRU) {
getService(new PbsContainerConfig(config, additionalFiles), policy)
}

static PrebidServerService getService(Map<String, String> config, Map<String, Transferable> additionalFiles = [:]) {
if (containers.containsKey(config)) {
def container = containers.get(config)
container.refresh()
return new PrebidServerService(container)
} else {
if (containers.size() == 1 && MAX_CONTAINER_COUNT == 1) {
def container = containers.entrySet().first()
remove([(container.key): container.value])
} else if (containers.size() >= MAX_CONTAINER_COUNT) {
def container = containers.find { !it.key.isEmpty() }
remove([(container.key): container.value])
}
def pbsContainer = new PrebidServerContainer(config)
if (!additionalFiles.isEmpty()) {
additionalFiles.each { k, v -> pbsContainer.withCopyToContainer(v, k) }
}
pbsContainer.start()
containers.put(config, pbsContainer)
return new PrebidServerService(pbsContainer)
static PrebidServerService getService(PbsContainerConfig config,
ContainerPolicy policy = LRU) {
def cached = containers.remove(config)
if (cached) {
cached.container.refresh()
cached.persistent |= policy == PERSISTENT
containers.put(config, cached)
return new PrebidServerService(cached.container)
}
evictIfNeeded()
def container = new PrebidServerContainer(config, DEBUG_ENABLED)
container.start()
containers.put(config, new CachedContainer(
container: container,
persistent: policy == PERSISTENT
))
return new PrebidServerService(container)
}

private static PrebidServerContainer getContainer(Map<String, String> config) {
containers.get(config)
private static void evictIfNeeded() {
if (containers.size() < MAX_CONTAINER_COUNT) {
return
}

def eldest = containers.entrySet().find { !it.value.persistent }
if (!eldest) {
throw new IllegalStateException("All container slots are persistent")
}

eldest.value.container.stop()
containers.remove(eldest.key)
}

static void stopContainers() {
def containers = containers.findAll { it.key != [:] }
remove(containers)
def iterator = containers.entrySet().iterator()

while (iterator.hasNext()) {
def entry = iterator.next()
if (!entry.value.persistent) {
entry.value.container.stop()
iterator.remove()
}
}
}

static void removeContainer(Map<String, String> config) {
def container = containers.get(config)
container.stop()
containers.remove(config)
// Will be removed in 5.0.
@Deprecated(forRemoval = true)
static void removeContainer(Map<?, ?> config) {
removeContainer(new PbsContainerConfig(config))
}

private static void remove(Map<Map<String, String>, PrebidServerContainer> map) {
map.each { key, value ->
value.stop()
containers.remove(key)
}
static void removeContainer(PbsContainerConfig config) {
containers.remove(config)?.container?.stop()
}

static void stopAllContainers() {
containers.values().each { it.container.stop() }
containers.clear()
}

private static int getMaxContainerCount() {
USE_FIXED_CONTAINER_PORTS
? 1
: SystemProperties.getPropertyOrDefault("tests.max-container-count", 5)
: MAX_CONTAINER
}

private static class CachedContainer {
PrebidServerContainer container
boolean persistent
}

enum ContainerPolicy {
PERSISTENT,
LRU
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package org.prebid.server.functional.testcontainers.container

import groovy.transform.EqualsAndHashCode
import org.testcontainers.images.builder.Transferable


@EqualsAndHashCode

class PbsContainerConfig {

final Map<String, String> extraProperties
final Map<String, Transferable> additionalFiles

PbsContainerConfig(Map<?, ?> extraProperties = [:],
Map<String, Transferable> additionalFiles = [:]) {
this.extraProperties = extraProperties.collectEntries { key, value ->
[(key.toString()): value?.toString()]
}.asImmutable()
this.additionalFiles = additionalFiles.asImmutable()
}

PbsContainerConfig plus(Map<?, ?> properties) {
new PbsContainerConfig(
[:] << extraProperties << properties,
additionalFiles
)
}

PbsContainerConfig plus(PbsContainerConfig other) {
new PbsContainerConfig(
[:] << extraProperties << other.extraProperties,
[:] << additionalFiles << other.additionalFiles
)
}

PbsContainerConfig withFiles(Map<String, Transferable> files) {
new PbsContainerConfig(
extraProperties,
[:] << additionalFiles << files
)
}
}
Loading
Loading