Skip to content

Commit e394ef7

Browse files
committed
deleteTags, getTags, postNotification, and REST fixes
* Fixed bug where deleting multiple already sync tags after sync would print a null error and local sync state would not save. * Now checks for "errors" key and fires onFailure correctly in postNotification. * getTags no longer throws null exception if called before OneSignal init is called. * Improved non 200 OK response handling in the REST Client. * Robolectric tests are now runnable from the command line / terminal and execute much faster.
1 parent 7b905fb commit e394ef7

File tree

7 files changed

+154
-76
lines changed

7 files changed

+154
-76
lines changed

OneSignalSDK/app/build.gradle

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,6 @@ dependencies {
6060
compile "com.google.android.gms:play-services-location:8.4.0"
6161

6262
testCompile 'junit:junit:4.12'
63-
// testCompile 'org.robolectric:shadows-support-v4:3.0'
6463
testCompile('org.robolectric:robolectric:3.0') {
6564
exclude group: 'commons-logging', module: 'commons-logging'
6665
exclude group: 'org.apache.httpcomponents', module: 'httpclient'
@@ -69,4 +68,4 @@ dependencies {
6968
// testCompile("org.robolectric:robolectric:3.1-SNAPSHOT") {
7069
// exclude group: 'org.apache.httpcomponents', module: 'httpclient'
7170
// }
72-
}
71+
}

OneSignalSDK/app/src/test/java/com/onesignal/ShadowOneSignalRestClient.java

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ public class ShadowOneSignalRestClient {
3636
public static JSONObject lastPost;
3737
public static Thread testThread;
3838
public static boolean failNext, failAll;
39-
public static String failResponse = "{}";
39+
public static String failResponse = "{}", nextSuccessResponse;
4040
public static int networkCallCount;
4141

4242
public static final String testUserId = "a2f7f967-e8cc-11e4-bed1-118f05be4511";
@@ -75,7 +75,7 @@ private static boolean doFail(OneSignalRestClient.ResponseHandler responseHandle
7575
return false;
7676
}
7777

78-
static void postSync(String url, JSONObject jsonBody, OneSignalRestClient.ResponseHandler responseHandler) {
78+
private static void mockPost(String url, JSONObject jsonBody, OneSignalRestClient.ResponseHandler responseHandler) {
7979
networkCallCount++;
8080
lastPost = jsonBody;
8181

@@ -88,11 +88,24 @@ static void postSync(String url, JSONObject jsonBody, OneSignalRestClient.Respon
8888
else
8989
retJson = "{\"id\": \"" + testUserId + "\"}";
9090

91-
responseHandler.onSuccess(retJson);
91+
if (nextSuccessResponse != null) {
92+
responseHandler.onSuccess(nextSuccessResponse);
93+
nextSuccessResponse = null;
94+
}
95+
else
96+
responseHandler.onSuccess(retJson);
9297

9398
safeInterrupt();
9499
}
95100

101+
static void post(String url, JSONObject jsonBody, OneSignalRestClient.ResponseHandler responseHandler) {
102+
mockPost(url, jsonBody, responseHandler);
103+
}
104+
105+
static void postSync(String url, JSONObject jsonBody, OneSignalRestClient.ResponseHandler responseHandler) {
106+
mockPost(url, jsonBody, responseHandler);
107+
}
108+
96109
static void putSync(String url, JSONObject jsonBody, OneSignalRestClient.ResponseHandler responseHandler) {
97110
networkCallCount++;
98111
lastPost = jsonBody;

OneSignalSDK/app/src/test/java/com/test/onesignal/CustomRobolectricTestRunner.java

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,18 +27,30 @@
2727

2828
package com.test.onesignal;
2929

30+
import com.onesignal.example.BuildConfig;
31+
3032
import org.junit.runners.model.InitializationError;
3133
import org.robolectric.RobolectricGradleTestRunner;
32-
import org.robolectric.annotation.Config;
3334
import org.robolectric.internal.bytecode.InstrumentationConfiguration;
3435

3536
public class CustomRobolectricTestRunner extends RobolectricGradleTestRunner {
36-
public CustomRobolectricTestRunner(Class<?> klass) throws InitializationError {
37-
super(klass);
38-
}
37+
public CustomRobolectricTestRunner(Class<?> klass) throws InitializationError {
38+
super(klass);
39+
40+
// Work around for running tests from console.
41+
// working directory not being set to $MODULE_DIR$.
42+
String buildVariant = (BuildConfig.FLAVOR.isEmpty() ? "" : BuildConfig.FLAVOR + "/") + BuildConfig.BUILD_TYPE;
43+
String intermediatesPath = BuildConfig.class.getResource("").toString().replace("file:", "");
44+
intermediatesPath = intermediatesPath.substring(0, intermediatesPath.indexOf("/classes"));
45+
46+
System.setProperty("android.package", BuildConfig.APPLICATION_ID);
47+
System.setProperty("android.manifest", intermediatesPath + "/manifests/full/" + buildVariant + "/AndroidManifest.xml");
48+
System.setProperty("android.resources", intermediatesPath + "/res/" + buildVariant);
49+
System.setProperty("android.assets", intermediatesPath + "/assets/" + buildVariant);
50+
}
3951

40-
@Override
41-
public InstrumentationConfiguration createClassLoaderConfig() {
42-
return InstrumentationConfiguration.newBuilder().addInstrumentedPackage("com.onesignal").build();
43-
}
52+
@Override
53+
public InstrumentationConfiguration createClassLoaderConfig() {
54+
return InstrumentationConfiguration.newBuilder().addInstrumentedPackage("com.onesignal").build();
55+
}
4456
}

OneSignalSDK/app/src/test/java/com/test/onesignal/MainOneSignalClassRunner.java

Lines changed: 78 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ public class MainOneSignalClassRunner {
8787
private static JSONObject lastGetTags;
8888
private ActivityController<BlankActivity> blankActivityController;
8989

90-
public static void GetIdsAvailable() {
90+
private static void GetIdsAvailable() {
9191
OneSignal.idsAvailable(new OneSignal.IdsAvailableHandler() {
9292
@Override
9393
public void idsAvailable(String userId, String registrationId) {
@@ -97,6 +97,15 @@ public void idsAvailable(String userId, String registrationId) {
9797
});
9898
}
9999

100+
private static void GetTags() {
101+
OneSignal.getTags(new OneSignal.GetTagsHandler() {
102+
@Override
103+
public void tagsAvailable(JSONObject tags) {
104+
lastGetTags = tags;
105+
}
106+
});
107+
}
108+
100109
@BeforeClass // Runs only once, before any tests
101110
public static void setUpClass() throws Exception {
102111
ShadowLog.stream = System.out;
@@ -115,6 +124,7 @@ public void beforeEachTest() throws Exception {
115124
blankActivityController = Robolectric.buildActivity(BlankActivity.class).create();
116125
blankActivity = blankActivityController.get();
117126

127+
ShadowOneSignalRestClient.nextSuccessResponse = null;
118128
ShadowOneSignalRestClient.failNext = false;
119129
ShadowOneSignalRestClient.failAll = false;
120130
ShadowOneSignalRestClient.interruptibleDelayNext = false;
@@ -556,12 +566,7 @@ public void shouldSendTagsWithRequestBatching() throws Exception {
556566
OneSignal.sendTags(new JSONObject("{\"test1\": \"value1\"}"));
557567
OneSignal.sendTags(new JSONObject("{\"test2\": \"value2\"}"));
558568

559-
OneSignal.getTags(new OneSignal.GetTagsHandler() {
560-
@Override
561-
public void tagsAvailable(JSONObject tags) {
562-
lastGetTags = tags;
563-
}
564-
});
569+
GetTags();
565570
threadAndTaskWait();
566571
threadAndTaskWait();
567572

@@ -583,14 +588,8 @@ public void testOldIntValues() throws Exception {
583588

584589
OneSignal.deleteTag("int");
585590
threadAndTaskWait();
586-
587-
lastGetTags = null;
588-
OneSignal.getTags(new OneSignal.GetTagsHandler() {
589-
@Override
590-
public void tagsAvailable(JSONObject tags) {
591-
lastGetTags = tags;
592-
}
593-
});
591+
592+
GetTags();
594593

595594
final SharedPreferences prefs2 = blankActivity.getSharedPreferences(OneSignal.class.getSimpleName(), Context.MODE_PRIVATE);
596595
Assert.assertNull(lastGetTags);
@@ -600,12 +599,7 @@ public void tagsAvailable(JSONObject tags) {
600599
public void testSendTagNonStringValues() throws Exception {
601600
OneSignalInit();
602601
OneSignal.sendTags("{\"int\": 122, \"bool\": true, \"null\": null, \"array\": [123], \"object\": {}}");
603-
OneSignal.getTags(new OneSignal.GetTagsHandler() {
604-
@Override
605-
public void tagsAvailable(JSONObject tags) {
606-
lastGetTags = tags;
607-
}
608-
});
602+
GetTags();
609603

610604
Assert.assertEquals(String.class, lastGetTags.get("int").getClass());
611605
Assert.assertEquals("122", lastGetTags.get("int"));
@@ -663,6 +657,7 @@ public void shouldNotCrashIfOnTaskRemovedIsCalledBeforeInitIsDone() {
663657

664658
@Test
665659
public void testMethodCallsBeforeInit() throws Exception {
660+
GetTags();
666661
OneSignal.sendTag("key", "value");
667662
OneSignal.sendTags("{\"key\": \"value\"}");
668663
OneSignal.deleteTag("key");
@@ -690,12 +685,7 @@ public void testDeleteTags() throws Exception {
690685
OneSignalInit();
691686
OneSignal.sendTags("{\"str\": \"str1\", \"int\": 122, \"bool\": true}");
692687
OneSignal.deleteTag("int");
693-
OneSignal.getTags(new OneSignal.GetTagsHandler() {
694-
@Override
695-
public void tagsAvailable(JSONObject tags) {
696-
lastGetTags = tags;
697-
}
698-
});
688+
GetTags();
699689

700690
Assert.assertFalse(lastGetTags.has("int"));
701691
lastGetTags = null;
@@ -707,12 +697,7 @@ public void tagsAvailable(JSONObject tags) {
707697

708698
OneSignal.deleteTag("int");
709699

710-
OneSignal.getTags(new OneSignal.GetTagsHandler() {
711-
@Override
712-
public void tagsAvailable(JSONObject tags) {
713-
lastGetTags = tags;
714-
}
715-
});
700+
GetTags();
716701

717702
Assert.assertFalse(lastGetTags.has("int"));
718703

@@ -724,6 +709,29 @@ public void tagsAvailable(JSONObject tags) {
724709
Assert.assertFalse(new JSONObject(syncValues).has("tags"));
725710
}
726711

712+
713+
@Test
714+
public void testDeleteTagsAfterSync() throws Exception {
715+
OneSignalInit();
716+
OneSignal.sendTags("{\"foo\": \"bar\", \"fuz\": \"baz\"}");
717+
threadAndTaskWait();
718+
Assert.assertEquals("bar", ShadowOneSignalRestClient.lastPost.getJSONObject("tags").get("foo"));
719+
Assert.assertEquals("baz", ShadowOneSignalRestClient.lastPost.getJSONObject("tags").get("fuz"));
720+
721+
OneSignal.deleteTags("[\"foo\", \"fuz\"]");
722+
threadAndTaskWait();
723+
Assert.assertEquals("", ShadowOneSignalRestClient.lastPost.getJSONObject("tags").get("foo"));
724+
Assert.assertEquals("", ShadowOneSignalRestClient.lastPost.getJSONObject("tags").get("fuz"));
725+
726+
GetTags();
727+
728+
Assert.assertNull(lastGetTags);
729+
730+
final SharedPreferences prefs = blankActivity.getSharedPreferences(OneSignal.class.getSimpleName(), Context.MODE_PRIVATE);
731+
JSONObject syncValues = new JSONObject(prefs.getString("ONESIGNAL_USERSTATE_SYNCVALYES_CURRENT_STATE", null));
732+
Assert.assertFalse(syncValues.has("tags"));
733+
}
734+
727735
@Test
728736
public void testOmitDeletesOfNonExistingKeys() throws Exception {
729737
OneSignalInit();
@@ -738,12 +746,7 @@ public void testOmitDeletesOfNonExistingKeys() throws Exception {
738746
@Test
739747
public void testGetTagsWithNoTagsShouldBeNull() throws Exception {
740748
OneSignalInit();
741-
OneSignal.getTags(new OneSignal.GetTagsHandler() {
742-
@Override
743-
public void tagsAvailable(JSONObject tags) {
744-
lastGetTags = tags;
745-
}
746-
});
749+
GetTags();
747750

748751
Assert.assertNull(lastGetTags);
749752
}
@@ -753,12 +756,7 @@ public void shouldGetTags() throws Exception {
753756
OneSignalInit();
754757
OneSignal.sendTags(new JSONObject("{\"test1\": \"value1\", \"test2\": \"value2\"}"));
755758
threadAndTaskWait();
756-
OneSignal.getTags(new OneSignal.GetTagsHandler() {
757-
@Override
758-
public void tagsAvailable(JSONObject tags) {
759-
lastGetTags = tags;
760-
}
761-
});
759+
GetTags();
762760

763761
Assert.assertEquals("value1", lastGetTags.getString("test1"));
764762
Assert.assertEquals("value2", lastGetTags.getString("test2"));
@@ -867,14 +865,48 @@ public void testLocationTimeout() throws Exception {
867865
Assert.assertFalse(ShadowOneSignal.messages.contains("GoogleApiClient timedout"));
868866
}
869867

868+
// ####### Unit test postNotification #####
869+
870+
private static JSONObject postNotificationSuccess = null, postNotificationFailure = null;
871+
872+
@Test
873+
public void testPostNotification() throws Exception {
874+
OneSignalInit();
875+
876+
OneSignal.PostNotificationResponseHandler handler = new OneSignal.PostNotificationResponseHandler() {
877+
@Override
878+
public void onSuccess(JSONObject response) {
879+
postNotificationSuccess = response;
880+
}
881+
882+
@Override
883+
public void onFailure(JSONObject response) {
884+
postNotificationFailure = response;
885+
}
886+
};
887+
888+
// Not testing input here, just that HTTP 200 fires a success.
889+
OneSignal.postNotification("{}", handler);
890+
threadAndTaskWait();
891+
Assert.assertNotNull(postNotificationSuccess);
892+
Assert.assertNull(postNotificationFailure);
893+
postNotificationSuccess = postNotificationFailure = null;
894+
895+
896+
ShadowOneSignalRestClient.nextSuccessResponse = "{\"id\":\"\",\"recipients\":0,\"errors\":[\"All included players are not subscribed\"]}";
897+
OneSignal.postNotification("{}", handler);
898+
Assert.assertNull(postNotificationSuccess);
899+
Assert.assertNotNull(postNotificationFailure);
900+
}
901+
870902
// ####### Unit test helper methods ########
871903

872904
private static void threadWait() {
873905
try {Thread.sleep(1000);} catch (Throwable t) {}
874906
}
875907

876908
private void threadAndTaskWait() {
877-
try {Thread.sleep(300);} catch (Throwable t) {}
909+
try {Thread.sleep(10);} catch (Throwable t) {}
878910
OneSignalPackagePrivateHelper.runAllNetworkRunnables();
879911
OneSignalPackagePrivateHelper.runFocusRunnables();
880912

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

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -692,7 +692,11 @@ public void onSuccess(String response) {
692692
Log(LOG_LEVEL.DEBUG, "HTTP create notification success: " + (response != null ? response : "null"));
693693
if (handler != null) {
694694
try {
695-
handler.onSuccess(new JSONObject(response));
695+
JSONObject jsonObject = new JSONObject(response);
696+
if (jsonObject.has("errors"))
697+
handler.onFailure(jsonObject);
698+
else
699+
handler.onSuccess(new JSONObject(response));
696700
} catch (Throwable t) {
697701
t.printStackTrace();
698702
}
@@ -728,6 +732,11 @@ void onFailure(int statusCode, String response, Throwable throwable) {
728732
}
729733

730734
public static void getTags(final GetTagsHandler getTagsHandler) {
735+
if (appContext == null) {
736+
Log(LOG_LEVEL.ERROR, "You must initialize OneSignal before getting tags! Omitting this tag operation.");
737+
return;
738+
}
739+
731740
JSONObject tags = OneSignalStateSynchronizer.getTags();
732741
if (tags == null || tags.toString().equals("{}"))
733742
getTagsHandler.tagsAvailable(null);

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

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727

2828
package com.onesignal;
2929

30+
import java.io.InputStream;
3031
import java.io.OutputStream;
3132
import java.net.HttpURLConnection;
3233
import java.net.URL;
@@ -79,7 +80,7 @@ static void postSync(String url, JSONObject jsonBody, ResponseHandler responseHa
7980
private static void makeRequest(String url, String method, JSONObject jsonBody, ResponseHandler responseHandler) {
8081
HttpURLConnection con = null;
8182
int httpResponse = -1;
82-
String json;
83+
String json = null;
8384

8485
try {
8586
con = (HttpURLConnection)new URL(BASE_URL + url).openConnection();
@@ -107,8 +108,11 @@ private static void makeRequest(String url, String method, JSONObject jsonBody,
107108

108109
httpResponse = con.getResponseCode();
109110

111+
InputStream inputStream;
112+
Scanner scanner;
110113
if (httpResponse == HttpURLConnection.HTTP_OK) {
111-
Scanner scanner = new Scanner(con.getInputStream(), "UTF-8");
114+
inputStream = con.getInputStream();
115+
scanner = new Scanner(inputStream, "UTF-8");
112116
json = scanner.useDelimiter("\\A").hasNext() ? scanner.next() : "";
113117
scanner.close();
114118
OneSignal.Log(OneSignal.LOG_LEVEL.DEBUG, method + " RECEIVED JSON: " + json);
@@ -117,10 +121,18 @@ private static void makeRequest(String url, String method, JSONObject jsonBody,
117121
responseHandler.onSuccess(json);
118122
}
119123
else {
120-
Scanner scanner = new Scanner(con.getErrorStream(), "UTF-8");
121-
json = scanner.useDelimiter("\\A").hasNext() ? scanner.next() : "";
122-
scanner.close();
123-
OneSignal.Log(OneSignal.LOG_LEVEL.WARN, method + " RECEIVED JSON: " + json);
124+
inputStream = con.getErrorStream();
125+
if (inputStream == null)
126+
inputStream = con.getInputStream();
127+
128+
if (inputStream != null) {
129+
scanner = new Scanner(inputStream, "UTF-8");
130+
json = scanner.useDelimiter("\\A").hasNext() ? scanner.next() : "";
131+
scanner.close();
132+
OneSignal.Log(OneSignal.LOG_LEVEL.WARN, method + " RECEIVED JSON: " + json);
133+
}
134+
else
135+
OneSignal.Log(OneSignal.LOG_LEVEL.WARN, method + " HTTP Code: " + httpResponse + " No response body!");
124136

125137
if (responseHandler != null)
126138
responseHandler.onFailure(httpResponse, json, null);

0 commit comments

Comments
 (0)