package com.nightscout.core.upload;
import com.nightscout.core.dexcom.InvalidRecordLengthException;
import com.nightscout.core.dexcom.records.CalRecord;
import com.nightscout.core.dexcom.records.GlucoseDataSet;
import com.nightscout.core.dexcom.records.InsertionRecord;
import com.nightscout.core.dexcom.records.MeterRecord;
import com.nightscout.core.drivers.AbstractUploaderDevice;
import com.nightscout.core.preferences.NightscoutPreferences;
import com.nightscout.core.preferences.TestPreferences;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import static com.nightscout.core.test.MockFactory.mockCalRecord;
import static com.nightscout.core.test.MockFactory.mockDeviceStatus;
import static com.nightscout.core.test.MockFactory.mockGlucoseDataSet;
import static com.nightscout.core.test.MockFactory.mockMeterRecord;
import static junit.framework.TestCase.fail;
import static org.hamcrest.Matchers.empty;
import static org.hamcrest.Matchers.hasSize;
import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertThat;
public class BaseUploaderTest {
private MockUploader mockUploader;
private ExceptionThrowingUploader exceptionUploader;
private TestPreferences preferences;
@Before
public void setUp() throws Exception {
preferences = new TestPreferences();
mockUploader = new MockUploader(preferences);
exceptionUploader = new ExceptionThrowingUploader(preferences);
}
@Test
public void testUploadGlucoseDataSets_Null() {
try {
mockUploader.uploadGlucoseDataSets(null);
} catch (NullPointerException e) {
fail("Shouldn't get a NPE");
}
}
@Test
public void testUploadGlucoseDataSets_Zero() {
mockUploader.uploadGlucoseDataSets(new ArrayList<GlucoseDataSet>());
assertThat(mockUploader.glucoseDataSets, is(empty()));
}
@Test
public void testUploadGlucoseDataSets_One() {
List<GlucoseDataSet> list = new ArrayList<>(Arrays.asList(mockGlucoseDataSet()));
mockUploader.uploadGlucoseDataSets(list);
assertThat(mockUploader.glucoseDataSets, hasSize(1));
}
@Test
public void testUploadGlucoseDataSets_Many() {
// List<GlucoseDataSet> list = Lists.newArrayList(
// mockGlucoseDataSet(),
// mockGlucoseDataSet(),
// mockGlucoseDataSet());
List<GlucoseDataSet> list = new ArrayList<>(Arrays.asList(new GlucoseDataSet[]{mockGlucoseDataSet(), mockGlucoseDataSet(), mockGlucoseDataSet()}));
mockUploader.uploadGlucoseDataSets(list);
assertThat(mockUploader.glucoseDataSets, hasSize(3));
}
@Test
public void testUploadGlucoseDataSets_Exception() {
try {
exceptionUploader.uploadGlucoseDataSets(new ArrayList<>(Arrays.asList(mockGlucoseDataSet())));
} catch (Exception e) {
fail("Shouldn't throw an exception.");
}
}
@Test
public void testUploadMeterRecords_Null() {
try {
mockUploader.uploadMeterRecords(null);
} catch (NullPointerException e) {
fail("Shouldn't get a NPE");
}
}
@Test
public void testUploadMeterRecords_Zero() {
mockUploader.uploadMeterRecords(new ArrayList<MeterRecord>());
assertThat(mockUploader.meterRecords, is(empty()));
}
@Test
public void testUploadMeterRecords_One() throws Exception {
List<MeterRecord> list = new ArrayList<>(Arrays.asList(mockMeterRecord()));
mockUploader.uploadMeterRecords(list);
assertThat(mockUploader.meterRecords, hasSize(1));
}
@Test
public void testUploadMeterRecords_Many() throws Exception {
List<MeterRecord> list = new ArrayList<>(Arrays.asList(new MeterRecord[]{mockMeterRecord(), mockMeterRecord(), mockMeterRecord()}));
mockUploader.uploadMeterRecords(list);
assertThat(mockUploader.meterRecords, hasSize(3));
}
@Test
public void testUploadMeterRecords_Exception() {
try {
exceptionUploader.uploadMeterRecords(new ArrayList<>(Arrays.asList(mockMeterRecord())));
} catch (Exception e) {
fail("Shouldn't throw an exception.");
}
}
@Test
public void testUploadCalRecords_Null() {
preferences.setRawEnabled(true);
try {
mockUploader.uploadCalRecords(null);
} catch (NullPointerException e) {
fail("Shouldn't get a NPE");
}
}
@Test
public void testUploadCalRecords_Zero() {
preferences.setRawEnabled(true);
mockUploader.uploadCalRecords(new ArrayList<CalRecord>());
assertThat(mockUploader.calRecords, is(empty()));
}
@Test
public void testUploadCalRecords_One() {
preferences.setRawEnabled(true);
List<CalRecord> list = null;
try {
list = new ArrayList<>(Arrays.asList(mockCalRecord()));
} catch (InvalidRecordLengthException e) {
fail("Shouldn't get an exception");
}
mockUploader.uploadCalRecords(list);
assertThat(mockUploader.calRecords, hasSize(1));
}
@Test
public void testUploadCalRecords_Many() {
preferences.setRawEnabled(true);
List<CalRecord> list = null;
try {
list = new ArrayList<>(Arrays.asList(new CalRecord[]{mockCalRecord(), mockCalRecord(), mockCalRecord()}));
} catch (InvalidRecordLengthException e) {
fail("Shouldn't get an exception");
}
mockUploader.uploadCalRecords(list);
assertThat(mockUploader.calRecords, hasSize(3));
}
@Test
public void testUploadCalRecords_Exception() {
preferences.setRawEnabled(true);
try {
exceptionUploader.uploadCalRecords(new ArrayList<>(Arrays.asList(mockCalRecord())));
} catch (Exception e) {
fail("Shouldn't throw an exception.");
}
}
@Test
public void testUploadDeviceStatus_Exception() {
try {
exceptionUploader.uploadDeviceStatus(mockDeviceStatus(), 100);
} catch (Exception e) {
fail("Shouldn't throw an exception.");
}
}
class MockUploader extends BaseUploader {
public List<CalRecord> calRecords;
public List<GlucoseDataSet> glucoseDataSets;
public List<MeterRecord> meterRecords;
public List<InsertionRecord> insertionRecords;
public MockUploader(NightscoutPreferences preferences) {
super(preferences);
clear();
}
public void clear() {
calRecords = new ArrayList<>();
glucoseDataSets = new ArrayList<>();
meterRecords = new ArrayList<>();
}
@Override
protected boolean doUpload(GlucoseDataSet glucoseDataSet) throws IOException {
glucoseDataSets.add(glucoseDataSet);
return true;
}
@Override
protected boolean doUpload(MeterRecord meterRecord) throws IOException {
meterRecords.add(meterRecord);
return true;
}
@Override
protected boolean doUpload(CalRecord calRecord) throws IOException {
calRecords.add(calRecord);
return true;
}
@Override
protected boolean doUpload(InsertionRecord insertionRecord) throws IOException {
insertionRecords.add(insertionRecord);
return true;
}
}
class ExceptionThrowingUploader extends BaseUploader {
public ExceptionThrowingUploader(NightscoutPreferences preferences) {
super(preferences);
}
@Override
protected boolean doUpload(GlucoseDataSet glucoseDataSet) throws IOException {
throw new IOException("glucose");
}
@Override
protected boolean doUpload(MeterRecord meterRecord) throws IOException {
throw new IOException("meter");
}
@Override
protected boolean doUpload(CalRecord calRecord) throws IOException {
throw new IOException("cal");
}
@Override
protected boolean doUpload(InsertionRecord insertionRecord) throws IOException {
throw new IOException("insertion");
}
@Override
protected boolean doUpload(AbstractUploaderDevice deviceStatus, int receiverBattery) throws IOException {
throw new IOException("device");
}
}
}