blob: 16aa5686fa45fde949252df106b6504f5dd37c19 [file] [log] [blame]
Darin Petkov7a22d792010-11-08 14:10:00 -08001// Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include <string>
6#include <vector>
7
8#include <gtest/gtest.h>
9
10#include "update_engine/full_update_generator.h"
11#include "update_engine/test_utils.h"
12
13using std::string;
14using std::vector;
15
16namespace chromeos_update_engine {
17
18namespace {
19 const size_t kBlockSize = 4096;
20} // namespace {}
21
22
23class FullUpdateGeneratorTest : public ::testing::Test { };
24
25
26TEST(FullUpdateGeneratorTest, RunTest) {
27 vector<char> new_root(20 * 1024 * 1024);
28 vector<char> new_kern(16 * 1024 * 1024);
29 const off_t kChunkSize = 128 * 1024;
30 FillWithData(&new_root);
31 FillWithData(&new_kern);
32 // Assume hashes take 2 MiB beyond the rootfs.
33 off_t new_rootfs_size = new_root.size() - 2 * 1024 * 1024;
34
35 string new_root_path;
36 EXPECT_TRUE(utils::MakeTempFile("/tmp/NewFullUpdateTest_R.XXXXXX",
37 &new_root_path,
38 NULL));
39 ScopedPathUnlinker new_root_path_unlinker(new_root_path);
40 EXPECT_TRUE(WriteFileVector(new_root_path, new_root));
41
42 string new_kern_path;
43 EXPECT_TRUE(utils::MakeTempFile("/tmp/NewFullUpdateTest_K.XXXXXX",
44 &new_kern_path,
45 NULL));
46 ScopedPathUnlinker new_kern_path_unlinker(new_kern_path);
47 EXPECT_TRUE(WriteFileVector(new_kern_path, new_kern));
48
49 string out_blobs_path;
50 int out_blobs_fd;
51 EXPECT_TRUE(utils::MakeTempFile("/tmp/NewFullUpdateTest_D.XXXXXX",
52 &out_blobs_path,
53 &out_blobs_fd));
54 ScopedPathUnlinker out_blobs_path_unlinker(out_blobs_path);
55 ScopedFdCloser out_blobs_fd_closer(&out_blobs_fd);
56
57 off_t out_blobs_length = 0;
58
59 Graph graph;
60 vector<DeltaArchiveManifest_InstallOperation> kernel_ops;
61 vector<Vertex::Index> final_order;
62
63 EXPECT_TRUE(FullUpdateGenerator::Run(&graph,
64 new_kern_path,
65 new_root_path,
66 new_rootfs_size,
67 out_blobs_fd,
68 &out_blobs_length,
69 kChunkSize,
70 kBlockSize,
71 &kernel_ops,
72 &final_order));
73 EXPECT_EQ(new_rootfs_size / kChunkSize, graph.size());
74 EXPECT_EQ(new_rootfs_size / kChunkSize, final_order.size());
75 EXPECT_EQ(new_kern.size() / kChunkSize, kernel_ops.size());
76 for (off_t i = 0; i < (new_rootfs_size / kChunkSize); ++i) {
77 EXPECT_EQ(i, final_order[i]);
78 EXPECT_EQ(1, graph[i].op.dst_extents_size());
79 EXPECT_EQ(i * kChunkSize / kBlockSize,
80 graph[i].op.dst_extents(0).start_block()) << "i = " << i;
81 EXPECT_EQ(kChunkSize / kBlockSize,
82 graph[i].op.dst_extents(0).num_blocks());
83 if (graph[i].op.type() !=
84 DeltaArchiveManifest_InstallOperation_Type_REPLACE) {
85 EXPECT_EQ(DeltaArchiveManifest_InstallOperation_Type_REPLACE_BZ,
86 graph[i].op.type());
87 }
88 }
89}
90
91} // namespace chromeos_update_engine