/*
* Copyright (C) 2012 - present by Yann Le Tallec.
* Please see distribution for license.
*/
package com.assylias.jbloomberg;
import com.bloomberglp.blpapi.Datetime;
import com.bloomberglp.blpapi.Element;
import com.bloomberglp.blpapi.Schema;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.lang.reflect.Field;
import java.time.LocalDate;
import java.time.OffsetDateTime;
import java.time.OffsetTime;
import java.time.ZoneOffset;
import mockit.Mock;
import mockit.MockUp;
import mockit.Mocked;
import mockit.NonStrictExpectations;
import static org.testng.Assert.*;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
public class BloombergUtilsTest {
@Test(groups = "unit")
public void test_ProcessRunning() {
setBbcommStartedFlag(false);
new MockUp<ShellUtils>() {
@Mock(invocations = 1)
public boolean isProcessRunning(String processName) {
return true;
}
};
assertTrue(BloombergUtils.startBloombergProcessIfNecessary());
}
@Test(groups = "unit")
public void test_NoRetryOnceRunning() {
setBbcommStartedFlag(true);
new MockUp<ShellUtils>() {
@Mock(invocations = 0)
public boolean isProcessRunning(String processName) {
return true;
}
};
assertTrue(BloombergUtils.startBloombergProcessIfNecessary());
}
@Test(groups = "unit")
public void test_ProcessNotRunning_StartBbCommSucceeds(@Mocked final ProcessBuilder pb, @Mocked final Process p) throws IOException {
setBbcommStartedFlag(false);
new MockUp<ShellUtils>() {
@Mock
public boolean isProcessRunning(String processName) {
return false;
}
};
new NonStrictExpectations() {
{
pb.start();
result = p;
p.getInputStream();
result = new ByteArrayInputStream("started".getBytes());
}
};
assertTrue(BloombergUtils.startBloombergProcessIfNecessary());
}
@Test(groups = "unit")
public void test_ProcessNotRunning_StartBbCommFails(@Mocked final ProcessBuilder pb, @Mocked final Process p) throws IOException {
setBbcommStartedFlag(false);
new MockUp<ShellUtils>() {
@Mock
public boolean isProcessRunning(String processName) {
return false;
}
};
new NonStrictExpectations() {
{
pb.start();
result = p;
p.getInputStream();
result = new ByteArrayInputStream("whatever".getBytes());
}
};
assertFalse(BloombergUtils.startBloombergProcessIfNecessary());
}
@Test(groups = "requires-bloomberg")
public void testBbStart() throws Exception {
setBbcommStartedFlag(false);
assertTrue(BloombergUtils.startBloombergProcessIfNecessary());
}
private static void setBbcommStartedFlag(boolean flag) {
try {
Field f = BloombergUtils.class.getDeclaredField("isBbcommStarted");
f.setAccessible(true);
f.set(null, flag);
} catch (Exception e) {
fail();
}
}
/**
* From January 16th 2017, the real time field "PROXY_TIME_OF_LAST_UPDATE_RT" has started sending back data with a time datatype but containing dates.
*/
@Test(groups = "unit")
public void test_invalid_time_issue_18() {
Element mockElement = new MockUp<Element>() {
@Mock public Schema.Datatype datatype() { return Schema.Datatype.TIME; }
@Mock public Datetime getValueAsDatetime() { return new Datetime(2017, 1, 1); }
}.getMockInstance();
assertEquals(BloombergUtils.getSpecificObjectOf(mockElement), LocalDate.of(2017, 1, 1));
}
@Test(groups = "unit")
public void getSpecificObjectOf_primitives() {
Element mockElement;
mockElement = new MockUp<Element>() {
@Mock public Schema.Datatype datatype() { return Schema.Datatype.BOOL; }
@Mock public boolean getValueAsBool() { return true; }
}.getMockInstance();
assertEquals(BloombergUtils.getSpecificObjectOf(mockElement).getClass(), Boolean.class);
assertEquals(BloombergUtils.getSpecificObjectOf(mockElement), true);
mockElement = new MockUp<Element>() {
@Mock public Schema.Datatype datatype() { return Schema.Datatype.CHAR; }
@Mock public char getValueAsChar() { return 'a'; }
}.getMockInstance();
assertEquals(BloombergUtils.getSpecificObjectOf(mockElement).getClass(), Character.class);
assertEquals(BloombergUtils.getSpecificObjectOf(mockElement), 'a');
mockElement = new MockUp<Element>() {
@Mock public Schema.Datatype datatype() { return Schema.Datatype.FLOAT32; }
@Mock public float getValueAsFloat32() { return 1f; }
}.getMockInstance();
assertEquals(BloombergUtils.getSpecificObjectOf(mockElement).getClass(), Float.class);
assertEquals(BloombergUtils.getSpecificObjectOf(mockElement), 1f);
mockElement = new MockUp<Element>() {
@Mock public Schema.Datatype datatype() { return Schema.Datatype.FLOAT64; }
@Mock public double getValueAsFloat64() { return 1d; }
}.getMockInstance();
assertEquals(BloombergUtils.getSpecificObjectOf(mockElement).getClass(), Double.class);
assertEquals(BloombergUtils.getSpecificObjectOf(mockElement), 1d);
mockElement = new MockUp<Element>() {
@Mock public Schema.Datatype datatype() { return Schema.Datatype.INT32; }
@Mock public int getValueAsInt32() { return 1; }
}.getMockInstance();
assertEquals(BloombergUtils.getSpecificObjectOf(mockElement).getClass(), Integer.class);
assertEquals(BloombergUtils.getSpecificObjectOf(mockElement), 1);
mockElement = new MockUp<Element>() {
@Mock public Schema.Datatype datatype() { return Schema.Datatype.INT64; }
@Mock public long getValueAsInt64() { return 1L; }
}.getMockInstance();
assertEquals(BloombergUtils.getSpecificObjectOf(mockElement).getClass(), Long.class);
assertEquals(BloombergUtils.getSpecificObjectOf(mockElement), 1L);
mockElement = new MockUp<Element>() {
@Mock public Schema.Datatype datatype() { return Schema.Datatype.STRING; }
@Mock public String getValueAsString() { return "a"; }
}.getMockInstance();
assertEquals(BloombergUtils.getSpecificObjectOf(mockElement).getClass(), String.class);
assertEquals(BloombergUtils.getSpecificObjectOf(mockElement), "a");
}
@DataProvider(name = "datatypes") public Object[][] datatypes() {
return new Object[][] {
{ Schema.Datatype.DATE },
{ Schema.Datatype.TIME },
{ Schema.Datatype.DATETIME },
};
}
/**
* We simply ignore the data type as it may be wrong. Instead check on the parts that are present in the Datetime object.
*/
@Test(groups = "unit", dataProvider = "datatypes")
public void getSpecificObjectOf_dates(Schema.Datatype datatype) {
Element mockElement;
mockElement = new MockUp<Element>() {
@Mock public Schema.Datatype datatype() { return datatype; }
@Mock public Datetime getValueAsDatetime() { return new Datetime(2017, 1, 1); }
}.getMockInstance();
assertEquals(BloombergUtils.getSpecificObjectOf(mockElement).getClass(), LocalDate.class);
assertEquals(BloombergUtils.getSpecificObjectOf(mockElement), LocalDate.of(2017, 1, 1));
mockElement = new MockUp<Element>() {
@Mock public Schema.Datatype datatype() { return datatype; }
@Mock public Datetime getValueAsDatetime() { return new Datetime(2017, 1, 1, 13, 0, 0, 0); }
}.getMockInstance();
assertEquals(BloombergUtils.getSpecificObjectOf(mockElement).getClass(), OffsetDateTime.class);
assertEquals(BloombergUtils.getSpecificObjectOf(mockElement), OffsetDateTime.of(2017, 1, 1, 13, 0, 0, 0, ZoneOffset.UTC));
mockElement = new MockUp<Element>() {
@Mock public Schema.Datatype datatype() { return datatype; }
@Mock public Datetime getValueAsDatetime() { Datetime dt = new Datetime(2017, 1, 1, 13, 0, 0, 0); dt.setTimezoneOffsetMinutes(60); return dt; }
}.getMockInstance();
assertEquals(BloombergUtils.getSpecificObjectOf(mockElement).getClass(), OffsetDateTime.class);
assertEquals(BloombergUtils.getSpecificObjectOf(mockElement), OffsetDateTime.of(2017, 1, 1, 13, 0, 0, 0, ZoneOffset.ofHours(1)));
mockElement = new MockUp<Element>() {
@Mock public Schema.Datatype datatype() { return datatype; }
@Mock public Datetime getValueAsDatetime() { Datetime dt = new Datetime(13, 0, 0, 0); return dt; }
}.getMockInstance();
assertEquals(BloombergUtils.getSpecificObjectOf(mockElement).getClass(), OffsetTime.class);
assertEquals(BloombergUtils.getSpecificObjectOf(mockElement), OffsetTime.of(13, 0, 0, 0, ZoneOffset.UTC));
mockElement = new MockUp<Element>() {
@Mock public Schema.Datatype datatype() { return datatype; }
@Mock public Datetime getValueAsDatetime() { Datetime dt = new Datetime(13, 0, 0, 0); dt.setTimezoneOffsetMinutes(60); return dt; }
}.getMockInstance();
assertEquals(BloombergUtils.getSpecificObjectOf(mockElement).getClass(), OffsetTime.class);
assertEquals(BloombergUtils.getSpecificObjectOf(mockElement), OffsetTime.of(13, 0, 0, 0, ZoneOffset.ofHours(1)));
}
//TODO: add tests for CHOICE, BYTEARRAY and SEQUENCE
}