;; 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.
(ns org.apache.storm.utils-test
  (:import [org.apache.storm Config])
  (:import [org.apache.storm.utils NimbusClient Utils])
  (:import [org.apache.curator.retry ExponentialBackoffRetry])
  (:import [org.apache.thrift.transport TTransportException])
  (:use [org.apache.storm config util])
  (:use [clojure test])
)

(deftest test-new-curator-uses-exponential-backoff
  (let [expected_interval 2400
        expected_retries 10
        expected_ceiling 3000
        conf (merge (clojurify-structure (Utils/readDefaultConfig))
          {Config/STORM_ZOOKEEPER_RETRY_INTERVAL expected_interval
           Config/STORM_ZOOKEEPER_RETRY_TIMES expected_retries
           Config/STORM_ZOOKEEPER_RETRY_INTERVAL_CEILING expected_ceiling})
        servers ["bogus_server"]
        arbitrary_port 42
        curator (Utils/newCurator conf servers arbitrary_port nil)
        retry (-> curator .getZookeeperClient .getRetryPolicy)
       ]
    (is (.isAssignableFrom ExponentialBackoffRetry (.getClass retry)))
    (is (= (.getBaseSleepTimeMs retry) expected_interval))
    (is (= (.getN retry) expected_retries))
    (is (= (.getSleepTimeMs retry 10 0) expected_ceiling))
  )
)

(deftest test-getConfiguredClient-throws-RunTimeException-on-bad-args
  (let [storm-conf (merge
                    (read-storm-config)
                    {STORM-NIMBUS-RETRY-TIMES 0})]
    (is (thrown-cause? TTransportException
      (NimbusClient. storm-conf "" 65535)
    ))
  )
)

(deftest test-isZkAuthenticationConfiguredTopology
    (testing "Returns false on null config"
      (is (not (Utils/isZkAuthenticationConfiguredTopology nil))))
    (testing "Returns false on scheme key missing"
      (is (not (Utils/isZkAuthenticationConfiguredTopology
          {STORM-ZOOKEEPER-TOPOLOGY-AUTH-SCHEME nil}))))
    (testing "Returns false on scheme value null"
      (is (not
        (Utils/isZkAuthenticationConfiguredTopology
          {STORM-ZOOKEEPER-TOPOLOGY-AUTH-SCHEME nil}))))
    (testing "Returns true when scheme set to string"
      (is
        (Utils/isZkAuthenticationConfiguredTopology
          {STORM-ZOOKEEPER-TOPOLOGY-AUTH-SCHEME "foobar"}))))

(deftest test-isZkAuthenticationConfiguredStormServer
  (let [k "java.security.auth.login.config"
        oldprop (System/getProperty k)]
    (try
      (.remove (System/getProperties) k)
      (testing "Returns false on null config"
        (is (not (Utils/isZkAuthenticationConfiguredStormServer nil))))
      (testing "Returns false on scheme key missing"
        (is (not (Utils/isZkAuthenticationConfiguredStormServer
            {STORM-ZOOKEEPER-AUTH-SCHEME nil}))))
      (testing "Returns false on scheme value null"
        (is (not
          (Utils/isZkAuthenticationConfiguredStormServer
            {STORM-ZOOKEEPER-AUTH-SCHEME nil}))))
      (testing "Returns true when scheme set to string"
        (is
          (Utils/isZkAuthenticationConfiguredStormServer
            {STORM-ZOOKEEPER-AUTH-SCHEME "foobar"})))
      (testing "Returns true when java.security.auth.login.config is set"
        (do
          (System/setProperty k "anything")
          (is (Utils/isZkAuthenticationConfiguredStormServer {}))))
      (testing "Returns false when java.security.auth.login.config is set"
        (do
          (System/setProperty k "anything")
          (is (Utils/isZkAuthenticationConfiguredStormServer {}))))
    (finally 
      (if (not-nil? oldprop) 
        (System/setProperty k oldprop)
        (.remove (System/getProperties) k))))))

(deftest test-secs-to-millis-long
  (is (= 0 (secs-to-millis-long 0)))
  (is (= 2 (secs-to-millis-long 0.002)))
  (is (= 500 (secs-to-millis-long 0.5)))
  (is (= 1000 (secs-to-millis-long 1)))
  (is (= 1080 (secs-to-millis-long 1.08)))
  (is (= 10000 (secs-to-millis-long 10)))
  (is (= 10100 (secs-to-millis-long 10.1)))
)

(deftest test-clojure-from-yaml-file
  (is (= {} (clojure-from-yaml-file nil)))
  (is (= {} (clojure-from-yaml-file "foo-bar-file")))
  )

