committed by
Andrii Shvaika
7 changed files with 187 additions and 38 deletions
@ -0,0 +1,114 @@ |
|||
package org.thingsboard.server.transport.lwm2m.server; |
|||
|
|||
import org.junit.jupiter.api.BeforeEach; |
|||
import org.junit.jupiter.api.Test; |
|||
import org.thingsboard.server.gen.transport.TransportProtos; |
|||
|
|||
import java.util.List; |
|||
import java.util.concurrent.ConcurrentHashMap; |
|||
import java.util.concurrent.ConcurrentMap; |
|||
import java.util.concurrent.TimeUnit; |
|||
import java.util.concurrent.atomic.AtomicLong; |
|||
|
|||
import static java.util.Collections.emptyList; |
|||
import static org.assertj.core.api.Assertions.assertThat; |
|||
import static org.mockito.ArgumentMatchers.any; |
|||
import static org.mockito.ArgumentMatchers.anyLong; |
|||
import static org.mockito.ArgumentMatchers.anyString; |
|||
import static org.mockito.BDDMockito.willReturn; |
|||
import static org.mockito.Mockito.mock; |
|||
import static org.mockito.Mockito.never; |
|||
import static org.mockito.Mockito.spy; |
|||
import static org.mockito.Mockito.times; |
|||
import static org.mockito.Mockito.verify; |
|||
import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.LOG_LWM2M_TELEMETRY; |
|||
|
|||
class LwM2mTransportServerHelperTest { |
|||
|
|||
public static final String KEY_SW_STATE = "sw_state"; |
|||
public static final String DOWNLOADING = "DOWNLOADING"; |
|||
|
|||
long now; |
|||
List<TransportProtos.KeyValueProto> kvList; |
|||
ConcurrentMap<String, AtomicLong> keyTsLatestMap; |
|||
LwM2mTransportServerHelper helper; |
|||
LwM2mTransportContext context; |
|||
|
|||
|
|||
@BeforeEach |
|||
void setUp() { |
|||
now = System.currentTimeMillis(); |
|||
context = mock(LwM2mTransportContext.class); |
|||
helper = spy(new LwM2mTransportServerHelper(context)); |
|||
willReturn(now).given(helper).getCurrentTimeMillis(); |
|||
kvList = List.of( |
|||
TransportProtos.KeyValueProto.newBuilder().setKey(KEY_SW_STATE).setStringV(DOWNLOADING).build(), |
|||
TransportProtos.KeyValueProto.newBuilder().setKey(LOG_LWM2M_TELEMETRY).setStringV("Transport log example").build() |
|||
); |
|||
keyTsLatestMap = new ConcurrentHashMap<>(); |
|||
} |
|||
|
|||
@Test |
|||
void givenKeyAndLatestTsMapAndCurrentTs_whenGetTs_thenVerifyNoGetTsByKeyCall() { |
|||
assertThat(helper.getTs(null, null)).isEqualTo(now); |
|||
assertThat(helper.getTs(null, keyTsLatestMap)).isEqualTo(now); |
|||
assertThat(helper.getTs(emptyList(), null)).isEqualTo(now); |
|||
assertThat(helper.getTs(emptyList(), keyTsLatestMap)).isEqualTo(now); |
|||
assertThat(helper.getTs(kvList, null)).isEqualTo(now); |
|||
|
|||
verify(helper, never()).getTsByKey(anyString(), any(ConcurrentMap.class), anyLong()); |
|||
verify(helper, times(5)).getCurrentTimeMillis(); |
|||
} |
|||
|
|||
@Test |
|||
void givenKeyAndLatestTsMapAndCurrentTs_whenGetTs_thenVerifyGetTsByKeyCallByFirstKey() { |
|||
assertThat(helper.getTs(kvList, keyTsLatestMap)).isEqualTo(now); |
|||
|
|||
verify(helper, times(1)).getTsByKey(kvList.get(0).getKey(), keyTsLatestMap, now); |
|||
verify(helper, times(1)).getTsByKey(anyString(), any(ConcurrentMap.class), anyLong()); |
|||
} |
|||
|
|||
@Test |
|||
void givenKeyAndEmptyLatestTsMap_whenGetTsByKey_thenAddToMapAndReturnNow() { |
|||
assertThat(keyTsLatestMap).as("ts latest map before").isEmpty(); |
|||
|
|||
assertThat(helper.getTsByKey(KEY_SW_STATE, keyTsLatestMap, now)).as("getTsByKey").isEqualTo(now); |
|||
|
|||
assertThat(keyTsLatestMap).as("ts latest map after").hasSize(1); |
|||
assertThat(keyTsLatestMap.get(KEY_SW_STATE)).as("key present").isNotNull(); |
|||
assertThat(keyTsLatestMap.get(KEY_SW_STATE).get()).as("ts in map by key").isEqualTo(now); |
|||
} |
|||
|
|||
@Test |
|||
void givenKeyAndLatestTsMapWithExistedKey_whenGetTsByKey_thenCallSwapOrIncrementMethod() { |
|||
keyTsLatestMap.put(KEY_SW_STATE, new AtomicLong()); |
|||
keyTsLatestMap.put("other", new AtomicLong()); |
|||
assertThat(keyTsLatestMap).as("ts latest map").hasSize(2); |
|||
willReturn(now).given(helper).compareAndSwapOrIncrementTsAtomically(any(AtomicLong.class), anyLong()); |
|||
|
|||
assertThat(helper.getTsByKey(KEY_SW_STATE, keyTsLatestMap, now)).as("getTsByKey").isEqualTo(now); |
|||
|
|||
verify(helper, times(1)).compareAndSwapOrIncrementTsAtomically(keyTsLatestMap.get(KEY_SW_STATE), now); |
|||
verify(helper, times(1)).compareAndSwapOrIncrementTsAtomically(any(AtomicLong.class), anyLong()); |
|||
} |
|||
|
|||
@Test |
|||
void givenMapWithTsValueLessThanNow_whenCompareAndSwapOrIncrementTsAtomically_thenReturnNow() { |
|||
keyTsLatestMap.put(KEY_SW_STATE, new AtomicLong(now - 1)); |
|||
assertThat(helper.compareAndSwapOrIncrementTsAtomically(keyTsLatestMap.get(KEY_SW_STATE), now)).isEqualTo(now); |
|||
} |
|||
|
|||
@Test |
|||
void givenMapWithTsValueEqualsNow_whenCompareAndSwapOrIncrementTsAtomically_thenReturnNowIncremented() { |
|||
keyTsLatestMap.put(KEY_SW_STATE, new AtomicLong(now)); |
|||
assertThat(helper.compareAndSwapOrIncrementTsAtomically(keyTsLatestMap.get(KEY_SW_STATE), now)).isEqualTo(now + 1); |
|||
} |
|||
|
|||
@Test |
|||
void givenMapWithTsValueGreaterThanNow_whenCompareAndSwapOrIncrementTsAtomically_thenReturnGreaterThanNowIncremented() { |
|||
final long nextHourTs = now + TimeUnit.HOURS.toMillis(1); |
|||
keyTsLatestMap.put(KEY_SW_STATE, new AtomicLong(nextHourTs)); |
|||
assertThat(helper.compareAndSwapOrIncrementTsAtomically(keyTsLatestMap.get(KEY_SW_STATE), now)).isEqualTo(nextHourTs + 1); |
|||
} |
|||
|
|||
} |
|||
Loading…
Reference in new issue