ProgramNameResolver.java

1
package com.github.dakusui.actionunit.actions.cmd;
2
3
import java.util.*;
4
import java.util.function.BiFunction;
5
import java.util.function.BiPredicate;
6
import java.util.function.Function;
7
8
import static java.util.Collections.unmodifiableList;
9
10
/**
11
 * A trivial interface to alias {@code BiFunction<String, String, String>} for readability.
12
 *
13
 * Sometimes, a program (`echo`, `ls`, etc.) may behave because of its implementation on a certain host.
14
 * To achieve intended behavior on the host, sometimes we need to specify a full-path of a command.
15
 * For instance, `echo` is a built-in of `bash` and to use `-E` option of `echo` command (not built-in!),
16
 * we must specify `/bin/echo`, instead of just `echo`.
17
 *
18
 * `CommanderConfig` has a method `programNameResolver`, which returns {@code BiFunction<String, String, String>}.
19
 * This bi-function is used to figure out an actual program name to be run on a certain host.
20
 *
21
 * That is, a pair of string values, which are host name and a command name are given to the bi-function, which is supposed to return an actual program name executed on the host as the given command name.
22
 */
23
public interface ProgramNameResolver extends BiFunction<String, String, String> {
24
  /**
25
   * A builder to create a {@link ProgramNameResolver} instance easily.
26
   * The instance built by this class behaves as follows, when a pair of hostname and command name:
27
   *
28
   * Check a list of entries ({@link ProgramNameResolver.Builder.Entry}) one by one if its `matcher` returns `true` for the pair.
29
   * If it finds an entry whose `matcher` gives true, applies a command name to its `resolver` and returns the value as the result of the program name resolver.
30
   * If no entry matches with the host name and the command name, an {@link NoSuchElementException} will be thrown.
31
   */
32
  class Builder {
33
    /**
34
     * A conversion rule entry.
35
     */
36
    interface Entry {
37
      /**
38
       * A bi-predicate that checks if a given pair of a host name and a command name matches this entry.
39
       * The first parameter corresponds to the host name and the second one corresponds to the command name.
40
       *
41
       * @return matcher bi-predicate.
42
       */
43
      BiPredicate<String, String> matcher();
44
45
      /**
46
       * Returns a function that maps a command name to an actual program name, executed on the host, checked by the bi-predicate retuened by `matcher()` method.
47
       *
48
       * @return A function that maps a command name to an actual program name
49
       */
50
      Function<String, String> resolver();
51
52
      /**
53
       * Createsn an instance of {@link Entry}.
54
       *
55
       * @param matcher  A matcher bi-predicate.
56
       * @param resolver A resolver function.
57
       * @return A new {@link Entry} objeect.
58
       * @see this#matcher()
59
       * @see this#resolver()
60
       */
61
      static Entry create(BiPredicate<String, String> matcher, Function<String, String> resolver) {
62 1 1. create : replaced return value with null for com/github/dakusui/actionunit/actions/cmd/ProgramNameResolver$Builder$Entry::create → KILLED
        return new Entry() {
63
          @Override
64
          public BiPredicate<String, String> matcher() {
65 1 1. matcher : replaced return value with null for com/github/dakusui/actionunit/actions/cmd/ProgramNameResolver$Builder$Entry$1::matcher → KILLED
            return matcher;
66
          }
67
68
          @Override
69
          public Function<String, String> resolver() {
70 1 1. resolver : replaced return value with null for com/github/dakusui/actionunit/actions/cmd/ProgramNameResolver$Builder$Entry$1::resolver → KILLED
            return resolver;
71
          }
72
        };
73
      }
74
    }
75
76
    final List<Entry> entries = new LinkedList<>();
77
78
    /**
79
     * Constructs a new {@link ProgramNameResolver.Builder} object.
80
     */
81
    public Builder() {
82
    }
83
84
    /**
85
     * Registers a transforming rule for program names.
86
     *
87
     * Note that an entry registered later is more prioritized than ones registered earlier.
88
     *
89
     * @param matcher             A predicate to decide if program name resolution by {@code programNameResolver} should be applied.
90
     * @param programNameResolver A function that converts a program name for a host.
91
     * @return This object.
92
     */
93
    public Builder register(BiPredicate<String, String> matcher, Function<String, String> programNameResolver) {
94 1 1. register : removed call to java/util/List::add → KILLED
      this.entries.add(0, Entry.create(matcher, programNameResolver));
95 1 1. register : replaced return value with null for com/github/dakusui/actionunit/actions/cmd/ProgramNameResolver$Builder::register → KILLED
      return this;
96
    }
97
98
    /**
99
     * Builds a new {@link ProgramNameResolver} object.
100
     *
101
     * @return A new {@link ProgramNameResolver} object
102
     */
103
    public ProgramNameResolver build() {
104 1 1. build : replaced return value with null for com/github/dakusui/actionunit/actions/cmd/ProgramNameResolver$Builder::build → KILLED
      return new ProgramNameResolver() {
105
        final List<Entry> entries = unmodifiableList(new ArrayList<>(Builder.this.entries));
106
107
        @Override
108
        public String apply(String host, String programName) {
109 1 1. apply : replaced return value with "" for com/github/dakusui/actionunit/actions/cmd/ProgramNameResolver$Builder$1::apply → KILLED
          return this.entries.stream()
110 2 1. lambda$apply$0 : replaced boolean return with false for com/github/dakusui/actionunit/actions/cmd/ProgramNameResolver$Builder$1::lambda$apply$0 → KILLED
2. lambda$apply$0 : replaced boolean return with true for com/github/dakusui/actionunit/actions/cmd/ProgramNameResolver$Builder$1::lambda$apply$0 → KILLED
              .filter(each -> each.matcher().test(host, programName))
111
              .findFirst()
112 1 1. lambda$apply$1 : replaced return value with "" for com/github/dakusui/actionunit/actions/cmd/ProgramNameResolver$Builder$1::lambda$apply$1 → KILLED
              .map(v -> v.resolver().apply(programName))
113
              .orElseThrow(NoSuchElementException::new);
114
        }
115
      };
116
    }
117
  }
118
119
  /**
120
   * Creates a {@link ProgramNameResolver} instance with a handy default for UNIX environment.
121
   *
122
   * @return An instance for UNIX environment.
123
   */
124
  static ProgramNameResolver createForUnix() {
125 1 1. createForUnix : replaced return value with null for com/github/dakusui/actionunit/actions/cmd/ProgramNameResolver::createForUnix → KILLED
    return new Builder()
126 2 1. lambda$createForUnix$0 : replaced boolean return with false for com/github/dakusui/actionunit/actions/cmd/ProgramNameResolver::lambda$createForUnix$0 → KILLED
2. lambda$createForUnix$1 : replaced return value with "" for com/github/dakusui/actionunit/actions/cmd/ProgramNameResolver::lambda$createForUnix$1 → KILLED
        .register((h, c) -> true, c -> c)
127 3 1. lambda$createForUnix$2 : replaced boolean return with false for com/github/dakusui/actionunit/actions/cmd/ProgramNameResolver::lambda$createForUnix$2 → KILLED
2. lambda$createForUnix$2 : replaced boolean return with true for com/github/dakusui/actionunit/actions/cmd/ProgramNameResolver::lambda$createForUnix$2 → KILLED
3. lambda$createForUnix$3 : replaced return value with "" for com/github/dakusui/actionunit/actions/cmd/ProgramNameResolver::lambda$createForUnix$3 → KILLED
        .register((h, c) -> "echo".equals(c), c -> "/bin/echo")
128
        .build();
129
  }
130
}

Mutations

62

1.1
Location : create
Killed by : com.github.dakusui.actionunit.ut.actions.cmd.UnixCommanderFactoryTest$WithCustomSshOptions2.composeLocalEchoCommandLine(com.github.dakusui.actionunit.ut.actions.cmd.UnixCommanderFactoryTest$WithCustomSshOptions2)
replaced return value with null for com/github/dakusui/actionunit/actions/cmd/ProgramNameResolver$Builder$Entry::create → KILLED

65

1.1
Location : matcher
Killed by : com.github.dakusui.actionunit.ut.actions.cmd.CmdTest$AsCommander.whenExtendCommanderOverridingBuildCommandLineComposerMethod$thenCompiles(com.github.dakusui.actionunit.ut.actions.cmd.CmdTest$AsCommander)
replaced return value with null for com/github/dakusui/actionunit/actions/cmd/ProgramNameResolver$Builder$Entry$1::matcher → KILLED

70

1.1
Location : resolver
Killed by : com.github.dakusui.actionunit.ut.actions.cmd.CmdTest$AsCommander.whenExtendCommanderOverridingBuildCommandLineComposerMethod$thenCompiles(com.github.dakusui.actionunit.ut.actions.cmd.CmdTest$AsCommander)
replaced return value with null for com/github/dakusui/actionunit/actions/cmd/ProgramNameResolver$Builder$Entry$1::resolver → KILLED

94

1.1
Location : register
Killed by : com.github.dakusui.actionunit.ut.actions.cmd.UnixCommanderFactoryTest$WithCustomSshOptions2.composeLocalEchoCommandLine(com.github.dakusui.actionunit.ut.actions.cmd.UnixCommanderFactoryTest$WithCustomSshOptions2)
removed call to java/util/List::add → KILLED

95

1.1
Location : register
Killed by : com.github.dakusui.actionunit.ut.actions.cmd.UnixCommanderFactoryTest$WithCustomSshOptions2.composeLocalEchoCommandLine(com.github.dakusui.actionunit.ut.actions.cmd.UnixCommanderFactoryTest$WithCustomSshOptions2)
replaced return value with null for com/github/dakusui/actionunit/actions/cmd/ProgramNameResolver$Builder::register → KILLED

104

1.1
Location : build
Killed by : com.github.dakusui.actionunit.ut.actions.cmd.UnixCommanderFactoryTest$WithCustomSshOptions2.composeLocalEchoCommandLine(com.github.dakusui.actionunit.ut.actions.cmd.UnixCommanderFactoryTest$WithCustomSshOptions2)
replaced return value with null for com/github/dakusui/actionunit/actions/cmd/ProgramNameResolver$Builder::build → KILLED

109

1.1
Location : apply
Killed by : com.github.dakusui.actionunit.ut.actions.cmd.UnixCommanderFactoryTest$WithCustomSshOptions2.composeLocalEchoCommandLine(com.github.dakusui.actionunit.ut.actions.cmd.UnixCommanderFactoryTest$WithCustomSshOptions2)
replaced return value with "" for com/github/dakusui/actionunit/actions/cmd/ProgramNameResolver$Builder$1::apply → KILLED

110

1.1
Location : lambda$apply$0
Killed by : com.github.dakusui.actionunit.ut.actions.cmd.CmdTest$AsCommander.whenExtendCommanderOverridingBuildCommandLineComposerMethod$thenCompiles(com.github.dakusui.actionunit.ut.actions.cmd.CmdTest$AsCommander)
replaced boolean return with false for com/github/dakusui/actionunit/actions/cmd/ProgramNameResolver$Builder$1::lambda$apply$0 → KILLED

2.2
Location : lambda$apply$0
Killed by : com.github.dakusui.actionunit.ut.actions.cmd.UnixCommanderFactoryTest$WithoutUsername.composeLocalScpCommandLine(com.github.dakusui.actionunit.ut.actions.cmd.UnixCommanderFactoryTest$WithoutUsername)
replaced boolean return with true for com/github/dakusui/actionunit/actions/cmd/ProgramNameResolver$Builder$1::lambda$apply$0 → KILLED

112

1.1
Location : lambda$apply$1
Killed by : com.github.dakusui.actionunit.ut.actions.cmd.UnixCommanderFactoryTest$WithCustomSshOptions2.composeLocalEchoCommandLine(com.github.dakusui.actionunit.ut.actions.cmd.UnixCommanderFactoryTest$WithCustomSshOptions2)
replaced return value with "" for com/github/dakusui/actionunit/actions/cmd/ProgramNameResolver$Builder$1::lambda$apply$1 → KILLED

125

1.1
Location : createForUnix
Killed by : com.github.dakusui.actionunit.ut.actions.cmd.UnixCommanderFactoryTest$WithCustomSshOptions2.composeLocalEchoCommandLine(com.github.dakusui.actionunit.ut.actions.cmd.UnixCommanderFactoryTest$WithCustomSshOptions2)
replaced return value with null for com/github/dakusui/actionunit/actions/cmd/ProgramNameResolver::createForUnix → KILLED

126

1.1
Location : lambda$createForUnix$0
Killed by : com.github.dakusui.actionunit.ut.actions.cmd.UnixCommanderFactoryTest$WithoutUsername.composeLocalScpCommandLine(com.github.dakusui.actionunit.ut.actions.cmd.UnixCommanderFactoryTest$WithoutUsername)
replaced boolean return with false for com/github/dakusui/actionunit/actions/cmd/ProgramNameResolver::lambda$createForUnix$0 → KILLED

2.2
Location : lambda$createForUnix$1
Killed by : com.github.dakusui.actionunit.ut.actions.cmd.UnixCommanderFactoryTest$WithoutUsername.composeLocalScpCommandLine(com.github.dakusui.actionunit.ut.actions.cmd.UnixCommanderFactoryTest$WithoutUsername)
replaced return value with "" for com/github/dakusui/actionunit/actions/cmd/ProgramNameResolver::lambda$createForUnix$1 → KILLED

127

1.1
Location : lambda$createForUnix$2
Killed by : com.github.dakusui.actionunit.ut.actions.cmd.linux.EchoTest.givenSingleQuoteAndNewLineContainingMessage$whenPerformAsAction$thenCorrectMessageIsPrinted(com.github.dakusui.actionunit.ut.actions.cmd.linux.EchoTest)
replaced boolean return with false for com/github/dakusui/actionunit/actions/cmd/ProgramNameResolver::lambda$createForUnix$2 → KILLED

2.2
Location : lambda$createForUnix$2
Killed by : com.github.dakusui.actionunit.ut.actions.cmd.UnixCommanderFactoryTest$WithoutUsername.composeLocalScpCommandLine(com.github.dakusui.actionunit.ut.actions.cmd.UnixCommanderFactoryTest$WithoutUsername)
replaced boolean return with true for com/github/dakusui/actionunit/actions/cmd/ProgramNameResolver::lambda$createForUnix$2 → KILLED

3.3
Location : lambda$createForUnix$3
Killed by : com.github.dakusui.actionunit.ut.actions.cmd.UnixCommanderFactoryTest$WithCustomSshOptions2.composeLocalEchoCommandLine(com.github.dakusui.actionunit.ut.actions.cmd.UnixCommanderFactoryTest$WithCustomSshOptions2)
replaced return value with "" for com/github/dakusui/actionunit/actions/cmd/ProgramNameResolver::lambda$createForUnix$3 → KILLED

Active mutators

Tests examined


Report generated by PIT 1.7.3