1 /*
2  * Copyright (C) 2022 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.adservices.service.measurement;
18 
19 import android.net.Uri;
20 import android.util.Pair;
21 
22 import com.android.adservices.common.WebUtil;
23 import com.android.adservices.service.FakeFlagsFactory;
24 import com.android.adservices.service.measurement.aggregation.AggregatableAttributionTrigger;
25 import com.android.adservices.service.measurement.aggregation.AggregateTriggerData;
26 import com.android.adservices.service.measurement.util.UnsignedLong;
27 
28 import org.json.JSONArray;
29 
30 import java.math.BigInteger;
31 import java.util.Collections;
32 import java.util.List;
33 import java.util.Map;
34 import java.util.Set;
35 import java.util.UUID;
36 
37 public final class TriggerFixture {
TriggerFixture()38     private TriggerFixture() { }
39 
40     // Assume the field values in this Trigger.Builder have no relation to the field values in
41     // {@link ValidTriggerParams}
getValidTriggerBuilder()42     public static Trigger.Builder getValidTriggerBuilder() {
43         return new Trigger.Builder()
44                 .setAttributionDestination(ValidTriggerParams.ATTRIBUTION_DESTINATION)
45                 .setEnrollmentId(ValidTriggerParams.ENROLLMENT_ID)
46                 .setRegistrant(ValidTriggerParams.REGISTRANT)
47                 .setAggregatableSourceRegistrationTimeConfig(
48                         ValidTriggerParams.AGGREGATABLE_SOURCE_REGISTRATION_TIME_CONFIG)
49                 .setRegistrationOrigin(ValidTriggerParams.REGISTRATION_ORIGIN);
50     }
51 
52     // Assume the field values in this Trigger have no relation to the field values in
53     // {@link ValidTriggerParams}
getValidTrigger()54     public static Trigger getValidTrigger() {
55         return new Trigger.Builder()
56                 .setId(UUID.randomUUID().toString())
57                 .setAttributionDestination(ValidTriggerParams.ATTRIBUTION_DESTINATION)
58                 .setEnrollmentId(ValidTriggerParams.ENROLLMENT_ID)
59                 .setRegistrant(ValidTriggerParams.REGISTRANT)
60                 .setTriggerTime(ValidTriggerParams.TRIGGER_TIME)
61                 .setEventTriggers(ValidTriggerParams.EVENT_TRIGGERS)
62                 .setAggregateTriggerData(ValidTriggerParams.AGGREGATE_TRIGGER_DATA)
63                 .setAggregateValues(ValidTriggerParams.AGGREGATE_VALUES)
64                 .setFilters(ValidTriggerParams.TOP_LEVEL_FILTERS_JSON_STRING)
65                 .setNotFilters(ValidTriggerParams.TOP_LEVEL_NOT_FILTERS_JSON_STRING)
66                 .setAttributionConfig(ValidTriggerParams.ATTRIBUTION_CONFIGS_STRING)
67                 .setAdtechBitMapping(ValidTriggerParams.X_NETWORK_KEY_MAPPING)
68                 .setRegistrationOrigin(ValidTriggerParams.REGISTRATION_ORIGIN)
69                 .setAggregationCoordinatorOrigin(ValidTriggerParams.AGGREGATION_COORDINATOR_ORIGIN)
70                 .setAggregatableSourceRegistrationTimeConfig(
71                         ValidTriggerParams.AGGREGATABLE_SOURCE_REGISTRATION_TIME_CONFIG)
72                 .setTriggerContextId(ValidTriggerParams.TRIGGER_CONTEXT_ID)
73                 .setAttributionScopesString(ValidTriggerParams.ATTRIBUTION_SCOPES)
74                 .build();
75     }
76 
77     public static class ValidTriggerParams {
78         public static final Long TRIGGER_TIME = 8640000000L;
79         public static final Uri ATTRIBUTION_DESTINATION =
80                 Uri.parse("android-app://com.destination");
81         public static final Uri REGISTRANT = Uri.parse("android-app://com.registrant");
82         public static final String ENROLLMENT_ID = "enrollment-id";
83         public static final String TOP_LEVEL_FILTERS_JSON_STRING =
84                 "[{\n"
85                         + "  \"key_1\": [\"value_1\", \"value_2\"],\n"
86                         + "  \"key_2\": [\"value_1\", \"value_2\"]\n"
87                         + "}]\n";
88 
89         public static final String TOP_LEVEL_NOT_FILTERS_JSON_STRING =
90                 "[{\"geo\": [], \"source_type\": [\"event\"]}]";
91 
92         public static final String EVENT_TRIGGERS =
93                 "[\n"
94                         + "{\n"
95                         + "  \"trigger_data\": \"5\",\n"
96                         + "  \"priority\": \"123\",\n"
97                         + "  \"filters\": [{\n"
98                         + "    \"source_type\": [\"navigation\"],\n"
99                         + "    \"key_1\": [\"value_1\"] \n"
100                         + "   }]\n"
101                         + "},\n"
102                         + "{\n"
103                         + "  \"trigger_data\": \"0\",\n"
104                         + "  \"priority\": \"124\",\n"
105                         + "  \"deduplication_key\": \"101\",\n"
106                         + "  \"filters\": [{\n"
107                         + "     \"source_type\": [\"event\"]\n"
108                         + "   }]\n"
109                         + "}\n"
110                         + "]\n";
111 
112         public static final String AGGREGATE_TRIGGER_DATA =
113                 "["
114                     + "{"
115                         + "\"key_piece\":\"0xA80\","
116                         + "\"source_keys\":[\"geoValue\",\"noMatch\"]"
117                     + "}"
118                 + "]";
119 
120         public static final String AGGREGATE_VALUES =
121                 "{" + "\"campaignCounts\":32768," + "\"geoValue\":1664" + "}";
122 
123         public static final UnsignedLong DEBUG_KEY = new UnsignedLong(27836L);
124 
125         public static final AttributionConfig ATTRIBUTION_CONFIG =
126                 new AttributionConfig.Builder()
127                         .setExpiry(604800L)
128                         .setSourceAdtech("AdTech1-Ads")
129                         .setSourcePriorityRange(new Pair<>(100L, 1000L))
130                         .setSourceFilters(
131                                 Collections.singletonList(
132                                         new FilterMap.Builder()
133                                                 .setAttributionFilterMap(
134                                                         Map.of(
135                                                                 "campaign_type",
136                                                                 Collections.singletonList(
137                                                                         "install"),
138                                                                 "source_type",
139                                                                 Collections.singletonList(
140                                                                         "navigation")))
141                                                 .build()))
142                         .setPriority(99L)
143                         .setExpiry(604800L)
144                         .setFilterData(
145                                 new FilterMap.Builder()
146                                         .setAttributionFilterMap(
147                                                 Map.of(
148                                                         "campaign_type",
149                                                         Collections.singletonList("install")))
150                                         .build())
151                         .build();
152 
153         public static final String ATTRIBUTION_CONFIGS_STRING =
154                 new JSONArray(
155                                 Collections.singletonList(
156                                         ATTRIBUTION_CONFIG.serializeAsJson(
157                                                 FakeFlagsFactory.getFlagsForTest())))
158                         .toString();
159 
160         public static final String X_NETWORK_KEY_MAPPING =
161                 "{"
162                         + "\"AdTechA-enrollment_id\": \"0x1\","
163                         + "\"AdTechB-enrollment_id\": \"0x2\""
164                         + "}";
165         public static final Uri REGISTRATION_ORIGIN =
166                 WebUtil.validUri("https://subdomain.example.test");
167 
168         public static final Uri AGGREGATION_COORDINATOR_ORIGIN =
169                 WebUtil.validUri("https://coordinator.example.test");
170 
171         public static final Trigger.SourceRegistrationTimeConfig
172                 AGGREGATABLE_SOURCE_REGISTRATION_TIME_CONFIG =
173                         Trigger.SourceRegistrationTimeConfig.INCLUDE;
174 
175         public static final String PLATFORM_AD_ID = "test-platform-ad-id";
176         public static final String DEBUG_AD_ID = "test-debug-ad-id";
177         public static final String TRIGGER_CONTEXT_ID = "test-trigger-context-id";
178         public static final String ATTRIBUTION_SCOPES = "[\"1\"]";
179 
buildAggregatableAttributionTrigger()180         public static final AggregatableAttributionTrigger buildAggregatableAttributionTrigger() {
181             final FilterMap filter =
182                     new FilterMap.Builder()
183                             .setAttributionFilterMap(
184                                     Map.of(
185                                             "product",
186                                             List.of("1234", "4321"),
187                                             "conversion_subdomain",
188                                             List.of("electronics.megastore")))
189                             .build();
190             return new AggregatableAttributionTrigger.Builder()
191                     .setValues(Map.of("x", 1))
192                     .setTriggerData(
193                             List.of(
194                                     new AggregateTriggerData.Builder()
195                                             .setKey(BigInteger.ONE)
196                                             .setSourceKeys(Set.of("sourceKey"))
197                                             .setFilterSet(List.of(filter))
198                                             .build()))
199                     .build();
200         }
201     }
202 }
203