chromium/chrome/browser/android/httpclient/java/src/org/chromium/chrome/browser/android/httpclient/SimpleHttpClientUnitTest.java

// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

package org.chromium.chrome.browser.android.httpclient;

import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;

import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;

import org.chromium.base.ThreadUtils;
import org.chromium.base.test.BaseRobolectricTestRunner;
import org.chromium.base.test.util.CallbackHelper;
import org.chromium.base.test.util.JniMocker;
import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.net.NetworkTrafficAnnotationTag;
import org.chromium.url.JUnitTestGURLs;

import java.util.Map;

/** Unit test for {@link SimpleHttpClient}. */
@RunWith(BaseRobolectricTestRunner.class)
public class SimpleHttpClientUnitTest {
    private static final long FAKE_NATIVE_POINTER = 123456789L;

    @Rule public JniMocker mMocker = new JniMocker();
    @Rule public MockitoRule mRule = MockitoJUnit.rule();

    @Mock public SimpleHttpClient.Natives mNativeMock;
    @Mock public Profile mMockProfile;

    @Captor public ArgumentCaptor<String[]> mHeaderKeysCaptor;
    @Captor public ArgumentCaptor<String[]> mHeaderValuesCaptor;

    private SimpleHttpClient mHttpClient;

    @Before
    public void setUp() {
        ThreadUtils.setThreadAssertsDisabledForTesting(true);
        mMocker.mock(SimpleHttpClientJni.TEST_HOOKS, mNativeMock);
        Mockito.when(mNativeMock.init(mMockProfile)).thenReturn(FAKE_NATIVE_POINTER);

        mHttpClient = new SimpleHttpClient(mMockProfile);

        Mockito.verify(mNativeMock).init(mMockProfile);
    }

    @Test
    public void testDestroy() {
        mHttpClient.destroy();
        Mockito.verify(mNativeMock).destroy(FAKE_NATIVE_POINTER);
    }

    @Test
    public void testParseHeader() {
        final Map<String, String> headers = Map.of("Foo", "valFoo", "Bar", "valBar");
        final CallbackHelper responseCallback = new CallbackHelper();
        final byte[] requestBody = {};
        final String requestType = "requestType";

        mHttpClient.send(
                JUnitTestGURLs.BLUE_1,
                requestType,
                requestBody,
                headers,
                NetworkTrafficAnnotationTag.TRAFFIC_ANNOTATION_FOR_TESTS,
                (response) -> responseCallback.notifyCalled());

        Mockito.verify(mNativeMock)
                .sendNetworkRequest(
                        eq(FAKE_NATIVE_POINTER),
                        eq(JUnitTestGURLs.BLUE_1),
                        eq(requestType),
                        eq(requestBody),
                        eq(headers),
                        eq(NetworkTrafficAnnotationTag.TRAFFIC_ANNOTATION_FOR_TESTS.getHashCode()),
                        any());
    }
}