Embedded software development using BDD
-
Upload
itamar-hassin -
Category
Software
-
view
199 -
download
5
description
Transcript of Embedded software development using BDD
![Page 1: Embedded software development using BDD](https://reader034.fdocuments.net/reader034/viewer/2022051323/5497f2a2b47959654d8b52d2/html5/thumbnails/1.jpg)
EMBEDDED SOFTWARE DEVELOPMENT USING BDD
Itamar Hassin September 2014
![Page 2: Embedded software development using BDD](https://reader034.fdocuments.net/reader034/viewer/2022051323/5497f2a2b47959654d8b52d2/html5/thumbnails/2.jpg)
THIS TALK COVERS
•Embedded development challenges !
•The case for BDD !
•Simulating the target !
•Accessing the target remotely/in-situ !
•Orchestrating access to multiple targets
![Page 3: Embedded software development using BDD](https://reader034.fdocuments.net/reader034/viewer/2022051323/5497f2a2b47959654d8b52d2/html5/thumbnails/3.jpg)
EMBEDDED DEVELOPMENT CHALLENGES
•A simulator rarely available or not fully functional !
•Remote device verification !
•Complex state-machines !
•Test coverage often limited to unit testing
![Page 4: Embedded software development using BDD](https://reader034.fdocuments.net/reader034/viewer/2022051323/5497f2a2b47959654d8b52d2/html5/thumbnails/4.jpg)
THE CASE FOR CUCUMBER
•Direct mapping from user story acceptance criteria
!
•Living documentation, unified view of the product !
•Helps defines ‘done’: Code is tested and validated !
•BDD promotes lean code & emergent design !
•Authored by the team: BAs/QA/Devs
![Page 5: Embedded software development using BDD](https://reader034.fdocuments.net/reader034/viewer/2022051323/5497f2a2b47959654d8b52d2/html5/thumbnails/5.jpg)
CLOSER TO THE SOURCE
![Page 6: Embedded software development using BDD](https://reader034.fdocuments.net/reader034/viewer/2022051323/5497f2a2b47959654d8b52d2/html5/thumbnails/6.jpg)
PREMISE FOR AUTOMATIONProgramatically validate that code solves the problem by articulating behaviour in machine-readable form.
![Page 7: Embedded software development using BDD](https://reader034.fdocuments.net/reader034/viewer/2022051323/5497f2a2b47959654d8b52d2/html5/thumbnails/7.jpg)
CUCUMBER FOR EMBEDDED!
![Page 8: Embedded software development using BDD](https://reader034.fdocuments.net/reader034/viewer/2022051323/5497f2a2b47959654d8b52d2/html5/thumbnails/8.jpg)
WRITE ONCE, USE THRICE
Feature: Alarm assured to appear in quiet mode !Scenario: Pressure alarm Given device is in quiet mode When pressure sensor is disconnected Then a silent alarm will appear
![Page 9: Embedded software development using BDD](https://reader034.fdocuments.net/reader034/viewer/2022051323/5497f2a2b47959654d8b52d2/html5/thumbnails/9.jpg)
IMPLEMENT STEPS
Given(/Given device is in quiet mode $/) do @device.set_quiet_mode(1) end
![Page 10: Embedded software development using BDD](https://reader034.fdocuments.net/reader034/viewer/2022051323/5497f2a2b47959654d8b52d2/html5/thumbnails/10.jpg)
IMPLEMENT A SIMULATOR
class Device def set_quiet_mode(flag) if (flag) mode |= QUIET_MODE else mode &= ~QUIET_MODE end update_driver(mode) end end
![Page 11: Embedded software development using BDD](https://reader034.fdocuments.net/reader034/viewer/2022051323/5497f2a2b47959654d8b52d2/html5/thumbnails/11.jpg)
VALIDATE UNDER SIMULATOR
Scenario: Pressure alarm Given device is in quiet mode When pressure sensor is disconnected Then a silent alarm will appear !
5 scenarios (5 passed) 26 steps (26 passed) 0m0.052s
![Page 12: Embedded software development using BDD](https://reader034.fdocuments.net/reader034/viewer/2022051323/5497f2a2b47959654d8b52d2/html5/thumbnails/12.jpg)
WHEN SIMULATION IS NOT ENOUGH
![Page 13: Embedded software development using BDD](https://reader034.fdocuments.net/reader034/viewer/2022051323/5497f2a2b47959654d8b52d2/html5/thumbnails/13.jpg)
THE “WIRE”
•When your system does not have native support
•When you want a lean, portable implementation
![Page 14: Embedded software development using BDD](https://reader034.fdocuments.net/reader034/viewer/2022051323/5497f2a2b47959654d8b52d2/html5/thumbnails/14.jpg)
SIMPLIFIED WIRE PROTOCOL
![Page 15: Embedded software development using BDD](https://reader034.fdocuments.net/reader034/viewer/2022051323/5497f2a2b47959654d8b52d2/html5/thumbnails/15.jpg)
WIRE IMPLEMENTATION BLUEPRINT
•TCP/IP loop managing Cucumber protocol
•Function table for API invocation
•API implementation returning status to Cucumber
![Page 16: Embedded software development using BDD](https://reader034.fdocuments.net/reader034/viewer/2022051323/5497f2a2b47959654d8b52d2/html5/thumbnails/16.jpg)
HOOKING CUCUMBER TO LISTENER
features/step_definitions/cucumber.wire host: deviceport: 3901
![Page 17: Embedded software development using BDD](https://reader034.fdocuments.net/reader034/viewer/2022051323/5497f2a2b47959654d8b52d2/html5/thumbnails/17.jpg)
LISTENER TCP/IP LOOP
while(fgets(buff, sizeof(buff), rStream)) { respond_to_cucumber(wStream, buff); }
![Page 18: Embedded software development using BDD](https://reader034.fdocuments.net/reader034/viewer/2022051323/5497f2a2b47959654d8b52d2/html5/thumbnails/18.jpg)
WIRE HANDLERvoid respond_to_cucumber(FILE* stream, char* msg) { if (MSG_TYPE_IS(msg, "step_matches")) respond_to_step_matches(stream, msg); else if (MSG_TYPE_IS(msg, "invoke")) respond_to_invoke(stream, msg); else if (MSG_TYPE_IS(msg, "begin_scenario")) respond_to_begin(stream, msg); else if (MSG_TYPE_IS(msg, "end_scenario")) respond_to_end(stream, msg); else respond_success(stream); }
![Page 19: Embedded software development using BDD](https://reader034.fdocuments.net/reader034/viewer/2022051323/5497f2a2b47959654d8b52d2/html5/thumbnails/19.jpg)
FUNCTION TABLE
stepdef_t stepdefs[] = { { "device is in quiet mode”, set_quiet_mode } };
![Page 20: Embedded software development using BDD](https://reader034.fdocuments.net/reader034/viewer/2022051323/5497f2a2b47959654d8b52d2/html5/thumbnails/20.jpg)
INVOKING API FUNCTIONS
void respond_to_invoke(…) { int id = get_function_id(msg); !
stepdefs[id].callback(arg_val) ? failure(stream) : success(stream); }
![Page 21: Embedded software development using BDD](https://reader034.fdocuments.net/reader034/viewer/2022051323/5497f2a2b47959654d8b52d2/html5/thumbnails/21.jpg)
TARGET API
int set_quiet_mode(const char *arg) { context->requested_mode = atoi(arg); context->quiet_mode |= context->requested_mode; return(update_driver(context)); }
![Page 22: Embedded software development using BDD](https://reader034.fdocuments.net/reader034/viewer/2022051323/5497f2a2b47959654d8b52d2/html5/thumbnails/22.jpg)
IMPLEMENTATION STACK
![Page 23: Embedded software development using BDD](https://reader034.fdocuments.net/reader034/viewer/2022051323/5497f2a2b47959654d8b52d2/html5/thumbnails/23.jpg)
WORKING WITH CUCUMBER•Decide on a strategy (off-board, on-board)
•Get appropriate toolchain (cross compiler, linker)
•Implement and port Wire to target
•Run the feature files
•fail/implement/pass/refactor/repeat
![Page 24: Embedded software development using BDD](https://reader034.fdocuments.net/reader034/viewer/2022051323/5497f2a2b47959654d8b52d2/html5/thumbnails/24.jpg)
USAGE PATTERNS Off-Board
• Framework on PC • Listener on PC • Proxy API on PC
• Network calls to Target API !
In-Situ • Framework on PC • Listener on Target • API calls on Target
Prog
ress
ion
![Page 25: Embedded software development using BDD](https://reader034.fdocuments.net/reader034/viewer/2022051323/5497f2a2b47959654d8b52d2/html5/thumbnails/25.jpg)
WORKING AT A SAFE DISTANCE
![Page 26: Embedded software development using BDD](https://reader034.fdocuments.net/reader034/viewer/2022051323/5497f2a2b47959654d8b52d2/html5/thumbnails/26.jpg)
OFF-BOARDCucumber running on
PC
Wire running on PC
Target API running on
PC
Target
NetworkC-implementation
• + Target untouched
• - All API’s must be exposed; low-fidelity; many moving parts;
![Page 27: Embedded software development using BDD](https://reader034.fdocuments.net/reader034/viewer/2022051323/5497f2a2b47959654d8b52d2/html5/thumbnails/27.jpg)
UP CLOSE AND PERSONAL
![Page 28: Embedded software development using BDD](https://reader034.fdocuments.net/reader034/viewer/2022051323/5497f2a2b47959654d8b52d2/html5/thumbnails/28.jpg)
IN-SITUFramework running on
PC
Cucumber-Wire running
on Target
Network C-implementation
Target API
• + high-fidelity, API’s not exposed
• - Server part of codebase
![Page 29: Embedded software development using BDD](https://reader034.fdocuments.net/reader034/viewer/2022051323/5497f2a2b47959654d8b52d2/html5/thumbnails/29.jpg)
COLLABORATIVE ENVIRONMENT
![Page 30: Embedded software development using BDD](https://reader034.fdocuments.net/reader034/viewer/2022051323/5497f2a2b47959654d8b52d2/html5/thumbnails/30.jpg)
GATEWAY
!
•Acts as an end-to-end test orchestrator !
•Switchboard events across heterogeneous devices
![Page 31: Embedded software development using BDD](https://reader034.fdocuments.net/reader034/viewer/2022051323/5497f2a2b47959654d8b52d2/html5/thumbnails/31.jpg)
COLLABORATIVE END-TO-END TESTING
Framework running on
PC
C-implementation
Cucumber-Wire running
on Target
Targets
NativeWire
Collaboration
![Page 32: Embedded software development using BDD](https://reader034.fdocuments.net/reader034/viewer/2022051323/5497f2a2b47959654d8b52d2/html5/thumbnails/32.jpg)
GATEWAY ARCHITECTURE
SpecFlow
Target B
Proxies
A1
B1
Hardware
Serial
Wire
Target ACucumber
Behave
![Page 33: Embedded software development using BDD](https://reader034.fdocuments.net/reader034/viewer/2022051323/5497f2a2b47959654d8b52d2/html5/thumbnails/33.jpg)
END-TO-END FEATURES
Feature: Alarm assured to appear in quiet mode !
Scenario: Pressure alarm Given device is in quiet mode When pressure sensor is disconnected Then a silent alarm will appear
![Page 34: Embedded software development using BDD](https://reader034.fdocuments.net/reader034/viewer/2022051323/5497f2a2b47959654d8b52d2/html5/thumbnails/34.jpg)
GATEWAY STEPS public class QuietModeSteps { SignalSimulator signalSimulator = new SignalSimulator(); MedicalDevice medicalDevice = new MedicalDevice(“192.168.1.1”, 3901); ! [Given(@"device is quiet mode")] public void GivenDeviceIsQuietMode() { NUnit.Framework.Assert.IsTrue(medicalDevice.SetQuietMode()); } ! [When(@“pressure sensor is disconnected")] public void GivenPressureSensorIsDisconnected() { NUnit.Framework.Assert.IsTrue(signalSimulator.SetPressure(off)); } }
![Page 35: Embedded software development using BDD](https://reader034.fdocuments.net/reader034/viewer/2022051323/5497f2a2b47959654d8b52d2/html5/thumbnails/35.jpg)
GATEWAY PROXIES class MedicalDevice { protected Wire wire; ! public MedicalDevice(string ipAddress, int port) { myAddress = ipAddress; wire = new Wire(myAddress, port); wire.Open(); } ! public bool SetQuietMode() { wire.Send("[\"step_matches\",{\"name_to_match\":\"set quiet mode on\"}]\n"); wire.Send("[\"invoke\",{\"id\":\"7\",\"args\":[\"on\"]}]\n"); return(wire.Ack()); } }
![Page 36: Embedded software development using BDD](https://reader034.fdocuments.net/reader034/viewer/2022051323/5497f2a2b47959654d8b52d2/html5/thumbnails/36.jpg)
EMULATING WIRE public class Wire { public int Open() { client = new TcpClient(myAddress, myPort); stream = client.GetStream(); return(Send(“[\”begin_scenario\"]\n")); } ! public int Close() { stream = client.GetStream(); Send("[\"end_scenario\"]\n"); return(client.Close()); } }
![Page 37: Embedded software development using BDD](https://reader034.fdocuments.net/reader034/viewer/2022051323/5497f2a2b47959654d8b52d2/html5/thumbnails/37.jpg)
SpecFlow
Wire
Proxies
A1
Target
TCP
Given … quiet mode
Wire
int SetQuietMode(“on”) {}
Match: “set quiet\’(on|off)’\”
Invoke: idx:0, params: “on”
SPECFLOW TO WIRE
int set_quiet(char* state){}A
![Page 38: Embedded software development using BDD](https://reader034.fdocuments.net/reader034/viewer/2022051323/5497f2a2b47959654d8b52d2/html5/thumbnails/38.jpg)
Exists in proxy? Write wrappers
Exists in Wire?
No
NoYes
Function table entry
Yes
Use in feature/step files
API Exists? No Implement API
Yes
MAINTENANCE CONSIDERATIONS
![Page 39: Embedded software development using BDD](https://reader034.fdocuments.net/reader034/viewer/2022051323/5497f2a2b47959654d8b52d2/html5/thumbnails/39.jpg)
•Security - Anyone can connect to Wire!
•Regulation may not allow non-application code on a production system
Shut down the wire thread in production
COMPLIANCE CONSIDERATIONS
![Page 40: Embedded software development using BDD](https://reader034.fdocuments.net/reader034/viewer/2022051323/5497f2a2b47959654d8b52d2/html5/thumbnails/40.jpg)
LESSONS LEARNED
Threading
Dual VocabularyThreads & Target Architecture
![Page 41: Embedded software development using BDD](https://reader034.fdocuments.net/reader034/viewer/2022051323/5497f2a2b47959654d8b52d2/html5/thumbnails/41.jpg)
REFERENCES•Specification by example
•The Cucumber Book
•Cucumber Recipes
@history_pics/@historyinpicsJim Reese#Wikipedia
National Library of Australia
Photo Credits:
•SpecFlow