Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add scanner source #4

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -36,19 +36,19 @@ List<ScannerDevice> getScanners() {
scanners.add(new ScannerDevice(
new ScannerDeviceListener(new EventSynchronizer(new Phaser(1))),
new SimulatedDynamicDevice<>(simulatedScanner, new DevicePower(), new DeviceConnector<>(simulatedScanner, deviceRegistry)),
ScannerType.FLATBED));
ScannerType.FLATBED, applicationConfig));
} else {
Scanner flatbedScanner = new Scanner();
scanners.add(new ScannerDevice(
new ScannerDeviceListener(new EventSynchronizer(new Phaser(1))),
new DynamicDevice<>(flatbedScanner, new DevicePower(), new DeviceConnector<>(flatbedScanner, deviceRegistry, new SimpleEntry<>("deviceType", "Flatbed"))),
ScannerType.FLATBED));
ScannerType.FLATBED, applicationConfig));

Scanner handScanner = new Scanner();
scanners.add(new ScannerDevice(
new ScannerDeviceListener(new EventSynchronizer(new Phaser(1))),
new DynamicDevice<>(handScanner, new DevicePower(), new DeviceConnector<>(handScanner, deviceRegistry, new SimpleEntry<>("deviceType", "HandScanner"))),
ScannerType.HANDHELD));
ScannerType.HANDHELD, applicationConfig));
}

return scanners;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import com.target.devicemanager.common.entities.DeviceException;
import com.target.devicemanager.components.scanner.entities.Barcode;
import com.target.devicemanager.components.scanner.entities.ScannerType;
import com.target.devicemanager.configuration.ApplicationConfig;
import jpos.JposConst;
import jpos.JposException;
import jpos.Scanner;
Expand Down Expand Up @@ -33,18 +34,19 @@ public class ScannerDevice {
private final ReentrantLock connectLock;
private boolean isLocked = false;
private boolean isTest = false;
ApplicationConfig applicationConfig;

/**
* initializes scanner device.
* @param deviceListener
* @param dynamicScanner is the dynamic device.
* @param scannerType is the scanner type.
*/
public ScannerDevice(DeviceListener deviceListener, DynamicDevice<? extends Scanner> dynamicScanner, ScannerType scannerType) {
this(deviceListener, dynamicScanner, scannerType, new ReentrantLock(true));
public ScannerDevice(DeviceListener deviceListener, DynamicDevice<? extends Scanner> dynamicScanner, ScannerType scannerType, ApplicationConfig applicationConfig) {
this(deviceListener, dynamicScanner, scannerType, new ReentrantLock(true), applicationConfig);
}

public ScannerDevice(DeviceListener deviceListener, DynamicDevice<? extends Scanner> dynamicScanner, ScannerType scannerType, ReentrantLock connectLock) {
public ScannerDevice(DeviceListener deviceListener, DynamicDevice<? extends Scanner> dynamicScanner, ScannerType scannerType, ReentrantLock connectLock, ApplicationConfig applicationConfig) {
if(scannerType == null) {
LOGGER.error(MARKER, "Failed in Constructor: scannerType cannot be null");
throw new IllegalArgumentException("scannerType cannot be null");
Expand All @@ -61,6 +63,7 @@ public ScannerDevice(DeviceListener deviceListener, DynamicDevice<? extends Scan
this.deviceListener = deviceListener;
this.scannerType = scannerType;
this.connectLock = connectLock;
this.applicationConfig = applicationConfig;
}

/**
Expand Down Expand Up @@ -147,15 +150,21 @@ private Barcode handleDataEvent(DataEvent dataEvent) throws JposException {
try {
String data;
int type;
String source;
Scanner scanner;
synchronized (scanner = (Scanner) dataEvent.getSource()) {
data = new String(scanner.getScanDataLabel(), Charset.defaultCharset());
type = scanner.getScanDataType();
if (applicationConfig != null && applicationConfig.IsSimulationMode()) {
source = scanner.getPhysicalDeviceName();
} else {
source = getScannerType();
}
}
Barcode barcode = new Barcode(data, type);
LOGGER.info(getScannerType() + " - returning scanned data type: " + barcode.type + " of size " + data.length());
LOGGER.trace(getScannerType() + "getScannerData(out)");
return new Barcode(data, type);
Barcode barcode = new Barcode(data, type, source);
LOGGER.info(barcode.source + " - returning scanned data type: " + barcode.type + " of size " + data.length());
LOGGER.trace(barcode.source + "getScannerData(out)");
return barcode;
} catch (JposException jposException) {
LOGGER.error(MARKER, getScannerType() + " Failed to Handle Data: " + jposException.getErrorCode() + ", " + jposException.getErrorCodeExtended());
throw jposException;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,20 @@
public class Barcode {
public String data;
public BarcodeType type;
public String source;

public Barcode() {
}

public Barcode(String data, BarcodeType type) {
public Barcode(String data, BarcodeType type, String source) {
this.data = data;
this.type = type;
this.source = source;
}

public Barcode(String data, int type) {
public Barcode(String data, int type, String source) {
this.data = data;
this.type = BarcodeType.fromInt(type);
this.source = source;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ public class SimulatedJposScanner extends Scanner {
private SimulatorState simulatorState;

public SimulatedJposScanner() {
barcode = new Barcode("POST desired data to scanner simulator", BarcodeType.UNKNOWN);
barcode = new Barcode("POST desired data to scanner simulator", BarcodeType.UNKNOWN, "SIMULATED_SCANNER");
simulatorState = SimulatorState.ONLINE;
}

Expand Down Expand Up @@ -70,6 +70,11 @@ public int getState() {
return simulatorState == SimulatorState.ONLINE ? JposConst.JPOS_S_IDLE : JposConst.JPOS_S_CLOSED;
}

@Override
public String getPhysicalDeviceName() {
return barcode.source;
}

@Override
public void setAutoDisable(boolean value) {
//doNothing
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ public void ctor_WhenScannerManagerIsNew_DoesNotThrowException() {
@Test
public void getScannerData_WhenDataIsNull_CallBothScanners() throws ScannerException {
//arrange
Barcode expected = new Barcode("data", ScannerConst.SCAN_SDT_UPCA);
Barcode expected = new Barcode("data", ScannerConst.SCAN_SDT_UPCA, "HANDHELD");
when(mockScannerManager.getData(any())).thenReturn(expected);

//act
Expand All @@ -79,7 +79,7 @@ public void getScannerData_WhenDataIsNull_CallBothScanners() throws ScannerExcep
@Test
public void getScannerData_WhenDataIsHandheld_CallHandheldScanner() throws ScannerException {
//arrange
Barcode expected = new Barcode("data", ScannerConst.SCAN_SDT_UPCA);
Barcode expected = new Barcode("data", ScannerConst.SCAN_SDT_UPCA, "HANDHELD");
when(mockScannerManager.getData(any())).thenReturn(expected);

//act
Expand All @@ -96,7 +96,7 @@ public void getScannerData_WhenDataIsHandheld_CallHandheldScanner() throws Scann
@Test
public void getScannerData_WhenDataIsFlatbed_CallFlatbedScanner() throws ScannerException {
//arrange
Barcode expected = new Barcode("data", ScannerConst.SCAN_SDT_UPCA);
Barcode expected = new Barcode("data", ScannerConst.SCAN_SDT_UPCA, "FLATBED");
when(mockScannerManager.getData(any())).thenReturn(expected);

//act
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@
import com.target.devicemanager.common.DynamicDevice;
import com.target.devicemanager.common.entities.DeviceException;
import com.target.devicemanager.components.cashdrawer.CashDrawerDeviceListener;
import com.target.devicemanager.components.scanner.entities.Barcode;
import com.target.devicemanager.components.scanner.entities.ScannerType;
import com.target.devicemanager.configuration.ApplicationConfig;
import jpos.JposConst;
import jpos.JposException;
import jpos.Scanner;
Expand All @@ -17,6 +19,7 @@
import org.mockito.junit.jupiter.MockitoSettings;
import org.mockito.quality.Strictness;

import java.nio.charset.Charset;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;

Expand Down Expand Up @@ -51,9 +54,9 @@ public void testInitialize() {
when(mockDynamicHandheldScanner.getDevice()).thenReturn(mockHandheldScanner);
when(mockDynamicFlatbedScanner.getDevice()).thenReturn(mockFlatbedScanner);

handheldScannerDevice = new ScannerDevice(mockDeviceListener, mockDynamicHandheldScanner, ScannerType.HANDHELD);
flatbedScannerDevice = new ScannerDevice(mockDeviceListener, mockDynamicFlatbedScanner, ScannerType.FLATBED);
scannerDeviceLock = new ScannerDevice(mockDeviceListener, mockDynamicFlatbedScanner, ScannerType.FLATBED, mockConnectLock);
handheldScannerDevice = new ScannerDevice(mockDeviceListener, mockDynamicHandheldScanner, ScannerType.HANDHELD, new ApplicationConfig());
flatbedScannerDevice = new ScannerDevice(mockDeviceListener, mockDynamicFlatbedScanner, ScannerType.FLATBED, new ApplicationConfig());
scannerDeviceLock = new ScannerDevice(mockDeviceListener, mockDynamicFlatbedScanner, ScannerType.FLATBED, mockConnectLock, new ApplicationConfig());

//Default Mock Behavior
when(mockDynamicHandheldScanner.isConnected()).thenReturn(true);
Expand All @@ -65,7 +68,7 @@ public void testInitialize() {
@Test
public void ctor_WhenDeviceListenerAndDynamicScannerAndScannerTypeAreNull_ThrowsException() {
try {
new ScannerDevice(null, null, null);
new ScannerDevice(null, null, null, null);
} catch (IllegalArgumentException iae) {
assertEquals("scannerType cannot be null", iae.getMessage());
return;
Expand All @@ -77,7 +80,7 @@ public void ctor_WhenDeviceListenerAndDynamicScannerAndScannerTypeAreNull_Throws
@Test
public void ctor_WhenDeviceListenerAndDynamicScannerAreNull_ThrowsException() {
try {
new ScannerDevice(null, null, ScannerType.BOTH);
new ScannerDevice(null, null, ScannerType.BOTH, null);
} catch (IllegalArgumentException iae) {
assertEquals("deviceListener cannot be null", iae.getMessage());
return;
Expand All @@ -89,7 +92,7 @@ public void ctor_WhenDeviceListenerAndDynamicScannerAreNull_ThrowsException() {
@Test
public void ctor_WhenDeviceListenerAndScannerTypeAreNull_ThrowsException() {
try {
new ScannerDevice(null, mockDynamicHandheldScanner, null);
new ScannerDevice(null, mockDynamicHandheldScanner, null, null);
} catch (IllegalArgumentException iae) {
assertEquals("scannerType cannot be null", iae.getMessage());
return;
Expand All @@ -101,7 +104,7 @@ public void ctor_WhenDeviceListenerAndScannerTypeAreNull_ThrowsException() {
@Test
public void ctor_WhenDynamicScannerAndScannerTypeAreNull_ThrowsException() {
try {
new ScannerDevice(mockDeviceListener, null, null);
new ScannerDevice(mockDeviceListener, null, null, null);
} catch (IllegalArgumentException iae) {
assertEquals("scannerType cannot be null", iae.getMessage());
return;
Expand All @@ -113,7 +116,7 @@ public void ctor_WhenDynamicScannerAndScannerTypeAreNull_ThrowsException() {
@Test
public void ctor_WhenDeviceListenerIsNull_ThrowsException() {
try {
new ScannerDevice(null, mockDynamicHandheldScanner, ScannerType.BOTH);
new ScannerDevice(null, mockDynamicHandheldScanner, ScannerType.BOTH, null);
} catch (IllegalArgumentException iae) {
assertEquals("deviceListener cannot be null", iae.getMessage());
return;
Expand All @@ -125,7 +128,7 @@ public void ctor_WhenDeviceListenerIsNull_ThrowsException() {
@Test
public void ctor_WhenDynamicScannerIsNull_ThrowsException() {
try {
new ScannerDevice(mockDeviceListener, null, ScannerType.BOTH);
new ScannerDevice(mockDeviceListener, null, ScannerType.BOTH, null);
} catch (IllegalArgumentException iae) {
assertEquals("dynamicScanner cannot be null", iae.getMessage());
return;
Expand All @@ -137,7 +140,7 @@ public void ctor_WhenDynamicScannerIsNull_ThrowsException() {
@Test
public void ctor_WhenScannerTypeIsNull_ThrowsException() {
try {
new ScannerDevice(mockDeviceListener, mockDynamicFlatbedScanner, null);
new ScannerDevice(mockDeviceListener, mockDynamicFlatbedScanner, null, null);
} catch (IllegalArgumentException iae) {
assertEquals("scannerType cannot be null", iae.getMessage());
return;
Expand All @@ -149,7 +152,7 @@ public void ctor_WhenScannerTypeIsNull_ThrowsException() {
@Test
public void ctor_WhenDeviceListenerAndDynamicScannerAndScannerTypeAreNotNull_DoesNotThrowException() {
try {
new ScannerDevice(mockDeviceListener, mockDynamicFlatbedScanner, ScannerType.BOTH);
new ScannerDevice(mockDeviceListener, mockDynamicFlatbedScanner, ScannerType.BOTH, null);
} catch (Exception exception) {
fail("Existing Device Arguments should not result in an Exception");
}
Expand Down Expand Up @@ -499,6 +502,36 @@ public void getScannerData_WhenTimeoutWithHandScanner_ThrowsInterruptedException
verify(mockHandheldScanner, atLeast(1)).getScanDataType();
}

@Test
public void getScannerData_WhenIsSimulationMode() throws JposException {
//arrange
System.setProperty("useSimulators", "true");
when(mockDynamicHandheldScanner.isConnected()).thenReturn(true);
handheldScannerDevice.setIsTest(true);
byte[] expectedData = {'T', 'E', 'S', 'T'};
int expectedType = 101;
String expectedSource = "HANDHELD";
when(mockHandheldScanner.getScanDataLabel()).thenReturn(expectedData);
when(mockHandheldScanner.getScanDataType()).thenReturn(expectedType);
when(mockHandheldScanner.getPhysicalDeviceName()).thenReturn(expectedSource);
when(mockDeviceListener.waitForData()).thenReturn(new DataEvent(mockHandheldScanner, 1));

//act
Barcode barcode = handheldScannerDevice.getScannerData();

//assert
verify(mockDeviceListener, atLeast(1)).startEventListeners();
verify(mockHandheldScanner, atLeast(1)).setAutoDisable(true);
verify(mockHandheldScanner, atLeast(1)).setDecodeData(true);
verify(mockHandheldScanner, atLeast(1)).setDataEventEnabled(true);
verify(mockHandheldScanner, atLeast(1)).setDeviceEnabled(true);
verify(mockHandheldScanner, atLeast(1)).getScanDataLabel();
verify(mockHandheldScanner, atLeast(1)).getScanDataType();
assertEquals(new String(expectedData, Charset.defaultCharset()), barcode.data);
assertEquals(expectedType, barcode.type.getValue());
assertEquals(expectedSource, barcode.source);
}

class TestInterruptingThread extends Thread{
public void run() {
try {
Expand Down