diff --git a/updater_sample/tools/gen_update_config.py b/updater_sample/tools/gen_update_config.py
index 44e9ac3..cb9bd01 100755
--- a/updater_sample/tools/gen_update_config.py
+++ b/updater_sample/tools/gen_update_config.py
@@ -31,7 +31,7 @@
 import zipfile
 
 
-class GenUpdateConfig(object): # pylint: disable=too-few-public-methods
+class GenUpdateConfig(object):
     """
     A class that generates update configuration file from an OTA package.
 
@@ -43,9 +43,8 @@
     AB_INSTALL_TYPE_NON_STREAMING = 'NON_STREAMING'
     METADATA_NAME = 'META-INF/com/android/metadata'
 
-    def __init__(self, package, out, url, ab_install_type):
+    def __init__(self, package, url, ab_install_type):
         self.package = package
-        self.out = out
         self.url = url
         self.ab_install_type = ab_install_type
         self.streaming_required = (
@@ -59,14 +58,20 @@
             # compatibility.zip is available only if target supports Treble.
             'compatibility.zip',
         )
+        self._config = None
+
+    @property
+    def config(self):
+        """Returns generated config object."""
+        return self._config
 
     def run(self):
-        """generate config"""
+        """Generates config."""
         streaming_metadata = None
         if self.ab_install_type == GenUpdateConfig.AB_INSTALL_TYPE_STREAMING:
             streaming_metadata = self._gen_ab_streaming_metadata()
 
-        config = {
+        self._config = {
             '__': '*** Generated using tools/gen_update_config.py ***',
             'name': self.ab_install_type[0] + ' ' + os.path.basename(self.package)[:-4],
             'url': self.url,
@@ -74,12 +79,8 @@
             'ab_install_type': self.ab_install_type,
         }
 
-        with open(self.out, 'w') as out:
-            json.dump(config, out, indent=4, separators=(',', ': '), sort_keys=True)
-            print('Config is written to ' + out.name)
-
     def _gen_ab_streaming_metadata(self):
-        """Open zip file and get metadata for files required for streaming update."""
+        """Builds metadata for files required for streaming update."""
         with zipfile.ZipFile(self.package, 'r') as package_zip:
             property_files = self._get_property_files(package_zip)
 
@@ -90,7 +91,7 @@
         return metadata
 
     def _get_property_files(self, zip_file):
-        """Constructs the property-files list for A/B streaming metadata"""
+        """Constructs the property-files list for A/B streaming metadata."""
 
         def compute_entry_offset_size(name):
             """Computes the zip entry offset and size."""
@@ -115,8 +116,13 @@
 
         return property_files
 
+    def write(self, out):
+        """Writes config to the output file."""
+        with open(out, 'w') as out_file:
+            json.dump(self.config, out_file, indent=4, separators=(',', ': '), sort_keys=True)
 
-def main(): # pylint: disable=missing-docstring
+
+def main():  # pylint: disable=missing-docstring
     ab_install_type_choices = [
         GenUpdateConfig.AB_INSTALL_TYPE_STREAMING,
         GenUpdateConfig.AB_INSTALL_TYPE_NON_STREAMING]
@@ -144,10 +150,11 @@
 
     gen = GenUpdateConfig(
         package=args.package,
-        out=args.out,
         url=args.url,
         ab_install_type=args.ab_install_type)
     gen.run()
+    gen.write(args.out)
+    print('Config is written to ' + args.out)
 
 
 if __name__ == '__main__':
diff --git a/updater_sample/tools/gen_update_config_test.py b/updater_sample/tools/gen_update_config_test.py
new file mode 100755
index 0000000..951d4c4
--- /dev/null
+++ b/updater_sample/tools/gen_update_config_test.py
@@ -0,0 +1,55 @@
+#!/usr/bin/env python3
+#
+# Copyright (C) 2018 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""
+Tests gen_update_config.py
+"""
+
+import os.path
+import unittest
+from gen_update_config import GenUpdateConfig
+
+
+class GenUpdateConfigTest(unittest.TestCase): # pylint: disable=missing-docstring
+
+    def test_ab_install_type_streaming(self):
+        """tests if streaming property files' offset and size are generated properly"""
+        config, package = self._generate_config()
+        property_files = config['ab_streaming_metadata']['property_files']
+        self.assertEqual(len(property_files), 5)
+        with open(package, 'rb') as pkg_file:
+            for prop in property_files:
+                filename, offset, size = prop['filename'], prop['offset'], prop['size']
+                pkg_file.seek(offset)
+                data = pkg_file.read(size).decode('ascii')
+                # data in the archive are just uppercase filenames without extension
+                expected_data = filename.split('.')[0].upper()
+                self.assertEqual(data, expected_data)
+
+    @staticmethod
+    def _generate_config():
+        """Generates JSON config from ota_002_package.zip."""
+        ota_package = os.path.join(os.path.dirname(__file__),
+                                   '../tests/res/raw/ota_002_package.zip')
+        gen = GenUpdateConfig(ota_package,
+                              'file:///foo.bar',
+                              GenUpdateConfig.AB_INSTALL_TYPE_STREAMING)
+        gen.run()
+        return gen.config, ota_package
+
+
+if __name__ == '__main__':
+    unittest.main()
