;; 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.submitter-test
  (:use [clojure test])
  (:use [org.apache.storm config])
  (:import [org.apache.storm StormSubmitter])
  )

(deftest test-md5-digest-secret-generation
  (testing "No payload or scheme are generated when already present"
    (let [conf {STORM-ZOOKEEPER-TOPOLOGY-AUTH-PAYLOAD "foobar:12345"
                STORM-ZOOKEEPER-AUTH-SCHEME "anything"}
          result (StormSubmitter/prepareZookeeperAuthentication conf)
          actual-payload (.get result STORM-ZOOKEEPER-TOPOLOGY-AUTH-PAYLOAD)
          actual-scheme (.get result STORM-ZOOKEEPER-TOPOLOGY-AUTH-SCHEME)]
      (is (= "foobar:12345" actual-payload))
      (is (= "digest" actual-scheme))))

  (testing "Scheme is set to digest if not already."
    (let [conf {STORM-ZOOKEEPER-TOPOLOGY-AUTH-PAYLOAD "foobar:12345"}
          result (StormSubmitter/prepareZookeeperAuthentication conf)
          actual-payload (.get result STORM-ZOOKEEPER-TOPOLOGY-AUTH-PAYLOAD)
          actual-scheme (.get result STORM-ZOOKEEPER-TOPOLOGY-AUTH-SCHEME)]
      (is (= "foobar:12345" actual-payload))
      (is (= "digest" actual-scheme))))

  (testing "A payload is generated when no payload is present."
    (let [conf {STORM-ZOOKEEPER-AUTH-SCHEME "anything"}
          result (StormSubmitter/prepareZookeeperAuthentication conf)
          actual-payload (.get result STORM-ZOOKEEPER-TOPOLOGY-AUTH-PAYLOAD)
          actual-scheme (.get result STORM-ZOOKEEPER-TOPOLOGY-AUTH-SCHEME)]
      (is (not (clojure.string/blank? actual-payload)))
      (is (= "digest" actual-scheme))))

  (testing "A payload is generated when payload is not correctly formatted."
    (let [bogus-payload "not-a-valid-payload"
          conf {STORM-ZOOKEEPER-TOPOLOGY-AUTH-PAYLOAD bogus-payload
                STORM-ZOOKEEPER-AUTH-SCHEME "anything"}
          result (StormSubmitter/prepareZookeeperAuthentication conf)
          actual-payload (.get result STORM-ZOOKEEPER-TOPOLOGY-AUTH-PAYLOAD)
          actual-scheme (.get result STORM-ZOOKEEPER-TOPOLOGY-AUTH-SCHEME)]
      (is (not (StormSubmitter/validateZKDigestPayload bogus-payload))) ; Is this test correct?
      (is (not (clojure.string/blank? actual-payload)))
      (is (= "digest" actual-scheme))))

  (testing "A payload is generated when payload is null."
    (let [conf {STORM-ZOOKEEPER-TOPOLOGY-AUTH-PAYLOAD nil
                STORM-ZOOKEEPER-AUTH-SCHEME "anything"}
          result (StormSubmitter/prepareZookeeperAuthentication conf)
          actual-payload (.get result STORM-ZOOKEEPER-TOPOLOGY-AUTH-PAYLOAD)
          actual-scheme (.get result STORM-ZOOKEEPER-TOPOLOGY-AUTH-SCHEME)]
      (is (not (clojure.string/blank? actual-payload)))
      (is (= "digest" actual-scheme))))

  (testing "A payload is generated when payload is blank."
    (let [conf {STORM-ZOOKEEPER-TOPOLOGY-AUTH-PAYLOAD ""
                STORM-ZOOKEEPER-AUTH-SCHEME "anything"}
          result (StormSubmitter/prepareZookeeperAuthentication conf)
          actual-payload (.get result STORM-ZOOKEEPER-TOPOLOGY-AUTH-PAYLOAD)
          actual-scheme (.get result STORM-ZOOKEEPER-TOPOLOGY-AUTH-SCHEME)]
      (is (not (clojure.string/blank? actual-payload)))
      (is (= "digest" actual-scheme)))))
