blob: 7498f23480aa056cf379e9cbf8d0a9411dc8752b [file] [log] [blame]
#!/usr/bin/env python3.8
# Copyright 2022 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Unit tests for verify_sdk_compatibility.py"""
import os
import tarfile
import tempfile
import unittest
from tempfile import TemporaryDirectory
from verify_sdk_compatibility import (
fail_on_breaking_changes, NotifyOnAdditions, SdkCompatibilityError,
MissingInputError, generate_sdk_layout_golden_file)
class VerifySdkCompatibilityTests(unittest.TestCase):
def test_fail_on_breaking_changes(self):
with TemporaryDirectory() as root_build_dir:
golden1 = os.path.join(root_build_dir, "test_gold1")
afile = os.path.join(root_build_dir, "afile")
with open(afile, 'w') as f:
f.write("file_content")
start = "/"
manifest = {
os.path.relpath(afile, start),
}
with open(golden1, 'w') as f:
for p in manifest:
f.write(p)
f.write("\n")
golden2 = os.path.join(root_build_dir, "test_gold2")
manifest = {
os.path.relpath(afile, start),
}
with open(golden2, 'w') as f:
for p in manifest:
f.write(p + "/")
f.write("\n")
bfile = os.path.join(root_build_dir, "bfile")
with open(bfile, 'w') as f:
f.write("file_content")
golden3 = os.path.join(root_build_dir, "test_gold3")
manifest = {
os.path.relpath(afile, start),
os.path.relpath(bfile, start)
}
with open(golden3, 'w') as f:
for p in manifest:
f.write(p)
f.write("\n")
cfile = os.path.join(root_build_dir, "cfile")
with open(cfile, 'w') as f:
f.write("file_content")
dfile = os.path.join(root_build_dir, "dfile")
with open(dfile, 'w') as f:
f.write("file_content")
efile = os.path.join(root_build_dir, "efile")
with open(efile, 'w') as f:
f.write("file_content")
update_golden_path = os.path.join(root_build_dir, "updated")
with tempfile.NamedTemporaryFile('wb', suffix='.tar.gz',
delete=False) as f:
with tarfile.open(f.name, mode='w:gz') as tar_curr:
tar_curr.add(afile)
# Assert that a case with no changes should pass.
mock_gold = "path/to/core.golden"
self.assertTrue(
fail_on_breaking_changes(f.name, golden1, mock_gold) is None
)
# Assert that additions to the SDK layout will trigger a notification.
with tarfile.open(f.name, mode='w:gz') as tar_curr:
tar_curr.add(afile)
tar_curr.add(bfile)
tar_curr.add(cfile)
self.assertRaisesRegex(
NotifyOnAdditions, ".*(?=.*bfile)(?=.*cfile).*",
fail_on_breaking_changes, f.name, golden1,
update_golden_path)
# Assert that a mismatch of types will not pass.
with self.assertRaises(SdkCompatibilityError):
fail_on_breaking_changes(
f.name, golden2, update_golden_path)
# Assert that a nonexistent golden file will not pass.
with self.assertRaises(MissingInputError):
fail_on_breaking_changes(f.name, mock_gold, mock_gold)
# Assert that files with different order, same contents will pass.
with tarfile.open(f.name, mode='w:gz') as tar_curr:
tar_curr.add(bfile)
tar_curr.add(afile)
self.assertTrue(
fail_on_breaking_changes(f.name, golden3, mock_gold) is None
)
# Assert that a case with breaking changes will not pass (deletion).
with tarfile.open(f.name, mode='w:gz') as tar_curr:
tar_curr.add(bfile)
self.assertRaisesRegex(
SdkCompatibilityError, ".*afile.*",
fail_on_breaking_changes, f.name, golden3,
update_golden_path)
# Assert that a case with no matching files does not pass.
with tarfile.open(f.name, mode='w:gz') as tar_curr:
tar_curr.add(dfile)
tar_curr.add(efile)
tar_curr.add(cfile)
self.assertRaisesRegex(
SdkCompatibilityError, ".*(?=.*bfile)(?=.*afile).*",
fail_on_breaking_changes, f.name, golden3,
update_golden_path)
# Assert that a case with one missing path does not pass.
manifest = {
os.path.relpath(cfile, start),
os.path.relpath(bfile, start)
}
with open(golden3, 'w') as file:
for p in manifest:
file.write(p)
file.write("\n")
self.assertRaisesRegex(
SdkCompatibilityError, ".*bfile*", fail_on_breaking_changes,
f.name, golden3, update_golden_path)
with tempfile.NamedTemporaryFile('wb', suffix='.tar.gz',
delete=False) as f3:
# Assert that an empty tar file will not pass.
with self.assertRaises(MissingInputError):
fail_on_breaking_changes(f3.name, golden1, mock_gold)
def test_generate_sdk_layout_golden_file(self):
with TemporaryDirectory() as root_build_dir:
file1 = os.path.join(root_build_dir, "test_file1")
with open(file1, 'w') as f:
f.write("file_content")
file2 = os.path.join(root_build_dir, "test_file2")
with open(file2, 'w') as f:
f.write("file_content")
start = "/"
layout = {
os.path.relpath(file1, start),
os.path.relpath(file2, start)
}
with tempfile.NamedTemporaryFile('wb', suffix='.tar.gz',
delete=False) as f:
with tarfile.open(f.name, mode='w:gz') as tar_curr:
tar_curr.add(file1)
tar_curr.add(file2)
self.assertTrue(
str(generate_sdk_layout_golden_file(f.name)) == str(layout))
if __name__ == '__main__':
unittest.main()