blob: e41a48ed579a221a121dc6be004b70353c9c5651 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.plc4x.java.scraper;
import org.apache.commons.lang3.tuple.Pair;
import org.apache.commons.pool2.impl.GenericKeyedObjectPool;
import org.apache.commons.pool2.impl.GenericKeyedObjectPoolConfig;
import org.apache.plc4x.java.PlcDriverManager;
import org.apache.plc4x.java.api.PlcConnection;
import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
import org.apache.plc4x.java.api.types.PlcResponseCode;
import org.apache.plc4x.java.base.messages.items.DefaultIntegerFieldItem;
import org.apache.plc4x.java.mock.MockDevice;
import org.apache.plc4x.java.mock.PlcMockConnection;
import org.apache.plc4x.java.utils.connectionpool.PooledPlcDriverManager;
import org.assertj.core.api.WithAssertions;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import org.mockito.junit.jupiter.MockitoSettings;
import org.mockito.quality.Strictness;
import java.util.Arrays;
import java.util.Collections;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.when;
@ExtendWith(MockitoExtension.class)
@MockitoSettings(strictness = Strictness.LENIENT)
class ScraperTest implements WithAssertions {
@Mock
MockDevice mockDevice;
public static final String CONN_STRING_TIM = "s7://10.10.64.22/0/1";
public static final String FIELD_STRING_TIM = "%DB225:DBW0:INT";
public static final String CONN_STRING_CH = "s7://10.10.64.20/0/1";
public static final String FIELD_STRING_CH = "%DB3:DBD32:DINT";
@Test
@Disabled
void real_stuff() throws InterruptedException {
PlcDriverManager driverManager = new PooledPlcDriverManager(pooledPlcConnectionFactory -> {
GenericKeyedObjectPoolConfig<PlcConnection> config = new GenericKeyedObjectPoolConfig<>();
config.setJmxEnabled(true);
config.setMaxWaitMillis(-1);
config.setMaxTotal(3);
config.setMinIdlePerKey(0);
config.setBlockWhenExhausted(true);
config.setTestOnBorrow(true);
config.setTestOnReturn(true);
return new GenericKeyedObjectPool<>(pooledPlcConnectionFactory, config);
});
Scraper scraper = new Scraper((j,a,m) -> {}, driverManager, Arrays.asList(
new ScrapeJob("job1",
10,
Collections.singletonMap("tim", CONN_STRING_TIM),
Collections.singletonMap("distance", FIELD_STRING_TIM)
),
new ScrapeJob("job2",
10,
Collections.singletonMap("chris", CONN_STRING_CH),
Collections.singletonMap("counter", FIELD_STRING_CH)
)
));
Thread.sleep(30_000_000);
}
@Test
void scraper_schedulesJob() throws InterruptedException, PlcConnectionException {
PlcDriverManager driverManager = new PlcDriverManager();
PlcMockConnection connection = (PlcMockConnection) driverManager.getConnection("mock:m1");
connection.setDevice(mockDevice);
when(mockDevice.read(any())).thenReturn(Pair.of(PlcResponseCode.OK, new DefaultIntegerFieldItem(1)));
Scraper scraper = new Scraper((j,a,m) -> {}, driverManager, Collections.singletonList(
new ScrapeJob("job1",
10,
Collections.singletonMap("m1", "mock:m1"),
Collections.singletonMap("field1", "qry1")
)
));
scraper.start();
Thread.sleep(1_000);
// Assert that tasks got done.
assertThat(scraper.getScheduler()).isInstanceOf(ScheduledThreadPoolExecutor.class);
assertThat(scraper.getNumberOfActiveTasks())
.isEqualTo(1);
assertThat(((ScheduledThreadPoolExecutor) scraper.getScheduler()).getCompletedTaskCount())
.isGreaterThan(10);
}
@Test
void stop_stopsAllJobs() {
PlcDriverManager driverManager = new PlcDriverManager();
Scraper scraper = new Scraper((j,a,m) -> {}, driverManager, Collections.singletonList(
new ScrapeJob("job1",
1,
Collections.singletonMap("m1", "mock:m1"),
Collections.singletonMap("field1", "qry1")
)
));
scraper.start();
assertThat(scraper.getNumberOfActiveTasks())
.isEqualTo(1);
scraper.stop();
assertThat(scraper.getNumberOfActiveTasks())
.isZero();
}
@Test
void restart_works() throws PlcConnectionException {
PlcDriverManager driverManager = new PlcDriverManager();
PlcMockConnection connection = (PlcMockConnection) driverManager.getConnection("mock:m1");
connection.setDevice(mockDevice);
when(mockDevice.read(any())).thenReturn(Pair.of(PlcResponseCode.OK, new DefaultIntegerFieldItem(1)));
Scraper scraper = new Scraper((j,a,m) -> {}, driverManager, Collections.singletonList(
new ScrapeJob("job1",
1,
Collections.singletonMap("m1", "mock:m1"),
Collections.singletonMap("field1", "qry1")
)
));
scraper.start();
assertThat(scraper.getNumberOfActiveTasks())
.isEqualTo(1);
scraper.stop();
assertThat(scraper.getNumberOfActiveTasks())
.isZero();
scraper.start();
assertThat(scraper.getNumberOfActiveTasks())
.isEqualTo(1);
}
}