/* $Id$
*
* 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.
*/

#include <gtest/gtest.h>
#include "capu/os/File.h"

TEST(File, ConstructorTest) {
  capu::File* f1 = new capu::File("foobar.txt", "r");
  EXPECT_TRUE(f1 != NULL);
  EXPECT_FALSE(f1->isOpen());
  delete f1;

  capu::File* f2 = new capu::File("test.txt", "w");
  EXPECT_TRUE(f1 != NULL);
  EXPECT_TRUE(f1->isOpen());
  delete f2;
}

TEST(File, IsOpenTest) {
  capu::File* f1 = new capu::File("foobar.txt", "r");
  EXPECT_TRUE(f1 != NULL);
  EXPECT_FALSE(f1->isOpen());
  delete f1;

  capu::File* f2 = new capu::File("test.txt", "w");
  EXPECT_TRUE(f2 != NULL);
  EXPECT_TRUE(f2->isOpen());
  delete f2;
}

TEST(File, WriteTest) {
  char buf1[15] = "This is a test";
  capu::status_t status;

  capu::File* f1 = new capu::File("test.txt", "w");
  EXPECT_TRUE(f1 != NULL);
  EXPECT_TRUE(f1->isOpen());

  // invalid params
  status = f1->write(NULL, 0);
  EXPECT_TRUE(status == capu::CAPU_EINVAL);

  // write data
  status = f1->write(buf1, sizeof(buf1)-1);
  EXPECT_TRUE(status == capu::CAPU_OK);

  delete f1;
}

TEST(File, ReadTest) {
  char buf1[20] = "This is a test";
  char buf2[20];
  
  capu::status_t status;
  capu::int32_t read = 0;

  // read data
  capu::File* f1 = new capu::File("test1.txt", "r");
  EXPECT_TRUE(f1 != NULL);
  EXPECT_FALSE(f1->isOpen());

  // file not open
  status = f1->write(buf2, strlen(buf1));
  EXPECT_TRUE(status == capu::CAPU_ERROR);

  delete f1;

  // write data
  capu::File* f2 = new capu::File("test.txt", "w");
  EXPECT_TRUE(f2 != NULL);
  EXPECT_TRUE(f2->isOpen());

  status = f2->write(buf1, strlen(buf1));
  EXPECT_TRUE(status == capu::CAPU_OK);
  delete f2;

  // read data
  capu::File* f3 = new capu::File("test.txt", "r");
  EXPECT_TRUE(f3 != NULL);
  EXPECT_TRUE(f3->isOpen());

  // invalid params
  status = f3->read(NULL, 0, NULL);
  EXPECT_TRUE(status == capu::CAPU_EINVAL);

  read = 0;
  memset(buf2, 0, sizeof(buf2));
  status = f3->read(buf2, strlen(buf1), &read);
  EXPECT_TRUE(status == capu::CAPU_OK);
  EXPECT_TRUE(read == (capu::uint32_t)strlen(buf1));
  delete f3;

  // read data
  capu::File* f4 = new capu::File("test.txt", "r");
  EXPECT_TRUE(f4 != NULL);
  EXPECT_TRUE(f4->isOpen());

  memset(buf2, 0, sizeof(buf2));
  status = f4->read(buf2, strlen(buf1), NULL);
  EXPECT_TRUE(status == capu::CAPU_OK);
  EXPECT_TRUE(read == (capu::uint32_t)strlen(buf1));
  delete f4;

  // read data Eof
  capu::File* f5 = new capu::File("test.txt", "r");
  EXPECT_TRUE(f5 != NULL);
  EXPECT_TRUE(f5->isOpen());

  read = 0;
  memset(buf2, 0, sizeof(buf2));
  status = f5->read(buf2, sizeof(buf2), &read);
  EXPECT_TRUE(status == capu::CAPU_EOF);
  EXPECT_TRUE(read == (capu::uint32_t)strlen(buf1));
  EXPECT_TRUE(strcmp(buf1, buf2) == 0);
  delete f5;
}
