1198b46f1fea3f47ef8eb6317799c0d77aaec52f6Seigo Nonaka/*
2198b46f1fea3f47ef8eb6317799c0d77aaec52f6Seigo Nonaka * Copyright (C) 2015 The Android Open Source Project
3198b46f1fea3f47ef8eb6317799c0d77aaec52f6Seigo Nonaka *
4198b46f1fea3f47ef8eb6317799c0d77aaec52f6Seigo Nonaka * Licensed under the Apache License, Version 2.0 (the "License");
5198b46f1fea3f47ef8eb6317799c0d77aaec52f6Seigo Nonaka * you may not use this file except in compliance with the License.
6198b46f1fea3f47ef8eb6317799c0d77aaec52f6Seigo Nonaka * You may obtain a copy of the License at
7198b46f1fea3f47ef8eb6317799c0d77aaec52f6Seigo Nonaka *
8198b46f1fea3f47ef8eb6317799c0d77aaec52f6Seigo Nonaka *      http://www.apache.org/licenses/LICENSE-2.0
9198b46f1fea3f47ef8eb6317799c0d77aaec52f6Seigo Nonaka *
10198b46f1fea3f47ef8eb6317799c0d77aaec52f6Seigo Nonaka * Unless required by applicable law or agreed to in writing, software
11198b46f1fea3f47ef8eb6317799c0d77aaec52f6Seigo Nonaka * distributed under the License is distributed on an "AS IS" BASIS,
12198b46f1fea3f47ef8eb6317799c0d77aaec52f6Seigo Nonaka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13198b46f1fea3f47ef8eb6317799c0d77aaec52f6Seigo Nonaka * See the License for the specific language governing permissions and
14198b46f1fea3f47ef8eb6317799c0d77aaec52f6Seigo Nonaka * limitations under the License.
15198b46f1fea3f47ef8eb6317799c0d77aaec52f6Seigo Nonaka */
16198b46f1fea3f47ef8eb6317799c0d77aaec52f6Seigo Nonaka
171be4ac71900ca2258491a4d0b72a4bebce19da71Seigo Nonaka#ifndef MINIKIN_TEST_ICU_ENVIRONMENT_H
181be4ac71900ca2258491a4d0b72a4bebce19da71Seigo Nonaka#define MINIKIN_TEST_ICU_ENVIRONMENT_H
19198b46f1fea3f47ef8eb6317799c0d77aaec52f6Seigo Nonaka
20198b46f1fea3f47ef8eb6317799c0d77aaec52f6Seigo Nonaka// low level file access for mapping ICU data
21198b46f1fea3f47ef8eb6317799c0d77aaec52f6Seigo Nonaka#include <fcntl.h>
22198b46f1fea3f47ef8eb6317799c0d77aaec52f6Seigo Nonaka#include <sys/mman.h>
236c8722e217ff5238f0b849152d7936959a728103Seigo Nonaka#include <sys/stat.h>
24198b46f1fea3f47ef8eb6317799c0d77aaec52f6Seigo Nonaka
251be4ac71900ca2258491a4d0b72a4bebce19da71Seigo Nonaka#include <cutils/log.h>
261d461589869ee5b7102f96271b0ef0a776ab513cSeigo Nonaka#include <gtest/gtest.h>
271d461589869ee5b7102f96271b0ef0a776ab513cSeigo Nonaka#include <unicode/uclean.h>
281d461589869ee5b7102f96271b0ef0a776ab513cSeigo Nonaka#include <unicode/udata.h>
291d461589869ee5b7102f96271b0ef0a776ab513cSeigo Nonaka
3014e2d136aaef271ba131f917cf5f27baa31ae5adSeigo Nonakanamespace minikin {
3114e2d136aaef271ba131f917cf5f27baa31ae5adSeigo Nonaka
321be4ac71900ca2258491a4d0b72a4bebce19da71Seigo Nonakaclass ICUEnvironment : public testing::Environment {
331be4ac71900ca2258491a4d0b72a4bebce19da71Seigo Nonakapublic:
341be4ac71900ca2258491a4d0b72a4bebce19da71Seigo Nonaka    ICUEnvironment() : testing::Environment(), mData(nullptr), mSize(0) {}
351be4ac71900ca2258491a4d0b72a4bebce19da71Seigo Nonaka
361be4ac71900ca2258491a4d0b72a4bebce19da71Seigo Nonaka    void* mData;
371be4ac71900ca2258491a4d0b72a4bebce19da71Seigo Nonaka    size_t mSize;
381be4ac71900ca2258491a4d0b72a4bebce19da71Seigo Nonaka
39198b46f1fea3f47ef8eb6317799c0d77aaec52f6Seigo Nonaka    virtual void SetUp() override {
40198b46f1fea3f47ef8eb6317799c0d77aaec52f6Seigo Nonaka        const char* fn = "/system/usr/icu/" U_ICUDATA_NAME ".dat";
41198b46f1fea3f47ef8eb6317799c0d77aaec52f6Seigo Nonaka        int fd = open(fn, O_RDONLY);
421be4ac71900ca2258491a4d0b72a4bebce19da71Seigo Nonaka        LOG_ALWAYS_FATAL_IF(fd == -1);
43198b46f1fea3f47ef8eb6317799c0d77aaec52f6Seigo Nonaka        struct stat sb;
441be4ac71900ca2258491a4d0b72a4bebce19da71Seigo Nonaka        LOG_ALWAYS_FATAL_IF(fstat(fd, &sb) != 0);
451be4ac71900ca2258491a4d0b72a4bebce19da71Seigo Nonaka
461be4ac71900ca2258491a4d0b72a4bebce19da71Seigo Nonaka        mSize = sb.st_size;
471be4ac71900ca2258491a4d0b72a4bebce19da71Seigo Nonaka        void* mData = mmap(nullptr, mSize, PROT_READ, MAP_SHARED, fd, 0);
4881414ed276207225d64469974c82b5742504b9e9Seigo Nonaka        close(fd);
49198b46f1fea3f47ef8eb6317799c0d77aaec52f6Seigo Nonaka
50198b46f1fea3f47ef8eb6317799c0d77aaec52f6Seigo Nonaka        UErrorCode errorCode = U_ZERO_ERROR;
511be4ac71900ca2258491a4d0b72a4bebce19da71Seigo Nonaka        udata_setCommonData(mData, &errorCode);
521be4ac71900ca2258491a4d0b72a4bebce19da71Seigo Nonaka        LOG_ALWAYS_FATAL_IF(U_FAILURE(errorCode));
531be4ac71900ca2258491a4d0b72a4bebce19da71Seigo Nonaka
541be4ac71900ca2258491a4d0b72a4bebce19da71Seigo Nonaka        errorCode = U_ZERO_ERROR;
55198b46f1fea3f47ef8eb6317799c0d77aaec52f6Seigo Nonaka        u_init(&errorCode);
561be4ac71900ca2258491a4d0b72a4bebce19da71Seigo Nonaka        LOG_ALWAYS_FATAL_IF(U_FAILURE(errorCode));
57198b46f1fea3f47ef8eb6317799c0d77aaec52f6Seigo Nonaka    }
58198b46f1fea3f47ef8eb6317799c0d77aaec52f6Seigo Nonaka
591be4ac71900ca2258491a4d0b72a4bebce19da71Seigo Nonaka    virtual void TearDown() override {
601be4ac71900ca2258491a4d0b72a4bebce19da71Seigo Nonaka        u_cleanup();
611be4ac71900ca2258491a4d0b72a4bebce19da71Seigo Nonaka        munmap(mData, mSize);
621be4ac71900ca2258491a4d0b72a4bebce19da71Seigo Nonaka    }
63198b46f1fea3f47ef8eb6317799c0d77aaec52f6Seigo Nonaka};
64198b46f1fea3f47ef8eb6317799c0d77aaec52f6Seigo Nonaka
6514e2d136aaef271ba131f917cf5f27baa31ae5adSeigo Nonaka}  // namespace minikin
661be4ac71900ca2258491a4d0b72a4bebce19da71Seigo Nonaka#endif  //  MINIKIN_TEST_ICU_ENVIRONMENT_H
67