/*
 * Copyright (C) 2016 Square, Inc.
 *
 * Licensed 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.
 */
package okio

import okio.HashingSink.Companion.hmacSha1
import okio.HashingSink.Companion.hmacSha256
import okio.HashingSink.Companion.hmacSha512
import okio.HashingSink.Companion.sha1
import okio.HashingSink.Companion.sha256
import okio.HashingSink.Companion.sha512
import kotlin.test.Test
import kotlin.test.assertEquals

class HashingSinkTest {
  private val source = Buffer()
  private val sink = Buffer()

  @Test fun md5() {
    val hashingSink: HashingSink = HashingSink.md5(sink)
    source.writeUtf8("abc")
    hashingSink.write(source, 3L)
    assertEquals(HashingTest.MD5_abc, hashingSink.hash)
  }

  @Test fun sha1() {
    val hashingSink = sha1(sink)
    source.writeUtf8("abc")
    hashingSink.write(source, 3L)
    assertEquals(HashingTest.SHA1_abc, hashingSink.hash)
  }

  @Test fun sha256() {
    val hashingSink = sha256(sink)
    source.writeUtf8("abc")
    hashingSink.write(source, 3L)
    assertEquals(HashingTest.SHA256_abc, hashingSink.hash)
  }

  @Test fun sha512() {
    val hashingSink = sha512(sink)
    source.writeUtf8("abc")
    hashingSink.write(source, 3L)
    assertEquals(HashingTest.SHA512_abc, hashingSink.hash)
  }

  @Test fun hmacSha1() {
    val hashingSink = hmacSha1(sink, HashingTest.HMAC_KEY)
    source.writeUtf8("abc")
    hashingSink.write(source, 3L)
    assertEquals(HashingTest.HMAC_SHA1_abc, hashingSink.hash)
  }

  @Test fun hmacSha256() {
    val hashingSink = hmacSha256(sink, HashingTest.HMAC_KEY)
    source.writeUtf8("abc")
    hashingSink.write(source, 3L)
    assertEquals(HashingTest.HMAC_SHA256_abc, hashingSink.hash)
  }

  @Test fun hmacSha512() {
    val hashingSink = hmacSha512(sink, HashingTest.HMAC_KEY)
    source.writeUtf8("abc")
    hashingSink.write(source, 3L)
    assertEquals(HashingTest.HMAC_SHA512_abc, hashingSink.hash)
  }

  @Test fun multipleWrites() {
    val hashingSink = sha256(sink)
    source.writeUtf8("a")
    hashingSink.write(source, 1L)
    source.writeUtf8("b")
    hashingSink.write(source, 1L)
    source.writeUtf8("c")
    hashingSink.write(source, 1L)
    assertEquals(HashingTest.SHA256_abc, hashingSink.hash)
  }

  @Test fun multipleHashes() {
    val hashingSink = sha256(sink)
    source.writeUtf8("abc")
    hashingSink.write(source, 3L)
    val hash_abc = hashingSink.hash
    assertEquals(HashingTest.SHA256_abc, hash_abc)
    source.writeUtf8("def")
    hashingSink.write(source, 3L)
    assertEquals(HashingTest.SHA256_def, hashingSink.hash)
    assertEquals(HashingTest.SHA256_abc, hash_abc)
  }

  @Test fun multipleSegments() {
    val hashingSink = sha256(sink)
    source.write(HashingTest.r32k)
    hashingSink.write(source, HashingTest.r32k.size.toLong())
    assertEquals(HashingTest.SHA256_r32k, hashingSink.hash)
  }

  @Test fun readFromPrefixOfBuffer() {
    source.writeUtf8("z")
    source.write(HashingTest.r32k)
    source.skip(1)
    source.writeUtf8("z".repeat(Segment.SIZE * 2 - 1))
    val hashingSink = sha256(sink)
    hashingSink.write(source, HashingTest.r32k.size.toLong())
    assertEquals(HashingTest.SHA256_r32k, hashingSink.hash)
  }
}
