116c4d154dca43c662571129af31b27433b919a32Adam Lesinski/*
216c4d154dca43c662571129af31b27433b919a32Adam Lesinski * Copyright (C) 2010 The Android Open Source Project
316c4d154dca43c662571129af31b27433b919a32Adam Lesinski *
416c4d154dca43c662571129af31b27433b919a32Adam Lesinski * Licensed under the Apache License, Version 2.0 (the "License");
516c4d154dca43c662571129af31b27433b919a32Adam Lesinski * you may not use this file except in compliance with the License.
616c4d154dca43c662571129af31b27433b919a32Adam Lesinski * You may obtain a copy of the License at
716c4d154dca43c662571129af31b27433b919a32Adam Lesinski *
816c4d154dca43c662571129af31b27433b919a32Adam Lesinski *      http://www.apache.org/licenses/LICENSE-2.0
916c4d154dca43c662571129af31b27433b919a32Adam Lesinski *
1016c4d154dca43c662571129af31b27433b919a32Adam Lesinski * Unless required by applicable law or agreed to in writing, software
1116c4d154dca43c662571129af31b27433b919a32Adam Lesinski * distributed under the License is distributed on an "AS IS" BASIS,
1216c4d154dca43c662571129af31b27433b919a32Adam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1316c4d154dca43c662571129af31b27433b919a32Adam Lesinski * See the License for the specific language governing permissions and
1416c4d154dca43c662571129af31b27433b919a32Adam Lesinski * limitations under the License.
1516c4d154dca43c662571129af31b27433b919a32Adam Lesinski */
1616c4d154dca43c662571129af31b27433b919a32Adam Lesinski
1716c4d154dca43c662571129af31b27433b919a32Adam Lesinski#define LOG_TAG "ObbFile_test"
1816c4d154dca43c662571129af31b27433b919a32Adam Lesinski#include <androidfw/ObbFile.h>
1916c4d154dca43c662571129af31b27433b919a32Adam Lesinski#include <utils/Log.h>
2016c4d154dca43c662571129af31b27433b919a32Adam Lesinski#include <utils/RefBase.h>
2116c4d154dca43c662571129af31b27433b919a32Adam Lesinski#include <utils/String8.h>
2216c4d154dca43c662571129af31b27433b919a32Adam Lesinski
2316c4d154dca43c662571129af31b27433b919a32Adam Lesinski#include <gtest/gtest.h>
2416c4d154dca43c662571129af31b27433b919a32Adam Lesinski
2516c4d154dca43c662571129af31b27433b919a32Adam Lesinski#include <sys/types.h>
2616c4d154dca43c662571129af31b27433b919a32Adam Lesinski#include <sys/stat.h>
2716c4d154dca43c662571129af31b27433b919a32Adam Lesinski#include <fcntl.h>
2816c4d154dca43c662571129af31b27433b919a32Adam Lesinski#include <string.h>
2916c4d154dca43c662571129af31b27433b919a32Adam Lesinski
3016c4d154dca43c662571129af31b27433b919a32Adam Lesinskinamespace android {
3116c4d154dca43c662571129af31b27433b919a32Adam Lesinski
3216c4d154dca43c662571129af31b27433b919a32Adam Lesinski#define TEST_FILENAME "/test.obb"
3316c4d154dca43c662571129af31b27433b919a32Adam Lesinski
3416c4d154dca43c662571129af31b27433b919a32Adam Lesinskiclass ObbFileTest : public testing::Test {
3516c4d154dca43c662571129af31b27433b919a32Adam Lesinskiprotected:
3616c4d154dca43c662571129af31b27433b919a32Adam Lesinski    sp<ObbFile> mObbFile;
37d79e33379d56e20b7dd67baa992409b72a335dedAdam Lesinski    String8 mFileName;
3816c4d154dca43c662571129af31b27433b919a32Adam Lesinski
3916c4d154dca43c662571129af31b27433b919a32Adam Lesinski    virtual void SetUp() {
4016c4d154dca43c662571129af31b27433b919a32Adam Lesinski        mObbFile = new ObbFile();
41d79e33379d56e20b7dd67baa992409b72a335dedAdam Lesinski        char* externalStorage = getenv("EXTERNAL_STORAGE");
4216c4d154dca43c662571129af31b27433b919a32Adam Lesinski
43d79e33379d56e20b7dd67baa992409b72a335dedAdam Lesinski        mFileName.append(externalStorage);
44d79e33379d56e20b7dd67baa992409b72a335dedAdam Lesinski        mFileName.append(TEST_FILENAME);
4516c4d154dca43c662571129af31b27433b919a32Adam Lesinski
46d79e33379d56e20b7dd67baa992409b72a335dedAdam Lesinski        int fd = ::open(mFileName.string(), O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR);
4716c4d154dca43c662571129af31b27433b919a32Adam Lesinski        if (fd < 0) {
48d79e33379d56e20b7dd67baa992409b72a335dedAdam Lesinski            FAIL() << "Couldn't create " << mFileName.string() << " for tests";
4916c4d154dca43c662571129af31b27433b919a32Adam Lesinski        }
5016c4d154dca43c662571129af31b27433b919a32Adam Lesinski    }
5116c4d154dca43c662571129af31b27433b919a32Adam Lesinski
5216c4d154dca43c662571129af31b27433b919a32Adam Lesinski    virtual void TearDown() {
5316c4d154dca43c662571129af31b27433b919a32Adam Lesinski    }
5416c4d154dca43c662571129af31b27433b919a32Adam Lesinski};
5516c4d154dca43c662571129af31b27433b919a32Adam Lesinski
5616c4d154dca43c662571129af31b27433b919a32Adam LesinskiTEST_F(ObbFileTest, ReadFailure) {
5716c4d154dca43c662571129af31b27433b919a32Adam Lesinski    EXPECT_FALSE(mObbFile->readFrom(-1))
5816c4d154dca43c662571129af31b27433b919a32Adam Lesinski            << "No failure on invalid file descriptor";
5916c4d154dca43c662571129af31b27433b919a32Adam Lesinski}
6016c4d154dca43c662571129af31b27433b919a32Adam Lesinski
6116c4d154dca43c662571129af31b27433b919a32Adam LesinskiTEST_F(ObbFileTest, WriteThenRead) {
6216c4d154dca43c662571129af31b27433b919a32Adam Lesinski    const char* packageName = "com.example.obbfile";
6316c4d154dca43c662571129af31b27433b919a32Adam Lesinski    const int32_t versionNum = 1;
6416c4d154dca43c662571129af31b27433b919a32Adam Lesinski
6516c4d154dca43c662571129af31b27433b919a32Adam Lesinski    mObbFile->setPackageName(String8(packageName));
6616c4d154dca43c662571129af31b27433b919a32Adam Lesinski    mObbFile->setVersion(versionNum);
6716c4d154dca43c662571129af31b27433b919a32Adam Lesinski#define SALT_SIZE 8
6816c4d154dca43c662571129af31b27433b919a32Adam Lesinski    unsigned char salt[SALT_SIZE] = {0x01, 0x10, 0x55, 0xAA, 0xFF, 0x00, 0x5A, 0xA5};
6916c4d154dca43c662571129af31b27433b919a32Adam Lesinski    EXPECT_TRUE(mObbFile->setSalt(salt, SALT_SIZE))
7016c4d154dca43c662571129af31b27433b919a32Adam Lesinski            << "Salt should be successfully set";
7116c4d154dca43c662571129af31b27433b919a32Adam Lesinski
72d79e33379d56e20b7dd67baa992409b72a335dedAdam Lesinski    EXPECT_TRUE(mObbFile->writeTo(mFileName.string()))
7316c4d154dca43c662571129af31b27433b919a32Adam Lesinski            << "couldn't write to fake .obb file";
7416c4d154dca43c662571129af31b27433b919a32Adam Lesinski
7516c4d154dca43c662571129af31b27433b919a32Adam Lesinski    mObbFile = new ObbFile();
7616c4d154dca43c662571129af31b27433b919a32Adam Lesinski
77d79e33379d56e20b7dd67baa992409b72a335dedAdam Lesinski    EXPECT_TRUE(mObbFile->readFrom(mFileName.string()))
7816c4d154dca43c662571129af31b27433b919a32Adam Lesinski            << "couldn't read from fake .obb file";
7916c4d154dca43c662571129af31b27433b919a32Adam Lesinski
8016c4d154dca43c662571129af31b27433b919a32Adam Lesinski    EXPECT_EQ(versionNum, mObbFile->getVersion())
8116c4d154dca43c662571129af31b27433b919a32Adam Lesinski            << "version didn't come out the same as it went in";
8216c4d154dca43c662571129af31b27433b919a32Adam Lesinski    const char* currentPackageName = mObbFile->getPackageName().string();
8316c4d154dca43c662571129af31b27433b919a32Adam Lesinski    EXPECT_STREQ(packageName, currentPackageName)
8416c4d154dca43c662571129af31b27433b919a32Adam Lesinski            << "package name didn't come out the same as it went in";
8516c4d154dca43c662571129af31b27433b919a32Adam Lesinski
8616c4d154dca43c662571129af31b27433b919a32Adam Lesinski    size_t saltLen;
8716c4d154dca43c662571129af31b27433b919a32Adam Lesinski    const unsigned char* newSalt = mObbFile->getSalt(&saltLen);
8816c4d154dca43c662571129af31b27433b919a32Adam Lesinski
8916c4d154dca43c662571129af31b27433b919a32Adam Lesinski    EXPECT_EQ(sizeof(salt), saltLen)
9016c4d154dca43c662571129af31b27433b919a32Adam Lesinski            << "salt sizes were not the same";
9116c4d154dca43c662571129af31b27433b919a32Adam Lesinski
92de898ff42912bd7ca1bfb099cd439562496765a4Adam Lesinski    for (size_t i = 0; i < sizeof(salt); i++) {
9316c4d154dca43c662571129af31b27433b919a32Adam Lesinski        EXPECT_EQ(salt[i], newSalt[i])
9416c4d154dca43c662571129af31b27433b919a32Adam Lesinski                << "salt character " << i << " should be equal";
9516c4d154dca43c662571129af31b27433b919a32Adam Lesinski    }
9616c4d154dca43c662571129af31b27433b919a32Adam Lesinski    EXPECT_TRUE(memcmp(newSalt, salt, sizeof(salt)) == 0)
9716c4d154dca43c662571129af31b27433b919a32Adam Lesinski            << "salts should be the same";
9816c4d154dca43c662571129af31b27433b919a32Adam Lesinski}
9916c4d154dca43c662571129af31b27433b919a32Adam Lesinski
10016c4d154dca43c662571129af31b27433b919a32Adam Lesinski}
101