Skip to content

Commit 3fe7661

Browse files
authored
Merge pull request #1450 from OneSignal/test/fix_push_register_tests
Clean up FCM push register code and correct it's tests
2 parents 2dd1948 + 2381a82 commit 3fe7661

File tree

6 files changed

+150
-112
lines changed

6 files changed

+150
-112
lines changed

OneSignalSDK/onesignal/src/main/java/com/onesignal/OneSignal.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1015,13 +1015,23 @@ private static PushRegistrator getPushRegistrator() {
10151015
mPushRegistrator = new PushRegistratorADM();
10161016
else if (OSUtils.isAndroidDeviceType()) {
10171017
if (OSUtils.hasFCMLibrary())
1018-
mPushRegistrator = new PushRegistratorFCM();
1018+
mPushRegistrator = getPushRegistratorFCM();
10191019
} else
10201020
mPushRegistrator = new PushRegistratorHMS();
10211021

10221022
return mPushRegistrator;
10231023
}
10241024

1025+
@NonNull
1026+
static private PushRegistratorFCM getPushRegistratorFCM() {
1027+
OneSignalRemoteParams.FCMParams fcmRemoteParams = remoteParamController.getRemoteParams().fcmParams;
1028+
PushRegistratorFCM.Params fcmParams = null;
1029+
if (fcmRemoteParams != null) {
1030+
fcmParams = new PushRegistratorFCM.Params(fcmRemoteParams.projectId, fcmRemoteParams.appId, fcmRemoteParams.apiKey);
1031+
}
1032+
return new PushRegistratorFCM(appContext, fcmParams);
1033+
}
1034+
10251035
private static void registerForPushToken() {
10261036
getPushRegistrator().registerForPush(appContext, googleProjectNumber, new PushRegistrator.RegisteredHandler() {
10271037
@Override

OneSignalSDK/onesignal/src/main/java/com/onesignal/PushRegistratorFCM.java

Lines changed: 51 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,11 @@
2727

2828
package com.onesignal;
2929

30+
import android.content.Context;
3031
import android.util.Base64;
3132

3233
import androidx.annotation.NonNull;
34+
import androidx.annotation.Nullable;
3335
import androidx.annotation.WorkerThread;
3436

3537
import com.google.android.gms.tasks.Task;
@@ -45,17 +47,55 @@
4547

4648
class PushRegistratorFCM extends PushRegistratorAbstractGoogle {
4749

48-
// project_info.project_id
49-
private static final String FCM_DEFAULT_PROJECT_ID = "onesignal-shared-public";
50-
// client.client_info.mobilesdk_app_id
51-
private static final String FCM_DEFAULT_APP_ID = "1:754795614042:android:c682b8144a8dd52bc1ad63";
52-
// client.api_key.current_key
53-
private static final String FCM_DEFAULT_API_KEY_BASE64 = "QUl6YVN5QW5UTG41LV80TWMyYTJQLWRLVWVFLWFCdGd5Q3JqbFlV";
54-
5550
private static final String FCM_APP_NAME = "ONESIGNAL_SDK_FCM_APP_NAME";
5651

52+
static class Params {
53+
// project_info.project_id
54+
private static final String FCM_DEFAULT_PROJECT_ID = "onesignal-shared-public";
55+
// client.client_info.mobilesdk_app_id
56+
private static final String FCM_DEFAULT_APP_ID = "1:754795614042:android:c682b8144a8dd52bc1ad63";
57+
// client.api_key.current_key
58+
private static final String FCM_DEFAULT_API_KEY_BASE64 = "QUl6YVN5QW5UTG41LV80TWMyYTJQLWRLVWVFLWFCdGd5Q3JqbFlV";
59+
60+
@NonNull private final String projectId;
61+
@NonNull private final String appId;
62+
@NonNull private final String apiKey;
63+
64+
Params() {
65+
this(null, null, null);
66+
}
67+
68+
Params(
69+
@Nullable String projectId,
70+
@Nullable String appId,
71+
@Nullable String apiKey
72+
) {
73+
this.projectId = projectId != null ? projectId : FCM_DEFAULT_PROJECT_ID;
74+
this.appId = appId != null ? appId : FCM_DEFAULT_APP_ID;
75+
76+
String defaultApiKey = new String(Base64.decode(FCM_DEFAULT_API_KEY_BASE64, Base64.DEFAULT));
77+
this.apiKey = apiKey != null ? apiKey : defaultApiKey;
78+
}
79+
}
80+
5781
private FirebaseApp firebaseApp;
5882

83+
@NonNull private final Context context;
84+
@NonNull private final Params params;
85+
86+
PushRegistratorFCM(
87+
@NonNull Context context,
88+
@Nullable Params params
89+
) {
90+
this.context = context;
91+
92+
if (params == null) {
93+
this.params = new Params();
94+
} else {
95+
this.params = params;
96+
}
97+
}
98+
5999
@Override
60100
String getProviderName() {
61101
return "FCM";
@@ -125,32 +165,13 @@ private void initFirebaseApp(String senderId) {
125165
if (firebaseApp != null)
126166
return;
127167

128-
OneSignalRemoteParams.Params remoteParams = OneSignal.getRemoteParams();
129168
FirebaseOptions firebaseOptions =
130169
new FirebaseOptions.Builder()
131170
.setGcmSenderId(senderId)
132-
.setApplicationId(getAppId(remoteParams))
133-
.setApiKey(getApiKey(remoteParams))
134-
.setProjectId(getProjectId(remoteParams))
171+
.setApplicationId(params.appId)
172+
.setApiKey(params.apiKey)
173+
.setProjectId(params.projectId)
135174
.build();
136-
firebaseApp = FirebaseApp.initializeApp(OneSignal.appContext, firebaseOptions, FCM_APP_NAME);
137-
}
138-
139-
private static @NonNull String getAppId(OneSignalRemoteParams.Params remoteParams) {
140-
if (remoteParams.fcmParams.appId != null)
141-
return remoteParams.fcmParams.appId;
142-
return FCM_DEFAULT_APP_ID;
143-
}
144-
145-
private static @NonNull String getApiKey(OneSignalRemoteParams.Params remoteParams) {
146-
if (remoteParams.fcmParams.apiKey != null)
147-
return remoteParams.fcmParams.apiKey;
148-
return new String(Base64.decode(FCM_DEFAULT_API_KEY_BASE64, Base64.DEFAULT));
149-
}
150-
151-
private static @NonNull String getProjectId(OneSignalRemoteParams.Params remoteParams) {
152-
if (remoteParams.fcmParams.projectId != null)
153-
return remoteParams.fcmParams.projectId;
154-
return FCM_DEFAULT_PROJECT_ID;
175+
firebaseApp = FirebaseApp.initializeApp(context, firebaseOptions, FCM_APP_NAME);
155176
}
156177
}

OneSignalSDK/unittest/src/test/java/com/onesignal/OneSignalPackagePrivateHelper.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,11 @@ protected void stopSync() {
240240

241241
public static class FCMBroadcastReceiver extends com.onesignal.FCMBroadcastReceiver {}
242242

243-
public static class PushRegistratorFCM extends com.onesignal.PushRegistratorFCM {}
243+
public static class PushRegistratorFCM extends com.onesignal.PushRegistratorFCM {
244+
public PushRegistratorFCM(@NonNull Context context, @Nullable Params params) {
245+
super(context, params);
246+
}
247+
}
244248

245249
public static class OneSignalRestClient extends com.onesignal.OneSignalRestClient {
246250
public static abstract class ResponseHandler extends com.onesignal.OneSignalRestClient.ResponseHandler {
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.onesignal;
2+
3+
import android.content.Context;
4+
5+
import androidx.annotation.NonNull;
6+
7+
import com.google.firebase.FirebaseApp;
8+
import com.google.firebase.FirebaseOptions;
9+
10+
import org.robolectric.annotation.Implements;
11+
12+
@Implements(com.google.firebase.FirebaseApp.class)
13+
public class ShadowFirebaseApp {
14+
15+
@NonNull
16+
public static FirebaseApp initializeApp(@NonNull Context context, @NonNull FirebaseOptions options, @NonNull String name) {
17+
// Throw simulates Firebase library not bundled with app
18+
throw new RuntimeException();
19+
}
20+
}

OneSignalSDK/unittest/src/test/java/com/onesignal/ShadowFirebaseCloudMessaging.java

Lines changed: 0 additions & 46 deletions
This file was deleted.

OneSignalSDK/unittest/src/test/java/com/test/onesignal/PushRegistratorRunner.java

Lines changed: 63 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -29,81 +29,110 @@
2929

3030
import android.app.Activity;
3131

32+
import androidx.annotation.NonNull;
33+
34+
import com.onesignal.OneSignal;
3235
import com.onesignal.OneSignalPackagePrivateHelper.PushRegistratorFCM;
3336
import com.onesignal.PushRegistrator;
34-
import com.onesignal.ShadowFirebaseCloudMessaging;
37+
import com.onesignal.ShadowFirebaseApp;
3538
import com.onesignal.ShadowGooglePlayServicesUtil;
39+
import com.onesignal.ShadowOSUtils;
40+
import com.onesignal.ShadowOneSignalRestClient;
41+
import com.onesignal.StaticResetHelper;
3642
import com.onesignal.example.BlankActivity;
3743

44+
import org.junit.After;
3845
import org.junit.Before;
3946
import org.junit.BeforeClass;
4047
import org.junit.Test;
4148
import org.junit.runner.RunWith;
4249
import org.robolectric.Robolectric;
4350
import org.robolectric.RobolectricTestRunner;
4451
import org.robolectric.annotation.Config;
52+
import org.robolectric.annotation.LooperMode;
4553
import org.robolectric.shadows.ShadowLog;
4654

55+
import static com.test.onesignal.TestHelpers.threadAndTaskWait;
56+
4757
import static junit.framework.Assert.assertTrue;
4858

4959
@Config(packageName = "com.onesignal.example",
5060
shadows = {
5161
ShadowGooglePlayServicesUtil.class,
52-
ShadowFirebaseCloudMessaging.class },
53-
sdk = 21
62+
ShadowOSUtils.class,
63+
ShadowOneSignalRestClient.class,
64+
ShadowFirebaseApp.class,
65+
},
66+
sdk = 28
5467
)
5568
@RunWith(RobolectricTestRunner.class)
69+
@LooperMode(LooperMode.Mode.LEGACY)
5670
public class PushRegistratorRunner {
5771

5872
private Activity blankActivity;
59-
private static boolean callbackFired;
6073

6174
@BeforeClass // Runs only once, before any tests
6275
public static void setUpClass() throws Exception {
6376
ShadowLog.stream = System.out;
6477
TestHelpers.beforeTestSuite();
78+
StaticResetHelper.saveStaticValues();
6579
}
6680

6781
@Before // Before each test
68-
public void beforeEachTest() {
82+
public void beforeEachTest() throws Exception {
83+
TestHelpers.beforeTestInitAndCleanup();
6984
blankActivity = Robolectric.buildActivity(BlankActivity.class).create().get();
70-
callbackFired = false;
71-
ShadowFirebaseCloudMessaging.exists = true;
7285
}
7386

74-
@Test
75-
public void testGooglePlayServicesAPKMissingOnDevice() {
76-
PushRegistratorFCM pushReg = new PushRegistratorFCM();
77-
final Thread testThread = Thread.currentThread();
78-
79-
pushReg.registerForPush(blankActivity, "", new PushRegistrator.RegisteredHandler() {
80-
@Override
81-
public void complete(String id, int status) {
82-
callbackFired = true;
83-
testThread.interrupt();
84-
}
85-
});
87+
@After
88+
public void afterEachTest() throws Exception {
89+
TestHelpers.afterTestCleanup();
90+
}
91+
92+
static private class RegisteredHandler implements PushRegistrator.RegisteredHandler {
93+
private final Thread testThread;
94+
public boolean callbackFired;
95+
96+
RegisteredHandler(@NonNull Thread testThread) {
97+
this.testThread = testThread;
98+
}
99+
100+
@Override
101+
public void complete(String id, int status) {
102+
callbackFired = true;
103+
testThread.interrupt();
104+
}
105+
}
106+
107+
private void initOneSignalAndWait() throws Exception {
108+
OneSignal.initWithContext(blankActivity);
109+
OneSignal.setAppId("11111111-2222-3333-4444-555555555555");
110+
threadAndTaskWait();
111+
}
112+
113+
private boolean performRegisterForPush() throws Exception {
114+
initOneSignalAndWait();
115+
116+
RegisteredHandler registeredHandler = new RegisteredHandler(Thread.currentThread());
117+
118+
PushRegistratorFCM pushReg = new PushRegistratorFCM(blankActivity, null);
119+
pushReg.registerForPush(blankActivity, "123456789", registeredHandler);
86120
try {Thread.sleep(5000);} catch (Throwable t) {}
87121

88-
assertTrue(callbackFired);
122+
return registeredHandler.callbackFired;
89123
}
90124

91125
@Test
92-
public void testFCMPartOfGooglePlayServicesMissing() {
93-
PushRegistratorFCM pushReg = new PushRegistratorFCM();
94-
ShadowFirebaseCloudMessaging.exists = false;
95-
96-
final Thread testThread = Thread.currentThread();
97-
98-
pushReg.registerForPush(blankActivity, "", new PushRegistrator.RegisteredHandler() {
99-
@Override
100-
public void complete(String id, int status) {
101-
callbackFired = true;
102-
testThread.interrupt();
103-
}
104-
});
105-
try {Thread.sleep(5000);} catch (Throwable t) {}
126+
public void testGooglePlayServicesAPKMissingOnDevice() throws Exception {
127+
ShadowOSUtils.isGMSInstalledAndEnabled = false;
128+
boolean callbackFired = performRegisterForPush();
129+
assertTrue(callbackFired);
130+
}
106131

132+
@Test
133+
public void testFCMPartOfGooglePlayServicesMissing() throws Exception {
134+
ShadowOSUtils.isGMSInstalledAndEnabled = true;
135+
boolean callbackFired = performRegisterForPush();
107136
assertTrue(callbackFired);
108137
}
109138
}

0 commit comments

Comments
 (0)