第一段代码 GroupsResource package ece448.lec16; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController public class GroupsResource { private final GroupsModel groups; public GroupsResource(GroupsModel groups) { this.groups = groups; } @GetMapping("/api/groups") public Collection<Object> getGroups() throws Exception { ArrayList<Object> ret = new ArrayList<>(); for (String group: groups.getGroups()) { ret.add(makeGroup(group)); } logger.info("Groups: {}", ret); return ret; } @GetMapping("/api/groups/{group}") public Object getGroup( @PathVariable("group") String group, @RequestParam(value = "action", required = false) String action) { if (action == null) { Object ret = makeGroup(group); logger.info("Group {}: {}", group, ret); return ret; } // modify code below to control plugs by publishing messages to MQTT broker List<String> members = groups.getGroupMembers(group); logger.info("Group {}: action {}, {}", group, action, members); return null; } @PostMapping("/api/groups/{group}") public void createGroup( @PathVariable("group") String group, @RequestBody List<String> members) { groups.setGroupMembers(group, members); logger.info("Group {}: created {}", group, members); } @DeleteMapping("/api/groups/{group}") public void removeGroup( @PathVariable("group") String group) { groups.removeGroup(group); logger.info("Group {}: removed", group); } protected Object makeGroup(String group) { // modify code below to include plug states HashMap<String, Object> ret = new HashMap<>(); ret.put("name", group); ret.put("members", groups.getGroupMembers(group)); return ret; } private static final Logger logger = LoggerFactory.getLogger(GroupsResource.class); }
时间: 2024-04-09 20:31:13 浏览: 226
第二段代码 GroupsModel package ece448.lec16;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class GroupsModel {
private final Map<String, List<String>> groups;
public GroupsModel() {
this.groups = new HashMap<>();
}
public List<String> getGroups() {
return new ArrayList<>(groups.keySet());
}
public List<String> getGroupMembers(String group) {
return new ArrayList<>(groups.getOrDefault(group, new ArrayList<>()));
}
public void setGroupMembers(String group, List<String> members) {
groups.put(group, new ArrayList<>(members));
}
public void removeGroup(String group) {
groups.remove(group);
}
}
相关问题
package ece448.iot_sim; import java.util.List; import java.util.Map; import java.util.TreeMap; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ece448.iot_sim.http_server.RequestHandler; public class HTTPCommands implements RequestHandler { // Use a map so we can search plugs by name. private final TreeMap<String, PlugSim> plugs = new TreeMap<>(); public HTTPCommands(List<PlugSim> plugs) { for (PlugSim plug: plugs) { this.plugs.put(plug.getName(), plug); } } @Override public String handleGet(String path, Map<String, String> params) { // list all: / // do switch: /plugName?action=on|off|toggle // just report: /plugName logger.info("HTTPCmd {}: {}", path, params); if (path.equals("/")) { return listPlugs(); } PlugSim plug = plugs.get(path.substring(1)); if (plug == null) return null; // no such plug String action = params.get("action"); if (action == null) return report(plug); // P2: add your code here, modify the next line if necessary if("toggle".equals(action)){ plug.toggle(); return report(plug); }else if("on".equals(action)){ plug.switchOn(); return report(plug); }else if("off".equals(action)){ plug.switchOff(); return report(plug); } return "<html><body></body></html>"; } protected String listPlugs() { StringBuilder sb = new StringBuilder(); sb.append("<html><body>"); for (String plugName: plugs.keySet()) { sb.append(String.format("<p><a href='/%s'>%s</a></p>", plugName, plugName)); } sb.append("</body></html>"); return sb.toString(); } protected String report(PlugSim plug) { String name = plug.getName(); return String.format("<html><body>" +"<p>Plug %s is %s.</p>" +"<p>Power reading is %.3f.</p>" +"<p><a href='/%s?action=on'>Switch On</a></p>" +"<p><a href='/%s?action=off'>Switch Off</a></p>" +"<p><a href='/%s?action=toggle'>Toggle</a></p>" +"</body></html>", name, plug.isOn()? "on": "off", plug.getPower(), name, name, name); }如何对上述代码全部功能进行测试呢?请提供测试代码。
以下是一个简单的测试代码,可以测试HTTPCommands类中的所有功能:
```
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class HTTPCommandsTest {
public static void main(String[] args) {
// Create some plug simulations
List<PlugSim> plugs = new ArrayList<>();
plugs.add(new PlugSim("Plug1"));
plugs.add(new PlugSim("Plug2"));
plugs.add(new PlugSim("Plug3"));
// Create an HTTPCommands object and test its methods
HTTPCommands commands = new HTTPCommands(plugs);
testListPlugs(commands);
testReport(commands);
testHandleGet(commands);
}
private static void testListPlugs(HTTPCommands commands) {
String expected = "<html><body><p><a href='/Plug1'>Plug1</a></p><p><a href='/Plug2'>Plug2</a></p><p><a href='/Plug3'>Plug3</a></p></body></html>";
String actual = commands.listPlugs();
assert expected.equals(actual) : "testListPlugs failed: expected " + expected + ", but got " + actual;
}
private static void testReport(HTTPCommands commands) {
PlugSim plug = new PlugSim("TestPlug");
plug.switchOn();
plug.setPower(123.456);
String expected = "<html><body><p>Plug TestPlug is on.</p><p>Power reading is 123.456.</p><p><a href='/TestPlug?action=on'>Switch On</a></p><p><a href='/TestPlug?action=off'>Switch Off</a></p><p><a href='/TestPlug?action=toggle'>Toggle</a></p></body></html>";
String actual = commands.report(plug);
assert expected.equals(actual) : "testReport failed: expected " + expected + ", but got " + actual;
}
private static void testHandleGet(HTTPCommands commands) {
// Test listing all plugs
String expected = "<html><body><p><a href='/Plug1'>Plug1</a></p><p><a href='/Plug2'>Plug2</a></p><p><a href='/Plug3'>Plug3</a></p></body></html>";
String actual = commands.handleGet("/", new HashMap<>());
assert expected.equals(actual) : "testHandleGet failed: expected " + expected + ", but got " + actual;
// Test reporting a plug
PlugSim plug = new PlugSim("TestPlug");
plug.switchOn();
plug.setPower(123.456);
expected = "<html><body><p>Plug TestPlug is on.</p><p>Power reading is 123.456.</p><p><a href='/TestPlug?action=on'>Switch On</a></p><p><a href='/TestPlug?action=off'>Switch Off</a></p><p><a href='/TestPlug?action=toggle'>Toggle</a></p></body></html>";
actual = commands.handleGet("/TestPlug", new HashMap<>());
assert expected.equals(actual) : "testHandleGet failed: expected " + expected + ", but got " + actual;
// Test switching a plug on
plug.switchOff();
expected = "<html><body><p>Plug TestPlug is on.</p><p>Power reading is 0.000.</p><p><a href='/TestPlug?action=on'>Switch On</a></p><p><a href='/TestPlug?action=off'>Switch Off</a></p><p><a href='/TestPlug?action=toggle'>Toggle</a></p></body></html>";
actual = commands.handleGet("/TestPlug", Map.of("action", "on"));
assert expected.equals(actual) : "testHandleGet failed: expected " + expected + ", but got " + actual;
// Test switching a plug off
plug.switchOn();
expected = "<html><body><p>Plug TestPlug is off.</p><p>Power reading is 0.000.</p><p><a href='/TestPlug?action=on'>Switch On</a></p><p><a href='/TestPlug?action=off'>Switch Off</a></p><p><a href='/TestPlug?action=toggle'>Toggle</a></p></body></html>";
actual = commands.handleGet("/TestPlug", Map.of("action", "off"));
assert expected.equals(actual) : "testHandleGet failed: expected " + expected + ", but got " + actual;
// Test toggling a plug
plug.switchOff();
expected = "<html><body><p>Plug TestPlug is on.</p><p>Power reading is 0.000.</p><p><a href='/TestPlug?action=on'>Switch On</a></p><p><a href='/TestPlug?action=off'>Switch Off</a></p><p><a href='/TestPlug?action=toggle'>Toggle</a></p></body></html>";
actual = commands.handleGet("/TestPlug", Map.of("action", "toggle"));
assert expected.equals(actual) : "testHandleGet failed: expected " + expected + ", but got " + actual;
// Test handling a non-existent plug
expected = null;
actual = commands.handleGet("/NonExistentPlug", new HashMap<>());
assert expected == actual : "testHandleGet failed: expected " + expected + ", but got " + actual;
}
}
```
请逐句解释一下下面的代码import java.util.Arrays; import org.apache.http.client.fluent.Request; import ece448.iot_sim.SimConfig; import ece448.iot_sim.Main; public class GradeP2 { public static void main(String[] args) throws Exception { SimConfig config = new SimConfig( 8080, Arrays.asList("xxxx", "yyyy", "zzzz.789"), null, null, null); try (Main m = new Main(config)) { Grading.run(new GradeP2(), 10); } } private String get(String pathParams) throws Exception { return Request.Get("http://127.0.0.1:8080"+pathParams) .userAgent("Mozilla/5.0") .connectTimeout(1000) .socketTimeout(1000) .execute().returnContent().asString(); } public boolean testCase00() throws Exception { String ret = get("/xxxx"); return (ret.indexOf("xxxx is off") != -1) && (ret.indexOf("xxxx is on") == -1) && (ret.indexOf("Power reading is 0.000") != -1); } public boolean testCase01() throws Exception { String ret = get("/xxxx?action=on"); return (ret.indexOf("xxxx is on") != -1) && (ret.indexOf("xxxx is off") == -1); } public boolean testCase02() throws Exception { String ret = get("/xxxx?action=off"); return (ret.indexOf("xxxx is off") != -1) && (ret.indexOf("xxxx is on") == -1); } public boolean testCase03() throws Exception { String ret = get("/xxxx?action=on"); return (ret.indexOf("xxxx is on") != -1) && (ret.indexOf("xxxx is off") == -1); } public boolean testCase04() throws Exception { String ret = get("/xxxx?action=toggle"); return (ret.indexOf("xxxx is off") != -1) && (ret.indexOf("xxxx is on") == -1); } public boolean testCase05() throws Exception { String ret = get("/xxxx?action=toggle"); return (ret.indexOf("xxxx is on") != -1) && (ret.indexOf("xxxx is off") == -1); } public boolean testCase06() throws Exception { String ret = get("/yyyy"); return (ret.indexOf("yyyy is off") != -1) && (ret.indexOf("yyyy is on") == -1); } public boolean testCase07() throws Exception { String ret = get("/xxxx"); return (ret.indexOf("xxxx is on") != -1) && (ret.indexOf("xxxx is off") == -1); } public boolean testCase08() throws Exception { String ret = get("/zzzz.789"); return (ret.indexOf("Power reading is 0.000") != -1); } public boolean testCase09() throws Exception { get("/zzzz.789?action=on"); Thread.sleep(1500); String ret = get("/zzzz.789"); return (ret.indexOf("Power reading is 789.000") != -1); } } private static final Logger logger = LoggerFactory.getLogger(HTTPCommands.class); }
这段代码是一个 Java 程序,其中引入了几个包:
- java.util.Arrays:提供了一系列操作数组的方法。
- org.apache.http.client.fluent.Request:提供了一种轻量级、简单易用的 HTTP 客户端库,可以用来发送 HTTP 请求。
- ece448.iot_sim.SimConfig:定义了一个类,用来配置 IoT 模拟器。
- ece448.iot_sim.Main:IoT 模拟器的主类。
程序定义了一个名为 GradeP2 的类,其中包含了一个 main 方法。在 main 方法中,程序创建了一个 SimConfig 实例,并将其传递给 Main 类的构造函数。然后,程序调用 Grading.run 方法,该方法会运行 GradeP2 类中的测试用例。
GradeP2 类中还包含了一些方法,用来执行不同的测试用例。例如,testCase00 方法会向 IoT 模拟器发送一个请求,获取名为 "xxxx" 的设备的状态,并检查返回结果是否符合预期。程序还定义了一个名为 get 的私有方法,该方法用来发送 HTTP 请求并获取响应内容。最后,程序还定义了一个名为 logger 的 Logger 对象,用来记录日志。
阅读全文
相关推荐













