/*
 *  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.
 */

/**
 * @author Serguei S.Zapreyev
 */

package java.lang;

import java.io.File;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

import junit.framework.TestCase;

/*
 * Created on March 29, 2006
 *
 * This RuntimeAdditionalTest class is used to test the Core API Runtime class
 * 
 */

/**
 * ###############################################################################
 * ###############################################################################
 * TODO: 1.
 * ###############################################################################
 * ###############################################################################
 */

public class RuntimeAdditionalTest38 extends TestCase {
    /**
     * check possibility of big env array defining via exec(..., env, ...) and
     * long file name via exec(..., file)
     */
    public void test_36() {
        System.out.println("==test_36===");
        String command = null;
        if (RuntimeAdditionalTest0.os.equals("Win")) {
            command = RuntimeAdditionalTest0.cm
                    + " /C \"echo %Z_S_S_2%xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\"";
        } else if (RuntimeAdditionalTest0.os.equals("Lin")) {
            //command = "sh -c \"echo $Z_S_S_2\"";
            //command = "echo $Z_S_S_2";
            command = "/usr/bin/env";
        } else {
            fail("WARNING (test_1): unknown operating system.");
        }
        String procValue = null;
        try {
            Process proc = Runtime.getRuntime().exec(command,
                    new String[] { "Z_S_S_2=S_O_M_E_T_H_I_N_G" });
            BufferedReader br = new BufferedReader(new InputStreamReader(proc
                    .getInputStream()));
            //procValue = br.readLine();
            boolean flg = true;
            while ((procValue = br.readLine()) != null) {
                //if (procValue.indexOf("Z_S_S_2=S_O_M_E_T_H_I_N_G") != -1) {
                if (procValue.indexOf(RuntimeAdditionalTest0.os.equals("Win")?"S_O_M_E_T_H_I_N_Gx":"S_O_M_E_T_H_I_N_G") != -1) {
                    flg = false;
                    break;
                }
                System.out
                        .println("WARNING (test_36): should it be only singl line in env after such exec? ("
                                + procValue + ")");
            }
            if (flg) {
                fail("ERROR (test_36): Z_S_S_2 var should be present and assingned correctly.");
            }
        } catch (IOException e) {
            e.printStackTrace();
            fail("ERROR (test_36): unexpected exception.");
        }
        try {
            String ts = "Z_S_S_3=S_O_M_E_T_H_I_N_G L_O_N_GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG";
            String ts2 = "Z_S_S_2=S_O_M_E_T_H_I_N_G";
            Process proc = Runtime.getRuntime().exec(
                    command,
                    new String[] { ts2, ts, ts, ts, ts, ts, ts, ts, ts, ts, ts,
                            ts, ts, ts, ts, ts, ts, ts2, ts, ts, ts, ts, ts,
                            ts, ts, ts, ts, ts, ts, ts, ts, ts, ts, ts, ts2,
                            ts, ts, ts, ts, ts, ts, ts, ts, ts, ts, ts, ts, ts,
                            ts, ts, ts, ts2, ts, ts, ts, ts, ts, ts, ts, ts,
                            ts, ts, ts, ts, ts, ts, ts, ts, ts2, ts, ts, ts,
                            ts, ts, ts, ts, ts, ts, ts, ts, ts, ts, ts, ts, ts,
                            ts2, ts, ts, ts, ts, ts, ts, ts, ts, ts, ts, ts,
                            ts, ts, ts, ts, ts, ts2, ts, ts, ts, ts, ts, ts,
                            ts, ts, ts, ts, ts, ts, ts, ts, ts, ts, ts2, ts,
                            ts, ts, ts, ts, ts, ts, ts, ts, ts, ts, ts, ts, ts,
                            ts, ts, ts2, ts, ts, ts, ts, ts,
                    //                            ts,
                    },
                    new File("." + File.separator + ".." + File.separator
                            + ".." + File.separator + ".." + File.separator
                            + ".." + File.separator + ".." + File.separator
                            + File.separator + ".." + File.separator + ".."
                            + File.separator + ".." + File.separator + ".."
                            + File.separator + ".." + File.separator
                            + File.separator + ".." + File.separator + ".."
                            + File.separator + ".." + File.separator + ".."
                            + File.separator + ".." + File.separator
                            + File.separator + ".." + File.separator + ".."
                            + File.separator + ".." + File.separator + ".."
                            + File.separator + ".." + File.separator
                            + File.separator + ".." + File.separator + ".."
                            + File.separator + ".." + File.separator + ".."
                            + File.separator + ".." + File.separator
                            + File.separator + ".." + File.separator + ".."
                            + File.separator + ".." + File.separator + ".."
                            //+ File.separator + ".." + File.separator
                            //+ File.separator + ".." + File.separator + ".."
                            //+ File.separator + ".." + File.separator + ".."
                            + File.separator + ".." + File.separator
                            + File.separator + ".." + File.separator + ".."
                            + File.separator + ".." + File.separator + ".."
                            + File.separator + ".." + File.separator
                            + File.separator + ".." + File.separator + ".."
                            + File.separator + ".." + File.separator + ".."
                            + File.separator + ".." + File.separator
                            + File.separator + ".." + File.separator + ".."
                            + File.separator + ".." + File.separator + ".."
                            + File.separator + ".." + File.separator
                            + File.separator + ".." + File.separator + ".."
                            + File.separator + ".." + File.separator + ".."
                            + File.separator + ".." + File.separator
                            + File.separator + ".." + File.separator + ".."
                            + File.separator + ".." + File.separator + ".."
                            + File.separator + ".." + File.separator
                            + File.separator + ".." + File.separator + ".."
                            + File.separator + ".." + File.separator + ".."
                            + File.separator + ".." + File.separator
                            + File.separator + ".." + File.separator + ".."
                            + File.separator + ".." + File.separator + ".."
                            + File.separator + ".." + File.separator));
            BufferedReader br = new BufferedReader(new InputStreamReader(proc
                    .getInputStream()));
            procValue = br.readLine();
        } catch (java.io.IOException e) {
            e.printStackTrace();
            fail("ERROR (test_36): unexpected exception.");
        }
    }
}