public void AlternateRom_ChangeAlternateCfgPath_RefreshCfgCrcChangesCrc() { IReadOnlyList <string> paths; var storageAccess = AlternateRomTestStorageAccess.Initialize(out paths, TestRomResources.TestBinPath, TestRomResources.TestCfgPath); var alternateBinPath = paths[0]; var alternateCfgPath = paths[1]; var alternate = new AlternateRom(alternateBinPath, alternateCfgPath, null); Assert.NotNull(alternate); Assert.True(alternate.IsValid); Assert.Equal(TestRomResources.TestCfgCrc, alternate.CfgCrc); using (var cfgStream = storageAccess.Open(alternateCfgPath)) { cfgStream.Seek(0, System.IO.SeekOrigin.End); var cfgToAppend = @" [vars] name = ""Weener Weener Cheekeen Deeener"" "; var cfgDataToAppend = System.Text.Encoding.UTF8.GetBytes(cfgToAppend); cfgStream.Write(cfgDataToAppend, 0, cfgDataToAppend.Length); cfgStream.Seek(0, System.IO.SeekOrigin.Begin); } var cfgCrcChanged = false; var cfgCrc = alternate.RefreshCfgCrc(out cfgCrcChanged); Assert.True(cfgCrcChanged); Assert.NotEqual(TestRomResources.TestCfgCrc, cfgCrc); Assert.Equal(cfgCrc, alternate.CfgCrc); Assert.Equal(cfgCrc, alternate.Alternate.CfgCrc); Assert.Equal("Weener Weener Cheekeen Deeener", alternate.GetBinFileMetadata().LongNames.First()); }
public void AlternateRom_ChangeAlternateRom_RefreshCrcChangesCrc() { IReadOnlyList <string> paths; var storageAccess = AlternateRomTestStorageAccess.Initialize(out paths, TestRomResources.TestBinPath, TestRomResources.TestCfgPath, TestRomResources.TestBinPath); var rom = Rom.Create(paths[0], paths[1]); var alternateBinPath = paths[2]; var alternate = new AlternateRom(alternateBinPath, null, rom); Assert.NotNull(alternate); Assert.True(alternate.IsValid); Assert.Equal(0u, alternate.CfgCrc); Assert.Equal(TestRomResources.TestBinCrc, alternate.Crc); using (var binStream = storageAccess.Open(alternateBinPath)) { binStream.Seek(0, System.IO.SeekOrigin.End); var dataToAppend = Enumerable.Repeat((byte)0xFF, 128).ToArray(); binStream.Write(dataToAppend, 0, 128); binStream.Seek(0, System.IO.SeekOrigin.Begin); } var crcChanged = false; var crc = alternate.RefreshCrc(out crcChanged); Assert.True(crcChanged); Assert.Equal(crc, alternate.Crc); Assert.NotEqual(TestRomResources.TestBinCrc, crc); Assert.Equal(alternate.Crc, alternate.Alternate.Crc); Assert.NotEqual(alternate.Original.Crc, alternate.Crc); Assert.NotEqual(alternate.Original.Crc, alternate.Alternate.Crc); }
/// <summary> /// Gets the ROM to use from a <see cref="ProgramDescription"/> for deployment to a device, e.g. Intellicart, CC3, LTO Flash!, emulator, et. al. /// </summary> /// <param name="programDescription">A <see cref="ProgramDescription"/> that wraps a specific <see cref="IRom"/>.</param> /// <returns>The specific <see cref="IRom"/> to use for deployment.</returns> /// <remarks>A specific <see cref="IRom"/> may refer to a file that is not presently accessible, e.g. a ROM on a CD-ROM drive, network volume, or other /// non-fixed-disk location. In such a case, if the <paramref name="programDescription"/> supplies alternative location(s), the first suitable alternative /// location that can be accessed will be used to return a viable <see cref="IRom"/> that, hopefully, is the equivalent of the original.</remarks> public static IRom GetRom(this ProgramDescription programDescription) { var rom = programDescription.Rom; var usesCfg = !string.IsNullOrEmpty(rom.ConfigPath); if (!StreamUtilities.FileExists(rom.RomPath) || (usesCfg && !StreamUtilities.FileExists(rom.ConfigPath))) { var alternateRomPaths = programDescription.Files.AlternateRomImagePaths.ToList(); var alternateCfgPaths = programDescription.Files.AlternateRomConfigurationFilePaths.ToList(); if (usesCfg && (alternateRomPaths.Count != alternateCfgPaths.Count)) { throw new InvalidOperationException(Resources.Strings.ProgramDescription_MissingAlternateCfgFile); } var foundAlternate = false; string romPath = null; string cfgPath = null; for (var i = 0; (i < alternateRomPaths.Count) && !foundAlternate; ++i) { if (StreamUtilities.FileExists(alternateRomPaths[i])) { romPath = alternateRomPaths[i]; if (usesCfg) { if (StreamUtilities.FileExists(alternateCfgPaths[i])) { // This code assumes (but cannot check -- silly PCL has no Path API) that the .cfg and ROM are in the same directory for the same index. cfgPath = alternateCfgPaths[i]; foundAlternate = true; } } else { foundAlternate = true; } } } if (foundAlternate) { rom = new AlternateRom(romPath, cfgPath, rom); } } return(rom); }
public void AlternateRom_CreateWithNullOriginalRom_AlternateIsValid() { var paths = AlternateRomTestStorageAccess.Initialize(TestRomResources.TestBinPath, TestRomResources.TestCfgPath); var alternateBinPath = paths[0]; // "/Resources/TestWithNullOriginalROM/tagalong.bin"; var alternateCfgPath = paths[1]; // "/Resources/TestWithNullOriginalROM/tagalong.cfg"; var alternate = new AlternateRom(alternateBinPath, alternateCfgPath, null); Assert.NotNull(alternate); Assert.True(alternate.IsValid); Assert.Null(alternate.Original); Assert.NotNull(alternate.Alternate); Assert.Equal(alternateBinPath, alternate.RomPath); Assert.Equal(alternateCfgPath, alternate.ConfigPath); Assert.Equal(TestRomResources.TestBinCrc, alternate.Crc); Assert.Equal(TestRomResources.TestCfgCrc, alternate.CfgCrc); Assert.True(alternate.Validate()); }
public void AlternateRom_CreateWithNullAlternateCfgPath_CreatesAlternateWithNullCfgPath() { var paths = AlternateRomTestStorageAccess.Initialize(TestRomResources.TestBinPath, TestRomResources.TestCfgPath, TestRomResources.TestBinPath); var rom = Rom.Create(paths[0], paths[1]); Assert.NotNull(rom); var alternateBinPath = paths[2]; var alternate = new AlternateRom(alternateBinPath, null, rom); Assert.NotNull(alternate); Assert.True(alternate.IsValid); Assert.NotNull(alternate.Original); Assert.NotNull(alternate.Alternate); Assert.NotEqual(rom.RomPath, alternate.RomPath); Assert.NotEqual(rom.ConfigPath, alternate.ConfigPath); Assert.Null(alternate.ConfigPath); Assert.Equal(rom.Format, alternate.Format); Assert.Equal(rom.Crc, alternate.Crc); Assert.Equal(rom.Crc, alternate.Crc); Assert.NotEqual(rom.CfgCrc, alternate.CfgCrc); Assert.Equal(0u, alternate.CfgCrc); Assert.True(alternate.Validate()); }