chromium/chrome/test/data/installer/README.md

# How to generate installer test files

This README describes how to generate:
- test_chrome.7z
- test_chrome.packed.7z
- mini_installer.exe.test
- test_mini_installer_uncompressed.exe.test

These files are needed for mini_installer_unittest and unpack_archive_unittest

## Build the real mini_installers

On a windows machine, generate a new build directory, for this example:

    gn args out\Default

When prompted, set the build arguments to the following:

    is_component_build = false
    target_cpu = "x86"
    is_debug = false
    # Required to build mini_installer_uncompressed:
    enable_uncompressed_archive=true

Next, build the `mini_installer` and the `mini_installer_uncompressed` targets,
to produce a release build of `mini_installer.exe` and
`mini_installer_uncompressed.exe`:

    autoninja -C out/Default mini_installer mini_installer_uncompressed


This will also build the *mini_installer_archive* target, which produces the
uncompressed `chrome.7z` and the compressed `chrome.packed.7z` contained in the
mini_installer binaries.

## Create the fake chrome archives

In order to reduce the size of the test files stored in the repository, replace
the files contained in `chrome.7z` with a file to verify the archives are
unpacked as expected, regardless of contents.

This can be done by opening a blank text file, and pasting the following string
as is without any new lines, null terminator, or preceding or trailing
whitespace:

    fakechromiumdata

Save this file as `test_data.txt` to a path you will use later.

Run the following commands to modify the archives using the 7zip commandline
utility 7za.exe provided in the repository:

```
:: Delete all the files within chrome.7z
"{chromium source dir}\third_party\lzma_sdk\bin\host_platform\7za.exe" d ^
"{chromium source dir}\out\Default\chrome.7z" * -r
:: Delete all the files within chrome.packed.7z
"{chromium source dir}\third_party\lzma_sdk\bin\host_platform\7za.exe" d ^
"{chromium source dir}\out\Default\chrome.packed.7z" * -r
:: Add the test_data.txt to the chrome.7z
"{chromium source dir}\third_party\lzma_sdk\bin\host_platform\7za.exe" a ^
"{chromium source dir}\out\Default\chrome.7z" "{path}\{to}\test_data.txt"
:: Add the chrome.7z to the chrome.packed.7z
"{chromium source dir}\third_party\lzma_sdk\bin\host_platform\7za.exe" a ^
"{chromium source dir}\out\Default\chrome.packed.7z" ^
"{chromium source dir}\out\Default\chrome.7z"
```

Retain the modified `chrome.7z` and `chrome.packed.7z` for later.

## Create the fake setup binaries

Next, create a fake `SETUP.EXE`. This can be done by opening a blank text file,
and pasting the following string as is without any new lines, null terminator,
or preceding or trailing whitespace:

    fakesetupdata

Save this file as `SETUP.EXE`.

Take the fake `SETUP.EXE` and use it to produce the fake compressed `SETUP.EX_`
cab using windows `makecab` tool:

    makecab "{input}\{path}\SETUP.EXE" "{output}\{path}\SETUP.EX_"

Save the fake, compressed `SETUP.EX_` for later.

## Create the fake component resource

Next, open a blank text file and paste the following string as is without any
new lines, null terminator, or preceding or trailing whitespace:

    fakebddata

Save the file as `bdresources.txt` for later.

## Modify the mini_installer executable resources

Next, open Visual Studio, and create a new project/solution.

*NOTE: This project won't actually be needed after modifying the resources,
but it's important to note that if `mini_installer.exe` is opened as a
`project/solution`, it does not give provide the opportunity to modify the
resources.*

Select `File > Open > File...` and select the `out\Default\mini_installer.exe`
that was built above, which will present visual studio's resource viewer.
This allows for a developer edit the existing resources.

To finish producing the fake mini_installers, a developer will need to replace
and add a few resources in order to prepare these fake mini_installers for
testing.

For example, for the `mini_installer.exe`, the developer will need to replace
the resource located at `mini_installer.exe/"B7"/CHROME.PACKED.7Z` with the fake
`CHROME.PACKED.7Z` produced above.

This can be done by right-clicking anywhere on the `mini_installer.exe` resource
directory view, and then selecting `Add Resource` from the drop-down menu.

In the menu that appears, click the `Import...` button which will open a file
explorer. In the file explorer menu, make sure that `All Files (*.*)` filter is
selected, as the default `Bitmaps` will filter out the relevant files.

Navigate to the file that will be imported--in this case, the fake
`chrome.packed.7z` archive--select it and click the `Open` button.

In the `Custom Resource Type` type in the desired resource type with quotes
(`"B7"` for LZMA compressed resources, `"BL"` for LZC compressed resources,
`"BN"` for uncompressed resources, or `"BD"` for component resources), in
this case `"B7"`, and click `OK`.

This opens the file in visual studio as an `*.RCDATA` file. hit `Ctrl + S` or
manually save this file to create the resource and return to the
`mini_installer.exe` tab to see the resource has been created, but with a
resource name set to some integer, let's assume `101`.

If a resource is being added, which should be the case for `"BD"` resources for
component builds, simply continue on to the next step. If a resource is being
replaced, take a note of the exact name of the original resource ID for the
resource to be replaced, right-click and select `Delete` for the resource being
replaced.

Click on the new resource, in this case `101`, and look for the ID field in the
`Custom Editor` panel on the right side of visual studio. If this is a resource
addition, replace this numerical ID with the original filename for the file you
imported *surrounded by quotes*. If this is a resource replacement, replace the
assigned numerical ID with the original name of the resource that was noted
above, *surrounded by quotes*. In this case, that would be `"CHROME.PACKED.7Z"`.

*NOTE: If the encapsulating quotes are not provided, visual studio will report
that this resource ID contains illegal characters and will refused to modify
it.*

For each executable, replace and add the resources as outlined below:

### mini_installer.exe resources

    Replace `mini_installer.exe\"B7"\"CHROME.PACKED.7Z"`
    with the modified `chrome.packed.7z` produced above.

    Replace `mini_installer.exe\"BL"\"SETUP.EX_"`
    with the newly compressed cab `SETUP.EX_`.

    Add `mini_installer.exe\"BD"\"bdresource.txt"`


### mini_installer_uncompressed.exe resources

    Replace `mini_installer_uncompressed.exe\"BN"\"CHROME.7Z"`
    with the modified `chrome.7z` produced above.

    Replace `mini_installer_uncompressed.exe\"BN"\"SETUP.EXE"`
    with the uncompressed `SETUP.EXE` from above.

    Add `mini_installer.exe\"BD"\"bdresource.txt"`




## Move and Rename the files
Now that all of the files are created, the last step is to move them to this
folder, `chrome\test\data\installer`, renaming the files as described below.

### File Produced -> Filename Expected by Tests

    `mini_installer.exe`                -> `mini_installer.exe.test`

    `mini_installer_uncompressed.exe`   -> `mini_installer_uncompressed.exe.test`

    `chrome.7z`                         -> `test_chrome.7z`

    `chrome.packed.7z`                  -> `test_chrome.packed.7z`

All other files created along the way to produce the above 4 packages can be
deleted as they are no longer needed.