/*
 * Copyright (c) 1997, 2018 Oracle and/or its affiliates. All rights reserved.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0, which is available at
 * http://www.eclipse.org/legal/epl-2.0.
 *
 * This Source Code may also be made available under the following Secondary
 * Licenses when the conditions for such availability set forth in the
 * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
 * version 2 with the GNU Classpath Exception, which is available at
 * https://www.gnu.org/software/classpath/license.html.
 *
 * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
 */

package test.web.jsfinjection;
import org.testng.annotations.Configuration;
import org.testng.annotations.ExpectedExceptions;
import org.testng.annotations.Test;
import org.testng.annotations.*;
import org.testng.Assert;

import java.io.*;
import java.net.*;
import java.util.*;

/**
 * Simple TestNG client for basic WAR containing JSF page with injectited values.
 * Client checks for two values: injected string and injected number.
 * If both values are as expected test passes.
 */
public class JSFInjectionTestNG {

    private static final String TEST_NAME =
        "simple-webapp-jsf-injection";
   
    private String strContextRoot="jsfinjection";

    static String result = "";
    String host=System.getProperty("http.host");
    String port=System.getProperty("http.port");
           
    /*
     *If two asserts are mentioned in one method, then last assert is taken in
     *to account.
     *Each method can act as one test within one test suite
     */


    //@Parameters({ "host", "port", "contextroot" })
    @Test(groups ={ "pulse"} ) // test method
    public void injectedValuesTestPage() throws Exception {
        
      try {

        String errorText = "";
        boolean testPass = false;

        String testUrl = "http://" + host  + ":" + port + "/"+ strContextRoot + "/jsfHello.jsf";
        //echo("URL is: " + testUrl);
        URL url = new URL(testUrl);
        //echo("Connecting to: " + url.toString());
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.connect();
        int responseCode = conn.getResponseCode();
        if ( responseCode != 200 ) {
          //echo("ERROR: http response code is " + responseCode);
          errorText = errorText + "ERROR: http response code is " + responseCode + ".\n";
        } else {
          //echo("Connected: " + responseCode);
        }

        InputStream is = conn.getInputStream();
        BufferedReader input = new BufferedReader(new InputStreamReader(is));

        String line = null;
        String line2 = null;
        String line3 = null;
        boolean result=false;
	String EXPECTED_RESPONSE = "Injected entry";
	String DIVIDER = "===";
        String PC = "Postconstruct";
        while ((line = input.readLine()) != null) {
          //echo ("LINE:"+line);
          if (line.indexOf(EXPECTED_RESPONSE)!= -1) {
            testPass = true;
            //echo("Received line: " + line);
          }
          if (line.indexOf(DIVIDER)!= -1) {
            line2 = line;
            //echo("Received line2: " + line2);
          }
          if (line.indexOf(PC)!= -1) {
            line3 = line;
            //echo("Received line3: " + line3);
          }
        }

        if (! testPass) {
          echo("ERROR: injection 1 not found");
          errorText = errorText + "ERROR: injection 1 not found\n";
        }

        if (line2 != null) {
          String [] injection2Array = line2.split(DIVIDER);
          String injectedNumber = injection2Array[1].trim();
          //echo("injectedNumber = " + injectedNumber);
          int num = Integer.parseInt(injectedNumber);
  
          if ( num < 0 ) {
            echo("ERROR: injection 2 is less than zero.");
            errorText = errorText + "ERROR: injection 2 is less than zero";
            testPass = false;
          } else {
            echo("Injection2 matched.");
          }
        } else {
          echo("ERROR: line with " + DIVIDER + " not found.");
          errorText = errorText + "ERROR: line with " + DIVIDER + " not found";
          testPass = false;
        }

        if (line3 != null) {
            if (line3.contains("true")) {
                echo("@PostConstruct worked");
            } else {
                echo("ERROR:@PostConstruct failed");
                errorText = errorText + "ERROR: @PostConstruct failed";
                testPass = false;
            } 
        } else {
          echo("ERROR: line with " + PC + " not found.");
          errorText = errorText + "ERROR: line with " + PC + " not found";
          testPass = false;
        }

        Assert.assertEquals(testPass, true, errorText);
        
      }catch(Exception e){
        echo("ERROR: caught exception!");
        e.printStackTrace();
        throw new Exception(e);
      }
    }

    public static void echo(String msg) {
      System.out.println(msg);
    }
}
