forked from cfig/Android_boot_image_editor
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathintegrationTest.py
More file actions
executable file
·150 lines (138 loc) · 5.24 KB
/
Copy pathintegrationTest.py
File metadata and controls
executable file
·150 lines (138 loc) · 5.24 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
#!/usr/bin/env python3
import shutil, os.path, json, subprocess, hashlib, glob
import unittest, logging, sys, lzma, time
successLogo = """
+----------------------------------+
| All test cases have PASSED |
+----------------------------------+
"""
resDir = "src/integrationTest/resources"
log = logging.getLogger('TEST')
log.setLevel(logging.DEBUG)
consoleHandler = logging.StreamHandler(sys.stdout)
consoleHandler.setFormatter(logging.Formatter(fmt='%(asctime)s %(levelname)-8s %(name)s - %(message)s',
datefmt='%Y-%m-%d %H:%M:%S'))
log.addHandler(consoleHandler)
def hashFile(fileName):
hasher = hashlib.md5()
with open(fileName, 'rb') as afile:
buf = afile.read()
hasher.update(buf)
return hasher.hexdigest()
def deleteIfExists(inFile):
for i in range(3):
try:
if os.path.isfile(inFile):
os.remove(inFile)
return
except Exception as e:
log.warn("Exception in cleaning up %s" % inFile)
time.sleep(3)
def cleanUp():
log.info("clean up ...")
shutil.rmtree("build", ignore_errors = True)
deleteIfExists("boot.img")
deleteIfExists("boot.img.clear")
deleteIfExists("boot.img.google")
deleteIfExists("boot.img.signed")
deleteIfExists("boot.img.signed2")
deleteIfExists("recovery.img")
deleteIfExists("recovery.img.clear")
deleteIfExists("recovery.img.google")
deleteIfExists("recovery.img.signed")
deleteIfExists("recovery.img.signed2")
deleteIfExists("vbmeta.img")
deleteIfExists("vbmeta.img.signed")
deleteIfExists("vendor_boot.img")
deleteIfExists("vendor_boot.img.clear")
deleteIfExists("vendor_boot.img.google")
deleteIfExists("vendor_boot.img.signed")
deleteIfExists("vendor_boot.img.signed2")
def verifySingleJson(jsonFile):
log.info(jsonFile)
imgDir = os.path.dirname(jsonFile)
verifyItems = json.load(open(jsonFile))
for k, v in verifyItems["copy"].items():
it = os.path.join(imgDir, k)
if (os.path.isfile(it)):
log.info("copy file: %s -> %s" % (os.path.join(imgDir, k), v))
shutil.copyfile(it, v)
elif (os.path.isfile(it + ".xz")):
log.info("extract file: %s -> %s" % (it + ".xz", v))
decompressXZ(it + ".xz", v)
else:
raise
if sys.platform == "win32":
gradleWrapper = "gradlew.bat"
else:
gradleWrapper = "./gradlew"
subprocess.check_call(gradleWrapper + " unpack", shell = True)
subprocess.check_call(gradleWrapper + " pack", shell = True)
for k, v in verifyItems["hash"].items():
log.info("%s : %s" % (k, v))
unittest.TestCase().assertEqual(v, hashFile(k))
def verifySingleDir(inResourceDir, inImageDir):
resDir = inResourceDir
imgDir = inImageDir
log.info("Enter %s ..." % os.path.join(resDir, imgDir))
jsonFiles = glob.glob(os.path.join(resDir, imgDir) + "/*.json")
for jsonFile in jsonFiles:
cleanUp()
verifySingleJson(jsonFile)
cleanUp()
pyFiles = glob.glob(os.path.join(resDir, imgDir) + "/*.py")
for pyFile in pyFiles:
cleanUp()
log.warning("calling %s" % pyFile)
if sys.platform == "win32":
theCmd = "python " + pyFile
else:
theCmd = pyFile
subprocess.check_call(theCmd, shell = True)
cleanUp()
log.info("Leave %s" % os.path.join(resDir, imgDir))
def decompressXZ(inFile, outFile):
with lzma.open(inFile) as f:
file_content = f.read()
with open(outFile, "wb") as f2:
f2.write(file_content)
def seekedCopy(inFile, outFile, offset):
print(inFile + " -> " + outFile)
with open(inFile, "rb") as reader:
reader.seek(offset)
content = reader.read()
with open(outFile, "wb") as writer:
writer.write(content)
def main():
# from volunteers
verifySingleDir(resDir, "recovery_image_from_s-trace")
verifySingleDir(resDir, "boot_img_from_gesangtome") # android 9, no ramdisk
verifySingleDir(resDir, "issue_47")
# 5.0
verifySingleDir(resDir, "5.0_fugu_lrx21m")
# 6.0
verifySingleDir(resDir, "6.0.0_bullhead_mda89e")
# 7.0 special boot
cleanUp()
#subprocess.check_call("dd if=%s/7.1.1_volantis_n9f27m/boot.img of=boot.img bs=256 skip=1" % resDir, shell = True)
seekedCopy(os.path.join(resDir, "7.1.1_volantis_n9f27m", "boot.img"), "boot.img", 256)
verifySingleJson(resDir + "/7.1.1_volantis_n9f27m/boot.json")
# 7.0 special recovery
cleanUp()
#subprocess.check_call("dd if=%s/7.1.1_volantis_n9f27m/recovery.img of=recovery.img bs=256 skip=1" % resDir, shell = True)
seekedCopy(os.path.join(resDir, "7.1.1_volantis_n9f27m", "recovery.img"), "recovery.img", 256)
verifySingleJson("%s/7.1.1_volantis_n9f27m/recovery.json" % resDir)
# 8.0
verifySingleDir(resDir, "8.0.0_fugu_opr2.170623.027")
# 9.0 + avb
verifySingleDir(resDir, "9.0.0_blueline_pq1a.181105.017.a1")
# Q preview
verifySingleDir(resDir, "Q_preview_blueline_qpp2.190228.023")
# 10
verifySingleDir(resDir, "10.0.0_coral-qq1d.200205.002")
# 11
verifySingleDir(resDir, "11.0.0_redfin.rd1a.200810.021.a1")
log.info(successLogo)
if __name__ == "__main__":
# execute only if run as a script
main()