diff --git a/MODULE.bazel b/MODULE.bazel index dd2d9d3b9..e789891bb 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -37,6 +37,7 @@ maven.install( "org.indunet:fastproto:4.1.0", "net.java.dev.jna:jna:5.19.1", "net.java.dev.jna:jna-platform:5.19.1", + "com.google.truth.extensions:truth-proto-extension:1.4.5", ], repositories = [ "https://repo1.maven.org/maven2", diff --git a/README.md b/README.md index eff5e592f..13cd7b937 100644 --- a/README.md +++ b/README.md @@ -114,6 +114,7 @@ choices because they can store multiple types of file system. | Profile | Format | Read? | Write? | Filesystem? | |:--------|:-------|:-----:|:------:|:------------| +| [`abc`](doc/disk-abc.md) | Ai Electronics ABC 24: CP/M; 158kB 35-track DSDD | 🦄 | | CPMFS | | [`acornadfs`](doc/disk-acornadfs.md) | Acorn ADFS: BBC Micro, Archimedes | 🦖 | | | | [`acorndfs`](doc/disk-acorndfs.md) | Acorn DFS: Acorn Atom, BBC Micro series | 🦄 | | ACORNDFS | | [`aeslanier`](doc/disk-aeslanier.md) | AES Lanier "No Problem": 616kB 5.25" 77-track SSDD hard sectored | 🦖 | | | diff --git a/doc/disk-abc.md b/doc/disk-abc.md new file mode 100644 index 000000000..6accd8c4a --- /dev/null +++ b/doc/disk-abc.md @@ -0,0 +1,29 @@ +Ai Electronics ABC 24 +==== +## CP/M; 158kB 35-track DSDD + + +Ai Electronics was a Japanese computer company that produced minicomputers during the 1960s and 1970s. In 1979 they +started production of the ABC, the Ai Business Computer, a decently specced CP/M machine with 64kB RAM, a Z80, twin +floppy drives, GBIP ports, and a maths coprocessor. + +The floppy disks it uses are relatively normal 35-track IBM scheme disks, with cylinder 0 reserved as the boot track. + +## Options + +(no options) + +## Examples + +To read: + + - `fluxengine read -c abc -s drive:0 -o abc.img` + +To write: + + - `fluxengine write -c abc -d drive:0 -i abc.img` + +## References + + - [DoPECC's page on the ABC 24](https://dopecc.net/computers/ai/) + diff --git a/java/com/cowlark/fluxengine/arch/abc.textpb b/java/com/cowlark/fluxengine/arch/abc.textpb new file mode 100644 index 000000000..6f0f61a7f --- /dev/null +++ b/java/com/cowlark/fluxengine/arch/abc.textpb @@ -0,0 +1,75 @@ +shortname: "Ai Electronics ABC 24" +comment: 'CP/M; 158kB 35-track DSDD' +read_support_status: UNICORN + +documentation: +<<< +Ai Electronics was a Japanese computer company that produced minicomputers during the 1960s and 1970s. In 1979 they +started production of the ABC, the Ai Business Computer, a decently specced CP/M machine with 64kB RAM, a Z80, twin +floppy drives, GBIP ports, and a maths coprocessor. + +The floppy disks it uses are relatively normal 35-track IBM scheme disks, with cylinder 0 reserved as the boot track. +>>> + +documentation: +<<< +## References + + - [DoPECC's page on the ABC 24](https://dopecc.net/computers/ai/) +>>> + +image_reader { + filename: "abc.img" + type: IMAGETYPE_IMG +} + +image_writer { + filename: "abc.img" + type: IMAGETYPE_IMG +} + +flux_source { + type: FLUXTYPE_DRIVE +} + +encoder { + ibm { + trackdata { + target_rotational_period_ms: 167 + target_clock_period_us: 3.333 + } + } +} + +decoder { + ibm { + } +} + +layout { + layoutdata { + sector_size: 512 + physical { + start_sector: 1 + count: 9 + } + } + tracks: 35 + sides: 2 + format_type: FORMATTYPE_40TRACK +} + +filesystem { + type: CPMFS + cpmfs { + filesystem_start { + track: 1 + side: 0 + sector: 1 + } + block_size: 2048 + dir_entries: 64 + } +} + + diff --git a/java/com/cowlark/fluxengine/buildtools/BUILD.bazel b/java/com/cowlark/fluxengine/buildtools/BUILD.bazel index 3e366d076..a8746faea 100644 --- a/java/com/cowlark/fluxengine/buildtools/BUILD.bazel +++ b/java/com/cowlark/fluxengine/buildtools/BUILD.bazel @@ -18,6 +18,12 @@ java_library( ], ) +java_binary( + name = "protoencode", + main_class = "com.cowlark.fluxengine.buildtools.ProtoEncode", + runtime_deps = [":buildtools"], +) + # The doc tools live in their own library, since they depend on the format # data, which is itself generated by the protoencode tool above. java_library( @@ -34,12 +40,6 @@ java_library( ], ) -java_binary( - name = "protoencode", - main_class = "com.cowlark.fluxengine.buildtools.ProtoEncode", - runtime_deps = [":buildtools"], -) - java_binary( name = "mkdoc", main_class = "com.cowlark.fluxengine.buildtools.MkDoc", diff --git a/java/com/cowlark/fluxengine/cli/Command.java b/java/com/cowlark/fluxengine/cli/Command.java index f7680a3b8..a4afe19ab 100644 --- a/java/com/cowlark/fluxengine/cli/Command.java +++ b/java/com/cowlark/fluxengine/cli/Command.java @@ -64,26 +64,15 @@ public interface Command .put("gui", GuiCommand::new) .build(); - /* Consume arguments until we reach a real command, instantiate it, and - * run it with the tail of the argv array. */ static boolean dispatch( Map> commands, - ImmutableList args) + ImmutableList args) throws Exception { - for (int index = 0; index < args.size(); index++) + Supplier supplier = commands.get(args.getFirst()); + if (supplier != null) { - Supplier supplier = commands.get(args.get(index)); - if (supplier != null) - { - try - { - supplier.get().run(ImmutableList.copyOf(args.subList(index + 1, args.size()))); - } catch (Exception e) - { - throw new RuntimeException(e); - } - return true; - } + supplier.get().run(ImmutableList.copyOf(args.subList(1, args.size()))); + return true; } return false; diff --git a/java/com/cowlark/fluxengine/cli/CommandGroup.java b/java/com/cowlark/fluxengine/cli/CommandGroup.java index 68438ce30..72e1a286e 100644 --- a/java/com/cowlark/fluxengine/cli/CommandGroup.java +++ b/java/com/cowlark/fluxengine/cli/CommandGroup.java @@ -1,5 +1,6 @@ package com.cowlark.fluxengine.cli; +import com.cowlark.fluxengine.core.FluxEngineException; import com.google.common.collect.ImmutableList; import java.util.Map; import java.util.function.Supplier; @@ -26,8 +27,11 @@ public String getHelp() } @Override - public void run(ImmutableList args) + public void run(ImmutableList args) throws Exception { + if (args.getFirst().startsWith("-")) + throw new FluxEngineException("CLI verbs must come before all options, sorry!"); + if (!Command.dispatch(subcommands, args)) Main.help(subcommands, " [...]"); } diff --git a/java/com/cowlark/fluxengine/cli/DevicesCommand.java b/java/com/cowlark/fluxengine/cli/DevicesCommand.java index 847c6cca7..c90f10084 100644 --- a/java/com/cowlark/fluxengine/cli/DevicesCommand.java +++ b/java/com/cowlark/fluxengine/cli/DevicesCommand.java @@ -2,8 +2,8 @@ import static com.google.common.base.Strings.nullToEmpty; -import com.cowlark.fluxengine.config.UsbFinder; -import com.cowlark.fluxengine.config.UsbFinder.CandidateDevice; +import com.cowlark.fluxengine.usb.UsbFinder; +import com.cowlark.fluxengine.usb.UsbFinder.CandidateDevice; import com.cowlark.fluxengine.core.flags.FlagGroup; import com.google.common.collect.ImmutableList; import java.util.List; diff --git a/java/com/cowlark/fluxengine/cli/Main.java b/java/com/cowlark/fluxengine/cli/Main.java index 2799659cb..a4d5c2d76 100644 --- a/java/com/cowlark/fluxengine/cli/Main.java +++ b/java/com/cowlark/fluxengine/cli/Main.java @@ -18,7 +18,7 @@ private Main() { } - public static void main(String[] args) + public static void main(String[] args) throws Exception { Logger.setLogger(LogRenderer.create(System.out)::add); diff --git a/java/com/cowlark/fluxengine/config/BUILD.bazel b/java/com/cowlark/fluxengine/config/BUILD.bazel index ce252731d..39aa8e5d0 100644 --- a/java/com/cowlark/fluxengine/config/BUILD.bazel +++ b/java/com/cowlark/fluxengine/config/BUILD.bazel @@ -84,15 +84,16 @@ java_library( "//java/com/cowlark/fluxengine/core/flags", "//java/com/cowlark/fluxengine/data", "//java/com/cowlark/fluxengine/fluxsink:fluxsink_java_proto", + "//java/com/cowlark/fluxengine/fluxsource", "//java/com/cowlark/fluxengine/fluxsource:fluxsource_java_proto", + "//java/com/cowlark/fluxengine/imagereader", "//java/com/cowlark/fluxengine/imagewriter:imagewriter_java_proto", + "//java/com/cowlark/fluxengine/usb", "@com_google_protobuf//java/core", "@maven//:com_fazecast_jSerialComm", "@maven//:com_google_guava_guava", "@maven//:com_jayway_jsonpath_json_path", "@maven//:javax_usb_usb_api", - "@maven//:net_java_dev_jna_jna", - "@maven//:net_java_dev_jna_jna_platform", "@maven//:org_projectlombok_lombok", "@maven//:org_usb4java_usb4java_javax", ], diff --git a/java/com/cowlark/fluxengine/config/ConfigBuilder.java b/java/com/cowlark/fluxengine/config/ConfigBuilder.java index 8901894a3..663045f97 100644 --- a/java/com/cowlark/fluxengine/config/ConfigBuilder.java +++ b/java/com/cowlark/fluxengine/config/ConfigBuilder.java @@ -14,27 +14,21 @@ import static com.cowlark.fluxengine.config.FluxSourceSinkType.FLUXTYPE_TEST_PATTERN; import static com.cowlark.fluxengine.config.FluxSourceSinkType.FLUXTYPE_VCD; import static com.cowlark.fluxengine.config.ImageFormats.Mode.MODE_RO; -import static com.cowlark.fluxengine.config.ImageReaderWriterType.IMAGETYPE_D64; -import static com.cowlark.fluxengine.config.ImageReaderWriterType.IMAGETYPE_D88; -import static com.cowlark.fluxengine.config.ImageReaderWriterType.IMAGETYPE_DIM; -import static com.cowlark.fluxengine.config.ImageReaderWriterType.IMAGETYPE_DISKCOPY; -import static com.cowlark.fluxengine.config.ImageReaderWriterType.IMAGETYPE_FDI; -import static com.cowlark.fluxengine.config.ImageReaderWriterType.IMAGETYPE_IMD; -import static com.cowlark.fluxengine.config.ImageReaderWriterType.IMAGETYPE_IMG; -import static com.cowlark.fluxengine.config.ImageReaderWriterType.IMAGETYPE_JV3; -import static com.cowlark.fluxengine.config.ImageReaderWriterType.IMAGETYPE_NFD; -import static com.cowlark.fluxengine.config.ImageReaderWriterType.IMAGETYPE_NSI; -import static com.cowlark.fluxengine.config.ImageReaderWriterType.IMAGETYPE_TD0; import com.cowlark.fluxengine.config.ImageFormats.ImageFormat; +import com.cowlark.fluxengine.core.FluxEngineException; import com.cowlark.fluxengine.core.Logger; import com.cowlark.fluxengine.core.flags.FlagGroup; import com.cowlark.fluxengine.core.flags.Flags; import com.cowlark.fluxengine.data.Formats; import com.cowlark.fluxengine.fluxsink.FluxSinkProto; +import com.cowlark.fluxengine.fluxsource.FluxSource; import com.cowlark.fluxengine.fluxsource.FluxSourceProto; +import com.cowlark.fluxengine.imagereader.ImageReader; +import com.cowlark.fluxengine.usb.UsbFinder; import com.google.common.collect.ImmutableList; import com.google.protobuf.TextFormat; +import lombok.SneakyThrows; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; @@ -131,51 +125,68 @@ public ConfigBuilder mergeConfig(ConfigProto other) return this; } + @SneakyThrows public ConfigBuilder withFluxSource(String filename) { - FluxSourceProto.Builder fluxSource = proto.getFluxSourceBuilder(); + FluxSourceProto.Builder fluxSourceProto = proto.getFluxSourceBuilder(); if (filename.endsWith(".flux")) { - fluxSource.setType(FLUXTYPE_FLUX); - fluxSource.getFl2Builder().setFilename(filename); + fluxSourceProto.setType(FLUXTYPE_FLUX); + fluxSourceProto.getFl2Builder().setFilename(filename); } else if (filename.endsWith(".scp")) { - fluxSource.setType(FLUXTYPE_SCP); - fluxSource.getScpBuilder().setFilename(filename); + fluxSourceProto.setType(FLUXTYPE_SCP); + fluxSourceProto.getScpBuilder().setFilename(filename); } else if (filename.endsWith(".a2r")) { - fluxSource.setType(FLUXTYPE_A2R); - fluxSource.getA2RBuilder().setFilename(filename); + fluxSourceProto.setType(FLUXTYPE_A2R); + fluxSourceProto.getA2RBuilder().setFilename(filename); } else if (filename.endsWith(".cwf")) { - fluxSource.setType(FLUXTYPE_CWF); - fluxSource.getCwfBuilder().setFilename(filename); + fluxSourceProto.setType(FLUXTYPE_CWF); + fluxSourceProto.getCwfBuilder().setFilename(filename); } else if (filename.startsWith("dmk:")) { - fluxSource.setType(FLUXTYPE_DMK); - fluxSource.getDmkBuilder().setDirectory(filename.substring(4)); + fluxSourceProto.setType(FLUXTYPE_DMK); + fluxSourceProto.getDmkBuilder().setDirectory(filename.substring(4)); } else if (filename.equals("erase:")) { - fluxSource.setType(FLUXTYPE_ERASE); + fluxSourceProto.setType(FLUXTYPE_ERASE); } else if (filename.startsWith("kryoflux:")) { - fluxSource.setType(FLUXTYPE_KRYOFLUX); - fluxSource.getKryofluxBuilder().setDirectory(filename.substring(9)); + fluxSourceProto.setType(FLUXTYPE_KRYOFLUX); + fluxSourceProto.getKryofluxBuilder().setDirectory(filename.substring(9)); } else if (filename.startsWith("testpattern:")) { - fluxSource.setType(FLUXTYPE_TEST_PATTERN); + fluxSourceProto.setType(FLUXTYPE_TEST_PATTERN); } else if (filename.startsWith("drive:")) { - fluxSource.setType(FLUXTYPE_DRIVE); + fluxSourceProto.setType(FLUXTYPE_DRIVE); proto.getDriveBuilder().setDrive(Integer.parseInt(filename.substring(6))); } else if (filename.startsWith("flx:")) { - fluxSource.setType(FLUXTYPE_FLX); - fluxSource.getFlxBuilder().setDirectory(filename.substring(4)); + fluxSourceProto.setType(FLUXTYPE_FLX); + fluxSourceProto.getFlxBuilder().setDirectory(filename.substring(4)); } else if (filename.startsWith("nop:")) - fluxSource.setType(FLUXTYPE_NOP); + fluxSourceProto.setType(FLUXTYPE_NOP); else throw new ConfigException("unrecognised flux filename '" + filename + "'"); + + /* If the FluxSource has any extra config to contribute, add it here. */ + + try (FluxSource fluxSource = FluxSource.create( + ConfigProto + .newBuilder() + .setFluxSource(fluxSourceProto) + .build(), () -> null)) + { + ConfigProto extraConfig = fluxSource.getExtraConfig(); + if (extraConfig != null) + proto.mergeFrom(extraConfig); + } catch (FluxEngineException e) + { + /* File not found --- ignore. */ + } return this; } @@ -245,12 +256,20 @@ public ConfigBuilder withImageWriter(String filename) return this; } + @SneakyThrows public ConfigBuilder withImageReader(String filename) { ImageFormat format = findImageFormat(filename); if (format == null) throw new ConfigException("unrecognised image filename '" + filename + "'"); proto.getImageReaderBuilder().setType(format.type()).setFilename(filename); + + try (ImageReader reader = ImageReader.create(proto.getImageReader())) + { + ConfigProto extraConfig = reader.getExtraConfig(); + if (extraConfig != null) + proto.mergeFrom(extraConfig); + } return this; } diff --git a/java/com/cowlark/fluxengine/config/ConfigException.java b/java/com/cowlark/fluxengine/core/ConfigException.java similarity index 100% rename from java/com/cowlark/fluxengine/config/ConfigException.java rename to java/com/cowlark/fluxengine/core/ConfigException.java diff --git a/java/com/cowlark/fluxengine/data/Locations.java b/java/com/cowlark/fluxengine/data/Locations.java index 4a2a1b4bd..eb3e0ffbf 100644 --- a/java/com/cowlark/fluxengine/data/Locations.java +++ b/java/com/cowlark/fluxengine/data/Locations.java @@ -3,6 +3,7 @@ import com.cowlark.fluxengine.core.FluxEngineException; import com.google.common.collect.ImmutableList; import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; import java.util.List; @@ -38,7 +39,7 @@ public static String convertCylinderHeadsToString(List chs) { StringBuilder sb = new StringBuilder(); boolean first = true; - for (CylinderHead ch : chs) + for (CylinderHead ch : chs.stream().sorted().collect(ImmutableList.toImmutableList())) { if (!first) sb.append(' '); diff --git a/java/com/cowlark/fluxengine/fluxsource/A2RFluxSource.java b/java/com/cowlark/fluxengine/fluxsource/A2RFluxSource.java index 955a87af7..09385db95 100644 --- a/java/com/cowlark/fluxengine/fluxsource/A2RFluxSource.java +++ b/java/com/cowlark/fluxengine/fluxsource/A2RFluxSource.java @@ -1,6 +1,5 @@ package com.cowlark.fluxengine.fluxsource; -import com.cowlark.fluxengine.config.ConfigBuilder; import com.cowlark.fluxengine.config.ConfigProto; import com.cowlark.fluxengine.core.ByteReader; import com.cowlark.fluxengine.core.Bytes; @@ -108,9 +107,9 @@ private static void error(String message) } @Override - public void adjustConfig(ConfigBuilder configBuilder) + public ConfigProto getExtraConfig() { - configBuilder.mergeConfig(extraConfig); + return extraConfig; } @Override diff --git a/java/com/cowlark/fluxengine/fluxsource/BUILD.bazel b/java/com/cowlark/fluxengine/fluxsource/BUILD.bazel index 774748e72..cc6229ee1 100644 --- a/java/com/cowlark/fluxengine/fluxsource/BUILD.bazel +++ b/java/com/cowlark/fluxengine/fluxsource/BUILD.bazel @@ -22,7 +22,6 @@ java_library( plugins = ["//java/com/cowlark/fluxengine/wiring:lombok_plugin"], deps = [ ":fluxsource_java_proto", - "//java/com/cowlark/fluxengine/config", "//java/com/cowlark/fluxengine/config:common_java_proto", "//java/com/cowlark/fluxengine/config:config_java_proto", "//java/com/cowlark/fluxengine/core", diff --git a/java/com/cowlark/fluxengine/fluxsource/CwfFluxSource.java b/java/com/cowlark/fluxengine/fluxsource/CwfFluxSource.java index dd5b20d4f..7f035deea 100644 --- a/java/com/cowlark/fluxengine/fluxsource/CwfFluxSource.java +++ b/java/com/cowlark/fluxengine/fluxsource/CwfFluxSource.java @@ -1,6 +1,5 @@ package com.cowlark.fluxengine.fluxsource; -import com.cowlark.fluxengine.config.ConfigBuilder; import com.cowlark.fluxengine.config.ConfigProto; import com.cowlark.fluxengine.core.ByteReader; import com.cowlark.fluxengine.core.Bytes; @@ -105,9 +104,9 @@ private static Bytes readFile(String filename) } @Override - public void adjustConfig(ConfigBuilder configBuilder) + public ConfigProto getExtraConfig() { - configBuilder.mergeConfig(extraConfig); + return extraConfig; } @Override diff --git a/java/com/cowlark/fluxengine/fluxsource/DmkFluxSource.java b/java/com/cowlark/fluxengine/fluxsource/DmkFluxSource.java index 24752e520..59284c892 100644 --- a/java/com/cowlark/fluxengine/fluxsource/DmkFluxSource.java +++ b/java/com/cowlark/fluxengine/fluxsource/DmkFluxSource.java @@ -1,6 +1,5 @@ package com.cowlark.fluxengine.fluxsource; -import com.cowlark.fluxengine.config.ConfigBuilder; import com.cowlark.fluxengine.config.ConfigProto; import com.cowlark.fluxengine.data.CylinderHead; import com.cowlark.fluxengine.data.Locations; @@ -45,9 +44,9 @@ public DmkFluxSource(DmkFluxSourceProto config) } @Override - public void adjustConfig(ConfigBuilder configBuilder) + public ConfigProto getExtraConfig() { - configBuilder.mergeConfig(extraConfig); + return extraConfig; } @Override diff --git a/java/com/cowlark/fluxengine/fluxsource/EraseFluxSource.java b/java/com/cowlark/fluxengine/fluxsource/EraseFluxSource.java index 0486bb7bf..ad713d486 100644 --- a/java/com/cowlark/fluxengine/fluxsource/EraseFluxSource.java +++ b/java/com/cowlark/fluxengine/fluxsource/EraseFluxSource.java @@ -1,6 +1,5 @@ package com.cowlark.fluxengine.fluxsource; -import com.cowlark.fluxengine.config.ConfigBuilder; import com.cowlark.fluxengine.config.ConfigProto; import com.cowlark.fluxengine.data.Fluxmap; @@ -20,9 +19,9 @@ public EraseFluxSource(EraseFluxSourceProto config) } @Override - public void adjustConfig(ConfigBuilder configBuilder) + public ConfigProto getExtraConfig() { - configBuilder.mergeConfig(extraConfig); + return extraConfig; } @Override diff --git a/java/com/cowlark/fluxengine/fluxsource/Fl2FluxSource.java b/java/com/cowlark/fluxengine/fluxsource/Fl2FluxSource.java index 859612b9f..8101693da 100644 --- a/java/com/cowlark/fluxengine/fluxsource/Fl2FluxSource.java +++ b/java/com/cowlark/fluxengine/fluxsource/Fl2FluxSource.java @@ -1,6 +1,5 @@ package com.cowlark.fluxengine.fluxsource; -import com.cowlark.fluxengine.config.ConfigBuilder; import com.cowlark.fluxengine.config.ConfigProto; import com.cowlark.fluxengine.core.Bytes; import com.cowlark.fluxengine.core.FluxEngineException; @@ -108,9 +107,9 @@ private static FluxFileProto upgradeFluxFile(FluxFileProto proto) } @Override - public void adjustConfig(ConfigBuilder configBuilder) + public ConfigProto getExtraConfig() { - configBuilder.mergeConfig(extraConfig); + return extraConfig; } @Override diff --git a/java/com/cowlark/fluxengine/fluxsource/FluxSource.java b/java/com/cowlark/fluxengine/fluxsource/FluxSource.java index 0b2255b6d..0982f8562 100644 --- a/java/com/cowlark/fluxengine/fluxsource/FluxSource.java +++ b/java/com/cowlark/fluxengine/fluxsource/FluxSource.java @@ -1,6 +1,5 @@ package com.cowlark.fluxengine.fluxsource; -import com.cowlark.fluxengine.config.ConfigBuilder; import com.cowlark.fluxengine.config.ConfigProto; import com.cowlark.fluxengine.core.FluxEngineException; import com.cowlark.fluxengine.usb.UsbFactory; @@ -37,9 +36,10 @@ public void close() throws Exception { } - /* Adjusts the current configuration based on the contents of this flux source. */ - public void adjustConfig(ConfigBuilder configBuilder) + /* Returns any adjustments required by the current config. */ + public ConfigProto getExtraConfig() { + return null; } /* Read flux from a given cylinder and head. */ diff --git a/java/com/cowlark/fluxengine/fluxsource/FlxFluxSource.java b/java/com/cowlark/fluxengine/fluxsource/FlxFluxSource.java index f842e2a42..a38467ddc 100644 --- a/java/com/cowlark/fluxengine/fluxsource/FlxFluxSource.java +++ b/java/com/cowlark/fluxengine/fluxsource/FlxFluxSource.java @@ -1,6 +1,5 @@ package com.cowlark.fluxengine.fluxsource; -import com.cowlark.fluxengine.config.ConfigBuilder; import com.cowlark.fluxengine.config.ConfigProto; import com.cowlark.fluxengine.core.Bytes; import com.cowlark.fluxengine.core.FluxEngineException; @@ -65,9 +64,9 @@ private static Bytes readFile(String filename) } @Override - public void adjustConfig(ConfigBuilder configBuilder) + public ConfigProto getExtraConfig() { - configBuilder.mergeConfig(extraConfig); + return extraConfig; } @Override diff --git a/java/com/cowlark/fluxengine/fluxsource/KryofluxFluxSource.java b/java/com/cowlark/fluxengine/fluxsource/KryofluxFluxSource.java index 3d0776840..119a28c68 100644 --- a/java/com/cowlark/fluxengine/fluxsource/KryofluxFluxSource.java +++ b/java/com/cowlark/fluxengine/fluxsource/KryofluxFluxSource.java @@ -1,6 +1,5 @@ package com.cowlark.fluxengine.fluxsource; -import com.cowlark.fluxengine.config.ConfigBuilder; import com.cowlark.fluxengine.config.ConfigProto; import com.cowlark.fluxengine.data.CylinderHead; import com.cowlark.fluxengine.data.Fluxmap; @@ -48,9 +47,9 @@ public KryofluxFluxSource(KryofluxFluxSourceProto config) } @Override - public void adjustConfig(ConfigBuilder configBuilder) + public ConfigProto getExtraConfig() { - configBuilder.mergeConfig(extraConfig); + return extraConfig; } @Override diff --git a/java/com/cowlark/fluxengine/fluxsource/MemoryFluxSource.java b/java/com/cowlark/fluxengine/fluxsource/MemoryFluxSource.java index b9dbebd8d..9d0958a28 100644 --- a/java/com/cowlark/fluxengine/fluxsource/MemoryFluxSource.java +++ b/java/com/cowlark/fluxengine/fluxsource/MemoryFluxSource.java @@ -1,6 +1,5 @@ package com.cowlark.fluxengine.fluxsource; -import com.cowlark.fluxengine.config.ConfigBuilder; import com.cowlark.fluxengine.config.ConfigProto; import com.cowlark.fluxengine.data.CylinderHead; import com.cowlark.fluxengine.data.Disk; @@ -34,9 +33,9 @@ public MemoryFluxSource(Disk flux) } @Override - public void adjustConfig(ConfigBuilder configBuilder) + public ConfigProto getExtraConfig() { - configBuilder.mergeConfig(extraConfig); + return extraConfig; } @Override diff --git a/java/com/cowlark/fluxengine/fluxsource/ScpFluxSource.java b/java/com/cowlark/fluxengine/fluxsource/ScpFluxSource.java index f47fb32d8..8563d71ae 100644 --- a/java/com/cowlark/fluxengine/fluxsource/ScpFluxSource.java +++ b/java/com/cowlark/fluxengine/fluxsource/ScpFluxSource.java @@ -3,7 +3,6 @@ import static com.cowlark.fluxengine.external.Scp.SCP_FLAG_96TPI; import static com.cowlark.fluxengine.wiring.FluxEngine.NS_PER_TICK; -import com.cowlark.fluxengine.config.ConfigBuilder; import com.cowlark.fluxengine.config.ConfigProto; import com.cowlark.fluxengine.core.ByteReader; import com.cowlark.fluxengine.core.Bytes; @@ -98,9 +97,9 @@ private static Bytes readFile(String filename) } @Override - public void adjustConfig(ConfigBuilder configBuilder) + public ConfigProto getExtraConfig() { - configBuilder.mergeConfig(extraConfig); + return extraConfig; } @Override diff --git a/java/com/cowlark/fluxengine/fluxsource/TestPatternFluxSource.java b/java/com/cowlark/fluxengine/fluxsource/TestPatternFluxSource.java index f4e4403c4..8f23208d3 100644 --- a/java/com/cowlark/fluxengine/fluxsource/TestPatternFluxSource.java +++ b/java/com/cowlark/fluxengine/fluxsource/TestPatternFluxSource.java @@ -1,6 +1,5 @@ package com.cowlark.fluxengine.fluxsource; -import com.cowlark.fluxengine.config.ConfigBuilder; import com.cowlark.fluxengine.config.ConfigProto; import com.cowlark.fluxengine.data.Fluxmap; import com.cowlark.fluxengine.wiring.FluxEngine; @@ -26,9 +25,9 @@ public TestPatternFluxSource(TestPatternFluxSourceProto config) } @Override - public void adjustConfig(ConfigBuilder configBuilder) + public ConfigProto getExtraConfig() { - configBuilder.mergeConfig(extraConfig); + return extraConfig; } @Override diff --git a/java/com/cowlark/fluxengine/gui/ConfigurationPanel.java b/java/com/cowlark/fluxengine/gui/ConfigurationPanel.java index 3568f98c8..ee95dd2cf 100644 --- a/java/com/cowlark/fluxengine/gui/ConfigurationPanel.java +++ b/java/com/cowlark/fluxengine/gui/ConfigurationPanel.java @@ -21,7 +21,7 @@ import com.cowlark.fluxengine.config.OptionApplicabilityHint; import com.cowlark.fluxengine.config.OptionGroupProto; import com.cowlark.fluxengine.config.OptionProto; -import com.cowlark.fluxengine.config.UsbFinder; +import com.cowlark.fluxengine.usb.UsbFinder; import com.cowlark.fluxengine.data.Formats; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; diff --git a/java/com/cowlark/fluxengine/gui/ImagerViewModel.java b/java/com/cowlark/fluxengine/gui/ImagerViewModel.java index d98e4605b..aa0287b60 100644 --- a/java/com/cowlark/fluxengine/gui/ImagerViewModel.java +++ b/java/com/cowlark/fluxengine/gui/ImagerViewModel.java @@ -18,8 +18,8 @@ import com.cowlark.fluxengine.algorithms.ReadWriteFluxOperation; import com.cowlark.fluxengine.config.ConfigBuilder; import com.cowlark.fluxengine.config.ConfigProto; -import com.cowlark.fluxengine.config.UsbFinder; -import com.cowlark.fluxengine.config.UsbFinder.CandidateDevice; +import com.cowlark.fluxengine.usb.UsbFinder; +import com.cowlark.fluxengine.usb.UsbFinder.CandidateDevice; import com.cowlark.fluxengine.core.FluxEngineException; import com.cowlark.fluxengine.core.LogMessage; import com.cowlark.fluxengine.core.LogMessage.ErrorLogMessage; @@ -158,9 +158,7 @@ Var> getOptionsForDevice() void refreshUsbDevices() { usbDevices.set(Association - .between( - String.class, - com.cowlark.fluxengine.config.UsbFinder.CandidateDevice.class) + .between(String.class, UsbFinder.CandidateDevice.class) .put(DEVICE_FLUXFILE, new CandidateDevice()) .put(DEVICE_SERIALPORT, new CandidateDevice()) .putAll(UsbFinder diff --git a/java/com/cowlark/fluxengine/usb/BUILD.bazel b/java/com/cowlark/fluxengine/usb/BUILD.bazel index 0565850a5..937b2ed46 100644 --- a/java/com/cowlark/fluxengine/usb/BUILD.bazel +++ b/java/com/cowlark/fluxengine/usb/BUILD.bazel @@ -23,7 +23,6 @@ java_library( resources = ["//java:javax.usb.properties"], deps = [ ":usb_java_proto", - "//java/com/cowlark/fluxengine/config", "//java/com/cowlark/fluxengine/config:config_java_proto", "//java/com/cowlark/fluxengine/core", "//java/com/cowlark/fluxengine/data", @@ -33,6 +32,8 @@ java_library( "@maven//:com_fazecast_jSerialComm", "@maven//:com_google_guava_guava", "@maven//:javax_usb_usb_api", + "@maven//:net_java_dev_jna_jna", + "@maven//:net_java_dev_jna_jna_platform", "@maven//:org_projectlombok_lombok", "@maven//:org_slf4j_slf4j_api", "@maven//:org_usb4java_usb4java_javax", diff --git a/java/com/cowlark/fluxengine/config/HackyUsbSerialNumberResolver.java b/java/com/cowlark/fluxengine/usb/HackyUsbSerialNumberResolver.java similarity index 99% rename from java/com/cowlark/fluxengine/config/HackyUsbSerialNumberResolver.java rename to java/com/cowlark/fluxengine/usb/HackyUsbSerialNumberResolver.java index 896222e4b..69133e837 100644 --- a/java/com/cowlark/fluxengine/config/HackyUsbSerialNumberResolver.java +++ b/java/com/cowlark/fluxengine/usb/HackyUsbSerialNumberResolver.java @@ -1,4 +1,4 @@ -package com.cowlark.fluxengine.config; +package com.cowlark.fluxengine.usb; import com.sun.jna.Native; import com.sun.jna.Pointer; diff --git a/java/com/cowlark/fluxengine/usb/UsbFactory.java b/java/com/cowlark/fluxengine/usb/UsbFactory.java index 467dced7b..579f750e5 100644 --- a/java/com/cowlark/fluxengine/usb/UsbFactory.java +++ b/java/com/cowlark/fluxengine/usb/UsbFactory.java @@ -1,9 +1,8 @@ package com.cowlark.fluxengine.usb; import com.cowlark.fluxengine.config.ConfigProto; -import com.cowlark.fluxengine.config.UsbFinder; -import com.cowlark.fluxengine.config.UsbFinder.CandidateDevice; import com.cowlark.fluxengine.core.Logger; +import com.cowlark.fluxengine.usb.UsbFinder.CandidateDevice; import lombok.SneakyThrows; import org.slf4j.LoggerFactory; import java.util.function.Consumer; diff --git a/java/com/cowlark/fluxengine/config/UsbFinder.java b/java/com/cowlark/fluxengine/usb/UsbFinder.java similarity index 97% rename from java/com/cowlark/fluxengine/config/UsbFinder.java rename to java/com/cowlark/fluxengine/usb/UsbFinder.java index af69e1758..2f9e14a60 100644 --- a/java/com/cowlark/fluxengine/config/UsbFinder.java +++ b/java/com/cowlark/fluxengine/usb/UsbFinder.java @@ -1,5 +1,7 @@ -package com.cowlark.fluxengine.config; +package com.cowlark.fluxengine.usb; +import com.cowlark.fluxengine.config.ConfigException; +import com.cowlark.fluxengine.config.ConfigProtoOrBuilder; import com.fazecast.jSerialComm.SerialPort; import com.google.common.base.Strings; import com.google.common.collect.ImmutableList; diff --git a/java/com/cowlark/fluxengine/vfs/FluxBlockDevice.java b/java/com/cowlark/fluxengine/vfs/FluxBlockDevice.java index f926a656d..db4893860 100644 --- a/java/com/cowlark/fluxengine/vfs/FluxBlockDevice.java +++ b/java/com/cowlark/fluxengine/vfs/FluxBlockDevice.java @@ -7,8 +7,10 @@ import com.cowlark.fluxengine.data.LogicalTrackLayout; import com.cowlark.fluxengine.data.Sector; import com.cowlark.fluxengine.data.Track; +import com.google.common.collect.ImmutableCollection; import com.google.common.collect.ImmutableList; import java.util.ArrayList; +import java.util.Collection; public class FluxBlockDevice extends TrackedBlockDevice { @@ -21,44 +23,50 @@ public FluxBlockDevice(FilesystemOperation fso) } @Override - protected void commitTrack(Image source, CylinderHead lch) + protected void commitTracks(Image source, ImmutableCollection lchs) { - LogicalTrackLayout ltl = diskLayout.layoutByLogicalLocation.get(lch); Image merged = new Image(); - for (int sectorId : ltl.diskSectorOrder) + for (CylinderHead lch : lchs) { - CylinderHeadSector loc = - new CylinderHeadSector(ltl.logicalCylinder, ltl.logicalHead, sectorId); - Sector sector = null; - if (source.contains(loc)) - sector = source.get(loc); - else if (originalData.contains(loc)) - sector = originalData.get(loc); - - if (sector != null) - merged.put(loc).copyFrom(sector); - else + LogicalTrackLayout ltl = diskLayout.layoutByLogicalLocation.get(lch); + for (int sectorId : ltl.diskSectorOrder) { - Sector newSector = merged.put(loc); - newSector.data = new com.cowlark.fluxengine.core.Bytes(ltl.sectorSize); - newSector.status = Sector.Status.OK; + CylinderHeadSector loc = + new CylinderHeadSector(ltl.logicalCylinder, ltl.logicalHead, sectorId); + Sector sector = null; + if (source.contains(loc)) + sector = source.get(loc); + else if (originalData.contains(loc)) + sector = originalData.get(loc); + + if (sector != null) + merged.put(loc).copyFrom(sector); + else + { + Sector newSector = merged.put(loc); + newSector.data = new com.cowlark.fluxengine.core.Bytes(ltl.sectorSize); + newSector.status = Sector.Status.OK; + } } } Disk disk = new Disk(); disk.image = merged; - fso.writeDisk(disk, ImmutableList.of(lch)); + fso.writeDisk(disk, lchs); } @Override - protected void populateTrack(Image destination, CylinderHead lch) + protected void populateTracks(Image destination, ImmutableCollection lchs) { - LogicalTrackLayout ltl = diskLayout.layoutByLogicalLocation.get(lch); - ArrayList trackFluxes = new ArrayList<>(); - ArrayList trackSectors = new ArrayList<>(); - fso.readAndDecodeTrack(ltl, trackFluxes, trackSectors); + for (CylinderHead lch : lchs) + { + LogicalTrackLayout ltl = diskLayout.layoutByLogicalLocation.get(lch); + ArrayList trackFluxes = new ArrayList<>(); + ArrayList trackSectors = new ArrayList<>(); + fso.readAndDecodeTrack(ltl, trackFluxes, trackSectors); - for (Sector sector : trackSectors) - destination.put(sector.logicalLocation).copyFrom(sector); + for (Sector sector : trackSectors) + destination.put(sector.logicalLocation).copyFrom(sector); + } } } diff --git a/java/com/cowlark/fluxengine/vfs/InMemoryBlockDevice.java b/java/com/cowlark/fluxengine/vfs/InMemoryBlockDevice.java index 2c8e055ec..a568a7ae7 100644 --- a/java/com/cowlark/fluxengine/vfs/InMemoryBlockDevice.java +++ b/java/com/cowlark/fluxengine/vfs/InMemoryBlockDevice.java @@ -3,6 +3,8 @@ import com.cowlark.fluxengine.data.CylinderHead; import com.cowlark.fluxengine.data.DiskLayout; import com.cowlark.fluxengine.data.Image; +import com.google.common.collect.ImmutableCollection; +import java.util.Collection; public class InMemoryBlockDevice extends TrackedBlockDevice { @@ -16,14 +18,16 @@ public InMemoryBlockDevice(DiskLayout diskLayout, Image image) } @Override - protected void populateTrack(Image destination, CylinderHead lch) + protected void populateTracks(Image destination, ImmutableCollection lchs) { - copySectors(image, destination, lch); + for (CylinderHead lch : lchs) + copySectors(image, destination, lch); } @Override - protected void commitTrack(Image source, CylinderHead lch) + protected void commitTracks(Image source, ImmutableCollection lchs) { - copySectors(source, image, lch); + for (CylinderHead lch : lchs) + copySectors(source, image, lch); } } diff --git a/java/com/cowlark/fluxengine/vfs/TrackedBlockDevice.java b/java/com/cowlark/fluxengine/vfs/TrackedBlockDevice.java index 1bf8f4b6b..f1315c300 100644 --- a/java/com/cowlark/fluxengine/vfs/TrackedBlockDevice.java +++ b/java/com/cowlark/fluxengine/vfs/TrackedBlockDevice.java @@ -5,8 +5,12 @@ import com.cowlark.fluxengine.data.CylinderHeadSector; import com.cowlark.fluxengine.data.DiskLayout; import com.cowlark.fluxengine.data.Image; +import com.google.common.collect.ImmutableCollection; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableSet; import java.io.IOException; import java.nio.file.FileSystemException; +import java.util.Collection; public abstract class TrackedBlockDevice extends BlockDevice { @@ -29,7 +33,7 @@ public Bytes getBlock(int blockNumber) throws IOException return changedData.get(ll).data; if (originalData.contains(ll)) return originalData.get(ll).data; - populateTrack(originalData, ll.trackLocation()); + populateTracks(originalData, ImmutableList.of(ll.trackLocation())); return originalData.get(ll).data; } @@ -40,17 +44,23 @@ public void putBlock(int blockNumber, Bytes block) throws FileSystemException changedData.put(ll).data = block; } - protected abstract void commitTrack(Image source, CylinderHead lch); + protected abstract void commitTracks(Image source, ImmutableCollection lch); - protected abstract void populateTrack(Image destination, CylinderHead lch); + protected abstract void populateTracks( + Image destination, + ImmutableCollection lch); @Override public void commit() { - changedData.getLogicalLocations().stream().map(ll -> ll.trackLocation()).forEach(lch -> { - commitTrack(changedData, lch); + ImmutableSet.Builder changedTracks = ImmutableSet.builder(); + for (CylinderHeadSector ll : changedData.getLogicalLocations()) + { + CylinderHead lch = ll.trackLocation(); copySectors(changedData, originalData, lch); - }); + changedTracks.add(lch); + } + commitTracks(changedData, changedTracks.build()); changedData = new Image(); } diff --git a/javatests/com/cowlark/fluxengine/config/BUILD.bazel b/javatests/com/cowlark/fluxengine/config/BUILD.bazel index c02c179d2..b6da9d554 100644 --- a/javatests/com/cowlark/fluxengine/config/BUILD.bazel +++ b/javatests/com/cowlark/fluxengine/config/BUILD.bazel @@ -26,6 +26,7 @@ java_test( deps = [ "//java/com/cowlark/fluxengine/config", "//java/com/cowlark/fluxengine/config:config_java_proto", + "//java/com/cowlark/fluxengine/core", "@maven//:com_google_truth_truth", "@maven//:junit_junit", ], diff --git a/javatests/com/cowlark/fluxengine/data/FormatsTest.java b/javatests/com/cowlark/fluxengine/data/FormatsTest.java index d256ea96d..31307f0a7 100644 --- a/javatests/com/cowlark/fluxengine/data/FormatsTest.java +++ b/javatests/com/cowlark/fluxengine/data/FormatsTest.java @@ -35,7 +35,7 @@ public void returnsNullForUnknownName() @Test public void returnsAllConfigNames() { - assertThat(Formats.all()).hasSize(37); + assertThat(Formats.all()).hasSize(38); assertThat(Formats.all()).contains("ibm"); assertThat(Formats.all()).contains("_global_options"); } diff --git a/javatests/com/cowlark/fluxengine/fluxsource/A2RFluxSourceTest.java b/javatests/com/cowlark/fluxengine/fluxsource/A2RFluxSourceTest.java index dd0c3bcb7..d05c2c37f 100644 --- a/javatests/com/cowlark/fluxengine/fluxsource/A2RFluxSourceTest.java +++ b/javatests/com/cowlark/fluxengine/fluxsource/A2RFluxSourceTest.java @@ -1,12 +1,17 @@ package com.cowlark.fluxengine.fluxsource; +import static com.cowlark.fluxengine.external.DriveType.DRIVETYPE_40TRACK; +import static com.cowlark.fluxengine.external.DriveType.DRIVETYPE_80TRACK; import static com.google.common.truth.Truth.assertThat; +import static com.google.common.truth.extensions.proto.ProtoTruth.assertThat; import com.cowlark.fluxengine.config.ConfigBuilder; import com.cowlark.fluxengine.config.ConfigProto; +import com.cowlark.fluxengine.config.DriveProto; import com.cowlark.fluxengine.core.ByteWriter; import com.cowlark.fluxengine.core.Bytes; import com.cowlark.fluxengine.external.DriveType; +import com.google.common.truth.extensions.proto.ProtoTruth; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; @@ -98,10 +103,15 @@ public void readsTracks() throws IOException .setHead(0) .build())).isInstanceOf(EmptyFluxSourceIterator.class); - ConfigBuilder configBuilder = new ConfigBuilder().set("usb.serial", "test-serial"); - source.adjustConfig(configBuilder); - ConfigProto config = configBuilder.build(); - assertThat(config.getDrive().getTracks()).isEqualTo("c0h0"); - assertThat(config.getDrive().getDriveType()).isEqualTo(DriveType.DRIVETYPE_80TRACK); + assertThat(source.getExtraConfig()) + .comparingExpectedFieldsOnly() + .isEqualTo(ConfigProto + .newBuilder() + .setDrive(DriveProto + .newBuilder() + .setTracks("c0h0") + .setDriveType(DRIVETYPE_80TRACK) + .build()) + .build()); } } \ No newline at end of file diff --git a/javatests/com/cowlark/fluxengine/fluxsource/BUILD.bazel b/javatests/com/cowlark/fluxengine/fluxsource/BUILD.bazel index 886d42554..a9a950c2a 100644 --- a/javatests/com/cowlark/fluxengine/fluxsource/BUILD.bazel +++ b/javatests/com/cowlark/fluxengine/fluxsource/BUILD.bazel @@ -8,6 +8,7 @@ java_test( deps = [ "//java/com/cowlark/fluxengine/config", "//java/com/cowlark/fluxengine/config:config_java_proto", + "//java/com/cowlark/fluxengine/config:drive_java_proto", "//java/com/cowlark/fluxengine/core", "//java/com/cowlark/fluxengine/data", "//java/com/cowlark/fluxengine/external:fl2_java_proto", @@ -15,6 +16,7 @@ java_test( "//java/com/cowlark/fluxengine/fluxsource:fluxsource_java_proto", "//javatests/com/cowlark/fluxengine/testing", "@com_google_protobuf//java/core", + "@maven//:com_google_truth_extensions_truth_proto_extension", "@maven//:com_google_truth_truth", "@maven//:junit_junit", ], @@ -26,6 +28,7 @@ java_test( deps = [ "//java/com/cowlark/fluxengine/config", "//java/com/cowlark/fluxengine/config:config_java_proto", + "//java/com/cowlark/fluxengine/config:drive_java_proto", "//java/com/cowlark/fluxengine/core", "//java/com/cowlark/fluxengine/data", "//java/com/cowlark/fluxengine/external:fl2_java_proto", @@ -33,6 +36,7 @@ java_test( "//java/com/cowlark/fluxengine/fluxsource:fluxsource_java_proto", "//javatests/com/cowlark/fluxengine/testing", "@com_google_protobuf//java/core", + "@maven//:com_google_truth_extensions_truth_proto_extension", "@maven//:com_google_truth_truth", "@maven//:junit_junit", ], @@ -44,6 +48,7 @@ java_test( deps = [ "//java/com/cowlark/fluxengine/config", "//java/com/cowlark/fluxengine/config:config_java_proto", + "//java/com/cowlark/fluxengine/config:drive_java_proto", "//java/com/cowlark/fluxengine/core", "//java/com/cowlark/fluxengine/data", "//java/com/cowlark/fluxengine/external", @@ -52,6 +57,7 @@ java_test( "//java/com/cowlark/fluxengine/fluxsource:fluxsource_java_proto", "//javatests/com/cowlark/fluxengine/testing", "@com_google_protobuf//java/core", + "@maven//:com_google_truth_extensions_truth_proto_extension", "@maven//:com_google_truth_truth", "@maven//:junit_junit", ], @@ -63,6 +69,7 @@ java_test( deps = [ "//java/com/cowlark/fluxengine/config", "//java/com/cowlark/fluxengine/config:config_java_proto", + "//java/com/cowlark/fluxengine/config:drive_java_proto", "//java/com/cowlark/fluxengine/core", "//java/com/cowlark/fluxengine/data", "//java/com/cowlark/fluxengine/fluxsource", @@ -82,12 +89,14 @@ java_test( deps = [ "//java/com/cowlark/fluxengine/config", "//java/com/cowlark/fluxengine/config:config_java_proto", + "//java/com/cowlark/fluxengine/config:drive_java_proto", "//java/com/cowlark/fluxengine/core", "//java/com/cowlark/fluxengine/data", "//java/com/cowlark/fluxengine/fluxsource", "//java/com/cowlark/fluxengine/fluxsource:fluxsource_java_proto", "//javatests/com/cowlark/fluxengine/testing", "@com_google_protobuf//java/core", + "@maven//:com_google_truth_extensions_truth_proto_extension", "@maven//:com_google_truth_truth", "@maven//:junit_junit", ], diff --git a/javatests/com/cowlark/fluxengine/fluxsource/Fl2FluxSourceTest.java b/javatests/com/cowlark/fluxengine/fluxsource/Fl2FluxSourceTest.java index f9bfbcf88..b8b1c9e4c 100644 --- a/javatests/com/cowlark/fluxengine/fluxsource/Fl2FluxSourceTest.java +++ b/javatests/com/cowlark/fluxengine/fluxsource/Fl2FluxSourceTest.java @@ -1,9 +1,10 @@ package com.cowlark.fluxengine.fluxsource; import static com.google.common.truth.Truth.assertThat; +import static com.google.common.truth.extensions.proto.ProtoTruth.assertThat; -import com.cowlark.fluxengine.config.ConfigBuilder; import com.cowlark.fluxengine.config.ConfigProto; +import com.cowlark.fluxengine.config.DriveProto; import com.cowlark.fluxengine.external.FluxFileProto; import com.cowlark.fluxengine.external.FluxFileVersion; import com.cowlark.fluxengine.external.TrackFluxProto; @@ -60,11 +61,16 @@ public void readsTracks() throws IOException .setHead(0) .build())).isInstanceOf(EmptyFluxSourceIterator.class); - ConfigBuilder configBuilder = new ConfigBuilder().set("usb.serial", "test-serial"); - source.adjustConfig(configBuilder); - ConfigProto config = configBuilder.build(); - assertThat(config.getDrive().getTracks()).isEqualTo("c0h0"); - assertThat(config.getDrive().getRotationalPeriodMs()).isEqualTo(200.0); + assertThat(source.getExtraConfig()) + .comparingExpectedFieldsOnly() + .isEqualTo(ConfigProto + .newBuilder() + .setDrive(DriveProto + .newBuilder() + .setTracks("c0h0") + .setRotationalPeriodMs(200.0) + .build()) + .build()); } @Test diff --git a/javatests/com/cowlark/fluxengine/fluxsource/KryofluxFluxSourceTest.java b/javatests/com/cowlark/fluxengine/fluxsource/KryofluxFluxSourceTest.java index 3d052cf1e..ca8b8b4f4 100644 --- a/javatests/com/cowlark/fluxengine/fluxsource/KryofluxFluxSourceTest.java +++ b/javatests/com/cowlark/fluxengine/fluxsource/KryofluxFluxSourceTest.java @@ -1,8 +1,10 @@ package com.cowlark.fluxengine.fluxsource; import static com.google.common.truth.Truth.assertThat; +import static com.google.common.truth.extensions.proto.ProtoTruth.assertThat; -import com.cowlark.fluxengine.config.ConfigBuilder; +import com.cowlark.fluxengine.config.ConfigProto; +import com.cowlark.fluxengine.config.DriveProto; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; @@ -10,8 +12,6 @@ import org.junit.runners.JUnit4; import java.nio.file.Files; import java.nio.file.Path; -import java.util.Arrays; -import java.util.stream.Collectors; @RunWith(JUnit4.class) public class KryofluxFluxSourceTest @@ -37,10 +37,11 @@ public void readsSingleFluxFromDirectory() throws Exception .rawBytes() .toByteArray()).isEqualTo(new byte[]{(byte) 0x8f}); - ConfigBuilder configBuilder = new ConfigBuilder().set("usb.serial", "test-serial"); - source.adjustConfig(configBuilder); - String tracks = configBuilder.build().getDrive().getTracks(); - String sorted = Arrays.stream(tracks.split(" ")).sorted().collect(Collectors.joining(" ")); - assertThat(sorted).isEqualTo("c80h0 c81h1"); + assertThat(source.getExtraConfig()) + .comparingExpectedFieldsOnly() + .isEqualTo(ConfigProto + .newBuilder() + .setDrive(DriveProto.newBuilder().setTracks("c80h0 c81h1").build()) + .build()); } } \ No newline at end of file diff --git a/javatests/com/cowlark/fluxengine/fluxsource/ScpFluxSourceTest.java b/javatests/com/cowlark/fluxengine/fluxsource/ScpFluxSourceTest.java index 32234e29b..22e12871c 100644 --- a/javatests/com/cowlark/fluxengine/fluxsource/ScpFluxSourceTest.java +++ b/javatests/com/cowlark/fluxengine/fluxsource/ScpFluxSourceTest.java @@ -1,12 +1,13 @@ package com.cowlark.fluxengine.fluxsource; +import static com.cowlark.fluxengine.external.DriveType.DRIVETYPE_40TRACK; import static com.google.common.truth.Truth.assertThat; +import static com.google.common.truth.extensions.proto.ProtoTruth.assertThat; -import com.cowlark.fluxengine.config.ConfigBuilder; import com.cowlark.fluxengine.config.ConfigProto; +import com.cowlark.fluxengine.config.DriveProto; import com.cowlark.fluxengine.core.ByteWriter; import com.cowlark.fluxengine.core.Bytes; -import com.cowlark.fluxengine.external.DriveType; import com.cowlark.fluxengine.external.Scp; import org.junit.Test; import org.junit.runner.RunWith; @@ -82,11 +83,16 @@ public void readsTracks() throws IOException assertThat(iterator.next().rawBytes().toByteArray()).isEqualTo(expected.toByteArray()); assertThat(iterator.hasNext()).isFalse(); - ConfigBuilder configBuilder = new ConfigBuilder().set("usb.serial", "test-serial"); - source.adjustConfig(configBuilder); - ConfigProto config = configBuilder.build(); - assertThat(config.getDrive().getTracks()).isEqualTo("c0h0"); - assertThat(config.getDrive().getDriveType()).isEqualTo(DriveType.DRIVETYPE_40TRACK); + assertThat(source.getExtraConfig()) + .comparingExpectedFieldsOnly() + .isEqualTo(ConfigProto + .newBuilder() + .setDrive(DriveProto + .newBuilder() + .setTracks("c0h0") + .setDriveType(DRIVETYPE_40TRACK) + .build()) + .build()); } @Test diff --git a/javatests/com/cowlark/fluxengine/vfs/BUILD.bazel b/javatests/com/cowlark/fluxengine/vfs/BUILD.bazel index e79e6cef0..e74aa63bb 100644 --- a/javatests/com/cowlark/fluxengine/vfs/BUILD.bazel +++ b/javatests/com/cowlark/fluxengine/vfs/BUILD.bazel @@ -60,6 +60,7 @@ java_test( "//java/com/cowlark/fluxengine/data", "//java/com/cowlark/fluxengine/vfs", "//javatests/com/cowlark/fluxengine/testing", + "@maven//:com_google_guava_guava", "@maven//:com_google_truth_truth", "@maven//:junit_junit", ], diff --git a/javatests/com/cowlark/fluxengine/vfs/TrackedBlockDeviceTest.java b/javatests/com/cowlark/fluxengine/vfs/TrackedBlockDeviceTest.java index 29a09c7a7..e44135521 100644 --- a/javatests/com/cowlark/fluxengine/vfs/TrackedBlockDeviceTest.java +++ b/javatests/com/cowlark/fluxengine/vfs/TrackedBlockDeviceTest.java @@ -10,6 +10,7 @@ import com.cowlark.fluxengine.data.DiskLayout; import com.cowlark.fluxengine.data.Image; import com.cowlark.fluxengine.testing.TestHelpers; +import com.google.common.collect.ImmutableCollection; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TestRule; @@ -102,7 +103,7 @@ public void commitTrackMapsBlockToCorrectTrack() throws IOException /* ---- Parameterised commitTrack test ---- */ @Test - public void populateTrackMapsBlockToCorrectTrack() throws IOException + public void populateTrackMapsBlockToCorrectTracks() throws IOException { DiskLayout diskLayout = getDiskLayout(); Image image = new Image(); @@ -135,7 +136,7 @@ public void commitTrackMultipleSectorsOnSameTrack() throws IOException device.putBlock(1, dataBlock(20)); device.commit(); - assertThat(device.commitTrackCalls).hasSize(2); + assertThat(device.commitTrackCalls).hasSize(1); assertThat(image.get(0, 0, 1).data.toByteArray()).isEqualTo(dataBlock(10).toByteArray()); assertThat(image.get(0, 0, 2).data.toByteArray()).isEqualTo(dataBlock(20).toByteArray()); } @@ -159,7 +160,7 @@ public void commitTrackMultipleTracks() throws IOException } @Test - public void populateTrackMultipleTracks() throws IOException + public void populateTracksMultipleTracks() throws IOException { DiskLayout diskLayout = getDiskLayout(); Image image = new Image(); @@ -175,7 +176,7 @@ public void populateTrackMultipleTracks() throws IOException } @Test - public void populateTrackDeduplicatesAcrossBlocks() throws IOException + public void populateTracksDeduplicatesAcrossBlocks() throws IOException { DiskLayout diskLayout = getDiskLayout(); Image image = new Image(); @@ -245,17 +246,19 @@ private static class RecordingTrackedBlockDevice extends TrackedBlockDevice } @Override - protected void commitTrack(Image source, CylinderHead lch) + protected void commitTracks(Image source, ImmutableCollection lchs) { - commitTrackCalls.add(lch); - copySectors(source, image, lch); + commitTrackCalls.addAll(lchs); + for (CylinderHead lch : lchs) + copySectors(source, image, lch); } @Override - protected void populateTrack(Image destination, CylinderHead lch) + protected void populateTracks(Image destination, ImmutableCollection lchs) { - populateTrackCalls.add(lch); - copySectors(image, destination, lch); + populateTrackCalls.addAll(lchs); + for (CylinderHead lch : lchs) + copySectors(image, destination, lch); } } }