package com.aliyun.openservices.log.producer;

import static org.junit.Assert.*;

import com.aliyun.openservices.log.common.LogItem;
import com.aliyun.openservices.log.exception.LogException;
import com.aliyun.openservices.log.response.PutLogsResponse;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.mockito.ArgumentMatchers;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import static org.mockito.ArgumentMatchers.isNull;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;

public class LogProducerTrySendTest {

    private static final String MOCK_IP = "192.168.0.25";

    private LogProducer producer;

    @Before
    public void setUp() {
        ProducerConfig producerConfig = new ProducerConfig();
        producerConfig.memPoolSizeInByte = 100;
        producer = new LogProducer(producerConfig);
    }

    @After
    public void cleanUp() {
    }

    private ProjectConfig buildProjectConfig() {
        String projectName = System.getenv("project1");
        String endpoint = System.getenv("endpoint1");
        String accessKeyId = System.getenv("accessKeyId");
        String accessKey = System.getenv("accessKey");
        return new ProjectConfig(projectName, endpoint, accessKeyId, accessKey);
    }

    private List<LogItem> getLogItems() {
        List<LogItem> logItems = new ArrayList<LogItem>();
        LogItem logItem = new LogItem((int) (new Date().getTime() / 1000));
        for (int i = 0; i < 1000; ++i) {
            logItem.PushBack("key", "val");
        }
        logItems.add(logItem);
        return logItems;
    }

    static private class TestCallback extends ILogCallback {

        @Override
        public void onCompletion(PutLogsResponse response, LogException e) {
        }
    }

    @Test
    public void testSend() {
        producer.setProjectConfig(buildProjectConfig());

        TestCallback testCallback = mock(TestCallback.class);
        boolean res = producer.trySend(
                System.getenv("project1"),
                "store_1s",
                "topic1",
                MOCK_IP,
                getLogItems(),
                testCallback
        );
        producer.flush();
        producer.close();
        assertTrue(!res);

        verify(testCallback, times(0)).onCompletion(ArgumentMatchers.any(PutLogsResponse.class),
                (LogException) isNull());
    }

}