Skip to content

Commit

Permalink
RxJava/Classic: updated event sending tests to use okhttp mocks over …
Browse files Browse the repository at this point in the history
…mountebank (closes #62)
  • Loading branch information
jbeemster committed Jul 15, 2015
1 parent efc3a6b commit c7a4455
Show file tree
Hide file tree
Showing 12 changed files with 244 additions and 479 deletions.
9 changes: 0 additions & 9 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,18 +19,9 @@ android:
- extra-google-google_play_services
- extra-android-m2repository

before_install:
- sudo apt-get update
- sudo apt-get install nodejs
- sudo apt-get install npm

install:
- npm install -g mountebank --production

before_script:
- echo no | android create avd --force -n test -t $ANDROID_TARGET --abi $ANDROID_ABI
- emulator -avd test -no-skin -no-audio -no-window &
- mb &
- chmod +x ./ci/wait_for_emulator
- ./ci/wait_for_emulator
- adb shell input keyevent 82 &
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,4 +26,8 @@ protected void startSessionChecker() {
public void shutdownSessionChecker() {
// Do nothing.
}

public void startSessionChecker(final long interval) {
// Do nothing.
}
}
1 change: 1 addition & 0 deletions snowplow-android-tracker-classic/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ android {
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile project(':snowplow-android-core')
androidTestCompile 'com.squareup.okhttp:mockwebserver:2.1.0'
}

// build JAR file
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,10 @@
import com.snowplowanalytics.snowplow.tracker.emitter.RequestSecurity;
import com.snowplowanalytics.snowplow.tracker.Tracker;

import com.snowplowanalytics.snowplow.tracker.classic.utils.LogFetcher;

public class EventSendingTest extends SnowplowClassicTestCase {

public void testSendGet() throws Exception {

setup();

// Setup the Tracker
Expand All @@ -39,21 +38,33 @@ public void testSendGet() throws Exception {
trackEcommerceEvent(tracker);

// Wait for emitter to start
int counter = 0;
while (!tracker.getEmitter().getEmitterStatus()) {
Thread.sleep(500);
counter++;
if (counter > 10) {
throw new NullPointerException("Emitter is hanging on startup...");
}
}

// Wait for emitter to end
counter = 0;
while (tracker.getEmitter().getEmitterStatus()) {
Thread.sleep(500);
counter++;
if (counter > 10) {
throw new NullPointerException("Emitter is hanging on shutdown...");
}
}
Thread.sleep(500);

checkGetRequest(LogFetcher.getMountebankGetRequests());
checkGetRequest(getRequests(28));
tracker.shutdown();
tearDown();
}

public void testSendPost() throws Exception {

setup();

// Setup the Tracker
Expand All @@ -70,17 +81,28 @@ public void testSendPost() throws Exception {
trackEcommerceEvent(tracker);

// Wait for emitter to start
int counter = 0;
while (!tracker.getEmitter().getEmitterStatus()) {
Thread.sleep(500);
counter++;
if (counter > 10) {
throw new NullPointerException("Emitter is hanging on startup...");
}
}

// Wait for emitter to end
counter = 0;
while (tracker.getEmitter().getEmitterStatus()) {
Thread.sleep(500);
counter++;
if (counter > 10) {
throw new NullPointerException("Emitter is hanging on shutdown...");
}
}
Thread.sleep(500);

checkPostRequest(LogFetcher.getMountebankPostRequests());
checkPostRequest(getRequests(28));
tracker.shutdown();
tearDown();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,22 +29,56 @@
import com.snowplowanalytics.snowplow.tracker.events.Unstructured;
import com.snowplowanalytics.snowplow.tracker.payload.SelfDescribingJson;

import com.snowplowanalytics.snowplow.tracker.classic.utils.LogFetcher;

import com.squareup.okhttp.mockwebserver.MockResponse;
import com.squareup.okhttp.mockwebserver.MockWebServer;
import com.squareup.okhttp.mockwebserver.RecordedRequest;

import org.json.JSONArray;
import org.json.JSONObject;

import java.io.InputStream;
import java.io.IOException;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Scanner;

public class SnowplowClassicTestCase extends AndroidTestCase {

private static final String testURL = "10.0.2.2:4545";
// Mock Server

MockWebServer mockServer;

public void setupMockServer() throws IOException {
if (mockServer != null) {
mockServer.shutdown();
}
mockServer = new MockWebServer();
mockServer.play();
}

public String mockServerName() {
if (mockServer != null) {
return String.format("%s:%d", mockServer.getHostName(), mockServer.getPort());
}
return null;
}

public void enqueueResponses(int count) {
MockResponse mockResponse = new MockResponse().setResponseCode(200);
for (int i = 0; i < count; i++) {
mockServer.enqueue(mockResponse);
}
}

public void tearDown() throws IOException {
if (mockServer != null) {
mockServer.shutdown();
mockServer = null;
}
}

// Tracker Builder

Expand All @@ -64,7 +98,7 @@ public com.snowplowanalytics.snowplow.tracker.Emitter getEmitter(
RequestSecurity security) {

return new Emitter
.EmitterBuilder(testURL, getContext())
.EmitterBuilder(mockServerName(), getContext())
.option(option)
.method(method)
.security(security)
Expand All @@ -91,50 +125,71 @@ public List<SelfDescribingJson> getCustomContext() {
}


// Mountebank Setup/Helpers
// Setup/Helpers

public void setup() throws Exception {
LogFetcher.deleteImposter();
LogFetcher.createImposter(getImposter());
Thread.sleep(1000);
setupMockServer();
enqueueResponses(28);
}

private String getImposter() {
String file = "assets/imposters.json";
InputStream in = this.getClass().getClassLoader().getResourceAsStream(file);
Scanner s = new Scanner(in).useDelimiter("\\A");
return s.hasNext() ? s.next() : "";
/**
* Fetched N amount of requests from the Mock Web Server
*
* @param count the amount of requests to get
* @return the list of requests
* @throws Exception
*/
public LinkedList<RecordedRequest> getRequests(int count) throws Exception {
LinkedList<RecordedRequest> requests = new LinkedList<>();
for (int i = 0; i < count; i++) {
requests.add(mockServer.takeRequest());
}
return requests;
}

public void checkLogs(LinkedList<JSONObject> requests, int eventCount) throws Exception {
assertEquals(eventCount, requests.size());
for (JSONObject request : requests) {
int code = request.getJSONObject("response").getInt("statusCode");
assertEquals(200, code);
/**
* Takes a query string and returns the name-value
* pairs in map form.
*
* @param query the query string
* @return the map of decoded query strings
* @throws Exception
*/
public Map<String, String> getQueryMap(String query) throws Exception {
String[] params = query.split("&");
Map<String, String> map = new HashMap<String, String>();
for (String param : params) {
String name = param.split("=")[0];
String value = param.split("=")[1];
map.put(URLDecoder.decode(name, "UTF-8"), URLDecoder.decode(value, "UTF-8"));
}
return map;
}

public void checkGetRequest(LinkedList<JSONObject> requests) throws Exception {
// Event Validation

public void checkGetRequest(LinkedList<RecordedRequest> requests) throws Exception {
assertEquals(28, requests.size());
for (JSONObject request : requests) {
JSONObject request1 = request.getJSONObject("request");
JSONObject query = request1.getJSONObject("query");

assertEquals("/i", request1.getString("path"));
assertEquals("GET", request1.getString("method"));

assertEquals("mob", query.getString("p"));
assertEquals("myAppId", query.getString("aid"));
assertEquals("myNamespace", query.getString("tna"));
assertEquals("andr-0.5.0", query.getString("tv"));
assertEquals("English", query.getString("lang"));
for (RecordedRequest request : requests) {

assertEquals("/i", request.getPath().substring(0, 2));
assertEquals("GET", request.getMethod());

JSONObject query = new JSONObject(getQueryMap(request.getPath().substring(3)));

assertEquals("mob", query.get("p"));
assertEquals("myAppId", query.get("aid"));
assertEquals("myNamespace", query.get("tna"));
assertEquals("andr-0.5.0", query.get("tv"));
assertEquals("English", query.get("lang"));
assertTrue(query.has("dtm"));
assertTrue(query.has("stm"));
assertTrue(query.has("e"));
assertTrue(query.has("co"));
assertTrue(query.has("eid"));

String eventType = query.getString("e");
String eventType = query.get("e").toString();

switch (eventType) {
case "pv" : checkPageView(query);
break;
Expand All @@ -151,15 +206,13 @@ public void checkGetRequest(LinkedList<JSONObject> requests) throws Exception {
}
}

public void checkPostRequest(LinkedList<JSONObject> requests) throws Exception {
public void checkPostRequest(LinkedList<RecordedRequest> requests) throws Exception {
assertEquals(28, requests.size());
for (JSONObject request : requests) {
JSONObject request1 = request.getJSONObject("request");

assertEquals("/com.snowplowanalytics.snowplow/tp2", request1.getString("path"));
assertEquals("POST", request1.getString("method"));
for (RecordedRequest request : requests) {
assertEquals("/com.snowplowanalytics.snowplow/tp2", request.getPath());
assertEquals("POST", request.getMethod());

JSONObject body = new JSONObject(request1.getString("body"));
JSONObject body = new JSONObject(request.getUtf8Body());
assertEquals("iglu:com.snowplowanalytics.snowplow/payload_data/jsonschema/1-0-3", body.getString("schema"));

JSONArray data = body.getJSONArray("data");
Expand Down
Loading

0 comments on commit c7a4455

Please sign in to comment.