/*******************************************************************************
 * Copyright (c) 2016 École Polytechnique de Montréal
 *
 * All rights reserved. This program and the accompanying materials are
 * made available under the terms of the Eclipse Public License 2.0 which
 * accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *******************************************************************************/

package org.eclipse.tracecompass.analysis.os.linux.core.tests.inputoutput;

import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.fail;

import java.io.File;

import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;
import org.eclipse.tracecompass.analysis.os.linux.core.inputoutput.InputOutputAnalysisModule;
import org.eclipse.tracecompass.analysis.os.linux.core.kernel.KernelAnalysisModule;
import org.eclipse.tracecompass.analysis.os.linux.core.kernel.KernelTidAspect;
import org.eclipse.tracecompass.analysis.os.linux.core.tests.Activator;
import org.eclipse.tracecompass.analysis.os.linux.core.tests.stubs.trace.KernelEventLayoutStub;
import org.eclipse.tracecompass.analysis.os.linux.core.tests.stubs.trace.TmfXmlKernelTraceStub;
import org.eclipse.tracecompass.analysis.os.linux.core.trace.IKernelAnalysisEventLayout;
import org.eclipse.tracecompass.tmf.core.event.TmfEvent;
import org.eclipse.tracecompass.tmf.core.exceptions.TmfTraceException;
import org.eclipse.tracecompass.tmf.core.signal.TmfTraceOpenedSignal;
import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
import org.eclipse.tracecompass.tmf.core.trace.TmfTrace;
import org.eclipse.tracecompass.tmf.core.trace.TmfTraceManager;
import org.eclipse.tracecompass.tmf.core.trace.TmfTraceUtils;

/**
 * Abstract for InputOuput test classes with utility methods to setup and tear
 * down the tests
 *
 * @author Geneviève Bastien
 */
public class AbstractTestInputOutput {

    private static final String IO_FILE_PATH = "testfiles/io_analysis/";

    private static class IOKernelEventLayout extends KernelEventLayoutStub {
        @Override
        public @NonNull String eventBlockRqMerge() {
            return "addons_elv_merge_requests";
        }

        @Override
        public @Nullable String eventStatedumpBlockDevice() {
            return "statedump_block_device";
        }

        @Override
        public @NonNull String eventSyscallEntryPrefix() {
            return "syscall_entry_";
        }

        @Override
        public @NonNull String eventCompatSyscallEntryPrefix() {
            return "syscall_compat_entry_";
        }

        @Override
        public @NonNull String eventSyscallExitPrefix() {
            return "syscall_exit_";
        }

        @Override
        public @NonNull String eventCompatSyscallExitPrefix() {
            return "syscall_compat_exit_";
        }
    }

    private static final @NonNull IKernelAnalysisEventLayout EVENT_LAYOUT = new IOKernelEventLayout();

    private ITmfTrace fTrace;

    private static void deleteSuppFiles(ITmfTrace trace) {
        /* Remove supplementary files */
        File suppDir = new File(TmfTraceManager.getSupplementaryFileDir(trace));
        for (File file : suppDir.listFiles()) {
            file.delete();
        }
    }

    /**
     * Constructor
     */
    public AbstractTestInputOutput() {

    }

    /**
     * Clean up
     */
    protected void deleteTrace() {
        ITmfTrace trace = fTrace;
        if (trace != null) {
            deleteSuppFiles(fTrace);
            fTrace.dispose();
        }
    }

    /**
     * Setup the trace for the tests and return the InputOutputAnalysisModule,
     * not executed.
     *
     * @param fileName
     *            The file name of the trace to open
     * @return The input output analysis module
     */
    protected @NonNull InputOutputAnalysisModule setUp(String fileName) {
        TmfXmlKernelTraceStub trace = new TmfXmlKernelTraceStub();
        trace.addEventAspect(KernelTidAspect.INSTANCE);
        trace.setKernelEventLayout(EVENT_LAYOUT);
        IPath filePath = Activator.getAbsoluteFilePath(IO_FILE_PATH + fileName);
        IStatus status = trace.validate(null, filePath.toOSString());
        if (!status.isOK()) {
            fail(status.getException().getMessage());
        }
        try {
            trace.initTrace(null, filePath.toOSString(), TmfEvent.class);
        } catch (TmfTraceException e) {
            fail(e.getMessage());
        }

        deleteSuppFiles(trace);
        ((TmfTrace) trace).traceOpened(new TmfTraceOpenedSignal(this, trace, null));
        fTrace = trace;

        /* Start the kernel analysis module */
        KernelAnalysisModule kernelMod = TmfTraceUtils.getAnalysisModuleOfClass(trace, KernelAnalysisModule.class, KernelAnalysisModule.ID);
        assertNotNull(kernelMod);
        kernelMod.schedule();
        kernelMod.waitForCompletion();

        InputOutputAnalysisModule module = TmfTraceUtils.getAnalysisModuleOfClass(trace, InputOutputAnalysisModule.class, InputOutputAnalysisModule.ID);
        assertNotNull(module);
        return module;
    }
}
