1aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo//
2aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// Copyright (C) 2015 The Android Open Source Project
3aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo//
4aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// Licensed under the Apache License, Version 2.0 (the "License");
5aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// you may not use this file except in compliance with the License.
6aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// You may obtain a copy of the License at
7aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo//
8aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo//      http://www.apache.org/licenses/LICENSE-2.0
9aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo//
10aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// Unless required by applicable law or agreed to in writing, software
11aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// distributed under the License is distributed on an "AS IS" BASIS,
12aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// See the License for the specific language governing permissions and
14aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// limitations under the License.
15aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo//
1614158570d3995008dc93a628004118b87a6bca01Alex Deymo
1714158570d3995008dc93a628004118b87a6bca01Alex Deymo#include "update_engine/payload_generator/payload_file.h"
1814158570d3995008dc93a628004118b87a6bca01Alex Deymo
1914158570d3995008dc93a628004118b87a6bca01Alex Deymo#include <string>
2014158570d3995008dc93a628004118b87a6bca01Alex Deymo#include <utility>
2114158570d3995008dc93a628004118b87a6bca01Alex Deymo#include <vector>
2214158570d3995008dc93a628004118b87a6bca01Alex Deymo
2314158570d3995008dc93a628004118b87a6bca01Alex Deymo#include <gtest/gtest.h>
2414158570d3995008dc93a628004118b87a6bca01Alex Deymo
2539910dcd1d68987ccee7c3031dc269233a8490bbAlex Deymo#include "update_engine/common/test_utils.h"
2614158570d3995008dc93a628004118b87a6bca01Alex Deymo#include "update_engine/payload_generator/extent_ranges.h"
2714158570d3995008dc93a628004118b87a6bca01Alex Deymo
2814158570d3995008dc93a628004118b87a6bca01Alex Deymousing std::string;
2914158570d3995008dc93a628004118b87a6bca01Alex Deymousing std::vector;
3014158570d3995008dc93a628004118b87a6bca01Alex Deymo
3114158570d3995008dc93a628004118b87a6bca01Alex Deymonamespace chromeos_update_engine {
3214158570d3995008dc93a628004118b87a6bca01Alex Deymo
3314158570d3995008dc93a628004118b87a6bca01Alex Deymoclass PayloadFileTest : public ::testing::Test {
3414158570d3995008dc93a628004118b87a6bca01Alex Deymo protected:
3514158570d3995008dc93a628004118b87a6bca01Alex Deymo  PayloadFile payload_;
3614158570d3995008dc93a628004118b87a6bca01Alex Deymo};
3714158570d3995008dc93a628004118b87a6bca01Alex Deymo
3814158570d3995008dc93a628004118b87a6bca01Alex DeymoTEST_F(PayloadFileTest, ReorderBlobsTest) {
3914158570d3995008dc93a628004118b87a6bca01Alex Deymo  string orig_blobs;
4014158570d3995008dc93a628004118b87a6bca01Alex Deymo  EXPECT_TRUE(utils::MakeTempFile("ReorderBlobsTest.orig.XXXXXX", &orig_blobs,
4114158570d3995008dc93a628004118b87a6bca01Alex Deymo                                  nullptr));
4214158570d3995008dc93a628004118b87a6bca01Alex Deymo  ScopedPathUnlinker orig_blobs_unlinker(orig_blobs);
4314158570d3995008dc93a628004118b87a6bca01Alex Deymo
4414158570d3995008dc93a628004118b87a6bca01Alex Deymo  // The operations have three blob and one gap (the whitespace):
4514158570d3995008dc93a628004118b87a6bca01Alex Deymo  // Rootfs operation 1: [8, 3] bcd
4614158570d3995008dc93a628004118b87a6bca01Alex Deymo  // Rootfs operation 2: [7, 1] a
4714158570d3995008dc93a628004118b87a6bca01Alex Deymo  // Kernel operation 1: [0, 6] kernel
4814158570d3995008dc93a628004118b87a6bca01Alex Deymo  string orig_data = "kernel abcd";
4914158570d3995008dc93a628004118b87a6bca01Alex Deymo  EXPECT_TRUE(
5014158570d3995008dc93a628004118b87a6bca01Alex Deymo      utils::WriteFile(orig_blobs.c_str(), orig_data.data(), orig_data.size()));
5114158570d3995008dc93a628004118b87a6bca01Alex Deymo
5214158570d3995008dc93a628004118b87a6bca01Alex Deymo  string new_blobs;
5314158570d3995008dc93a628004118b87a6bca01Alex Deymo  EXPECT_TRUE(
5414158570d3995008dc93a628004118b87a6bca01Alex Deymo      utils::MakeTempFile("ReorderBlobsTest.new.XXXXXX", &new_blobs, nullptr));
5514158570d3995008dc93a628004118b87a6bca01Alex Deymo  ScopedPathUnlinker new_blobs_unlinker(new_blobs);
5614158570d3995008dc93a628004118b87a6bca01Alex Deymo
57b9ef491e87c17d809368ede0196569d8a106b963Sen Jiang  payload_.part_vec_.resize(2);
58b9ef491e87c17d809368ede0196569d8a106b963Sen Jiang
5914158570d3995008dc93a628004118b87a6bca01Alex Deymo  vector<AnnotatedOperation> aops;
6014158570d3995008dc93a628004118b87a6bca01Alex Deymo  AnnotatedOperation aop;
6114158570d3995008dc93a628004118b87a6bca01Alex Deymo  aop.op.set_data_offset(8);
6214158570d3995008dc93a628004118b87a6bca01Alex Deymo  aop.op.set_data_length(3);
6314158570d3995008dc93a628004118b87a6bca01Alex Deymo  aops.push_back(aop);
6414158570d3995008dc93a628004118b87a6bca01Alex Deymo
6514158570d3995008dc93a628004118b87a6bca01Alex Deymo  aop.op.set_data_offset(7);
6614158570d3995008dc93a628004118b87a6bca01Alex Deymo  aop.op.set_data_length(1);
6714158570d3995008dc93a628004118b87a6bca01Alex Deymo  aops.push_back(aop);
68b9ef491e87c17d809368ede0196569d8a106b963Sen Jiang  payload_.part_vec_[0].aops = aops;
6914158570d3995008dc93a628004118b87a6bca01Alex Deymo
7014158570d3995008dc93a628004118b87a6bca01Alex Deymo  aop.op.set_data_offset(0);
7114158570d3995008dc93a628004118b87a6bca01Alex Deymo  aop.op.set_data_length(6);
72b9ef491e87c17d809368ede0196569d8a106b963Sen Jiang  payload_.part_vec_[1].aops = {aop};
7314158570d3995008dc93a628004118b87a6bca01Alex Deymo
7414158570d3995008dc93a628004118b87a6bca01Alex Deymo  EXPECT_TRUE(payload_.ReorderDataBlobs(orig_blobs, new_blobs));
7514158570d3995008dc93a628004118b87a6bca01Alex Deymo
76b9ef491e87c17d809368ede0196569d8a106b963Sen Jiang  const vector<AnnotatedOperation>& part0_aops = payload_.part_vec_[0].aops;
77b9ef491e87c17d809368ede0196569d8a106b963Sen Jiang  const vector<AnnotatedOperation>& part1_aops = payload_.part_vec_[1].aops;
7814158570d3995008dc93a628004118b87a6bca01Alex Deymo  string new_data;
7914158570d3995008dc93a628004118b87a6bca01Alex Deymo  EXPECT_TRUE(utils::ReadFile(new_blobs, &new_data));
8014158570d3995008dc93a628004118b87a6bca01Alex Deymo  // Kernel blobs should appear at the end.
8114158570d3995008dc93a628004118b87a6bca01Alex Deymo  EXPECT_EQ("bcdakernel", new_data);
8214158570d3995008dc93a628004118b87a6bca01Alex Deymo
8380f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo  EXPECT_EQ(2U, part0_aops.size());
8480f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo  EXPECT_EQ(0U, part0_aops[0].op.data_offset());
8580f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo  EXPECT_EQ(3U, part0_aops[0].op.data_length());
8680f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo  EXPECT_EQ(3U, part0_aops[1].op.data_offset());
8780f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo  EXPECT_EQ(1U, part0_aops[1].op.data_length());
8880f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo
8980f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo  EXPECT_EQ(1U, part1_aops.size());
9080f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo  EXPECT_EQ(4U, part1_aops[0].op.data_offset());
9180f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo  EXPECT_EQ(6U, part1_aops[0].op.data_length());
9214158570d3995008dc93a628004118b87a6bca01Alex Deymo}
9314158570d3995008dc93a628004118b87a6bca01Alex Deymo
9414158570d3995008dc93a628004118b87a6bca01Alex Deymo}  // namespace chromeos_update_engine
95