コード例 #1
0
    def test_002_build_android_release_uglify_snapshot_sourcemap(self):
        # https://github.com/NativeScript/nativescript-dev-webpack/issues/920
        result = Tns.build_android(self.app_name,
                                   release=True,
                                   uglify=True,
                                   snapshot=True,
                                   source_map=True)
        assert "ERROR in NativeScriptSnapshot. Snapshot generation failed!" not in result.output
        assert "Target architecture: arm64-v8a" not in result.output

        # Verify snapshot files in the built .apk
        apk_path = TnsPaths.get_apk_path(app_name=self.app_name, release=True)
        if Settings.HOST_OS != OSType.WINDOWS:
            TnsAssert.snapshot_build(apk_path, self.temp_folder)

        # Verify app is built with android sdk 29 by default
        TnsAssert.string_in_android_manifest(apk_path,
                                             'compileSdkVersion="29"')

        # Configs are respected
        assert File.exists(TnsPaths.get_apk_path(self.app_name, release=True))

        # Create zip
        command = "tar -czf " + self.app_name + "/app/app.tar.gz " + self.app_name + "/app/app.js"
        run(cmd=command, cwd=Settings.TEST_RUN_HOME, wait=True)
        assert File.exists(os.path.join(self.app_path, 'app', 'app.tar.gz'))
コード例 #2
0
def run_hello_world_js_ts(app_name, platform, device, bundle=True, hmr=True, uglify=False, release=False,
                          aot=False, snapshot=False, instrumented=False, sync_all_files=False, just_launch=False,
                          default_andr_sdk='29', timeout=240):
    # Execute `tns run` and wait until logs are OK
    result = Tns.run(app_name=app_name, platform=platform, emulator=True, wait=False, bundle=bundle, hmr=hmr,
                     release=release, uglify=uglify, aot=aot, snapshot=snapshot, sync_all_files=sync_all_files,
                     just_launch=just_launch)

    strings = TnsLogs.run_messages(app_name=app_name, platform=platform, run_type=RunType.UNKNOWN, bundle=bundle,
                                   hmr=hmr, instrumented=instrumented, device=device, release=release,
                                   snapshot=snapshot)
    TnsLogs.wait_for_log(log_file=result.log_file, string_list=strings, timeout=timeout)

    # Verify it looks properly
    device.wait_for_text(text=Changes.JSHelloWord.JS.old_text)
    device.wait_for_text(text=Changes.JSHelloWord.XML.old_text)
    blue_count = device.get_pixels_by_color(color=Colors.LIGHT_BLUE)
    assert blue_count > 100, 'Failed to find blue color on {0}'.format(device.name)
    initial_state = os.path.join(Settings.TEST_OUT_IMAGES, device.name, 'initial_state.png')
    device.get_screen(path=initial_state)
    if platform == Platform.ANDROID:
        # Verify android sdk the app is built with
        if release:
            apk_path = TnsPaths.get_apk_path(app_name=app_name, release=True)
        else:
            apk_path = TnsPaths.get_apk_path(app_name=app_name, release=False)
        TnsAssert.string_in_android_manifest(apk_path, 'compileSdkVersion="{0}"'.format(default_andr_sdk))
    if snapshot and Settings.HOST_OS != OSType.WINDOWS:
        TnsAssert.snapshot_build(TnsPaths.get_apk_path(app_name=app_name, release=True), Settings.TEST_OUT_TEMP)
    return result
コード例 #3
0
    def test_003_js_app_apk(self):
        # Extract APK
        apk = TnsPaths.get_apk_path(app_name=self.js_app, release=True)
        extracted_apk = os.path.join(Settings.TEST_OUT_TEMP, 'js-apk')
        File.unzip(file_path=apk, dest_dir=extracted_apk)

        res = os.path.join(extracted_apk, 'res')
        assets_app = os.path.join(extracted_apk, 'assets', 'app')
        assets_snapshots = os.path.join(extracted_apk, 'assets', 'snapshots')
        lib = os.path.join(extracted_apk, 'lib')
        run(cmd='du -hs *', cwd=lib, wait=True, log_level=logging.INFO)

        # Verify content of APK
        assert PerfUtils.is_value_in_range(actual=Folder.get_size(lib),
                                           expected=38724352,
                                           tolerance=0.1)
        assert PerfUtils.is_value_in_range(actual=Folder.get_size(res),
                                           expected=843827,
                                           tolerance=0.1)
        assert PerfUtils.is_value_in_range(actual=Folder.get_size(assets_app),
                                           expected=641606,
                                           tolerance=0.1)
        assert PerfUtils.is_value_in_range(
            actual=Folder.get_size(assets_snapshots),
            expected=5811260,
            tolerance=0.1)

        # Verify final apk size
        assert PerfUtils.is_value_in_range(actual=File.get_size(apk),
                                           expected=18216351,
                                           tolerance=0.05)
コード例 #4
0
    def test_201_build_app_for_both_platforms(self):
        Tns.plugin_add(plugin_name='tns-plugin', path=self.app_name)

        # Verify files of the plugin
        assert File.exists(
            os.path.join(TnsPaths.get_app_node_modules_path(self.app_name),
                         'tns-plugin', 'index.js'))
        assert File.exists(
            os.path.join(TnsPaths.get_app_node_modules_path(self.app_name),
                         'tns-plugin', 'package.json'))
        assert File.exists(
            os.path.join(TnsPaths.get_app_node_modules_path(self.app_name),
                         'tns-plugin', 'test.android.js'))
        assert File.exists(
            os.path.join(TnsPaths.get_app_node_modules_path(self.app_name),
                         'tns-plugin', 'test.ios.js'))
        assert File.exists(
            os.path.join(TnsPaths.get_app_node_modules_path(self.app_name),
                         'tns-plugin', 'test2.android.xml'))
        assert File.exists(
            os.path.join(TnsPaths.get_app_node_modules_path(self.app_name),
                         'tns-plugin', 'test2.ios.xml'))

        Tns.build_ios(app_name=self.app_name)
        Tns.build_android(app_name=self.app_name)

        apk_path = os.path.join(TnsPaths.get_apk_path(self.app_name))
        output = Adb.get_package_permission(apk_path)
        assert 'android.permission.READ_EXTERNAL_STORAGE' in output
        assert 'android.permission.WRITE_EXTERNAL_STORAGE' in output
        assert 'android.permission.INTERNET' in output
コード例 #5
0
    def test_001_build_android(self):
        Tns.build_android(self.app_name)
        assert not File.exists(
            os.path.join(TnsPaths.get_platforms_android_folder(self.app_name),
                         '*.plist'))
        assert not File.exists(
            os.path.join(TnsPaths.get_platforms_android_folder(self.app_name),
                         '*.android.js'))
        assert not File.exists(
            os.path.join(TnsPaths.get_platforms_android_folder(self.app_name),
                         '*.ios.js'))

        src = os.path.join(self.app_name, 'app', 'app.js')
        dest_1 = os.path.join(self.app_name, 'app', 'new.android.js')
        dest_2 = os.path.join(self.app_name, 'app', 'new.ios.js')
        File.copy(src, dest_1)
        File.copy(src, dest_2)

        result = Tns.build_android(self.app_name)
        assert "Gradle build..." in result.output, "Gradle build not called."
        assert result.output.count(
            "Gradle build...") == 1, "Only one gradle build is triggered."

        assert not File.exists(
            os.path.join(TnsPaths.get_platforms_android_folder(self.app_name),
                         '*.plist'))
        assert not File.exists(
            os.path.join(TnsPaths.get_platforms_android_folder(self.app_name),
                         '*.android.js'))
        assert not File.exists(
            os.path.join(TnsPaths.get_platforms_android_folder(self.app_name),
                         '*.ios.js'))

        # Verify apk does not contain aar files
        apk_path = TnsPaths.get_apk_path(app_name=self.app_name, release=False)
        File.unzip(apk_path, self.temp_folder)
        # Clean META-INF folder. It contains com.android.support.... files which are expected to be there due to
        # https://github.com/NativeScript/nativescript-cli/pull/3923
        Folder.clean(os.path.join(self.temp_folder, 'META-INF'))
        assert not File.pattern_exists(self.temp_folder, '*.aar')
        assert not File.pattern_exists(self.temp_folder, '*.plist')
        assert not File.pattern_exists(self.temp_folder, '*.android.*')
        assert not File.pattern_exists(self.temp_folder, '*.ios.*')

        # Verify app is built with android sdk 29 by default
        TnsAssert.string_in_android_manifest(apk_path,
                                             'compileSdkVersion="29"')
        Folder.clean(self.temp_folder)

        # Verify incremental native build
        result = Tns.exec_command(command='build --clean',
                                  path=self.app_name,
                                  platform=Platform.ANDROID)
        assert "Gradle clean..." in result.output, "Gradle clean is not called."
        assert "Gradle build..." in result.output, "Gradle build is not called."
        assert result.output.count(
            "Gradle build...") == 1, "More than 1 gradle build is triggered."
コード例 #6
0
    def test_002_build_android_release(self):
        Tns.build_android(self.app_name, release=True)

        # Configs are respected
        assert File.exists(TnsPaths.get_apk_path(self.app_name, release=True))

        # Create zip
        command = "tar -czf " + self.app_name + "/app/app.tar.gz " + self.app_name + "/app/app.js"
        run(cmd=command, cwd=Settings.TEST_RUN_HOME, wait=True)
        assert File.exists(os.path.join(self.app_path, 'app', 'app.tar.gz'))
コード例 #7
0
    def build(app_name,
              platform,
              release=False,
              provision=Settings.IOS.PROVISIONING,
              for_device=False,
              bundle=True,
              aot=False,
              source_map=False,
              uglify=False,
              snapshot=False,
              log_trace=False,
              verify=True,
              app_data=None,
              aab=False,
              compile_snapshot=False):
        result = Tns.exec_command(command='build',
                                  path=app_name,
                                  platform=platform,
                                  release=release,
                                  provision=provision,
                                  for_device=for_device,
                                  bundle=bundle,
                                  aot=aot,
                                  source_map=source_map,
                                  uglify=uglify,
                                  snapshot=snapshot,
                                  wait=True,
                                  log_trace=log_trace,
                                  aab=aab,
                                  compile_snapshot=compile_snapshot)
        if verify:
            # Verify output
            assert result.exit_code == 0, 'Build failed with non zero exit code.'
            assert 'Project successfully built.' in result.output

            # Verify apk, app or ipa produced
            if platform == Platform.ANDROID:
                assert File.exists(
                    TnsPaths.get_apk_path(app_name=app_name, release=release))
            if platform == Platform.IOS:
                app_path = TnsPaths.get_ipa_path(app_name=app_name,
                                                 release=release,
                                                 for_device=for_device)
                if for_device:
                    assert File.exists(app_path)
                else:
                    assert Folder.exists(app_path)

            # Verify based on app_data
            if app_data is not None:
                pass

        return result
コード例 #8
0
    def test_102_ng_app_apk(self):
        # Extract APK
        apk = TnsPaths.get_apk_path(app_name=self.ng_app, release=True)
        extracted_apk = os.path.join(Settings.TEST_OUT_TEMP, 'ng-apk')
        File.unzip(file_path=apk, dest_dir=extracted_apk)

        assets_app = os.path.join(extracted_apk, 'assets', 'app')
        assets_snapshots = os.path.join(extracted_apk, 'assets', 'snapshots')

        # No asserts for lib and res, since it is same as JS project
        assert PerfUtils.is_value_in_range(actual=Folder.get_size(assets_app),
                                           expected=1342382,
                                           tolerance=0.1)
        assert PerfUtils.is_value_in_range(
            actual=Folder.get_size(assets_snapshots),
            expected=13157964,
            tolerance=0.1)

        # Verify final apk size
        assert PerfUtils.is_value_in_range(actual=File.get_size(apk),
                                           expected=20087522,
                                           tolerance=0.05)
コード例 #9
0
 def test_101_plugin_add_prepare_verify_apk_android(self):
     Tns.plugin_add(plugin_name='tns-plugin', path=self.app_name)
     Tns.build_android(app_name=self.app_name)
     assert File.exists(os.path.join(TnsPaths.get_apk_path(self.app_name)))