/*
 * Copyright (C) 2020 The Android Open Source Project
 *
 * Licensed 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 com.android.trout.dumpstate.tests;

import android.hardware.dumpstate.V1_1.DumpstateMode;
import android.hardware.dumpstate.V1_1.DumpstateStatus;
import android.hardware.dumpstate.V1_1.IDumpstateDevice;
import android.os.NativeHandle;
import android.support.test.filters.MediumTest;
import android.util.Log;
import java.io.File;
import java.io.FileDescriptor;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import org.apache.commons.compress.archivers.ArchiveStreamFactory;
import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
import org.apache.commons.compress.archivers.tar.TarArchiveInputStream;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;

/**
 * Tests used to validate Trout dumpstate E2E functionality.
 */
@RunWith(JUnit4.class)
public class DumpstateE2eTests {
    private static final String TAG = DumpstateE2eTests.class.getSimpleName();
    private IDumpstateDevice mDevice;

    @Rule public TemporaryFolder mTempFolder = new TemporaryFolder();

    @Before
    public void setUp() throws Exception {
        mDevice = android.hardware.dumpstate.V1_1.IDumpstateDevice.getService(true /* retry */);
    }

    @Test
    @MediumTest
    public void testDumpstateBoard() throws Exception {
        File dumpstate_board_txt_file = mTempFolder.newFile();
        File dumpstate_board_bin_file = mTempFolder.newFile();

        try (FileOutputStream dumpstate_board_txt_ostream =
                        new FileOutputStream(dumpstate_board_txt_file.getPath());
                FileOutputStream dumpstate_board_bin_ostream =
                        new FileOutputStream(dumpstate_board_bin_file.getPath());) {
            NativeHandle handle = new NativeHandle(
                    new FileDescriptor[] {
                            dumpstate_board_txt_ostream.getFD(),
                            dumpstate_board_bin_ostream.getFD(),
                    },
                    new int[0], false);
            int dumping_status = mDevice.dumpstateBoard_1_1(
                    handle, DumpstateMode.DEFAULT, 10 * 1000 /* milliseconds */);
            Assert.assertEquals(DumpstateStatus.OK, dumping_status);
        }

        Assert.assertNotEquals(0, dumpstate_board_txt_file.length());
        Assert.assertNotEquals(0, dumpstate_board_bin_file.length());

        try (FileInputStream dumpstate_board_tar_istream =
                        new FileInputStream(dumpstate_board_bin_file.getPath());
                TarArchiveInputStream tar_stream =
                        (TarArchiveInputStream) new ArchiveStreamFactory().createArchiveInputStream(
                                "tar", dumpstate_board_tar_istream);) {
            // Traversing the tar package to make sure it is valid
            TarArchiveEntry tar_entry = null;
            while ((tar_entry = (TarArchiveEntry) tar_stream.getNextEntry()) != null) {
                Log.d(TAG, tar_entry.getName());
            }
        }
    }
}
