blob: a0dcbe240ade619c73ddd80ecb29f6ce63e982da [file] [log] [blame]
// Copyright 2016 Google Inc. All Rights Reserved.
// Author: germuth@google.com (Aaron Germuth)
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <sys/stat.h>
#include "gtest/gtest.h"
#define TEST_MAIN
#include "hmx_test_base.cc"
#include "hmx_upgrade_nvram.c"
// Tests Constants
const unsigned char* writeData = (unsigned char*)"ABC123def";
const unsigned int writeLen = 10;
// Test Parameterization
const unsigned int offsets[] = {NVRAM_RO_OFFSET, NVRAM_RW_OFFSET, NVRAM_RWB_OFFSET};
unsigned int offset;
class HnvramFlashTest : public HnvramTest,
public ::testing::WithParamInterface<unsigned int> {
public:
HnvramFlashTest() {}
virtual ~HnvramFlashTest() {}
virtual void SetUp() {
libupgrade_verbose = 0;
offset = GetParam();
HnvramTest::SetUp();
}
virtual void TearDown() {
HnvramTest::TearDown();
offset = 0;
}
};
TEST_P(HnvramFlashTest, TestHnvramInit) {
EXPECT_STREQ("/dev/mtd/hnvram", HMX_UPGRADE_NVRAM_Get_Partition_Path());
HMX_UPGRADE_NVRAM_Init("/tmp/abctest123");
EXPECT_STREQ("/tmp/abctest123", HMX_UPGRADE_NVRAM_Get_Partition_Path());
HMX_UPGRADE_NVRAM_Init(NULL);
EXPECT_STREQ("/dev/mtd/hnvram", HMX_UPGRADE_NVRAM_Get_Partition_Path());
}
TEST_P(HnvramFlashTest, TestFlashWrite) {
const unsigned char test[2] = "A";
// bad realpath
HMX_UPGRADE_NVRAM_Init("/fake/doesnotexist915");
EXPECT_EQ(-1, HMX_UPGRADE_NVRAM_Write(0, test, 1));
// Can't open file (because its a directory)
HMX_UPGRADE_NVRAM_Init("/tmp");
EXPECT_EQ(-1, HMX_UPGRADE_NVRAM_Write(0, test, 1));
// Can't flush device (BLKFLSBUF)
HMX_UPGRADE_NVRAM_Init("/dev/zero");
EXPECT_EQ(-1, HMX_UPGRADE_NVRAM_Write(0, test, 1));
// should succeed without actually writing, if there would is no difference
// write zeros to zero'd file
HMX_UPGRADE_NVRAM_Init(hnvramFileName);
// can check by comparing file mtime, before and after
struct stat statbuf;
EXPECT_NE(-1, stat(hnvramFileName, &statbuf));
time_t before = statbuf.st_mtime;
EXPECT_EQ(0, HMX_UPGRADE_NVRAM_Write(0, (unsigned char*)"\0\0\0", 3));
unsigned char buff[255];
HMX_UPGRADE_NVRAM_Read(0, buff, 10);
EXPECT_EQ(0, memcmp((char*)buff, "\0\0\0\0\0\0\0\0\0\0", 10));
memset(buff, 0, sizeof(buff));
EXPECT_NE(-1, stat(hnvramFileName, &statbuf));
time_t after = statbuf.st_mtime;
EXPECT_EQ(before, after);
// verify writes with read and HMX_Read
HMX_UPGRADE_NVRAM_Init(hnvramFileName);
int fp = open(hnvramFileName, O_RDONLY);
EXPECT_EQ(0, HMX_UPGRADE_NVRAM_Write(offset, writeData, writeLen));
EXPECT_EQ(offset, lseek(fp, offset, SEEK_SET));
EXPECT_EQ(writeLen, read(fp, buff, writeLen));
EXPECT_EQ(0, memcmp((char*)buff, (char*)writeData, writeLen));
memset(buff, 0, sizeof(buff));
EXPECT_EQ(0, HMX_UPGRADE_NVRAM_Read(offset, buff, writeLen));
EXPECT_EQ(0, memcmp((char*)buff, (char*)writeData, writeLen));
close(fp);
}
TEST_P(HnvramFlashTest, TestFlashRead) {
unsigned char read_buffer[10];
// bad realpath
HMX_UPGRADE_NVRAM_Init("/fake/doesnotexist915");
EXPECT_EQ(-1, HMX_UPGRADE_NVRAM_Read(0, read_buffer, 0));
// Can't open file (because its a directory)
HMX_UPGRADE_NVRAM_Init("/tmp");
EXPECT_EQ(-1, HMX_UPGRADE_NVRAM_Read(0, read_buffer, 0));
// Can't read file because permissions
HMX_UPGRADE_NVRAM_Init("/proc/version");
EXPECT_EQ(-1, HMX_UPGRADE_NVRAM_Read(0, read_buffer, 10000000));
// File should be completely empty
HMX_UPGRADE_NVRAM_Init(hnvramFileName);
unsigned char buff[255];
EXPECT_EQ(0, HMX_UPGRADE_NVRAM_Read(offset, buff, writeLen));
EXPECT_EQ(0, memcmp((char*)buff, "\0\0\0\0\0\0\0\0\0\0", writeLen));
memset((char*)buff, 0, sizeof(buff));
// Should be able to HMX_Read data from raw C writes
int fp = open(hnvramFileName, O_WRONLY);
EXPECT_EQ(offset, lseek(fp, offset, SEEK_SET));
EXPECT_EQ(writeLen, write(fp, writeData, writeLen));
close(fp);
EXPECT_EQ(0, HMX_UPGRADE_NVRAM_Read(offset, buff, writeLen));
EXPECT_EQ(0, memcmp((char*)buff, writeData, writeLen));
}
INSTANTIATE_TEST_CASE_P(TryAllOffsets, HnvramFlashTest,
::testing::ValuesIn(offsets));
int main(int argc, char** argv) {
::testing::InitGoogleTest(&argc, argv);
::testing::AddGlobalTestEnvironment(new HnvramEnvironment());
return RUN_ALL_TESTS();
}