/*
 Licensed to the Apache Software Foundation (ASF) under one
 or more contributor license agreements.  See the NOTICE file
 distributed with this work for additional information
 regarding copyright ownership.  The ASF licenses this file
 to you 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.
 */

/* globals Promise: true */

const child_process = require('child_process');

/**
 * Executes the command specified.
 * @param  {string} cmd Command to execute
 * @param  {[string]}  opt_cwd Current working directory
 * @return {Promise} a promise that either resolves with the stdout, or rejects with an error message and the stderr.
 */
module.exports = function (cmd, opt_cwd) {
    return new Promise((resolve, reject) => {
        try {
            const opt = { cwd: opt_cwd, maxBuffer: 1024000 };
            let timerID = 0;
            if (process.platform === 'linux') {
                timerID = setTimeout(() => {
                    resolve('linux-timeout');
                }, 5000);
            }
            child_process.exec(cmd, opt, (err, stdout, stderr) => {
                clearTimeout(timerID);
                if (err) {
                    reject(new Error(`Error executing "${cmd}": ${stderr}`));
                } else {
                    resolve(stdout);
                }
            });
        } catch (e) {
            console.error(`error caught: ${e}`);
            reject(e);
        }
    });
};
