import java.security.Security;

import com.google.common.base.Function;
import eu.dnetlib.data.download.DownloadReportMap;
import eu.dnetlib.data.download.rmi.DownloadItem;
import eu.dnetlib.data.download.worker.DownloadWorker;
import eu.dnetlib.data.objectstore.modular.ObjectStoreRecord;
import eu.dnetlib.data.objectstore.modular.connector.ObjectStore;
import eu.dnetlib.data.objectstore.rmi.Protocols;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;

import static org.junit.Assert.assertEquals;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.when;

/**
 * Created by alessia on 22/12/16.
 */
@RunWith(MockitoJUnitRunner.class)
public class DownloadWorkerTest {

	private DownloadWorker dw;
	private DownloadReportMap reportMap;
	@Mock
	private ObjectStore objectStore;

	@Before
	public void prepare() throws Exception{
		Security.insertProviderAt(new BouncyCastleProvider(),1);
		System.setProperty("https.protocols", "TLSv1,TLSv1.1,TLSv1.2");
		reportMap = new DownloadReportMap();

		when(objectStore.feedObjectRecord(any(ObjectStoreRecord.class))).thenReturn("OK");

		dw = new DownloadWorker(null, objectStore, Protocols.valueOf("HTTP"), "application/pdf", 60000, 60000, 0,
				new Function<String, DownloadItem>() {

					@Override
					public DownloadItem apply(final String input) {
						return DownloadItem.newObjectfromJSON(input);
					}
				});
	}

	@Test
	public void testSSL(){
		String url = "https://econstor.eu/bitstream/10419/45606/1/658945068.pdf";
		dw.doDownload(1, reportMap, getDownloadItem("658945068.pdf", "658945068", url));

		System.out.println("Report map status "+reportMap.getStatus());
		assertEquals(1,reportMap.getTotalDownloaded());
	}

	private DownloadItem getDownloadItem(final String fileName, final String id, String url){
		DownloadItem item = new DownloadItem();
		item.setFileName(fileName);
		item.setIdItemMetadata(id);
		item.setOpenAccess("OPEN");
		item.setOriginalUrl(url);
		item.setUrl(url);
		return item;
	}
}
