Scott Hanselman

MbUnit - Unit Testing on Crack

September 19, '06 Comments [15] Posted in Reviews
Sponsored By

MbUnit is a "better xUnit" that's used by a myraid of folks I respect, including James Avery, Patrick Cauldwell and Phil Haack. It's under very active development, even though I'd once wondered aloud if it was "abandonware." It's decidedly not and it's just got a new facelift to prove it.

Check out James Avery's Post called "I've seen the light and it is called MbUnitr."  I've asked around and everyone has nothing but nice things to say what MbUnit brings to the table. It's NOT just NUnit with some tweaks. James says it's "Unit testing on crack."

Check this out...the test will get called four times, each time with different values passed in, some intending to cause and exception and others not. Very clean and certainly nicer than making a dozen methods like "NegativeTest54".

    1 [RowTest]

    2 [Row("James", "myemail@email.com")]

    3 [Row("James", "", ExpectedException=typeof(InvalidUserException))]

    4 [Row("", "myemail@emai.com", ExpectedException = typeof(InvalidUserException))]

    5 [Row("James", "mybademail.com", ExpectedException = typeof(InvalidUserException))]

    6 public void AddValidUser(string name, string email)

    7 {

    8     User u = new User();

    9     u.Name = name;

   10     u.Email = email;

   11 

   12     u.Save();

   13 

   14     User newUser = User.Retrieve(u.ID);

   15     Assert.IsNotNull(newUser, "User not found");

   16     Assert.IsTrue(newUser.Name == u.Name, "Name not saved correctly");

   17     Assert.IsTrue(newUser.Email == newUser.Email, "Email not saved correctly");

   18 }

 

It's even got a feature that will rollback database changes, keeping your database fresh after each test run. Sweet. I gotta do a show on Trends in Unit Testing...

About Scott

Scott Hanselman is a former professor, former Chief Architect in finance, now speaker, consultant, father, diabetic, and Microsoft employee. He is a failed stand-up comic, a cornrower, and a book author.

facebook twitter subscribe
About   Newsletter
Sponsored By
Hosting By
Dedicated Windows Server Hosting by SherWeb

Vista Reliability and my Tolerance for Pain

September 19, '06 Comments [31] Posted in Reviews
Sponsored By

VistareliabilityUPDATE: My bluescreens, while they appear to be in Win32k.sys, are actually in ATI's ati2evxx.exe. It's apparently the most common blue screen in RC1. Those naughty device drviers! Fortunately, it's been fixed in the latest ATI driver coming soon to a Windows Update near you. If this BSOD stops with this new build then my reliability numbers will go up greatly! Things are looking up.

Crap crap crap. My totally-stable-for-four-years machine is now blue screening daily under Vista. This is getting irritating.

Disclaimer: I'm pissed, so I'm blogging in frustration. I'm still stoked about Vista, I'm just not stoked about the new computer I'm going to have to buy if I can't get this one to work.

Notice my declining stability in the Reliability and Performance Monitor in the image at right? This isn't looking good and it's only been 10 days. Sigh. That's what I get for being an early adopter of RC1 Beta4.

This is very frustrating.  My guts tells me that this is a race condition in the menu handler of Win32k.sys, but that was supposed to have been fixed year ago.

I don't like being afraid of my own machine.

Stuff doesn't work anymore that I love:

  • FinePrint - The printing subsystem has totally changed. Perhaps I need to reinstall?
  • Canon PIXMA MP500 - I'm unable to share this printer to any other machines in the house.
  • 200 GIG Firewire - My WDC 200GIG Firewire just disappears. sbp2port.sys says, huh? Then the drive is gone for hours. Then, later, it'll show up.
  • 200 GIG USB - My Maxtor 200GIG USB plugs into my main USB2 Root Hub and Vista proclaims "Your Unknown Devices is ready to be used." It works plugged into my Dell Monitor (which is recognized as "Generic PnP Monitor" by the way.
  • Video - Flash Videos don't play. Well, that's not true, they start, play 5 seconds, and then stop, never to start again. Windows Media Player (WMV, MPG, AVI) videos only play on the Primary Monitor. On the secondary monitor they play at 5fps. Same with Media Center. It's totally unusable on the second monitor.
  • Nero - Nero doesn't work, but to Vista's credit, it did warn me ahead of time, so I uninstalled it.
  • IE7 - It keep getting into a state where the Menu Bar is showing, and I can't click in the address bar. I click in the bar and it flashes like it WANTS to select itself, then the Menu Bar flashes, then I'm left with focus on the page. I'm unable to navigate unless I Ctrl-O to get to a new page.
  • IOMEGA REV Drive - Looks like a regular CDR and the system tries to format it like one and chaos ensues. The drive - my primary backup media - is useless under Vista so far. Here's a screenshot about how much Iomega cares. Even kinder support from their "Gurus" on their forums. Here's what their moderator said: "We currently do not have any released drivers for Windows Vista, It is still unclear if we will need to release new drivers when Vista is finished. At this time we do not have any support for beta versions of Windows Vista. However apon official release of Vista you can expect any driver updates assuming they are required."
    Hm, this milk is bad. Maybe it'll be better later!
    Norevdriveonvista
  • Virtual PC - There's a known problem with the Network Drivers for VPC under Vista, but the supposed solution of just reinstalling those drivers from the Network Control Panel succeeds, then Virtual PC doesn't work anyway.
  • Windows Defender - Literally 75% of the items in my startup are marked "Not yet classified" and I have no way in the Defender UI to give it the equivalent of the "chill" command.
  • Windows Security - The security control panel insists that I have no Anti-Virus software even though eTrust has been running on my system for 4 years and was recognized under XP.
  • Aero - Programs here and there will cause a scary, heart-stopping black screen and monitor flicker as the entire system switches into Basic Mode because one program can't handle Aero (I smell a Windows Theming Denial of Service Attack here somewhere) and then gets stuck in Basic Mode long after the offending app has left.
  • Diskeeper - The greatest defragmenter ever just disappears every once in a while. Poof. Not sure what it was working on at the time, or if that file was important.
  • Windows Backup/Image Backup - I started getting concerned, so I tried to backup my stuff. First I did a Windows Image Backup and that ended up on I:\WindowsImageBackup\scottpc\Backup 2006-09-18 082147. Then I wanted to just backup some music files. Not only couldn't I select just those directories, but the system insists on backing up my C: Drive again, except this time it's to I:\SCOTTPC\Backup Set 2006-09-18 215943. Note the directory is one up now. Apparently I can't have both file backups and image backups on the same drive without this confusion. One other interesting note, the system teases me with the .VHD extension it puts on the Image Backups, but I suspect it's not a Virtual PC Hard Drive.
    Here's a fun little screenshot as the backup fails:
    Randomvistaerror1
  • TrueCrypt - Kind of works. You have to right click on the actual EXE itself (not the Start Menu Link) and "Run as Administrator." Not sure why the User Access Control just requires another click, rather than entering one's password again.
  • Microsoft Intellitype Keyboard and Mouse - Um, wha? You'd think that support for every Microsoft Keyboard and Mouse would be built in, but nope. Both these had to go before I installed. For some reason now my USB keyboard doesn't work in the text-based Vista pre-boot screens though it worked in the Windows XP pre-boot (F8) screens.

Why doesn't the team just come to my house and hang out? Am I just really, seriously, using computers in a way that isn't appropriate or is not supported? Should pave this machine? I really don't think so.

Eh, it's beta. What can you do? Vista, why has thou forsaken me?


Feel free to WinDBG.exe around if you like that kind of thing:

File Attachment: vistabugcheckwindbganalysis1.txt (5 KB)

File Attachment: Mini091806-01.dmp (136 KB) (it's NOT a zip, just change the extension to .dmp)

About Scott

Scott Hanselman is a former professor, former Chief Architect in finance, now speaker, consultant, father, diabetic, and Microsoft employee. He is a failed stand-up comic, a cornrower, and a book author.

facebook twitter subscribe
About   Newsletter
Sponsored By
Hosting By
Dedicated Windows Server Hosting by SherWeb

Preventing Dialogs on the Server-Side in ASP.NET or Trace.Fail considered Harmful

September 19, '06 Comments [4] Posted in ASP.NET
Sponsored By

Dialogs on the server-side? What is this nonsense of which you speak? Are you insane? Sadly no.

Back in the day, if you ran a VB6 COM DLL under Classic ASP, or as I like to call it "Poopy-SP," and you forgot to set "Unattended Execution" and "Retain in Memory" you could get yourself into a pickle if an error in the application caused a dialogbox or messagebox to pop up on the Server-side, just waiting for some poor schmuck to click "OK."

Recently I got an email that a high-powered blogger was seeing Dialog Boxes on his hosted instance of DasBlog while running under ASP.NET 2.0. These dialogs would hang the thread they were on, and hang IIS until they were dismissed. Shocked he and I were to say the least as "that ain't supposed to happen."

I suggested that he disable JIT Debugging in his registry. He tried it and indicated that he was getting a full stack trace inside the message box. Since the JIT Debugging Dialog doesn't look like that, I figured that wasn't the problem.

I spoke to some folks at MSFT who said that if there were unhandled exceptions being thrown from DasBlog, how they'd be presented would be controlled via the legacyUnhandledExceptionPolicy setting in his web.config like this (we don't have any unhandled exceptions, BTW, there's 'global' exception handlers in two places):

<configuration>
  <runtime>
    <legacyUnhandledExceptionPolicy enabled="true" />
  </runtime>
</configuration>

This tells the CLR to act more like .NET 1.1 in this respect as the behavior for unhandled exceptions has changed in 2.0 (MSDN Mag Article here and MSDN Topic here).

This "solution" smelled fishy to me, didn't seem like a good idea, and ultimately didn't solve his problem.

He then indicated that he was seeing errors in our SharedBasePageErrorHandler, which made sense to me as we handle all Page-level exceptions there.

private void SharedBasePageErrorHandler(object sender, EventArgs e )
{
    Exception pageException = Server.GetLastError();
    try
    {
        loggingService.AddEvent(
            new EventDataItem(EventCodes.Error,
            pageException.ToString().Replace("\n","<br>"),
            this.Page.Request.Url.ToString()));
        System.Diagnostics.Trace.Fail(this.Context.Error.Message);
    }
    catch
    {
    }
}

Seems pretty straightforward, and his stuff WAS getting logged indicating that the LoggingService.AddEvent was working fine.

What about this System.Diagnostics.Trace.Fail call, though? Seems harmless, but it's the only other thing in there and it would explain where the stack trace was coming from - it's inside of this.Context.Error.Message.

There was a problem back in the day with Trace.Fail or Debug.Fail locking up the ASP.NET Worker Process.

If you reflector into the implementation of the DefaultTraceListener in the .NET Framework you'll see a call to AssertWrapper.ShowAssert (that should only happen if AssertUIEnabled is true and UI Permissions are available.) That must be the case in our blogger friend's situation.

public override void Fail(string message, string detailMessage)
{
      string text1;
      StackTrace trace1 = new StackTrace(true);
      int num1 = 0;
      bool flag1 = DefaultTraceListener.UiPermission;
      try
      {
            text1 = this.StackTraceToString(trace1, num1, trace1.FrameCount - 1);
      }
      catch
      {
            text1 = "";
      }
      this.WriteAssert(text1, message, detailMessage);
      if (this.AssertUiEnabled && flag1)
      {
            AssertWrapper.ShowAssert(text1, trace1.GetFrame(num1), message, detailMessage);
      }
}

Assuming those things are true and ShowAssert does get called, interally the AssertWrapper.ShowAssert calls SafeNativeMethods.MessageBox only if the user is in an interactive mode. It's possible that MB_SERVICE_NOTIFICATION isn't being passed into the MessageBox indicating that it's a non-interactive service who is throwing the box.

Setting this option in the web.config (or machine.config) works around the issue by not even getting into AssertWrapper.

<configuration>
   <system.diagnostics>
      <assert assertuienabled="false" logfilename="c:\log.txt"/>
   </system.diagnostics>
</configuration>

This looks like a bug in ASP.NET 2.0, but we'll see.

The workarounds are:

  • Don't use Trace.Fail()

or

  • Set AssertUIEnabled="false" in your web.config.

The strange part about this is why it's seen on some systems and not others.

About Scott

Scott Hanselman is a former professor, former Chief Architect in finance, now speaker, consultant, father, diabetic, and Microsoft employee. He is a failed stand-up comic, a cornrower, and a book author.

facebook twitter subscribe
About   Newsletter
Sponsored By
Hosting By
Dedicated Windows Server Hosting by SherWeb

Accessing Private and Authenticated Feeds - Why it's important

September 18, '06 Comments [8] Posted in Corillian | Web Services
Sponsored By

Niall Kennedy blogs about accessing private feeds, but doesn't mention that IE7 and Office 2007 doesn't support it.

Niall says:

HTTP Authentication works with most desktop aggregators but runs into trouble with most online aggregators which rely on a common feed store based on feed and/or link URIs.

He's close. The Common Feed Store in the new Microsoft RSS Platform is an offline store that can't handle authenticated feeds. Since Microsoft is heading towards (headed?) dropping a huge ball here, it'll really depend on Bloglines, My.Yahoo and Live.com to get it right and support secure, authenticated feeds.

Dare posts about Niall's post and has an interesting comment:

"At the end of the day, can Bank of America trust that RSS Bandit or Bloglines is doing a good job of adequately protecting the feed from spyware or malicious hackers?"

Of course they can't, just as BofA can't control that I might use any old HTTP stack to talk to their regular website. Angle brackets over HTTP are what they are. RSS just makes them more regular and a little easier to parse. It's true, a man-in-the-middle attack or trojan that targets offline aggregators would have a field day; but they would with any client and nearly any protocol.

Dare adds:

More importantly, even if they certify these applications in some way how can they verify that the applications are the ones accessing the feed? Niall mentions white listing user agents but those are trivial to spoof. With Web-based readers, one can whitelist their IP range but there isn't a good way to verify that the desktop application accessing your web server is really who the user agent string says it is.

I would propose within the context of banking, keying off Dare's comment, that OFX and RSS are arguably the same thing with RSS just being more presentation focused. OFX being pulled into Microsoft Money and Yodlee is no different from RSS being pulled into RSS Bandit or Bloglines.

What's more interesting a question to ask is, how can we integrate CardSpace-style trust - real trust - between a client and server over the wide open Internet while still allowing for the unattended retrieval of data? Multi-factor authentication just isn't possible given the RSS model at any point other than the initial subscription. We'll have to include an InfoCard (read: client-side cert) token within an HTTP POST (or long GET) request for an RSS Feed. That's at least 12-18 months away from adoption by the masses - and that's assuming that VISA gives free InfoCards away to everyone. It'll take someone with the power of VISA or AMEX to become a (free) Security Token Service (STS); adoption by Verisign who will charge us $14.95 will be a non-starter. But this is all future talk.

I say this: IE7 and Office 2007 not supporting Basic or Digest Authentication out of the box for accessing secure feeds will negatively affect adoption of RSS more than any other failing of the spec since its inception. It will slow adoption down at every level; it will make it harder for Financial Institutions to justify it and it will flummox internal Enterprises who don't have completely NTLM/AD infrastructure.

About Scott

Scott Hanselman is a former professor, former Chief Architect in finance, now speaker, consultant, father, diabetic, and Microsoft employee. He is a failed stand-up comic, a cornrower, and a book author.

facebook twitter subscribe
About   Newsletter
Sponsored By
Hosting By
Dedicated Windows Server Hosting by SherWeb

Sun's Java JRE switches Vista Aero into Basic UI Scheme

September 18, '06 Comments [2] Posted in Musings
Sponsored By

If you're running Windows Vista RC1 and you notice that the nice Glassy Aero UI keeps switching into "Basic Mode" every time you visit a website with some Java on the page, you should upgrade to the Beta of the Java Runtime Environment (JRE) 6 Beta 2 (second link on the page) as it supports staying in Aero mode while running Java Applets.

About Scott

Scott Hanselman is a former professor, former Chief Architect in finance, now speaker, consultant, father, diabetic, and Microsoft employee. He is a failed stand-up comic, a cornrower, and a book author.

facebook twitter subscribe
About   Newsletter
Sponsored By
Hosting By
Dedicated Windows Server Hosting by SherWeb

Disclaimer: The opinions expressed herein are my own personal opinions and do not represent my employer's view in any way.