1e462795ff5d4c7359f9e8637c10544bb2de70107tturney// Tencent is pleased to support the open source community by making RapidJSON available. 2e462795ff5d4c7359f9e8637c10544bb2de70107tturney// 3e462795ff5d4c7359f9e8637c10544bb2de70107tturney// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. 4e462795ff5d4c7359f9e8637c10544bb2de70107tturney// 5e462795ff5d4c7359f9e8637c10544bb2de70107tturney// Licensed under the MIT License (the "License"); you may not use this file except 6e462795ff5d4c7359f9e8637c10544bb2de70107tturney// in compliance with the License. You may obtain a copy of the License at 7e462795ff5d4c7359f9e8637c10544bb2de70107tturney// 8e462795ff5d4c7359f9e8637c10544bb2de70107tturney// http://opensource.org/licenses/MIT 9e462795ff5d4c7359f9e8637c10544bb2de70107tturney// 10e462795ff5d4c7359f9e8637c10544bb2de70107tturney// Unless required by applicable law or agreed to in writing, software distributed 11e462795ff5d4c7359f9e8637c10544bb2de70107tturney// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR 12e462795ff5d4c7359f9e8637c10544bb2de70107tturney// CONDITIONS OF ANY KIND, either express or implied. See the License for the 13e462795ff5d4c7359f9e8637c10544bb2de70107tturney// specific language governing permissions and limitations under the License. 14e462795ff5d4c7359f9e8637c10544bb2de70107tturney 15e462795ff5d4c7359f9e8637c10544bb2de70107tturney#include "unittest.h" 16e462795ff5d4c7359f9e8637c10544bb2de70107tturney#include "rapidjson/filereadstream.h" 17e462795ff5d4c7359f9e8637c10544bb2de70107tturney#include "rapidjson/filewritestream.h" 18e462795ff5d4c7359f9e8637c10544bb2de70107tturney#include "rapidjson/encodedstream.h" 19e462795ff5d4c7359f9e8637c10544bb2de70107tturney 20e462795ff5d4c7359f9e8637c10544bb2de70107tturneyusing namespace rapidjson; 21e462795ff5d4c7359f9e8637c10544bb2de70107tturney 22e462795ff5d4c7359f9e8637c10544bb2de70107tturneyclass FileStreamTest : public ::testing::Test { 23e462795ff5d4c7359f9e8637c10544bb2de70107tturneypublic: 24e462795ff5d4c7359f9e8637c10544bb2de70107tturney FileStreamTest() : filename_(), json_(), length_() {} 25e462795ff5d4c7359f9e8637c10544bb2de70107tturney 26e462795ff5d4c7359f9e8637c10544bb2de70107tturney virtual void SetUp() { 27e462795ff5d4c7359f9e8637c10544bb2de70107tturney const char *paths[] = { 28e462795ff5d4c7359f9e8637c10544bb2de70107tturney "data/sample.json", 29e462795ff5d4c7359f9e8637c10544bb2de70107tturney "bin/data/sample.json", 30e462795ff5d4c7359f9e8637c10544bb2de70107tturney "../bin/data/sample.json", 31e462795ff5d4c7359f9e8637c10544bb2de70107tturney "../../bin/data/sample.json", 32e462795ff5d4c7359f9e8637c10544bb2de70107tturney "../../../bin/data/sample.json" 33e462795ff5d4c7359f9e8637c10544bb2de70107tturney }; 34e462795ff5d4c7359f9e8637c10544bb2de70107tturney FILE* fp = 0; 35e462795ff5d4c7359f9e8637c10544bb2de70107tturney for (size_t i = 0; i < sizeof(paths) / sizeof(paths[0]); i++) { 36e462795ff5d4c7359f9e8637c10544bb2de70107tturney fp = fopen(paths[i], "rb"); 37e462795ff5d4c7359f9e8637c10544bb2de70107tturney if (fp) { 38e462795ff5d4c7359f9e8637c10544bb2de70107tturney filename_ = paths[i]; 39e462795ff5d4c7359f9e8637c10544bb2de70107tturney break; 40e462795ff5d4c7359f9e8637c10544bb2de70107tturney } 41e462795ff5d4c7359f9e8637c10544bb2de70107tturney } 42e462795ff5d4c7359f9e8637c10544bb2de70107tturney ASSERT_TRUE(fp != 0); 43e462795ff5d4c7359f9e8637c10544bb2de70107tturney 44e462795ff5d4c7359f9e8637c10544bb2de70107tturney fseek(fp, 0, SEEK_END); 45e462795ff5d4c7359f9e8637c10544bb2de70107tturney length_ = (size_t)ftell(fp); 46e462795ff5d4c7359f9e8637c10544bb2de70107tturney fseek(fp, 0, SEEK_SET); 47e462795ff5d4c7359f9e8637c10544bb2de70107tturney json_ = (char*)malloc(length_ + 1); 48e462795ff5d4c7359f9e8637c10544bb2de70107tturney size_t readLength = fread(json_, 1, length_, fp); 49e462795ff5d4c7359f9e8637c10544bb2de70107tturney json_[readLength] = '\0'; 50e462795ff5d4c7359f9e8637c10544bb2de70107tturney fclose(fp); 51e462795ff5d4c7359f9e8637c10544bb2de70107tturney } 52e462795ff5d4c7359f9e8637c10544bb2de70107tturney 53e462795ff5d4c7359f9e8637c10544bb2de70107tturney virtual void TearDown() { 54e462795ff5d4c7359f9e8637c10544bb2de70107tturney free(json_); 55e462795ff5d4c7359f9e8637c10544bb2de70107tturney json_ = 0; 56e462795ff5d4c7359f9e8637c10544bb2de70107tturney } 57e462795ff5d4c7359f9e8637c10544bb2de70107tturney 58e462795ff5d4c7359f9e8637c10544bb2de70107tturneyprivate: 59e462795ff5d4c7359f9e8637c10544bb2de70107tturney FileStreamTest(const FileStreamTest&); 60e462795ff5d4c7359f9e8637c10544bb2de70107tturney FileStreamTest& operator=(const FileStreamTest&); 61e462795ff5d4c7359f9e8637c10544bb2de70107tturney 62e462795ff5d4c7359f9e8637c10544bb2de70107tturneyprotected: 63e462795ff5d4c7359f9e8637c10544bb2de70107tturney const char* filename_; 64e462795ff5d4c7359f9e8637c10544bb2de70107tturney char *json_; 65e462795ff5d4c7359f9e8637c10544bb2de70107tturney size_t length_; 66e462795ff5d4c7359f9e8637c10544bb2de70107tturney}; 67e462795ff5d4c7359f9e8637c10544bb2de70107tturney 68e462795ff5d4c7359f9e8637c10544bb2de70107tturneyTEST_F(FileStreamTest, FileReadStream) { 69e462795ff5d4c7359f9e8637c10544bb2de70107tturney FILE *fp = fopen(filename_, "rb"); 70e462795ff5d4c7359f9e8637c10544bb2de70107tturney ASSERT_TRUE(fp != 0); 71e462795ff5d4c7359f9e8637c10544bb2de70107tturney char buffer[65536]; 72e462795ff5d4c7359f9e8637c10544bb2de70107tturney FileReadStream s(fp, buffer, sizeof(buffer)); 73e462795ff5d4c7359f9e8637c10544bb2de70107tturney 74e462795ff5d4c7359f9e8637c10544bb2de70107tturney for (size_t i = 0; i < length_; i++) { 75e462795ff5d4c7359f9e8637c10544bb2de70107tturney EXPECT_EQ(json_[i], s.Peek()); 76e462795ff5d4c7359f9e8637c10544bb2de70107tturney EXPECT_EQ(json_[i], s.Peek()); // 2nd time should be the same 77e462795ff5d4c7359f9e8637c10544bb2de70107tturney EXPECT_EQ(json_[i], s.Take()); 78e462795ff5d4c7359f9e8637c10544bb2de70107tturney } 79e462795ff5d4c7359f9e8637c10544bb2de70107tturney 80e462795ff5d4c7359f9e8637c10544bb2de70107tturney EXPECT_EQ(length_, s.Tell()); 81e462795ff5d4c7359f9e8637c10544bb2de70107tturney EXPECT_EQ('\0', s.Peek()); 82e462795ff5d4c7359f9e8637c10544bb2de70107tturney 83e462795ff5d4c7359f9e8637c10544bb2de70107tturney fclose(fp); 84e462795ff5d4c7359f9e8637c10544bb2de70107tturney} 85e462795ff5d4c7359f9e8637c10544bb2de70107tturney 86e462795ff5d4c7359f9e8637c10544bb2de70107tturneyTEST_F(FileStreamTest, FileWriteStream) { 87e462795ff5d4c7359f9e8637c10544bb2de70107tturney char filename[L_tmpnam]; 88e462795ff5d4c7359f9e8637c10544bb2de70107tturney FILE* fp = TempFile(filename); 89e462795ff5d4c7359f9e8637c10544bb2de70107tturney 90e462795ff5d4c7359f9e8637c10544bb2de70107tturney char buffer[65536]; 91e462795ff5d4c7359f9e8637c10544bb2de70107tturney FileWriteStream os(fp, buffer, sizeof(buffer)); 92e462795ff5d4c7359f9e8637c10544bb2de70107tturney for (size_t i = 0; i < length_; i++) 93e462795ff5d4c7359f9e8637c10544bb2de70107tturney os.Put(json_[i]); 94e462795ff5d4c7359f9e8637c10544bb2de70107tturney os.Flush(); 95e462795ff5d4c7359f9e8637c10544bb2de70107tturney fclose(fp); 96e462795ff5d4c7359f9e8637c10544bb2de70107tturney 97e462795ff5d4c7359f9e8637c10544bb2de70107tturney // Read it back to verify 98e462795ff5d4c7359f9e8637c10544bb2de70107tturney fp = fopen(filename, "rb"); 99e462795ff5d4c7359f9e8637c10544bb2de70107tturney FileReadStream is(fp, buffer, sizeof(buffer)); 100e462795ff5d4c7359f9e8637c10544bb2de70107tturney 101e462795ff5d4c7359f9e8637c10544bb2de70107tturney for (size_t i = 0; i < length_; i++) 102e462795ff5d4c7359f9e8637c10544bb2de70107tturney EXPECT_EQ(json_[i], is.Take()); 103e462795ff5d4c7359f9e8637c10544bb2de70107tturney 104e462795ff5d4c7359f9e8637c10544bb2de70107tturney EXPECT_EQ(length_, is.Tell()); 105e462795ff5d4c7359f9e8637c10544bb2de70107tturney fclose(fp); 106e462795ff5d4c7359f9e8637c10544bb2de70107tturney 107e462795ff5d4c7359f9e8637c10544bb2de70107tturney //std::cout << filename << std::endl; 108e462795ff5d4c7359f9e8637c10544bb2de70107tturney remove(filename); 109e462795ff5d4c7359f9e8637c10544bb2de70107tturney} 110