1*288bf522SAndroid Build Coastguard Worker#!/usr/bin/env python 2*288bf522SAndroid Build Coastguard Worker# 3*288bf522SAndroid Build Coastguard Worker# Copyright (C) 2018 The Android Open Source Project 4*288bf522SAndroid Build Coastguard Worker# 5*288bf522SAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); 6*288bf522SAndroid Build Coastguard Worker# you may not use this file except in compliance with the License. 7*288bf522SAndroid Build Coastguard Worker# You may obtain a copy of the License at 8*288bf522SAndroid Build Coastguard Worker# 9*288bf522SAndroid Build Coastguard Worker# http://www.apache.org/licenses/LICENSE-2.0 10*288bf522SAndroid Build Coastguard Worker# 11*288bf522SAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 12*288bf522SAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, 13*288bf522SAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14*288bf522SAndroid Build Coastguard Worker# See the License for the specific language governing permissions and 15*288bf522SAndroid Build Coastguard Worker# limitations under the License. 16*288bf522SAndroid Build Coastguard Worker 17*288bf522SAndroid Build Coastguard Workerimport unittest 18*288bf522SAndroid Build Coastguard Worker 19*288bf522SAndroid Build Coastguard Workerimport mkuserimg_mke2fs 20*288bf522SAndroid Build Coastguard Worker 21*288bf522SAndroid Build Coastguard Workerclass MkuserimgMke2fsTest(unittest.TestCase): 22*288bf522SAndroid Build Coastguard Worker def setUp(self): 23*288bf522SAndroid Build Coastguard Worker self.optional_arguments = { 24*288bf522SAndroid Build Coastguard Worker "-j": "10", "-T": "1230768000.0", "-C": "fs_config", 25*288bf522SAndroid Build Coastguard Worker "-D": "product_out", "-B": "block_list_file", 26*288bf522SAndroid Build Coastguard Worker "-d": "base_alloc_file_in", "-A": "base_alloc_file_out", 27*288bf522SAndroid Build Coastguard Worker "-L": "label", "-i": "20", "-M": "30", "-e": "8192", 28*288bf522SAndroid Build Coastguard Worker "-o": "16384", "-U": "mke2fs_uuid", "-S": "mke2fs_hash_seed", 29*288bf522SAndroid Build Coastguard Worker } 30*288bf522SAndroid Build Coastguard Worker 31*288bf522SAndroid Build Coastguard Worker def test_parse_arguments_smoke(self): 32*288bf522SAndroid Build Coastguard Worker args_list = ["source_directory", "output_file", "ext4", "data", "8192"] 33*288bf522SAndroid Build Coastguard Worker for key, value in self.optional_arguments.items(): 34*288bf522SAndroid Build Coastguard Worker args_list += [key, value] 35*288bf522SAndroid Build Coastguard Worker args_list.append("-c") 36*288bf522SAndroid Build Coastguard Worker 37*288bf522SAndroid Build Coastguard Worker args = mkuserimg_mke2fs.ParseArguments(args_list) 38*288bf522SAndroid Build Coastguard Worker 39*288bf522SAndroid Build Coastguard Worker self.assertEqual("source_directory", args.src_dir) 40*288bf522SAndroid Build Coastguard Worker self.assertEqual("output_file", args.output_file) 41*288bf522SAndroid Build Coastguard Worker self.assertEqual("ext4", args.ext_variant) 42*288bf522SAndroid Build Coastguard Worker self.assertEqual("data", args.mount_point) 43*288bf522SAndroid Build Coastguard Worker self.assertEqual("8192", args.fs_size) 44*288bf522SAndroid Build Coastguard Worker 45*288bf522SAndroid Build Coastguard Worker self.assertFalse(args.android_sparse) 46*288bf522SAndroid Build Coastguard Worker self.assertEqual("10", args.journal_size) 47*288bf522SAndroid Build Coastguard Worker self.assertEqual("1230768000.0", args.timestamp) 48*288bf522SAndroid Build Coastguard Worker self.assertEqual("fs_config", args.fs_config) 49*288bf522SAndroid Build Coastguard Worker self.assertEqual("product_out", args.product_out) 50*288bf522SAndroid Build Coastguard Worker self.assertEqual("block_list_file", args.block_list_file) 51*288bf522SAndroid Build Coastguard Worker self.assertEqual("base_alloc_file_in", args.base_alloc_file_in) 52*288bf522SAndroid Build Coastguard Worker self.assertEqual("base_alloc_file_out", args.base_alloc_file_out) 53*288bf522SAndroid Build Coastguard Worker self.assertEqual("label", args.label) 54*288bf522SAndroid Build Coastguard Worker self.assertEqual("20", args.inodes) 55*288bf522SAndroid Build Coastguard Worker self.assertEqual("30", args.reserved_percent) 56*288bf522SAndroid Build Coastguard Worker self.assertEqual("8192", args.flash_erase_block_size) 57*288bf522SAndroid Build Coastguard Worker self.assertEqual("16384", args.flash_logical_block_size) 58*288bf522SAndroid Build Coastguard Worker self.assertEqual("mke2fs_uuid", args.mke2fs_uuid) 59*288bf522SAndroid Build Coastguard Worker self.assertEqual("mke2fs_hash_seed", args.mke2fs_hash_seed) 60*288bf522SAndroid Build Coastguard Worker self.assertTrue(args.share_dup_blocks) 61*288bf522SAndroid Build Coastguard Worker 62*288bf522SAndroid Build Coastguard Worker def test_parse_arguments_with_filecontext(self): 63*288bf522SAndroid Build Coastguard Worker args_list = ["-s", "source_directory", "output_file", "ext4", "data", 64*288bf522SAndroid Build Coastguard Worker "8192"] 65*288bf522SAndroid Build Coastguard Worker for key, value in self.optional_arguments.items(): 66*288bf522SAndroid Build Coastguard Worker args_list += [key, value] 67*288bf522SAndroid Build Coastguard Worker args_list += ["-c", "file_contexts.bin"] 68*288bf522SAndroid Build Coastguard Worker 69*288bf522SAndroid Build Coastguard Worker args = mkuserimg_mke2fs.ParseArguments(args_list) 70*288bf522SAndroid Build Coastguard Worker 71*288bf522SAndroid Build Coastguard Worker self.assertEqual("file_contexts.bin", args.file_contexts) 72*288bf522SAndroid Build Coastguard Worker 73*288bf522SAndroid Build Coastguard Worker self.assertEqual("source_directory", args.src_dir) 74*288bf522SAndroid Build Coastguard Worker self.assertEqual("output_file", args.output_file) 75*288bf522SAndroid Build Coastguard Worker self.assertEqual("ext4", args.ext_variant) 76*288bf522SAndroid Build Coastguard Worker self.assertEqual("data", args.mount_point) 77*288bf522SAndroid Build Coastguard Worker self.assertEqual("8192", args.fs_size) 78*288bf522SAndroid Build Coastguard Worker 79*288bf522SAndroid Build Coastguard Worker self.assertTrue(args.android_sparse) 80*288bf522SAndroid Build Coastguard Worker self.assertEqual("10", args.journal_size) 81*288bf522SAndroid Build Coastguard Worker self.assertEqual("1230768000.0", args.timestamp) 82*288bf522SAndroid Build Coastguard Worker self.assertEqual("fs_config", args.fs_config) 83*288bf522SAndroid Build Coastguard Worker self.assertEqual("product_out", args.product_out) 84*288bf522SAndroid Build Coastguard Worker self.assertEqual("block_list_file", args.block_list_file) 85*288bf522SAndroid Build Coastguard Worker self.assertEqual("base_alloc_file_in", args.base_alloc_file_in) 86*288bf522SAndroid Build Coastguard Worker self.assertEqual("base_alloc_file_out", args.base_alloc_file_out) 87*288bf522SAndroid Build Coastguard Worker self.assertEqual("label", args.label) 88*288bf522SAndroid Build Coastguard Worker self.assertEqual("20", args.inodes) 89*288bf522SAndroid Build Coastguard Worker self.assertEqual("30", args.reserved_percent) 90*288bf522SAndroid Build Coastguard Worker self.assertEqual("8192", args.flash_erase_block_size) 91*288bf522SAndroid Build Coastguard Worker self.assertEqual("16384", args.flash_logical_block_size) 92*288bf522SAndroid Build Coastguard Worker self.assertEqual("mke2fs_uuid", args.mke2fs_uuid) 93*288bf522SAndroid Build Coastguard Worker self.assertEqual("mke2fs_hash_seed", args.mke2fs_hash_seed) 94*288bf522SAndroid Build Coastguard Worker self.assertTrue(args.share_dup_blocks) 95*288bf522SAndroid Build Coastguard Worker 96*288bf522SAndroid Build Coastguard Worker def test_parse_arguments_not_enough_arguments(self): 97*288bf522SAndroid Build Coastguard Worker args_list = ["-s", "source_directory", "output_file", "ext4", "data",] 98*288bf522SAndroid Build Coastguard Worker for key, value in self.optional_arguments.items(): 99*288bf522SAndroid Build Coastguard Worker args_list += [key, value] 100*288bf522SAndroid Build Coastguard Worker 101*288bf522SAndroid Build Coastguard Worker with self.assertRaises(SystemExit): 102*288bf522SAndroid Build Coastguard Worker mkuserimg_mke2fs.ParseArguments(args_list) 103*288bf522SAndroid Build Coastguard Worker 104*288bf522SAndroid Build Coastguard Worker def test_construct_e2fs_opts_smoke(self): 105*288bf522SAndroid Build Coastguard Worker args_list = ["-s", "source_directory", "output_file", "ext4", "data", 106*288bf522SAndroid Build Coastguard Worker "8192"] 107*288bf522SAndroid Build Coastguard Worker for key, value in self.optional_arguments.items(): 108*288bf522SAndroid Build Coastguard Worker args_list += [key, value] 109*288bf522SAndroid Build Coastguard Worker args_list += ["-c", "file_contexts.bin"] 110*288bf522SAndroid Build Coastguard Worker 111*288bf522SAndroid Build Coastguard Worker args = mkuserimg_mke2fs.ParseArguments(args_list) 112*288bf522SAndroid Build Coastguard Worker 113*288bf522SAndroid Build Coastguard Worker mke2fs_cmd, e2fsdroid_cmd = mkuserimg_mke2fs.ConstructE2fsCommands( 114*288bf522SAndroid Build Coastguard Worker args) 115*288bf522SAndroid Build Coastguard Worker 116*288bf522SAndroid Build Coastguard Worker expected_mke2fs_extended_opts = ( 117*288bf522SAndroid Build Coastguard Worker "android_sparse,stripe_width=2,stride=4,hash_seed={}".format( 118*288bf522SAndroid Build Coastguard Worker args.mke2fs_hash_seed)) 119*288bf522SAndroid Build Coastguard Worker expected_mke2fs_cmd = [ 120*288bf522SAndroid Build Coastguard Worker "mke2fs", "-J", "size=10", "-L", args.label, "-N", args.inodes, "-m", 121*288bf522SAndroid Build Coastguard Worker args.reserved_percent, "-U", args.mke2fs_uuid, "-E", 122*288bf522SAndroid Build Coastguard Worker expected_mke2fs_extended_opts, "-t", args.ext_variant, "-b", "4096", 123*288bf522SAndroid Build Coastguard Worker args.output_file, str(int(args.fs_size) / 4096)] 124*288bf522SAndroid Build Coastguard Worker 125*288bf522SAndroid Build Coastguard Worker expected_e2fsdroid_cmd = [ 126*288bf522SAndroid Build Coastguard Worker "e2fsdroid", "-T", args.timestamp, "-C", args.fs_config, "-p", 127*288bf522SAndroid Build Coastguard Worker args.product_out, "-B", args.block_list_file, "-d", 128*288bf522SAndroid Build Coastguard Worker args.base_alloc_file_in, "-D", args.base_alloc_file_out, "-s", "-S", 129*288bf522SAndroid Build Coastguard Worker args.file_contexts, "-f", args.src_dir, "-a", args.mount_point, 130*288bf522SAndroid Build Coastguard Worker args.output_file] 131*288bf522SAndroid Build Coastguard Worker 132*288bf522SAndroid Build Coastguard Worker self.assertEqual(' '.join(mke2fs_cmd), ' '.join(expected_mke2fs_cmd)) 133*288bf522SAndroid Build Coastguard Worker 134*288bf522SAndroid Build Coastguard Worker self.assertEqual(' '.join(e2fsdroid_cmd), 135*288bf522SAndroid Build Coastguard Worker ' '.join(expected_e2fsdroid_cmd)) 136