Skip to content
This repository has been archived by the owner on Jul 24, 2023. It is now read-only.

Commit

Permalink
Improved tests for QueryResponseSender (#126)
Browse files Browse the repository at this point in the history
- Don't rely on mocks
- Test based on actual broadcasts sent
  • Loading branch information
iainmcgin authored Oct 9, 2017
1 parent 77659c6 commit 3313812
Show file tree
Hide file tree
Showing 2 changed files with 58 additions and 33 deletions.
3 changes: 2 additions & 1 deletion bbq/java/com/google/bbq/QueryResponseSender.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@

import static org.hamcrest.CoreMatchers.notNullValue;
import static org.valid4j.Assertive.require;
import static org.valid4j.Validation.validate;

import android.content.Context;
import android.content.Intent;
Expand Down Expand Up @@ -49,7 +50,7 @@ public QueryResponseSender(@NonNull Context context) {
public void sendResponse(
@NonNull BroadcastQuery query,
@Nullable byte[] responseMessage) {
require(query, notNullValue());
validate(query, notNullValue(), NullPointerException.class);

BroadcastQueryResponse.Builder responseBuilder = createResponseBuilder(query);
if (responseMessage != null) {
Expand Down
88 changes: 56 additions & 32 deletions bbq/javatests/java/com/google/bbq/QueryResponseSenderTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,64 +16,88 @@

package com.google.bbq;

import static org.mockito.Mockito.verify;
import static org.mockito.internal.verification.VerificationModeFactory.times;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;

import android.content.Context;
import android.content.Intent;
import android.support.annotation.NonNull;
import com.google.bbq.Protobufs.BroadcastQuery;
import com.google.bbq.Protobufs.BroadcastQueryResponse;
import com.google.protobuf.ByteString;
import com.google.protobuf.InvalidProtocolBufferException;

import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.valid4j.errors.RequireViolation;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.Shadows;
import org.robolectric.annotation.Config;

import java.util.List;


/**
* This class contains a set of tests for QueryResponseSenderTest.
*/
@RunWith(RobolectricTestRunner.class)
@Config(manifest = Config.NONE)
public class QueryResponseSenderTest {
@Mock
Context mockContext;
@Mock
Intent mockIntent;

BroadcastQuery mockQuery;

private QueryResponseSender underTest;
private BroadcastQuery mQuery;
private QueryResponseSender mResponseSender;

@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);

//set mock values.
mockQuery = BroadcastQuery.newBuilder()
.setDataType("dataType")
.setRequestingApp("requestingApp")
mQuery = BroadcastQuery.newBuilder()
.setDataType("example")
.setRequestingApp("com.example.app")
.setRequestId(128L)
.setResponseId(256L)
.build();

//Create a test object for the QueryResponseSender using the mock
underTest = new QueryResponseSender(mockContext) {
@NonNull
@Override
Intent getIntentForQuery(@NonNull BroadcastQuery query, BroadcastQueryResponse.Builder responseBuilder) {
return mockIntent;
}
};
mResponseSender = new QueryResponseSender(RuntimeEnvironment.application);
}

@Test
public void sendResponse() throws Exception {
byte[] responseMessageBytes = new byte[] { 0, 1, 2 };
mResponseSender.sendResponse(mQuery, responseMessageBytes);
checkBroadcastResponse(ByteString.copyFrom(responseMessageBytes));
}

@Test
public void sendResponse_nonNullQuery_nullReponse() throws Exception {
underTest.sendResponse(mockQuery, null);
verify(mockContext, times(1)).sendBroadcast(mockIntent);
mResponseSender.sendResponse(mQuery, null);
checkBroadcastResponse(ByteString.EMPTY);
}

@Test(expected = RequireViolation.class)
private void checkBroadcastResponse(ByteString expectedResponseBytes)
throws InvalidProtocolBufferException {
List<Intent> broadcasts =
Shadows.shadowOf(RuntimeEnvironment.application).getBroadcastIntents();

assertThat(broadcasts.size()).isEqualTo(1);
Intent broadcastIntent = broadcasts.get(0);

assertThat(broadcastIntent.getAction())
.isEqualTo("example:0000000000000080");
assertThat(broadcastIntent.getCategories()).containsExactly(QueryUtil.BBQ_CATEGORY);
assertThat(broadcastIntent.getPackage()).isEqualTo(mQuery.getRequestingApp());
assertThat(broadcastIntent.getByteArrayExtra(QueryUtil.EXTRA_RESPONSE_MESSAGE)).isNotNull();

byte[] responseBytes = broadcastIntent.getByteArrayExtra(QueryUtil.EXTRA_RESPONSE_MESSAGE);
BroadcastQueryResponse response = BroadcastQueryResponse.parseFrom(responseBytes);

assertThat(response.getRequestId()).isEqualTo(mQuery.getRequestId());
assertThat(response.getResponseId()).isEqualTo(mQuery.getResponseId());
assertThat(response.getResponseMessage()).isEqualTo(expectedResponseBytes);
}

@SuppressWarnings("ConstantConditions")
@Test
public void sendResponse_nullQuery_nullReponse() throws Exception {
underTest.sendResponse(null, null);
assertThatThrownBy(() -> mResponseSender.sendResponse(null, null))
.isInstanceOf(NullPointerException.class);
}
}
}

0 comments on commit 3313812

Please sign in to comment.