Skip to content

Commit f3e84ab

Browse files
authored
Merge pull request #53 from button/najm/allow-broken-requests-temp
Allow broken events requests to be made
2 parents 3030c21 + 6b3dd32 commit f3e84ab

File tree

11 files changed

+85
-53
lines changed

11 files changed

+85
-53
lines changed

button-merchant/src/main/java/com/usebutton/merchant/ButtonApi.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,9 @@ interface ButtonApi {
4040

4141
void setApplicationId(String applicationId);
4242

43+
@Nullable
44+
String getApplicationId();
45+
4346
@Nullable
4447
@WorkerThread
4548
PostInstallLink getPendingLink(String applicationId, @Nullable String advertisingId,

button-merchant/src/main/java/com/usebutton/merchant/ButtonApiImpl.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,12 @@ public void setApplicationId(String applicationId) {
6767
connectionManager.setApplicationId(applicationId);
6868
}
6969

70+
@Nullable
71+
@Override
72+
public String getApplicationId() {
73+
return connectionManager.getApplicationId();
74+
}
75+
7076
@Nullable
7177
@WorkerThread
7278
@Override

button-merchant/src/main/java/com/usebutton/merchant/ButtonInternalImpl.java

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@
3939
import java.util.Set;
4040
import java.util.concurrent.Executor;
4141
import java.util.concurrent.atomic.AtomicBoolean;
42-
import java.util.regex.Pattern;
4342

4443
/**
4544
* ButtonInternalImpl class should implement everything needed for {@link ButtonMerchant}
@@ -72,19 +71,16 @@ final class ButtonInternalImpl implements ButtonInternal {
7271
*/
7372
private final AtomicBoolean hasReceivedDirectDeeplink = new AtomicBoolean();
7473

75-
private static final Pattern APP_ID_PATTERN = Pattern.compile("^app-[0-9a-zA-Z]+$");
76-
7774
ButtonInternalImpl(Executor executor) {
7875
this.attributionTokenListeners = new ArrayList<>();
7976
this.executor = executor;
8077
}
8178

8279
public void configure(ButtonRepository buttonRepository, String applicationId) {
83-
if (!APP_ID_PATTERN.matcher(applicationId).matches()) {
80+
if (!ButtonUtil.isApplicationIdValid(applicationId)) {
8481
Log.e(TAG, "Application ID [" + applicationId + "] is not valid. "
8582
+ "You can find your Application ID in the dashboard by logging in at"
8683
+ " https://app.usebutton.com/");
87-
return;
8884
}
8985

9086
buttonRepository.setApplicationId(applicationId);

button-merchant/src/main/java/com/usebutton/merchant/ButtonMerchant.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ private ButtonMerchant() {
5151
static ButtonInternal buttonInternal = new ButtonInternalImpl(executor);
5252

5353
private static ExecutorService executorService = Executors.newSingleThreadExecutor();
54-
private static final String BASE_URL = "https://mobileapi.usebutton.com";
54+
static final String BASE_URL = "https://mobileapi.usebutton.com";
5555
static final String FMT_BASE_URL_APP_ID = "https://%s.mobileapi.usebutton.com";
5656

5757
/**

button-merchant/src/main/java/com/usebutton/merchant/ButtonRepositoryImpl.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,8 @@ final class ButtonRepositoryImpl implements ButtonRepository {
4848
private final PersistenceManager persistenceManager;
4949
private final ExecutorService executorService;
5050

51-
private String applicationId;
52-
5351
private static ButtonRepository buttonRepository;
52+
private boolean isConfigured;
5453
private List<Task<?>> pendingTasks = new CopyOnWriteArrayList<>();
5554

5655
static ButtonRepository getInstance(ButtonApi buttonApi, PersistenceManager persistenceManager,
@@ -73,7 +72,7 @@ static ButtonRepository getInstance(ButtonApi buttonApi, PersistenceManager pers
7372

7473
@Override
7574
public void setApplicationId(String applicationId) {
76-
this.applicationId = applicationId;
75+
isConfigured = true;
7776
buttonApi.setApplicationId(applicationId);
7877

7978
for (Task<?> task : pendingTasks) {
@@ -85,7 +84,7 @@ public void setApplicationId(String applicationId) {
8584
@Nullable
8685
@Override
8786
public String getApplicationId() {
88-
return applicationId;
87+
return buttonApi.getApplicationId();
8988
}
9089

9190
@Override
@@ -157,7 +156,7 @@ public void onTaskError(Throwable throwable) {
157156
* @param task the task to submit
158157
*/
159158
private void invokeIfConfigured(Task<?> task) {
160-
if (getApplicationId() != null) {
159+
if (isConfigured) {
161160
executorService.submit(task);
162161
} else {
163162
Log.d(TAG, "Application ID unavailable! Queueing Task.");

button-merchant/src/main/java/com/usebutton/merchant/ButtonUtil.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,9 +61,10 @@ final class ButtonUtil {
6161

6262
private static final Pattern EMAIL_REGEX_PATTERN = Pattern.compile(EMAIL_REGEX);
6363

64+
private static final Pattern APP_ID_PATTERN = Pattern.compile("^app-[0-9a-zA-Z]+$");
65+
6466
/**
6567
* @param date date to be formatted
66-
*
6768
* @return date formatted in ISO_8601 format
6869
*/
6970
public static String formatDate(Date date) {
@@ -92,6 +93,10 @@ public static boolean isValidEmail(String email) {
9293
return EMAIL_REGEX_PATTERN.matcher(email).matches();
9394
}
9495

96+
public static boolean isApplicationIdValid(@Nullable String applicationId) {
97+
return applicationId != null && APP_ID_PATTERN.matcher(applicationId).matches();
98+
}
99+
95100
private static String encodeHex(byte[] digest) {
96101
StringBuilder sb = new StringBuilder();
97102
for (int i = 0; i < digest.length; i++) {

button-merchant/src/main/java/com/usebutton/merchant/ConnectionManager.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525

2626
package com.usebutton.merchant;
2727

28+
import android.support.annotation.Nullable;
29+
2830
import com.usebutton.merchant.exception.ButtonNetworkException;
2931

3032
/**
@@ -34,5 +36,8 @@ interface ConnectionManager {
3436

3537
void setApplicationId(String applicationId);
3638

39+
@Nullable
40+
String getApplicationId();
41+
3742
NetworkResponse executeRequest(ApiRequest request) throws ButtonNetworkException;
3843
}

button-merchant/src/main/java/com/usebutton/merchant/ConnectionManagerImpl.java

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -90,10 +90,21 @@ static ConnectionManager getInstance(String baseUrl, String userAgent,
9090

9191
@Override
9292
public void setApplicationId(String applicationId) {
93-
this.applicationId = applicationId;
93+
// Only cache the application ID if it is valid
94+
// However, we would still let the network requests proceed instead of failing silently
95+
// on the client-side.
96+
if (ButtonUtil.isApplicationIdValid(applicationId)) {
97+
this.applicationId = applicationId;
98+
99+
// Update the endpoint to the App ID flavor
100+
baseUrl = String.format(ButtonMerchant.FMT_BASE_URL_APP_ID, applicationId);
101+
}
102+
}
94103

95-
// Update the endpoint to the App ID flavor
96-
baseUrl = String.format(ButtonMerchant.FMT_BASE_URL_APP_ID, applicationId);
104+
@Nullable
105+
@Override
106+
public String getApplicationId() {
107+
return applicationId;
97108
}
98109

99110
@Override

button-merchant/src/test/java/com/usebutton/merchant/ButtonInternalImplTest.java

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,6 @@
5050
import static org.mockito.Mockito.mock;
5151
import static org.mockito.Mockito.never;
5252
import static org.mockito.Mockito.verify;
53-
import static org.mockito.Mockito.verifyZeroInteractions;
5453
import static org.mockito.Mockito.when;
5554

5655
public class ButtonInternalImplTest {
@@ -73,15 +72,6 @@ public void configure_saveApplicationIdInMemory() {
7372
verify(buttonRepository).setApplicationId("app-abcdef1234567890");
7473
}
7574

76-
@Test
77-
public void configure_invalidAppId_shouldNotConfigure() {
78-
ButtonRepository buttonRepository = mock(ButtonRepository.class);
79-
80-
buttonInternal.configure(buttonRepository, "invalid_application_id");
81-
82-
verifyZeroInteractions(buttonRepository);
83-
}
84-
8575
@Test
8676
public void getApplicationId_retrieveFromRepository() {
8777
ButtonRepository buttonRepository = mock(ButtonRepository.class);

button-merchant/src/test/java/com/usebutton/merchant/ButtonRepositoryImplTest.java

Lines changed: 10 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@
4040
import static org.mockito.Mockito.never;
4141
import static org.mockito.Mockito.times;
4242
import static org.mockito.Mockito.verify;
43-
import static org.mockito.Mockito.verifyZeroInteractions;
4443
import static org.mockito.Mockito.when;
4544

4645
public class ButtonRepositoryImplTest {
@@ -62,17 +61,10 @@ public void setUp() {
6261
buttonRepository = new ButtonRepositoryImpl(buttonApi, persistenceManager, executorService);
6362
}
6463

65-
@Test
66-
public void setApplicationId_cacheInMemory() {
67-
buttonRepository.setApplicationId("valid_application_id");
68-
assertEquals("valid_application_id", buttonRepository.getApplicationId());
69-
verifyZeroInteractions(persistenceManager);
70-
}
71-
7264
@Test
7365
public void setApplicationId_provideToButtonApi() {
74-
buttonRepository.setApplicationId("valid_application_id");
75-
verify(buttonApi).setApplicationId("valid_application_id");
66+
buttonRepository.setApplicationId("invalid_application_id");
67+
verify(buttonApi).setApplicationId("invalid_application_id");
7668
}
7769

7870
@Test
@@ -84,7 +76,7 @@ public void setApplicationId_submitsPendingTasks() {
8476
buttonRepository.reportEvent(mock(DeviceManager.class), mock(Features.class),
8577
mock(Event.class));
8678

87-
buttonRepository.setApplicationId("valid_application_id");
79+
buttonRepository.setApplicationId("invalid_application_id");
8880

8981
verify(executorService, times(3)).submit(any(EventReportingTask.class));
9082
}
@@ -98,21 +90,15 @@ public void setApplicationId_clearsPendingTasksAfterSubmission() {
9890
buttonRepository.reportEvent(mock(DeviceManager.class), mock(Features.class),
9991
mock(Event.class));
10092

101-
buttonRepository.setApplicationId("valid_application_id");
102-
buttonRepository.setApplicationId("valid_application_id");
103-
buttonRepository.setApplicationId("valid_application_id");
104-
buttonRepository.setApplicationId("valid_application_id");
105-
buttonRepository.setApplicationId("valid_application_id");
93+
buttonRepository.setApplicationId("invalid_application_id");
94+
buttonRepository.setApplicationId("invalid_application_id");
95+
buttonRepository.setApplicationId("invalid_application_id");
96+
buttonRepository.setApplicationId("invalid_application_id");
97+
buttonRepository.setApplicationId("invalid_application_id");
10698

10799
verify(executorService, times(3)).submit(any(EventReportingTask.class));
108100
}
109101

110-
@Test
111-
public void getApplicationId_returnValidAppId() {
112-
buttonRepository.setApplicationId("valid_application_id");
113-
assertEquals("valid_application_id", buttonRepository.getApplicationId());
114-
}
115-
116102
@Test
117103
public void setSourceToken_persistToPersistenceManager() {
118104
buttonRepository.setSourceToken("valid_source_token");
@@ -166,7 +152,7 @@ public void postOrder_executeTask() {
166152

167153
@Test
168154
public void reportEvent_configured_executeTask() {
169-
buttonRepository.setApplicationId("valid_application_id");
155+
buttonRepository.setApplicationId("invalid_application_id");
170156
buttonRepository.reportEvent(mock(DeviceManager.class), mock(Features.class),
171157
mock(Event.class));
172158

@@ -179,7 +165,7 @@ public void reportEvent_unConfigured_queueTaskAndExecuteWhenConfigured() {
179165
mock(Event.class));
180166

181167
verify(executorService, never()).submit(any(EventReportingTask.class));
182-
buttonRepository.setApplicationId("valid_application_id");
168+
buttonRepository.setApplicationId("invalid_application_id");
183169

184170
verify(executorService).submit(any(EventReportingTask.class));
185171
}

0 commit comments

Comments
 (0)