package com.constellio.data.dao.services.records;
import static org.junit.Assert.assertEquals;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import org.junit.Before;
import org.junit.Test;
import com.constellio.data.dao.dto.records.RecordDTO;
import com.constellio.data.dao.dto.records.RecordDeltaDTO;
import com.constellio.data.dao.dto.records.RecordsFlushing;
import com.constellio.data.dao.dto.records.TransactionDTO;
import com.constellio.data.dao.services.bigVault.BigVaultRecordDao;
import com.constellio.data.dao.services.bigVault.RecordDaoException.OptimisticLocking;
import com.constellio.sdk.tests.ConstellioTest;
import com.constellio.sdk.tests.annotations.LoadTest;
import com.constellio.sdk.tests.concurrent.ConcurrencyUtils;
import com.constellio.sdk.tests.concurrent.ConcurrencyUtils.IncrementForTask;
import com.constellio.sdk.tests.concurrent.ConcurrencyUtils.WorkerContextFactory;
@LoadTest
public class BigVaultRecordDaoLoadTest extends ConstellioTest {
private RecordDao recordDao;
@Before
public void setup() {
recordDao = getDataLayerFactory().newRecordDao();
}
@Test
public void whenAddingMultipleDocumentsWithMultipleThreadsThenCanHandleLoad()
throws Exception {
WorkerContextFactory workerContextFactory = new WorkerContextFactory() {
@Override
public void setupWorkerContext(int worker, Map<String, Object> context) {
recordDao = getDataLayerFactory().newRecordDao();
context.put("dao", recordDao);
}
};
IncrementForTask task = new IncrementForTask() {
@Override
public void executeTask(int i, Map<String, Object> workerContext) {
BigVaultRecordDao dao = (BigVaultRecordDao) workerContext.get("dao");
try {
add(newRecordWithTitle("record #" + i));
} catch (OptimisticLocking optimisticLocking) {
throw new RuntimeException(optimisticLocking);
}
}
};
ConcurrencyUtils.concurrentIntegerFor(100, 0, 1000, 1, task, workerContextFactory);
assertEquals(1000, recordDao.documentsCount());
}
private RecordDTO newRecordWithTitle(String title) {
Map<String, Object> fields = new HashMap<String, Object>();
fields.put("title_s", title);
RecordDTO record = new RecordDTO(UUID.randomUUID().toString(), -1, null, fields);
return record;
}
private void add(RecordDTO recordDTO)
throws OptimisticLocking {
recordDao.execute(new TransactionDTO(UUID.randomUUID().toString(), RecordsFlushing.NOW, Arrays.asList(recordDTO),
new ArrayList<RecordDeltaDTO>()));
}
}