// Copyright 2016 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#include <zircon/syscalls.h>
#include <unittest/unittest.h>

bool cprng_test_draw_buf_too_large(void) {
    uint8_t buf[ZX_CPRNG_DRAW_MAX_LEN + 1];
    BEGIN_TEST;
    size_t sz;
    zx_status_t status = zx_cprng_draw(buf, sizeof(buf), &sz);
    EXPECT_EQ(status, ZX_ERR_INVALID_ARGS, "");
    END_TEST;
}

bool cprng_test_draw_bad_buf(void) {
    uint8_t buf[ZX_CPRNG_DRAW_MAX_LEN];
    BEGIN_TEST;
    size_t sz;
    zx_status_t status = zx_cprng_draw((void*)4, sizeof(buf), &sz);
    EXPECT_EQ(status, ZX_ERR_INVALID_ARGS, "");
    END_TEST;
}

bool cprng_test_draw_success(void) {
    uint8_t buf[ZX_CPRNG_DRAW_MAX_LEN] = { 0 };
    BEGIN_TEST;
    size_t sz;
    zx_status_t status = zx_cprng_draw(buf, sizeof(buf), &sz);
    EXPECT_EQ(status, ZX_OK, "");
    EXPECT_EQ(sz, sizeof(buf), "");

    int num_zeros = 0;
    for (unsigned int i = 0; i < sizeof(buf); ++i) {
        if (buf[i] == 0) {
            num_zeros++;
        }
    }
    // The probability of getting more than 16 zeros if the buf is 256 bytes
    // is 6.76 * 10^-16, so probably not gonna happen.
    EXPECT_LE(num_zeros, 16, "buffer wasn't written to");
    END_TEST;
}

bool cprng_test_add_entropy_bad_buf(void) {
    uint8_t buf[ZX_CPRNG_ADD_ENTROPY_MAX_LEN];
    BEGIN_TEST;
    zx_status_t status = zx_cprng_add_entropy((void*)4, sizeof(buf));
    EXPECT_EQ(status, ZX_ERR_INVALID_ARGS, "");
    END_TEST;
}

bool cprng_test_add_entropy_buf_too_large(void) {
    uint8_t buf[ZX_CPRNG_ADD_ENTROPY_MAX_LEN + 1];
    BEGIN_TEST;
    zx_status_t status = zx_cprng_add_entropy(buf, sizeof(buf));
    EXPECT_EQ(status, ZX_ERR_INVALID_ARGS, "");
    END_TEST;
}

BEGIN_TEST_CASE(cprng_tests)
RUN_TEST(cprng_test_draw_buf_too_large)
RUN_TEST(cprng_test_draw_bad_buf)
RUN_TEST(cprng_test_draw_success)
RUN_TEST(cprng_test_add_entropy_buf_too_large)
RUN_TEST(cprng_test_add_entropy_bad_buf)
END_TEST_CASE(cprng_tests)

int main(int argc, char** argv) {
    return unittest_run_all_tests(argc, argv) ? 0 : -1;
}
